diff --git a/base/applications/applications.rbuild b/base/applications/applications.rbuild
index f4adbe4bd5a..d3c202051fb 100644
--- a/base/applications/applications.rbuild
+++ b/base/applications/applications.rbuild
@@ -22,6 +22,9 @@
+
+
+
diff --git a/base/applications/charmap/precomp.h b/base/applications/charmap/precomp.h
index a87f118d866..4e0324c3de5 100644
--- a/base/applications/charmap/precomp.h
+++ b/base/applications/charmap/precomp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef __CHARMAP_PRECOMP_H
+#define __CHARMAP_PRECOMP_H
#include
#include
@@ -52,3 +53,5 @@ VOID ShowAboutDlg(HWND hWndParent);
BOOL RegisterMapClasses(HINSTANCE hInstance);
VOID UnregisterMapClasses(HINSTANCE hInstance);
+
+#endif /* __CHARMAP_PRECOMP_H */
diff --git a/base/applications/cmdutils/reg/De.rc b/base/applications/cmdutils/reg/De.rc
index 504359d67a6..0940640306c 100644
--- a/base/applications/cmdutils/reg/De.rc
+++ b/base/applications/cmdutils/reg/De.rc
@@ -35,6 +35,6 @@ STRINGTABLE
STRING_SUCCESS, "Der Vorgang wurde erfolgreich abgeschlossen\n"
STRING_INVALID_KEY, "Fehler: Ungültiger Schlüssel\n"
STRING_INVALID_CMDLINE, "Fehler: Ungültige Befehlszeilenargumente\n"
- STRING_NO_REMOTE, "Fehler: Konnte Schlüssel nicht zum entfernten Rechner hinzufügen\n"
+ STRING_NO_REMOTE, "Fehler: Konnte Schlüssel nicht zum remote Rechner hinzufügen\n"
STRING_CANNOT_FIND, "Fehler: Der angegebene Schlüssel oder Wert konnte nicht gefunden werden\n"
}
diff --git a/base/applications/cmdutils/reg/It.rc b/base/applications/cmdutils/reg/It.rc
new file mode 100644
index 00000000000..09d38fd4025
--- /dev/null
+++ b/base/applications/cmdutils/reg/It.rc
@@ -0,0 +1,40 @@
+/*
+ * REG.EXE - Wine-compatible reg program.
+ * Italian language support
+ *
+ * Copyright 2010 Luca Bennati
+ *
+ * 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 "reg.h"
+
+/*UTF-8*/
+#pragma code_page(65001)
+
+LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE
+{
+ STRING_USAGE, "La sintassi di questo comando è:\n\nREG [ ADD | DELETE | QUERY ]\nREG comando /?\n"
+ STRING_ADD_USAGE, "REG ADD nome_della_chiave [/v nome_del_valore | /ve] [/t tipo] [/s separatore] [/d dati] [/f]\n"
+ STRING_DELETE_USAGE, "REG DELETE nome_della_chiave [/v nome_del_valore | /ve | /va] [/f]\n"
+ STRING_QUERY_USAGE, "REG QUERY nome_della_chiave [/v nome_del_valore | /ve] [/s]\n"
+ STRING_SUCCESS, "Operazione completata con successo\n"
+ STRING_INVALID_KEY, "Errore: nome della chiave non valido\n"
+ STRING_INVALID_CMDLINE, "Errore: parametri della linea di comando non validi\n"
+ STRING_NO_REMOTE, "Errore: Impossibile aggiungere chiavi alla macchina remota\n"
+ STRING_CANNOT_FIND, "Errore: Il sistema non è riuscito a trovare la chiave di registro o il valore specificati\n"
+}
diff --git a/base/applications/cmdutils/reg/Uk.rc b/base/applications/cmdutils/reg/Uk.rc
new file mode 100644
index 00000000000..70c86f70cb9
--- /dev/null
+++ b/base/applications/cmdutils/reg/Uk.rc
@@ -0,0 +1,43 @@
+/*
+ * REG.EXE - Wine-compatible reg program.
+ *
+ * Copyright 2008 Andrew Riedi
+ *
+ * Ukrainian language support
+ *
+ * Copyright 2010 Igor Paliychuk
+ *
+ * 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 "reg.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+
+STRINGTABLE
+{
+ STRING_USAGE, "Синтаксис цієї команди наступний:\n\nREG [ ADD | DELETE | QUERY ]\nREG command /?\n"
+ STRING_ADD_USAGE, "REG ADD key_name [/v value_name | /ve] [/t type] [/s separator] [/d data] [/f]\n"
+ STRING_DELETE_USAGE, "REG DELETE key_name [/v value_name | /ve | /va] [/f]\n"
+ STRING_QUERY_USAGE, "REG QUERY key_name [/v value_name | /ve] [/s]\n"
+ STRING_SUCCESS, "Операція успішно завершена\n"
+ STRING_INVALID_KEY, "Помилка: неправильне ім'я ключа\n"
+ STRING_INVALID_CMDLINE, "Помилка: неправильні параметри командного рядка\n"
+ STRING_NO_REMOTE, "Помилка: неможливо додати ключі на віддаленій машині\n"
+ STRING_CANNOT_FIND, "Помилка: не вдалось знайти вказаний ключ реєстру чи значення\n"
+}
diff --git a/base/applications/cmdutils/reg/reg.c b/base/applications/cmdutils/reg/reg.c
index 07dbdbff367..f65a3c8bc93 100644
--- a/base/applications/cmdutils/reg/reg.c
+++ b/base/applications/cmdutils/reg/reg.c
@@ -124,6 +124,21 @@ static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *r
lstrcpyW((LPWSTR)out_data,data);
break;
}
+ case REG_DWORD:
+ {
+ LPWSTR rest;
+ DWORD val;
+ val = strtolW(data, &rest, 0);
+ if (rest == data) {
+ static const WCHAR nonnumber[] = {'E','r','r','o','r',':',' ','/','d',' ','r','e','q','u','i','r','e','s',' ','n','u','m','b','e','r','.','\n',0};
+ reg_printfW(nonnumber);
+ break;
+ }
+ *reg_count = sizeof(DWORD);
+ out_data = HeapAlloc(GetProcessHeap(),0,*reg_count);
+ ((LPDWORD)out_data)[0] = val;
+ break;
+ }
default:
{
static const WCHAR unhandled[] = {'U','n','h','a','n','d','l','e','d',' ','T','y','p','e',' ','0','x','%','x',' ',' ','d','a','t','a',' ','%','s','\n',0};
diff --git a/base/applications/cmdutils/reg/rsrc.rc b/base/applications/cmdutils/reg/rsrc.rc
index 1ab7f7f3b97..c145fe91a21 100644
--- a/base/applications/cmdutils/reg/rsrc.rc
+++ b/base/applications/cmdutils/reg/rsrc.rc
@@ -1,13 +1,17 @@
#include "Da.rc"
-#include "De.rc"
#include "En.rc"
-#include "Fr.rc"
-#include "Ja.rc"
-//#include "Ko.rc"
-#include "Lt.rc"
+#include "Ko.rc"
#include "Nl.rc"
+#include "Pl.rc"
+
+/* UTF-8 */
+#include "De.rc"
+#include "Fr.rc"
+#include "It.rc"
+#include "Ja.rc"
+#include "Lt.rc"
#include "No.rc"
-//#include "Pl.rc"
#include "Pt.rc"
#include "Ru.rc"
#include "Si.rc"
+#include "Uk.rc"
diff --git a/base/applications/cmdutils/xcopy/De.rc b/base/applications/cmdutils/xcopy/De.rc
index 3d15e780f6e..cd6e1b91384 100644
--- a/base/applications/cmdutils/xcopy/De.rc
+++ b/base/applications/cmdutils/xcopy/De.rc
@@ -80,4 +80,3 @@ Mit:\n\
\t\tQuelldateien kopiert, die neuer sind als die Zieldatei\n\n"
}
-#pragma code_page(default)
diff --git a/base/applications/cmdutils/xcopy/Fr.rc b/base/applications/cmdutils/xcopy/Fr.rc
index b4e387eb17c..047b4b3f739 100644
--- a/base/applications/cmdutils/xcopy/Fr.rc
+++ b/base/applications/cmdutils/xcopy/Fr.rc
@@ -81,4 +81,3 @@ où :\n\
\t\tque le fichier source\n\n"
}
-#pragma code_page(default)
diff --git a/base/applications/cmdutils/xcopy/It.rc b/base/applications/cmdutils/xcopy/It.rc
index 84ca52ca911..258cb3f4a7b 100644
--- a/base/applications/cmdutils/xcopy/It.rc
+++ b/base/applications/cmdutils/xcopy/It.rc
@@ -81,4 +81,3 @@ Dove:\n\
\t\tdella sorgente\n\n"
}
-#pragma code_page(default)
diff --git a/base/applications/cmdutils/xcopy/Ja.rc b/base/applications/cmdutils/xcopy/Ja.rc
index 1c4fe12b406..38487af8256 100644
--- a/base/applications/cmdutils/xcopy/Ja.rc
+++ b/base/applications/cmdutils/xcopy/Ja.rc
@@ -81,4 +81,3 @@ XCOPY 送り元 [送り先] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\
\t\tコピー先がコピー元より古いファイルだけコピーします。\n\n"
}
-#pragma code_page(default)
diff --git a/base/applications/cmdutils/xcopy/Lt.rc b/base/applications/cmdutils/xcopy/Lt.rc
index f1254b61921..9d431de08fa 100644
--- a/base/applications/cmdutils/xcopy/Lt.rc
+++ b/base/applications/cmdutils/xcopy/Lt.rc
@@ -81,4 +81,3 @@ Kur:\n\
\t\tsenesnis už šaltinio failą\n\n"
}
-#pragma code_page(default)
diff --git a/base/applications/cmdutils/xcopy/Nl.rc b/base/applications/cmdutils/xcopy/Nl.rc
index 868475e958b..4f5dee58b59 100644
--- a/base/applications/cmdutils/xcopy/Nl.rc
+++ b/base/applications/cmdutils/xcopy/Nl.rc
@@ -79,4 +79,3 @@ 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/base/applications/cmdutils/xcopy/Ru.rc b/base/applications/cmdutils/xcopy/Ru.rc
index 4339e80dc72..154c999d357 100644
--- a/base/applications/cmdutils/xcopy/Ru.rc
+++ b/base/applications/cmdutils/xcopy/Ru.rc
@@ -84,4 +84,3 @@ XCOPY source [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\
после указанной даты. Если дата не указана, копирует только\n\
те файлы, которые новее в исходной папке.\n"
}
-#pragma code_page(default)
diff --git a/base/applications/cmdutils/xcopy/Si.rc b/base/applications/cmdutils/xcopy/Si.rc
index 8e45d498b99..1013837f402 100644
--- a/base/applications/cmdutils/xcopy/Si.rc
+++ b/base/applications/cmdutils/xcopy/Si.rc
@@ -80,4 +80,3 @@ Where:\n\
\t\tod izvora\n\n"
}
-#pragma code_page(default)
diff --git a/base/applications/cmdutils/xcopy/Uk.rc b/base/applications/cmdutils/xcopy/Uk.rc
index d25e6483dcf..6d59e1bfac6 100644
--- a/base/applications/cmdutils/xcopy/Uk.rc
+++ b/base/applications/cmdutils/xcopy/Uk.rc
@@ -82,4 +82,3 @@ Where:\n\
\t\tthan source\n\n"
}
-#pragma code_page(default)
diff --git a/base/applications/cmdutils/xcopy/rsrc.rc b/base/applications/cmdutils/xcopy/rsrc.rc
index 6d7817cf4cd..b82341cda08 100644
--- a/base/applications/cmdutils/xcopy/rsrc.rc
+++ b/base/applications/cmdutils/xcopy/rsrc.rc
@@ -27,17 +27,19 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
#include
#include "Da.rc"
-#include "De.rc"
#include "En.rc"
-#include "Fr.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"
+
+/* UTF-8 */
+#include "De.rc"
+#include "Fr.rc"
+#include "It.rc"
+#include "Ja.rc"
+#include "Lt.rc"
+#include "Nl.rc"
#include "Ru.rc"
#include "Si.rc"
#include "Uk.rc"
diff --git a/base/applications/extrac32/extrac32.c b/base/applications/extrac32/extrac32.c
new file mode 100644
index 00000000000..fc1ae1c94ae
--- /dev/null
+++ b/base/applications/extrac32/extrac32.c
@@ -0,0 +1,179 @@
+/*
+ * Extract - Wine-compatible program for extract *.cab files.
+ *
+ * Copyright 2007 Etersoft (Lyutin Anatoly)
+ * Copyright 2009 Ilya Shpigor
+ *
+ * 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
+#include
+
+#include "wine/unicode.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(extrac32);
+
+static BOOL force_mode;
+
+static UINT WINAPI ExtCabCallback(PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2)
+{
+ FILE_IN_CABINET_INFO_W *pInfo;
+ FILEPATHS_W *pFilePaths;
+
+ switch(Notification)
+ {
+ case SPFILENOTIFY_FILEINCABINET:
+ pInfo = (FILE_IN_CABINET_INFO_W*)Param1;
+ lstrcpyW(pInfo->FullTargetName, (LPCWSTR)Context);
+ lstrcatW(pInfo->FullTargetName, pInfo->NameInCabinet);
+ return FILEOP_DOIT;
+ case SPFILENOTIFY_FILEEXTRACTED:
+ pFilePaths = (FILEPATHS_W*)Param1;
+ WINE_TRACE("Extracted %s\n", wine_dbgstr_w(pFilePaths->Target));
+ return NO_ERROR;
+ }
+ return NO_ERROR;
+}
+
+static void extract(LPCWSTR cabfile, LPWSTR destdir)
+{
+ if (!SetupIterateCabinetW(cabfile, 0, ExtCabCallback, destdir))
+ WINE_ERR("Could not extract cab file %s\n", wine_dbgstr_w(cabfile));
+}
+
+static void copy_file(LPCWSTR source, LPCWSTR destination)
+{
+ WCHAR destfile[MAX_PATH];
+
+ /* append source filename if destination is a directory */
+ if (PathIsDirectoryW(destination))
+ {
+ PathCombineW(destfile, destination, PathFindFileNameW(source));
+ destination = destfile;
+ }
+
+ if (PathFileExistsW(destination) && !force_mode)
+ {
+ static const WCHAR overwriteMsg[] = {'O','v','e','r','w','r','i','t','e',' ','"','%','s','"','?',0};
+ static const WCHAR titleMsg[] = {'E','x','t','r','a','c','t',0};
+ WCHAR msg[MAX_PATH+100];
+ snprintfW(msg, sizeof(msg)/sizeof(msg[0]), overwriteMsg, destination);
+ if (MessageBoxW(NULL, msg, titleMsg, MB_YESNO | MB_ICONWARNING) != IDYES)
+ return;
+ }
+
+ WINE_TRACE("copying %s to %s\n", wine_dbgstr_w(source), wine_dbgstr_w(destination));
+ CopyFileW(source, destination, FALSE);
+}
+
+int PASCAL wWinMain(HINSTANCE hInstance, HINSTANCE prev, LPWSTR cmdline, int show)
+{
+ LPWSTR *argv;
+ int argc;
+ int i;
+ WCHAR check, cmd = 0;
+ WCHAR path[MAX_PATH];
+ WCHAR backslash[] = {'\\',0};
+ LPCWSTR cabfile = NULL;
+
+ path[0] = 0;
+ argv = CommandLineToArgvW(cmdline, &argc);
+
+ if(!argv)
+ {
+ WINE_ERR("Bad command line arguments\n");
+ return 0;
+ }
+
+ /* Parse arguments */
+ for(i = 0; i < argc; i++)
+ {
+ /* Get cabfile */
+ if (argv[i][0] != '/')
+ {
+ if (!cabfile)
+ {
+ cabfile = argv[i];
+ continue;
+ } else
+ break;
+ }
+ /* Get parameters for commands */
+ check = toupperW( argv[i][1] );
+ switch(check)
+ {
+ case 'A':
+ WINE_FIXME("/A not implemented\n");
+ break;
+ case 'Y':
+ force_mode = TRUE;
+ break;
+ case 'L':
+ if ((i + 1) >= argc) return 0;
+ if (!GetFullPathNameW(argv[++i], MAX_PATH, path, NULL))
+ return 0;
+ break;
+ case 'C':
+ if (cmd) return 0;
+ cmd = check;
+ break;
+ case 'E':
+ case 'D':
+ if (cmd) return 0;
+ cmd = check;
+ break;
+ default:
+ return 0;
+ }
+ }
+
+ if (!cabfile)
+ return 0;
+
+ if (cmd == 'C')
+ {
+ if ((i + 1) != argc) return 0;
+ if (!GetFullPathNameW(argv[i], MAX_PATH, path, NULL))
+ return 0;
+ }
+
+ if (!path[0])
+ GetCurrentDirectoryW(MAX_PATH, path);
+
+ lstrcatW(path, backslash);
+
+ /* Execute the specified command */
+ switch(cmd)
+ {
+ case 'C':
+ /* Copy file */
+ copy_file(cabfile, path);
+ break;
+ case 'E':
+ /* Extract CAB archive */
+ extract(cabfile, path);
+ break;
+ case 0:
+ case 'D':
+ /* Display CAB archive */
+ WINE_FIXME("/D not implemented\n");
+ break;
+ }
+ return 0;
+}
diff --git a/base/applications/extrac32/extrac32.rbuild b/base/applications/extrac32/extrac32.rbuild
new file mode 100644
index 00000000000..24532ddfd3d
--- /dev/null
+++ b/base/applications/extrac32/extrac32.rbuild
@@ -0,0 +1,9 @@
+
+ .
+ wine
+ shell32
+ setupapi
+ shlwapi
+ user32
+ extrac32.c
+
diff --git a/base/applications/mscutils/devmgmt/precomp.h b/base/applications/mscutils/devmgmt/precomp.h
index 8723d8d1d55..d9bdd425f85 100644
--- a/base/applications/mscutils/devmgmt/precomp.h
+++ b/base/applications/mscutils/devmgmt/precomp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef __DEVMGMT_PRECOMP_H
+#define __DEVMGMT_PRECOMP_H
#define WIN32_LEAN_AND_MEAN
#include
@@ -92,3 +93,5 @@ HIMAGELIST InitImageList(UINT NumButtons,
VOID GetError(VOID);
VOID DisplayString(LPTSTR);
+
+#endif /* __DEVMGMT_PRECOMP_H */
diff --git a/base/applications/mscutils/servman/precomp.h b/base/applications/mscutils/servman/precomp.h
index a81b984c7d3..9b829ad78df 100644
--- a/base/applications/mscutils/servman/precomp.h
+++ b/base/applications/mscutils/servman/precomp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef __SERVMAN_PRECOMP_H
+#define __SERVMAN_PRECOMP_H
//#define WIN32_LEAN_AND_MEAN
#include
@@ -184,3 +185,5 @@ HIMAGELIST InitImageList(UINT StartResource,
UINT Width,
UINT Height,
ULONG type);
+
+#endif /* __SERVMAN_PRECOMP_H */
diff --git a/base/applications/paint/lang/pl-PL.rc b/base/applications/paint/lang/pl-PL.rc
index 3449a3add71..b37039a4def 100644
--- a/base/applications/paint/lang/pl-PL.rc
+++ b/base/applications/paint/lang/pl-PL.rc
@@ -49,7 +49,7 @@ BEGIN
MENUITEM SEPARATOR
POPUP "Powikszenie"
BEGIN
- POPUP "User defined"
+ POPUP "Zdefiniowane przez uytkownika"
BEGIN
MENUITEM "12,5%", IDM_VIEWZOOM125
MENUITEM "25%", IDM_VIEWZOOM25
@@ -60,8 +60,8 @@ BEGIN
MENUITEM "800%", IDM_VIEWZOOM800
END
MENUITEM SEPARATOR
- MENUITEM "Show grid", IDM_VIEWSHOWGRID
- MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE
+ MENUITEM "Poka siatk", IDM_VIEWSHOWGRID
+ MENUITEM "Poka miniatur", IDM_VIEWSHOWMINIATURE
END
MENUITEM "Peny ekran\tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -181,7 +181,7 @@ BEGIN
IDS_INFOTEXT, "Paint dla ReactOS jest dostpny na licencji GNU Lesser General Public License (LGPL) wersja 3 (www.gnu.org)"
IDS_SAVEPROMPTTEXT, "Czy chcesz zapisa zmiany do %s?"
IDS_DEFAULTFILENAME, "Nienazwany.bmp"
- IDS_MINIATURETITLE, "Miniature"
+ IDS_MINIATURETITLE, "Miniatura"
IDS_TOOLTIP1, "Zaznaczenie dowolne"
IDS_TOOLTIP2, "Zaznaczenie"
IDS_TOOLTIP3, "Gumka"
@@ -190,16 +190,16 @@ BEGIN
IDS_TOOLTIP6, "Przyblienie"
IDS_TOOLTIP7, "Owek"
IDS_TOOLTIP8, "Pdzel"
- IDS_TOOLTIP9, "Spray"
+ IDS_TOOLTIP9, "Aerograf"
IDS_TOOLTIP10, "Tekst"
IDS_TOOLTIP11, "Linia"
IDS_TOOLTIP12, "Krzywa Beziera"
IDS_TOOLTIP13, "Prostokt"
- IDS_TOOLTIP14, "Polygon"
+ IDS_TOOLTIP14, "Wielokt"
IDS_TOOLTIP15, "Elipsa"
IDS_TOOLTIP16, "Zaokrglony Prostokt"
IDS_OPENFILTER, "Pliki Bitmapy (*.bmp;*.dib)\1*.bmp;*.dib\1Wszystkie pliki (*.*)\1*.*\1"
IDS_SAVEFILTER, "Bitmapa 24 bit (*.bmp;*.dib)\1*.bmp;*.dib\1"
- IDS_FILESIZE, "%d bytes"
- IDS_PRINTRES, "%d x %d pixels per meter"
+ IDS_FILESIZE, "%d bajtw"
+ IDS_PRINTRES, "%d x %d pikseli na metr"
END
diff --git a/base/applications/rapps/lang/pl-PL.rc b/base/applications/rapps/lang/pl-PL.rc
index fc79e8a205b..60fd20b7530 100644
--- a/base/applications/rapps/lang/pl-PL.rc
+++ b/base/applications/rapps/lang/pl-PL.rc
@@ -16,7 +16,7 @@ BEGIN
MENUITEM "&Odinstaluj",ID_UNINSTALL
MENUITEM "&Modyfikuj", ID_MODIFY
MENUITEM SEPARATOR
- MENUITEM "&Remove from Registry", ID_REGREMOVE
+ MENUITEM "&Usu z rejestru", ID_REGREMOVE
MENUITEM SEPARATOR
MENUITEM "O&dwie", ID_REFRESH
END
@@ -44,7 +44,7 @@ BEGIN
MENUITEM "&odinstaluj", ID_UNINSTALL
MENUITEM "&Modyfikuj", ID_MODIFY
MENUITEM SEPARATOR
- MENUITEM "&Remove from Registry", ID_REGREMOVE
+ MENUITEM "&Usu z rejestru", ID_REGREMOVE
MENUITEM SEPARATOR
MENUITEM "&Odwie", ID_REFRESH
END
@@ -52,37 +52,37 @@ END
IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE 0, 0, 250, 144
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Settings"
+CAPTION "Ustawienia"
FONT 8, "MS Shell Dlg"
BEGIN
- GROUPBOX "General", -1, 4, 2, 240, 61
- AUTOCHECKBOX "&Save window position", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12
- AUTOCHECKBOX "&Update the list of accessible programs at start", IDC_UPDATE_AVLIST, 15, 29, 219, 12
- AUTOCHECKBOX "&Log of installation and removal of programs", IDC_LOG_ENABLED, 15, 46, 219, 12
+ GROUPBOX "Oglne", -1, 4, 2, 240, 61
+ AUTOCHECKBOX "&Zapisz pozycj okna", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12
+ AUTOCHECKBOX "&Aktualizuj list dostpnych programw przy kadym uruchomieniu", IDC_UPDATE_AVLIST, 15, 29, 219, 12
+ AUTOCHECKBOX "Zap&isuj dziennik instalacji i usuwania programw", IDC_LOG_ENABLED, 15, 46, 219, 12
- GROUPBOX "Downloading", -1, 4, 65, 240, 51
- LTEXT "Folder for downloadings:", -1, 16, 75, 100, 9
+ GROUPBOX "Pobieranie", -1, 4, 65, 240, 51
+ LTEXT "Katalog dla pobranych plikw:", -1, 16, 75, 100, 9
EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP
- PUSHBUTTON "&Choose", IDC_CHOOSE, 187, 85, 50, 14
- AUTOCHECKBOX "&Delete installers of programs after installation", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12
+ PUSHBUTTON "&Wybierz", IDC_CHOOSE, 187, 85, 50, 14
+ AUTOCHECKBOX "&Usu instalatory programw po ich zainstalowaniu", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12
- PUSHBUTTON "Default", IDC_DEFAULT_SETTINGS, 8, 124, 60, 14
+ PUSHBUTTON "Domylne", IDC_DEFAULT_SETTINGS, 8, 124, 60, 14
PUSHBUTTON "OK", IDOK, 116, 124, 60, 14
- PUSHBUTTON "Cancel", IDCANCEL, 181, 124, 60, 14
+ PUSHBUTTON "Anuluj", IDCANCEL, 181, 124, 60, 14
END
IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE 0, 0, 216, 97
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Program installation"
+CAPTION "Instalacja programu"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "...", IDC_INSTALL_TEXT, 4, 5, 209, 35
- AUTORADIOBUTTON "&Install from a disk (CD or DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP
- AUTORADIOBUTTON "&Download and install", IDC_DOWNLOAD_INSTALL, 10, 59, 197, 11, NOT WS_TABSTOP
+ AUTORADIOBUTTON "&Zainstaluj z dysku (CD or DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP
+ AUTORADIOBUTTON "&Pobierz i zainstaluj", IDC_DOWNLOAD_INSTALL, 10, 59, 197, 11, NOT WS_TABSTOP
PUSHBUTTON "OK", IDOK, 86, 78, 60, 14
- PUSHBUTTON "Cancel", IDCANCEL, 150, 78, 60, 14
+ PUSHBUTTON "Anuluj", IDCANCEL, 150, 78, 60, 14
END
IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76
@@ -101,7 +101,7 @@ 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
+ PUSHBUTTON "Zamknij", IDOK, 133, 46, 50, 14
ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30
END
@@ -139,7 +139,7 @@ BEGIN
IDS_INFO_INSTLOCATION "\nScieka instalacji: "
IDS_INFO_INSTALLSRC "\nrdo instalacji: "
IDS_INFO_UNINSTALLSTR "\nKomenda deinstalacji: "
- IDS_INFO_MODIFYPATH "\nModify Path: "
+ IDS_INFO_MODIFYPATH "\nModyfikacja cieki instalacji: "
IDS_INFO_INSTALLDATE "\nData instalacji: "
END
@@ -186,10 +186,10 @@ BEGIN
IDS_AVAILABLEFORINST "Dostpne"
IDS_UPDATES "Uaktualnienia"
IDS_APPLICATIONS "Aplikacje"
- IDS_CHOOSE_FOLDER_TEXT "Choose a folder which will be used for downloading of programs:"
- IDS_CHOOSE_FOLDER_ERROR "You have specified a nonexistent folder!"
- IDS_USER_NOT_ADMIN "You should be administrator for start ""ReactOS Applications Manager""!"
- IDS_APP_REG_REMOVE "Are you sure you want to delete the data on the installed program from the registry?"
- IDS_INFORMATION "Information"
- IDS_UNABLE_TO_REMOVE "Unable to remove data on the program from the registry!"
+ IDS_CHOOSE_FOLDER_TEXT "Wybierz katalog w ktrym bda zapisywane pobrane programy:"
+ IDS_CHOOSE_FOLDER_ERROR "Wybrae nieistniejcy katalog!"
+ IDS_USER_NOT_ADMIN "Musisz mie uprawnienia administratora aby uruchomi ""ReactOS Applications Manager""!"
+ IDS_APP_REG_REMOVE "Czy na pewno chcesz usun wpis tego programu z rejestru?"
+ IDS_INFORMATION "Informacja"
+ IDS_UNABLE_TO_REMOVE "Nie mona byo usun wpisu z rejestru!"
END
diff --git a/base/applications/rapps/rapps.h b/base/applications/rapps/rapps.h
index 5401b37a317..cba76db823a 100644
--- a/base/applications/rapps/rapps.h
+++ b/base/applications/rapps/rapps.h
@@ -11,7 +11,7 @@
#include "resource.h"
-#define APPLICATION_DATEBASE_URL L"http://opendn.org/rappmgr.cab"
+#define APPLICATION_DATEBASE_URL L"http://svn.reactos.org/packages/rappmgr.cab"
#define SPLIT_WIDTH 4
#define MAX_STR_LEN 256
diff --git a/base/applications/taskmgr/precomp.h b/base/applications/taskmgr/precomp.h
index 67272472a48..c30856b3065 100644
--- a/base/applications/taskmgr/precomp.h
+++ b/base/applications/taskmgr/precomp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef __PRECOMP_H
+#define __PRECOMP_H
#ifndef UNICODE
#error Task-Manager uses NDK functions, so it can only be compiled with Unicode support enabled!
@@ -35,3 +36,5 @@
#include "priority.h"
#include "run.h"
#include "trayicon.h"
+
+#endif /* __PRECOMP_H */
diff --git a/base/applications/winhlp32/De.rc b/base/applications/winhlp32/De.rc
index 0ec40add40f..2e14f70ad84 100644
--- a/base/applications/winhlp32/De.rc
+++ b/base/applications/winhlp32/De.rc
@@ -128,4 +128,3 @@ END
MENUITEM "Systemfarben verwenden", MNID_CTXT_SYSTEM_COLORS
END
END
-#pragma code_page(default)
diff --git a/base/applications/winhlp32/Fr.rc b/base/applications/winhlp32/Fr.rc
index 2199e37ab9e..cedb0f694b7 100644
--- a/base/applications/winhlp32/Fr.rc
+++ b/base/applications/winhlp32/Fr.rc
@@ -131,4 +131,3 @@ BEGIN
MENUITEM "Utiliser les couleurs système", MNID_CTXT_SYSTEM_COLORS
END
END
-#pragma code_page(default)
diff --git a/base/applications/winhlp32/It.rc b/base/applications/winhlp32/It.rc
index cd16e4058bf..b5c53929bf4 100644
--- a/base/applications/winhlp32/It.rc
+++ b/base/applications/winhlp32/It.rc
@@ -89,4 +89,3 @@ 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/base/applications/winhlp32/Ja.rc b/base/applications/winhlp32/Ja.rc
index a06b5f1df65..b73d18dd192 100644
--- a/base/applications/winhlp32/Ja.rc
+++ b/base/applications/winhlp32/Ja.rc
@@ -128,4 +128,3 @@ BEGIN
MENUITEM "システム カラーを使う", MNID_CTXT_SYSTEM_COLORS
END
END
-#pragma code_page(default)
diff --git a/base/applications/winhlp32/Lt.rc b/base/applications/winhlp32/Lt.rc
index 5ee53f8aa16..f8e78681aae 100644
--- a/base/applications/winhlp32/Lt.rc
+++ b/base/applications/winhlp32/Lt.rc
@@ -129,4 +129,3 @@ BEGIN
MENUITEM "Naudoti sistemos spalvas", MNID_CTXT_SYSTEM_COLORS
END
END
-#pragma code_page(default)
diff --git a/base/applications/winhlp32/Nl.rc b/base/applications/winhlp32/Nl.rc
index a7938406b65..029d58265b9 100644
--- a/base/applications/winhlp32/Nl.rc
+++ b/base/applications/winhlp32/Nl.rc
@@ -127,4 +127,3 @@ BEGIN
MENUITEM "Gebruik systeem kleuren", MNID_CTXT_SYSTEM_COLORS
END
END
-#pragma code_page(default)
diff --git a/base/applications/winhlp32/Pt.rc b/base/applications/winhlp32/Pt.rc
index 5598bd77cd6..28933a22a6f 100644
--- a/base/applications/winhlp32/Pt.rc
+++ b/base/applications/winhlp32/Pt.rc
@@ -204,4 +204,3 @@ BEGIN
MENUITEM "Usar cores do sistema", MNID_CTXT_SYSTEM_COLORS
END
END
-#pragma code_page(default)
diff --git a/base/applications/winhlp32/Rm.rc b/base/applications/winhlp32/Rm.rc
index 17293875f99..3b2a1fa9403 100644
--- a/base/applications/winhlp32/Rm.rc
+++ b/base/applications/winhlp32/Rm.rc
@@ -92,4 +92,3 @@ 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/base/applications/winhlp32/Ro.rc b/base/applications/winhlp32/Ro.rc
index eaa530bc5bb..1f916ac21d5 100644
--- a/base/applications/winhlp32/Ro.rc
+++ b/base/applications/winhlp32/Ro.rc
@@ -130,4 +130,3 @@ BEGIN
MENUITEM "Utilizează culorile sistemului", MNID_CTXT_SYSTEM_COLORS
END
END
-#pragma code_page(default)
diff --git a/base/applications/winhlp32/Ru.rc b/base/applications/winhlp32/Ru.rc
index a476b344c6c..165094f4720 100644
--- a/base/applications/winhlp32/Ru.rc
+++ b/base/applications/winhlp32/Ru.rc
@@ -121,4 +121,3 @@ BEGIN
MENUITEM "Использовать системные цвета", MNID_CTXT_SYSTEM_COLORS
END
END
-#pragma code_page(default)
diff --git a/base/applications/winhlp32/Si.rc b/base/applications/winhlp32/Si.rc
index 310ef45a8f7..527b45431ee 100644
--- a/base/applications/winhlp32/Si.rc
+++ b/base/applications/winhlp32/Si.rc
@@ -126,4 +126,3 @@ BEGIN
MENUITEM "Uporabi sistemske barve", MNID_CTXT_SYSTEM_COLORS
END
END
-#pragma code_page(default)
diff --git a/base/applications/winhlp32/Zh.rc b/base/applications/winhlp32/Zh.rc
index a68b699c44f..ed20356cf47 100644
--- a/base/applications/winhlp32/Zh.rc
+++ b/base/applications/winhlp32/Zh.rc
@@ -160,4 +160,3 @@ STID_FILE_NOT_FOUND_s "不能開啟檔案 '%s'. 你想要自己找這個檔案
STID_NO_RICHEDIT "找不到 richedit... 終止"
STID_PSH_INDEX, "幫助內容: "
}
-#pragma code_page(default)
diff --git a/base/applications/winhlp32/rsrc.rc b/base/applications/winhlp32/rsrc.rc
index e45fc8a7ce5..28d8de35fe3 100644
--- a/base/applications/winhlp32/rsrc.rc
+++ b/base/applications/winhlp32/rsrc.rc
@@ -27,25 +27,27 @@ 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 "Sk.rc"
+#include "Sv.rc"
+#include "Tr.rc"
+
+/* UTF-8 */
+#include "De.rc"
+#include "Fr.rc"
+#include "It.rc"
+#include "Ja.rc"
+#include "Lt.rc"
+#include "Nl.rc"
#include "Pt.rc"
#include "Rm.rc"
#include "Ro.rc"
#include "Ru.rc"
#include "Si.rc"
-#include "Sk.rc"
-#include "Sv.rc"
-#include "Tr.rc"
#include "Zh.rc"
diff --git a/base/applications/wordpad/Da.rc b/base/applications/wordpad/Da.rc
index 8d035955bd2..882cca7e8d8 100644
--- a/base/applications/wordpad/Da.rc
+++ b/base/applications/wordpad/Da.rc
@@ -106,6 +106,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Sort", ID_COLOR_BLACK
+ MENUITEM "Mrkerd", ID_COLOR_MAROON
+ MENUITEM "Grn", ID_COLOR_GREEN
+ MENUITEM "Oliven" ID_COLOR_OLIVE
+ MENUITEM "Navy" ID_COLOR_NAVY
+ MENUITEM "Lilla" ID_COLOR_PURPLE
+ MENUITEM "Teal" ID_COLOR_TEAL
+ MENUITEM "Gr" ID_COLOR_GRAY
+ MENUITEM "Slv" ID_COLOR_SILVER
+ MENUITEM "Rd" ID_COLOR_RED
+ MENUITEM "Lime" ID_COLOR_LIME
+ MENUITEM "Gul" ID_COLOR_YELLOW
+ MENUITEM "Bl" ID_COLOR_BLUE
+ MENUITEM "Violet" ID_COLOR_FUCHSIA
+ MENUITEM "Cyan" ID_COLOR_AQUA
+ MENUITEM "Hvid" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Dato og tid"
@@ -221,6 +245,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Zoom in"
STRING_PREVIEW_ZOOMOUT, "Zoom out"
STRING_PREVIEW_CLOSE, "Luk"
+ STRING_PREVIEW_PAGE, "Page"
+ STRING_PREVIEW_PAGES, "Pages"
END
STRINGTABLE DISCARDABLE
diff --git a/base/applications/wordpad/De.rc b/base/applications/wordpad/De.rc
index d552d9c21a5..ca11edd8bea 100644
--- a/base/applications/wordpad/De.rc
+++ b/base/applications/wordpad/De.rc
@@ -108,6 +108,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Schwarz" ID_COLOR_BLACK
+ MENUITEM "Kastanienbraun" ID_COLOR_MAROON
+ MENUITEM "Grün" ID_COLOR_GREEN
+ MENUITEM "Olivgrün" ID_COLOR_OLIVE
+ MENUITEM "Dunkelblau" ID_COLOR_NAVY
+ MENUITEM "Lila" ID_COLOR_PURPLE
+ MENUITEM "Blaugrün" ID_COLOR_TEAL
+ MENUITEM "Grau" ID_COLOR_GRAY
+ MENUITEM "Silber" ID_COLOR_SILVER
+ MENUITEM "Rot" ID_COLOR_RED
+ MENUITEM "Hellgrün" ID_COLOR_LIME
+ MENUITEM "Gelb" ID_COLOR_YELLOW
+ MENUITEM "Blau" ID_COLOR_BLUE
+ MENUITEM "Pink" ID_COLOR_FUCHSIA
+ MENUITEM "Aquamarin" ID_COLOR_AQUA
+ MENUITEM "Weiß" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Datum und Uhrzeit"
@@ -218,9 +242,13 @@ BEGIN
STRING_PREVIEW_PRINT, "&Drucken"
STRING_PREVIEW_NEXTPAGE, "&Nächste"
STRING_PREVIEW_PREVPAGE, "&Vorherige"
- STRING_PREVIEW_TWOPAGES, "Zwei Seiten"
- STRING_PREVIEW_ONEPAGE, "Eine Seite"
+ STRING_PREVIEW_TWOPAGES, "&Zwei Seiten"
+ STRING_PREVIEW_ONEPAGE, "&Eine Seite"
+ STRING_PREVIEW_ZOOMIN, "Ver&größern"
+ STRING_PREVIEW_ZOOMOUT, "Ver&kleinern"
STRING_PREVIEW_CLOSE, "&Schließen"
+ STRING_PREVIEW_PAGE, "Seite"
+ STRING_PREVIEW_PAGES, "Seiten"
END
STRINGTABLE DISCARDABLE
@@ -246,4 +274,3 @@ 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/base/applications/wordpad/En.rc b/base/applications/wordpad/En.rc
index 7af40bda4b8..0dec19bc650 100644
--- a/base/applications/wordpad/En.rc
+++ b/base/applications/wordpad/En.rc
@@ -106,6 +106,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Black", ID_COLOR_BLACK
+ MENUITEM "Maroon", ID_COLOR_MAROON
+ MENUITEM "Green", ID_COLOR_GREEN
+ MENUITEM "Olive" ID_COLOR_OLIVE
+ MENUITEM "Navy" ID_COLOR_NAVY
+ MENUITEM "Purple" ID_COLOR_PURPLE
+ MENUITEM "Teal" ID_COLOR_TEAL
+ MENUITEM "Gray" ID_COLOR_GRAY
+ MENUITEM "Silver" ID_COLOR_SILVER
+ MENUITEM "Red" ID_COLOR_RED
+ MENUITEM "Lime" ID_COLOR_LIME
+ MENUITEM "Yellow" ID_COLOR_YELLOW
+ MENUITEM "Blue" ID_COLOR_BLUE
+ MENUITEM "Fuchsia" ID_COLOR_FUCHSIA
+ MENUITEM "Aqua" ID_COLOR_AQUA
+ MENUITEM "White" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Date and time"
@@ -213,6 +237,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Zoom in"
STRING_PREVIEW_ZOOMOUT, "Zoom out"
STRING_PREVIEW_CLOSE, "Close"
+ STRING_PREVIEW_PAGE, "Page"
+ STRING_PREVIEW_PAGES, "Pages"
STRING_UNITS_CM, "cm"
END
diff --git a/base/applications/wordpad/Fr.rc b/base/applications/wordpad/Fr.rc
index b38daad137e..54ae0b992b8 100644
--- a/base/applications/wordpad/Fr.rc
+++ b/base/applications/wordpad/Fr.rc
@@ -109,6 +109,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Noir" ID_COLOR_BLACK
+ MENUITEM "Marron" ID_COLOR_MAROON
+ MENUITEM "Vert" ID_COLOR_GREEN
+ MENUITEM "Olive" ID_COLOR_OLIVE
+ MENUITEM "Bleu marine" ID_COLOR_NAVY
+ MENUITEM "Pourpre" ID_COLOR_PURPLE
+ MENUITEM "Sarcelle" ID_COLOR_TEAL
+ MENUITEM "Gris" ID_COLOR_GRAY
+ MENUITEM "Argent" ID_COLOR_SILVER
+ MENUITEM "Rouge" ID_COLOR_RED
+ MENUITEM "Citron vert" ID_COLOR_LIME
+ MENUITEM "Jaune" ID_COLOR_YELLOW
+ MENUITEM "Bleu" ID_COLOR_BLUE
+ MENUITEM "Fuchsia" ID_COLOR_FUCHSIA
+ MENUITEM "Eau" ID_COLOR_AQUA
+ MENUITEM "Blanc" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Date et heure"
@@ -224,6 +248,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Zoom avant"
STRING_PREVIEW_ZOOMOUT, "Zoom arrière"
STRING_PREVIEW_CLOSE, "Fermer"
+ STRING_PREVIEW_PAGE, "Page"
+ STRING_PREVIEW_PAGES, "Pages"
END
STRINGTABLE DISCARDABLE
@@ -249,4 +275,3 @@ 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/base/applications/wordpad/Hu.rc b/base/applications/wordpad/Hu.rc
index 1eeede3c8aa..3694062e355 100644
--- a/base/applications/wordpad/Hu.rc
+++ b/base/applications/wordpad/Hu.rc
@@ -106,6 +106,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Black", ID_COLOR_BLACK
+ MENUITEM "Maroon", ID_COLOR_MAROON
+ MENUITEM "Green", ID_COLOR_GREEN
+ MENUITEM "Olive" ID_COLOR_OLIVE
+ MENUITEM "Navy" ID_COLOR_NAVY
+ MENUITEM "Purple" ID_COLOR_PURPLE
+ MENUITEM "Teal" ID_COLOR_TEAL
+ MENUITEM "Gray" ID_COLOR_GRAY
+ MENUITEM "Silver" ID_COLOR_SILVER
+ MENUITEM "Red" ID_COLOR_RED
+ MENUITEM "Lime" ID_COLOR_LIME
+ MENUITEM "Yellow" ID_COLOR_YELLOW
+ MENUITEM "Blue" ID_COLOR_BLUE
+ MENUITEM "Fuchsia" ID_COLOR_FUCHSIA
+ MENUITEM "Aqua" ID_COLOR_AQUA
+ MENUITEM "White" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Date and time"
@@ -221,6 +245,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Zoom in"
STRING_PREVIEW_ZOOMOUT, "Zoom out"
STRING_PREVIEW_CLOSE, "Close"
+ STRING_PREVIEW_PAGE, "Page"
+ STRING_PREVIEW_PAGES, "Pages"
END
STRINGTABLE DISCARDABLE
diff --git a/base/applications/wordpad/It.rc b/base/applications/wordpad/It.rc
index e0d3b890bc4..99968411776 100644
--- a/base/applications/wordpad/It.rc
+++ b/base/applications/wordpad/It.rc
@@ -110,6 +110,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Nero" ID_COLOR_BLACK
+ MENUITEM "Marrone rossiccio" ID_COLOR_MAROON
+ MENUITEM "Verde" ID_COLOR_GREEN
+ MENUITEM "Verde oliva" ID_COLOR_OLIVE
+ MENUITEM "Blu oltremare" ID_COLOR_NAVY
+ MENUITEM "Propora" ID_COLOR_PURPLE
+ MENUITEM "Teal" ID_COLOR_TEAL
+ MENUITEM "Grigio" ID_COLOR_GRAY
+ MENUITEM "Argento" ID_COLOR_SILVER
+ MENUITEM "Rosso" ID_COLOR_RED
+ MENUITEM "Verde cedro" ID_COLOR_LIME
+ MENUITEM "Giallo" ID_COLOR_YELLOW
+ MENUITEM "Blu" ID_COLOR_BLUE
+ MENUITEM "Fucsia" ID_COLOR_FUCHSIA
+ MENUITEM "Aqua" ID_COLOR_AQUA
+ MENUITEM "Bianco" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Data e ora"
@@ -217,6 +241,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Ingrandisci"
STRING_PREVIEW_ZOOMOUT, "Rimpicciolisci"
STRING_PREVIEW_CLOSE, "Chiudi"
+ STRING_PREVIEW_PAGE, "Page"
+ STRING_PREVIEW_PAGES, "Pages"
STRING_UNITS_CM, "cm"
END
@@ -238,4 +264,3 @@ BEGIN
STRING_PRINTING_NOT_IMPLEMENTED, "Stampa non implementata"
STRING_MAX_TAB_STOPS, "Non si possono aggiungere più di 32 punti di fermata delle tabulazioni."
END
-#pragma code_page(default)
diff --git a/base/applications/wordpad/Ja.rc b/base/applications/wordpad/Ja.rc
index 89b4b0041e2..bd5e4c9ea94 100644
--- a/base/applications/wordpad/Ja.rc
+++ b/base/applications/wordpad/Ja.rc
@@ -109,6 +109,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "黒" ID_COLOR_BLACK
+ MENUITEM "茶色" ID_COLOR_MAROON
+ MENUITEM "緑" ID_COLOR_GREEN
+ MENUITEM "オリーブ" ID_COLOR_OLIVE
+ MENUITEM "紺" ID_COLOR_NAVY
+ MENUITEM "紫" ID_COLOR_PURPLE
+ MENUITEM "青緑" ID_COLOR_TEAL
+ MENUITEM "灰色" ID_COLOR_GRAY
+ MENUITEM "銀色" ID_COLOR_SILVER
+ MENUITEM "赤" ID_COLOR_RED
+ MENUITEM "黄緑" ID_COLOR_LIME
+ MENUITEM "黄" ID_COLOR_YELLOW
+ MENUITEM "青" ID_COLOR_BLUE
+ MENUITEM "赤紫" ID_COLOR_FUCHSIA
+ MENUITEM "水色" ID_COLOR_AQUA
+ MENUITEM "白" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "日付と時刻"
@@ -224,6 +248,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Zoom in"
STRING_PREVIEW_ZOOMOUT, "Zoom out"
STRING_PREVIEW_CLOSE, "閉じる"
+ STRING_PREVIEW_PAGE, "Page"
+ STRING_PREVIEW_PAGES, "Pages"
END
STRINGTABLE DISCARDABLE
@@ -249,4 +275,3 @@ BEGIN
STRING_PRINTING_NOT_IMPLEMENTED, "プリントが実装されていません。"
STRING_MAX_TAB_STOPS, "32以上なタブを追加できません。"
END
-#pragma code_page(default)
diff --git a/base/applications/wordpad/Ko.rc b/base/applications/wordpad/Ko.rc
index 20928221c02..81110831b75 100644
--- a/base/applications/wordpad/Ko.rc
+++ b/base/applications/wordpad/Ko.rc
@@ -107,6 +107,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "" ID_COLOR_BLACK
+ MENUITEM "" ID_COLOR_MAROON
+ MENUITEM "" ID_COLOR_GREEN
+ MENUITEM "ø" ID_COLOR_OLIVE
+ MENUITEM "£ " ID_COLOR_NAVY
+ MENUITEM "ȫ" ID_COLOR_PURPLE
+ MENUITEM " " ID_COLOR_TEAL
+ MENUITEM "ȸ" ID_COLOR_GRAY
+ MENUITEM "" ID_COLOR_SILVER
+ MENUITEM "" ID_COLOR_RED
+ MENUITEM "ӻ" ID_COLOR_LIME
+ MENUITEM "" ID_COLOR_YELLOW
+ MENUITEM "Ķ" ID_COLOR_BLUE
+ MENUITEM "ȫ" ID_COLOR_FUCHSIA
+ MENUITEM "" ID_COLOR_AQUA
+ MENUITEM "Ͼ" ID_COLOR_WHITE
+ MENUITEM "ڵ" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "¥ ð"
@@ -212,10 +236,12 @@ BEGIN
STRING_PREVIEW_PREVPAGE, " "
STRING_PREVIEW_TWOPAGES, " "
STRING_PREVIEW_ONEPAGE, " "
- STRING_PREVIEW_ZOOMIN, "Zoom in"
- STRING_PREVIEW_ZOOMOUT, "Zoom out"
+ STRING_PREVIEW_ZOOMIN, "Ȯ"
+ STRING_PREVIEW_ZOOMOUT, ""
STRING_PREVIEW_CLOSE, "ݱ"
- STRING_UNITS_CM, "cm"
+ STRING_PREVIEW_PAGE, ""
+ STRING_PREVIEW_PAGES, ""
+ STRING_UNITS_CM, "cm"
END
STRINGTABLE DISCARDABLE
diff --git a/base/applications/wordpad/Lt.rc b/base/applications/wordpad/Lt.rc
index a1c73126b74..c9f2571ccc1 100644
--- a/base/applications/wordpad/Lt.rc
+++ b/base/applications/wordpad/Lt.rc
@@ -109,6 +109,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Juoda" ID_COLOR_BLACK
+ MENUITEM "Kaštoninė" ID_COLOR_MAROON
+ MENUITEM "Žalia" ID_COLOR_GREEN
+ MENUITEM "Alyvinė" ID_COLOR_OLIVE
+ MENUITEM "Ultramarinas" ID_COLOR_NAVY
+ MENUITEM "Purpurinė" ID_COLOR_PURPLE
+ MENUITEM "Neutrali ciano" ID_COLOR_TEAL
+ MENUITEM "Pilka" ID_COLOR_GRAY
+ MENUITEM "Sidabrinė" ID_COLOR_SILVER
+ MENUITEM "Raudona" ID_COLOR_RED
+ MENUITEM "Gelsvai žalsva" ID_COLOR_LIME
+ MENUITEM "Geltona" ID_COLOR_YELLOW
+ MENUITEM "Mėlyna" ID_COLOR_BLUE
+ MENUITEM "Fuksija" ID_COLOR_FUCHSIA
+ MENUITEM "Žydra" ID_COLOR_AQUA
+ MENUITEM "Balta" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Data ir laikas"
@@ -224,6 +248,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Didinti"
STRING_PREVIEW_ZOOMOUT, "Mažinti"
STRING_PREVIEW_CLOSE, "Užverti"
+ STRING_PREVIEW_PAGE, "Puslapis"
+ STRING_PREVIEW_PAGES, "Puslapiai"
END
STRINGTABLE DISCARDABLE
@@ -249,4 +275,3 @@ 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/base/applications/wordpad/Nl.rc b/base/applications/wordpad/Nl.rc
index 581855eec98..5741dbea9b7 100644
--- a/base/applications/wordpad/Nl.rc
+++ b/base/applications/wordpad/Nl.rc
@@ -107,6 +107,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Zwart" ID_COLOR_BLACK
+ MENUITEM "Kastanjebruin" ID_COLOR_MAROON
+ MENUITEM "Groen" ID_COLOR_GREEN
+ MENUITEM "Olijfgroen" ID_COLOR_OLIVE
+ MENUITEM "Marineblauw" ID_COLOR_NAVY
+ MENUITEM "Paars" ID_COLOR_PURPLE
+ MENUITEM "Groenblauw" ID_COLOR_TEAL
+ MENUITEM "Grijs" ID_COLOR_GRAY
+ MENUITEM "Zilver" ID_COLOR_SILVER
+ MENUITEM "Rood" ID_COLOR_RED
+ MENUITEM "Lichtgroen" ID_COLOR_LIME
+ MENUITEM "Geel" ID_COLOR_YELLOW
+ MENUITEM "Blauw" ID_COLOR_BLUE
+ MENUITEM "Fuchsiapaars" ID_COLOR_FUCHSIA
+ MENUITEM "Zeeblauw" ID_COLOR_AQUA
+ MENUITEM "Wit" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Datum en tijd"
@@ -214,6 +238,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Zoom in"
STRING_PREVIEW_ZOOMOUT, "Zoom out"
STRING_PREVIEW_CLOSE, "Sluiten"
+ STRING_PREVIEW_PAGE, "Page"
+ STRING_PREVIEW_PAGES, "Pages"
END
STRINGTABLE DISCARDABLE
diff --git a/base/applications/wordpad/No.rc b/base/applications/wordpad/No.rc
index c8086582afe..fbca2a09bee 100644
--- a/base/applications/wordpad/No.rc
+++ b/base/applications/wordpad/No.rc
@@ -108,6 +108,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Svart" ID_COLOR_BLACK
+ MENUITEM "Rødbrun" ID_COLOR_MAROON
+ MENUITEM "Grønn" ID_COLOR_GREEN
+ MENUITEM "Oliven" ID_COLOR_OLIVE
+ MENUITEM "Marineblå" ID_COLOR_NAVY
+ MENUITEM "Purpur" ID_COLOR_PURPLE
+ MENUITEM "Teal" ID_COLOR_TEAL
+ MENUITEM "Grå" ID_COLOR_GRAY
+ MENUITEM "Sølv" ID_COLOR_SILVER
+ MENUITEM "Rød" ID_COLOR_RED
+ MENUITEM "Lime-grønn" ID_COLOR_LIME
+ MENUITEM "Gul" ID_COLOR_YELLOW
+ MENUITEM "Blå" ID_COLOR_BLUE
+ MENUITEM "Fuchsia" ID_COLOR_FUCHSIA
+ MENUITEM "Aqua" ID_COLOR_AQUA
+ MENUITEM "Hvit" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Dato og klokkeslett"
@@ -223,6 +247,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Zoom in"
STRING_PREVIEW_ZOOMOUT, "Zoom out"
STRING_PREVIEW_CLOSE, "Lukk"
+ STRING_PREVIEW_PAGE, "Page"
+ STRING_PREVIEW_PAGES, "Pages"
END
STRINGTABLE DISCARDABLE
@@ -248,4 +274,3 @@ 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/base/applications/wordpad/Pl.rc b/base/applications/wordpad/Pl.rc
index 97d7288bc4c..4d403041858 100644
--- a/base/applications/wordpad/Pl.rc
+++ b/base/applications/wordpad/Pl.rc
@@ -107,6 +107,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Czarny" ID_COLOR_BLACK
+ MENUITEM "Kasztanowy" ID_COLOR_MAROON
+ MENUITEM "Zielony" ID_COLOR_GREEN
+ MENUITEM "Oliwkowy" ID_COLOR_OLIVE
+ MENUITEM "Granatowy" ID_COLOR_NAVY
+ MENUITEM "Purpurowy" ID_COLOR_PURPLE
+ MENUITEM "Zielonomodry" ID_COLOR_TEAL
+ MENUITEM "Szary" ID_COLOR_GRAY
+ MENUITEM "Srebrny" ID_COLOR_SILVER
+ MENUITEM "Czerwony" ID_COLOR_RED
+ MENUITEM "Limonowy" ID_COLOR_LIME
+ MENUITEM "ty" ID_COLOR_YELLOW
+ MENUITEM "Niebieski" ID_COLOR_BLUE
+ MENUITEM "Fuksja" ID_COLOR_FUCHSIA
+ MENUITEM "Akwamaryna" ID_COLOR_AQUA
+ MENUITEM "Biay" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Data i godzina"
@@ -222,6 +246,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Zoom in"
STRING_PREVIEW_ZOOMOUT, "Zoom out"
STRING_PREVIEW_CLOSE, "Zamknij"
+ STRING_PREVIEW_PAGE, "Page"
+ STRING_PREVIEW_PAGES, "Pages"
END
STRINGTABLE DISCARDABLE
diff --git a/base/applications/wordpad/Pt.rc b/base/applications/wordpad/Pt.rc
index 8b0114af22c..2a2ae4b749b 100644
--- a/base/applications/wordpad/Pt.rc
+++ b/base/applications/wordpad/Pt.rc
@@ -110,6 +110,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Preto" ID_COLOR_BLACK
+ MENUITEM "Castanho" ID_COLOR_MAROON
+ MENUITEM "Verde" ID_COLOR_GREEN
+ MENUITEM "Verde-oliva" ID_COLOR_OLIVE
+ MENUITEM "Azul-marinho" ID_COLOR_NAVY
+ MENUITEM "Roxo" ID_COLOR_PURPLE
+ MENUITEM "Azul-petróleo" ID_COLOR_TEAL
+ MENUITEM "Cinza" ID_COLOR_GRAY
+ MENUITEM "Prateado" ID_COLOR_SILVER
+ MENUITEM "Vermelho" ID_COLOR_RED
+ MENUITEM "Verde-limão" ID_COLOR_LIME
+ MENUITEM "Amarelo" ID_COLOR_YELLOW
+ MENUITEM "Azul" ID_COLOR_BLUE
+ MENUITEM "Fúcsia" ID_COLOR_FUCHSIA
+ MENUITEM "Azul-piscina" ID_COLOR_AQUA
+ MENUITEM "Branco" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Data e hora"
@@ -225,6 +249,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Zoom in"
STRING_PREVIEW_ZOOMOUT, "Zoom out"
STRING_PREVIEW_CLOSE, "Fechar"
+ STRING_PREVIEW_PAGE, "Page"
+ STRING_PREVIEW_PAGES, "Pages"
END
STRINGTABLE DISCARDABLE
@@ -250,4 +276,3 @@ 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/base/applications/wordpad/Ru.rc b/base/applications/wordpad/Ru.rc
index 70d9b96e743..230003b3c61 100644
--- a/base/applications/wordpad/Ru.rc
+++ b/base/applications/wordpad/Ru.rc
@@ -109,6 +109,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Чёрный" ID_COLOR_BLACK
+ MENUITEM "Тёмно-бордовый" ID_COLOR_MAROON
+ MENUITEM "Зелёный" ID_COLOR_GREEN
+ MENUITEM "Оливковый" ID_COLOR_OLIVE
+ MENUITEM "Тёмно-синий" ID_COLOR_NAVY
+ MENUITEM "Пурпурный" ID_COLOR_PURPLE
+ MENUITEM "Морской волны" ID_COLOR_TEAL
+ MENUITEM "Серый" ID_COLOR_GRAY
+ MENUITEM "Серебряный" ID_COLOR_SILVER
+ MENUITEM "Красный" ID_COLOR_RED
+ MENUITEM "Лимонный" ID_COLOR_LIME
+ MENUITEM "Жёлтый" ID_COLOR_YELLOW
+ MENUITEM "Синий" ID_COLOR_BLUE
+ MENUITEM "Ярко-розовый" ID_COLOR_FUCHSIA
+ MENUITEM "Голубой" ID_COLOR_AQUA
+ MENUITEM "Белый" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Дата и время"
@@ -221,9 +245,11 @@ BEGIN
STRING_PREVIEW_PREVPAGE, "Предыдущая страница"
STRING_PREVIEW_TWOPAGES, "Две страницы"
STRING_PREVIEW_ONEPAGE, "Одна страница"
- STRING_PREVIEW_ZOOMIN, "Zoom in"
- STRING_PREVIEW_ZOOMOUT, "Zoom out"
+ STRING_PREVIEW_ZOOMIN, "Приблизить"
+ STRING_PREVIEW_ZOOMOUT, "Отдалить"
STRING_PREVIEW_CLOSE, "Закрыть"
+ STRING_PREVIEW_PAGE, "Page"
+ STRING_PREVIEW_PAGES, "Pages"
END
STRINGTABLE DISCARDABLE
@@ -249,4 +275,3 @@ BEGIN
STRING_PRINTING_NOT_IMPLEMENTED, "Печать не поддерживается"
STRING_MAX_TAB_STOPS, "Нельзя добавить более 32 позиций табуляции."
END
-#pragma code_page(default)
diff --git a/base/applications/wordpad/Si.rc b/base/applications/wordpad/Si.rc
index dc0c8d08c0d..f7e0c722b46 100644
--- a/base/applications/wordpad/Si.rc
+++ b/base/applications/wordpad/Si.rc
@@ -108,6 +108,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Črna" ID_COLOR_BLACK
+ MENUITEM "Kostanjeva" ID_COLOR_MAROON
+ MENUITEM "Zelena" ID_COLOR_GREEN
+ MENUITEM "Olivna" ID_COLOR_OLIVE
+ MENUITEM "Mornariška" ID_COLOR_NAVY
+ MENUITEM "Vijolična" ID_COLOR_PURPLE
+ MENUITEM "Zelenomodra" ID_COLOR_TEAL
+ MENUITEM "Siva" ID_COLOR_GRAY
+ MENUITEM "Srebrna" ID_COLOR_SILVER
+ MENUITEM "Rdeča" ID_COLOR_RED
+ MENUITEM "Citronska" ID_COLOR_LIME
+ MENUITEM "Rumena" ID_COLOR_YELLOW
+ MENUITEM "Modra" ID_COLOR_BLUE
+ MENUITEM "Roza" ID_COLOR_FUCHSIA
+ MENUITEM "Akvamarin" ID_COLOR_AQUA
+ MENUITEM "Bela" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Datum in čas"
@@ -223,6 +247,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Zoom in"
STRING_PREVIEW_ZOOMOUT, "Zoom out"
STRING_PREVIEW_CLOSE, "Zapri"
+ STRING_PREVIEW_PAGE, "Page"
+ STRING_PREVIEW_PAGES, "Pages"
END
STRINGTABLE DISCARDABLE
@@ -249,4 +275,3 @@ 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/base/applications/wordpad/Sv.rc b/base/applications/wordpad/Sv.rc
index c954dc1a7a7..edc35a9b24a 100644
--- a/base/applications/wordpad/Sv.rc
+++ b/base/applications/wordpad/Sv.rc
@@ -108,6 +108,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Svart" ID_COLOR_BLACK
+ MENUITEM "Rödbrun" ID_COLOR_MAROON
+ MENUITEM "Grön" ID_COLOR_GREEN
+ MENUITEM "Oliv" ID_COLOR_OLIVE
+ MENUITEM "Navy" ID_COLOR_NAVY
+ MENUITEM "Lila" ID_COLOR_PURPLE
+ MENUITEM "Teal" ID_COLOR_TEAL
+ MENUITEM "Grå" ID_COLOR_GRAY
+ MENUITEM "Silver" ID_COLOR_SILVER
+ MENUITEM "Röd" ID_COLOR_RED
+ MENUITEM "Lime" ID_COLOR_LIME
+ MENUITEM "Gul" ID_COLOR_YELLOW
+ MENUITEM "Blå" ID_COLOR_BLUE
+ MENUITEM "Fuchsia" ID_COLOR_FUCHSIA
+ MENUITEM "Aqua" ID_COLOR_AQUA
+ MENUITEM "Vit" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Datum och tid"
@@ -223,6 +247,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Zooma in"
STRING_PREVIEW_ZOOMOUT, "Zooma ut"
STRING_PREVIEW_CLOSE, "Stäng"
+ STRING_PREVIEW_PAGE, "Sida"
+ STRING_PREVIEW_PAGES, "Sidor"
END
STRINGTABLE DISCARDABLE
@@ -248,4 +274,3 @@ 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/base/applications/wordpad/Tr.rc b/base/applications/wordpad/Tr.rc
index e8d9f982ffb..ef66aa40ad8 100644
--- a/base/applications/wordpad/Tr.rc
+++ b/base/applications/wordpad/Tr.rc
@@ -108,6 +108,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Siyah" ID_COLOR_BLACK
+ MENUITEM "Koyu Krmz" ID_COLOR_MAROON
+ MENUITEM "Yeil" ID_COLOR_GREEN
+ MENUITEM "Koyu Sar" ID_COLOR_OLIVE
+ MENUITEM "Koyu Mavi" ID_COLOR_NAVY
+ MENUITEM "Mor" ID_COLOR_PURPLE
+ MENUITEM "Deniz Mavisi" ID_COLOR_TEAL
+ MENUITEM "Gri" ID_COLOR_GRAY
+ MENUITEM "Gm" ID_COLOR_SILVER
+ MENUITEM "Krmz" ID_COLOR_RED
+ MENUITEM "Parlak Yeil" ID_COLOR_LIME
+ MENUITEM "Sar" ID_COLOR_YELLOW
+ MENUITEM "Mavi" ID_COLOR_BLUE
+ MENUITEM "Pembe" ID_COLOR_FUCHSIA
+ MENUITEM "Turkuaz" ID_COLOR_AQUA
+ MENUITEM "Beyaz" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Date and time"
@@ -223,6 +247,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Zoom in"
STRING_PREVIEW_ZOOMOUT, "Zoom out"
STRING_PREVIEW_CLOSE, "Close"
+ STRING_PREVIEW_PAGE, "Page"
+ STRING_PREVIEW_PAGES, "Pages"
END
STRINGTABLE DISCARDABLE
diff --git a/base/applications/wordpad/Uk.rc b/base/applications/wordpad/Uk.rc
index c71cbe1575c..35e35977e59 100644
--- a/base/applications/wordpad/Uk.rc
+++ b/base/applications/wordpad/Uk.rc
@@ -113,6 +113,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "×îðíèé" ID_COLOR_BLACK
+ MENUITEM "Áðóíàòíèé" ID_COLOR_MAROON
+ MENUITEM "Çåëåíèé" ID_COLOR_GREEN
+ MENUITEM "Îëèâêîâèé" ID_COLOR_OLIVE
+ MENUITEM "Ñèí³é" ID_COLOR_NAVY
+ MENUITEM "Ïóðïóðíèé" ID_COLOR_PURPLE
+ MENUITEM "Çåëåíî-ñèí³é" ID_COLOR_TEAL
+ MENUITEM "ѳðèé" ID_COLOR_GRAY
+ MENUITEM "Ñð³áíèé" ID_COLOR_SILVER
+ MENUITEM "×åðâîíèé" ID_COLOR_RED
+ MENUITEM "Ñàëàòîâèé" ID_COLOR_LIME
+ MENUITEM "Æîâòèé" ID_COLOR_YELLOW
+ MENUITEM "Ãîëóáèé" ID_COLOR_BLUE
+ MENUITEM "Ô³îëåòîâèé" ID_COLOR_FUCHSIA
+ MENUITEM "Àêâàìàðèí" ID_COLOR_AQUA
+ MENUITEM "Á³ëèé" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Дата та час"
@@ -220,6 +244,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Збільшити"
STRING_PREVIEW_ZOOMOUT, "Зменшити"
STRING_PREVIEW_CLOSE, "Закрити"
+ STRING_PREVIEW_PAGE, "Page"
+ STRING_PREVIEW_PAGES, "Pages"
STRING_UNITS_CM, "cm"
END
@@ -250,4 +276,3 @@ BEGIN
STRING_ALIGN_RIGHT, "По правому Краю"
STRING_ALIGN_CENTER, "По Центру"
END
-#pragma code_page(default)
diff --git a/base/applications/wordpad/Zh.rc b/base/applications/wordpad/Zh.rc
index 7fd7e120f3e..6adb30af43b 100644
--- a/base/applications/wordpad/Zh.rc
+++ b/base/applications/wordpad/Zh.rc
@@ -111,6 +111,30 @@ BEGIN
END
END
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Black", ID_COLOR_BLACK
+ MENUITEM "Maroon", ID_COLOR_MAROON
+ MENUITEM "Green", ID_COLOR_GREEN
+ MENUITEM "Olive" ID_COLOR_OLIVE
+ MENUITEM "Navy" ID_COLOR_NAVY
+ MENUITEM "Purple" ID_COLOR_PURPLE
+ MENUITEM "Teal" ID_COLOR_TEAL
+ MENUITEM "Gray" ID_COLOR_GRAY
+ MENUITEM "Silver" ID_COLOR_SILVER
+ MENUITEM "Red" ID_COLOR_RED
+ MENUITEM "Lime" ID_COLOR_LIME
+ MENUITEM "Yellow" ID_COLOR_YELLOW
+ MENUITEM "Blue" ID_COLOR_BLUE
+ MENUITEM "Fuchsia" ID_COLOR_FUCHSIA
+ MENUITEM "Aqua" ID_COLOR_AQUA
+ MENUITEM "White" ID_COLOR_WHITE
+ MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ END
+END
+
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "日期和时间"
@@ -226,6 +250,8 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Zoom in"
STRING_PREVIEW_ZOOMOUT, "Zoom out"
STRING_PREVIEW_CLOSE, "关闭"
+ STRING_PREVIEW_PAGE, "Page"
+ STRING_PREVIEW_PAGES, "Pages"
END
STRINGTABLE DISCARDABLE
@@ -473,4 +499,3 @@ BEGIN
STRING_OPEN_FAILED, "不能開啟檔案."
STRING_OPEN_ACCESS_DENIED, "你沒有開啟檔案的權力."
END
-#pragma code_page(default)
diff --git a/base/applications/wordpad/formatbar.bmp b/base/applications/wordpad/formatbar.bmp
index 9c643b11b97..310b596d92a 100644
Binary files a/base/applications/wordpad/formatbar.bmp and b/base/applications/wordpad/formatbar.bmp differ
diff --git a/base/applications/wordpad/print.c b/base/applications/wordpad/print.c
index 79b43a6f494..71c06273fdb 100644
--- a/base/applications/wordpad/print.c
+++ b/base/applications/wordpad/print.c
@@ -27,7 +27,10 @@
typedef struct _previewinfo
{
int page;
- int pages;
+ int pages_shown;
+ int saved_pages_shown;
+ int *pageEnds, pageCapacity;
+ int textlength;
HDC hdc;
HDC hdc2;
HDC hdcSized;
@@ -51,6 +54,7 @@ static previewinfo preview;
extern const WCHAR wszPreviewWndClass[];
static const WCHAR var_pagemargin[] = {'P','a','g','e','M','a','r','g','i','n',0};
+static const WCHAR var_previewpages[] = {'P','r','e','v','i','e','w','P','a','g','e','s',0};
static LPWSTR get_print_file_filter(HWND hMainWnd)
{
@@ -93,6 +97,28 @@ void registry_read_pagemargins(HKEY hKey)
}
}
+void registry_set_previewpages(HKEY hKey)
+{
+ RegSetValueExW(hKey, var_previewpages, 0, REG_DWORD,
+ (LPBYTE)&preview.pages_shown, sizeof(DWORD));
+}
+
+void registry_read_previewpages(HKEY hKey)
+{
+ DWORD size = sizeof(DWORD);
+ if(!hKey ||
+ RegQueryValueExW(hKey, var_previewpages, 0, NULL,
+ (LPBYTE)&preview.pages_shown, &size) != ERROR_SUCCESS ||
+ size != sizeof(DWORD))
+ {
+ preview.pages_shown = 1;
+ } else {
+ if (preview.pages_shown < 1) preview.pages_shown = 1;
+ else if (preview.pages_shown > 2) preview.pages_shown = 2;
+ }
+}
+
+
static void AddTextButton(HWND hRebarWnd, UINT string, UINT command, UINT id)
{
REBARBANDINFOW rb;
@@ -244,24 +270,6 @@ static LPWSTR dialog_print_to_file(HWND hMainWnd)
return FALSE;
}
-static int get_num_pages(HWND hEditorWnd, FORMATRANGE fr)
-{
- int page = 0;
- fr.chrg.cpMin = 0;
-
- do
- {
- int bottom = fr.rc.bottom;
- page++;
- fr.chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE,
- (LPARAM)&fr);
- fr.rc.bottom = bottom;
- }
- while(fr.chrg.cpMin && fr.chrg.cpMin < fr.chrg.cpMax);
-
- return page;
-}
-
static void char_from_pagenum(HWND hEditorWnd, FORMATRANGE *fr, int page)
{
int i;
@@ -295,413 +303,6 @@ static void update_ruler(HWND hRulerWnd)
redraw_ruler(hRulerWnd);
}
-static void print(LPPRINTDLGW pd, LPWSTR wszFileName)
-{
- FORMATRANGE fr;
- DOCINFOW di;
- HWND hEditorWnd = GetDlgItem(pd->hwndOwner, IDC_EDITOR);
- int printedPages = 0;
-
- fr.hdc = pd->hDC;
- fr.hdcTarget = pd->hDC;
-
- fr.rc = get_print_rect(fr.hdc);
- fr.rcPage.left = 0;
- fr.rcPage.right = fr.rc.right + margins.right;
- fr.rcPage.top = 0;
- fr.rcPage.bottom = fr.rc.bottom + margins.bottom;
-
- ZeroMemory(&di, sizeof(di));
- di.cbSize = sizeof(di);
- di.lpszDocName = wszFileName;
-
- if(pd->Flags & PD_PRINTTOFILE)
- {
- di.lpszOutput = dialog_print_to_file(pd->hwndOwner);
- if(!di.lpszOutput)
- return;
- }
-
- if(pd->Flags & PD_SELECTION)
- {
- SendMessageW(hEditorWnd, EM_EXGETSEL, 0, (LPARAM)&fr.chrg);
- } else
- {
- GETTEXTLENGTHEX gt;
- gt.flags = GTL_DEFAULT;
- gt.codepage = 1200;
- fr.chrg.cpMin = 0;
- fr.chrg.cpMax = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0);
-
- if(pd->Flags & PD_PAGENUMS)
- char_from_pagenum(hEditorWnd, &fr, pd->nToPage);
- }
-
- StartDocW(fr.hdc, &di);
- do
- {
- int bottom = fr.rc.bottom;
- if(StartPage(fr.hdc) <= 0)
- break;
-
- fr.chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)&fr);
-
- if(EndPage(fr.hdc) <= 0)
- break;
- bottom = fr.rc.bottom;
-
- printedPages++;
- if((pd->Flags & PD_PAGENUMS) && (printedPages > (pd->nToPage - pd->nFromPage)))
- break;
- }
- while(fr.chrg.cpMin && fr.chrg.cpMin < fr.chrg.cpMax);
-
- EndDoc(fr.hdc);
- SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, 0);
-}
-
-void dialog_printsetup(HWND hMainWnd)
-{
- PAGESETUPDLGW ps;
-
- ZeroMemory(&ps, sizeof(ps));
- ps.lStructSize = sizeof(ps);
- ps.hwndOwner = hMainWnd;
- ps.Flags = PSD_INHUNDREDTHSOFMILLIMETERS | PSD_MARGINS;
- ps.rtMargin.left = twips_to_centmm(margins.left);
- ps.rtMargin.right = twips_to_centmm(margins.right);
- ps.rtMargin.top = twips_to_centmm(margins.top);
- ps.rtMargin.bottom = twips_to_centmm(margins.bottom);
- ps.hDevMode = devMode;
- ps.hDevNames = devNames;
-
- if(PageSetupDlgW(&ps))
- {
- margins.left = centmm_to_twips(ps.rtMargin.left);
- margins.right = centmm_to_twips(ps.rtMargin.right);
- margins.top = centmm_to_twips(ps.rtMargin.top);
- margins.bottom = centmm_to_twips(ps.rtMargin.bottom);
- devMode = ps.hDevMode;
- devNames = ps.hDevNames;
- update_ruler(get_ruler_wnd(hMainWnd));
- }
-}
-
-void get_default_printer_opts(void)
-{
- PRINTDLGW pd;
- ZeroMemory(&pd, sizeof(pd));
-
- ZeroMemory(&pd, sizeof(pd));
- pd.lStructSize = sizeof(pd);
- pd.Flags = PD_RETURNDC | PD_RETURNDEFAULT;
- pd.hDevMode = devMode;
-
- PrintDlgW(&pd);
-
- devMode = pd.hDevMode;
- devNames = pd.hDevNames;
-}
-
-void print_quick(LPWSTR wszFileName)
-{
- PRINTDLGW pd;
-
- ZeroMemory(&pd, sizeof(pd));
- pd.hDC = make_dc();
-
- print(&pd, wszFileName);
-}
-
-void dialog_print(HWND hMainWnd, LPWSTR wszFileName)
-{
- PRINTDLGW pd;
- HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR);
- int from = 0;
- int to = 0;
-
- ZeroMemory(&pd, sizeof(pd));
- pd.lStructSize = sizeof(pd);
- pd.hwndOwner = hMainWnd;
- pd.Flags = PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE;
- pd.nMinPage = 1;
- pd.nMaxPage = -1;
- pd.hDevMode = devMode;
- pd.hDevNames = devNames;
-
- SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&from, (LPARAM)&to);
- if(from == to)
- pd.Flags |= PD_NOSELECTION;
-
- if(PrintDlgW(&pd))
- {
- devMode = pd.hDevMode;
- devNames = pd.hDevNames;
- print(&pd, wszFileName);
- update_ruler(get_ruler_wnd(hMainWnd));
- }
-}
-
-static void preview_bar_show(HWND hMainWnd, BOOL show)
-{
- HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR);
- int i;
-
- if(show)
- {
- REBARBANDINFOW rb;
- HWND hStatic;
-
- AddTextButton(hReBar, STRING_PREVIEW_PRINT, ID_PRINT, BANDID_PREVIEW_BTN1);
- AddTextButton(hReBar, STRING_PREVIEW_NEXTPAGE, ID_PREVIEW_NEXTPAGE, BANDID_PREVIEW_BTN2);
- AddTextButton(hReBar, STRING_PREVIEW_PREVPAGE, ID_PREVIEW_PREVPAGE, BANDID_PREVIEW_BTN3);
- AddTextButton(hReBar, STRING_PREVIEW_TWOPAGES, ID_PREVIEW_NUMPAGES, BANDID_PREVIEW_BTN4);
- AddTextButton(hReBar, STRING_PREVIEW_ZOOMIN, ID_PREVIEW_ZOOMIN, BANDID_PREVIEW_BTN5);
- AddTextButton(hReBar, STRING_PREVIEW_ZOOMOUT, ID_PREVIEW_ZOOMOUT, BANDID_PREVIEW_BTN6);
- AddTextButton(hReBar, STRING_PREVIEW_CLOSE, ID_FILE_EXIT, BANDID_PREVIEW_BTN7);
-
- hStatic = CreateWindowW(WC_STATICW, NULL,
- WS_VISIBLE | WS_CHILD, 0, 0, 0, 0,
- hReBar, NULL, NULL, NULL);
-
- rb.cbSize = REBARBANDINFOW_V6_SIZE;
- rb.fMask = RBBIM_SIZE | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_CHILD | RBBIM_IDEALSIZE | RBBIM_ID;
- rb.fStyle = RBBS_NOGRIPPER | RBBS_VARIABLEHEIGHT;
- rb.hwndChild = hStatic;
- rb.cyChild = rb.cyMinChild = 22;
- rb.cx = rb.cxMinChild = 90;
- rb.cxIdeal = 100;
- rb.wID = BANDID_PREVIEW_BUFFER;
-
- SendMessageW(hReBar, RB_INSERTBAND, -1, (LPARAM)&rb);
- } else
- {
- for(i = 0; i <= PREVIEW_BUTTONS; i++)
- SendMessageW(hReBar, RB_DELETEBAND, SendMessageW(hReBar, RB_IDTOINDEX, BANDID_PREVIEW_BTN1+i, 0), 0);
- }
-}
-
-static const int min_spacing = 10;
-
-static void update_preview_scrollbars(HWND hwndPreview, RECT *window)
-{
- SCROLLINFO sbi;
- sbi.cbSize = sizeof(sbi);
- sbi.fMask = SIF_PAGE|SIF_RANGE;
- sbi.nMin = 0;
- if (preview.zoomlevel == 0)
- {
- /* Hide scrollbars when zoomed out. */
- sbi.nMax = 0;
- sbi.nPage = window->right;
- SetScrollInfo(hwndPreview, SB_HORZ, &sbi, TRUE);
- sbi.nPage = window->bottom;
- SetScrollInfo(hwndPreview, SB_VERT, &sbi, TRUE);
- } else {
- if (!preview.hdc2)
- sbi.nMax = preview.bmScaledSize.cx + min_spacing * 2;
- else
- sbi.nMax = preview.bmScaledSize.cx * 2 + min_spacing * 3;
- sbi.nPage = window->right;
- SetScrollInfo(hwndPreview, SB_HORZ, &sbi, TRUE);
- /* Change in the horizontal scrollbar visibility affects the
- * client rect, so update the client rect. */
- GetClientRect(hwndPreview, window);
- sbi.nMax = preview.bmScaledSize.cy + min_spacing * 2;
- sbi.nPage = window->bottom;
- SetScrollInfo(hwndPreview, SB_VERT, &sbi, TRUE);
- }
-}
-
-static void update_preview_sizes(HWND hwndPreview, BOOL zoomLevelUpdated)
-{
- RECT window;
-
- GetClientRect(hwndPreview, &window);
-
- /* The zoom ratio isn't updated for partial zoom because of resizing the window. */
- if (zoomLevelUpdated || preview.zoomlevel != 1)
- {
- float ratio, ratioHeight, ratioWidth;
- if (preview.zoomlevel == 2)
- {
- ratio = 1.0;
- } else {
- ratioHeight = (window.bottom - min_spacing * 2) / (float)preview.bmSize.cy;
-
- if(preview.hdc2)
- ratioWidth = ((window.right - min_spacing * 3) / 2.0) / (float)preview.bmSize.cx;
- else
- ratioWidth = (window.right - min_spacing * 2) / (float)preview.bmSize.cx;
-
- if(ratioWidth > ratioHeight)
- ratio = ratioHeight;
- else
- ratio = ratioWidth;
-
- if (preview.zoomlevel == 1)
- ratio += (1.0 - ratio) / 2;
- }
- preview.zoomratio = ratio;
- }
-
- preview.bmScaledSize.cx = preview.bmSize.cx * preview.zoomratio;
- preview.bmScaledSize.cy = preview.bmSize.cy * preview.zoomratio;
-
- preview.spacing.cy = max(min_spacing, (window.bottom - preview.bmScaledSize.cy) / 2);
-
- if(!preview.hdc2)
- preview.spacing.cx = (window.right - preview.bmScaledSize.cx) / 2;
- else
- preview.spacing.cx = (window.right - preview.bmScaledSize.cx * 2) / 3;
- if (preview.spacing.cx < min_spacing)
- preview.spacing.cx = min_spacing;
-
- update_preview_scrollbars(hwndPreview, &window);
-}
-
-/* Update for zoom ratio changes with same page. */
-static void update_scaled_preview(HWND hMainWnd)
-{
- HWND hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW);
- preview.window.right = 0;
- InvalidateRect(hwndPreview, NULL, TRUE);
-}
-
-LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- switch(msg)
- {
- case WM_CREATE:
- {
- HWND hEditorWnd = GetDlgItem(GetParent(hWnd), IDC_EDITOR);
- FORMATRANGE fr;
- GETTEXTLENGTHEX gt = {GTL_DEFAULT, 1200};
- HDC hdc = GetDC(hWnd);
- HDC hdcTarget = make_dc();
-
- fr.rc = preview.rcPage = get_print_rect(hdcTarget);
- preview.rcPage.bottom += margins.bottom;
- preview.rcPage.right += margins.right;
- preview.rcPage.top = preview.rcPage.left = 0;
- fr.rcPage = preview.rcPage;
-
- preview.bmSize.cx = twips_to_pixels(preview.rcPage.right, GetDeviceCaps(hdc, LOGPIXELSX));
- preview.bmSize.cy = twips_to_pixels(preview.rcPage.bottom, GetDeviceCaps(hdc, LOGPIXELSY));
-
- fr.hdc = CreateCompatibleDC(hdc);
- fr.hdcTarget = hdcTarget;
- fr.chrg.cpMin = 0;
- fr.chrg.cpMax = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0);
- preview.pages = get_num_pages(hEditorWnd, fr);
- DeleteDC(fr.hdc);
-
- update_preview_sizes(hWnd, TRUE);
- break;
- }
-
- case WM_PAINT:
- return print_preview(hWnd);
-
- case WM_SIZE:
- {
- update_preview_sizes(hWnd, FALSE);
- update_scaled_preview(hWnd);
- break;
- }
-
- case WM_VSCROLL:
- case WM_HSCROLL:
- {
- SCROLLINFO si;
- RECT rc;
- int nBar = (msg == WM_VSCROLL) ? SB_VERT : SB_HORZ;
- int origPos;
-
- GetClientRect(hWnd, &rc);
- si.cbSize = sizeof(si);
- si.fMask = SIF_ALL;
- GetScrollInfo(hWnd, nBar, &si);
- origPos = si.nPos;
- switch(LOWORD(wParam))
- {
- case SB_TOP: /* == SB_LEFT */
- si.nPos = si.nMin;
- break;
- case SB_BOTTOM: /* == SB_RIGHT */
- si.nPos = si.nMax;
- break;
- case SB_LINEUP: /* == SB_LINELEFT */
- si.nPos -= si.nPage / 10;
- break;
- case SB_LINEDOWN: /* == SB_LINERIGHT */
- si.nPos += si.nPage / 10;
- break;
- case SB_PAGEUP: /* == SB_PAGELEFT */
- si.nPos -= si.nPage;
- break;
- case SB_PAGEDOWN: /* SB_PAGERIGHT */
- si.nPos += si.nPage;
- break;
- case SB_THUMBTRACK:
- si.nPos = si.nTrackPos;
- break;
- }
- si.fMask = SIF_POS;
- SetScrollInfo(hWnd, nBar, &si, TRUE);
- GetScrollInfo(hWnd, nBar, &si);
- if (si.nPos != origPos)
- {
- int amount = origPos - si.nPos;
- if (msg == WM_VSCROLL)
- ScrollWindow(hWnd, 0, amount, NULL, NULL);
- else
- ScrollWindow(hWnd, amount, 0, NULL, NULL);
- }
- return 0;
- }
-
- default:
- return DefWindowProcW(hWnd, msg, wParam, lParam);
- }
-
- return 0;
-}
-
-void init_preview(HWND hMainWnd, LPWSTR wszFileName)
-{
- HWND hwndPreview;
- HINSTANCE hInstance = GetModuleHandleW(0);
- preview.page = 1;
- preview.hdc = 0;
- preview.hdc2 = 0;
- preview.wszFileName = wszFileName;
- preview.zoomratio = 0;
- preview.zoomlevel = 0;
- preview_bar_show(hMainWnd, TRUE);
-
- hwndPreview = CreateWindowExW(0, wszPreviewWndClass, NULL,
- WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL,
- 0, 0, 200, 10, hMainWnd, (HMENU)IDC_PREVIEW, hInstance, NULL);
-}
-
-void close_preview(HWND hMainWnd)
-{
- HWND hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW);
- preview.window.right = 0;
- preview.window.bottom = 0;
- preview.page = 0;
- preview.pages = 0;
-
- preview_bar_show(hMainWnd, FALSE);
- DestroyWindow(hwndPreview);
-}
-
-BOOL preview_isactive(void)
-{
- return preview.page != 0;
-}
-
static void add_ruler_units(HDC hdcRuler, RECT* drawRect, BOOL NewMetrics, LONG EditLeftmost)
{
static HDC hdc;
@@ -841,25 +442,296 @@ LRESULT CALLBACK ruler_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
return 0;
}
-static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float ratio, int bmNewWidth, int bmNewHeight, int bmWidth, int bmHeight)
+static void print(LPPRINTDLGW pd, LPWSTR wszFileName)
+{
+ FORMATRANGE fr;
+ DOCINFOW di;
+ HWND hEditorWnd = GetDlgItem(pd->hwndOwner, IDC_EDITOR);
+ int printedPages = 0;
+
+ fr.hdc = pd->hDC;
+ fr.hdcTarget = pd->hDC;
+
+ fr.rc = get_print_rect(fr.hdc);
+ fr.rcPage.left = 0;
+ fr.rcPage.right = fr.rc.right + margins.right;
+ fr.rcPage.top = 0;
+ fr.rcPage.bottom = fr.rc.bottom + margins.bottom;
+
+ ZeroMemory(&di, sizeof(di));
+ di.cbSize = sizeof(di);
+ di.lpszDocName = wszFileName;
+
+ if(pd->Flags & PD_PRINTTOFILE)
+ {
+ di.lpszOutput = dialog_print_to_file(pd->hwndOwner);
+ if(!di.lpszOutput)
+ return;
+ }
+
+ if(pd->Flags & PD_SELECTION)
+ {
+ SendMessageW(hEditorWnd, EM_EXGETSEL, 0, (LPARAM)&fr.chrg);
+ } else
+ {
+ GETTEXTLENGTHEX gt;
+ gt.flags = GTL_DEFAULT;
+ gt.codepage = 1200;
+ fr.chrg.cpMin = 0;
+ fr.chrg.cpMax = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0);
+
+ if(pd->Flags & PD_PAGENUMS)
+ char_from_pagenum(hEditorWnd, &fr, pd->nToPage);
+ }
+
+ StartDocW(fr.hdc, &di);
+ do
+ {
+ int bottom = fr.rc.bottom;
+ if(StartPage(fr.hdc) <= 0)
+ break;
+
+ fr.chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)&fr);
+
+ if(EndPage(fr.hdc) <= 0)
+ break;
+ bottom = fr.rc.bottom;
+
+ printedPages++;
+ if((pd->Flags & PD_PAGENUMS) && (printedPages > (pd->nToPage - pd->nFromPage)))
+ break;
+ }
+ while(fr.chrg.cpMin && fr.chrg.cpMin < fr.chrg.cpMax);
+
+ EndDoc(fr.hdc);
+ SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, 0);
+}
+
+void dialog_printsetup(HWND hMainWnd)
+{
+ PAGESETUPDLGW ps;
+
+ ZeroMemory(&ps, sizeof(ps));
+ ps.lStructSize = sizeof(ps);
+ ps.hwndOwner = hMainWnd;
+ ps.Flags = PSD_INHUNDREDTHSOFMILLIMETERS | PSD_MARGINS;
+ ps.rtMargin.left = twips_to_centmm(margins.left);
+ ps.rtMargin.right = twips_to_centmm(margins.right);
+ ps.rtMargin.top = twips_to_centmm(margins.top);
+ ps.rtMargin.bottom = twips_to_centmm(margins.bottom);
+ ps.hDevMode = devMode;
+ ps.hDevNames = devNames;
+
+ if(PageSetupDlgW(&ps))
+ {
+ margins.left = centmm_to_twips(ps.rtMargin.left);
+ margins.right = centmm_to_twips(ps.rtMargin.right);
+ margins.top = centmm_to_twips(ps.rtMargin.top);
+ margins.bottom = centmm_to_twips(ps.rtMargin.bottom);
+ devMode = ps.hDevMode;
+ devNames = ps.hDevNames;
+ update_ruler(get_ruler_wnd(hMainWnd));
+ }
+}
+
+void get_default_printer_opts(void)
+{
+ PRINTDLGW pd;
+ ZeroMemory(&pd, sizeof(pd));
+
+ ZeroMemory(&pd, sizeof(pd));
+ pd.lStructSize = sizeof(pd);
+ pd.Flags = PD_RETURNDC | PD_RETURNDEFAULT;
+ pd.hDevMode = devMode;
+
+ PrintDlgW(&pd);
+
+ devMode = pd.hDevMode;
+ devNames = pd.hDevNames;
+}
+
+void print_quick(HWND hMainWnd, LPWSTR wszFileName)
+{
+ PRINTDLGW pd;
+
+ ZeroMemory(&pd, sizeof(pd));
+ pd.hwndOwner = hMainWnd;
+ pd.hDC = make_dc();
+
+ print(&pd, wszFileName);
+ DeleteDC(pd.hDC);
+}
+
+void dialog_print(HWND hMainWnd, LPWSTR wszFileName)
+{
+ PRINTDLGW pd;
+ HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR);
+ int from = 0;
+ int to = 0;
+
+ ZeroMemory(&pd, sizeof(pd));
+ pd.lStructSize = sizeof(pd);
+ pd.hwndOwner = hMainWnd;
+ pd.Flags = PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE;
+ pd.nMinPage = 1;
+ pd.nMaxPage = -1;
+ pd.hDevMode = devMode;
+ pd.hDevNames = devNames;
+
+ SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&from, (LPARAM)&to);
+ if(from == to)
+ pd.Flags |= PD_NOSELECTION;
+
+ if(PrintDlgW(&pd))
+ {
+ devMode = pd.hDevMode;
+ devNames = pd.hDevNames;
+ print(&pd, wszFileName);
+ update_ruler(get_ruler_wnd(hMainWnd));
+ }
+}
+
+static void preview_bar_show(HWND hMainWnd, BOOL show)
+{
+ HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR);
+ int i;
+
+ if(show)
+ {
+ REBARBANDINFOW rb;
+ HWND hStatic;
+ UINT num_pages_string = preview.pages_shown > 1 ? STRING_PREVIEW_ONEPAGE :
+ STRING_PREVIEW_TWOPAGES;
+
+ AddTextButton(hReBar, STRING_PREVIEW_PRINT, ID_PRINT, BANDID_PREVIEW_BTN1);
+ AddTextButton(hReBar, STRING_PREVIEW_NEXTPAGE, ID_PREVIEW_NEXTPAGE, BANDID_PREVIEW_BTN2);
+ AddTextButton(hReBar, STRING_PREVIEW_PREVPAGE, ID_PREVIEW_PREVPAGE, BANDID_PREVIEW_BTN3);
+ AddTextButton(hReBar, num_pages_string, ID_PREVIEW_NUMPAGES, BANDID_PREVIEW_BTN4);
+ AddTextButton(hReBar, STRING_PREVIEW_ZOOMIN, ID_PREVIEW_ZOOMIN, BANDID_PREVIEW_BTN5);
+ AddTextButton(hReBar, STRING_PREVIEW_ZOOMOUT, ID_PREVIEW_ZOOMOUT, BANDID_PREVIEW_BTN6);
+ AddTextButton(hReBar, STRING_PREVIEW_CLOSE, ID_FILE_EXIT, BANDID_PREVIEW_BTN7);
+
+ hStatic = CreateWindowW(WC_STATICW, NULL,
+ WS_VISIBLE | WS_CHILD, 0, 0, 0, 0,
+ hReBar, NULL, NULL, NULL);
+
+ rb.cbSize = REBARBANDINFOW_V6_SIZE;
+ rb.fMask = RBBIM_SIZE | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_CHILD | RBBIM_IDEALSIZE | RBBIM_ID;
+ rb.fStyle = RBBS_NOGRIPPER | RBBS_VARIABLEHEIGHT;
+ rb.hwndChild = hStatic;
+ rb.cyChild = rb.cyMinChild = 22;
+ rb.cx = rb.cxMinChild = 90;
+ rb.cxIdeal = 100;
+ rb.wID = BANDID_PREVIEW_BUFFER;
+
+ SendMessageW(hReBar, RB_INSERTBAND, -1, (LPARAM)&rb);
+ } else
+ {
+ for(i = 0; i <= PREVIEW_BUTTONS; i++)
+ SendMessageW(hReBar, RB_DELETEBAND, SendMessageW(hReBar, RB_IDTOINDEX, BANDID_PREVIEW_BTN1+i, 0), 0);
+ }
+}
+
+static const int min_spacing = 10;
+
+static void update_preview_scrollbars(HWND hwndPreview, RECT *window)
+{
+ SCROLLINFO sbi;
+ sbi.cbSize = sizeof(sbi);
+ sbi.fMask = SIF_PAGE|SIF_RANGE;
+ sbi.nMin = 0;
+ if (preview.zoomlevel == 0)
+ {
+ /* Hide scrollbars when zoomed out. */
+ sbi.nMax = 0;
+ sbi.nPage = window->right;
+ SetScrollInfo(hwndPreview, SB_HORZ, &sbi, TRUE);
+ sbi.nPage = window->bottom;
+ SetScrollInfo(hwndPreview, SB_VERT, &sbi, TRUE);
+ } else {
+ sbi.nMax = preview.bmScaledSize.cx * preview.pages_shown +
+ min_spacing * (preview.pages_shown + 1);
+ sbi.nPage = window->right;
+ SetScrollInfo(hwndPreview, SB_HORZ, &sbi, TRUE);
+ /* Change in the horizontal scrollbar visibility affects the
+ * client rect, so update the client rect. */
+ GetClientRect(hwndPreview, window);
+ sbi.nMax = preview.bmScaledSize.cy + min_spacing * 2;
+ sbi.nPage = window->bottom;
+ SetScrollInfo(hwndPreview, SB_VERT, &sbi, TRUE);
+ }
+}
+
+static void update_preview_sizes(HWND hwndPreview, BOOL zoomLevelUpdated)
+{
+ RECT window;
+
+ GetClientRect(hwndPreview, &window);
+
+ /* The zoom ratio isn't updated for partial zoom because of resizing the window. */
+ if (zoomLevelUpdated || preview.zoomlevel != 1)
+ {
+ float ratio, ratioHeight, ratioWidth;
+ if (preview.zoomlevel == 2)
+ {
+ ratio = 1.0;
+ } else {
+ ratioHeight = (window.bottom - min_spacing * 2) / (float)preview.bmSize.cy;
+
+ ratioWidth = (float)(window.right -
+ min_spacing * (preview.pages_shown + 1)) /
+ (preview.pages_shown * preview.bmSize.cx);
+
+ if(ratioWidth > ratioHeight)
+ ratio = ratioHeight;
+ else
+ ratio = ratioWidth;
+
+ if (preview.zoomlevel == 1)
+ ratio += (1.0 - ratio) / 2;
+ }
+ preview.zoomratio = ratio;
+ }
+
+ preview.bmScaledSize.cx = preview.bmSize.cx * preview.zoomratio;
+ preview.bmScaledSize.cy = preview.bmSize.cy * preview.zoomratio;
+
+ preview.spacing.cy = max(min_spacing, (window.bottom - preview.bmScaledSize.cy) / 2);
+
+ preview.spacing.cx = (window.right -
+ preview.bmScaledSize.cx * preview.pages_shown) /
+ (preview.pages_shown + 1);
+ if (preview.spacing.cx < min_spacing)
+ preview.spacing.cx = min_spacing;
+
+ update_preview_scrollbars(hwndPreview, &window);
+}
+
+static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float ratio, int bmNewWidth, int bmNewHeight, int bmWidth, int bmHeight, BOOL draw_margins)
{
HBITMAP hBitmapScaled = CreateCompatibleBitmap(hdc, bmNewWidth, bmNewHeight);
- HPEN hPen;
+ HBITMAP oldbm;
+ HPEN hPen, oldPen;
int TopMargin = (int)((float)twips_to_pixels(lpFr->rc.top, GetDeviceCaps(hdc, LOGPIXELSX)) * ratio);
int BottomMargin = (int)((float)twips_to_pixels(lpFr->rc.bottom, GetDeviceCaps(hdc, LOGPIXELSX)) * ratio);
int LeftMargin = (int)((float)twips_to_pixels(lpFr->rc.left, GetDeviceCaps(hdc, LOGPIXELSY)) * ratio);
int RightMargin = (int)((float)twips_to_pixels(lpFr->rc.right, GetDeviceCaps(hdc, LOGPIXELSY)) * ratio);
- if(*hdcSized)
- DeleteDC(*hdcSized);
- *hdcSized = CreateCompatibleDC(hdc);
- SelectObject(*hdcSized, hBitmapScaled);
+ if(*hdcSized) {
+ oldbm = SelectObject(*hdcSized, hBitmapScaled);
+ DeleteObject(oldbm);
+ } else {
+ *hdcSized = CreateCompatibleDC(hdc);
+ SelectObject(*hdcSized, hBitmapScaled);
+ }
StretchBlt(*hdcSized, 0, 0, bmNewWidth, bmNewHeight, hdc, 0, 0, bmWidth, bmHeight, SRCCOPY);
+ if (!draw_margins) return;
+
/* Draw margin lines */
hPen = CreatePen(PS_DOT, 1, RGB(0,0,0));
- SelectObject(*hdcSized, hPen);
+ oldPen = SelectObject(*hdcSized, hPen);
MoveToEx(*hdcSized, 0, TopMargin, NULL);
LineTo(*hdcSized, bmNewWidth, TopMargin);
@@ -871,18 +743,137 @@ static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float r
MoveToEx(*hdcSized, RightMargin, 0, NULL);
LineTo(*hdcSized, RightMargin, bmNewHeight);
+ SelectObject(*hdcSized, oldPen);
+ DeleteObject(hPen);
}
-static void draw_preview(HWND hEditorWnd, FORMATRANGE* lpFr, int bmWidth, int bmHeight, RECT* paper, int page)
+static BOOL is_last_preview_page(int page)
+{
+ return preview.pageEnds[page - 1] >= preview.textlength;
+}
+
+/* Update for zoom ratio changes with same page. */
+static void update_scaled_preview(HWND hMainWnd)
+{
+ FORMATRANGE fr;
+ HWND hwndPreview;
+
+ /* This may occur on WM_CREATE before update_preview is called
+ * because a WM_SIZE message is generated from updating the
+ * scrollbars. */
+ if (!preview.hdc) return;
+
+ hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW);
+ fr.hdcTarget = make_dc();
+ fr.rc = fr.rcPage = preview.rcPage;
+ fr.rc.left += margins.left;
+ fr.rc.top += margins.top;
+ fr.rc.bottom -= margins.bottom;
+ fr.rc.right -= margins.right;
+
+ draw_preview_page(preview.hdc, &preview.hdcSized, &fr, preview.zoomratio,
+ preview.bmScaledSize.cx, preview.bmScaledSize.cy,
+ preview.bmSize.cx, preview.bmSize.cy, TRUE);
+
+ if(preview.pages_shown > 1)
+ {
+ draw_preview_page(preview.hdc2, &preview.hdcSized2, &fr, preview.zoomratio,
+ preview.bmScaledSize.cx, preview.bmScaledSize.cy,
+ preview.bmSize.cx, preview.bmSize.cy,
+ !is_last_preview_page(preview.page));
+ }
+
+ InvalidateRect(hwndPreview, NULL, TRUE);
+ DeleteDC(fr.hdcTarget);
+}
+
+void init_preview(HWND hMainWnd, LPWSTR wszFileName)
+{
+ HWND hwndPreview;
+ HINSTANCE hInstance = GetModuleHandleW(0);
+ preview.page = 1;
+ preview.hdc = 0;
+ preview.hdc2 = 0;
+ preview.wszFileName = wszFileName;
+ preview.zoomratio = 0;
+ preview.zoomlevel = 0;
+ preview_bar_show(hMainWnd, TRUE);
+
+ hwndPreview = CreateWindowExW(0, wszPreviewWndClass, NULL,
+ WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL,
+ 0, 0, 200, 10, hMainWnd, (HMENU)IDC_PREVIEW, hInstance, NULL);
+}
+
+void close_preview(HWND hMainWnd)
+{
+ HWND hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW);
+ preview.window.right = 0;
+ preview.window.bottom = 0;
+ preview.page = 0;
+ HeapFree(GetProcessHeap(), 0, preview.pageEnds);
+ preview.pageEnds = NULL;
+ preview.pageCapacity = 0;
+ if (preview.zoomlevel > 0)
+ preview.pages_shown = preview.saved_pages_shown;
+ if(preview.hdc) {
+ HBITMAP oldbm = GetCurrentObject(preview.hdc, OBJ_BITMAP);
+ DeleteDC(preview.hdc);
+ DeleteObject(oldbm);
+ preview.hdc = NULL;
+ }
+ if(preview.hdc2) {
+ HBITMAP oldbm = GetCurrentObject(preview.hdc2, OBJ_BITMAP);
+ DeleteDC(preview.hdc2);
+ DeleteObject(oldbm);
+ preview.hdc2 = NULL;
+ }
+ if(preview.hdcSized) {
+ HBITMAP oldbm = GetCurrentObject(preview.hdcSized, OBJ_BITMAP);
+ DeleteDC(preview.hdcSized);
+ DeleteObject(oldbm);
+ preview.hdcSized = NULL;
+ }
+ if(preview.hdcSized2) {
+ HBITMAP oldbm = GetCurrentObject(preview.hdcSized2, OBJ_BITMAP);
+ DeleteDC(preview.hdcSized2);
+ DeleteObject(oldbm);
+ preview.hdcSized2 = NULL;
+ }
+
+ preview_bar_show(hMainWnd, FALSE);
+ DestroyWindow(hwndPreview);
+}
+
+BOOL preview_isactive(void)
+{
+ return preview.page != 0;
+}
+
+static void draw_preview(HWND hEditorWnd, FORMATRANGE* lpFr, RECT* paper, int page)
{
- HBITMAP hBitmapCapture = CreateCompatibleBitmap(lpFr->hdc, bmWidth, bmHeight);
int bottom;
- char_from_pagenum(hEditorWnd, lpFr, page);
- SelectObject(lpFr->hdc, hBitmapCapture);
+ if (!preview.pageEnds)
+ {
+ preview.pageCapacity = 32;
+ preview.pageEnds = HeapAlloc(GetProcessHeap(), 0,
+ sizeof(int) * preview.pageCapacity);
+ if (!preview.pageEnds) return;
+ } else if (page >= preview.pageCapacity) {
+ int *new_buffer;
+ new_buffer = HeapReAlloc(GetProcessHeap(), 0, preview.pageEnds,
+ sizeof(int) * preview.pageCapacity * 2);
+ if (!new_buffer) return;
+ preview.pageCapacity *= 2;
+ preview.pageEnds = new_buffer;
+ }
+
FillRect(lpFr->hdc, paper, GetStockObject(WHITE_BRUSH));
+ if (page > 1 && is_last_preview_page(page - 1)) return;
+ lpFr->chrg.cpMin = page <= 1 ? 0 : preview.pageEnds[page-2];
bottom = lpFr->rc.bottom;
- SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)lpFr);
+ preview.pageEnds[page-1] = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)lpFr);
+
/* EM_FORMATRANGE sets fr.rc.bottom to indicate the area printed in,
* but we want to keep the original for drawing margins */
lpFr->rc.bottom = bottom;
@@ -893,70 +884,26 @@ static void update_preview_buttons(HWND hMainWnd)
{
HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR);
EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_PREVPAGE), preview.page > 1);
- EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NEXTPAGE), preview.hdc2 ?
- (preview.page + 1) < preview.pages :
- preview.page < preview.pages);
- EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), preview.pages > 1 && preview.zoomlevel == 0);
+ EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NEXTPAGE),
+ !is_last_preview_page(preview.page) &&
+ !is_last_preview_page(preview.page + preview.pages_shown - 1));
+ EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES),
+ preview.pages_shown > 1 ||
+ (!is_last_preview_page(1) && preview.zoomlevel == 0));
EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_ZOOMIN), preview.zoomlevel < 2);
EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_ZOOMOUT), preview.zoomlevel > 0);
}
LRESULT print_preview(HWND hwndPreview)
{
- FORMATRANGE fr;
HDC hdc;
RECT window, background;
PAINTSTRUCT ps;
- HWND hMainWnd = GetParent(hwndPreview);
POINT scrollpos;
hdc = BeginPaint(hwndPreview, &ps);
GetClientRect(hwndPreview, &window);
- fr.hdcTarget = make_dc();
- fr.rc = fr.rcPage = preview.rcPage;
- fr.rc.left += margins.left;
- fr.rc.top += margins.top;
- fr.rc.bottom -= margins.bottom;
- fr.rc.right -= margins.right;
-
- if(!preview.hdc)
- {
- GETTEXTLENGTHEX gt;
- RECT paper;
- HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR);
-
- preview.hdc = CreateCompatibleDC(hdc);
-
- if(preview.hdc2)
- {
- if(preview.hdc2 != (HDC)-1)
- DeleteDC(preview.hdc2);
- preview.hdc2 = CreateCompatibleDC(hdc);
- }
-
- gt.flags = GTL_DEFAULT;
- gt.codepage = 1200;
- fr.chrg.cpMin = 0;
- fr.chrg.cpMax = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0);
-
- paper.left = 0;
- paper.right = preview.bmSize.cx;
- paper.top = 0;
- paper.bottom = preview.bmSize.cy;
-
- fr.hdc = preview.hdc;
- draw_preview(hEditorWnd, &fr, preview.bmSize.cx, preview.bmSize.cy, &paper, preview.page);
-
- if(preview.hdc2)
- {
- fr.hdc = preview.hdc2;
- draw_preview(hEditorWnd, &fr, preview.bmSize.cx, preview.bmSize.cy, &fr.rcPage, preview.page + 1);
- }
-
- update_preview_buttons(hMainWnd);
- }
-
FillRect(hdc, &window, GetStockObject(GRAY_BRUSH));
scrollpos.x = GetScrollPos(hwndPreview, SB_HORZ);
@@ -969,7 +916,7 @@ LRESULT print_preview(HWND hwndPreview)
FillRect(hdc, &background, GetStockObject(BLACK_BRUSH));
- if(preview.hdc2)
+ if(preview.pages_shown > 1)
{
background.left += preview.bmScaledSize.cx + preview.spacing.cx;
background.right += preview.bmScaledSize.cx + preview.spacing.cx;
@@ -977,32 +924,17 @@ LRESULT print_preview(HWND hwndPreview)
FillRect(hdc, &background, GetStockObject(BLACK_BRUSH));
}
- if(window.right != preview.window.right || window.bottom != preview.window.bottom)
- {
- draw_preview_page(preview.hdc, &preview.hdcSized, &fr, preview.zoomratio,
- preview.bmScaledSize.cx, preview.bmScaledSize.cy,
- preview.bmSize.cx, preview.bmSize.cy);
-
- if(preview.hdc2)
- {
- draw_preview_page(preview.hdc2, &preview.hdcSized2, &fr, preview.zoomratio,
- preview.bmScaledSize.cx, preview.bmScaledSize.cy,
- preview.bmSize.cx, preview.bmSize.cy);
- }
- }
-
BitBlt(hdc, preview.spacing.cx - scrollpos.x, preview.spacing.cy - scrollpos.y,
preview.bmScaledSize.cx, preview.bmScaledSize.cy,
preview.hdcSized, 0, 0, SRCCOPY);
- if(preview.hdc2)
+ if(preview.pages_shown > 1)
{
BitBlt(hdc, preview.spacing.cx * 2 + preview.bmScaledSize.cx - scrollpos.x,
preview.spacing.cy - scrollpos.y, preview.bmScaledSize.cx,
preview.bmScaledSize.cy, preview.hdcSized2, 0, 0, SRCCOPY);
}
- DeleteDC(fr.hdcTarget);
preview.window = window;
EndPaint(hwndPreview, &ps);
@@ -1010,13 +942,81 @@ LRESULT print_preview(HWND hwndPreview)
return 0;
}
+static void update_preview_statusbar(HWND hMainWnd)
+{
+ HWND hStatusbar = GetDlgItem(hMainWnd, IDC_STATUSBAR);
+ HINSTANCE hInst = GetModuleHandleW(0);
+ WCHAR *p;
+ WCHAR wstr[MAX_STRING_LEN];
+
+ p = wstr;
+ if (preview.pages_shown < 2 || is_last_preview_page(preview.page))
+ {
+ static const WCHAR fmt[] = {' ','%','d','\0'};
+ p += LoadStringW(hInst, STRING_PREVIEW_PAGE, wstr, MAX_STRING_LEN);
+ wsprintfW(p, fmt, preview.page);
+ } else {
+ static const WCHAR fmt[] = {' ','%','d','-','%','d','\0'};
+ p += LoadStringW(hInst, STRING_PREVIEW_PAGES, wstr, MAX_STRING_LEN);
+ wsprintfW(p, fmt, preview.page, preview.page + 1);
+ }
+ SetWindowTextW(hStatusbar, wstr);
+}
+
/* Update for page changes. */
static void update_preview(HWND hMainWnd)
{
- DeleteDC(preview.hdc);
- preview.hdc = 0;
+ RECT paper;
+ HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR);
+ HWND hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW);
+ HBITMAP hBitmapCapture;
+ FORMATRANGE fr;
+ HDC hdc = GetDC(hwndPreview);
+
+ fr.hdcTarget = make_dc();
+ fr.rc = fr.rcPage = preview.rcPage;
+ fr.rc.left += margins.left;
+ fr.rc.top += margins.top;
+ fr.rc.bottom -= margins.bottom;
+ fr.rc.right -= margins.right;
+
+ fr.chrg.cpMin = 0;
+ fr.chrg.cpMax = preview.textlength;
+
+ paper.left = 0;
+ paper.right = preview.bmSize.cx;
+ paper.top = 0;
+ paper.bottom = preview.bmSize.cy;
+
+ if (!preview.hdc) {
+ preview.hdc = CreateCompatibleDC(hdc);
+ hBitmapCapture = CreateCompatibleBitmap(hdc, preview.bmSize.cx, preview.bmSize.cy);
+ SelectObject(preview.hdc, hBitmapCapture);
+ }
+
+ fr.hdc = preview.hdc;
+ draw_preview(hEditorWnd, &fr, &paper, preview.page);
+
+ if(preview.pages_shown > 1)
+ {
+ if (!preview.hdc2)
+ {
+ preview.hdc2 = CreateCompatibleDC(hdc);
+ hBitmapCapture = CreateCompatibleBitmap(hdc,
+ preview.bmSize.cx,
+ preview.bmSize.cy);
+ SelectObject(preview.hdc2, hBitmapCapture);
+ }
+
+ fr.hdc = preview.hdc2;
+ draw_preview(hEditorWnd, &fr, &fr.rcPage, preview.page + 1);
+ }
+ DeleteDC(fr.hdcTarget);
+ ReleaseDC(hwndPreview, hdc);
update_scaled_preview(hMainWnd);
+ update_preview_buttons(hMainWnd);
+ update_preview_statusbar(hMainWnd);
}
static void toggle_num_pages(HWND hMainWnd)
@@ -1024,19 +1024,15 @@ static void toggle_num_pages(HWND hMainWnd)
HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR);
WCHAR name[MAX_STRING_LEN];
HINSTANCE hInst = GetModuleHandleW(0);
+ int nPreviewPages;
- if(preview.hdc2)
- {
- DeleteDC(preview.hdc2);
- preview.hdc2 = 0;
- } else
- {
- if(preview.page == preview.pages)
- preview.page--;
- preview.hdc2 = (HDC)-1;
- }
+ preview.pages_shown = preview.pages_shown > 1 ? 1 : 2;
- LoadStringW(hInst, preview.hdc2 ? STRING_PREVIEW_ONEPAGE : STRING_PREVIEW_TWOPAGES,
+ nPreviewPages = preview.zoomlevel > 0 ? preview.saved_pages_shown :
+ preview.pages_shown;
+
+ LoadStringW(hInst, nPreviewPages > 1 ? STRING_PREVIEW_ONEPAGE :
+ STRING_PREVIEW_TWOPAGES,
name, MAX_STRING_LEN);
SetWindowTextW(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), name);
@@ -1044,6 +1040,216 @@ static void toggle_num_pages(HWND hMainWnd)
update_preview(hMainWnd);
}
+/* Returns the page shown that the point is in (1 or 2) or 0 if the point
+ * isn't inside either page */
+int preview_page_hittest(POINT pt)
+{
+ RECT rc;
+ rc.left = preview.spacing.cx;
+ rc.right = rc.left + preview.bmScaledSize.cx;
+ rc.top = preview.spacing.cy;
+ rc.bottom = rc.top + preview.bmScaledSize.cy;
+ if (PtInRect(&rc, pt))
+ return 1;
+
+ if (preview.pages_shown <= 1)
+ return 0;
+
+ rc.left += preview.bmScaledSize.cx + preview.spacing.cx;
+ rc.right += preview.bmScaledSize.cx + preview.spacing.cx;
+ if (PtInRect(&rc, pt))
+ return is_last_preview_page(preview.page) ? 1 : 2;
+
+ return 0;
+}
+
+LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch(msg)
+ {
+ case WM_CREATE:
+ {
+ HWND hMainWnd = GetParent(hWnd);
+ HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR);
+ FORMATRANGE fr;
+ GETTEXTLENGTHEX gt = {GTL_DEFAULT, 1200};
+ HDC hdc = GetDC(hWnd);
+ HDC hdcTarget = make_dc();
+
+ fr.rc = preview.rcPage = get_print_rect(hdcTarget);
+ preview.rcPage.bottom += margins.bottom;
+ preview.rcPage.right += margins.right;
+ preview.rcPage.top = preview.rcPage.left = 0;
+ fr.rcPage = preview.rcPage;
+
+ preview.bmSize.cx = twips_to_pixels(preview.rcPage.right, GetDeviceCaps(hdc, LOGPIXELSX));
+ preview.bmSize.cy = twips_to_pixels(preview.rcPage.bottom, GetDeviceCaps(hdc, LOGPIXELSY));
+
+ preview.textlength = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0);
+
+ fr.hdc = CreateCompatibleDC(hdc);
+ fr.hdcTarget = hdcTarget;
+ fr.chrg.cpMin = 0;
+ fr.chrg.cpMax = preview.textlength;
+ DeleteDC(fr.hdc);
+ DeleteDC(hdcTarget);
+ ReleaseDC(hWnd, hdc);
+
+ update_preview_sizes(hWnd, TRUE);
+ update_preview(hMainWnd);
+ break;
+ }
+
+ case WM_PAINT:
+ return print_preview(hWnd);
+
+ case WM_SIZE:
+ {
+ update_preview_sizes(hWnd, FALSE);
+ update_scaled_preview(hWnd);
+ break;
+ }
+
+ case WM_VSCROLL:
+ case WM_HSCROLL:
+ {
+ SCROLLINFO si;
+ RECT rc;
+ int nBar = (msg == WM_VSCROLL) ? SB_VERT : SB_HORZ;
+ int origPos;
+
+ GetClientRect(hWnd, &rc);
+ si.cbSize = sizeof(si);
+ si.fMask = SIF_ALL;
+ GetScrollInfo(hWnd, nBar, &si);
+ origPos = si.nPos;
+ switch(LOWORD(wParam))
+ {
+ case SB_TOP: /* == SB_LEFT */
+ si.nPos = si.nMin;
+ break;
+ case SB_BOTTOM: /* == SB_RIGHT */
+ si.nPos = si.nMax;
+ break;
+ case SB_LINEUP: /* == SB_LINELEFT */
+ si.nPos -= si.nPage / 10;
+ break;
+ case SB_LINEDOWN: /* == SB_LINERIGHT */
+ si.nPos += si.nPage / 10;
+ break;
+ case SB_PAGEUP: /* == SB_PAGELEFT */
+ si.nPos -= si.nPage;
+ break;
+ case SB_PAGEDOWN: /* SB_PAGERIGHT */
+ si.nPos += si.nPage;
+ break;
+ case SB_THUMBTRACK:
+ si.nPos = si.nTrackPos;
+ break;
+ }
+ si.fMask = SIF_POS;
+ SetScrollInfo(hWnd, nBar, &si, TRUE);
+ GetScrollInfo(hWnd, nBar, &si);
+ if (si.nPos != origPos)
+ {
+ int amount = origPos - si.nPos;
+ if (msg == WM_VSCROLL)
+ ScrollWindow(hWnd, 0, amount, NULL, NULL);
+ else
+ ScrollWindow(hWnd, amount, 0, NULL, NULL);
+ }
+ return 0;
+ }
+
+ case WM_SETCURSOR:
+ {
+ POINT pt;
+ RECT rc;
+ int bHittest = FALSE;
+ DWORD messagePos = GetMessagePos();
+ pt.x = (short)LOWORD(messagePos);
+ pt.y = (short)HIWORD(messagePos);
+ ScreenToClient(hWnd, &pt);
+
+ GetClientRect(hWnd, &rc);
+ if (PtInRect(&rc, pt))
+ {
+ pt.x += GetScrollPos(hWnd, SB_HORZ);
+ pt.y += GetScrollPos(hWnd, SB_VERT);
+ bHittest = preview_page_hittest(pt);
+ }
+
+ if (bHittest)
+ SetCursor(LoadCursorW(GetModuleHandleW(0),
+ MAKEINTRESOURCEW(IDC_ZOOM)));
+ else
+ SetCursor(LoadCursorW(NULL, (WCHAR*)IDC_ARROW));
+
+ return TRUE;
+ }
+
+ case WM_LBUTTONDOWN:
+ {
+ int page;
+ POINT pt;
+ pt.x = (short)LOWORD(lParam) + GetScrollPos(hWnd, SB_HORZ);
+ pt.y = (short)HIWORD(lParam) + GetScrollPos(hWnd, SB_VERT);
+ if ((page = preview_page_hittest(pt)) > 0)
+ {
+ HWND hMainWnd = GetParent(hWnd);
+
+ /* Convert point from client coordinate to unzoomed page
+ * coordinate. */
+ pt.x -= preview.spacing.cx;
+ if (page > 1)
+ pt.x -= preview.bmScaledSize.cx + preview.spacing.cx;
+ pt.y -= preview.spacing.cy;
+ pt.x /= preview.zoomratio;
+ pt.y /= preview.zoomratio;
+
+ if (preview.zoomlevel == 0)
+ preview.saved_pages_shown = preview.pages_shown;
+ preview.zoomlevel = (preview.zoomlevel + 1) % 3;
+ preview.zoomratio = 0;
+ if (preview.zoomlevel == 0 && preview.saved_pages_shown > 1)
+ {
+ toggle_num_pages(hMainWnd);
+ } else if (preview.pages_shown > 1) {
+ if (page >= 2) preview.page++;
+ toggle_num_pages(hMainWnd);
+ } else {
+ update_preview_sizes(hWnd, TRUE);
+ update_scaled_preview(hMainWnd);
+ update_preview_buttons(hMainWnd);
+ }
+
+ if (preview.zoomlevel > 0) {
+ SCROLLINFO si;
+ /* Convert the coordinate back to client coordinate. */
+ pt.x *= preview.zoomratio;
+ pt.y *= preview.zoomratio;
+ pt.x += preview.spacing.cx;
+ pt.y += preview.spacing.cy;
+ /* Scroll to center view at that point on the page */
+ si.cbSize = sizeof(si);
+ si.fMask = SIF_PAGE;
+ GetScrollInfo(hWnd, SB_HORZ, &si);
+ pt.x -= si.nPage / 2;
+ SetScrollPos(hWnd, SB_HORZ, pt.x, TRUE);
+ GetScrollInfo(hWnd, SB_VERT, &si);
+ pt.y -= si.nPage / 2;
+ SetScrollPos(hWnd, SB_VERT, pt.y, TRUE);
+ }
+ }
+ }
+
+ default:
+ return DefWindowProcW(hWnd, msg, wParam, lParam);
+ }
+
+ return 0;
+}
+
LRESULT preview_command(HWND hWnd, WPARAM wParam)
{
switch(LOWORD(wParam))
@@ -1071,9 +1277,11 @@ LRESULT preview_command(HWND hWnd, WPARAM wParam)
case ID_PREVIEW_ZOOMIN:
if (preview.zoomlevel < 2)
{
+ if (preview.zoomlevel == 0)
+ preview.saved_pages_shown = preview.pages_shown;
preview.zoomlevel++;
preview.zoomratio = 0;
- if (preview.hdc2)
+ if (preview.pages_shown > 1)
{
/* Forced switch to one page when zooming in. */
toggle_num_pages(hWnd);
@@ -1092,9 +1300,13 @@ LRESULT preview_command(HWND hWnd, WPARAM wParam)
HWND hwndPreview = GetDlgItem(hWnd, IDC_PREVIEW);
preview.zoomlevel--;
preview.zoomratio = 0;
- update_preview_sizes(hwndPreview, TRUE);
- update_scaled_preview(hWnd);
- update_preview_buttons(hWnd);
+ if (preview.zoomlevel == 0 && preview.saved_pages_shown > 1) {
+ toggle_num_pages(hWnd);
+ } else {
+ update_preview_sizes(hwndPreview, TRUE);
+ update_scaled_preview(hWnd);
+ update_preview_buttons(hWnd);
+ }
}
break;
diff --git a/base/applications/wordpad/registry.c b/base/applications/wordpad/registry.c
index c7edc5b1e50..7311fb68232 100644
--- a/base/applications/wordpad/registry.c
+++ b/base/applications/wordpad/registry.c
@@ -27,6 +27,7 @@
static const WCHAR key_recentfiles[] = {'R','e','c','e','n','t',' ','f','i','l','e',
' ','l','i','s','t',0};
static const WCHAR key_options[] = {'O','p','t','i','o','n','s',0};
+static const WCHAR key_settings[] = {'S','e','t','t','i','n','g','s',0};
static const WCHAR key_rtf[] = {'R','T','F',0};
static const WCHAR key_text[] = {'T','e','x','t',0};
@@ -94,9 +95,14 @@ void registry_set_options(HWND hMainWnd)
RegSetValueExW(hKey, var_maximized, 0, REG_DWORD, (LPBYTE)&isMaximized, sizeof(DWORD));
registry_set_pagemargins(hKey);
+ RegCloseKey(hKey);
}
- RegCloseKey(hKey);
+ if(registry_get_handle(&hKey, &action, key_settings) == ERROR_SUCCESS)
+ {
+ registry_set_previewpages(hKey);
+ RegCloseKey(hKey);
+ }
}
void registry_read_winrect(RECT* rc)
@@ -339,6 +345,13 @@ void registry_read_options(void)
registry_read_pagemargins(hKey);
RegCloseKey(hKey);
}
+
+ if(registry_get_handle(&hKey, 0, key_settings) != ERROR_SUCCESS) {
+ registry_read_previewpages(NULL);
+ } else {
+ registry_read_previewpages(hKey);
+ RegCloseKey(hKey);
+ }
}
static void registry_read_formatopts(int index, LPCWSTR key, DWORD barState[], DWORD wordWrap[])
diff --git a/base/applications/wordpad/rsrc.rc b/base/applications/wordpad/rsrc.rc
index 4a699aa9c15..a3f66c55e5c 100644
--- a/base/applications/wordpad/rsrc.rc
+++ b/base/applications/wordpad/rsrc.rc
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2004 by Krzysztof Foltman
* Copyright 2007 by Alexander N. Sørnes
*
@@ -61,22 +61,28 @@ IDI_WRI ICON "wri.ico"
/* @makedep: txt.ico */
IDI_TXT ICON "txt.ico"
+/* @makedep: zoom.cur */
+IDC_ZOOM CURSOR "zoom.cur"
+
+
#include "Da.rc"
-#include "De.rc"
#include "En.rc"
-#include "Fr.rc"
#include "Hu.rc"
+#include "Ko.rc"
+#include "Nl.rc"
+#include "Pl.rc"
+#include "Tr.rc"
+
+/* UTF-8 */
+#include "De.rc"
+#include "Fr.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 "Ru.rc"
#include "Si.rc"
#include "Sv.rc"
-#include "Tr.rc"
#include "Uk.rc"
#include "Zh.rc"
diff --git a/base/applications/wordpad/wordpad.c b/base/applications/wordpad/wordpad.c
index 0bbe3604438..b9e6f3716a2 100644
--- a/base/applications/wordpad/wordpad.c
+++ b/base/applications/wordpad/wordpad.c
@@ -63,6 +63,7 @@ static HWND hMainWnd;
static HWND hEditorWnd;
static HWND hFindWnd;
static HMENU hPopupMenu;
+static HMENU hColorPopupMenu;
static UINT ID_FINDMSGSTRING;
@@ -1836,17 +1837,18 @@ static LRESULT OnCreate( HWND hWnd )
hFormatBarWnd = CreateToolbarEx(hReBarWnd,
CCS_NOPARENTALIGN | CCS_NOMOVEY | WS_VISIBLE | TBSTYLE_TOOLTIPS | TBSTYLE_BUTTON,
- IDC_FORMATBAR, 7, hInstance, IDB_FORMATBAR, NULL, 0, 16, 16, 16, 16, sizeof(TBBUTTON));
+ IDC_FORMATBAR, 8, hInstance, IDB_FORMATBAR, NULL, 0, 16, 16, 16, 16, sizeof(TBBUTTON));
AddButton(hFormatBarWnd, 0, ID_FORMAT_BOLD);
AddButton(hFormatBarWnd, 1, ID_FORMAT_ITALIC);
AddButton(hFormatBarWnd, 2, ID_FORMAT_UNDERLINE);
+ AddButton(hFormatBarWnd, 3, ID_FORMAT_COLOR);
AddSeparator(hFormatBarWnd);
- AddButton(hFormatBarWnd, 3, ID_ALIGN_LEFT);
- AddButton(hFormatBarWnd, 4, ID_ALIGN_CENTER);
- AddButton(hFormatBarWnd, 5, ID_ALIGN_RIGHT);
+ AddButton(hFormatBarWnd, 4, ID_ALIGN_LEFT);
+ AddButton(hFormatBarWnd, 5, ID_ALIGN_CENTER);
+ AddButton(hFormatBarWnd, 6, ID_ALIGN_RIGHT);
AddSeparator(hFormatBarWnd);
- AddButton(hFormatBarWnd, 6, ID_BULLET);
+ AddButton(hFormatBarWnd, 7, ID_BULLET);
SendMessageW(hFormatBarWnd, TB_AUTOSIZE, 0, 0);
@@ -2001,6 +2003,15 @@ static LRESULT OnNotify( HWND hWnd, LPARAM lParam)
return 0;
}
+/* Copied from dlls/comdlg32/fontdlg.c */
+static const COLORREF textcolors[]=
+{
+ 0x00000000L,0x00000080L,0x00008000L,0x00008080L,
+ 0x00800000L,0x00800080L,0x00808000L,0x00808080L,
+ 0x00c0c0c0L,0x000000ffL,0x0000ff00L,0x0000ffffL,
+ 0x00ff0000L,0x00ff00ffL,0x00ffff00L,0x00FFFFFFL
+};
+
static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam)
{
HWND hwndEditor = GetDlgItem(hWnd, IDC_EDITOR);
@@ -2098,7 +2109,7 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam)
break;
case ID_PRINT_QUICK:
- print_quick(wszFileName);
+ print_quick(hMainWnd, wszFileName);
target_device(hMainWnd, wordWrap[reg_formatindex(fileFormat)]);
break;
@@ -2106,7 +2117,7 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam)
{
int index = reg_formatindex(fileFormat);
DWORD tmp = barState[index];
- barState[index] = 0;
+ barState[index] = 1 << BANDID_STATUSBAR;
set_bar_states();
barState[index] = tmp;
ShowWindow(hEditorWnd, FALSE);
@@ -2152,6 +2163,46 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam)
break;
}
+ case ID_FORMAT_COLOR:
+ {
+ HWND hReBarWnd = GetDlgItem(hWnd, IDC_REBAR);
+ HWND hFormatBarWnd = GetDlgItem(hReBarWnd, IDC_FORMATBAR);
+ HMENU hPop;
+ RECT itemrc;
+ POINT pt;
+ int mid;
+ int itemidx = SendMessage(hFormatBarWnd, TB_COMMANDTOINDEX, ID_FORMAT_COLOR, 0);
+
+ SendMessage(hFormatBarWnd, TB_GETITEMRECT, itemidx, (LPARAM)&itemrc);
+ pt.x = itemrc.left;
+ pt.y = itemrc.bottom;
+ ClientToScreen(hFormatBarWnd, &pt);
+ hPop = GetSubMenu(hColorPopupMenu, 0);
+ mid = TrackPopupMenu(hPop, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON |
+ TPM_RETURNCMD | TPM_NONOTIFY,
+ pt.x, pt.y, 0, hWnd, 0);
+ if (mid >= ID_COLOR_FIRST && mid <= ID_COLOR_AUTOMATIC)
+ {
+ CHARFORMAT2W fmt;
+
+ ZeroMemory(&fmt, sizeof(fmt));
+ fmt.cbSize = sizeof(fmt);
+ SendMessageW(hwndEditor, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&fmt);
+
+ fmt.dwMask = CFM_COLOR;
+
+ if (mid < ID_COLOR_AUTOMATIC) {
+ fmt.crTextColor = textcolors[mid - ID_COLOR_FIRST];
+ fmt.dwEffects &= ~CFE_AUTOCOLOR;
+ } else {
+ fmt.dwEffects |= CFE_AUTOCOLOR;
+ }
+
+ SendMessageW(hwndEditor, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&fmt);
+ }
+ break;
+ }
+
case ID_EDIT_CUT:
PostMessageW(hwndEditor, WM_CUT, 0, 0);
break;
@@ -2618,6 +2669,7 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar
set_bar_states();
set_fileformat(SF_RTF);
hPopupMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDM_POPUP));
+ hColorPopupMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDM_COLOR_POPUP));
get_default_printer_opts();
target_device(hMainWnd, wordWrap[reg_formatindex(fileFormat)]);
diff --git a/base/applications/wordpad/wordpad.h b/base/applications/wordpad/wordpad.h
index 26aa41a1828..2f774c3aff0 100644
--- a/base/applications/wordpad/wordpad.h
+++ b/base/applications/wordpad/wordpad.h
@@ -80,6 +80,7 @@
#define ID_FORMAT_BOLD 1400
#define ID_FORMAT_ITALIC 1401
#define ID_FORMAT_UNDERLINE 1402
+#define ID_FORMAT_COLOR 1403
#define ID_TOGGLE_TOOLBAR 1500
#define ID_TOGGLE_FORMATBAR 1501
@@ -133,6 +134,25 @@
#define ID_ABOUT 1603
#define ID_VIEWPROPERTIES 1604
+#define ID_COLOR_FIRST 1800
+#define ID_COLOR_BLACK 1800
+#define ID_COLOR_MAROON 1801
+#define ID_COLOR_GREEN 1802
+#define ID_COLOR_OLIVE 1803
+#define ID_COLOR_NAVY 1804
+#define ID_COLOR_PURPLE 1805
+#define ID_COLOR_TEAL 1806
+#define ID_COLOR_GRAY 1807
+#define ID_COLOR_SILVER 1808
+#define ID_COLOR_RED 1809
+#define ID_COLOR_LIME 1810
+#define ID_COLOR_YELLOW 1811
+#define ID_COLOR_BLUE 1812
+#define ID_COLOR_FUCHSIA 1813
+#define ID_COLOR_AQUA 1814
+#define ID_COLOR_WHITE 1815
+#define ID_COLOR_AUTOMATIC 1816
+
#define IDC_STATUSBAR 2000
#define IDC_EDITOR 2001
#define IDC_TOOLBAR 2002
@@ -159,6 +179,7 @@
#define IDM_MAINMENU 2200
#define IDM_POPUP 2201
+#define IDM_COLOR_POPUP 2202
#define IDB_TOOLBAR 100
#define IDB_FORMATBAR 101
@@ -168,6 +189,8 @@
#define IDI_WRI 104
#define IDI_TXT 105
+#define IDC_ZOOM 106
+
#define STRING_ALL_FILES 1400
#define STRING_TEXT_FILES_TXT 1401
#define STRING_TEXT_FILES_UNICODE_TXT 1402
@@ -195,8 +218,10 @@
#define STRING_PREVIEW_ZOOMIN 1453
#define STRING_PREVIEW_ZOOMOUT 1454
#define STRING_PREVIEW_CLOSE 1455
+#define STRING_PREVIEW_PAGE 1456
+#define STRING_PREVIEW_PAGES 1457
-#define STRING_UNITS_CM 1456
+#define STRING_UNITS_CM 1458
#define STRING_DEFAULT_FILENAME 1700
#define STRING_PROMPT_SAVE_CHANGES 1701
@@ -217,7 +242,7 @@ LPWSTR file_basename(LPWSTR);
void dialog_printsetup(HWND);
void dialog_print(HWND, LPWSTR);
void target_device(HWND, DWORD);
-void print_quick(LPWSTR);
+void print_quick(HWND, LPWSTR);
LRESULT preview_command(HWND, WPARAM);
void init_preview(HWND, LPWSTR);
void close_preview(HWND);
@@ -226,6 +251,8 @@ LRESULT print_preview(HWND);
void get_default_printer_opts(void);
void registry_set_pagemargins(HKEY);
void registry_read_pagemargins(HKEY);
+void registry_set_previewpages(HKEY hKey);
+void registry_read_previewpages(HKEY hKey);
LRESULT CALLBACK ruler_proc(HWND, UINT, WPARAM, LPARAM);
void redraw_ruler(HWND);
diff --git a/base/applications/wordpad/zoom.cur b/base/applications/wordpad/zoom.cur
new file mode 100644
index 00000000000..26d1a8fa157
Binary files /dev/null and b/base/applications/wordpad/zoom.cur differ
diff --git a/base/applications/write/De.rc b/base/applications/write/De.rc
index 83cb909c318..db175a02d56 100644
--- a/base/applications/write/De.rc
+++ b/base/applications/write/De.rc
@@ -27,4 +27,3 @@ STRINGTABLE
{
IDS_FAILED, "Der Start von Wordpad ist fehlgeschlagen"
}
-#pragma code_page(default)
diff --git a/base/applications/write/Fr.rc b/base/applications/write/Fr.rc
index 69105d9a788..a81dffda827 100644
--- a/base/applications/write/Fr.rc
+++ b/base/applications/write/Fr.rc
@@ -28,4 +28,3 @@ STRINGTABLE
{
IDS_FAILED, "Wordpad n'a pas pu être démarré"
}
-#pragma code_page(default)
diff --git a/base/applications/write/It.rc b/base/applications/write/It.rc
index 9c8ce25a7c9..b906a7906b8 100644
--- a/base/applications/write/It.rc
+++ b/base/applications/write/It.rc
@@ -29,4 +29,3 @@ STRINGTABLE
{
IDS_FAILED, "Impossibile avviare WordPad"
}
-#pragma code_page(default)
diff --git a/base/applications/write/Ja.rc b/base/applications/write/Ja.rc
index 6b942ce02e0..5c9a8259a97 100644
--- a/base/applications/write/Ja.rc
+++ b/base/applications/write/Ja.rc
@@ -29,4 +29,3 @@ STRINGTABLE
{
IDS_FAILED, "Wordpad の起動に失敗しました"
}
-#pragma code_page(default)
diff --git a/base/applications/write/Lt.rc b/base/applications/write/Lt.rc
index 8e3eae38569..5cef934fbc7 100644
--- a/base/applications/write/Lt.rc
+++ b/base/applications/write/Lt.rc
@@ -29,4 +29,3 @@ STRINGTABLE
{
IDS_FAILED, "Nepavyko paleisti Wordpad"
}
-#pragma code_page(default)
diff --git a/base/applications/write/Ro.rc b/base/applications/write/Ro.rc
index a871350bfda..f6a7b65665f 100644
--- a/base/applications/write/Ro.rc
+++ b/base/applications/write/Ro.rc
@@ -27,4 +27,3 @@ STRINGTABLE
{
IDS_FAILED, "Execuția Wordpad a eșuat"
}
-#pragma code_page(default)
diff --git a/base/applications/write/Ru.rc b/base/applications/write/Ru.rc
index e64003fe566..008011f2720 100644
--- a/base/applications/write/Ru.rc
+++ b/base/applications/write/Ru.rc
@@ -29,4 +29,3 @@ STRINGTABLE
{
IDS_FAILED, "Не удалось запустить Wordpad"
}
-#pragma code_page(default)
diff --git a/base/applications/write/Si.rc b/base/applications/write/Si.rc
index 3eaae9ed5ee..9d3e5fe1520 100644
--- a/base/applications/write/Si.rc
+++ b/base/applications/write/Si.rc
@@ -28,4 +28,3 @@ STRINGTABLE
{
IDS_FAILED, "Zagon programa Wordpad ni uspel"
}
-#pragma code_page(default)
diff --git a/base/applications/write/Uk.rc b/base/applications/write/Uk.rc
index ac970be8bd7..f922210e0e3 100644
--- a/base/applications/write/Uk.rc
+++ b/base/applications/write/Uk.rc
@@ -31,4 +31,3 @@ STRINGTABLE
{
IDS_FAILED, "Не вдалось запустити Wordpad"
}
-#pragma code_page(default)
diff --git a/base/applications/write/rsrc.rc b/base/applications/write/rsrc.rc
index d3ddc33bdc7..45c5d308136 100644
--- a/base/applications/write/rsrc.rc
+++ b/base/applications/write/rsrc.rc
@@ -20,17 +20,21 @@
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
-#include "De.rc"
#include "En.rc"
+#include "Ko.rc"
+#include "Nl.rc"
+#include "No.rc"
+#include "Pl.rc"
+#include "Pt.rc"
+#include "Sv.rc"
+
+/* UTF-8 */
+#include "De.rc"
#include "Fr.rc"
#include "It.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"
#include "Uk.rc"
diff --git a/base/services/dhcp/dhclient.c b/base/services/dhcp/dhclient.c
index 8b18010735c..db263bc4ab5 100644
--- a/base/services/dhcp/dhclient.c
+++ b/base/services/dhcp/dhclient.c
@@ -57,6 +57,7 @@
#include
#include "dhcpd.h"
#include "privsep.h"
+#include "debug.h"
#define PERIOD 0x2e
#define hyphenchar(c) ((c) == 0x2d)
@@ -109,22 +110,106 @@ int check_arp( struct interface_info *ip, struct client_lease *lp )
time_t scripttime;
+
+static VOID CALLBACK ServiceMain(DWORD argc, LPWSTR *argv);
+static WCHAR ServiceName[] = L"DHCP";
+static SERVICE_TABLE_ENTRYW ServiceTable[] =
+{
+ {ServiceName, ServiceMain},
+ {NULL, NULL}
+};
+
+SERVICE_STATUS_HANDLE ServiceStatusHandle;
+SERVICE_STATUS ServiceStatus;
+
+
/* XXX Implement me */
int check_arp( struct interface_info *ip, struct client_lease *lp ) {
return 1;
}
-static VOID CALLBACK
-DispatchMain(DWORD argc, LPTSTR *argv)
+
+static VOID
+UpdateServiceStatus(DWORD dwState)
{
- dispatch();
+ ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+ ServiceStatus.dwCurrentState = dwState;
+
+ ServiceStatus.dwControlsAccepted = 0;
+
+ ServiceStatus.dwWin32ExitCode = 0;
+ ServiceStatus.dwServiceSpecificExitCode = 0;
+ ServiceStatus.dwCheckPoint = 0;
+
+ if (dwState == SERVICE_START_PENDING ||
+ dwState == SERVICE_STOP_PENDING ||
+ dwState == SERVICE_PAUSE_PENDING ||
+ dwState == SERVICE_CONTINUE_PENDING)
+ ServiceStatus.dwWaitHint = 10000;
+ else
+ ServiceStatus.dwWaitHint = 0;
+
+ SetServiceStatus(ServiceStatusHandle,
+ &ServiceStatus);
}
-static SERVICE_TABLE_ENTRY ServiceTable[2] =
+
+static DWORD WINAPI
+ServiceControlHandler(DWORD dwControl,
+ DWORD dwEventType,
+ LPVOID lpEventData,
+ LPVOID lpContext)
{
- {TEXT("DHCP"), DispatchMain},
- {NULL, NULL}
-};
+ switch (dwControl)
+ {
+ case SERVICE_CONTROL_STOP:
+ UpdateServiceStatus(SERVICE_STOP_PENDING);
+ UpdateServiceStatus(SERVICE_STOPPED);
+ return ERROR_SUCCESS;
+
+ case SERVICE_CONTROL_PAUSE:
+ UpdateServiceStatus(SERVICE_PAUSED);
+ return ERROR_SUCCESS;
+
+ case SERVICE_CONTROL_CONTINUE:
+ UpdateServiceStatus(SERVICE_START_PENDING);
+ UpdateServiceStatus(SERVICE_RUNNING);
+ return ERROR_SUCCESS;
+
+ case SERVICE_CONTROL_INTERROGATE:
+ SetServiceStatus(ServiceStatusHandle,
+ &ServiceStatus);
+ return ERROR_SUCCESS;
+
+ case SERVICE_CONTROL_SHUTDOWN:
+ UpdateServiceStatus(SERVICE_STOP_PENDING);
+ UpdateServiceStatus(SERVICE_STOPPED);
+ return ERROR_SUCCESS;
+
+ default :
+ return ERROR_CALL_NOT_IMPLEMENTED;
+ }
+}
+
+
+static VOID CALLBACK
+ServiceMain(DWORD argc, LPWSTR *argv)
+{
+ ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
+ ServiceControlHandler,
+ NULL);
+ if (!ServiceStatusHandle)
+ {
+ return;
+ }
+
+ UpdateServiceStatus(SERVICE_START_PENDING);
+
+ UpdateServiceStatus(SERVICE_RUNNING);
+
+ dispatch();
+}
+
int
main(int argc, char *argv[])
@@ -147,7 +232,7 @@ main(int argc, char *argv[])
DH_DbgPrint(MID_TRACE,("Going into dispatch()\n"));
- StartServiceCtrlDispatcher(ServiceTable);
+ StartServiceCtrlDispatcherW(ServiceTable);
/* not reached */
return (0);
diff --git a/base/services/umpnpmgr/umpnpmgr.c b/base/services/umpnpmgr/umpnpmgr.c
index 8dc8a16e031..2352efe703f 100644
--- a/base/services/umpnpmgr/umpnpmgr.c
+++ b/base/services/umpnpmgr/umpnpmgr.c
@@ -51,15 +51,17 @@
/* GLOBALS ******************************************************************/
-static VOID CALLBACK
-ServiceMain(DWORD argc, LPTSTR *argv);
-
-static SERVICE_TABLE_ENTRY ServiceTable[2] =
+static VOID CALLBACK ServiceMain(DWORD argc, LPWSTR *argv);
+static WCHAR ServiceName[] = L"PlugPlay";
+static SERVICE_TABLE_ENTRYW ServiceTable[] =
{
- {TEXT("PlugPlay"), ServiceMain},
+ {ServiceName, ServiceMain},
{NULL, NULL}
};
+static SERVICE_STATUS_HANDLE ServiceStatusHandle;
+static SERVICE_STATUS ServiceStatus;
+
static WCHAR szRootDeviceId[] = L"HTREE\\ROOT\\0";
static HKEY hEnumKey = NULL;
@@ -2446,6 +2448,72 @@ PnpEventThread(LPVOID lpParameter)
}
+static VOID
+UpdateServiceStatus(DWORD dwState)
+{
+ ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+ ServiceStatus.dwCurrentState = dwState;
+ ServiceStatus.dwControlsAccepted = 0;
+ ServiceStatus.dwWin32ExitCode = 0;
+ ServiceStatus.dwServiceSpecificExitCode = 0;
+ ServiceStatus.dwCheckPoint = 0;
+
+ if (dwState == SERVICE_START_PENDING ||
+ dwState == SERVICE_STOP_PENDING ||
+ dwState == SERVICE_PAUSE_PENDING ||
+ dwState == SERVICE_CONTINUE_PENDING)
+ ServiceStatus.dwWaitHint = 10000;
+ else
+ ServiceStatus.dwWaitHint = 0;
+
+ SetServiceStatus(ServiceStatusHandle,
+ &ServiceStatus);
+}
+
+
+static DWORD WINAPI
+ServiceControlHandler(DWORD dwControl,
+ DWORD dwEventType,
+ LPVOID lpEventData,
+ LPVOID lpContext)
+{
+ DPRINT1("ServiceControlHandler() called\n");
+
+ switch (dwControl)
+ {
+ case SERVICE_CONTROL_STOP:
+ DPRINT1(" SERVICE_CONTROL_STOP received\n");
+ UpdateServiceStatus(SERVICE_STOPPED);
+ return ERROR_SUCCESS;
+
+ case SERVICE_CONTROL_PAUSE:
+ DPRINT1(" SERVICE_CONTROL_PAUSE received\n");
+ UpdateServiceStatus(SERVICE_PAUSED);
+ return ERROR_SUCCESS;
+
+ case SERVICE_CONTROL_CONTINUE:
+ DPRINT1(" SERVICE_CONTROL_CONTINUE received\n");
+ UpdateServiceStatus(SERVICE_RUNNING);
+ return ERROR_SUCCESS;
+
+ case SERVICE_CONTROL_INTERROGATE:
+ DPRINT1(" SERVICE_CONTROL_INTERROGATE received\n");
+ SetServiceStatus(ServiceStatusHandle,
+ &ServiceStatus);
+ return ERROR_SUCCESS;
+
+ case SERVICE_CONTROL_SHUTDOWN:
+ DPRINT1(" SERVICE_CONTROL_SHUTDOWN received\n");
+ UpdateServiceStatus(SERVICE_STOPPED);
+ return ERROR_SUCCESS;
+
+ default :
+ DPRINT1(" Control %lu received\n");
+ return ERROR_CALL_NOT_IMPLEMENTED;
+ }
+}
+
+
static VOID CALLBACK
ServiceMain(DWORD argc, LPTSTR *argv)
{
@@ -2457,6 +2525,17 @@ ServiceMain(DWORD argc, LPTSTR *argv)
DPRINT("ServiceMain() called\n");
+ ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
+ ServiceControlHandler,
+ NULL);
+ if (!ServiceStatusHandle)
+ {
+ DPRINT1("RegisterServiceCtrlHandlerExW() failed! (Error %lu)\n", GetLastError());
+ return;
+ }
+
+ UpdateServiceStatus(SERVICE_START_PENDING);
+
hThread = CreateThread(NULL,
0,
PnpEventThread,
@@ -2484,6 +2563,8 @@ ServiceMain(DWORD argc, LPTSTR *argv)
if (hThread != NULL)
CloseHandle(hThread);
+ UpdateServiceStatus(SERVICE_RUNNING);
+
DPRINT("ServiceMain() done\n");
}
diff --git a/base/setup/reactos/lang/pl-PL.rc b/base/setup/reactos/lang/pl-PL.rc
index 97cff875b7d..31c951397cf 100644
--- a/base/setup/reactos/lang/pl-PL.rc
+++ b/base/setup/reactos/lang/pl-PL.rc
@@ -66,25 +66,25 @@ BEGIN
LISTBOX IDC_PARTITION, 20,12,278,142,LBS_HASSTRINGS | WS_VSCROLL
PUSHBUTTON "&Stwrz", IDC_PARTCREATE, 20,155,50,15
PUSHBUTTON "&Usu", IDC_PARTDELETE, 76,155,50,15
- PUSHBUTTON "D&river", IDC_DEVICEDRIVER, 162,155,50,15, WS_DISABLED
+ PUSHBUTTON "s&terownik", IDC_DEVICEDRIVER, 162,155,50,15, WS_DISABLED
PUSHBUTTON "&Opcje zaawansowane...", IDC_PARTMOREOPTS, 218,155,80,15
LTEXT "Nacinij Dalej aby rozpocz proces instalacji.", IDC_STATIC, 10, 180 ,277, 20
END
IDD_PARTITION DIALOGEX DISCARDABLE 0, 0, 145, 90
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
-CAPTION "Create Partition"
+CAPTION "Stwrz partycj"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "",IDC_UPDOWN1,"msctls_updown32", WS_VISIBLE,104,22,9,13
- CONTROL "Create and format partition",IDC_STATIC,"Button",BS_GROUPBOX,7,5,129,57
- LTEXT "Size:",IDC_STATIC, 13,24,27,9
+ CONTROL "Stwrz i sformatuj partycj",IDC_STATIC,"Button",BS_GROUPBOX,7,5,129,57
+ LTEXT "Rozmiar:",IDC_STATIC, 13,24,27,9
EDITTEXT IDC_PARTSIZE,52,23,53,13, WS_VISIBLE|WS_TABSTOP
LTEXT "GB",IDC_UNIT, 117,24,14,9
- LTEXT "Filesystem:",IDC_STATIC,13,46,35,9
+ LTEXT "System plikw:",IDC_STATIC,13,46,35,9
CONTROL "",IDC_FSTYPE,"ComboBox",WS_VISIBLE|WS_TABSTOP|CBS_DROPDOWNLIST,52,42,79,50
PUSHBUTTON "&OK",IDOK,35,68,47,15, WS_VISIBLE|WS_TABSTOP
- PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
+ PUSHBUTTON "&Anuluj",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
@@ -105,11 +105,11 @@ END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "ReactOS Setup"
+CAPTION "Instalator ReactOS"
FONT 8, "MS Shell Dlg"
BEGIN
- CONTROL "Installation summary", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172
- LTEXT "Click Next to start the installation process.", IDC_STATIC, 10, 180 ,277, 20
+ CONTROL "Podsumowanie instalacji", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172
+ LTEXT "Kliknij Dalej aby rozpocz proces instalacji.", IDC_STATIC, 10, 180 ,277, 20
END
IDD_PROCESSPAGE DIALOGEX 0, 0, 317, 193
@@ -151,8 +151,8 @@ BEGIN
IDS_PROCESSSUBTITLE "Przygotuj i sformatuj partycj, skopiuj pliki, skopiuj i zainstaluj bootloader"
IDS_RESTARTTITLE "Pierwszy etap instalacji zakoczony sukcesem"
IDS_RESTARTSUBTITLE "Pierwszy etap instalacji zosta zakoczony, uruchom ponownie komputer aby przej do drugiego etapu"
- IDS_SUMMARYTITLE "Installation Summary"
- IDS_SUMMARYSUBTITLE "List installation properties to check before apply to the installation device"
+ IDS_SUMMARYTITLE "Podsumowanie instalacji"
+ IDS_SUMMARYSUBTITLE "Sprawd ustawienia instalacji przed dokonaniem zmian na dysku"
IDS_ABORTSETUP "Instalacja ReactOS nie zostaa ukoczona na tym komputerze. Jeli teraz zakoczysz instalacj, bdziesz musia uruchomi Instalator ponownie, aby zainstalowa Reactos. Na pewno zakoczy?"
IDS_ABORTSETUP2 "Przerwa instalacj?"
END
diff --git a/base/shell/cmd/lang/pl-PL.rc b/base/shell/cmd/lang/pl-PL.rc
index 58bdadfc262..f8d2cb79a02 100644
--- a/base/shell/cmd/lang/pl-PL.rc
+++ b/base/shell/cmd/lang/pl-PL.rc
@@ -8,13 +8,13 @@ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
BEGIN
-STRING_ASSOC_HELP, "Modify file extension associations.\n\n\
-assoc [.ext[=[FileType]]]\n\
+STRING_ASSOC_HELP, "Modyfikuje skojarzenia rozszerze plikw.\n\n\
+assoc [.ext[=[typPliku]]]\n\
\n\
-assoc (print all associations)\n\
-assoc .ext (print specific association)\n\
-assoc .ext= (remove specific association)\n\
-assoc .ext=FileType (add new association)\n"
+assoc (wywietla wszystkie skojarzenia)\n\
+assoc .ext (wywietla okrelone skojarzenie)\n\
+assoc .ext= (usuwa okrelone skojarzenie)\n\
+assoc .ext=typPliku (dodaje nowe skojarzenie)\n"
STRING_ATTRIB_HELP, "Wywietla lub zmienia atrybuty plikw.\n\n\
ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] nazwa_pliku ...\n\
@@ -298,12 +298,12 @@ STRING_LOCALE_HELP1, "Czas bie
STRING_MKDIR_HELP, "Tworzy katalog.\n\n\
MKDIR [napd:]cieka\nMD [napd:]cieka"
-STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
-MKLINK [/D | /H | /J] linkname target\n\n\
- /D Indicates that the symbolic link target is a directory.\n\
- /H Create a hard link.\n\
- /J Create a directory junction.\n\n\
-If neither /H or /J is specified, a symbolic link is created."
+STRING_MKLINK_HELP, "Tworzy dowizanie obiektu w systemie plikw.\n\n\
+MKLINK [/D | /H | /J] nazwa_linku element_docelowy\n\n\
+ /D Oznacza, e dowizanie symboliczne elementu docelowego jest katalogiem.\n\
+ /H Tworzy dowizanie twarde.\n\
+ /J Tworzy punkt poczenia katalogw.\n\n\
+Jeli nie zostay uyte zarwno /H jak i /J, zostanie utworzone dowizanie symboliczne."
STRING_MEMMORY_HELP1, "Wywietla ilo pamici systemowej.\n\nMEMORY"
@@ -546,7 +546,7 @@ IF Przetwarzanie warunkowe w programach wsadowych.\n\
LABEL Tworzy, zmienia lub kasuje etykiet woluminu w danym napdzie.\n\
MD Tworzy katalog.\n\
MKDIR Tworzy katalog.\n\
-MKLINK Creates a filesystem link object.\n\
+MKLINK Tworzy dowizanie obiektu w systemie plikw.\n\
MOVE Przenosi jeden lub wicej plikw z jednego katalogu do drugiego.\n\
PATH Wywietla lub ustawia cieki dostpu dla programw.\n\
PAUSE Zawiesza przetwarzanie programu wsadowego i wywietla komunikat.\n\
@@ -656,11 +656,11 @@ STRING_FOR_ERROR, "z
STRING_SCREEN_COL, "nieprawidowy numer kolumny"
STRING_SCREEN_ROW, "nieprawidowy numer rzdu"
STRING_TIMER_TIME "Stoper %d czas - %s: "
-STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n"
-STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n"
-STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n"
-STRING_MORE, "More? "
-STRING_CANCEL_BATCH_FILE, "\r\nCtrl-Break pressed. Cancel batch file? (Tak/Nie/Zawsze) "
+STRING_MKLINK_CREATED_SYMBOLIC, "Dowizanie symboliczne utworzone dla %s <<===>> %s\n"
+STRING_MKLINK_CREATED_HARD, "Dowizanie twarde utworzone dla %s <<===>> %s\n"
+STRING_MKLINK_CREATED_JUNCTION, "Punkt dowizania katalogw utworzony dla %s <<===>> %s\n"
+STRING_MORE, "Wicej? "
+STRING_CANCEL_BATCH_FILE, "\r\nWcinito Ctrl-Break. Anulowa wykonanie pliku wsadowego? (Tak/Nie/Zawsze) "
STRING_INVALID_OPERAND, "Nieprawidowy argument operatora."
STRING_EXPECTED_CLOSE_PAREN, "Oczekiwano ')'."
diff --git a/base/shell/cmd/precomp.h b/base/shell/cmd/precomp.h
index f36368e1d59..915246cceb8 100644
--- a/base/shell/cmd/precomp.h
+++ b/base/shell/cmd/precomp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef __CMD_PRECOMP_H
+#define __CMD_PRECOMP_H
#ifdef _MSC_VER
#pragma warning ( disable : 4103 ) /* use #pragma pack to change alignment */
@@ -42,3 +43,5 @@ WINE_DEFAULT_DEBUG_CHANNEL(cmd);
#else
#define debugstr_aw debugstr_a
#endif
+
+#endif /* __CMD_PRECOMP_H */
diff --git a/base/system/msiexec/msiexec.c b/base/system/msiexec/msiexec.c
index 9221fa2a9ce..fe19d98e434 100644
--- a/base/system/msiexec/msiexec.c
+++ b/base/system/msiexec/msiexec.c
@@ -47,6 +47,7 @@ static const char UsageStr[] =
" Install a product:\n"
" msiexec {package|productcode} [property]\n"
" msiexec /i {package|productcode} [property]\n"
+" msiexec /package {package|productcode} [property]\n"
" msiexec /a package [property]\n"
" Repair an installation:\n"
" msiexec /f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n"
@@ -562,12 +563,13 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
{
FunctionUnregServer = TRUE;
}
- else if(msi_option_prefix(argvW[i], "i"))
+ else if(msi_option_prefix(argvW[i], "i") || msi_option_prefix(argvW[i], "package"))
{
LPWSTR argvWi = argvW[i];
+ int argLen = (msi_option_prefix(argvW[i], "i") ? 2 : 8);
FunctionInstall = TRUE;
- if(lstrlenW(argvWi) > 2)
- argvWi += 2;
+ if(lstrlenW(argvW[i]) > argLen)
+ argvWi += argLen;
else
{
i++;
diff --git a/base/system/msiexec/msiexec.rbuild b/base/system/msiexec/msiexec.rbuild
index a3a24950930..228875d72c7 100644
--- a/base/system/msiexec/msiexec.rbuild
+++ b/base/system/msiexec/msiexec.rbuild
@@ -12,7 +12,6 @@
ole32
msi
msiexec.c
- rsrc.rc
service.c
- version.rc
+ rsrc.rc
diff --git a/base/system/msiexec/rsrc.rc b/base/system/msiexec/rsrc.rc
index 01e43befe19..cfc89370039 100644
--- a/base/system/msiexec/rsrc.rc
+++ b/base/system/msiexec/rsrc.rc
@@ -18,7 +18,16 @@
#include
-#include "version.rc"
+#define WINE_FILEDESCRIPTION_STR "Wine Installer"
+#define WINE_FILENAME_STR "msiexec.exe"
+#define WINE_FILETYPE VFT_APP
+#define WINE_FILEVERSION 3,1,4000,1823
+#define WINE_FILEVERSION_STR "3.1.4000.1823"
+#define WINE_PRODUCTVERSION 3,1,4000,1823
+#define WINE_PRODUCTVERSION_STR "3.1.4000.1823"
+#define WINE_PRODUCTNAME_STR "Wine Installer"
+
+#include "wine/wine_common_ver.rc"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
diff --git a/base/system/services/database.c b/base/system/services/database.c
index 2a0ae9859f9..7a9819e4c8b 100644
--- a/base/system/services/database.c
+++ b/base/system/services/database.c
@@ -121,37 +121,6 @@ ScmGetServiceEntryByResumeCount(DWORD dwResumeCount)
}
-PSERVICE
-ScmGetServiceEntryByClientHandle(HANDLE Handle)
-{
- PLIST_ENTRY ServiceEntry;
- PSERVICE CurrentService;
-
- DPRINT("ScmGetServiceEntryByClientHandle() called\n");
- DPRINT("looking for %p\n", Handle);
-
- ServiceEntry = ServiceListHead.Flink;
- while (ServiceEntry != &ServiceListHead)
- {
- CurrentService = CONTAINING_RECORD(ServiceEntry,
- SERVICE,
- ServiceListEntry);
-
- if (CurrentService->hClient == Handle)
- {
- DPRINT("Found service: '%S'\n", CurrentService->lpDisplayName);
- return CurrentService;
- }
-
- ServiceEntry = ServiceEntry->Flink;
- }
-
- DPRINT("Couldn't find a matching service\n");
-
- return NULL;
-}
-
-
DWORD
ScmCreateNewServiceRecord(LPCWSTR lpServiceName,
PSERVICE *lpServiceRecord)
@@ -710,12 +679,15 @@ ScmGetBootAndSystemDriverState(VOID)
DWORD
ScmControlService(PSERVICE Service,
- DWORD dwControl,
- LPSERVICE_STATUS lpServiceStatus)
+ DWORD dwControl)
{
PSCM_CONTROL_PACKET ControlPacket;
- DWORD Count;
+ SCM_REPLY_PACKET ReplyPacket;
+
+ DWORD dwWriteCount = 0;
+ DWORD dwReadCount = 0;
DWORD TotalLength;
+ DWORD dwError = ERROR_SUCCESS;
DPRINT("ScmControlService() called\n");
@@ -728,31 +700,37 @@ ScmControlService(PSERVICE Service,
return ERROR_NOT_ENOUGH_MEMORY;
ControlPacket->dwControl = dwControl;
- ControlPacket->hClient = Service->hClient;
ControlPacket->dwSize = TotalLength;
+ ControlPacket->hServiceStatus = (SERVICE_STATUS_HANDLE)Service;
wcscpy(&ControlPacket->szArguments[0], Service->lpServiceName);
/* Send the control packet */
WriteFile(Service->ControlPipeHandle,
ControlPacket,
sizeof(SCM_CONTROL_PACKET) + (TotalLength * sizeof(WCHAR)),
- &Count,
+ &dwWriteCount,
NULL);
- /* FIXME: Read the reply */
+ /* Read the reply */
+ ReadFile(Service->ControlPipeHandle,
+ &ReplyPacket,
+ sizeof(SCM_REPLY_PACKET),
+ &dwReadCount,
+ NULL);
/* Release the contol packet */
HeapFree(GetProcessHeap(),
0,
ControlPacket);
- RtlCopyMemory(lpServiceStatus,
- &Service->Status,
- sizeof(SERVICE_STATUS));
+ if (dwReadCount == sizeof(SCM_REPLY_PACKET))
+ {
+ dwError = ReplyPacket.dwError;
+ }
- DPRINT("ScmControlService) done\n");
+ DPRINT("ScmControlService() done\n");
- return ERROR_SUCCESS;
+ return dwError;
}
@@ -762,11 +740,15 @@ ScmSendStartCommand(PSERVICE Service,
LPWSTR *argv)
{
PSCM_CONTROL_PACKET ControlPacket;
+ SCM_REPLY_PACKET ReplyPacket;
DWORD TotalLength;
DWORD ArgsLength = 0;
DWORD Length;
PWSTR Ptr;
- DWORD Count;
+ DWORD dwWriteCount = 0;
+ DWORD dwReadCount = 0;
+ DWORD dwError = ERROR_SUCCESS;
+ DWORD i;
DPRINT("ScmSendStartCommand() called\n");
@@ -774,10 +756,10 @@ ScmSendStartCommand(PSERVICE Service,
TotalLength = wcslen(Service->lpServiceName) + 1;
if (argc > 0)
{
- for (Count = 0; Count < argc; Count++)
+ for (i = 0; i < argc; i++)
{
- DPRINT("Arg: %S\n", argv[Count]);
- Length = wcslen(argv[Count]) + 1;
+ DPRINT("Arg: %S\n", argv[i]);
+ Length = wcslen(argv[i]) + 1;
TotalLength += Length;
ArgsLength += Length;
}
@@ -793,7 +775,7 @@ ScmSendStartCommand(PSERVICE Service,
return ERROR_NOT_ENOUGH_MEMORY;
ControlPacket->dwControl = SERVICE_CONTROL_START;
- ControlPacket->hClient = Service->hClient;
+ ControlPacket->hServiceStatus = (SERVICE_STATUS_HANDLE)Service;
ControlPacket->dwSize = TotalLength;
Ptr = &ControlPacket->szArguments[0];
wcscpy(Ptr, Service->lpServiceName);
@@ -817,19 +799,29 @@ ScmSendStartCommand(PSERVICE Service,
WriteFile(Service->ControlPipeHandle,
ControlPacket,
sizeof(SCM_CONTROL_PACKET) + (TotalLength - 1) * sizeof(WCHAR),
- &Count,
+ &dwWriteCount,
NULL);
- /* FIXME: Read the reply */
+ /* Read the reply */
+ ReadFile(Service->ControlPipeHandle,
+ &ReplyPacket,
+ sizeof(SCM_REPLY_PACKET),
+ &dwReadCount,
+ NULL);
/* Release the contol packet */
HeapFree(GetProcessHeap(),
0,
ControlPacket);
+ if (dwReadCount == sizeof(SCM_REPLY_PACKET))
+ {
+ dwError = ReplyPacket.dwError;
+ }
+
DPRINT("ScmSendStartCommand() done\n");
- return ERROR_SUCCESS;
+ return dwError;
}
@@ -850,6 +842,7 @@ ScmStartUserModeService(PSERVICE Service,
WCHAR NtControlPipeName[MAX_PATH + 1];
HKEY hServiceCurrentKey = INVALID_HANDLE_VALUE;
DWORD KeyDisposition;
+ DWORD dwProcessId;
RtlInitUnicodeString(&ImagePath, NULL);
@@ -991,7 +984,7 @@ ScmStartUserModeService(PSERVICE Service,
/* Read SERVICE_STATUS_HANDLE from pipe */
if (!ReadFile(Service->ControlPipeHandle,
- (LPVOID)&Service->hClient,
+ (LPVOID)&dwProcessId,
sizeof(DWORD),
&dwRead,
NULL))
@@ -1002,7 +995,7 @@ ScmStartUserModeService(PSERVICE Service,
}
else
{
- DPRINT("Received service status %lu\n", Service->hClient);
+ DPRINT("Received service process ID %lu\n", dwProcessId);
/* Send start command */
dwError = ScmSendStartCommand(Service, argc, argv);
@@ -1222,7 +1215,6 @@ ScmAutoShutdownServices(VOID)
{
PLIST_ENTRY ServiceEntry;
PSERVICE CurrentService;
- SERVICE_STATUS ServiceStatus;
DPRINT("ScmAutoShutdownServices() called\n");
@@ -1235,7 +1227,7 @@ ScmAutoShutdownServices(VOID)
CurrentService->Status.dwCurrentState == SERVICE_START_PENDING)
{
/* shutdown service */
- ScmControlService(CurrentService, SERVICE_CONTROL_STOP, &ServiceStatus);
+ ScmControlService(CurrentService, SERVICE_CONTROL_STOP);
}
ServiceEntry = ServiceEntry->Flink;
@@ -1244,4 +1236,25 @@ ScmAutoShutdownServices(VOID)
DPRINT("ScmGetBootAndSystemDriverState() done\n");
}
+
+BOOL
+ScmLockDatabaseExclusive(VOID)
+{
+ return RtlAcquireResourceExclusive(&DatabaseLock, TRUE);
+}
+
+
+BOOL
+ScmLockDatabaseShared(VOID)
+{
+ return RtlAcquireResourceShared(&DatabaseLock, TRUE);
+}
+
+
+VOID
+ScmUnlockDatabase(VOID)
+{
+ RtlReleaseResource(&DatabaseLock);
+}
+
/* EOF */
diff --git a/base/system/services/rpcserver.c b/base/system/services/rpcserver.c
index 2262aa55e71..914e013327b 100644
--- a/base/system/services/rpcserver.c
+++ b/base/system/services/rpcserver.c
@@ -637,8 +637,12 @@ DWORD RControlService(
{
/* Send control code to the service */
dwError = ScmControlService(lpService,
- dwControl,
- lpServiceStatus);
+ dwControl);
+
+ /* Return service status information */
+ RtlCopyMemory(lpServiceStatus,
+ &lpService->Status,
+ sizeof(SERVICE_STATUS));
}
if ((dwError == ERROR_SUCCESS) && (pcbBytesNeeded))
@@ -652,10 +656,6 @@ DWORD RControlService(
lpService->ThreadId = 0;
}
- /* Return service status information */
- RtlCopyMemory(lpServiceStatus,
- &lpService->Status,
- sizeof(SERVICE_STATUS));
return dwError;
}
@@ -978,11 +978,15 @@ DWORD RQueryServiceStatus(
return ERROR_INVALID_HANDLE;
}
+ ScmLockDatabaseShared();
+
/* Return service status information */
RtlCopyMemory(lpServiceStatus,
&lpService->Status,
sizeof(SERVICE_STATUS));
+ ScmUnlockDatabase();
+
return ERROR_SUCCESS;
}
@@ -1030,7 +1034,7 @@ DWORD RSetServiceStatus(
return ERROR_INVALID_HANDLE;
}
- lpService = ScmGetServiceEntryByClientHandle((HANDLE)hServiceStatus);
+ lpService = (PSERVICE)hServiceStatus;
if (lpService == NULL)
{
DPRINT("lpService == NULL!\n");
@@ -1059,11 +1063,14 @@ DWORD RSetServiceStatus(
return ERROR_INVALID_DATA;
}
+ ScmLockDatabaseExclusive();
RtlCopyMemory(&lpService->Status,
lpServiceStatus,
sizeof(SERVICE_STATUS));
+ ScmUnlockDatabase();
+
DPRINT("Set %S to %lu\n", lpService->lpDisplayName, lpService->Status.dwCurrentState);
DPRINT("RSetServiceStatus() done\n");
diff --git a/base/system/services/services.h b/base/system/services/services.h
index 23022dc2c92..8371ad18b71 100644
--- a/base/system/services/services.h
+++ b/base/system/services/services.h
@@ -42,7 +42,6 @@ typedef struct _SERVICE
DWORD dwResumeCount;
DWORD dwRefCount;
- CLIENT_HANDLE hClient;
SERVICE_STATUS Status;
DWORD dwStartType;
DWORD dwErrorControl;
@@ -112,15 +111,18 @@ DWORD ScmStartService(PSERVICE Service,
PSERVICE ScmGetServiceEntryByName(LPCWSTR lpServiceName);
PSERVICE ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName);
PSERVICE ScmGetServiceEntryByResumeCount(DWORD dwResumeCount);
-PSERVICE ScmGetServiceEntryByClientHandle(HANDLE Handle);
DWORD ScmCreateNewServiceRecord(LPCWSTR lpServiceName,
PSERVICE *lpServiceRecord);
VOID ScmDeleteServiceRecord(PSERVICE lpService);
DWORD ScmMarkServiceForDelete(PSERVICE pService);
DWORD ScmControlService(PSERVICE Service,
- DWORD dwControl,
- LPSERVICE_STATUS lpServiceStatus);
+ DWORD dwControl);
+
+BOOL ScmLockDatabaseExclusive(VOID);
+BOOL ScmLockDatabaseShared(VOID);
+VOID ScmUnlockDatabase(VOID);
+
/* driver.c */
diff --git a/base/system/smss/smss.h b/base/system/smss/smss.h
index 8c467e566dc..61f3b4bead4 100644
--- a/base/system/smss/smss.h
+++ b/base/system/smss/smss.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef _SMSS_H_INCLUDED_
+#define _SMSS_H_INCLUDED_
#include
#include
@@ -112,4 +113,7 @@ NTSTATUS SmInitializeDbgSs(VOID);
VOID NTAPI DisplayString(LPCWSTR lpwString);
VOID NTAPI PrintString (char* fmt, ...);
+#endif /* _SMSS_H_INCLUDED_ */
+
/* EOF */
+
diff --git a/boot/bootdata/packages/reactos.dff b/boot/bootdata/packages/reactos.dff
index 248f5f7c347..c8be7bd6a18 100644
--- a/boot/bootdata/packages/reactos.dff
+++ b/boot/bootdata/packages/reactos.dff
@@ -482,6 +482,9 @@ drivers\base\beep\beep.sys 2
drivers\base\null\null.sys 2
drivers\base\nmidebug\nmidebug.sys 2
+drivers\battery\cmbatt\cmbatt.sys 2
+drivers\battery\battc\battc.sys 2
+
drivers\bus\isapnp\isapnp.sys 2
drivers\directx\dxapi\dxapi.sys 2
@@ -628,7 +631,9 @@ media\nls\c_28606.nls 1
media\drivers\etc\services 5
media\inf\audio.inf 6
media\inf\acpi.inf 6
+media\inf\battery.inf 6
media\inf\cdrom.inf 6
+media\inf\cpu.inf 6
media\inf\display.inf 6
media\inf\font.inf 6
media\inf\fdc.inf 6
@@ -754,6 +759,7 @@ modules\rostests\winetests\comctl32\comctl32_winetest.exe 7 o
modules\rostests\winetests\comdlg32\comdlg32_winetest.exe 7 optional
modules\rostests\winetests\crypt32\crypt32_winetest.exe 7 optional
modules\rostests\winetests\cryptnet\cryptnet_winetest.exe 7 optional
+modules\rostests\winetests\dsound\dsound_winetest.exe 7 optional
modules\rostests\winetests\gdi32\gdi32_winetest.exe 7 optional
modules\rostests\winetests\gdiplus\gdiplus_winetest.exe 7 optional
modules\rostests\winetests\hlink\hlink_winetest.exe 7 optional
@@ -797,6 +803,7 @@ modules\rostests\winetests\winmm\winmm_winetest.exe 7 o
modules\rostests\winetests\wintrust\wintrust_winetest.exe 7 optional
modules\rostests\winetests\wlanapi\wlanapi_winetest.exe 7 optional
modules\rostests\winetests\ws2_32\ws2_32_winetest.exe 7 optional
+modules\rostests\winetests\xmllite\xmllite_winetest.exe 7 optional
modules\wallpaper\Angelus_02_ROSWP.bmp 4 optional
diff --git a/boot/freeldr/freeldr/arch/i386/halstub.c b/boot/freeldr/freeldr/arch/i386/halstub.c
new file mode 100644
index 00000000000..02aca2b67de
--- /dev/null
+++ b/boot/freeldr/freeldr/arch/i386/halstub.c
@@ -0,0 +1,97 @@
+/*
+* PROJECT: ReactOS Kernel
+* LICENSE: GPL - See COPYING in the top level directory
+* FILE: boot/freeldr/freeldr/arch/i386/hal/halstub.c
+* PURPOSE: I/O Stub HAL Routines
+* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
+*/
+
+/* INCLUDES ******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+/* FUNCTIONS *****************************************************************/
+
+NTSTATUS
+FASTCALL
+xHalIoReadPartitionTable(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG SectorSize,
+ IN BOOLEAN ReturnRecognizedPartitions,
+ OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer)
+{
+ return IoReadPartitionTable(DeviceObject,
+ SectorSize,
+ ReturnRecognizedPartitions,
+ PartitionBuffer);
+}
+
+UCHAR
+NTAPI
+xHalVectorToIDTEntry(IN ULONG Vector)
+{
+ /* Return the vector */
+ return Vector;
+}
+
+VOID
+NTAPI
+xHalHaltSystem(VOID)
+{
+ /* Halt execution */
+ while (TRUE);
+}
+
+/* GLOBALS *******************************************************************/
+
+HAL_DISPATCH HalDispatchTable =
+{
+ HAL_DISPATCH_VERSION,
+ (pHalQuerySystemInformation)NULL,
+ (pHalSetSystemInformation)NULL,
+ (pHalQueryBusSlots)NULL,
+ 0,
+ (pHalExamineMBR)NULL,
+ (pHalIoAssignDriveLetters)NULL,
+ (pHalIoReadPartitionTable)xHalIoReadPartitionTable,
+ (pHalIoSetPartitionInformation)NULL,
+ (pHalIoWritePartitionTable)NULL,
+ (pHalHandlerForBus)NULL,
+ (pHalReferenceBusHandler)NULL,
+ (pHalReferenceBusHandler)NULL,
+ (pHalInitPnpDriver)NULL,
+ (pHalInitPowerManagement)NULL,
+ (pHalGetDmaAdapter)NULL,
+ (pHalGetInterruptTranslator)NULL,
+ (pHalStartMirroring)NULL,
+ (pHalEndMirroring)NULL,
+ (pHalMirrorPhysicalMemory)NULL,
+ (pHalEndOfBoot)NULL,
+ (pHalMirrorVerify)NULL
+};
+
+HAL_PRIVATE_DISPATCH HalPrivateDispatchTable =
+{
+ HAL_PRIVATE_DISPATCH_VERSION,
+ (pHalHandlerForBus)NULL,
+ (pHalHandlerForConfigSpace)NULL,
+ (pHalLocateHiberRanges)NULL,
+ (pHalRegisterBusHandler)NULL,
+ (pHalSetWakeEnable)NULL,
+ (pHalSetWakeAlarm)NULL,
+ (pHalTranslateBusAddress)NULL,
+ (pHalAssignSlotResources)NULL,
+ (pHalHaltSystem)xHalHaltSystem,
+ (pHalFindBusAddressTranslation)NULL,
+ (pHalResetDisplay)NULL,
+ (pHalAllocateMapRegisters)NULL,
+ (pKdSetupPciDeviceForDebugging)NULL,
+ (pKdReleasePciDeviceForDebugging)NULL,
+ (pKdGetAcpiTablePhase0)NULL,
+ (pKdCheckPowerButton)NULL,
+ (pHalVectorToIDTEntry)xHalVectorToIDTEntry,
+ (pKdMapPhysicalMemory64)NULL,
+ (pKdUnmapVirtualAddress)NULL
+};
diff --git a/boot/freeldr/freeldr/arch/i386/loader.c b/boot/freeldr/freeldr/arch/i386/loader.c
index 70ad27f2be0..c9ae5c454e1 100644
--- a/boot/freeldr/freeldr/arch/i386/loader.c
+++ b/boot/freeldr/freeldr/arch/i386/loader.c
@@ -17,7 +17,6 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#define _NTSYSTEM_
#include
#define NDEBUG
diff --git a/boot/freeldr/freeldr/arch/i386/ntoskrnl.c b/boot/freeldr/freeldr/arch/i386/ntoskrnl.c
new file mode 100644
index 00000000000..dcc51ef2b59
--- /dev/null
+++ b/boot/freeldr/freeldr/arch/i386/ntoskrnl.c
@@ -0,0 +1,114 @@
+#include
+#define NDEBUG
+#include
+
+VOID
+NTAPI
+KeInitializeEvent(
+ IN PRKEVENT Event,
+ IN EVENT_TYPE Type,
+ IN BOOLEAN State)
+{
+}
+
+VOID
+FASTCALL
+KiAcquireSpinLock(
+ IN PKSPIN_LOCK SpinLock)
+{
+}
+
+VOID
+FASTCALL
+KiReleaseSpinLock(
+ IN PKSPIN_LOCK SpinLock)
+{
+}
+
+VOID
+NTAPI
+KeSetTimeIncrement(
+ IN ULONG MaxIncrement,
+ IN ULONG MinIncrement)
+{
+}
+
+NTKERNELAPI
+VOID
+FASTCALL
+IoAssignDriveLetters(
+ IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
+ IN PSTRING NtDeviceName,
+ OUT PUCHAR NtSystemPath,
+ OUT PSTRING NtSystemPathString)
+{
+}
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IoSetPartitionInformation(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG SectorSize,
+ IN ULONG PartitionNumber,
+ IN ULONG PartitionType)
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IoWritePartitionTable(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG SectorSize,
+ IN ULONG SectorsPerTrack,
+ IN ULONG NumberOfHeads,
+ IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer)
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTHALAPI
+VOID
+NTAPI
+KeStallExecutionProcessor(
+ IN ULONG MicroSeconds)
+{
+ REGS Regs;
+ ULONG usec_this;
+
+ // Int 15h AH=86h
+ // BIOS - WAIT (AT,PS)
+ //
+ // AH = 86h
+ // CX:DX = interval in microseconds
+ // Return:
+ // CF clear if successful (wait interval elapsed)
+ // CF set on error or AH=83h wait already in progress
+ // AH = status (see #00496)
+
+ // Note: The resolution of the wait period is 977 microseconds on
+ // many systems because many BIOSes use the 1/1024 second fast
+ // interrupt from the AT real-time clock chip which is available on INT 70;
+ // because newer BIOSes may have much more precise timers available, it is
+ // not possible to use this function accurately for very short delays unless
+ // the precise behavior of the BIOS is known (or found through testing)
+
+ while (MicroSeconds)
+ {
+ usec_this = MicroSeconds;
+
+ if (usec_this > 4000000)
+ {
+ usec_this = 4000000;
+ }
+
+ Regs.b.ah = 0x86;
+ Regs.w.cx = usec_this >> 16;
+ Regs.w.dx = usec_this & 0xffff;
+ Int386(0x15, &Regs, &Regs);
+
+ MicroSeconds -= usec_this;
+ }
+}
diff --git a/boot/freeldr/freeldr/bootmgr.c b/boot/freeldr/freeldr/bootmgr.c
index 2a8e7be272b..0959de69d69 100644
--- a/boot/freeldr/freeldr/bootmgr.c
+++ b/boot/freeldr/freeldr/bootmgr.c
@@ -119,6 +119,12 @@ VOID RunLoader(VOID)
return;
}
+ // Load additional SCSI driver (if any)
+ if (LoadBootDeviceDriver() != ESUCCESS)
+ {
+ UiMessageBoxCritical("Unable to load additional boot device driver");
+ }
+
if (!IniFileInitialize())
{
UiMessageBoxCritical("Error initializing .ini file");
diff --git a/boot/freeldr/freeldr/debug.c b/boot/freeldr/freeldr/debug.c
index 6aebbd18252..0de49f52320 100644
--- a/boot/freeldr/freeldr/debug.c
+++ b/boot/freeldr/freeldr/debug.c
@@ -173,6 +173,12 @@ VOID DebugPrintHeader(ULONG Mask)
case DPRINT_HWDETECT:
DbgPrint("HWDETECT: ");
break;
+ case DPRINT_PELOADER:
+ DbgPrint("PELOADER: ");
+ break;
+ case DPRINT_SCSIPORT:
+ DbgPrint("SCSIPORT: ");
+ break;
default:
DbgPrint("UNKNOWN: ");
break;
@@ -194,6 +200,12 @@ VOID DbgPrintMask(ULONG Mask, char *format, ...)
return;
}
+ // Disable file/line for scsiport messages
+ if (Mask & DPRINT_SCSIPORT)
+ {
+ DebugStartOfLine = FALSE;
+ }
+
// Print the header if we have started a new line
if (DebugStartOfLine)
{
@@ -328,3 +340,22 @@ MsgBoxPrint(const char *Format, ...)
return 0;
}
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+KeBugCheckEx(
+ IN ULONG BugCheckCode,
+ IN ULONG_PTR BugCheckParameter1,
+ IN ULONG_PTR BugCheckParameter2,
+ IN ULONG_PTR BugCheckParameter3,
+ IN ULONG_PTR BugCheckParameter4)
+{
+ char Buffer[64];
+ sprintf(Buffer, "*** STOP: 0x%08lX (0x%08lX, 0x%08lX, 0x%08lX, 0x%08lX)",
+ BugCheckCode, BugCheckParameter1, BugCheckParameter2,
+ BugCheckParameter3, BugCheckParameter4);
+ UiMessageBoxCritical(Buffer);
+ assert(FALSE);
+ for (;;);
+}
diff --git a/boot/freeldr/freeldr/disk/partition.c b/boot/freeldr/freeldr/disk/partition.c
index 7dd07aa230f..8966e67187a 100644
--- a/boot/freeldr/freeldr/disk/partition.c
+++ b/boot/freeldr/freeldr/disk/partition.c
@@ -240,4 +240,152 @@ BOOLEAN DiskReadBootRecord(ULONG DriveNumber, ULONGLONG LogicalSectorNumber, PMA
return TRUE;
}
+NTSTATUS
+NTAPI
+IopReadBootRecord(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONGLONG LogicalSectorNumber,
+ IN ULONG SectorSize,
+ OUT PMASTER_BOOT_RECORD BootRecord)
+{
+ ULONG FileId = (ULONG)DeviceObject;
+ LARGE_INTEGER Position;
+ ULONG BytesRead;
+ ULONG Status;
+
+ Position.QuadPart = LogicalSectorNumber * SectorSize;
+ Status = ArcSeek(FileId, &Position, SeekAbsolute);
+ if (Status != ESUCCESS)
+ return STATUS_IO_DEVICE_ERROR;
+
+ Status = ArcRead(FileId, BootRecord, SectorSize, &BytesRead);
+ if (Status != ESUCCESS || BytesRead != SectorSize)
+ return STATUS_IO_DEVICE_ERROR;
+
+ return STATUS_SUCCESS;
+}
+
+BOOLEAN
+NTAPI
+IopCopyPartitionRecord(
+ IN BOOLEAN ReturnRecognizedPartitions,
+ IN ULONG SectorSize,
+ IN PPARTITION_TABLE_ENTRY PartitionTableEntry,
+ OUT PARTITION_INFORMATION *PartitionEntry)
+{
+ BOOLEAN IsRecognized;
+
+ IsRecognized = TRUE; /* FIXME */
+ if (!IsRecognized && ReturnRecognizedPartitions)
+ return FALSE;
+
+ PartitionEntry->StartingOffset.QuadPart = (ULONGLONG)PartitionTableEntry->SectorCountBeforePartition * SectorSize;
+ PartitionEntry->PartitionLength.QuadPart = (ULONGLONG)PartitionTableEntry->PartitionSectorCount * SectorSize;
+ PartitionEntry->HiddenSectors = 0;
+ PartitionEntry->PartitionNumber = 0; /* Will be filled later */
+ PartitionEntry->PartitionType = PartitionTableEntry->SystemIndicator;
+ PartitionEntry->BootIndicator = (PartitionTableEntry->BootIndicator & 0x80) ? TRUE : FALSE;
+ PartitionEntry->RecognizedPartition = IsRecognized;
+ PartitionEntry->RewritePartition = FALSE;
+
+ return TRUE;
+}
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IoReadPartitionTable(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG SectorSize,
+ IN BOOLEAN ReturnRecognizedPartitions,
+ OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer)
+{
+ PMASTER_BOOT_RECORD MasterBootRecord;
+ PDRIVE_LAYOUT_INFORMATION Partitions;
+ ULONG NbPartitions, i, Size;
+ NTSTATUS ret;
+
+ *PartitionBuffer = NULL;
+
+ if (SectorSize < sizeof(MASTER_BOOT_RECORD))
+ return STATUS_NOT_SUPPORTED;
+
+ MasterBootRecord = ExAllocatePool(NonPagedPool, SectorSize);
+ if (!MasterBootRecord)
+ return STATUS_NO_MEMORY;
+
+ /* Read disk MBR */
+ ret = IopReadBootRecord(DeviceObject, 0, SectorSize, MasterBootRecord);
+ if (!NT_SUCCESS(ret))
+ {
+ ExFreePool(MasterBootRecord);
+ return ret;
+ }
+
+ /* Check validity of boot record */
+ if (MasterBootRecord->MasterBootRecordMagic != 0xaa55)
+ {
+ ExFreePool(MasterBootRecord);
+ return STATUS_NOT_SUPPORTED;
+ }
+
+ /* Count number of partitions */
+ NbPartitions = 0;
+ for (i = 0; i < 4; i++)
+ {
+ NbPartitions++;
+
+ if (MasterBootRecord->PartitionTable[i].SystemIndicator == PARTITION_EXTENDED ||
+ MasterBootRecord->PartitionTable[i].SystemIndicator == PARTITION_XINT13_EXTENDED)
+ {
+ /* FIXME: unhandled case; count number of partitions */
+ UNIMPLEMENTED;
+ }
+ }
+
+ if (NbPartitions == 0)
+ {
+ ExFreePool(MasterBootRecord);
+ return STATUS_NOT_SUPPORTED;
+ }
+
+ /* Allocation space to store partitions */
+ Size = FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION, PartitionEntry) +
+ NbPartitions * sizeof(PARTITION_INFORMATION);
+ Partitions = ExAllocatePool(NonPagedPool, Size);
+ if (!Partitions)
+ {
+ ExFreePool(MasterBootRecord);
+ return STATUS_NO_MEMORY;
+ }
+
+ /* Count number of partitions */
+ NbPartitions = 0;
+ for (i = 0; i < 4; i++)
+ {
+ if (IopCopyPartitionRecord(ReturnRecognizedPartitions,
+ SectorSize,
+ &MasterBootRecord->PartitionTable[i],
+ &Partitions->PartitionEntry[NbPartitions]))
+ {
+ Partitions->PartitionEntry[NbPartitions].PartitionNumber = NbPartitions + 1;
+ NbPartitions++;
+ }
+
+ if (MasterBootRecord->PartitionTable[i].SystemIndicator == PARTITION_EXTENDED ||
+ MasterBootRecord->PartitionTable[i].SystemIndicator == PARTITION_XINT13_EXTENDED)
+ {
+ /* FIXME: unhandled case; copy partitions */
+ UNIMPLEMENTED;
+ }
+ }
+
+ Partitions->PartitionCount = NbPartitions;
+ Partitions->Signature = MasterBootRecord->Signature;
+ ExFreePool(MasterBootRecord);
+
+ *PartitionBuffer = Partitions;
+ return STATUS_SUCCESS;
+}
+
#endif
diff --git a/boot/freeldr/freeldr/disk/scsiport.c b/boot/freeldr/freeldr/disk/scsiport.c
new file mode 100644
index 00000000000..d8d15b12d84
--- /dev/null
+++ b/boot/freeldr/freeldr/disk/scsiport.c
@@ -0,0 +1,1701 @@
+#include
+
+#define _SCSIPORT_
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#define NDEBUG
+#include
+
+#define DPRINTM2(fmt, ...) DPRINTM(DPRINT_SCSIPORT, "(%s:%d) SCSIPORT: " fmt, __FILE__, __LINE__, __VA_ARGS__)
+
+#undef UNIMPLEMENTED
+#define UNIMPLEMENTED DPRINTM2("%s UNIMPLEMENTED\n", __FUNCTION__)
+
+#define SCSI_PORT_NEXT_REQUEST_READY 0x0008
+
+typedef struct
+{
+ PVOID NonCachedExtension;
+
+ ULONG BusNum;
+ ULONG MaxTargedIds;
+
+ ULONG InterruptFlags;
+
+ /* SRB extension stuff */
+ ULONG SrbExtensionSize;
+ PVOID SrbExtensionBuffer;
+
+ IO_SCSI_CAPABILITIES PortCapabilities;
+
+ PHW_INITIALIZE HwInitialize;
+ PHW_STARTIO HwStartIo;
+ PHW_INTERRUPT HwInterrupt;
+ PHW_RESET_BUS HwResetBus;
+
+ /* DMA related stuff */
+ PADAPTER_OBJECT AdapterObject;
+
+ ULONG CommonBufferLength;
+
+ PVOID MiniPortDeviceExtension;
+} SCSI_PORT_DEVICE_EXTENSION, *PSCSI_PORT_DEVICE_EXTENSION;
+
+PSCSI_PORT_DEVICE_EXTENSION ScsiDeviceExtensions[SCSI_MAXIMUM_BUSES];
+
+ULONG
+ntohl(
+ IN ULONG Value)
+{
+ FOUR_BYTE Dest;
+ PFOUR_BYTE Source = (PFOUR_BYTE)&Value;
+
+ Dest.Byte0 = Source->Byte3;
+ Dest.Byte1 = Source->Byte2;
+ Dest.Byte2 = Source->Byte1;
+ Dest.Byte3 = Source->Byte0;
+
+ return Dest.AsULong;
+}
+
+BOOLEAN
+SpiSendSynchronousSrb(
+ IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
+ IN PSCSI_REQUEST_BLOCK Srb)
+{
+ BOOLEAN ret;
+
+ ASSERT(!(Srb->SrbFlags & SRB_FLAGS_IS_ACTIVE));
+
+ /* HACK: handle lack of interrupts */
+ while (!(DeviceExtension->InterruptFlags & SCSI_PORT_NEXT_REQUEST_READY))
+ {
+ KeStallExecutionProcessor(100 * 1000);
+ DeviceExtension->HwInterrupt(DeviceExtension->MiniPortDeviceExtension);
+ }
+
+ DeviceExtension->InterruptFlags &= ~SCSI_PORT_NEXT_REQUEST_READY;
+ Srb->SrbFlags |= SRB_FLAGS_IS_ACTIVE;
+
+ if (!DeviceExtension->HwStartIo(
+ DeviceExtension->MiniPortDeviceExtension,
+ Srb))
+ {
+ ExFreePool(Srb);
+ return FALSE;
+ }
+
+ /* HACK: handle lack of interrupts */
+ while (Srb->SrbFlags & SRB_FLAGS_IS_ACTIVE)
+ {
+ KeStallExecutionProcessor(100 * 1000);
+ DeviceExtension->HwInterrupt(DeviceExtension->MiniPortDeviceExtension);
+ }
+
+ ret = SRB_STATUS(Srb->SrbStatus) == SRB_STATUS_SUCCESS;
+ ExFreePool(Srb);
+
+ return ret;
+}
+
+typedef struct tagDISKCONTEXT
+{
+ /* Device ID */
+ PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
+ ULONG PathId;
+ ULONG TargetId;
+ ULONG Lun;
+
+ /* Device characteristics */
+ ULONG SectorSize;
+ ULONGLONG SectorOffset;
+ ULONGLONG SectorCount;
+ ULONGLONG SectorNumber;
+} DISKCONTEXT;
+
+static LONG DiskClose(ULONG FileId)
+{
+ DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
+
+ ExFreePool(Context);
+ return ESUCCESS;
+}
+
+static LONG DiskGetFileInformation(ULONG FileId, FILEINFORMATION* Information)
+{
+ DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
+
+ RtlZeroMemory(Information, sizeof(FILEINFORMATION));
+ Information->EndingAddress.QuadPart = Context->SectorCount * Context->SectorSize;
+ Information->CurrentAddress.LowPart = Context->SectorNumber * Context->SectorSize;
+
+ return ESUCCESS;
+}
+
+static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
+{
+ PSCSI_REQUEST_BLOCK Srb;
+ PCDB Cdb;
+ READ_CAPACITY_DATA ReadCapacityBuffer;
+
+ DISKCONTEXT* Context;
+ PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
+ ULONG ScsiBus, PathId, TargetId, Lun, Partition, PathSyntax;
+ ULONG SectorSize;
+ ULONGLONG SectorOffset = 0;
+ ULONGLONG SectorCount;
+
+ /* Parse ARC path */
+ if (!DissectArcPath2(Path, &ScsiBus, &TargetId, &Lun, &Partition, &PathSyntax))
+ return EINVAL;
+ if (PathSyntax != 0) /* scsi() format */
+ return EINVAL;
+ DeviceExtension = ScsiDeviceExtensions[ScsiBus];
+ PathId = ScsiBus - DeviceExtension->BusNum;
+
+ /* Get disk capacity and sector size */
+ Srb = ExAllocatePool(PagedPool, sizeof(SCSI_REQUEST_BLOCK));
+ if (!Srb)
+ return ENOMEM;
+ RtlZeroMemory(Srb, sizeof(SCSI_REQUEST_BLOCK));
+ Srb->Length = sizeof(SCSI_REQUEST_BLOCK);
+ Srb->Function = SRB_FUNCTION_EXECUTE_SCSI;
+ Srb->PathId = PathId;
+ Srb->TargetId = TargetId;
+ Srb->Lun = Lun;
+ Srb->CdbLength = 10;
+ Srb->SrbFlags = SRB_FLAGS_DATA_IN;
+ Srb->DataTransferLength = sizeof(READ_CAPACITY_DATA);
+ Srb->TimeOutValue = 5; /* in seconds */
+ Srb->DataBuffer = &ReadCapacityBuffer;
+ Cdb = (PCDB)Srb->Cdb;
+ Cdb->CDB10.OperationCode = SCSIOP_READ_CAPACITY;
+ if (!SpiSendSynchronousSrb(DeviceExtension, Srb))
+ {
+ return EIO;
+ }
+
+ /* Transform result to host endianness */
+ SectorCount = ntohl(ReadCapacityBuffer.LogicalBlockAddress);
+ SectorSize = ntohl(ReadCapacityBuffer.BytesPerBlock);
+
+ if (Partition != 0)
+ {
+ /* Need to offset start of disk and length */
+ UNIMPLEMENTED;
+ return EIO;
+ }
+
+ Context = ExAllocatePool(PagedPool, sizeof(DISKCONTEXT));
+ if (!Context)
+ return ENOMEM;
+ Context->DeviceExtension = DeviceExtension;
+ Context->PathId = PathId;
+ Context->TargetId = TargetId;
+ Context->Lun = Lun;
+ Context->SectorSize = SectorSize;
+ Context->SectorOffset = SectorOffset;
+ Context->SectorCount = SectorCount;
+ Context->SectorNumber = 0;
+ FsSetDeviceSpecific(*FileId, Context);
+
+ return ESUCCESS;
+}
+
+static LONG DiskRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
+{
+ DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
+ PSCSI_REQUEST_BLOCK Srb;
+ PCDB Cdb;
+ ULONG FullSectors, NbSectors;
+ ULONG Lba;
+
+ *Count = 0;
+
+ if (N == 0)
+ return ESUCCESS;
+
+ FullSectors = N / Context->SectorSize;
+ NbSectors = (N + Context->SectorSize - 1) / Context->SectorSize;
+ if (Context->SectorNumber + NbSectors >= Context->SectorCount)
+ return EINVAL;
+ if (FullSectors > 0xffff)
+ return EINVAL;
+
+ /* Read full sectors */
+ Lba = Context->SectorNumber;
+ if (FullSectors > 0)
+ {
+ Srb = ExAllocatePool(PagedPool, sizeof(SCSI_REQUEST_BLOCK));
+ if (!Srb)
+ return ENOMEM;
+
+ RtlZeroMemory(Srb, sizeof(SCSI_REQUEST_BLOCK));
+ Srb->Length = sizeof(SCSI_REQUEST_BLOCK);
+ Srb->Function = SRB_FUNCTION_EXECUTE_SCSI;
+ Srb->PathId = Context->PathId;
+ Srb->TargetId = Context->TargetId;
+ Srb->Lun = Context->Lun;
+ Srb->CdbLength = 10;
+ Srb->SrbFlags = SRB_FLAGS_DATA_IN;
+ Srb->DataTransferLength = FullSectors * Context->SectorSize;
+ Srb->TimeOutValue = 5; /* in seconds */
+ Srb->DataBuffer = Buffer;
+ Cdb = (PCDB)Srb->Cdb;
+ Cdb->CDB10.OperationCode = SCSIOP_READ;
+ Cdb->CDB10.LogicalUnitNumber = Srb->Lun;
+ Cdb->CDB10.LogicalBlockByte0 = (Lba >> 24) & 0xff;
+ Cdb->CDB10.LogicalBlockByte1 = (Lba >> 16) & 0xff;
+ Cdb->CDB10.LogicalBlockByte2 = (Lba >> 8) & 0xff;
+ Cdb->CDB10.LogicalBlockByte3 = Lba & 0xff;
+ Cdb->CDB10.TransferBlocksMsb = (FullSectors >> 8) & 0xff;
+ Cdb->CDB10.TransferBlocksLsb = FullSectors & 0xff;
+ if (!SpiSendSynchronousSrb(Context->DeviceExtension, Srb))
+ {
+ return EIO;
+ }
+ Buffer = (PUCHAR)Buffer + FullSectors * Context->SectorSize;
+ N -= FullSectors * Context->SectorSize;
+ *Count += FullSectors * Context->SectorSize;
+ Lba += FullSectors;
+ }
+
+ /* Read incomplete last sector */
+ if (N > 0)
+ {
+ PUCHAR Sector;
+
+ Sector = ExAllocatePool(PagedPool, Context->SectorSize);
+ if (!Sector)
+ return ENOMEM;
+
+ Srb = ExAllocatePool(PagedPool, sizeof(SCSI_REQUEST_BLOCK));
+ if (!Srb)
+ {
+ ExFreePool(Sector);
+ return ENOMEM;
+ }
+
+ RtlZeroMemory(Srb, sizeof(SCSI_REQUEST_BLOCK));
+ Srb->Length = sizeof(SCSI_REQUEST_BLOCK);
+ Srb->Function = SRB_FUNCTION_EXECUTE_SCSI;
+ Srb->PathId = Context->PathId;
+ Srb->TargetId = Context->TargetId;
+ Srb->Lun = Context->Lun;
+ Srb->CdbLength = 10;
+ Srb->SrbFlags = SRB_FLAGS_DATA_IN;
+ Srb->DataTransferLength = Context->SectorSize;
+ Srb->TimeOutValue = 5; /* in seconds */
+ Srb->DataBuffer = Sector;
+ Cdb = (PCDB)Srb->Cdb;
+ Cdb->CDB10.OperationCode = SCSIOP_READ;
+ Cdb->CDB10.LogicalUnitNumber = Srb->Lun;
+ Cdb->CDB10.LogicalBlockByte0 = (Lba >> 24) & 0xff;
+ Cdb->CDB10.LogicalBlockByte1 = (Lba >> 16) & 0xff;
+ Cdb->CDB10.LogicalBlockByte2 = (Lba >> 8) & 0xff;
+ Cdb->CDB10.LogicalBlockByte3 = Lba & 0xff;
+ Cdb->CDB10.TransferBlocksMsb = 0;
+ Cdb->CDB10.TransferBlocksLsb = 1;
+ if (!SpiSendSynchronousSrb(Context->DeviceExtension, Srb))
+ {
+ ExFreePool(Sector);
+ return EIO;
+ }
+ RtlCopyMemory(Buffer, Sector, N);
+ *Count += N;
+ ExFreePool(Sector);
+ }
+
+ return ESUCCESS;
+}
+
+static LONG DiskSeek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode)
+{
+ DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
+
+ if (SeekMode != SeekAbsolute)
+ return EINVAL;
+ if (Position->QuadPart & (Context->SectorSize - 1))
+ return EINVAL;
+
+ Context->SectorNumber = Position->QuadPart / Context->SectorSize;
+ return ESUCCESS;
+}
+
+static const DEVVTBL DiskVtbl = {
+ DiskClose,
+ DiskGetFileInformation,
+ DiskOpen,
+ DiskRead,
+ DiskSeek,
+};
+
+NTSTATUS
+SpiCreatePortConfig(
+ IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
+ IN PHW_INITIALIZATION_DATA HwInitData,
+ OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
+ IN BOOLEAN ZeroStruct)
+{
+ ULONG Bus;
+
+ /* Zero out the struct if told so */
+ if (ZeroStruct)
+ {
+ /* First zero the portconfig */
+ RtlZeroMemory(ConfigInfo, sizeof(PORT_CONFIGURATION_INFORMATION));
+
+ /* Initialize the struct */
+ ConfigInfo->Length = sizeof(PORT_CONFIGURATION_INFORMATION);
+ ConfigInfo->AdapterInterfaceType = HwInitData->AdapterInterfaceType;
+ ConfigInfo->InterruptMode = Latched;
+ ConfigInfo->DmaChannel = SP_UNINITIALIZED_VALUE;
+ ConfigInfo->DmaPort = SP_UNINITIALIZED_VALUE;
+ ConfigInfo->MaximumTransferLength = SP_UNINITIALIZED_VALUE;
+ ConfigInfo->MaximumNumberOfTargets = SCSI_MAXIMUM_TARGETS_PER_BUS;
+
+ /* Store parameters */
+ ConfigInfo->NeedPhysicalAddresses = HwInitData->NeedPhysicalAddresses;
+ ConfigInfo->MapBuffers = HwInitData->MapBuffers;
+ ConfigInfo->AutoRequestSense = HwInitData->AutoRequestSense;
+ ConfigInfo->ReceiveEvent = HwInitData->ReceiveEvent;
+ ConfigInfo->TaggedQueuing = HwInitData->TaggedQueuing;
+ ConfigInfo->MultipleRequestPerLu = HwInitData->MultipleRequestPerLu;
+
+ /* Get the disk usage */
+ ConfigInfo->AtdiskPrimaryClaimed = FALSE; // FIXME
+ ConfigInfo->AtdiskSecondaryClaimed = FALSE; // FIXME
+
+ /* Initiator bus id is not set */
+ for (Bus = 0; Bus < 8; Bus++)
+ ConfigInfo->InitiatorBusId[Bus] = (CCHAR)SP_UNINITIALIZED_VALUE;
+ }
+
+ ConfigInfo->NumberOfPhysicalBreaks = 17;
+
+ return STATUS_SUCCESS;
+}
+
+VOID
+DDKCDECLAPI
+ScsiDebugPrint(
+ IN ULONG DebugPrintLevel,
+ IN PCCHAR DebugMessage,
+ IN ...)
+{
+ va_list ap;
+ CHAR Buffer[512];
+ ULONG Length;
+
+ if (DebugPrintLevel > 10)
+ return;
+
+ va_start(ap, DebugMessage);
+
+ /* Construct a string */
+ Length = _vsnprintf(Buffer, 512, DebugMessage, ap);
+
+ /* Check if we went past the buffer */
+ if (Length == MAXULONG)
+ {
+ /* Terminate it if we went over-board */
+ Buffer[sizeof(Buffer) - 1] = '\0';
+
+ /* Put maximum */
+ Length = sizeof(Buffer);
+ }
+
+ /* Print the message */
+ DPRINTM(DPRINT_SCSIPORT, "%s", Buffer);
+
+ /* Cleanup */
+ va_end(ap);
+}
+
+VOID
+DDKAPI
+ScsiPortCompleteRequest(
+ IN PVOID HwDeviceExtension,
+ IN UCHAR PathId,
+ IN UCHAR TargetId,
+ IN UCHAR Lun,
+ IN UCHAR SrbStatus)
+{
+ // FIXME
+ UNIMPLEMENTED;
+}
+
+#undef ScsiPortConvertPhysicalAddressToUlong
+ULONG
+DDKAPI
+ScsiPortConvertPhysicalAddressToUlong(
+ IN SCSI_PHYSICAL_ADDRESS Address)
+{
+ return Address.LowPart;
+}
+
+SCSI_PHYSICAL_ADDRESS
+DDKAPI
+ScsiPortConvertUlongToPhysicalAddress(
+ IN ULONG UlongAddress)
+{
+ return RtlConvertUlongToLargeInteger(UlongAddress);
+}
+
+VOID
+DDKAPI
+ScsiPortFlushDma(
+ IN PVOID DeviceExtension)
+{
+ // FIXME
+ UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortFreeDeviceBase(
+ IN PVOID HwDeviceExtension,
+ IN PVOID MappedAddress)
+{
+ // Nothing to do
+}
+
+ULONG
+DDKAPI
+ScsiPortGetBusData(
+ IN PVOID DeviceExtension,
+ IN ULONG BusDataType,
+ IN ULONG SystemIoBusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Length)
+{
+ return HalGetBusDataByOffset(BusDataType, SystemIoBusNumber, SlotNumber, Buffer, 0, Length);
+}
+
+PVOID
+DDKAPI
+ScsiPortGetDeviceBase(
+ IN PVOID HwDeviceExtension,
+ IN INTERFACE_TYPE BusType,
+ IN ULONG SystemIoBusNumber,
+ IN SCSI_PHYSICAL_ADDRESS IoAddress,
+ IN ULONG NumberOfBytes,
+ IN BOOLEAN InIoSpace)
+{
+ PHYSICAL_ADDRESS TranslatedAddress;
+ ULONG AddressSpace;
+
+ AddressSpace = (ULONG)InIoSpace;
+ if (HalTranslateBusAddress(BusType,
+ SystemIoBusNumber,
+ IoAddress,
+ &AddressSpace,
+ &TranslatedAddress) == FALSE)
+ {
+ return NULL;
+ }
+
+ /* I/O space */
+ if (AddressSpace != 0)
+ return (PVOID)TranslatedAddress.u.LowPart;
+
+ // FIXME
+ UNIMPLEMENTED;
+ return (PVOID)IoAddress.LowPart;
+}
+
+PVOID
+DDKAPI
+ScsiPortGetLogicalUnit(
+ IN PVOID HwDeviceExtension,
+ IN UCHAR PathId,
+ IN UCHAR TargetId,
+ IN UCHAR Lun)
+{
+ // FIXME
+ UNIMPLEMENTED;
+ return NULL;
+}
+
+SCSI_PHYSICAL_ADDRESS
+DDKAPI
+ScsiPortGetPhysicalAddress(
+ IN PVOID HwDeviceExtension,
+ IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
+ IN PVOID VirtualAddress,
+ OUT ULONG *Length)
+{
+ PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
+ SCSI_PHYSICAL_ADDRESS PhysicalAddress;
+ ULONG BufferLength = 0;
+ ULONG Offset;
+
+ DPRINTM2("ScsiPortGetPhysicalAddress(%p %p %p %p)\n",
+ HwDeviceExtension, Srb, VirtualAddress, Length);
+
+ DeviceExtension = ((PSCSI_PORT_DEVICE_EXTENSION)HwDeviceExtension) - 1;
+
+ if (Srb == NULL || Srb->SenseInfoBuffer == VirtualAddress)
+ {
+ /* Simply look it up in the allocated common buffer */
+ Offset = (PUCHAR)VirtualAddress - (PUCHAR)DeviceExtension->SrbExtensionBuffer;
+
+ BufferLength = DeviceExtension->CommonBufferLength - Offset;
+ PhysicalAddress.QuadPart = Offset;
+ }
+ else
+ {
+ /* Nothing */
+ *Length = 0;
+ PhysicalAddress.QuadPart = (LONGLONG)(SP_UNINITIALIZED_VALUE);
+ }
+
+ *Length = BufferLength;
+ return PhysicalAddress;
+}
+
+PSCSI_REQUEST_BLOCK
+DDKAPI
+ScsiPortGetSrb(
+ IN PVOID DeviceExtension,
+ IN UCHAR PathId,
+ IN UCHAR TargetId,
+ IN UCHAR Lun,
+ IN LONG QueueTag)
+{
+ // FIXME
+ UNIMPLEMENTED;
+ return NULL;
+}
+
+NTSTATUS
+SpiAllocateCommonBuffer(
+ IN OUT PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
+ IN ULONG NonCachedSize)
+{
+ PVOID CommonBuffer;
+ ULONG CommonBufferLength, BufSize;
+
+ /* If size is 0, set it to 16 */
+ if (!DeviceExtension->SrbExtensionSize)
+ DeviceExtension->SrbExtensionSize = 16;
+
+ /* Calculate size */
+ BufSize = DeviceExtension->SrbExtensionSize;
+
+ /* Round it */
+ BufSize = (BufSize + sizeof(LONGLONG) - 1) & ~(sizeof(LONGLONG) - 1);
+
+ /* Sum up into the total common buffer length, and round it to page size */
+ CommonBufferLength =
+ ROUND_TO_PAGES(NonCachedSize);
+
+ /* Allocate it */
+ if (!DeviceExtension->AdapterObject)
+ {
+ /* From nonpaged pool if there is no DMA */
+ CommonBuffer = ExAllocatePool(NonPagedPool, CommonBufferLength);
+ }
+ else
+ {
+ /* Perform a full request since we have a DMA adapter*/
+ UNIMPLEMENTED;
+ CommonBuffer = NULL;
+ }
+
+ /* Fail in case of error */
+ if (!CommonBuffer)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* Zero it */
+ RtlZeroMemory(CommonBuffer, CommonBufferLength);
+
+ /* Store its size in Device Extension */
+ DeviceExtension->CommonBufferLength = CommonBufferLength;
+
+ /* SrbExtension buffer is located at the beginning of the buffer */
+ DeviceExtension->SrbExtensionBuffer = CommonBuffer;
+
+ /* Non-cached extension buffer is located at the end of
+ the common buffer */
+ if (NonCachedSize)
+ {
+ CommonBufferLength -= NonCachedSize;
+ DeviceExtension->NonCachedExtension = (PUCHAR)CommonBuffer + CommonBufferLength;
+ }
+ else
+ {
+ DeviceExtension->NonCachedExtension = NULL;
+ }
+
+ return STATUS_SUCCESS;
+}
+
+PVOID
+DDKAPI
+ScsiPortGetUncachedExtension(
+ IN PVOID HwDeviceExtension,
+ IN PPORT_CONFIGURATION_INFORMATION ConfigInfo,
+ IN ULONG NumberOfBytes)
+{
+ PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
+ DEVICE_DESCRIPTION DeviceDescription;
+ ULONG MapRegistersCount;
+ NTSTATUS Status;
+
+ DPRINTM2("ScsiPortGetUncachedExtension(%p %p %lu)\n",
+ HwDeviceExtension, ConfigInfo, NumberOfBytes);
+
+ DeviceExtension = ((PSCSI_PORT_DEVICE_EXTENSION)HwDeviceExtension) - 1;
+
+ /* Check for allocated common DMA buffer */
+ if (DeviceExtension->SrbExtensionBuffer != NULL)
+ {
+ return NULL;
+ }
+
+ /* Check for DMA adapter object */
+ if (DeviceExtension->AdapterObject == NULL)
+ {
+ /* Initialize DMA adapter description */
+ RtlZeroMemory(&DeviceDescription, sizeof(DEVICE_DESCRIPTION));
+
+ DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION;
+ DeviceDescription.Master = ConfigInfo->Master;
+ DeviceDescription.ScatterGather = ConfigInfo->ScatterGather;
+ DeviceDescription.DemandMode = ConfigInfo->DemandMode;
+ DeviceDescription.Dma32BitAddresses = ConfigInfo->Dma32BitAddresses;
+ DeviceDescription.BusNumber = ConfigInfo->SystemIoBusNumber;
+ DeviceDescription.DmaChannel = ConfigInfo->DmaChannel;
+ DeviceDescription.InterfaceType = ConfigInfo->AdapterInterfaceType;
+ DeviceDescription.DmaWidth = ConfigInfo->DmaWidth;
+ DeviceDescription.DmaSpeed = ConfigInfo->DmaSpeed;
+ DeviceDescription.MaximumLength = ConfigInfo->MaximumTransferLength;
+ DeviceDescription.DmaPort = ConfigInfo->DmaPort;
+
+ /* Get a DMA adapter object */
+#if 0
+ DeviceExtension->AdapterObject =
+ HalGetAdapter(&DeviceDescription, &MapRegistersCount);
+
+ /* Fail in case of error */
+ if (DeviceExtension->AdapterObject == NULL)
+ {
+ return NULL;
+ }
+#else
+ MapRegistersCount = 0;
+#endif
+
+ /* Set number of physical breaks */
+ if (ConfigInfo->NumberOfPhysicalBreaks != 0 &&
+ MapRegistersCount > ConfigInfo->NumberOfPhysicalBreaks)
+ {
+ DeviceExtension->PortCapabilities.MaximumPhysicalPages =
+ ConfigInfo->NumberOfPhysicalBreaks;
+ }
+ else
+ {
+ DeviceExtension->PortCapabilities.MaximumPhysicalPages = MapRegistersCount;
+ }
+ }
+
+ /* Update Srb extension size */
+ if (DeviceExtension->SrbExtensionSize != ConfigInfo->SrbExtensionSize)
+ DeviceExtension->SrbExtensionSize = ConfigInfo->SrbExtensionSize;
+
+ /* Allocate a common DMA buffer */
+ Status = SpiAllocateCommonBuffer(DeviceExtension, NumberOfBytes);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINTM2("SpiAllocateCommonBuffer() failed with Status = 0x%08X!\n", Status);
+ return NULL;
+ }
+
+ return DeviceExtension->NonCachedExtension;
+}
+
+PVOID
+DDKAPI
+ScsiPortGetVirtualAddress(
+ IN PVOID HwDeviceExtension,
+ IN SCSI_PHYSICAL_ADDRESS PhysicalAddress)
+{
+ // FIXME
+ UNIMPLEMENTED;
+ return NULL;
+}
+
+VOID
+SpiScanDevice(
+ IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
+ IN PCHAR ArcName,
+ IN ULONG ScsiBus,
+ IN ULONG TargetId,
+ IN ULONG Lun)
+{
+ ULONG FileId, i;
+ ULONG Status;
+ NTSTATUS ret;
+ struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer;
+ CHAR PartitionName[64];
+
+ /* Register device with partition(0) suffix */
+ sprintf(PartitionName, "%spartition(0)", ArcName);
+ FsRegisterDevice(PartitionName, &DiskVtbl);
+
+ /* Read device partition table */
+ Status = ArcOpen(PartitionName, OpenReadOnly, &FileId);
+ if (Status == ESUCCESS)
+ {
+ ret = HALDISPATCH->HalIoReadPartitionTable((PDEVICE_OBJECT)FileId, 512, FALSE, &PartitionBuffer);
+ if (NT_SUCCESS(ret))
+ {
+ for (i = 0; i < PartitionBuffer->PartitionCount; i++)
+ {
+ if (PartitionBuffer->PartitionEntry[i].PartitionType != PARTITION_ENTRY_UNUSED)
+ {
+ sprintf(PartitionName, "%spartition(%lu)",
+ ArcName, PartitionBuffer->PartitionEntry[i].PartitionNumber);
+ FsRegisterDevice(PartitionName, &DiskVtbl);
+ }
+ }
+ ExFreePool(PartitionBuffer);
+ }
+ ArcClose(FileId);
+ }
+}
+
+VOID
+SpiScanAdapter(
+ IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
+ IN ULONG ScsiBus,
+ IN ULONG PathId)
+{
+ CHAR ArcName[64];
+ PSCSI_REQUEST_BLOCK Srb;
+ PCDB Cdb;
+ INQUIRYDATA InquiryBuffer;
+ ULONG TargetId;
+ ULONG Lun;
+
+ if (!DeviceExtension->HwResetBus(DeviceExtension->MiniPortDeviceExtension, PathId))
+ {
+ return;
+ }
+
+ /* Remember the extension */
+ ScsiDeviceExtensions[ScsiBus] = DeviceExtension;
+
+ for (TargetId = 0; TargetId < DeviceExtension->MaxTargedIds; TargetId++)
+ {
+ Lun = 0;
+ do
+ {
+ DPRINTM2("Scanning SCSI device %d.%d.%d\n",
+ ScsiBus, TargetId, Lun);
+
+ Srb = ExAllocatePool(PagedPool, sizeof(SCSI_REQUEST_BLOCK));
+ if (!Srb)
+ break;
+ RtlZeroMemory(Srb, sizeof(SCSI_REQUEST_BLOCK));
+ Srb->Length = sizeof(SCSI_REQUEST_BLOCK);
+ Srb->Function = SRB_FUNCTION_EXECUTE_SCSI;
+ Srb->PathId = PathId;
+ Srb->TargetId = TargetId;
+ Srb->Lun = Lun;
+ Srb->CdbLength = 6;
+ Srb->SrbFlags = SRB_FLAGS_DATA_IN;
+ Srb->DataTransferLength = INQUIRYDATABUFFERSIZE;
+ Srb->TimeOutValue = 5; /* in seconds */
+ Srb->DataBuffer = &InquiryBuffer;
+ Cdb = (PCDB)Srb->Cdb;
+ Cdb->CDB6INQUIRY.OperationCode = SCSIOP_INQUIRY;
+ Cdb->CDB6INQUIRY.LogicalUnitNumber = Srb->Lun;
+ Cdb->CDB6INQUIRY.AllocationLength = Srb->DataTransferLength;
+ if (!SpiSendSynchronousSrb(DeviceExtension, Srb))
+ {
+ /* Don't check next LUNs */
+ break;
+ }
+
+ /* Device exists, create its ARC name */
+ if (InquiryBuffer.RemovableMedia)
+ {
+ sprintf(ArcName, "scsi(%ld)cdrom(%ld)fdisk(%ld)",
+ ScsiBus, TargetId, Lun);
+ FsRegisterDevice(ArcName, &DiskVtbl);
+ }
+ else
+ {
+ sprintf(ArcName, "scsi(%ld)disk(%ld)rdisk(%ld)",
+ ScsiBus, TargetId, Lun);
+ /* Now, check if it has partitions */
+ SpiScanDevice(DeviceExtension, ArcName, PathId, TargetId, Lun);
+ }
+
+ /* Check next LUN */
+ Lun++;
+ } while (Lun < SCSI_MAXIMUM_LOGICAL_UNITS);
+ }
+}
+
+VOID
+SpiResourceToConfig(
+ IN PHW_INITIALIZATION_DATA HwInitializationData,
+ IN PCM_FULL_RESOURCE_DESCRIPTOR ResourceDescriptor,
+ IN OUT PPORT_CONFIGURATION_INFORMATION PortConfig)
+{
+ PACCESS_RANGE AccessRange;
+ PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialData;
+ ULONG RangeNumber;
+ ULONG Index;
+
+ RangeNumber = 0;
+
+ /* Loop through all entries */
+ for (Index = 0; Index < ResourceDescriptor->PartialResourceList.Count; Index++)
+ {
+ PartialData = &ResourceDescriptor->PartialResourceList.PartialDescriptors[Index];
+
+ switch (PartialData->Type)
+ {
+ case CmResourceTypePort:
+ /* Copy access ranges */
+ if (RangeNumber < HwInitializationData->NumberOfAccessRanges)
+ {
+ DPRINTM2("Got port at 0x%I64x, len 0x%x\n",
+ PartialData->u.Port.Start.QuadPart, PartialData->u.Port.Length);
+ AccessRange = &((*(PortConfig->AccessRanges))[RangeNumber]);
+
+ AccessRange->RangeStart = PartialData->u.Port.Start;
+ AccessRange->RangeLength = PartialData->u.Port.Length;
+
+ AccessRange->RangeInMemory = FALSE;
+ RangeNumber++;
+ }
+ break;
+
+ case CmResourceTypeMemory:
+ /* Copy access ranges */
+ if (RangeNumber < HwInitializationData->NumberOfAccessRanges)
+ {
+ DPRINTM2("Got memory at 0x%I64x, len 0x%x\n",
+ PartialData->u.Memory.Start.QuadPart, PartialData->u.Memory.Length);
+ AccessRange = &((*(PortConfig->AccessRanges))[RangeNumber]);
+
+ AccessRange->RangeStart = PartialData->u.Memory.Start;
+ AccessRange->RangeLength = PartialData->u.Memory.Length;
+
+ AccessRange->RangeInMemory = TRUE;
+ RangeNumber++;
+ }
+ break;
+
+ case CmResourceTypeInterrupt:
+ /* Copy interrupt data */
+ DPRINTM2("Got interrupt level %d, vector %d\n",
+ PartialData->u.Interrupt.Level, PartialData->u.Interrupt.Vector);
+ PortConfig->BusInterruptLevel = PartialData->u.Interrupt.Level;
+ PortConfig->BusInterruptVector = PartialData->u.Interrupt.Vector;
+
+ /* Set interrupt mode accordingly to the resource */
+ if (PartialData->Flags == CM_RESOURCE_INTERRUPT_LATCHED)
+ {
+ PortConfig->InterruptMode = Latched;
+ }
+ else if (PartialData->Flags == CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE)
+ {
+ PortConfig->InterruptMode = LevelSensitive;
+ }
+ break;
+
+ case CmResourceTypeDma:
+ DPRINTM2("Got DMA channel %d, port %d\n",
+ PartialData->u.Dma.Channel, PartialData->u.Dma.Port);
+ PortConfig->DmaChannel = PartialData->u.Dma.Channel;
+ PortConfig->DmaPort = PartialData->u.Dma.Port;
+ break;
+ }
+ }
+}
+
+BOOLEAN
+SpiGetPciConfigData(
+ IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
+ IN OUT PPORT_CONFIGURATION_INFORMATION PortConfig,
+ IN ULONG BusNumber,
+ IN OUT PPCI_SLOT_NUMBER NextSlotNumber)
+{
+ PCI_COMMON_CONFIG PciConfig;
+ PCI_SLOT_NUMBER SlotNumber;
+ ULONG DataSize;
+ ULONG DeviceNumber;
+ ULONG FunctionNumber;
+ CHAR VendorIdString[8];
+ CHAR DeviceIdString[8];
+ PCM_RESOURCE_LIST ResourceList;
+ NTSTATUS Status;
+
+ RtlZeroMemory(&ResourceList, sizeof(PCM_RESOURCE_LIST));
+ SlotNumber.u.AsULONG = 0;
+
+ /* Loop through all devices */
+ for (DeviceNumber = NextSlotNumber->u.bits.DeviceNumber; DeviceNumber < PCI_MAX_DEVICES; DeviceNumber++)
+ {
+ SlotNumber.u.bits.DeviceNumber = DeviceNumber;
+
+ /* Loop through all functions */
+ for (FunctionNumber = NextSlotNumber->u.bits.FunctionNumber; FunctionNumber < PCI_MAX_FUNCTION; FunctionNumber++)
+ {
+ SlotNumber.u.bits.FunctionNumber = FunctionNumber;
+
+ /* Get PCI config bytes */
+ DataSize = HalGetBusDataByOffset(
+ PCIConfiguration,
+ BusNumber,
+ SlotNumber.u.AsULONG,
+ &PciConfig,
+ 0,
+ sizeof(ULONG));
+
+ /* If result of HalGetBusData is 0, then the bus is wrong */
+ if (DataSize == 0)
+ return FALSE;
+
+ /* If result is PCI_INVALID_VENDORID, then this device has no more
+ "Functions" */
+ if (PciConfig.VendorID == PCI_INVALID_VENDORID)
+ break;
+
+ sprintf(VendorIdString, "%04hx", PciConfig.VendorID);
+ sprintf(DeviceIdString, "%04hx", PciConfig.DeviceID);
+
+ if (_strnicmp(VendorIdString, HwInitializationData->VendorId, HwInitializationData->VendorIdLength) ||
+ _strnicmp(DeviceIdString, HwInitializationData->DeviceId, HwInitializationData->DeviceIdLength))
+ {
+ /* It is not our device */
+ continue;
+ }
+
+ DPRINTM2( "Found device 0x%04hx 0x%04hx at %1lu %2lu %1lu\n",
+ PciConfig.VendorID, PciConfig.DeviceID,
+ BusNumber,
+ SlotNumber.u.bits.DeviceNumber, SlotNumber.u.bits.FunctionNumber);
+
+ Status = HalAssignSlotResources(NULL,
+ NULL,
+ NULL,
+ NULL,
+ PCIBus,
+ BusNumber,
+ SlotNumber.u.AsULONG,
+ &ResourceList);
+
+ if (!NT_SUCCESS(Status))
+ break;
+
+ /* Create configuration information */
+ SpiResourceToConfig(HwInitializationData,
+ ResourceList->List,
+ PortConfig);
+
+ /* Free the resource list */
+ ExFreePool(ResourceList);
+
+ /* Set dev & fn numbers */
+ NextSlotNumber->u.bits.DeviceNumber = DeviceNumber;
+ NextSlotNumber->u.bits.FunctionNumber = FunctionNumber + 1;
+
+ /* Save the slot number */
+ PortConfig->SlotNumber = SlotNumber.u.AsULONG;
+
+ return TRUE;
+ }
+ NextSlotNumber->u.bits.FunctionNumber = 0;
+ }
+
+ NextSlotNumber->u.bits.DeviceNumber = 0;
+
+ return FALSE;
+}
+
+ULONG
+DDKAPI
+ScsiPortInitialize(
+ IN PVOID Argument1,
+ IN PVOID Argument2,
+ IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
+ IN PVOID HwContext OPTIONAL)
+{
+ PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
+ ULONG DeviceExtensionSize;
+ PORT_CONFIGURATION_INFORMATION PortConfig;
+ BOOLEAN Again;
+ BOOLEAN FirstConfigCall = TRUE;
+ PCI_SLOT_NUMBER SlotNumber;
+ NTSTATUS Status;
+
+ if (HwInitializationData->HwInitializationDataSize != sizeof(HW_INITIALIZATION_DATA))
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Check params for validity */
+ if ((HwInitializationData->HwInitialize == NULL) ||
+ (HwInitializationData->HwStartIo == NULL) ||
+ (HwInitializationData->HwInterrupt == NULL) ||
+ (HwInitializationData->HwFindAdapter == NULL) ||
+ (HwInitializationData->HwResetBus == NULL))
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Zero starting slot number */
+ SlotNumber.u.AsULONG = 0;
+
+ while (TRUE)
+ {
+ Again = FALSE;
+
+ DeviceExtensionSize = sizeof(SCSI_PORT_DEVICE_EXTENSION) + HwInitializationData->DeviceExtensionSize;
+ DeviceExtension = MmHeapAlloc(DeviceExtensionSize);
+ if (!DeviceExtension)
+ {
+ return STATUS_NO_MEMORY;
+ }
+ RtlZeroMemory(DeviceExtension, DeviceExtensionSize);
+ DeviceExtension->InterruptFlags = SCSI_PORT_NEXT_REQUEST_READY;
+ DeviceExtension->HwInitialize = HwInitializationData->HwInitialize;
+ DeviceExtension->HwStartIo = HwInitializationData->HwStartIo;
+ DeviceExtension->HwInterrupt = HwInitializationData->HwInterrupt;
+ DeviceExtension->HwResetBus = HwInitializationData->HwResetBus;
+ DeviceExtension->MiniPortDeviceExtension = (PVOID)(DeviceExtension + 1);
+
+ Status = SpiCreatePortConfig(DeviceExtension,
+ HwInitializationData,
+ &PortConfig,
+ FirstConfigCall);
+ if (Status != STATUS_SUCCESS)
+ {
+ MmHeapFree(DeviceExtension);
+ return Status;
+ }
+
+ PortConfig.NumberOfAccessRanges = HwInitializationData->NumberOfAccessRanges;
+ PortConfig.AccessRanges = MmHeapAlloc(sizeof(ACCESS_RANGE) * HwInitializationData->NumberOfAccessRanges);
+ if (!PortConfig.AccessRanges)
+ {
+ MmHeapFree(DeviceExtension);
+ return STATUS_NO_MEMORY;
+ }
+ RtlZeroMemory(PortConfig.AccessRanges, sizeof(ACCESS_RANGE) * HwInitializationData->NumberOfAccessRanges);
+
+ /* Search for matching PCI device */
+ if ((HwInitializationData->AdapterInterfaceType == PCIBus) &&
+ (HwInitializationData->VendorIdLength > 0) &&
+ (HwInitializationData->VendorId != NULL) &&
+ (HwInitializationData->DeviceIdLength > 0) &&
+ (HwInitializationData->DeviceId != NULL))
+ {
+ PortConfig.BusInterruptLevel = 0;
+
+ /* Get PCI device data */
+ DPRINTM2("VendorId '%.*s' DeviceId '%.*s'\n",
+ HwInitializationData->VendorIdLength,
+ HwInitializationData->VendorId,
+ HwInitializationData->DeviceIdLength,
+ HwInitializationData->DeviceId);
+
+ if (!SpiGetPciConfigData(HwInitializationData,
+ &PortConfig,
+ 0, /* FIXME */
+ &SlotNumber))
+ {
+ /* Continue to the next bus, nothing here */
+ MmHeapFree(DeviceExtension);
+ return STATUS_INTERNAL_ERROR;
+ }
+
+ if (!PortConfig.BusInterruptLevel)
+ {
+ /* Bypass this slot, because no interrupt was assigned */
+ MmHeapFree(DeviceExtension);
+ return STATUS_INTERNAL_ERROR;
+ }
+ }
+
+ if (HwInitializationData->HwFindAdapter(
+ DeviceExtension->MiniPortDeviceExtension,
+ HwContext,
+ NULL,
+ NULL,
+ &PortConfig,
+ &Again) != SP_RETURN_FOUND)
+ {
+ MmHeapFree(DeviceExtension);
+ return STATUS_INTERNAL_ERROR;
+ }
+
+ /* Copy all stuff which we ever need from PortConfig to the DeviceExtension */
+ if (PortConfig.MaximumNumberOfTargets > SCSI_MAXIMUM_TARGETS_PER_BUS)
+ DeviceExtension->MaxTargedIds = SCSI_MAXIMUM_TARGETS_PER_BUS;
+ else
+ DeviceExtension->MaxTargedIds = PortConfig.MaximumNumberOfTargets;
+
+ DeviceExtension->BusNum = PortConfig.SystemIoBusNumber;
+
+ DPRINTM2("Adapter found: buses = %d, targets = %d\n",
+ PortConfig.NumberOfBuses, DeviceExtension->MaxTargedIds);
+
+ /* Initialize adapter */
+ if (!DeviceExtension->HwInitialize(DeviceExtension->MiniPortDeviceExtension))
+ {
+ MmHeapFree(DeviceExtension);
+ return STATUS_INTERNAL_ERROR;
+ }
+
+ /* Scan bus */
+ {
+ ULONG ScsiBus;
+ for (ScsiBus = 0; ScsiBus < PortConfig.NumberOfBuses; ScsiBus++)
+ {
+ SpiScanAdapter(DeviceExtension, PortConfig.SystemIoBusNumber, ScsiBus);
+ PortConfig.SystemIoBusNumber++;
+ }
+ }
+
+ FirstConfigCall = FALSE;
+ if (!Again)
+ {
+ break;
+ }
+ }
+
+ return STATUS_SUCCESS;
+}
+
+VOID
+DDKAPI
+ScsiPortIoMapTransfer(
+ IN PVOID HwDeviceExtension,
+ IN PSCSI_REQUEST_BLOCK Srb,
+ IN PVOID LogicalAddress,
+ IN ULONG Length)
+{
+ // FIXME
+ UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortLogError(
+ IN PVOID HwDeviceExtension,
+ IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
+ IN UCHAR PathId,
+ IN UCHAR TargetId,
+ IN UCHAR Lun,
+ IN ULONG ErrorCode,
+ IN ULONG UniqueId)
+{
+ // FIXME
+ UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortMoveMemory(
+ IN PVOID WriteBuffer,
+ IN PVOID ReadBuffer,
+ IN ULONG Length)
+{
+ RtlMoveMemory(WriteBuffer, ReadBuffer, Length);
+}
+
+VOID
+DDKCDECLAPI
+ScsiPortNotification(
+ IN SCSI_NOTIFICATION_TYPE NotificationType,
+ IN PVOID HwDeviceExtension,
+ IN ...)
+{
+ PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
+ PSCSI_REQUEST_BLOCK Srb;
+ va_list ap;
+
+ DeviceExtension = ((PSCSI_PORT_DEVICE_EXTENSION)HwDeviceExtension) - 1;
+
+ va_start(ap, HwDeviceExtension);
+
+ switch (NotificationType)
+ {
+ case RequestComplete:
+ /* Mask the SRB as completed */
+ Srb = va_arg(ap, PSCSI_REQUEST_BLOCK);
+ Srb->SrbFlags &= ~SRB_FLAGS_IS_ACTIVE;
+ break;
+
+ case NextRequest:
+ /* Say that device is ready */
+ DeviceExtension->InterruptFlags |= SCSI_PORT_NEXT_REQUEST_READY;
+ break;
+
+ default:
+ // FIXME
+ UNIMPLEMENTED;
+ }
+
+ va_end(ap);
+}
+
+VOID
+DDKAPI
+ScsiPortReadPortBufferUchar(
+ IN PUCHAR Port,
+ OUT PUCHAR Buffer,
+ IN ULONG Count)
+{
+ __inbytestring(H2I(Port), Buffer, Count);
+}
+
+VOID
+DDKAPI
+ScsiPortReadPortBufferUlong(
+ IN PULONG Port,
+ OUT PULONG Buffer,
+ IN ULONG Count)
+{
+ __indwordstring(H2I(Port), Buffer, Count);
+}
+
+VOID
+DDKAPI
+ScsiPortReadPortBufferUshort(
+ IN PUSHORT Port,
+ OUT PUSHORT Buffer,
+ IN ULONG Count)
+{
+ __inwordstring(H2I(Port), Buffer, Count);
+}
+
+UCHAR
+DDKAPI
+ScsiPortReadPortUchar(
+ IN PUCHAR Port)
+{
+ DPRINTM2("ScsiPortReadPortUchar(%p)\n",
+ Port);
+
+ return READ_PORT_UCHAR(Port);
+}
+
+ULONG
+DDKAPI
+ScsiPortReadPortUlong(
+ IN PULONG Port)
+{
+ return READ_PORT_ULONG(Port);
+}
+
+USHORT
+DDKAPI
+ScsiPortReadPortUshort(
+ IN PUSHORT Port)
+{
+ return READ_PORT_USHORT(Port);
+}
+
+VOID
+DDKAPI
+ScsiPortReadRegisterBufferUchar(
+ IN PUCHAR Register,
+ IN PUCHAR Buffer,
+ IN ULONG Count)
+{
+ // FIXME
+ UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortReadRegisterBufferUlong(
+ IN PULONG Register,
+ IN PULONG Buffer,
+ IN ULONG Count)
+{
+ // FIXME
+ UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortReadRegisterBufferUshort(
+ IN PUSHORT Register,
+ IN PUSHORT Buffer,
+ IN ULONG Count)
+{
+ // FIXME
+ UNIMPLEMENTED;
+}
+
+UCHAR
+DDKAPI
+ScsiPortReadRegisterUchar(
+ IN PUCHAR Register)
+{
+ return READ_REGISTER_UCHAR(Register);
+}
+
+ULONG
+DDKAPI
+ScsiPortReadRegisterUlong(
+ IN PULONG Register)
+{
+ return READ_REGISTER_ULONG(Register);
+}
+
+USHORT
+DDKAPI
+ScsiPortReadRegisterUshort(
+ IN PUSHORT Register)
+{
+ return READ_REGISTER_USHORT(Register);
+}
+
+ULONG
+DDKAPI
+ScsiPortSetBusDataByOffset(
+ IN PVOID DeviceExtension,
+ IN ULONG BusDataType,
+ IN ULONG SystemIoBusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length)
+{
+ // FIXME
+ UNIMPLEMENTED;
+ return 0;
+}
+
+VOID
+DDKAPI
+ScsiPortStallExecution(
+ IN ULONG Delay)
+{
+ KeStallExecutionProcessor(Delay);
+}
+
+BOOLEAN
+DDKAPI
+ScsiPortValidateRange(
+ IN PVOID HwDeviceExtension,
+ IN INTERFACE_TYPE BusType,
+ IN ULONG SystemIoBusNumber,
+ IN SCSI_PHYSICAL_ADDRESS IoAddress,
+ IN ULONG NumberOfBytes,
+ IN BOOLEAN InIoSpace)
+{
+ // FIXME
+ UNIMPLEMENTED;
+ return TRUE;
+}
+
+#if 0
+// ScsiPortWmi*
+#endif
+
+
+VOID
+DDKAPI
+ScsiPortWritePortBufferUchar(
+ IN PUCHAR Port,
+ IN PUCHAR Buffer,
+ IN ULONG Count)
+{
+ __outbytestring(H2I(Port), Buffer, Count);
+}
+
+VOID
+DDKAPI
+ScsiPortWritePortBufferUlong(
+ IN PULONG Port,
+ IN PULONG Buffer,
+ IN ULONG Count)
+{
+ __outdwordstring(H2I(Port), Buffer, Count);
+}
+
+VOID
+DDKAPI
+ScsiPortWritePortBufferUshort(
+ IN PUSHORT Port,
+ IN PUSHORT Buffer,
+ IN ULONG Count)
+{
+ __outwordstring(H2I(Port), Buffer, Count);
+}
+
+VOID
+DDKAPI
+ScsiPortWritePortUchar(
+ IN PUCHAR Port,
+ IN UCHAR Value)
+{
+ WRITE_PORT_UCHAR(Port, Value);
+}
+
+VOID
+DDKAPI
+ScsiPortWritePortUlong(
+ IN PULONG Port,
+ IN ULONG Value)
+{
+ WRITE_PORT_ULONG(Port, Value);
+}
+
+VOID
+DDKAPI
+ScsiPortWritePortUshort(
+ IN PUSHORT Port,
+ IN USHORT Value)
+{
+ WRITE_PORT_USHORT(Port, Value);
+}
+
+VOID
+DDKAPI
+ScsiPortWriteRegisterBufferUchar(
+ IN PUCHAR Register,
+ IN PUCHAR Buffer,
+ IN ULONG Count)
+{
+ // FIXME
+ UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortWriteRegisterBufferUlong(
+ IN PULONG Register,
+ IN PULONG Buffer,
+ IN ULONG Count)
+{
+ // FIXME
+ UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortWriteRegisterBufferUshort(
+ IN PUSHORT Register,
+ IN PUSHORT Buffer,
+ IN ULONG Count)
+{
+ // FIXME
+ UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortWriteRegisterUchar(
+ IN PUCHAR Register,
+ IN ULONG Value)
+{
+ WRITE_REGISTER_UCHAR(Register, Value);
+}
+
+VOID
+DDKAPI
+ScsiPortWriteRegisterUlong(
+ IN PULONG Register,
+ IN ULONG Value)
+{
+ WRITE_REGISTER_ULONG(Register, Value);
+}
+
+VOID
+DDKAPI
+ScsiPortWriteRegisterUshort(
+ IN PUSHORT Register,
+ IN USHORT Value)
+{
+ WRITE_REGISTER_USHORT(Register, Value);
+}
+
+ULONG
+LoadBootDeviceDriver(VOID)
+{
+ struct
+ {
+ CHAR* Name;
+ PVOID Function;
+ } ExportTable[] =
+ {
+ { "ScsiDebugPrint", ScsiDebugPrint },
+ { "ScsiPortCompleteRequest", ScsiPortCompleteRequest },
+ { "ScsiPortConvertPhysicalAddressToUlong", ScsiPortConvertPhysicalAddressToUlong },
+ { "ScsiPortConvertUlongToPhysicalAddress", ScsiPortConvertUlongToPhysicalAddress },
+ { "ScsiPortFlushDma", ScsiPortFlushDma },
+ { "ScsiPortFreeDeviceBase", ScsiPortFreeDeviceBase },
+ { "ScsiPortGetBusData", ScsiPortGetBusData },
+ { "ScsiPortGetDeviceBase", ScsiPortGetDeviceBase },
+ { "ScsiPortGetLogicalUnit", ScsiPortGetLogicalUnit },
+ { "ScsiPortGetPhysicalAddress", ScsiPortGetPhysicalAddress },
+ { "ScsiPortGetSrb", ScsiPortGetSrb },
+ { "ScsiPortGetUncachedExtension", ScsiPortGetUncachedExtension },
+ { "ScsiPortGetVirtualAddress", ScsiPortGetVirtualAddress },
+ { "ScsiPortInitialize", ScsiPortInitialize },
+ { "ScsiPortIoMapTransfer", ScsiPortIoMapTransfer },
+ { "ScsiPortLogError", ScsiPortLogError },
+ { "ScsiPortMoveMemory", ScsiPortMoveMemory },
+ { "ScsiPortNotification", ScsiPortNotification },
+ { "ScsiPortReadPortBufferUchar", ScsiPortReadPortBufferUchar },
+ { "ScsiPortReadPortBufferUlong", ScsiPortReadPortBufferUlong },
+ { "ScsiPortReadPortBufferUshort", ScsiPortReadPortBufferUshort },
+ { "ScsiPortReadPortUchar", ScsiPortReadPortUchar },
+ { "ScsiPortReadPortUlong", ScsiPortReadPortUlong },
+ { "ScsiPortReadPortUshort", ScsiPortReadPortUshort },
+ { "ScsiPortReadRegisterBufferUchar", ScsiPortReadRegisterBufferUchar },
+ { "ScsiPortReadRegisterBufferUlong", ScsiPortReadRegisterBufferUlong },
+ { "ScsiPortReadRegisterBufferUshort", ScsiPortReadRegisterBufferUshort },
+ { "ScsiPortReadRegisterUchar", ScsiPortReadRegisterUchar },
+ { "ScsiPortReadRegisterUlong", ScsiPortReadRegisterUlong },
+ { "ScsiPortReadRegisterUshort", ScsiPortReadRegisterUshort },
+ { "ScsiPortSetBusDataByOffset", ScsiPortSetBusDataByOffset },
+ { "ScsiPortStallExecution", ScsiPortStallExecution },
+ { "ScsiPortValidateRange", ScsiPortValidateRange },
+ { "ScsiPortWritePortBufferUchar", ScsiPortWritePortBufferUchar },
+ { "ScsiPortWritePortBufferUlong", ScsiPortWritePortBufferUlong },
+ { "ScsiPortWritePortBufferUshort", ScsiPortWritePortBufferUshort },
+ { "ScsiPortWritePortUchar", ScsiPortWritePortUchar },
+ { "ScsiPortWritePortUlong", ScsiPortWritePortUlong },
+ { "ScsiPortWritePortUshort", ScsiPortWritePortUshort },
+ { "ScsiPortWriteRegisterBufferUchar", ScsiPortWriteRegisterBufferUchar },
+ { "ScsiPortWriteRegisterBufferUlong", ScsiPortWriteRegisterBufferUlong },
+ { "ScsiPortWriteRegisterBufferUshort", ScsiPortWriteRegisterBufferUshort },
+ { "ScsiPortWriteRegisterUchar", ScsiPortWriteRegisterUchar },
+ { "ScsiPortWriteRegisterUlong", ScsiPortWriteRegisterUlong },
+ { "ScsiPortWriteRegisterUshort", ScsiPortWriteRegisterUshort },
+ };
+ IMAGE_DOS_HEADER ImageDosHeader;
+ IMAGE_NT_HEADERS ImageNtHeaders;
+ IMAGE_EXPORT_DIRECTORY ImageExportDirectory;
+ CHAR* TableName[sizeof(ExportTable) / sizeof(ExportTable[0])];
+ USHORT OrdinalTable[sizeof(ExportTable) / sizeof(ExportTable[0])];
+ ULONG FunctionTable[sizeof(ExportTable) / sizeof(ExportTable[0])];
+
+ PIMAGE_NT_HEADERS NtHeaders;
+ LOADER_PARAMETER_BLOCK LoaderBlock;
+ PIMAGE_IMPORT_DESCRIPTOR ImportTable;
+ ULONG ImportTableSize;
+ PLDR_DATA_TABLE_ENTRY BootDdDTE, FreeldrDTE;
+ CHAR NtBootDdPath[MAX_PATH];
+ PVOID ImageBase;
+ ULONG (NTAPI *EntryPoint)(IN PVOID DriverObject, IN PVOID RegistryPath);
+ ULONG i;
+ BOOLEAN Status;
+
+ /* Some initialization of our temporary loader block */
+ RtlZeroMemory(&LoaderBlock, sizeof(LOADER_PARAMETER_BLOCK));
+ InitializeListHead(&LoaderBlock.LoadOrderListHead);
+
+ /* Create our fake executable header for freeldr.sys */
+ RtlZeroMemory(&ImageDosHeader, sizeof(IMAGE_DOS_HEADER));
+ RtlZeroMemory(&ImageNtHeaders, sizeof(IMAGE_NT_HEADERS));
+ RtlZeroMemory(&ImageExportDirectory, sizeof(IMAGE_EXPORT_DIRECTORY));
+ ImageDosHeader.e_magic = SWAPW(IMAGE_DOS_SIGNATURE);
+ ImageDosHeader.e_lfanew = SWAPD((ULONG_PTR)&ImageNtHeaders - (ULONG_PTR)&ImageDosHeader);
+ ImageNtHeaders.Signature = IMAGE_NT_SIGNATURE;
+ ImageNtHeaders.OptionalHeader.NumberOfRvaAndSizes = SWAPD(IMAGE_DIRECTORY_ENTRY_EXPORT + 1);
+ ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress =
+ SWAPW((ULONG_PTR)&ImageExportDirectory - (ULONG_PTR)&ImageDosHeader);
+ ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size = 1;
+ ImageExportDirectory.NumberOfNames = sizeof(ExportTable) / sizeof(ExportTable[0]);
+ ImageExportDirectory.AddressOfNames = (ULONG_PTR)TableName - (ULONG_PTR)&ImageDosHeader;
+ ImageExportDirectory.AddressOfNameOrdinals = (ULONG_PTR)OrdinalTable - (ULONG_PTR)&ImageDosHeader;
+ ImageExportDirectory.NumberOfFunctions = sizeof(ExportTable) / sizeof(ExportTable[0]);
+ ImageExportDirectory.AddressOfFunctions = (ULONG_PTR)FunctionTable - (ULONG_PTR)&ImageDosHeader;
+
+ /* Fill freeldr.sys export table */
+ for (i = 0; i < sizeof(ExportTable) / sizeof(ExportTable[0]); i++)
+ {
+ TableName[i] = PaToVa((PVOID)((ULONG_PTR)ExportTable[i].Name - (ULONG_PTR)&ImageDosHeader));
+ OrdinalTable[i] = i;
+ FunctionTable[i] = (ULONG)((ULONG_PTR)ExportTable[i].Function - (ULONG_PTR)&ImageDosHeader);
+ }
+
+ /* Add freeldr.sys to list of loaded executables */
+ RtlZeroMemory(FreeldrDTE, sizeof(LDR_DATA_TABLE_ENTRY));
+ Status = WinLdrAllocateDataTableEntry(&LoaderBlock, "scsiport.sys",
+ "FREELDR.SYS", &ImageDosHeader, &FreeldrDTE);
+ if (!Status)
+ return EIO;
+
+ /* Create full ntbootdd.sys path */
+ MachDiskGetBootPath(NtBootDdPath, sizeof(NtBootDdPath));
+ strcat(NtBootDdPath, "\\NTBOOTDD.SYS");
+
+ /* Load file */
+ Status = WinLdrLoadImage(NtBootDdPath, LoaderBootDriver, &ImageBase);
+ if (!Status)
+ {
+ /* That's OK. File simply doesn't exist */
+ return ESUCCESS;
+ }
+
+ /* Fix imports */
+ Status = WinLdrAllocateDataTableEntry(&LoaderBlock, "ntbootdd.sys",
+ "NTBOOTDD.SYS", ImageBase, &BootDdDTE);
+ if (!Status)
+ return EIO;
+ Status = WinLdrScanImportDescriptorTable(&LoaderBlock, "", BootDdDTE);
+ if (!Status)
+ return EIO;
+
+ /* Change imports to PA */
+ ImportTable = (PIMAGE_IMPORT_DESCRIPTOR)RtlImageDirectoryEntryToData(VaToPa(BootDdDTE->DllBase),
+ TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &ImportTableSize);
+ for (;(ImportTable->Name != 0) && (ImportTable->FirstThunk != 0);ImportTable++)
+ {
+ PIMAGE_THUNK_DATA ThunkData = (PIMAGE_THUNK_DATA)VaToPa(RVA(BootDdDTE->DllBase, ImportTable->FirstThunk));
+
+ while (((PIMAGE_THUNK_DATA)ThunkData)->u1.AddressOfData != 0)
+ {
+ ThunkData->u1.Function = (ULONG)VaToPa((PVOID)ThunkData->u1.Function);
+ ThunkData++;
+ }
+ }
+
+ /* Relocate image to PA */
+ NtHeaders = RtlImageNtHeader(VaToPa(BootDdDTE->DllBase));
+ if (!NtHeaders)
+ return EIO;
+ Status = LdrRelocateImageWithBias(
+ VaToPa(BootDdDTE->DllBase),
+ NtHeaders->OptionalHeader.ImageBase - (ULONG_PTR)BootDdDTE->DllBase,
+ "FreeLdr",
+ TRUE,
+ TRUE, /* in case of conflict still return success */
+ FALSE);
+ if (!Status)
+ return EIO;
+
+ /* Call the entrypoint */
+ EntryPoint = VaToPa(BootDdDTE->EntryPoint);
+ (*EntryPoint)(NULL, NULL);
+
+ return ESUCCESS;
+}
+
+/* EOF */
diff --git a/boot/freeldr/freeldr/freeldr.c b/boot/freeldr/freeldr/freeldr.c
index 3fa9b476b06..5761ed9460c 100644
--- a/boot/freeldr/freeldr/freeldr.c
+++ b/boot/freeldr/freeldr/freeldr.c
@@ -20,6 +20,9 @@
#include
#include
+VOID NTAPI HalpInitializePciStubs(VOID);
+VOID NTAPI HalpInitBusHandler(VOID);
+
VOID BootMain(LPSTR CmdLine)
{
CmdLineParse(CmdLine);
@@ -44,5 +47,7 @@ VOID BootMain(LPSTR CmdLine)
return;
}
+ HalpInitializePciStubs();
+ HalpInitBusHandler();
RunLoader();
}
diff --git a/boot/freeldr/freeldr/freeldr.rbuild b/boot/freeldr/freeldr/freeldr.rbuild
index dc83aaa9878..b513dabca44 100644
--- a/boot/freeldr/freeldr/freeldr.rbuild
+++ b/boot/freeldr/freeldr/freeldr.rbuild
@@ -7,6 +7,7 @@
freeldr_startup
freeldr_base64k
freeldr_base
+ mini_hal
freeldr_arch
freeldr_main
rossym
diff --git a/boot/freeldr/freeldr/freeldr_arch.rbuild b/boot/freeldr/freeldr/freeldr_arch.rbuild
index b4abb4a703c..2132587edcf 100644
--- a/boot/freeldr/freeldr/freeldr_arch.rbuild
+++ b/boot/freeldr/freeldr/freeldr_arch.rbuild
@@ -7,6 +7,7 @@
include/reactos/libs
include/reactos/elf
+
@@ -14,6 +15,7 @@
archmach.c
custom.c
drivemap.c
+ halstub.c
hardware.c
hwacpi.c
hwapm.c
@@ -24,6 +26,7 @@
loader.c
machpc.c
miscboot.c
+ ntoskrnl.c
pccons.c
pcdisk.c
pcmem.c
diff --git a/boot/freeldr/freeldr/freeldr_base.rbuild b/boot/freeldr/freeldr/freeldr_base.rbuild
index 9f42e74ee92..fd3487f3242 100644
--- a/boot/freeldr/freeldr/freeldr_base.rbuild
+++ b/boot/freeldr/freeldr/freeldr_base.rbuild
@@ -22,6 +22,7 @@
disk.c
partition.c
ramdisk.c
+ scsiport.c
ext2.c
diff --git a/boot/freeldr/freeldr/fs/fs.c b/boot/freeldr/freeldr/fs/fs.c
index a2c5c495e2c..eb23215f789 100644
--- a/boot/freeldr/freeldr/fs/fs.c
+++ b/boot/freeldr/freeldr/fs/fs.c
@@ -319,6 +319,13 @@ LONG ArcOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
FileData[DeviceId].FuncTable = NULL;
return ret;
}
+ else if (!*FileName)
+ {
+ /* Done, caller wanted to open the raw device */
+ *FileId = DeviceId;
+ pDevice->ReferenceCount++;
+ return ESUCCESS;
+ }
/* Try to detect the file system */
#ifndef _M_ARM
diff --git a/boot/freeldr/freeldr/include/debug.h b/boot/freeldr/freeldr/include/debug.h
index c7d57f6fb49..1e855360491 100644
--- a/boot/freeldr/freeldr/include/debug.h
+++ b/boot/freeldr/freeldr/include/debug.h
@@ -35,6 +35,7 @@
#define DPRINT_HWDETECT 0x00000400 // OR this with DebugPrintMask to enable hardware detection messages
#define DPRINT_WINDOWS 0x00000800 // OR this with DebugPrintMask to enable messages from Windows loader
#define DPRINT_PELOADER 0x00001000 // OR this with DebugPrintMask to enable messages from PE images loader
+#define DPRINT_SCSIPORT 0x00002000 // OR this with DebugPrintMask to enable messages from SCSI miniport
extern char* g_file;
extern int g_line;
diff --git a/boot/freeldr/freeldr/include/disk.h b/boot/freeldr/freeldr/include/disk.h
index d29c31ac8c1..daaaa495e55 100644
--- a/boot/freeldr/freeldr/include/disk.h
+++ b/boot/freeldr/freeldr/include/disk.h
@@ -140,3 +140,5 @@ BOOLEAN DiskGetPartitionEntry(ULONG DriveNumber, ULONG PartitionNumber, PPARTITI
BOOLEAN DiskGetFirstPartitionEntry(PMASTER_BOOT_RECORD MasterBootRecord, PPARTITION_TABLE_ENTRY PartitionTableEntry);
BOOLEAN DiskGetFirstExtendedPartitionEntry(PMASTER_BOOT_RECORD MasterBootRecord, PPARTITION_TABLE_ENTRY PartitionTableEntry);
BOOLEAN DiskReadBootRecord(ULONG DriveNumber, ULONGLONG LogicalSectorNumber, PMASTER_BOOT_RECORD BootRecord);
+
+ULONG LoadBootDeviceDriver(VOID);
diff --git a/boot/freeldr/freeldr/include/freeldr.h b/boot/freeldr/freeldr/include/freeldr.h
index b053700c922..c80fed6b6f8 100644
--- a/boot/freeldr/freeldr/include/freeldr.h
+++ b/boot/freeldr/freeldr/include/freeldr.h
@@ -40,6 +40,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -61,6 +62,8 @@
#include
#include
#include
+#include
+#include
/* file system headers */
#include
#include
diff --git a/boot/freeldr/freeldr/include/mm.h b/boot/freeldr/freeldr/include/mm.h
index 36a47e0079f..a7840e37791 100644
--- a/boot/freeldr/freeldr/include/mm.h
+++ b/boot/freeldr/freeldr/include/mm.h
@@ -116,3 +116,7 @@ PVOID MmAllocateHighestMemoryBelowAddress(ULONG MemorySize, PVOID DesiredAddress
PVOID MmHeapAlloc(ULONG MemorySize);
VOID MmHeapFree(PVOID MemoryPointer);
+
+#define ExAllocatePool(pool, size) MmHeapAlloc(size)
+#define ExAllocatePoolWithTag(pool, size, tag) MmHeapAlloc(size)
+#define ExFreePool(p) MmHeapFree(p)
diff --git a/boot/freeldr/freeldr/include/ntoskrnl.h b/boot/freeldr/freeldr/include/ntoskrnl.h
new file mode 100644
index 00000000000..fee926ddce5
--- /dev/null
+++ b/boot/freeldr/freeldr/include/ntoskrnl.h
@@ -0,0 +1,19 @@
+#include
+#undef _NTHAL_
+#undef DECLSPEC_IMPORT
+#define DECLSPEC_IMPORT
+#undef NTSYSAPI
+#define NTSYSAPI
+
+#include
+
+typedef GUID UUID;
+
+/* Windows Device Driver Kit */
+#include
+#include
+
+/* Disk stuff */
+typedef PVOID PLOADER_PARAMETER_BLOCK;
+#include
+#include
diff --git a/boot/freeldr/freeldr/include/reactos.h b/boot/freeldr/freeldr/include/reactos.h
index 0bc48f2cc15..82e23abb946 100644
--- a/boot/freeldr/freeldr/include/reactos.h
+++ b/boot/freeldr/freeldr/include/reactos.h
@@ -73,6 +73,14 @@ VOID ReactOSRunSetupLoader(VOID);
// ARC Path Functions
//
///////////////////////////////////////////////////////////////////////////////////////
+BOOLEAN
+DissectArcPath2(
+ IN CHAR* ArcPath,
+ OUT ULONG* x,
+ OUT ULONG* y,
+ OUT ULONG* z,
+ OUT ULONG* Partition,
+ OUT ULONG *PathSyntax);
BOOLEAN DissectArcPath(CHAR *ArcPath, CHAR *BootPath, ULONG* BootDrive, ULONG* BootPartition);
VOID ConstructArcPath(PCHAR ArcPath, PCHAR SystemFolder, ULONG Disk, ULONG Partition);
ULONG ConvertArcNameToBiosDriveNumber(PCHAR ArcPath);
diff --git a/boot/freeldr/freeldr/mm/mm.c b/boot/freeldr/freeldr/mm/mm.c
index c06bb00f632..f4a4c69b095 100644
--- a/boot/freeldr/freeldr/mm/mm.c
+++ b/boot/freeldr/freeldr/mm/mm.c
@@ -345,3 +345,54 @@ PPAGE_LOOKUP_TABLE_ITEM MmGetMemoryMap(ULONG *NoEntries)
return RealPageLookupTable;
}
+
+#undef ExAllocatePoolWithTag
+NTKERNELAPI
+PVOID
+NTAPI
+ExAllocatePoolWithTag(
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes,
+ IN ULONG Tag)
+{
+ return MmHeapAlloc(NumberOfBytes);
+}
+
+#undef ExFreePool
+NTKERNELAPI
+VOID
+NTAPI
+ExFreePool(
+ IN PVOID P)
+{
+ MmHeapFree(P);
+}
+
+PVOID
+NTAPI
+RtlAllocateHeap(
+ IN PVOID HeapHandle,
+ IN ULONG Flags,
+ IN SIZE_T Size)
+{
+ PVOID ptr;
+
+ ptr = MmHeapAlloc(Size);
+ if (ptr && (Flags & HEAP_ZERO_MEMORY))
+ {
+ RtlZeroMemory(ptr, Size);
+ }
+
+ return ptr;
+}
+
+BOOLEAN
+NTAPI
+RtlFreeHeap(
+ IN PVOID HeapHandle,
+ IN ULONG Flags,
+ IN PVOID HeapBase)
+{
+ MmHeapFree(HeapBase);
+ return TRUE;
+}
diff --git a/boot/freeldr/freeldr/reactos/arcname.c b/boot/freeldr/freeldr/reactos/arcname.c
index e46022c6c6b..3ca69fadb51 100644
--- a/boot/freeldr/freeldr/reactos/arcname.c
+++ b/boot/freeldr/freeldr/reactos/arcname.c
@@ -104,6 +104,62 @@ BOOLEAN DissectArcPath(CHAR *ArcPath, CHAR *BootPath, ULONG* BootDrive, ULONG* B
return TRUE;
}
+/* PathSyntax: scsi() = 0, multi() = 1, ramdisk() = 2 */
+BOOLEAN
+DissectArcPath2(
+ IN CHAR* ArcPath,
+ OUT ULONG* x,
+ OUT ULONG* y,
+ OUT ULONG* z,
+ OUT ULONG* Partition,
+ OUT ULONG *PathSyntax)
+{
+ /* Detect ramdisk() */
+ if (_strnicmp(ArcPath, "ramdisk(0)", 10) == 0)
+ {
+ *x = *y = *z = 0;
+ *Partition = 1;
+ *PathSyntax = 2;
+ return TRUE;
+ }
+ /* Detect scsi()disk()rdisk()partition() */
+ else if (sscanf(ArcPath, "scsi(%lu)disk(%lu)rdisk(%lu)partition(%lu)", x, y, z, Partition) == 4)
+ {
+ *PathSyntax = 0;
+ return TRUE;
+ }
+ /* Detect scsi()cdrom()fdisk() */
+ else if (sscanf(ArcPath, "scsi(%lu)cdrom(%lu)fdisk(%lu)", x, y, z) == 3)
+ {
+ *Partition = 0;
+ *PathSyntax = 0;
+ return TRUE;
+ }
+ /* Detect multi()disk()rdisk()partition() */
+ else if (sscanf(ArcPath, "multi(%lu)disk(%lu)rdisk(%lu)partition(%lu)", x, y, z, Partition) == 4)
+ {
+ *PathSyntax = 1;
+ return TRUE;
+ }
+ /* Detect multi()disk()cdrom() */
+ else if (sscanf(ArcPath, "multi(%lu)disk(%lu)cdrom(%lu)", x, y, z) == 3)
+ {
+ *Partition = 1;
+ *PathSyntax = 1;
+ return TRUE;
+ }
+ /* Detect multi()disk()fdisk() */
+ else if (sscanf(ArcPath, "multi(%lu)disk(%lu)fdisk(%lu)", x, y, z) == 3)
+ {
+ *Partition = 1;
+ *PathSyntax = 1;
+ return TRUE;
+ }
+
+ /* Unknown syntax */
+ return FALSE;
+}
+
VOID ConstructArcPath(PCHAR ArcPath, PCHAR SystemFolder, ULONG Disk, ULONG Partition)
{
char tmp[50];
diff --git a/boot/freeldr/freeldr/windows/peloader.c b/boot/freeldr/freeldr/windows/peloader.c
index f4c731e7254..7a87e282545 100644
--- a/boot/freeldr/freeldr/windows/peloader.c
+++ b/boot/freeldr/freeldr/windows/peloader.c
@@ -56,7 +56,7 @@ WinLdrCheckForLoadedDll(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
PLDR_DATA_TABLE_ENTRY DataTableEntry;
LIST_ENTRY *ModuleEntry;
- DPRINTM(DPRINT_PELOADER, "WinLdrCheckForLoadedDll: DllName %X, LoadedEntry: %X\n",
+ DPRINTM(DPRINT_PELOADER, "WinLdrCheckForLoadedDll: DllName %s, LoadedEntry: %X\n",
DllName, LoadedEntry);
/* Just go through each entry in the LoadOrderList and compare loaded module's
@@ -277,7 +277,7 @@ WinLdrLoadImage(IN PCHAR FileName,
Status = ArcOpen(FileName, OpenReadOnly, &FileId);
if (Status != ESUCCESS)
{
- UiMessageBox("Can not open the file");
+ //UiMessageBox("Can not open the file");
return FALSE;
}
diff --git a/boot/freeldr/freeldr/windows/winldr.c b/boot/freeldr/freeldr/windows/winldr.c
index 0121773e3a8..4ba7b1bcb29 100644
--- a/boot/freeldr/freeldr/windows/winldr.c
+++ b/boot/freeldr/freeldr/windows/winldr.c
@@ -37,6 +37,7 @@ extern char reactos_arc_strings[32][256];
extern BOOLEAN UseRealHeap;
extern ULONG LoaderPagesSpanned;
+extern BOOLEAN AcpiPresent;
BOOLEAN
WinLdrCheckForLoadedDll(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
@@ -196,6 +197,13 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
Extension->MinorVersion = VersionToBoot & 0xFF;
Extension->Profile.Status = 2;
+ /* Check if ACPI is present */
+ if (AcpiPresent)
+ {
+ /* See KiRosFrldrLpbToNtLpb for details */
+ Extension->AcpiTable = (PVOID)1;
+ }
+
/* Load drivers database */
strcpy(MiscFiles, BootPath);
strcat(MiscFiles, "AppPatch\\drvmain.sdb");
diff --git a/dll/cpl/desk/lang/pl-PL.rc b/dll/cpl/desk/lang/pl-PL.rc
index 0c4761b23e3..01d7c796d70 100644
--- a/dll/cpl/desk/lang/pl-PL.rc
+++ b/dll/cpl/desk/lang/pl-PL.rc
@@ -63,7 +63,7 @@ BEGIN
WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
LTEXT "Schemat kolorw", IDC_STATIC, 7, 140, 64, 7
COMBOBOX IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- PUSHBUTTON "&Effects...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15
+ PUSHBUTTON "&Efekty...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15
PUSHBUTTON "Zaawansowane", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15
END
@@ -108,24 +108,24 @@ END
IDD_EFFAPPEARANCE DIALOGEX DISCARDABLE 0, 0, 285, 185
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE
-CAPTION "Effects"
+CAPTION "Efekty"
FONT 8, "MS Shell Dlg"
BEGIN
- CONTROL "&Use the following transition effect for menus and tooltips:",IDC_EFFAPPEARANCE_ANIMATION,"button",
+ CONTROL "&Uyj nastpujcego efektu przejcia dla menu i etykiet narzdzi:",IDC_EFFAPPEARANCE_ANIMATION,"button",
BS_AUTOCHECKBOX | WS_TABSTOP, 10, 5, 285, 19
COMBOBOX IDC_EFFAPPEARANCE_ANIMATIONTYPE, 20, 25, 80, 19 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_CHILD | WS_VSCROLL | WS_TABSTOP
- CONTROL "U&se the following method to smooth edges of screen fonts:",IDC_EFFAPPEARANCE_SMOOTHING,"button",
+ CONTROL "U&yj nastpujcej metody wygadzania krawdzi czcionek ekranowych:",IDC_EFFAPPEARANCE_SMOOTHING,"button",
BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 42, 285, 19
COMBOBOX IDC_EFFAPPEARANCE_SMOOTHINGTYPE, 20, 62, 80, 19 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_DISABLED
- CONTROL "Us&e large icons",IDC_EFFAPPEARANCE_LARGEICONS,"button",
+ CONTROL "Uy&j duych ikon",IDC_EFFAPPEARANCE_LARGEICONS,"button",
BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 80, 285, 19
- CONTROL "Show sh&adows under menus",IDC_EFFAPPEARANCE_SETDROPSHADOW,"button",
+ CONTROL "Pok&a cienie pod menu",IDC_EFFAPPEARANCE_SETDROPSHADOW,"button",
BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 95, 285, 19
- CONTROL "Show &window contents while dragging",IDC_EFFAPPEARANCE_DRAGFULLWINDOWS,"button",
+ CONTROL "Poka za&warto okna podczas przecigania",IDC_EFFAPPEARANCE_DRAGFULLWINDOWS,"button",
BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 110, 285, 19
- CONTROL "&Hide underlined letters for keyboard navigation until I press the Alt key",IDC_EFFAPPEARANCE_KEYBOARDCUES,"button",
+ CONTROL "U&kryj podkrelenie liter do nawigacji klawiatur dopki nie nacisn klawisza Alt",IDC_EFFAPPEARANCE_KEYBOARDCUES,"button",
BS_AUTOCHECKBOX | WS_TABSTOP, 10, 125, 285, 19
- PUSHBUTTON "Cancel", IDCANCEL, 226, 165, 50, 14
+ PUSHBUTTON "Anuluj", IDCANCEL, 226, 165, 50, 14
DEFPUSHBUTTON "OK", IDOK, 172, 165, 50, 14
END
@@ -188,13 +188,13 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_SLIDEEFFECT "Slide effect"
- IDS_FADEEFFECT "Fade effect"
+ IDS_SLIDEEFFECT "Efekt przewijania"
+ IDS_FADEEFFECT "Efekt przejcia"
END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_STANDARDEFFECT "Standard"
+ IDS_STANDARDEFFECT "Standardowe"
IDS_CLEARTYPEEFFECT "ClearType"
END
diff --git a/dll/directx/amstream/amstream.c b/dll/directx/amstream/amstream.c
index 9e4d45aef04..f8ae2a6e39b 100644
--- a/dll/directx/amstream/amstream.c
+++ b/dll/directx/amstream/amstream.c
@@ -35,7 +35,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(amstream);
typedef struct {
- IAMMultiMediaStream lpVtbl;
+ const IAMMultiMediaStreamVtbl *lpVtbl;
LONG ref;
IGraphBuilder* pFilterGraph;
IPin* ipin;
@@ -63,7 +63,7 @@ HRESULT AM_create(IUnknown *pUnkOuter, LPVOID *ppObj)
return E_OUTOFMEMORY;
}
- object->lpVtbl.lpVtbl = &AM_Vtbl;
+ object->lpVtbl = &AM_Vtbl;
object->ref = 1;
*ppObj = object;
@@ -129,7 +129,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_GetMediaStream(IAMMultiMediaStream
MSPID PurposeId;
unsigned int i;
- TRACE("(%p/%p)->(%p,%p)\n", This, iface, idPurpose, ppMediaStream);
+ TRACE("(%p/%p)->(%s,%p)\n", This, iface, debugstr_guid(idPurpose), ppMediaStream);
for (i = 0; i < This->nbStreams; i++)
{
@@ -214,7 +214,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_Initialize(IAMMultiMediaStream* if
IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface;
HRESULT hr = S_OK;
- FIXME("(%p/%p)->(%x,%x,%p) partial stub!\n", This, iface, (DWORD)StreamType, dwFlags, pFilterGraph);
+ TRACE("(%p/%p)->(%x,%x,%p)\n", This, iface, (DWORD)StreamType, dwFlags, pFilterGraph);
if (pFilterGraph)
{
@@ -238,9 +238,17 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_GetFilterGraph(IAMMultiMediaStream
{
IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface;
- FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppGraphBuilder);
+ TRACE("(%p/%p)->(%p)\n", This, iface, ppGraphBuilder);
- return E_NOTIMPL;
+ if (!ppGraphBuilder)
+ return E_POINTER;
+
+ if (This->pFilterGraph)
+ return IFilterGraph_QueryInterface(This->pFilterGraph, &IID_IGraphBuilder, (void**)ppGraphBuilder);
+ else
+ *ppGraphBuilder = NULL;
+
+ return S_OK;
}
static HRESULT WINAPI IAMMultiMediaStreamImpl_GetFilter(IAMMultiMediaStream* iface, IMediaStreamFilter** ppFilter)
@@ -260,7 +268,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_AddMediaStream(IAMMultiMediaStream
IMediaStream* pStream;
IMediaStream** pNewStreams;
- FIXME("(%p/%p)->(%p,%p,%x,%p) partial stub!\n", This, iface, pStreamObject, PurposeId, dwFlags, ppNewStream);
+ FIXME("(%p/%p)->(%p,%s,%x,%p) partial stub!\n", This, iface, pStreamObject, debugstr_guid(PurposeId), dwFlags, ppNewStream);
if (IsEqualGUID(PurposeId, &MSPID_PrimaryVideo))
hr = DirectDrawMediaStream_create((IMultiMediaStream*)iface, PurposeId, This->StreamType, &pStream);
@@ -341,6 +349,14 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_OpenFile(IAMMultiMediaStream* ifac
goto end;
}
+ /* If Initialize was not called before, we do it here */
+ if (!This->pFilterGraph)
+ {
+ ret = IAMMultiMediaStream_Initialize(iface, STREAMTYPE_READ, 0, NULL);
+ if (FAILED(ret))
+ goto end;
+ }
+
ret = IFilterGraph_QueryInterface(This->pFilterGraph, &IID_IGraphBuilder, (void**)&This->GraphBuilder);
if(ret != S_OK)
{
diff --git a/dll/directx/amstream/mediastream.c b/dll/directx/amstream/mediastream.c
index bf197aadcf7..dc4ec642cf9 100644
--- a/dll/directx/amstream/mediastream.c
+++ b/dll/directx/amstream/mediastream.c
@@ -29,13 +29,14 @@
#include "wingdi.h"
#include "amstream_private.h"
-#include "ddstream.h"
#include "amstream.h"
+#include "ddstream.h"
+
WINE_DEFAULT_DEBUG_CHANNEL(amstream);
typedef struct {
- IMediaStream lpVtbl;
+ const IMediaStreamVtbl *lpVtbl;
LONG ref;
IMultiMediaStream* Parent;
MSPID PurposeId;
@@ -43,7 +44,7 @@ typedef struct {
} IMediaStreamImpl;
typedef struct {
- IDirectDrawMediaStream lpVtbl;
+ const IDirectDrawMediaStreamVtbl *lpVtbl;
LONG ref;
IMultiMediaStream* Parent;
MSPID PurposeId;
@@ -57,7 +58,7 @@ HRESULT MediaStream_create(IMultiMediaStream* Parent, const MSPID* pPurposeId, S
{
IMediaStreamImpl* object;
- TRACE("(%p,%p,%p)\n", Parent, pPurposeId, ppMediaStream);
+ TRACE("(%p,%s,%p)\n", Parent, debugstr_guid(pPurposeId), ppMediaStream);
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMediaStreamImpl));
if (!object)
@@ -66,7 +67,7 @@ HRESULT MediaStream_create(IMultiMediaStream* Parent, const MSPID* pPurposeId, S
return E_OUTOFMEMORY;
}
- object->lpVtbl.lpVtbl = &MediaStream_Vtbl;
+ object->lpVtbl = &MediaStream_Vtbl;
object->ref = 1;
object->Parent = Parent;
@@ -197,7 +198,7 @@ HRESULT DirectDrawMediaStream_create(IMultiMediaStream* Parent, const MSPID* pPu
{
IDirectDrawMediaStreamImpl* object;
- TRACE("(%p,%p,%p)\n", Parent, pPurposeId, ppMediaStream);
+ TRACE("(%p,%s,%p)\n", Parent, debugstr_guid(pPurposeId), ppMediaStream);
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMediaStreamImpl));
if (!object)
@@ -206,7 +207,7 @@ HRESULT DirectDrawMediaStream_create(IMultiMediaStream* Parent, const MSPID* pPu
return E_OUTOFMEMORY;
}
- object->lpVtbl.lpVtbl = &DirectDrawMediaStream_Vtbl;
+ object->lpVtbl = &DirectDrawMediaStream_Vtbl;
object->ref = 1;
object->Parent = Parent;
diff --git a/dll/directx/amstream/mediastreamfilter.c b/dll/directx/amstream/mediastreamfilter.c
index af335fdeafe..4a4d7123e16 100644
--- a/dll/directx/amstream/mediastreamfilter.c
+++ b/dll/directx/amstream/mediastreamfilter.c
@@ -36,7 +36,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(amstream);
typedef struct {
- IMediaStreamFilter lpVtbl;
+ const IMediaStreamFilterVtbl *lpVtbl;
LONG ref;
CRITICAL_SECTION csFilter;
FILTER_STATE state;
@@ -63,7 +63,7 @@ HRESULT MediaStreamFilter_create(IUnknown *pUnkOuter, LPVOID *ppObj)
return E_OUTOFMEMORY;
}
- object->lpVtbl.lpVtbl = &MediaStreamFilter_Vtbl;
+ object->lpVtbl = &MediaStreamFilter_Vtbl;
object->ref = 1;
*ppObj = object;
@@ -120,7 +120,7 @@ static ULONG WINAPI MediaStreamFilterImpl_Release(IMediaStreamFilter * iface)
if (!refCount)
{
- This->lpVtbl.lpVtbl = NULL;
+ This->lpVtbl = NULL;
HeapFree(GetProcessHeap(), 0, This);
}
diff --git a/dll/directx/amstream/regsvr.c b/dll/directx/amstream/regsvr.c
index 028c68de754..9c328914749 100644
--- a/dll/directx/amstream/regsvr.c
+++ b/dll/directx/amstream/regsvr.c
@@ -456,6 +456,13 @@ static struct regsvr_coclass const coclass_list[] = {
"Both"
},
+ { &CLSID_MediaStreamFilter,
+ "SFilter Class",
+ NULL,
+ "amstream.dll",
+ "Both"
+ },
+
{ NULL } /* list terminator */
};
diff --git a/dll/directx/bdaplgin/bdaplgin.cpp b/dll/directx/bdaplgin/bdaplgin.cpp
index ddc22972c36..39ddb8a2ccb 100644
--- a/dll/directx/bdaplgin/bdaplgin.cpp
+++ b/dll/directx/bdaplgin/bdaplgin.cpp
@@ -12,7 +12,6 @@
const GUID CBDADeviceControl_GUID = {STATIC_KSMETHODSETID_BdaChangeSync};
const GUID CBDAPinControl_GUID = {0x0DED49D5, 0xA8B7, 0x4d5d, {0x97, 0xA1, 0x12, 0xB0, 0xC1, 0x95, 0x87, 0x4D}};
-
static INTERFACE_TABLE InterfaceTable[] =
{
{&CBDADeviceControl_GUID, CBDADeviceControl_fnConstructor},
diff --git a/dll/directx/bdaplgin/devicecontrol.cpp b/dll/directx/bdaplgin/devicecontrol.cpp
index 3bbdfbe0df6..661eba547a0 100644
--- a/dll/directx/bdaplgin/devicecontrol.cpp
+++ b/dll/directx/bdaplgin/devicecontrol.cpp
@@ -469,7 +469,7 @@ CBDADeviceControl::GetControlNode(ULONG ulInputPinId, ULONG ulOutputPinId, ULONG
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDADeviceControl::GetControlNode: hr %lx, BytesReturned %lu PinId %lu Dummy %lu\n", hr, BytesReturned, PinId, Dummy);
+ swprintf(Buffer, L"CBDADeviceControl::GetControlNode: hr %lx, BytesReturned %lu PinId %lu\n", hr, BytesReturned, PinId);
OutputDebugStringW(Buffer);
#endif
@@ -498,6 +498,10 @@ CBDADeviceControl_fnConstructor(
IBaseFilter *pFilter = NULL;
HANDLE hFile;
+#ifdef BDAPLGIN_TRACE
+ OutputDebugStringW(L"CBDADeviceControl_fnConstructor\n");
+#endif
+
//DebugBreak();
// sanity check
@@ -540,10 +544,6 @@ CBDADeviceControl_fnConstructor(
// construct device control
CBDADeviceControl * handler = new CBDADeviceControl(pUnkOuter, pFilter, hFile);
-#ifdef BDAPLGIN_TRACE
- OutputDebugStringW(L"CBDADeviceControl_fnConstructor\n");
-#endif
-
if (!handler)
return E_OUTOFMEMORY;
diff --git a/dll/directx/bdaplgin/pincontrol.cpp b/dll/directx/bdaplgin/pincontrol.cpp
index 324f7a1f6a1..a5b99128b16 100644
--- a/dll/directx/bdaplgin/pincontrol.cpp
+++ b/dll/directx/bdaplgin/pincontrol.cpp
@@ -9,7 +9,8 @@
#include "precomp.h"
-const GUID IID_IBDA_PinControl = {0x0DED49D5, 0xA8B7, 0x4d5d, {0x97, 0xA1, 0x12, 0xB0, 0xC1, 0x95, 0x87, 0x4D}};
+const GUID IID_IBDA_PinControl = {0x0DED49D5, 0xA8B7, 0x4d5d, {0x97, 0xA1, 0x12, 0xB0, 0xC1, 0x95, 0x87, 0x4D}};
+const GUID KSPROPSETID_BdaPinControl = {0x0ded49d5, 0xa8b7, 0x4d5d, {0x97, 0xa1, 0x12, 0xb0, 0xc1, 0x95, 0x87, 0x4d}};
const GUID IID_IPin = {0x56a86891, 0x0ad4, 0x11ce, {0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}};
class CBDAPinControl : public IBDA_PinControl
@@ -39,7 +40,11 @@ public:
CBDAPinControl(HANDLE hFile, IBDA_NetworkProvider * pProvider, IPin * pConnectedPin) : m_Ref(0), m_Handle(hFile), m_pProvider(pProvider), m_pConnectedPin(pConnectedPin){};
- virtual ~CBDAPinControl(){};
+ virtual ~CBDAPinControl()
+ {
+ //m_pConnectedPin->Release();
+ //m_pProvider->Release();
+ };
protected:
LONG m_Ref;
@@ -54,6 +59,7 @@ CBDAPinControl::QueryInterface(
IN REFIID refiid,
OUT PVOID* Output)
{
+ *Output = NULL;
if (IsEqualGUID(refiid, IID_IUnknown))
{
*Output = PVOID(this);
@@ -67,6 +73,15 @@ CBDAPinControl::QueryInterface(
return NOERROR;
}
+#ifdef BDAPLGIN_TRACE
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CBDAPinControl::QueryInterface: NoInterface for %s", lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+#endif
+
return E_NOINTERFACE;
}
//-------------------------------------------------------------------
@@ -76,22 +91,50 @@ HRESULT
STDMETHODCALLTYPE
CBDAPinControl::GetPinID(ULONG *pulPinID)
{
+ KSPROPERTY Property;
+ ULONG BytesReturned;
+ HRESULT hr;
+
+ // setup request
+ Property.Set = KSPROPSETID_BdaPinControl;
+ Property.Id = KSPROPERTY_BDA_PIN_ID;
+ Property.Flags = KSPROPERTY_TYPE_GET;
+
+ // perform request
+ hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), pulPinID, sizeof(ULONG), &BytesReturned);
+
#ifdef BDAPLGIN_TRACE
- OutputDebugStringW(L"CBDAPinControl::GetPinID: NotImplemented\n");
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"CBDAPinControl::GetPinID: hr %lx pulPinID %lu BytesReturned %lx\n", hr, *pulPinID, BytesReturned);
+ OutputDebugStringW(Buffer);
#endif
- return E_NOTIMPL;
+ return hr;
}
HRESULT
STDMETHODCALLTYPE
CBDAPinControl::GetPinType(ULONG *pulPinType)
{
+ KSPROPERTY Property;
+ ULONG BytesReturned;
+ HRESULT hr;
+
+ // setup request
+ Property.Set = KSPROPSETID_BdaPinControl;
+ Property.Id = KSPROPERTY_BDA_PIN_TYPE;
+ Property.Flags = KSPROPERTY_TYPE_GET;
+
+ // perform request
+ hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), pulPinType, sizeof(ULONG), &BytesReturned);
+
#ifdef BDAPLGIN_TRACE
- OutputDebugStringW(L"CBDAPinControl::GetPinType: NotImplemented\n");
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"CBDAPinControl::GetPinType: hr %lx pulPinType %lu BytesReturned %lx\n", hr, *pulPinType, BytesReturned);
+ OutputDebugStringW(Buffer);
#endif
- return E_NOTIMPL;
+ return hr;
}
HRESULT
@@ -112,15 +155,29 @@ CBDAPinControl_fnConstructor(
REFIID riid,
LPVOID * ppv)
{
+ IPin * pConnectedPin = NULL;
+ IBDA_NetworkProvider * pNetworkProvider = NULL;
+ HANDLE hFile = INVALID_HANDLE_VALUE;
+
+#if 0
+ if (!IsEqualGUID(riid, IID_IUnknown))
+ {
+#ifdef BDAPLGIN_TRACE
+ OutputDebugStringW(L"CBDAPinControl_fnConstructor: Expected IUnknown\n");
+#endif
+ return REGDB_E_CLASSNOTREG;
+ }
+
+
HRESULT hr;
IKsObject * pObject = NULL;
- IPin * pPin = NULL, * pConnectedPin = NULL;
+ IPin * pPin = NULL;
IEnumFilters *pEnumFilters = NULL;
- IBDA_NetworkProvider * pNetworkProvider = NULL;
+
IBaseFilter * ppFilter[1];
PIN_INFO PinInfo;
FILTER_INFO FilterInfo;
- HANDLE hFile = INVALID_HANDLE_VALUE;
+
if (!pUnkOuter)
return E_POINTER;
@@ -225,6 +282,7 @@ CBDAPinControl_fnConstructor(
// no network provider interface in graph
return E_NOINTERFACE;
}
+#endif
CBDAPinControl * handler = new CBDAPinControl(hFile, pNetworkProvider, pConnectedPin);
@@ -232,6 +290,8 @@ CBDAPinControl_fnConstructor(
OutputDebugStringW(L"CBDAPinControl_fnConstructor");
#endif
+ DebugBreak();
+
if (!handler)
return E_OUTOFMEMORY;
diff --git a/dll/directx/bdaplgin/precomp.h b/dll/directx/bdaplgin/precomp.h
index 4365afb807e..771a798f2c3 100644
--- a/dll/directx/bdaplgin/precomp.h
+++ b/dll/directx/bdaplgin/precomp.h
@@ -1,6 +1,7 @@
#ifndef PRECOMP_H__
#define PRECOMP_H__
+//#define BDAPLGIN_TRACE
#define BUILDING_KS
#define _KSDDK_
#include
diff --git a/dll/directx/ksproxy/basicaudio.cpp b/dll/directx/ksproxy/basicaudio.cpp
index 20b5e8aee24..7fec05f2140 100644
--- a/dll/directx/ksproxy/basicaudio.cpp
+++ b/dll/directx/ksproxy/basicaudio.cpp
@@ -8,8 +8,6 @@
*/
#include "precomp.h"
-const GUID IID_IBasicAudio = {0x56a868b3, 0x0ad4, 0x11ce, {0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}};
-
class CKsBasicAudio : public IBasicAudio,
public IDistributorNotify
{
@@ -99,7 +97,7 @@ HRESULT
STDMETHODCALLTYPE
CKsBasicAudio::Stop()
{
- OutputDebugString("UNIMPLEMENTED\n");
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
return E_NOTIMPL;
}
@@ -107,7 +105,7 @@ HRESULT
STDMETHODCALLTYPE
CKsBasicAudio::Pause()
{
- OutputDebugString("UNIMPLEMENTED\n");
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
return E_NOTIMPL;
}
@@ -116,7 +114,7 @@ STDMETHODCALLTYPE
CKsBasicAudio::Run(
REFERENCE_TIME tStart)
{
- OutputDebugString("UNIMPLEMENTED\n");
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
return E_NOTIMPL;
}
@@ -125,7 +123,7 @@ STDMETHODCALLTYPE
CKsBasicAudio::SetSyncSource(
IReferenceClock *pClock)
{
- OutputDebugString("UNIMPLEMENTED\n");
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
return E_NOTIMPL;
}
@@ -133,7 +131,7 @@ HRESULT
STDMETHODCALLTYPE
CKsBasicAudio::NotifyGraphChange()
{
- OutputDebugString("UNIMPLEMENTED\n");
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
return E_NOTIMPL;
}
@@ -146,7 +144,7 @@ STDMETHODCALLTYPE
CKsBasicAudio::GetTypeInfoCount(
UINT *pctinfo)
{
- OutputDebugString("UNIMPLEMENTED\n");
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
return E_NOTIMPL;
}
@@ -157,7 +155,7 @@ CKsBasicAudio::GetTypeInfo(
LCID lcid,
ITypeInfo **ppTInfo)
{
- OutputDebugString("UNIMPLEMENTED\n");
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
return E_NOTIMPL;
}
@@ -170,7 +168,7 @@ CKsBasicAudio::GetIDsOfNames(
LCID lcid,
DISPID *rgDispId)
{
- OutputDebugString("UNIMPLEMENTED\n");
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
return E_NOTIMPL;
}
@@ -186,7 +184,7 @@ CKsBasicAudio::Invoke(
EXCEPINFO *pExcepInfo,
UINT *puArgErr)
{
- OutputDebugString("UNIMPLEMENTED\n");
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
return E_NOTIMPL;
}
@@ -199,7 +197,7 @@ STDMETHODCALLTYPE
CKsBasicAudio::put_Volume(
long lVolume)
{
- OutputDebugString("UNIMPLEMENTED\n");
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
return E_NOTIMPL;
}
@@ -209,7 +207,7 @@ STDMETHODCALLTYPE
CKsBasicAudio::get_Volume(
long *plVolume)
{
- OutputDebugString("UNIMPLEMENTED\n");
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
return E_NOTIMPL;
}
@@ -219,7 +217,7 @@ STDMETHODCALLTYPE
CKsBasicAudio::put_Balance(
long lBalance)
{
- OutputDebugString("UNIMPLEMENTED\n");
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
return E_NOTIMPL;
}
@@ -229,7 +227,7 @@ STDMETHODCALLTYPE
CKsBasicAudio::get_Balance(
long *plBalance)
{
- OutputDebugString("UNIMPLEMENTED\n");
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
return E_NOTIMPL;
}
@@ -240,6 +238,8 @@ CKsBasicAudio_Constructor(
REFIID riid,
LPVOID * ppv)
{
+ OutputDebugStringW(L"CKsBasicAudio_Constructor\n");
+
CKsBasicAudio * handler = new CKsBasicAudio();
if (!handler)
diff --git a/dll/directx/ksproxy/clockforward.cpp b/dll/directx/ksproxy/clockforward.cpp
index a5889386f0a..cba65b3cdf0 100644
--- a/dll/directx/ksproxy/clockforward.cpp
+++ b/dll/directx/ksproxy/clockforward.cpp
@@ -8,7 +8,6 @@
*/
#include "precomp.h"
-const GUID IID_IDistributorNotify = {0x56a868af, 0x0ad4, 0x11ce, {0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}};
const GUID KSCATEGORY_CLOCK = {0x53172480, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
class CKsClockForwarder : public IDistributorNotify,
@@ -158,6 +157,8 @@ CKsClockForwarder_Constructor(
HRESULT hr;
HANDLE handle;
+ OutputDebugStringW(L"CKsClockForwarder_Constructor\n");
+
// open default clock
hr = KsOpenDefaultDevice(KSCATEGORY_CLOCK, GENERIC_READ | GENERIC_WRITE, &handle);
diff --git a/dll/directx/ksproxy/cvpconfig.cpp b/dll/directx/ksproxy/cvpconfig.cpp
index ffe4fc7bb5f..91d2006ad49 100644
--- a/dll/directx/ksproxy/cvpconfig.cpp
+++ b/dll/directx/ksproxy/cvpconfig.cpp
@@ -8,8 +8,6 @@
*/
#include "precomp.h"
-const GUID IID_IVPConfig = {0xbc29a660, 0x30e3, 0x11d0, {0x9e, 0x69, 0x0, 0xc0, 0x4f, 0xd7, 0xc1, 0x5b}};
-
class CVPConfig : public IVPConfig,
public IDistributorNotify
{
@@ -302,6 +300,8 @@ CVPConfig_Constructor(
REFIID riid,
LPVOID * ppv)
{
+ OutputDebugStringW(L"CVPConfig_Constructor\n");
+
CVPConfig * handler = new CVPConfig();
if (!handler)
diff --git a/dll/directx/ksproxy/cvpvbiconfig.cpp b/dll/directx/ksproxy/cvpvbiconfig.cpp
index 061d332c53f..016d060aa24 100644
--- a/dll/directx/ksproxy/cvpvbiconfig.cpp
+++ b/dll/directx/ksproxy/cvpvbiconfig.cpp
@@ -8,8 +8,6 @@
*/
#include "precomp.h"
-const GUID IID_IVPVBIConfig = {0xec529b00, 0x1a1f, 0x11d1, {0xba, 0xd9, 0x0, 0x60, 0x97, 0x44, 0x11, 0x1a}};
-
class CVPVBIConfig : public IVPVBIConfig,
public IDistributorNotify
{
@@ -274,6 +272,8 @@ CVPVBIConfig_Constructor(
REFIID riid,
LPVOID * ppv)
{
+ OutputDebugStringW(L"CVPVBIConfig_Constructor\n");
+
CVPVBIConfig * handler = new CVPVBIConfig();
if (!handler)
diff --git a/dll/directx/ksproxy/datatype.cpp b/dll/directx/ksproxy/datatype.cpp
index 37f47e231af..3d2d925f19c 100644
--- a/dll/directx/ksproxy/datatype.cpp
+++ b/dll/directx/ksproxy/datatype.cpp
@@ -11,9 +11,6 @@
/* FIXME guid mess */
const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
const GUID IID_IClassFactory = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
-const GUID IID_IKsDataTypeHandler = {0x5FFBAA02, 0x49A3, 0x11D0, {0x9F, 0x36, 0x00, 0xAA, 0x00, 0xA2, 0x16, 0xA1}};
-const GUID MEDIATYPE_Audio = {0x73647561, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
-
class CKsDataTypeHandler : public IKsDataTypeHandler
{
@@ -138,6 +135,8 @@ CKsDataTypeHandler_Constructor (
REFIID riid,
LPVOID * ppv)
{
+ OutputDebugStringW(L"CKsDataTypeHandler_Constructor\n");
+
CKsDataTypeHandler * handler = new CKsDataTypeHandler();
if (!handler)
diff --git a/dll/directx/ksproxy/enum_mediatypes.cpp b/dll/directx/ksproxy/enum_mediatypes.cpp
new file mode 100644
index 00000000000..9895c2290cc
--- /dev/null
+++ b/dll/directx/ksproxy/enum_mediatypes.cpp
@@ -0,0 +1,188 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Network Provider for MPEG2 based networks
+ * FILE: dll/directx/msdvbnp/enum_mediatypes.cpp
+ * PURPOSE: IEnumMediaTypes interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CEnumMediaTypes : public IEnumMediaTypes
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+ if (!m_Ref)
+ {
+ delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+ HRESULT STDMETHODCALLTYPE Next(ULONG cMediaTypes, AM_MEDIA_TYPE **ppMediaTypes, ULONG *pcFetched);
+ HRESULT STDMETHODCALLTYPE Skip(ULONG cMediaTypes);
+ HRESULT STDMETHODCALLTYPE Reset();
+ HRESULT STDMETHODCALLTYPE Clone(IEnumMediaTypes **ppEnum);
+
+
+ CEnumMediaTypes(ULONG MediaTypeCount, AM_MEDIA_TYPE * MediaTypes) : m_Ref(0), m_MediaTypeCount(MediaTypeCount), m_MediaTypes(MediaTypes), m_Index(0){};
+ virtual ~CEnumMediaTypes(){};
+
+protected:
+ LONG m_Ref;
+ ULONG m_MediaTypeCount;
+ AM_MEDIA_TYPE * m_MediaTypes;
+ ULONG m_Index;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::QueryInterface(
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ if (IsEqualGUID(refiid, IID_IUnknown))
+ {
+ *Output = PVOID(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+ if (IsEqualGUID(refiid, IID_IEnumMediaTypes))
+ {
+ *Output = (IEnumMediaTypes*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CEnumMediaTypes::QueryInterface: NoInterface for %s\n", lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+
+ return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IEnumMediaTypes
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Next(
+ ULONG cMediaTypes,
+ AM_MEDIA_TYPE **ppMediaTypes,
+ ULONG *pcFetched)
+{
+ ULONG i = 0;
+ AM_MEDIA_TYPE * MediaType;
+
+ if (!ppMediaTypes)
+ return E_POINTER;
+
+ if (cMediaTypes > 1 && !pcFetched)
+ return E_INVALIDARG;
+
+ while(i < cMediaTypes)
+ {
+ if (m_Index + i >= m_MediaTypeCount)
+ break;
+
+ MediaType = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
+ if (!MediaType)
+ break;
+
+ CopyMemory(MediaType, &m_MediaTypes[m_Index + i], sizeof(AM_MEDIA_TYPE));
+ ppMediaTypes[i] = MediaType;
+ i++;
+ }
+
+ if (pcFetched)
+ {
+ *pcFetched = i;
+ }
+
+ m_Index += i;
+
+ if (i < cMediaTypes)
+ return S_FALSE;
+ else
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Skip(
+ ULONG cMediaTypes)
+{
+ if (cMediaTypes + m_Index >= m_MediaTypeCount)
+ {
+ return S_FALSE;
+ }
+
+ m_Index += cMediaTypes;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Reset()
+{
+ m_Index = 0;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Clone(
+ IEnumMediaTypes **ppEnum)
+{
+ OutputDebugStringW(L"CEnumMediaTypes::Clone : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CEnumMediaTypes_fnConstructor(
+ ULONG MediaTypeCount,
+ AM_MEDIA_TYPE * MediaTypes,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ CEnumMediaTypes * handler = new CEnumMediaTypes(MediaTypeCount, MediaTypes);
+
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(riid, &lpstr);
+ swprintf(Buffer, L"CEnumMediaTypes_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (!handler)
+ {
+ CoTaskMemFree(MediaTypes);
+ return E_OUTOFMEMORY;
+ }
+
+ if (FAILED(handler->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete handler;
+ return E_NOINTERFACE;
+ }
+
+ return NOERROR;
+}
+
diff --git a/dll/directx/ksproxy/enumpins.cpp b/dll/directx/ksproxy/enumpins.cpp
new file mode 100644
index 00000000000..5c0f0ecd7bd
--- /dev/null
+++ b/dll/directx/ksproxy/enumpins.cpp
@@ -0,0 +1,159 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Network Provider for MPEG2 based networks
+ * FILE: dll/directx/msdvbnp/enumpins.cpp
+ * PURPOSE: IEnumPins interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CEnumPins : public IEnumPins
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+ if (!m_Ref)
+ {
+ delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+
+ HRESULT STDMETHODCALLTYPE Next(ULONG cPins, IPin **ppPins, ULONG *pcFetched);
+ HRESULT STDMETHODCALLTYPE Skip(ULONG cPins);
+ HRESULT STDMETHODCALLTYPE Reset();
+ HRESULT STDMETHODCALLTYPE Clone(IEnumPins **ppEnum);
+
+ CEnumPins(std::vector Pins) : m_Ref(0), m_Pins(Pins), m_Index(0){};
+ virtual ~CEnumPins(){};
+
+protected:
+ LONG m_Ref;
+ std::vector m_Pins;
+ ULONG m_Index;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::QueryInterface(
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ *Output = NULL;
+ if (IsEqualGUID(refiid, IID_IUnknown))
+ {
+ *Output = PVOID(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+ if (IsEqualGUID(refiid, IID_IEnumPins))
+ {
+ *Output = (IEnumPins*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Next(
+ ULONG cPins,
+ IPin **ppPins,
+ ULONG *pcFetched)
+{
+ ULONG i = 0;
+
+ if (!ppPins)
+ return E_POINTER;
+
+ if (cPins > 1 && !pcFetched)
+ return E_INVALIDARG;
+
+ while(i < cPins)
+ {
+ if (m_Index + i >= m_Pins.size())
+ break;
+
+ ppPins[i] = m_Pins[m_Index + i];
+ m_Pins[m_Index + i]->AddRef();
+
+ i++;
+ }
+
+ if (pcFetched)
+ {
+ *pcFetched = i;
+ }
+
+ m_Index += i;
+ if (i < cPins)
+ return S_FALSE;
+ else
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Skip(
+ ULONG cPins)
+{
+ if (cPins + m_Index >= m_Pins.size())
+ {
+ return S_FALSE;
+ }
+
+ m_Index += cPins;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Reset()
+{
+ m_Index = 0;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Clone(
+ IEnumPins **ppEnum)
+{
+ OutputDebugStringW(L"CEnumPins::Clone : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CEnumPins_fnConstructor(
+ std::vector Pins,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ CEnumPins * handler = new CEnumPins(Pins);
+
+ if (!handler)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(handler->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete handler;
+ return E_NOINTERFACE;
+ }
+
+ return NOERROR;
+}
\ No newline at end of file
diff --git a/dll/directx/ksproxy/input_pin.cpp b/dll/directx/ksproxy/input_pin.cpp
new file mode 100644
index 00000000000..2b08b16e89e
--- /dev/null
+++ b/dll/directx/ksproxy/input_pin.cpp
@@ -0,0 +1,983 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE: dll/directx/ksproxy/input_cpp.cpp
+ * PURPOSE: InputPin of Proxy Filter
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+const GUID IID_IKsPinEx = {0x7bb38260L, 0xd19c, 0x11d2, {0xb3, 0x8a, 0x00, 0xa0, 0xc9, 0x5e, 0xc2, 0x2e}};
+const GUID KSPROPSETID_Connection = {0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
+
+KSPIN_INTERFACE StandardPinInterface =
+{
+ {STATIC_KSINTERFACESETID_Standard},
+ KSINTERFACE_STANDARD_STREAMING,
+ 0
+};
+
+KSPIN_MEDIUM StandardPinMedium =
+{
+ {STATIC_KSMEDIUMSETID_Standard},
+ KSMEDIUM_TYPE_ANYINSTANCE,
+ 0
+};
+
+
+class CInputPin : public IPin,
+ public IKsPropertySet,
+ public IKsControl,
+ public IKsObject,
+ public IKsPinEx,
+ public IMemInputPin
+/*
+ public IQualityControl,
+ public IKsPinPipe,
+ public ISpecifyPropertyPages,
+ public IStreamBuilder,
+ public IKsPinFactory,
+ public IKsAggregateControl
+*/
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+ if (!m_Ref)
+ {
+ delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+ //IPin methods
+ HRESULT STDMETHODCALLTYPE Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt);
+ HRESULT STDMETHODCALLTYPE ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt);
+ HRESULT STDMETHODCALLTYPE Disconnect();
+ HRESULT STDMETHODCALLTYPE ConnectedTo(IPin **pPin);
+ HRESULT STDMETHODCALLTYPE ConnectionMediaType(AM_MEDIA_TYPE *pmt);
+ HRESULT STDMETHODCALLTYPE QueryPinInfo(PIN_INFO *pInfo);
+ HRESULT STDMETHODCALLTYPE QueryDirection(PIN_DIRECTION *pPinDir);
+ HRESULT STDMETHODCALLTYPE QueryId(LPWSTR *Id);
+ HRESULT STDMETHODCALLTYPE QueryAccept(const AM_MEDIA_TYPE *pmt);
+ HRESULT STDMETHODCALLTYPE EnumMediaTypes(IEnumMediaTypes **ppEnum);
+ HRESULT STDMETHODCALLTYPE QueryInternalConnections(IPin **apPin, ULONG *nPin);
+ HRESULT STDMETHODCALLTYPE EndOfStream();
+ HRESULT STDMETHODCALLTYPE BeginFlush();
+ HRESULT STDMETHODCALLTYPE EndFlush();
+ HRESULT STDMETHODCALLTYPE NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+
+ //IKsObject methods
+ HANDLE STDMETHODCALLTYPE KsGetObjectHandle();
+
+ //IKsPropertySet
+ HRESULT STDMETHODCALLTYPE Set(REFGUID guidPropSet, DWORD dwPropID, LPVOID pInstanceData, DWORD cbInstanceData, LPVOID pPropData, DWORD cbPropData);
+ HRESULT STDMETHODCALLTYPE Get(REFGUID guidPropSet, DWORD dwPropID, LPVOID pInstanceData, DWORD cbInstanceData, LPVOID pPropData, DWORD cbPropData, DWORD *pcbReturned);
+ HRESULT STDMETHODCALLTYPE QuerySupported(REFGUID guidPropSet, DWORD dwPropID, DWORD *pTypeSupport);
+
+ //IKsControl
+ HRESULT STDMETHODCALLTYPE KsProperty(PKSPROPERTY Property, ULONG PropertyLength, LPVOID PropertyData, ULONG DataLength, ULONG* BytesReturned);
+ HRESULT STDMETHODCALLTYPE KsMethod(PKSMETHOD Method, ULONG MethodLength, LPVOID MethodData, ULONG DataLength, ULONG* BytesReturned);
+ HRESULT STDMETHODCALLTYPE KsEvent(PKSEVENT Event, ULONG EventLength, LPVOID EventData, ULONG DataLength, ULONG* BytesReturned);
+
+ //IKsPin
+ HRESULT STDMETHODCALLTYPE KsQueryMediums(PKSMULTIPLE_ITEM* MediumList);
+ HRESULT STDMETHODCALLTYPE KsQueryInterfaces(PKSMULTIPLE_ITEM* InterfaceList);
+ HRESULT STDMETHODCALLTYPE KsCreateSinkPinHandle(KSPIN_INTERFACE& Interface, KSPIN_MEDIUM& Medium);
+ HRESULT STDMETHODCALLTYPE KsGetCurrentCommunication(KSPIN_COMMUNICATION *Communication, KSPIN_INTERFACE *Interface, KSPIN_MEDIUM *Medium);
+ HRESULT STDMETHODCALLTYPE KsPropagateAcquire();
+ HRESULT STDMETHODCALLTYPE KsDeliver(IMediaSample* Sample, ULONG Flags);
+ HRESULT STDMETHODCALLTYPE KsMediaSamplesCompleted(PKSSTREAM_SEGMENT StreamSegment);
+ IMemAllocator * STDMETHODCALLTYPE KsPeekAllocator(KSPEEKOPERATION Operation);
+ HRESULT STDMETHODCALLTYPE KsReceiveAllocator(IMemAllocator *MemAllocator);
+ HRESULT STDMETHODCALLTYPE KsRenegotiateAllocator();
+ LONG STDMETHODCALLTYPE KsIncrementPendingIoCount();
+ LONG STDMETHODCALLTYPE KsDecrementPendingIoCount();
+ HRESULT STDMETHODCALLTYPE KsQualityNotify(ULONG Proportion, REFERENCE_TIME TimeDelta);
+ // IKsPinEx
+ VOID STDMETHODCALLTYPE KsNotifyError(IMediaSample* Sample, HRESULT hr);
+
+ //IMemInputPin
+ HRESULT STDMETHODCALLTYPE GetAllocator(IMemAllocator **ppAllocator);
+ HRESULT STDMETHODCALLTYPE NotifyAllocator(IMemAllocator *pAllocator, BOOL bReadOnly);
+ HRESULT STDMETHODCALLTYPE GetAllocatorRequirements(ALLOCATOR_PROPERTIES *pProps);
+ HRESULT STDMETHODCALLTYPE Receive(IMediaSample *pSample);
+ HRESULT STDMETHODCALLTYPE ReceiveMultiple(IMediaSample **pSamples, long nSamples, long *nSamplesProcessed);
+ HRESULT STDMETHODCALLTYPE ReceiveCanBlock( void);
+
+ //---------------------------------------------------------------
+ HRESULT STDMETHODCALLTYPE CheckFormat(const AM_MEDIA_TYPE *pmt);
+ HRESULT STDMETHODCALLTYPE CreatePin();
+ HRESULT STDMETHODCALLTYPE CreatePinHandle(PKSPIN_MEDIUM Medium, PKSPIN_INTERFACE Interface, PKSDATAFORMAT DataFormat);
+ CInputPin(IBaseFilter * ParentFilter, LPCWSTR PinName, HANDLE hFilter, ULONG PinId, KSPIN_COMMUNICATION Communication) : m_Ref(0), m_ParentFilter(ParentFilter), m_PinName(PinName), m_hFilter(hFilter), m_hPin(0), m_PinId(PinId), m_MemAllocator(0), m_IoCount(0), m_Communication(Communication), m_Pin(0){};
+ virtual ~CInputPin(){};
+
+protected:
+ LONG m_Ref;
+ IBaseFilter * m_ParentFilter;
+ LPCWSTR m_PinName;
+ HANDLE m_hFilter;
+ HANDLE m_hPin;
+ ULONG m_PinId;
+ IMemAllocator * m_MemAllocator;
+ LONG m_IoCount;
+ KSPIN_COMMUNICATION m_Communication;
+ KSPIN_INTERFACE m_Interface;
+ KSPIN_MEDIUM m_Medium;
+ IPin * m_Pin;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::QueryInterface(
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ *Output = NULL;
+
+ if (IsEqualGUID(refiid, IID_IUnknown) ||
+ IsEqualGUID(refiid, IID_IPin))
+ {
+ *Output = PVOID(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+ else if (IsEqualGUID(refiid, IID_IMemInputPin))
+ {
+ *Output = (IMemInputPin*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+ else if (IsEqualGUID(refiid, IID_IKsObject))
+ {
+ if (!m_hPin)
+ {
+ HRESULT hr = CreatePin();
+ if (FAILED(hr))
+ return hr;
+ }
+
+ *Output = (IKsObject*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+ else if (IsEqualGUID(refiid, IID_IKsPropertySet))
+ {
+ if (!m_hPin)
+ {
+ HRESULT hr = CreatePin();
+ if (FAILED(hr))
+ return hr;
+ }
+
+ *Output = (IKsPropertySet*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+ else if (IsEqualGUID(refiid, IID_IKsControl))
+ {
+ if (!m_hPin)
+ {
+ HRESULT hr = CreatePin();
+ if (FAILED(hr))
+ return hr;
+ }
+
+ *Output = (IKsControl*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+ else if (IsEqualGUID(refiid, IID_IKsPin) ||
+ IsEqualGUID(refiid, IID_IKsPinEx))
+ {
+ if (!m_hPin)
+ {
+ HRESULT hr = CreatePin();
+ if (FAILED(hr))
+ return hr;
+ }
+
+ *Output = (IKsPinEx*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CInputPin::QueryInterface: NoInterface for %s\n", lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+
+ return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IMemInputPin
+//
+
+ //
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::GetAllocator(IMemAllocator **ppAllocator)
+{
+ OutputDebugStringW(L"CInputPin::GetAllocator\n");
+ return VFW_E_NO_ALLOCATOR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::NotifyAllocator(IMemAllocator *pAllocator, BOOL bReadOnly)
+{
+ if (pAllocator)
+ {
+ pAllocator->AddRef();
+ }
+
+ if (m_MemAllocator)
+ {
+ m_MemAllocator->Release();
+ }
+
+ m_MemAllocator = pAllocator;
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::GetAllocatorRequirements(ALLOCATOR_PROPERTIES *pProps)
+{
+ KSALLOCATOR_FRAMING Framing;
+ KSPROPERTY Property;
+ HRESULT hr;
+ ULONG BytesReturned;
+
+ Property.Set = KSPROPSETID_Connection;
+ Property.Id = KSPROPERTY_CONNECTION_ALLOCATORFRAMING;
+ Property.Flags = KSPROPERTY_TYPE_SET;
+
+ hr = KsProperty(&Property, sizeof(KSPROPERTY), (PVOID)&Framing, sizeof(KSALLOCATOR_FRAMING), &BytesReturned);
+ if (SUCCEEDED(hr))
+ {
+ pProps->cBuffers = Framing.Frames;
+ pProps->cbBuffer = Framing.FrameSize;
+ pProps->cbAlign = Framing.FileAlignment;
+ pProps->cbPrefix = 0;
+ return hr;
+ }
+ else
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::Receive(IMediaSample *pSample)
+{
+ OutputDebugStringW(L"CInputPin::Receive NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::ReceiveMultiple(IMediaSample **pSamples, long nSamples, long *nSamplesProcessed)
+{
+ OutputDebugStringW(L"CInputPin::ReceiveMultiple NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::ReceiveCanBlock( void)
+{
+ OutputDebugStringW(L"CInputPin::ReceiveCanBlock NotImplemented\n");
+ return S_FALSE;
+}
+
+
+//-------------------------------------------------------------------
+// IKsPin
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsQueryMediums(
+ PKSMULTIPLE_ITEM* MediumList)
+{
+ return KsGetMultiplePinFactoryItems(m_hFilter, m_PinId, KSPROPERTY_PIN_MEDIUMS, (PVOID*)MediumList);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsQueryInterfaces(
+ PKSMULTIPLE_ITEM* InterfaceList)
+{
+ return KsGetMultiplePinFactoryItems(m_hFilter, m_PinId, KSPROPERTY_PIN_INTERFACES, (PVOID*)InterfaceList);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsCreateSinkPinHandle(
+ KSPIN_INTERFACE& Interface,
+ KSPIN_MEDIUM& Medium)
+{
+ OutputDebugStringW(L"CInputPin::KsCreateSinkPinHandle NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsGetCurrentCommunication(
+ KSPIN_COMMUNICATION *Communication,
+ KSPIN_INTERFACE *Interface,
+ KSPIN_MEDIUM *Medium)
+{
+ if (Communication)
+ {
+ *Communication = m_Communication;
+ }
+
+ if (Interface)
+ {
+ if (!m_hPin)
+ return VFW_E_NOT_CONNECTED;
+
+ CopyMemory(Interface, &m_Interface, sizeof(KSPIN_INTERFACE));
+ }
+
+ if (Medium)
+ {
+ if (!m_hPin)
+ return VFW_E_NOT_CONNECTED;
+
+ CopyMemory(Medium, &m_Medium, sizeof(KSPIN_MEDIUM));
+ }
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsPropagateAcquire()
+{
+ OutputDebugStringW(L"CInputPin::KsPropagateAcquire NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsDeliver(
+ IMediaSample* Sample,
+ ULONG Flags)
+{
+ return E_FAIL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsMediaSamplesCompleted(PKSSTREAM_SEGMENT StreamSegment)
+{
+ return NOERROR;
+}
+
+IMemAllocator *
+STDMETHODCALLTYPE
+CInputPin::KsPeekAllocator(KSPEEKOPERATION Operation)
+{
+ if (Operation == KsPeekOperation_AddRef)
+ {
+ // add reference on allocator
+ m_MemAllocator->AddRef();
+ }
+
+ return m_MemAllocator;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsReceiveAllocator(IMemAllocator *MemAllocator)
+{
+ if (MemAllocator)
+ {
+ MemAllocator->AddRef();
+ }
+
+ if (m_MemAllocator)
+ {
+ m_MemAllocator->Release();
+ }
+
+ m_MemAllocator = MemAllocator;
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsRenegotiateAllocator()
+{
+ return E_FAIL;
+}
+
+LONG
+STDMETHODCALLTYPE
+CInputPin::KsIncrementPendingIoCount()
+{
+ return InterlockedIncrement((volatile LONG*)&m_IoCount);
+}
+
+LONG
+STDMETHODCALLTYPE
+CInputPin::KsDecrementPendingIoCount()
+{
+ return InterlockedDecrement((volatile LONG*)&m_IoCount);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsQualityNotify(
+ ULONG Proportion,
+ REFERENCE_TIME TimeDelta)
+{
+ OutputDebugStringW(L"CInputPin::KsQualityNotify NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IKsPinEx
+//
+
+VOID
+STDMETHODCALLTYPE
+CInputPin::KsNotifyError(
+ IMediaSample* Sample,
+ HRESULT hr)
+{
+ OutputDebugStringW(L"CInputPin::KsNotifyError NotImplemented\n");
+}
+
+
+//-------------------------------------------------------------------
+// IKsPropertySet
+//
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsProperty(
+ PKSPROPERTY Property,
+ ULONG PropertyLength,
+ LPVOID PropertyData,
+ ULONG DataLength,
+ ULONG* BytesReturned)
+{
+ return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_PROPERTY, (PVOID)Property, PropertyLength, (PVOID)PropertyData, DataLength, BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsMethod(
+ PKSMETHOD Method,
+ ULONG MethodLength,
+ LPVOID MethodData,
+ ULONG DataLength,
+ ULONG* BytesReturned)
+{
+ return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_METHOD, (PVOID)Method, MethodLength, (PVOID)MethodData, DataLength, BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsEvent(
+ PKSEVENT Event,
+ ULONG EventLength,
+ LPVOID EventData,
+ ULONG DataLength,
+ ULONG* BytesReturned)
+{
+ if (EventLength)
+ return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_ENABLE_EVENT, (PVOID)Event, EventLength, (PVOID)EventData, DataLength, BytesReturned);
+ else
+ return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_DISABLE_EVENT, (PVOID)Event, EventLength, NULL, 0, BytesReturned);
+}
+
+
+//-------------------------------------------------------------------
+// IKsPropertySet
+//
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::Set(
+ REFGUID guidPropSet,
+ DWORD dwPropID,
+ LPVOID pInstanceData,
+ DWORD cbInstanceData,
+ LPVOID pPropData,
+ DWORD cbPropData)
+{
+ ULONG BytesReturned;
+
+ if (cbInstanceData)
+ {
+ PKSPROPERTY Property = (PKSPROPERTY)CoTaskMemAlloc(sizeof(KSPROPERTY) + cbInstanceData);
+ if (!Property)
+ return E_OUTOFMEMORY;
+
+ Property->Set = guidPropSet;
+ Property->Id = dwPropID;
+ Property->Flags = KSPROPERTY_TYPE_SET;
+
+ CopyMemory((Property+1), pInstanceData, cbInstanceData);
+
+ HRESULT hr = KsProperty(Property, sizeof(KSPROPERTY) + cbInstanceData, pPropData, cbPropData, &BytesReturned);
+ CoTaskMemFree(Property);
+ return hr;
+ }
+ else
+ {
+ KSPROPERTY Property;
+
+ Property.Set = guidPropSet;
+ Property.Id = dwPropID;
+ Property.Flags = KSPROPERTY_TYPE_SET;
+
+ HRESULT hr = KsProperty(&Property, sizeof(KSPROPERTY), pPropData, cbPropData, &BytesReturned);
+ return hr;
+ }
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::Get(
+ REFGUID guidPropSet,
+ DWORD dwPropID,
+ LPVOID pInstanceData,
+ DWORD cbInstanceData,
+ LPVOID pPropData,
+ DWORD cbPropData,
+ DWORD *pcbReturned)
+{
+ ULONG BytesReturned;
+
+ if (cbInstanceData)
+ {
+ PKSPROPERTY Property = (PKSPROPERTY)CoTaskMemAlloc(sizeof(KSPROPERTY) + cbInstanceData);
+ if (!Property)
+ return E_OUTOFMEMORY;
+
+ Property->Set = guidPropSet;
+ Property->Id = dwPropID;
+ Property->Flags = KSPROPERTY_TYPE_GET;
+
+ CopyMemory((Property+1), pInstanceData, cbInstanceData);
+
+ HRESULT hr = KsProperty(Property, sizeof(KSPROPERTY) + cbInstanceData, pPropData, cbPropData, &BytesReturned);
+ CoTaskMemFree(Property);
+ return hr;
+ }
+ else
+ {
+ KSPROPERTY Property;
+
+ Property.Set = guidPropSet;
+ Property.Id = dwPropID;
+ Property.Flags = KSPROPERTY_TYPE_GET;
+
+ HRESULT hr = KsProperty(&Property, sizeof(KSPROPERTY), pPropData, cbPropData, &BytesReturned);
+ return hr;
+ }
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::QuerySupported(
+ REFGUID guidPropSet,
+ DWORD dwPropID,
+ DWORD *pTypeSupport)
+{
+ KSPROPERTY Property;
+ ULONG BytesReturned;
+
+ Property.Set = guidPropSet;
+ Property.Id = dwPropID;
+ Property.Flags = KSPROPERTY_TYPE_SETSUPPORT;
+
+ return KsProperty(&Property, sizeof(KSPROPERTY), pTypeSupport, sizeof(DWORD), &BytesReturned);
+}
+
+
+//-------------------------------------------------------------------
+// IKsObject
+//
+HANDLE
+STDMETHODCALLTYPE
+CInputPin::KsGetObjectHandle()
+{
+ OutputDebugStringW(L"CInputPin::KsGetObjectHandle CALLED\n");
+
+ //FIXME
+ // return pin handle
+ return m_hPin;
+}
+
+//-------------------------------------------------------------------
+// IPin interface
+//
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
+{
+ OutputDebugStringW(L"CInputPin::Connect NotImplemented\n");
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt)
+{
+ HRESULT hr;
+
+ if (m_Pin)
+ {
+ OutputDebugStringW(L"CInputPin::ReceiveConnection already connected\n");
+ return VFW_E_ALREADY_CONNECTED;
+ }
+
+ // first check format
+ hr = CheckFormat(pmt);
+ if (FAILED(hr))
+ return hr;
+
+ if (FAILED(CheckFormat(pmt)))
+ return hr;
+
+ //FIXME create pin
+ m_Pin = pConnector;
+ m_Pin->AddRef();
+
+ OutputDebugStringW(L"CInputPin::ReceiveConnection NotImplemented\n");
+ return S_OK;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::Disconnect( void)
+{
+ OutputDebugStringW(L"CInputPin::Disconnect NotImplemented\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::ConnectedTo(IPin **pPin)
+{
+ if (!pPin)
+ return E_POINTER;
+
+ if (m_Pin)
+ {
+ // increment reference count
+ m_Pin->AddRef();
+ *pPin = m_Pin;
+ return S_OK;
+ }
+
+ *pPin = NULL;
+ return VFW_E_NOT_CONNECTED;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt)
+{
+ OutputDebugStringW(L"CInputPin::ConnectionMediaType NotImplemented\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::QueryPinInfo(PIN_INFO *pInfo)
+{
+ wcscpy(pInfo->achName, m_PinName);
+ pInfo->dir = PINDIR_INPUT;
+ pInfo->pFilter = m_ParentFilter;
+ m_ParentFilter->AddRef();
+
+ return S_OK;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::QueryDirection(PIN_DIRECTION *pPinDir)
+{
+ if (pPinDir)
+ {
+ *pPinDir = PINDIR_INPUT;
+ return S_OK;
+ }
+
+ return E_POINTER;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::QueryId(LPWSTR *Id)
+{
+ *Id = (LPWSTR)CoTaskMemAlloc((wcslen(m_PinName)+1)*sizeof(WCHAR));
+ if (!*Id)
+ return E_OUTOFMEMORY;
+
+ wcscpy(*Id, m_PinName);
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::QueryAccept(
+ const AM_MEDIA_TYPE *pmt)
+{
+ return CheckFormat(pmt);
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::EnumMediaTypes(IEnumMediaTypes **ppEnum)
+{
+ return CEnumMediaTypes_fnConstructor(0, NULL, IID_IEnumMediaTypes, (void**)ppEnum);
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::QueryInternalConnections(IPin **apPin, ULONG *nPin)
+{
+ OutputDebugStringW(L"CInputPin::QueryInternalConnections NotImplemented\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::EndOfStream( void)
+{
+ OutputDebugStringW(L"CInputPin::EndOfStream NotImplemented\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::BeginFlush( void)
+{
+ OutputDebugStringW(L"CInputPin::BeginFlush NotImplemented\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::EndFlush( void)
+{
+ OutputDebugStringW(L"CInputPin::EndFlush NotImplemented\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
+{
+ OutputDebugStringW(L"CInputPin::NewSegment NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::CheckFormat(
+ const AM_MEDIA_TYPE *pmt)
+{
+ KSP_PIN Property;
+ PKSMULTIPLE_ITEM MultipleItem;
+ PKSDATAFORMAT DataFormat;
+ ULONG BytesReturned;
+ HRESULT hr;
+
+ // prepare request
+ Property.Property.Set = KSPROPSETID_Pin;
+ Property.Property.Id = KSPROPERTY_PIN_DATARANGES;
+ Property.Property.Flags = KSPROPERTY_TYPE_GET;
+ Property.PinId = m_PinId;
+ Property.Reserved = 0;
+
+ // query for size of dataranges
+ hr = KsSynchronousDeviceControl(m_hFilter, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), NULL, 0, &BytesReturned);
+
+ if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_MORE_DATA))
+ {
+ // allocate dataranges buffer
+ MultipleItem = (PKSMULTIPLE_ITEM)CoTaskMemAlloc(BytesReturned);
+
+ if (!MultipleItem)
+ return E_OUTOFMEMORY;
+
+ // query dataranges
+ hr = KsSynchronousDeviceControl(m_hFilter, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), (PVOID)MultipleItem, BytesReturned, &BytesReturned);
+
+ if (FAILED(hr))
+ {
+ // failed to query data ranges
+ CoTaskMemFree(MultipleItem);
+ return hr;
+ }
+
+ DataFormat = (PKSDATAFORMAT)(MultipleItem + 1);
+ for(ULONG Index = 0; Index < MultipleItem->Count; Index++)
+ {
+ if (IsEqualGUID(pmt->majortype, DataFormat->MajorFormat) &&
+ IsEqualGUID(pmt->subtype, DataFormat->SubFormat) &&
+ IsEqualGUID(pmt->formattype, DataFormat->Specifier))
+ {
+ // format is supported
+ CoTaskMemFree(MultipleItem);
+ OutputDebugStringW(L"CInputPin::CheckFormat format OK\n");
+ return S_OK;
+ }
+ DataFormat = (PKSDATAFORMAT)((ULONG_PTR)DataFormat + DataFormat->FormatSize);
+ }
+ //format is not supported
+ CoTaskMemFree(MultipleItem);
+ }
+ return S_FALSE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::CreatePin()
+{
+ PKSMULTIPLE_ITEM MediumList;
+ PKSMULTIPLE_ITEM InterfaceList;
+ PKSMULTIPLE_ITEM DataFormatList = NULL;
+ PKSPIN_MEDIUM Medium;
+ PKSDATAFORMAT DataFormat;
+ PKSPIN_INTERFACE Interface;
+ HRESULT hr;
+
+ // query for pin medium
+ hr = KsQueryMediums(&MediumList);
+ if (FAILED(hr))
+ return hr;
+
+ // query for pin interface
+ hr = KsQueryInterfaces(&InterfaceList);
+ if (FAILED(hr))
+ {
+ // failed
+ CoTaskMemFree(MediumList);
+ return hr;
+ }
+
+ // get data ranges
+ hr = KsGetMultiplePinFactoryItems(m_hFilter, m_PinId, KSPROPERTY_PIN_DATARANGES, (PVOID*)&DataFormatList);
+ if (FAILED(hr) || DataFormatList->Count == 0)
+ {
+ // failed
+ CoTaskMemFree(MediumList);
+ CoTaskMemFree(InterfaceList);
+ if (DataFormatList)
+ CoTaskMemFree(DataFormatList);
+
+ return hr;
+ }
+
+ if (MediumList->Count)
+ {
+ //use first available medium
+ Medium = (PKSPIN_MEDIUM)(MediumList + 1);
+ }
+ else
+ {
+ // default to standard medium
+ Medium = &StandardPinMedium;
+ }
+
+ if (InterfaceList->Count)
+ {
+ //use first available interface
+ Interface = (PKSPIN_INTERFACE)(InterfaceList + 1);
+ }
+ else
+ {
+ // default to standard interface
+ Interface = &StandardPinInterface;
+ }
+
+ //FIXME determine format
+ // use first available format
+ DataFormat = (PKSDATAFORMAT) (DataFormatList + 1);
+
+ // now create pin
+ hr = CreatePinHandle(Medium, Interface, DataFormat);
+
+ // free medium / interface / dataformat
+ CoTaskMemFree(DataFormatList);
+ CoTaskMemFree(MediumList);
+ CoTaskMemFree(InterfaceList);
+
+ return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::CreatePinHandle(
+ PKSPIN_MEDIUM Medium,
+ PKSPIN_INTERFACE Interface,
+ PKSDATAFORMAT DataFormat)
+{
+ PKSPIN_CONNECT PinConnect;
+ ULONG Length;
+ HRESULT hr;
+
+ // calc format size
+ Length = sizeof(KSPIN_CONNECT) + DataFormat->FormatSize;
+
+ // allocate pin connect
+ PinConnect = (PKSPIN_CONNECT)CoTaskMemAlloc(Length);
+ if (!PinConnect)
+ {
+ // failed
+ return E_OUTOFMEMORY;
+ }
+
+ // setup request
+ CopyMemory(&PinConnect->Interface, Interface, sizeof(KSPIN_INTERFACE));
+ CopyMemory(&PinConnect->Medium, Medium, sizeof(KSPIN_MEDIUM));
+ PinConnect->PinId = m_PinId;
+ PinConnect->PinToHandle = NULL;
+ PinConnect->Priority.PriorityClass = KSPRIORITY_NORMAL;
+ PinConnect->Priority.PrioritySubClass = KSPRIORITY_NORMAL;
+ CopyMemory((PinConnect + 1), DataFormat, DataFormat->FormatSize);
+
+ // create pin
+ hr = KsCreatePin(m_hFilter, PinConnect, GENERIC_WRITE, &m_hPin);
+
+ // free pin connect
+ CoTaskMemFree(PinConnect);
+
+ return hr;
+}
+
+HRESULT
+WINAPI
+CInputPin_Constructor(
+ IBaseFilter * ParentFilter,
+ LPCWSTR PinName,
+ HANDLE hFilter,
+ ULONG PinId,
+ KSPIN_COMMUNICATION Communication,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ CInputPin * handler = new CInputPin(ParentFilter, PinName, hFilter, PinId, Communication);
+
+ if (!handler)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(handler->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete handler;
+ return E_NOINTERFACE;
+ }
+
+ return S_OK;
+}
diff --git a/dll/directx/ksproxy/interface.cpp b/dll/directx/ksproxy/interface.cpp
index cd8dc806d84..4289cd1fc11 100644
--- a/dll/directx/ksproxy/interface.cpp
+++ b/dll/directx/ksproxy/interface.cpp
@@ -8,7 +8,6 @@
*/
#include "precomp.h"
-const GUID IID_IKsInterfaceHandler = {0xD3ABC7E0, 0x9A61, 0x11D0, {0xA4, 0x0D, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
const GUID IID_IKsObject = {0x423c13a2, 0x2070, 0x11d0, {0x9e, 0xf7, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1}};
class CKsInterfaceHandler : public IKsInterfaceHandler
@@ -119,6 +118,8 @@ CKsInterfaceHandler_Constructor(
REFIID riid,
LPVOID * ppv)
{
+ OutputDebugStringW(L"CKsInterfaceHandler_Constructor\n");
+
CKsInterfaceHandler * handler = new CKsInterfaceHandler();
if (!handler)
diff --git a/dll/directx/ksproxy/ksproxy.rbuild b/dll/directx/ksproxy/ksproxy.rbuild
index f7a0bbd3e6b..440e279e86a 100644
--- a/dll/directx/ksproxy/ksproxy.rbuild
+++ b/dll/directx/ksproxy/ksproxy.rbuild
@@ -10,7 +10,8 @@
ole32
setupapi
msvcrt
-
+ strmiids
+ ksuser
-fno-exceptions
-fno-rtti
@@ -26,9 +27,13 @@
cvpconfig.cpp
cvpvbiconfig.cpp
datatype.cpp
+ enum_mediatypes.cpp
+ enumpins.cpp
+ input_pin.cpp
interface.cpp
ksproxy.cpp
ksproxy.rc
+ output_pin.cpp
proxy.cpp
qualityforward.cpp
diff --git a/dll/directx/ksproxy/output_pin.cpp b/dll/directx/ksproxy/output_pin.cpp
new file mode 100644
index 00000000000..b29d12ac4b2
--- /dev/null
+++ b/dll/directx/ksproxy/output_pin.cpp
@@ -0,0 +1,267 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE: dll/directx/ksproxy/input_cpp.cpp
+ * PURPOSE: InputPin of Proxy Filter
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class COutputPin : public IPin,
+ public IKsObject
+/*
+ public IQualityControl,
+ public IKsPinEx,
+ public IKsPinPipe,
+ public ISpecifyPropertyPages,
+ public IStreamBuilder,
+ public IKsPropertySet,
+ public IKsPinFactory,
+ public IKsControl,
+ public IKsAggregateControl
+ public IMediaSeeking,
+ public IAMStreamConfig,
+ public IMemAllocatorNotifyCallbackTemp
+*/
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+ if (!m_Ref)
+ {
+ delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+ //IPin methods
+ HRESULT STDMETHODCALLTYPE Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt);
+ HRESULT STDMETHODCALLTYPE ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt);
+ HRESULT STDMETHODCALLTYPE Disconnect();
+ HRESULT STDMETHODCALLTYPE ConnectedTo(IPin **pPin);
+ HRESULT STDMETHODCALLTYPE ConnectionMediaType(AM_MEDIA_TYPE *pmt);
+ HRESULT STDMETHODCALLTYPE QueryPinInfo(PIN_INFO *pInfo);
+ HRESULT STDMETHODCALLTYPE QueryDirection(PIN_DIRECTION *pPinDir);
+ HRESULT STDMETHODCALLTYPE QueryId(LPWSTR *Id);
+ HRESULT STDMETHODCALLTYPE QueryAccept(const AM_MEDIA_TYPE *pmt);
+ HRESULT STDMETHODCALLTYPE EnumMediaTypes(IEnumMediaTypes **ppEnum);
+ HRESULT STDMETHODCALLTYPE QueryInternalConnections(IPin **apPin, ULONG *nPin);
+ HRESULT STDMETHODCALLTYPE EndOfStream();
+ HRESULT STDMETHODCALLTYPE BeginFlush();
+ HRESULT STDMETHODCALLTYPE EndFlush();
+ HRESULT STDMETHODCALLTYPE NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+
+ //IKsObject methods
+ HANDLE STDMETHODCALLTYPE KsGetObjectHandle();
+
+
+ COutputPin(IBaseFilter * ParentFilter, LPCWSTR PinName) : m_Ref(0), m_ParentFilter(ParentFilter), m_PinName(PinName){};
+ virtual ~COutputPin(){};
+
+protected:
+ LONG m_Ref;
+ IBaseFilter * m_ParentFilter;
+ LPCWSTR m_PinName;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::QueryInterface(
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ *Output = NULL;
+ if (IsEqualGUID(refiid, IID_IUnknown) ||
+ IsEqualGUID(refiid, IID_IPin))
+ {
+ *Output = PVOID(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+ else if (IsEqualGUID(refiid, IID_IKsObject))
+ {
+ *Output = (IKsObject*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"COutputPin::QueryInterface: NoInterface for %s\n", lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+
+ return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IKsObject
+//
+HANDLE
+STDMETHODCALLTYPE
+COutputPin::KsGetObjectHandle()
+{
+ OutputDebugStringW(L"COutputPin::KsGetObjectHandle CALLED\n");
+
+ //FIXME
+ // return pin handle
+ return NULL;
+}
+
+//-------------------------------------------------------------------
+// IPin interface
+//
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
+{
+ OutputDebugStringW(L"COutputPin::Connect called\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt)
+{
+ OutputDebugStringW(L"COutputPin::ReceiveConnection called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::Disconnect( void)
+{
+ OutputDebugStringW(L"COutputPin::Disconnect called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::ConnectedTo(IPin **pPin)
+{
+ *pPin = NULL;
+ OutputDebugStringW(L"COutputPin::ConnectedTo called\n");
+ return VFW_E_NOT_CONNECTED;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt)
+{
+ OutputDebugStringW(L"COutputPin::ConnectionMediaType called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::QueryPinInfo(PIN_INFO *pInfo)
+{
+ wcscpy(pInfo->achName, m_PinName);
+ pInfo->dir = PINDIR_OUTPUT;
+ pInfo->pFilter = m_ParentFilter;
+ m_ParentFilter->AddRef();
+
+ return S_OK;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::QueryDirection(PIN_DIRECTION *pPinDir)
+{
+ if (pPinDir)
+ {
+ *pPinDir = PINDIR_OUTPUT;
+ return S_OK;
+ }
+
+ return E_POINTER;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::QueryId(LPWSTR *Id)
+{
+ *Id = (LPWSTR)CoTaskMemAlloc((wcslen(m_PinName)+1)*sizeof(WCHAR));
+ if (!*Id)
+ return E_OUTOFMEMORY;
+
+ wcscpy(*Id, m_PinName);
+ return S_OK;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::QueryAccept(const AM_MEDIA_TYPE *pmt)
+{
+ OutputDebugStringW(L"COutputPin::QueryAccept called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::EnumMediaTypes(IEnumMediaTypes **ppEnum)
+{
+ OutputDebugStringW(L"COutputPin::EnumMediaTypes called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::QueryInternalConnections(IPin **apPin, ULONG *nPin)
+{
+ OutputDebugStringW(L"COutputPin::QueryInternalConnections called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::EndOfStream( void)
+{
+ OutputDebugStringW(L"COutputPin::EndOfStream called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::BeginFlush( void)
+{
+ OutputDebugStringW(L"COutputPin::BeginFlush called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::EndFlush( void)
+{
+ OutputDebugStringW(L"COutputPin::EndFlush called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
+{
+ OutputDebugStringW(L"COutputPin::NewSegment called\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+COutputPin_Constructor(
+ IBaseFilter * ParentFilter,
+ LPCWSTR PinName,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ COutputPin * handler = new COutputPin(ParentFilter, PinName);
+
+ if (!handler)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(handler->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete handler;
+ return E_NOINTERFACE;
+ }
+
+ return S_OK;
+}
diff --git a/dll/directx/ksproxy/precomp.h b/dll/directx/ksproxy/precomp.h
index cf72d8c8195..32953e94cb5 100644
--- a/dll/directx/ksproxy/precomp.h
+++ b/dll/directx/ksproxy/precomp.h
@@ -1,5 +1,6 @@
#pragma once
+#define _FORCENAMELESSUNION
#define BUILDING_KS
#define _KSDDK_
#include
@@ -14,8 +15,9 @@
#include
#include
#include
-
#include
+#include
+#include
//#include
typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject);
@@ -96,3 +98,43 @@ CKsProxy_Constructor(
IUnknown * pUnkOuter,
REFIID riid,
LPVOID * ppv);
+
+/* input_pin.cpp */
+HRESULT
+WINAPI
+CInputPin_Constructor(
+ IBaseFilter * ParentFilter,
+ LPCWSTR PinName,
+ HANDLE hFilter,
+ ULONG PinId,
+ KSPIN_COMMUNICATION Communication,
+ REFIID riid,
+ LPVOID * ppv);
+
+/* output_pin.cpp */
+HRESULT
+WINAPI
+COutputPin_Constructor(
+ IBaseFilter * ParentFilter,
+ LPCWSTR PinName,
+ REFIID riid,
+ LPVOID * ppv);
+
+/* enumpins.cpp */
+HRESULT
+WINAPI
+CEnumPins_fnConstructor(
+ std::vector Pins,
+ REFIID riid,
+ LPVOID * ppv);
+
+/* enum_mediatypes.cpp */
+HRESULT
+WINAPI
+CEnumMediaTypes_fnConstructor(
+ ULONG MediaTypeCount,
+ AM_MEDIA_TYPE * MediaTypes,
+ REFIID riid,
+ LPVOID * ppv);
+
+
diff --git a/dll/directx/ksproxy/proxy.cpp b/dll/directx/ksproxy/proxy.cpp
index a6d82458cc7..0ff397c2062 100644
--- a/dll/directx/ksproxy/proxy.cpp
+++ b/dll/directx/ksproxy/proxy.cpp
@@ -8,15 +8,20 @@
*/
#include "precomp.h"
+const GUID IID_IPersistPropertyBag = {0x37D84F60, 0x42CB, 0x11CE, {0x81, 0x35, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51}};
+const GUID GUID_NULL = {0x00000000L, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
+const GUID IID_IBDA_DeviceControl = {0xFD0A5AF3, 0xB41D, 0x11d2, {0x9C, 0x95, 0x00, 0xC0, 0x4F, 0x79, 0x71, 0xE0}};
/*
Needs IKsClock, IKsNotifyEvent
*/
class CKsProxy : public IBaseFilter,
public IAMovieSetup,
+ public IPersistPropertyBag,
+ public IKsObject
+/*
public IPersistStream,
public ISpecifyPropertyPages,
- public IPersistPropertyBag,
public IReferenceClock,
public IMediaSeeking,
public IKsObject,
@@ -27,12 +32,769 @@ class CKsProxy : public IBaseFilter,
public IKsTopology,
public IKsAggregateControl,
public IAMDeviceRemoval
+*/
{
+public:
+ typedef std::vectorProxyPluginVector;
+ typedef std::vector PinVector;
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+ if (!m_Ref)
+ {
+ delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+ // IBaseFilter methods
+ HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID);
+ HRESULT STDMETHODCALLTYPE Stop( void);
+ HRESULT STDMETHODCALLTYPE Pause( void);
+ HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart);
+ HRESULT STDMETHODCALLTYPE GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *State);
+ HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock);
+ HRESULT STDMETHODCALLTYPE GetSyncSource(IReferenceClock **pClock);
+ HRESULT STDMETHODCALLTYPE EnumPins(IEnumPins **ppEnum);
+ HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR Id, IPin **ppPin);
+ HRESULT STDMETHODCALLTYPE QueryFilterInfo(FILTER_INFO *pInfo);
+ HRESULT STDMETHODCALLTYPE JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName);
+ HRESULT STDMETHODCALLTYPE QueryVendorInfo(LPWSTR *pVendorInfo);
+
+ //IAMovieSetup methods
+ HRESULT STDMETHODCALLTYPE Register( void);
+ HRESULT STDMETHODCALLTYPE Unregister( void);
+
+ // IPersistPropertyBag methods
+ HRESULT STDMETHODCALLTYPE InitNew( void);
+ HRESULT STDMETHODCALLTYPE Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog);
+ HRESULT STDMETHODCALLTYPE Save(IPropertyBag *pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties);
+
+ // IKsObject
+ HANDLE STDMETHODCALLTYPE KsGetObjectHandle();
+
+ CKsProxy() : m_Ref(0), m_pGraph(0), m_ReferenceClock(0), m_FilterState(State_Stopped), m_hDevice(0), m_Plugins(), m_Pins() {};
+ virtual ~CKsProxy()
+ {
+ if (m_hDevice)
+ CloseHandle(m_hDevice);
+ };
+
+ HRESULT STDMETHODCALLTYPE GetSupportedSets(LPGUID * pOutGuid, PULONG NumGuids);
+ HRESULT STDMETHODCALLTYPE LoadProxyPlugins(LPGUID pGuids, ULONG NumGuids);
+ HRESULT STDMETHODCALLTYPE GetNumberOfPins(PULONG NumPins);
+ HRESULT STDMETHODCALLTYPE GetPinInstanceCount(ULONG PinId, PKSPIN_CINSTANCES Instances);
+ HRESULT STDMETHODCALLTYPE GetPinDataflow(ULONG PinId, KSPIN_DATAFLOW * DataFlow);
+ HRESULT STDMETHODCALLTYPE GetPinName(ULONG PinId, KSPIN_DATAFLOW DataFlow, ULONG PinCount, LPWSTR * OutPinName);
+ HRESULT STDMETHODCALLTYPE GetPinCommunication(ULONG PinId, KSPIN_COMMUNICATION * Communication);
+ HRESULT STDMETHODCALLTYPE CreatePins();
+protected:
+ LONG m_Ref;
+ IFilterGraph *m_pGraph;
+ IReferenceClock * m_ReferenceClock;
+ FILTER_STATE m_FilterState;
+ HANDLE m_hDevice;
+ ProxyPluginVector m_Plugins;
+ PinVector m_Pins;
};
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::QueryInterface(
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ *Output = NULL;
+ if (IsEqualGUID(refiid, IID_IUnknown) ||
+ IsEqualGUID(refiid, IID_IBaseFilter))
+ {
+ *Output = PVOID(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+ else if (IsEqualGUID(refiid, IID_IPersistPropertyBag))
+ {
+ *Output = (IPersistPropertyBag*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+ if (IsEqualGUID(refiid, IID_IKsObject))
+ {
+ *Output = (IKsObject*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ for(ULONG Index = 0; Index < m_Plugins.size(); Index++)
+ {
+ if (m_Pins[Index])
+ {
+ HRESULT hr = m_Plugins[Index]->QueryInterface(refiid, Output);
+ if (SUCCEEDED(hr))
+ {
+ WCHAR Buffer[100];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CKsProxy::QueryInterface plugin %lu supports interface %s\n", Index, lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+ return hr;
+ }
+ }
+ }
+
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CKsProxy::QueryInterface: NoInterface for %s !!!\n", lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+
+
+ return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IKsObject interface
+//
+
+HANDLE
+STDMETHODCALLTYPE
+CKsProxy::KsGetObjectHandle()
+{
+ return m_hDevice;
+}
+
+//-------------------------------------------------------------------
+// IPersistPropertyBag interface
+//
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::InitNew( void)
+{
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetSupportedSets(
+ LPGUID * pOutGuid,
+ PULONG NumGuids)
+{
+ KSPROPERTY Property;
+ LPGUID pGuid;
+ ULONG NumProperty = 0;
+ ULONG NumMethods = 0;
+ ULONG NumEvents = 0;
+ ULONG Length;
+ ULONG BytesReturned;
+ HRESULT hr;
+
+ Property.Set = GUID_NULL;
+ Property.Id = 0;
+ Property.Flags = KSPROPERTY_TYPE_SETSUPPORT;
+
+ KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumProperty);
+ KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_METHOD, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumMethods);
+ KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumEvents);
+
+ Length = NumProperty + NumMethods + NumEvents;
+
+ // allocate guid buffer
+ pGuid = (LPGUID)CoTaskMemAlloc(Length);
+ if (!pGuid)
+ {
+ // failed
+ return E_OUTOFMEMORY;
+ }
+
+ NumProperty /= sizeof(GUID);
+ NumMethods /= sizeof(GUID);
+ NumEvents /= sizeof(GUID);
+
+ // get all properties
+ hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pGuid, Length, &BytesReturned);
+ if (FAILED(hr))
+ {
+ CoTaskMemFree(pGuid);
+ return E_FAIL;
+ }
+ Length -= BytesReturned;
+
+ // get all methods
+ if (Length)
+ {
+ hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_METHOD, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&pGuid[NumProperty], Length, &BytesReturned);
+ if (FAILED(hr))
+ {
+ CoTaskMemFree(pGuid);
+ return E_FAIL;
+ }
+ Length -= BytesReturned;
+ }
+
+ // get all events
+ if (Length)
+ {
+ hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&pGuid[NumProperty+NumMethods], Length, &BytesReturned);
+ if (FAILED(hr))
+ {
+ CoTaskMemFree(pGuid);
+ return E_FAIL;
+ }
+ Length -= BytesReturned;
+ }
+
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[200];
+ swprintf(Buffer, L"NumProperty %lu NumMethods %lu NumEvents %lu\n", NumProperty, NumMethods, NumEvents);
+ OutputDebugStringW(Buffer);
+#endif
+
+ *pOutGuid = pGuid;
+ *NumGuids = NumProperty+NumEvents+NumMethods;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::LoadProxyPlugins(
+ LPGUID pGuids,
+ ULONG NumGuids)
+{
+ ULONG Index;
+ LPOLESTR pStr;
+ HKEY hKey, hSubKey;
+ HRESULT hr;
+ IUnknown * pUnknown;
+
+ if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\MediaInterfaces", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
+ {
+ OutputDebugStringW(L"CKsProxy::LoadProxyPlugins failed to open MediaInterfaces key\n");
+ return E_FAIL;
+ }
+
+ // enumerate all sets
+ for(Index = 0; Index < NumGuids; Index++)
+ {
+ // convert to string
+ hr = StringFromCLSID(pGuids[Index], &pStr);
+ if (FAILED(hr))
+ return E_FAIL;
+
+ // now try open class key
+ if (RegOpenKeyExW(hKey, pStr, 0, KEY_READ, &hSubKey) != ERROR_SUCCESS)
+ {
+ // no plugin for that set exists
+ CoTaskMemFree(pStr);
+ continue;
+ }
+
+ // try load plugin
+ hr = CoCreateInstance(pGuids[Index], (IBaseFilter*)this, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pUnknown);
+ if (SUCCEEDED(hr))
+ {
+ // store plugin
+ m_Plugins.push_back(pUnknown);
+ }
+ // close key
+ RegCloseKey(hSubKey);
+ }
+
+ // close media interfaces key
+ RegCloseKey(hKey);
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetNumberOfPins(
+ PULONG NumPins)
+{
+ KSPROPERTY Property;
+ ULONG BytesReturned;
+
+ // setup request
+ Property.Set = KSPROPSETID_Pin;
+ Property.Id = KSPROPERTY_PIN_CTYPES;
+ Property.Flags = KSPROPERTY_TYPE_GET;
+
+ return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)NumPins, sizeof(ULONG), &BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetPinInstanceCount(
+ ULONG PinId,
+ PKSPIN_CINSTANCES Instances)
+{
+ KSP_PIN Property;
+ ULONG BytesReturned;
+
+ // setup request
+ Property.Property.Set = KSPROPSETID_Pin;
+ Property.Property.Id = KSPROPERTY_PIN_CINSTANCES;
+ Property.Property.Flags = KSPROPERTY_TYPE_GET;
+ Property.PinId = PinId;
+ Property.Reserved = 0;
+
+ return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), (PVOID)Instances, sizeof(KSPIN_CINSTANCES), &BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetPinCommunication(
+ ULONG PinId,
+ KSPIN_COMMUNICATION * Communication)
+{
+ KSP_PIN Property;
+ ULONG BytesReturned;
+
+ // setup request
+ Property.Property.Set = KSPROPSETID_Pin;
+ Property.Property.Id = KSPROPERTY_PIN_COMMUNICATION;
+ Property.Property.Flags = KSPROPERTY_TYPE_GET;
+ Property.PinId = PinId;
+ Property.Reserved = 0;
+
+ return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), (PVOID)Communication, sizeof(KSPIN_COMMUNICATION), &BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetPinDataflow(
+ ULONG PinId,
+ KSPIN_DATAFLOW * DataFlow)
+{
+ KSP_PIN Property;
+ ULONG BytesReturned;
+
+ // setup request
+ Property.Property.Set = KSPROPSETID_Pin;
+ Property.Property.Id = KSPROPERTY_PIN_DATAFLOW;
+ Property.Property.Flags = KSPROPERTY_TYPE_GET;
+ Property.PinId = PinId;
+ Property.Reserved = 0;
+
+ return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), (PVOID)DataFlow, sizeof(KSPIN_DATAFLOW), &BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetPinName(
+ ULONG PinId,
+ KSPIN_DATAFLOW DataFlow,
+ ULONG PinCount,
+ LPWSTR * OutPinName)
+{
+ KSP_PIN Property;
+ LPWSTR PinName;
+ ULONG BytesReturned;
+ HRESULT hr;
+ WCHAR Buffer[100];
+
+ // setup request
+ Property.Property.Set = KSPROPSETID_Pin;
+ Property.Property.Id = KSPROPERTY_PIN_NAME;
+ Property.Property.Flags = KSPROPERTY_TYPE_GET;
+ Property.PinId = PinId;
+ Property.Reserved = 0;
+
+ // #1 try get it from pin directly
+ hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), NULL, 0, &BytesReturned);
+
+ if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_MORE_DATA))
+ {
+ // allocate pin name
+ PinName = (LPWSTR)CoTaskMemAlloc(BytesReturned);
+ if (!PinName)
+ return E_OUTOFMEMORY;
+
+ // retry with allocated buffer
+ hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), PinName, BytesReturned, &BytesReturned);
+ if (SUCCEEDED(hr))
+ {
+ *OutPinName = PinName;
+ return hr;
+ }
+
+ //free buffer
+ CoTaskMemFree(PinName);
+ }
+
+ //
+ // TODO: retrieve pin name from topology node
+ //
+
+ if (DataFlow == KSPIN_DATAFLOW_IN)
+ {
+ swprintf(Buffer, L"Input%lu", PinCount);
+ }
+ else
+ {
+ swprintf(Buffer, L"Output%lu", PinCount);
+ }
+
+ // allocate pin name
+ PinName = (LPWSTR)CoTaskMemAlloc((wcslen(Buffer)+1) * sizeof(WCHAR));
+ if (!PinName)
+ return E_OUTOFMEMORY;
+
+ // copy pin name
+ wcscpy(PinName, Buffer);
+
+ // store result
+ *OutPinName = PinName;
+ // done
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::CreatePins()
+{
+ ULONG NumPins, Index;
+ KSPIN_CINSTANCES Instances;
+ KSPIN_DATAFLOW DataFlow;
+ KSPIN_COMMUNICATION Communication;
+ HRESULT hr;
+ WCHAR Buffer[100];
+ LPWSTR PinName;
+ IPin * pPin;
+ ULONG InputPin = 0;
+ ULONG OutputPin = 0;
+
+ // get number of pins
+ hr = GetNumberOfPins(&NumPins);
+ if (FAILED(hr))
+ return hr;
+
+ for(Index = 0; Index < NumPins; Index++)
+ {
+ // query current instance count
+ hr = GetPinInstanceCount(Index, &Instances);
+ if (FAILED(hr))
+ continue;
+
+ // query pin communication;
+ hr = GetPinCommunication(Index, &Communication);
+ if (FAILED(hr))
+ continue;
+
+ if (Instances.CurrentCount == Instances.PossibleCount)
+ {
+ // already maximum reached for this pin
+ continue;
+ }
+
+ // get direction of pin
+ hr = GetPinDataflow(Index, &DataFlow);
+ if (FAILED(hr))
+ continue;
+
+ if (DataFlow == KSPIN_DATAFLOW_IN)
+ hr = GetPinName(Index, DataFlow, InputPin, &PinName);
+ else
+ hr = GetPinName(Index, DataFlow, OutputPin, &PinName);
+
+ if (FAILED(hr))
+ continue;
+
+ // construct the pins
+ if (DataFlow == KSPIN_DATAFLOW_IN)
+ {
+ hr = CInputPin_Constructor((IBaseFilter*)this, PinName, m_hDevice, Index, Communication, IID_IPin, (void**)&pPin);
+ if (FAILED(hr))
+ {
+ CoTaskMemFree(PinName);
+ continue;
+ }
+ InputPin++;
+ }
+ else
+ {
+ hr = COutputPin_Constructor((IBaseFilter*)this, PinName, IID_IPin, (void**)&pPin);
+ if (FAILED(hr))
+ {
+ CoTaskMemFree(PinName);
+ continue;
+ }
+ OutputPin++;
+ }
+
+ // store pins
+ m_Pins.push_back(pPin);
+
+ swprintf(Buffer, L"Index %lu DataFlow %lu Name %s\n", Index, DataFlow, PinName);
+ OutputDebugStringW(Buffer);
+ }
+
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog)
+{
+ HRESULT hr;
+ WCHAR Buffer[100];
+ VARIANT varName;
+ LPGUID pGuid;
+ ULONG NumGuids = 0;
+
+ // read device path
+ varName.vt = VT_BSTR;
+ hr = pPropBag->Read(L"DevicePath", &varName, pErrorLog);
+
+ if (FAILED(hr))
+ {
+ swprintf(Buffer, L"CKsProxy::Load Read %lx\n", hr);
+ OutputDebugStringW(Buffer);
+ return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+ }
+
+ // open device
+ m_hDevice = CreateFileW(varName.bstrVal, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
+
+ if (m_hDevice == INVALID_HANDLE_VALUE)
+ {
+ // failed to open device
+ swprintf(Buffer, L"CKsProxy:: failed to open device with %lx\n", GetLastError());
+ OutputDebugStringW(Buffer);
+
+ return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+ }
+
+ // get all supported sets
+ hr = GetSupportedSets(&pGuid, &NumGuids);
+ if (FAILED(hr))
+ {
+ CloseHandle(m_hDevice);
+ m_hDevice = NULL;
+ return hr;
+ }
+
+ // load all proxy plugins
+ hr = LoadProxyPlugins(pGuid, NumGuids);
+ if (FAILED(hr))
+ {
+ CloseHandle(m_hDevice);
+ m_hDevice = NULL;
+ return hr;
+ }
+
+ // free sets
+ CoTaskMemFree(pGuid);
+
+ // now create the input / output pins
+ hr = CreatePins();
+
+ return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Save(IPropertyBag *pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties)
+{
+ return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IBaseFilter interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetClassID(
+ CLSID *pClassID)
+{
+ OutputDebugStringW(L"CKsProxy::GetClassID : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Stop()
+{
+ OutputDebugStringW(L"CKsProxy::Stop : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Pause()
+{
+ OutputDebugStringW(L"CKsProxy::Pause : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Run(
+ REFERENCE_TIME tStart)
+{
+ OutputDebugStringW(L"CKsProxy::Run : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetState(
+ DWORD dwMilliSecsTimeout,
+ FILTER_STATE *State)
+{
+ *State = m_FilterState;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::SetSyncSource(
+ IReferenceClock *pClock)
+{
+ if (pClock)
+ {
+ pClock->AddRef();
+ }
+
+ if (m_ReferenceClock)
+ {
+ m_ReferenceClock->Release();
+ }
+
+ m_ReferenceClock = pClock;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetSyncSource(
+ IReferenceClock **pClock)
+{
+ if (!pClock)
+ return E_POINTER;
+
+ if (m_ReferenceClock)
+ m_ReferenceClock->AddRef();
+
+ *pClock = m_ReferenceClock;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::EnumPins(
+ IEnumPins **ppEnum)
+{
+ return CEnumPins_fnConstructor(m_Pins, IID_IEnumPins, (void**)ppEnum);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::FindPin(
+ LPCWSTR Id, IPin **ppPin)
+{
+ ULONG PinId;
+
+ if (!ppPin)
+ return E_POINTER;
+
+ // convert to pin
+ int ret = swscanf(Id, L"%u", &PinId);
+
+ if (!ret || ret == EOF)
+ {
+ // invalid id
+ return VFW_E_NOT_FOUND;
+ }
+
+ if (PinId >= m_Pins.size() || m_Pins[PinId] == NULL)
+ {
+ // invalid id
+ return VFW_E_NOT_FOUND;
+ }
+
+ // found pin
+ *ppPin = m_Pins[PinId];
+ m_Pins[PinId]->AddRef();
+
+ return S_OK;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::QueryFilterInfo(
+ FILTER_INFO *pInfo)
+{
+ if (!pInfo)
+ return E_POINTER;
+
+ pInfo->achName[0] = L'\0';
+ pInfo->pGraph = m_pGraph;
+
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::JoinFilterGraph(
+ IFilterGraph *pGraph,
+ LPCWSTR pName)
+{
+ if (pGraph)
+ {
+ // joining filter graph
+ m_pGraph = pGraph;
+ }
+ else
+ {
+ // leaving graph
+ m_pGraph = 0;
+ }
+
+ return S_OK;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::QueryVendorInfo(
+ LPWSTR *pVendorInfo)
+{
+ OutputDebugStringW(L"CKsProxy::QueryVendorInfo : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IAMovieSetup interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Register()
+{
+ OutputDebugStringW(L"CKsProxy::Register : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Unregister()
+{
+ OutputDebugStringW(L"CKsProxy::Unregister : NotImplemented\n");
+ return E_NOTIMPL;
+}
HRESULT
WINAPI
@@ -41,6 +803,23 @@ CKsProxy_Constructor(
REFIID riid,
LPVOID * ppv)
{
- OutputDebugString("CKsProxy_Constructor UNIMPLEMENTED\n");
- return E_NOTIMPL;
+ WCHAR Buffer[100];
+ LPOLESTR pstr;
+ StringFromCLSID(riid, &pstr);
+ swprintf(Buffer, L"CKsProxy_Constructor pUnkOuter %p riid %s\n", pUnkOuter, pstr);
+ OutputDebugStringW(Buffer);
+
+ CKsProxy * handler = new CKsProxy();
+
+ if (!handler)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(handler->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete handler;
+ return E_NOINTERFACE;
+ }
+
+ return S_OK;
}
diff --git a/dll/directx/ksproxy/qualityforward.cpp b/dll/directx/ksproxy/qualityforward.cpp
index 45f8f3489e3..3081d834cbf 100644
--- a/dll/directx/ksproxy/qualityforward.cpp
+++ b/dll/directx/ksproxy/qualityforward.cpp
@@ -87,8 +87,6 @@ CKsQualityForwarder::KsFlushClient(
OutputDebugString("UNIMPLEMENTED\n");
}
-
-
HRESULT
WINAPI
CKsQualityForwarder_Constructor(
@@ -99,6 +97,8 @@ CKsQualityForwarder_Constructor(
HRESULT hr;
HANDLE handle;
+ OutputDebugStringW(L"CKsQualityForwarder_Constructor\n");
+
// open default clock
hr = KsOpenDefaultDevice(KSCATEGORY_QUALITY, GENERIC_READ | GENERIC_WRITE, &handle);
diff --git a/dll/directx/msdvbnp/classfactory.cpp b/dll/directx/msdvbnp/classfactory.cpp
new file mode 100644
index 00000000000..89b61c486fe
--- /dev/null
+++ b/dll/directx/msdvbnp/classfactory.cpp
@@ -0,0 +1,105 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS BDA Proxy
+ * FILE: dll/directx/msdvbnp/classfactory.cpp
+ * PURPOSE: IClassFactory interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
+const GUID IID_IClassFactory = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
+
+class CClassFactory : public IClassFactory
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+ if (!m_Ref)
+ {
+ delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+ HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject);
+ HRESULT WINAPI LockServer(BOOL fLock);
+
+ CClassFactory(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, IID *riidInst) : m_Ref(1), m_lpfnCI(lpfnCI), m_IID(riidInst)
+ {};
+
+ virtual ~CClassFactory(){};
+
+protected:
+ LONG m_Ref;
+ LPFNCREATEINSTANCE m_lpfnCI;
+ IID * m_IID;
+};
+
+HRESULT
+WINAPI
+CClassFactory::QueryInterface(
+ REFIID riid,
+ LPVOID *ppvObj)
+{
+ *ppvObj = NULL;
+ if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
+ {
+ *ppvObj = PVOID(this);
+ InterlockedIncrement(&m_Ref);
+ return S_OK;
+ }
+ return E_NOINTERFACE;
+}
+
+HRESULT
+WINAPI
+CClassFactory::CreateInstance(
+ LPUNKNOWN pUnkOuter,
+ REFIID riid,
+ LPVOID *ppvObject)
+{
+ *ppvObject = NULL;
+
+ if ( m_IID == NULL || IsEqualCLSID(riid, *m_IID) || IsEqualCLSID(riid, IID_IUnknown))
+ {
+ return m_lpfnCI(pUnkOuter, riid, ppvObject);
+ }
+
+ return E_NOINTERFACE;
+}
+
+HRESULT
+WINAPI
+CClassFactory::LockServer(
+ BOOL fLock)
+{
+ return E_NOTIMPL;
+}
+
+IClassFactory *
+CClassFactory_fnConstructor(
+ LPFNCREATEINSTANCE lpfnCI,
+ PLONG pcRefDll,
+ IID * riidInst)
+{
+ CClassFactory* factory = new CClassFactory(lpfnCI, pcRefDll, riidInst);
+
+ if (!factory)
+ return NULL;
+
+ if (pcRefDll)
+ InterlockedIncrement(pcRefDll);
+
+ return (LPCLASSFACTORY)factory;
+}
diff --git a/dll/directx/msdvbnp/enum_mediatypes.cpp b/dll/directx/msdvbnp/enum_mediatypes.cpp
new file mode 100644
index 00000000000..6cd887f358c
--- /dev/null
+++ b/dll/directx/msdvbnp/enum_mediatypes.cpp
@@ -0,0 +1,189 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Network Provider for MPEG2 based networks
+ * FILE: dll/directx/msdvbnp/enum_mediatypes.cpp
+ * PURPOSE: IEnumMediaTypes interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CEnumMediaTypes : public IEnumMediaTypes
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+ if (!m_Ref)
+ {
+ delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+ HRESULT STDMETHODCALLTYPE Next(ULONG cMediaTypes, AM_MEDIA_TYPE **ppMediaTypes, ULONG *pcFetched);
+ HRESULT STDMETHODCALLTYPE Skip(ULONG cMediaTypes);
+ HRESULT STDMETHODCALLTYPE Reset();
+ HRESULT STDMETHODCALLTYPE Clone(IEnumMediaTypes **ppEnum);
+
+
+ CEnumMediaTypes(ULONG MediaTypeCount, AM_MEDIA_TYPE * MediaTypes) : m_Ref(0), m_MediaTypeCount(MediaTypeCount), m_MediaTypes(MediaTypes), m_Index(0){};
+ virtual ~CEnumMediaTypes(){};
+
+protected:
+ LONG m_Ref;
+ ULONG m_MediaTypeCount;
+ AM_MEDIA_TYPE * m_MediaTypes;
+ ULONG m_Index;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::QueryInterface(
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ if (IsEqualGUID(refiid, IID_IUnknown))
+ {
+ *Output = PVOID(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+ if (IsEqualGUID(refiid, IID_IEnumMediaTypes))
+ {
+ *Output = (IEnumMediaTypes*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CEnumMediaTypes::QueryInterface: NoInterface for %s\n", lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+
+ return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IEnumMediaTypes
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Next(
+ ULONG cMediaTypes,
+ AM_MEDIA_TYPE **ppMediaTypes,
+ ULONG *pcFetched)
+{
+ ULONG i = 0;
+ AM_MEDIA_TYPE * MediaType;
+
+ if (!ppMediaTypes)
+ return E_POINTER;
+
+ if (cMediaTypes > 1 && !pcFetched)
+ return E_INVALIDARG;
+
+ while(i < cMediaTypes)
+ {
+ if (m_Index + i >= m_MediaTypeCount)
+ break;
+
+ MediaType = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
+ if (!MediaType)
+ break;
+
+ CopyMemory(MediaType, &m_MediaTypes[m_Index + i], sizeof(AM_MEDIA_TYPE));
+ ppMediaTypes[i] = MediaType;
+ i++;
+ }
+
+ if (pcFetched)
+ {
+ *pcFetched = i;
+ }
+
+ m_Index += i;
+
+ if (i < cMediaTypes)
+ return S_FALSE;
+ else
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Skip(
+ ULONG cMediaTypes)
+{
+ if (cMediaTypes + m_Index >= m_MediaTypeCount)
+ {
+ return S_FALSE;
+ }
+
+ m_Index += cMediaTypes;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Reset()
+{
+ m_Index = 0;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Clone(
+ IEnumMediaTypes **ppEnum)
+{
+ OutputDebugStringW(L"CEnumMediaTypes::Clone : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CEnumMediaTypes_fnConstructor(
+ IUnknown *pUnknown,
+ ULONG MediaTypeCount,
+ AM_MEDIA_TYPE * MediaTypes,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ CEnumMediaTypes * handler = new CEnumMediaTypes(MediaTypeCount, MediaTypes);
+
+#ifdef MSDVBNP_TRACE
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(riid, &lpstr);
+ swprintf(Buffer, L"CEnumMediaTypes_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (!handler)
+ {
+ CoTaskMemFree(MediaTypes);
+ return E_OUTOFMEMORY;
+ }
+
+ if (FAILED(handler->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete handler;
+ return E_NOINTERFACE;
+ }
+
+ return NOERROR;
+}
+
diff --git a/dll/directx/msdvbnp/enumpins.cpp b/dll/directx/msdvbnp/enumpins.cpp
new file mode 100644
index 00000000000..567705907b7
--- /dev/null
+++ b/dll/directx/msdvbnp/enumpins.cpp
@@ -0,0 +1,177 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Network Provider for MPEG2 based networks
+ * FILE: dll/directx/msdvbnp/enumpins.cpp
+ * PURPOSE: IEnumPins interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CEnumPins : public IEnumPins
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+ if (!m_Ref)
+ {
+ delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+
+ HRESULT STDMETHODCALLTYPE Next(ULONG cPins, IPin **ppPins, ULONG *pcFetched);
+ HRESULT STDMETHODCALLTYPE Skip(ULONG cPins);
+ HRESULT STDMETHODCALLTYPE Reset();
+ HRESULT STDMETHODCALLTYPE Clone(IEnumPins **ppEnum);
+
+ CEnumPins(ULONG NumPins, IPin ** pins) : m_Ref(0), m_NumPins(NumPins), m_Pins(pins), m_Index(0){};
+ virtual ~CEnumPins(){};
+
+protected:
+ LONG m_Ref;
+ ULONG m_NumPins;
+ IPin ** m_Pins;
+ ULONG m_Index;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::QueryInterface(
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ if (IsEqualGUID(refiid, IID_IUnknown))
+ {
+ *Output = PVOID(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+ if (IsEqualGUID(refiid, IID_IEnumPins))
+ {
+ *Output = (IEnumPins*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CEnumPins::QueryInterface: NoInterface for %s\n", lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+
+ return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Next(
+ ULONG cPins,
+ IPin **ppPins,
+ ULONG *pcFetched)
+{
+ ULONG i = 0;
+
+ if (!ppPins)
+ return E_POINTER;
+
+ if (cPins > 1 && !pcFetched)
+ return E_INVALIDARG;
+
+ while(i < cPins)
+ {
+ if (m_Index + i >= m_NumPins)
+ break;
+
+ ppPins[i] = m_Pins[m_Index + i];
+ m_Pins[m_Index + i]->AddRef();
+
+ i++;
+ }
+
+ if (pcFetched)
+ {
+ *pcFetched = i;
+ }
+
+ m_Index += i;
+
+ if (i < cPins)
+ return S_FALSE;
+ else
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Skip(
+ ULONG cPins)
+{
+ if (cPins + m_Index >= m_NumPins)
+ {
+ return S_FALSE;
+ }
+
+ m_Index += cPins;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Reset()
+{
+ m_Index = 0;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Clone(
+ IEnumPins **ppEnum)
+{
+ OutputDebugStringW(L"CEnumPins::Clone : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CEnumPins_fnConstructor(
+ IUnknown *pUnknown,
+ ULONG NumPins,
+ IPin ** pins,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ CEnumPins * handler = new CEnumPins(NumPins, pins);
+
+#ifdef MSDVBNP_TRACE
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(riid, &lpstr);
+ swprintf(Buffer, L"CEnumPins_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (!handler)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(handler->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete handler;
+ return E_NOINTERFACE;
+ }
+
+ return NOERROR;
+}
\ No newline at end of file
diff --git a/dll/directx/msdvbnp/msdvbnp.cpp b/dll/directx/msdvbnp/msdvbnp.cpp
new file mode 100644
index 00000000000..037a67ef717
--- /dev/null
+++ b/dll/directx/msdvbnp/msdvbnp.cpp
@@ -0,0 +1,108 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Network Provider for MPEG2 based networks
+ * FILE: dll/directx/msdvbnp/msdvbnp.cpp
+ * PURPOSE: COM Initialization
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+
+#include "precomp.h"
+
+const GUID CLSID_DVBTNetworkProvider = {0x216c62df, 0x6d7f, 0x4e9a, {0x85, 0x71, 0x5, 0xf1, 0x4e, 0xdb, 0x76, 0x6a}};
+
+static INTERFACE_TABLE InterfaceTable[] =
+{
+ {&CLSID_DVBTNetworkProvider, CNetworkProvider_fnConstructor},
+ {NULL, NULL}
+};
+
+extern "C"
+BOOL
+WINAPI
+DllMain(
+ HINSTANCE hInstDLL,
+ DWORD fdwReason,
+ LPVOID lpvReserved)
+{
+ switch (fdwReason)
+ {
+ case DLL_PROCESS_ATTACH:
+ CoInitialize(NULL);
+
+#ifdef MSDVBNP_TRACE
+ OutputDebugStringW(L"MSDVBNP::DllMain()\n");
+#endif
+
+ DisableThreadLibraryCalls(hInstDLL);
+ break;
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+
+extern "C"
+KSDDKAPI
+HRESULT
+WINAPI
+DllUnregisterServer(void)
+{
+ return S_OK;
+}
+
+extern "C"
+KSDDKAPI
+HRESULT
+WINAPI
+DllRegisterServer(void)
+{
+ return S_OK;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+DllGetClassObject(
+ REFCLSID rclsid,
+ REFIID riid,
+ LPVOID *ppv)
+{
+ UINT i;
+ HRESULT hres = E_OUTOFMEMORY;
+ IClassFactory * pcf = NULL;
+
+ if (!ppv)
+ return E_INVALIDARG;
+
+ *ppv = NULL;
+
+ for (i = 0; InterfaceTable[i].riid; i++)
+ {
+ if (IsEqualIID(*InterfaceTable[i].riid, rclsid))
+ {
+ pcf = CClassFactory_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL);
+ break;
+ }
+ }
+
+ if (!pcf)
+ {
+ return CLASS_E_CLASSNOTAVAILABLE;
+ }
+
+ hres = pcf->QueryInterface(riid, ppv);
+ pcf->Release();
+
+ return hres;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+DllCanUnloadNow(void)
+{
+ return S_OK;
+}
diff --git a/dll/directx/msdvbnp/msdvbnp.rbuild b/dll/directx/msdvbnp/msdvbnp.rbuild
new file mode 100644
index 00000000000..6213d7d8f37
--- /dev/null
+++ b/dll/directx/msdvbnp/msdvbnp.rbuild
@@ -0,0 +1,31 @@
+
+
+
+
+
+ .
+ ntdll
+ kernel32
+ advapi32
+ ole32
+ advapi32
+ msvcrt
+ strmiids
+
+ -fno-exceptions
+ -fno-rtti
+
+
+ /GR-
+
+
+ classfactory.cpp
+ enum_mediatypes.cpp
+ enumpins.cpp
+ msdvbnp.cpp
+ msdvbnp.rc
+ networkprovider.cpp
+ pin.cpp
+ scanningtuner.cpp
+
+
diff --git a/dll/directx/msdvbnp/msdvbnp.rc b/dll/directx/msdvbnp/msdvbnp.rc
new file mode 100644
index 00000000000..7df396e8fdf
--- /dev/null
+++ b/dll/directx/msdvbnp/msdvbnp.rc
@@ -0,0 +1,12 @@
+#include
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Network Provider for MPEG2 based networks\0"
+#define REACTOS_STR_INTERNAL_NAME "MSDvBNP.ax\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "MSDvBNP.ax\0"
+#define REACTOS_STR_PRODUCT_VERSION "6.5.2600.3264\0"
+#define REACTOS_STR_FILE_VERSION "6.5.2600.3264\0"
+
+#include
diff --git a/dll/directx/msdvbnp/msdvbnp.spec b/dll/directx/msdvbnp/msdvbnp.spec
new file mode 100644
index 00000000000..5baed04ed66
--- /dev/null
+++ b/dll/directx/msdvbnp/msdvbnp.spec
@@ -0,0 +1,4 @@
+@ stdcall DllCanUnloadNow()
+@ stdcall DllGetClassObject(ptr ptr ptr)
+@ stdcall DllRegisterServer()
+@ stdcall DllUnregisterServer()
diff --git a/dll/directx/msdvbnp/networkprovider.cpp b/dll/directx/msdvbnp/networkprovider.cpp
new file mode 100644
index 00000000000..c69c2336e48
--- /dev/null
+++ b/dll/directx/msdvbnp/networkprovider.cpp
@@ -0,0 +1,378 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Network Provider for MPEG2 based networks
+ * FILE: dll/directx/msdvbnp/networkprovider.cpp
+ * PURPOSE: IBDA_NetworkProvider interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CNetworkProvider : public IBaseFilter,
+ public IAMovieSetup,
+ public IBDA_NetworkProvider
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+ if (!m_Ref)
+ {
+ delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+ // IBaseFilter methods
+ HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID);
+ HRESULT STDMETHODCALLTYPE Stop( void);
+ HRESULT STDMETHODCALLTYPE Pause( void);
+ HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart);
+ HRESULT STDMETHODCALLTYPE GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *State);
+ HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock);
+ HRESULT STDMETHODCALLTYPE GetSyncSource(IReferenceClock **pClock);
+ HRESULT STDMETHODCALLTYPE EnumPins(IEnumPins **ppEnum);
+ HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR Id, IPin **ppPin);
+ HRESULT STDMETHODCALLTYPE QueryFilterInfo(FILTER_INFO *pInfo);
+ HRESULT STDMETHODCALLTYPE JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName);
+ HRESULT STDMETHODCALLTYPE QueryVendorInfo(LPWSTR *pVendorInfo);
+
+ //IAMovieSetup methods
+ HRESULT STDMETHODCALLTYPE Register( void);
+ HRESULT STDMETHODCALLTYPE Unregister( void);
+
+ //IBDA_NetworkProvider methods
+ HRESULT STDMETHODCALLTYPE PutSignalSource(ULONG ulSignalSource);
+ HRESULT STDMETHODCALLTYPE GetSignalSource(ULONG *pulSignalSource);
+ HRESULT STDMETHODCALLTYPE GetNetworkType(GUID *pguidNetworkType);
+ HRESULT STDMETHODCALLTYPE PutTuningSpace(REFGUID guidTuningSpace);
+ HRESULT STDMETHODCALLTYPE GetTuningSpace(GUID *pguidTuingSpace);
+ HRESULT STDMETHODCALLTYPE RegisterDeviceFilter(IUnknown *pUnkFilterControl, ULONG *ppvRegisitrationContext);
+ HRESULT STDMETHODCALLTYPE UnRegisterDeviceFilter(ULONG pvRegistrationContext);
+
+ CNetworkProvider() : m_Ref(0), m_pGraph(0), m_ReferenceClock(0), m_FilterState(State_Stopped) {m_Pins[0] = 0;};
+ virtual ~CNetworkProvider(){};
+
+protected:
+ LONG m_Ref;
+ IFilterGraph *m_pGraph;
+ IReferenceClock * m_ReferenceClock;
+ FILTER_STATE m_FilterState;
+ IPin * m_Pins[1];
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::QueryInterface(
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ *Output = NULL;
+
+ if (IsEqualGUID(refiid, IID_IUnknown))
+ {
+ *Output = PVOID(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+ if (IsEqualGUID(refiid, IID_IBaseFilter))
+ {
+ *Output = (IBaseFilter*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ if (IsEqualGUID(refiid, IID_ITuner) ||
+ IsEqualGUID(refiid, IID_IScanningTuner))
+ {
+ // construct scanning tuner
+ return CScanningTunner_fnConstructor(NULL, refiid, Output);
+ }
+
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CNetworkProvider::QueryInterface: NoInterface for %s !!!\n", lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+
+
+ return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IBaseFilter interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::GetClassID(
+ CLSID *pClassID)
+{
+ OutputDebugStringW(L"CNetworkProvider::GetClassID : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::Stop()
+{
+ OutputDebugStringW(L"CNetworkProvider::Stop : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::Pause()
+{
+ OutputDebugStringW(L"CNetworkProvider::Pause : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::Run(
+ REFERENCE_TIME tStart)
+{
+ OutputDebugStringW(L"CNetworkProvider::Run : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::GetState(
+ DWORD dwMilliSecsTimeout,
+ FILTER_STATE *State)
+{
+ *State = m_FilterState;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::SetSyncSource(
+ IReferenceClock *pClock)
+{
+ if (pClock)
+ {
+ pClock->AddRef();
+
+ }
+
+ if (m_ReferenceClock)
+ {
+ m_ReferenceClock->Release();
+ }
+
+ m_ReferenceClock = pClock;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::GetSyncSource(
+ IReferenceClock **pClock)
+{
+ if (!pClock)
+ return E_POINTER;
+
+ if (m_ReferenceClock)
+ m_ReferenceClock->AddRef();
+
+ *pClock = m_ReferenceClock;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::EnumPins(
+ IEnumPins **ppEnum)
+{
+ if (m_Pins[0] == 0)
+ {
+ HRESULT hr = CPin_fnConstructor(NULL, (IBaseFilter*)this, IID_IUnknown, (void**)&m_Pins[0]);
+ if (FAILED(hr))
+ return hr;
+ }
+
+ return CEnumPins_fnConstructor(NULL, 1, m_Pins, IID_IEnumPins, (void**)ppEnum);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::FindPin(
+ LPCWSTR Id, IPin **ppPin)
+{
+ OutputDebugStringW(L"CNetworkProvider::FindPin : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::QueryFilterInfo(
+ FILTER_INFO *pInfo)
+{
+ if (!pInfo)
+ return E_POINTER;
+
+ pInfo->achName[0] = L'\0';
+ pInfo->pGraph = m_pGraph;
+
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::JoinFilterGraph(
+ IFilterGraph *pGraph,
+ LPCWSTR pName)
+{
+ if (pGraph)
+ {
+ // joining filter graph
+ m_pGraph = pGraph;
+ }
+ else
+ {
+ // leaving graph
+ m_pGraph = 0;
+ }
+
+ OutputDebugStringW(L"CNetworkProvider::JoinFilterGraph\n");
+ return S_OK;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::QueryVendorInfo(
+ LPWSTR *pVendorInfo)
+{
+ OutputDebugStringW(L"CNetworkProvider::QueryVendorInfo : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IAMovieSetup interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::Register()
+{
+ OutputDebugStringW(L"CNetworkProvider::Register : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::Unregister()
+{
+ OutputDebugStringW(L"CNetworkProvider::Unregister : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IBDA_NetworkProvider interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::PutSignalSource(
+ ULONG ulSignalSource)
+{
+ OutputDebugStringW(L"CNetworkProvider::PutSignalSource : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::GetSignalSource(
+ ULONG *pulSignalSource)
+{
+ OutputDebugStringW(L"CNetworkProvider::GetSignalSource : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::GetNetworkType(
+ GUID *pguidNetworkType)
+{
+ OutputDebugStringW(L"CNetworkProvider::GetNetworkType : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::PutTuningSpace(
+ REFGUID guidTuningSpace)
+{
+ OutputDebugStringW(L"CNetworkProvider::PutTuningSpace : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::GetTuningSpace(
+ GUID *pguidTuingSpace)
+{
+ OutputDebugStringW(L"CNetworkProvider::GetTuningSpace : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::RegisterDeviceFilter(
+ IUnknown *pUnkFilterControl,
+ ULONG *ppvRegisitrationContext)
+{
+ OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::UnRegisterDeviceFilter(ULONG pvRegistrationContext)
+{
+ OutputDebugStringW(L"CNetworkProvider::UnRegisterDeviceFilter : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CNetworkProvider_fnConstructor(
+ IUnknown *pUnknown,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ CNetworkProvider * handler = new CNetworkProvider();
+
+#ifdef MSDVBNP_TRACE
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(riid, &lpstr);
+ swprintf(Buffer, L"CNetworkProvider_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (!handler)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(handler->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete handler;
+ return E_NOINTERFACE;
+ }
+ return NOERROR;
+}
diff --git a/dll/directx/msdvbnp/pin.cpp b/dll/directx/msdvbnp/pin.cpp
new file mode 100644
index 00000000000..9662f809133
--- /dev/null
+++ b/dll/directx/msdvbnp/pin.cpp
@@ -0,0 +1,262 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Network Provider for MPEG2 based networks
+ * FILE: dll/directx/msdvbnp/pin.cpp
+ * PURPOSE: IPin interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+const GUID KSDATAFORMAT_TYPE_BDA_ANTENNA = {0x71985f41, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
+const GUID GUID_NULL = {0x00000000L, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
+
+class CPin : public IPin
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+ if (!m_Ref)
+ {
+ delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+ //IPin methods
+ HRESULT STDMETHODCALLTYPE Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt);
+ HRESULT STDMETHODCALLTYPE ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt);
+ HRESULT STDMETHODCALLTYPE Disconnect();
+ HRESULT STDMETHODCALLTYPE ConnectedTo(IPin **pPin);
+ HRESULT STDMETHODCALLTYPE ConnectionMediaType(AM_MEDIA_TYPE *pmt);
+ HRESULT STDMETHODCALLTYPE QueryPinInfo(PIN_INFO *pInfo);
+ HRESULT STDMETHODCALLTYPE QueryDirection(PIN_DIRECTION *pPinDir);
+ HRESULT STDMETHODCALLTYPE QueryId(LPWSTR *Id);
+ HRESULT STDMETHODCALLTYPE QueryAccept(const AM_MEDIA_TYPE *pmt);
+ HRESULT STDMETHODCALLTYPE EnumMediaTypes(IEnumMediaTypes **ppEnum);
+ HRESULT STDMETHODCALLTYPE QueryInternalConnections(IPin **apPin, ULONG *nPin);
+ HRESULT STDMETHODCALLTYPE EndOfStream();
+ HRESULT STDMETHODCALLTYPE BeginFlush();
+ HRESULT STDMETHODCALLTYPE EndFlush();
+ HRESULT STDMETHODCALLTYPE NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+
+ CPin(IBaseFilter * ParentFilter) : m_Ref(0), m_ParentFilter(ParentFilter){};
+ virtual ~CPin(){};
+
+ static LPCWSTR PIN_ID;
+
+protected:
+ LONG m_Ref;
+ IBaseFilter * m_ParentFilter;
+};
+
+
+LPCWSTR CPin::PIN_ID = L"Antenna Out";
+
+HRESULT
+STDMETHODCALLTYPE
+CPin::QueryInterface(
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ if (IsEqualGUID(refiid, IID_IUnknown))
+ {
+ *Output = PVOID(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+ if (IsEqualGUID(refiid, IID_IPin))
+ {
+ *Output = (IPin*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CPin::QueryInterface: NoInterface for %s\n", lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+
+ return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IPin interface
+//
+HRESULT
+STDMETHODCALLTYPE
+CPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
+{
+ OutputDebugStringW(L"CPin::Connect called\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CPin::ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt)
+{
+ OutputDebugStringW(L"CPin::ReceiveConnection called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::Disconnect( void)
+{
+ OutputDebugStringW(L"CPin::Disconnect called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::ConnectedTo(IPin **pPin)
+{
+ OutputDebugStringW(L"CPin::ConnectedTo called\n");
+ return VFW_E_NOT_CONNECTED;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt)
+{
+ OutputDebugStringW(L"CPin::ConnectionMediaType called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::QueryPinInfo(PIN_INFO *pInfo)
+{
+ wcscpy(pInfo->achName, PIN_ID);
+ pInfo->dir = PINDIR_OUTPUT;
+ pInfo->pFilter = m_ParentFilter;
+ m_ParentFilter->AddRef();
+
+ return S_OK;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::QueryDirection(PIN_DIRECTION *pPinDir)
+{
+ if (pPinDir)
+ {
+ *pPinDir = PINDIR_OUTPUT;
+ return S_OK;
+ }
+
+ return E_POINTER;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::QueryId(LPWSTR *Id)
+{
+ *Id = (LPWSTR)CoTaskMemAlloc(sizeof(PIN_ID));
+ if (!*Id)
+ return E_OUTOFMEMORY;
+
+ wcscpy(*Id, PIN_ID);
+ return S_OK;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::QueryAccept(const AM_MEDIA_TYPE *pmt)
+{
+ OutputDebugStringW(L"CPin::QueryAccept called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::EnumMediaTypes(IEnumMediaTypes **ppEnum)
+{
+ AM_MEDIA_TYPE *MediaType = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
+
+ if (!MediaType)
+ {
+ return E_OUTOFMEMORY;
+ }
+
+ MediaType->majortype = KSDATAFORMAT_TYPE_BDA_ANTENNA;
+ MediaType->subtype = MEDIASUBTYPE_None;
+ MediaType->formattype = FORMAT_None;
+ MediaType->bFixedSizeSamples = true;
+ MediaType->bTemporalCompression = false;
+ MediaType->lSampleSize = sizeof(CHAR);
+ MediaType->pUnk = NULL;
+ MediaType->cbFormat = 0;
+ MediaType->pbFormat = NULL;
+
+ return CEnumMediaTypes_fnConstructor(NULL, 1, MediaType, IID_IEnumMediaTypes, (void**)ppEnum);
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::QueryInternalConnections(IPin **apPin, ULONG *nPin)
+{
+ OutputDebugStringW(L"CPin::QueryInternalConnections called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::EndOfStream( void)
+{
+ OutputDebugStringW(L"CPin::EndOfStream called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::BeginFlush( void)
+{
+ OutputDebugStringW(L"CPin::BeginFlush called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::EndFlush( void)
+{
+ OutputDebugStringW(L"CPin::EndFlush called\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
+{
+ OutputDebugStringW(L"CPin::NewSegment called\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CPin_fnConstructor(
+ IUnknown *pUnknown,
+ IBaseFilter * ParentFilter,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ CPin * handler = new CPin(ParentFilter);
+
+#ifdef MSDVBNP_TRACE
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(riid, &lpstr);
+ swprintf(Buffer, L"CPin_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (!handler)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(handler->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete handler;
+ return E_NOINTERFACE;
+ }
+
+ return NOERROR;
+}
\ No newline at end of file
diff --git a/dll/directx/msdvbnp/precomp.h b/dll/directx/msdvbnp/precomp.h
new file mode 100644
index 00000000000..d20b9ac9d81
--- /dev/null
+++ b/dll/directx/msdvbnp/precomp.h
@@ -0,0 +1,82 @@
+#ifndef PRECOMP_H__
+#define PRECOMP_H__
+
+#define MSDVBNP_TRACE
+#define BUILDING_KS
+#define _KSDDK_
+#include
+//#include
+#include
+#define __STREAMS__
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject);
+
+typedef struct
+{
+ const GUID* riid;
+ LPFNCREATEINSTANCE lpfnCI;
+} INTERFACE_TABLE;
+
+/* classfactory.cpp */
+IClassFactory *
+CClassFactory_fnConstructor(
+ LPFNCREATEINSTANCE lpfnCI,
+ PLONG pcRefDll,
+ IID * riidInst);
+
+/* networkprovider.cpp */
+HRESULT
+WINAPI
+CNetworkProvider_fnConstructor(
+ IUnknown *pUnknown,
+ REFIID riid,
+ LPVOID * ppv);
+
+/* scanningtunner.cpp */
+HRESULT
+WINAPI
+CScanningTunner_fnConstructor(
+ IUnknown *pUnknown,
+ REFIID riid,
+ LPVOID * ppv);
+
+/* enumpins.cpp */
+HRESULT
+WINAPI
+CEnumPins_fnConstructor(
+ IUnknown *pUnknown,
+ ULONG NumPins,
+ IPin ** pins,
+ REFIID riid,
+ LPVOID * ppv);
+
+/* pin.cpp */
+HRESULT
+WINAPI
+CPin_fnConstructor(
+ IUnknown *pUnknown,
+ IBaseFilter * ParentFilter,
+ REFIID riid,
+ LPVOID * ppv);
+
+/* enum_mediatypes.cpp */
+HRESULT
+WINAPI
+CEnumMediaTypes_fnConstructor(
+ IUnknown *pUnknown,
+ ULONG MediaTypeCount,
+ AM_MEDIA_TYPE * MediaTypes,
+ REFIID riid,
+ LPVOID * ppv);
+
+#endif
diff --git a/dll/directx/msdvbnp/scanningtuner.cpp b/dll/directx/msdvbnp/scanningtuner.cpp
new file mode 100644
index 00000000000..0c9b7782d2b
--- /dev/null
+++ b/dll/directx/msdvbnp/scanningtuner.cpp
@@ -0,0 +1,264 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Network Provider for MPEG2 based networks
+ * FILE: dll/directx/msdvbnp/networkprovider.cpp
+ * PURPOSE: IScanningTunner interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CScanningTunner : public IScanningTuner
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+ if (!m_Ref)
+ {
+ delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+ //ITuner methods
+ HRESULT STDMETHODCALLTYPE get_TuningSpace(ITuningSpace **TuningSpace);
+ HRESULT STDMETHODCALLTYPE put_TuningSpace(ITuningSpace *TuningSpace);
+ HRESULT STDMETHODCALLTYPE EnumTuningSpaces(IEnumTuningSpaces **ppEnum);
+ HRESULT STDMETHODCALLTYPE get_TuneRequest(ITuneRequest **TuneRequest);
+ HRESULT STDMETHODCALLTYPE put_TuneRequest(ITuneRequest *TuneRequest);
+ HRESULT STDMETHODCALLTYPE Validate(ITuneRequest *TuneRequest);
+ HRESULT STDMETHODCALLTYPE get_PreferredComponentTypes(IComponentTypes **ComponentTypes);
+ HRESULT STDMETHODCALLTYPE put_PreferredComponentTypes(IComponentTypes *ComponentTypes);
+ HRESULT STDMETHODCALLTYPE get_SignalStrength(long *Strength);
+ HRESULT STDMETHODCALLTYPE TriggerSignalEvents(long Interval);
+
+ //IScanningTuner methods
+ HRESULT STDMETHODCALLTYPE SeekUp();
+ HRESULT STDMETHODCALLTYPE SeekDown();
+ HRESULT STDMETHODCALLTYPE ScanUp(long MillisecondsPause);
+ HRESULT STDMETHODCALLTYPE ScanDown(long MillisecondsPause);
+ HRESULT STDMETHODCALLTYPE AutoProgram();
+
+ CScanningTunner() : m_Ref(0), m_TuningSpace(0){};
+ virtual ~CScanningTunner(){};
+
+protected:
+ LONG m_Ref;
+ ITuningSpace * m_TuningSpace;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::QueryInterface(
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ if (IsEqualGUID(refiid, IID_IUnknown))
+ {
+ *Output = PVOID(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+ if (IsEqualGUID(refiid, IID_ITuner))
+ {
+ *Output = (ITuner*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ if (IsEqualGUID(refiid, IID_IScanningTuner))
+ {
+ *Output = (IScanningTuner*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CScanningTunner::QueryInterface: NoInterface for %s\n", lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+
+
+ return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+//ITuner
+//
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::get_TuningSpace(
+ ITuningSpace **TuningSpace)
+{
+ OutputDebugStringW(L"CScanningTunner::get_TuningSpace\n");
+
+ *TuningSpace = m_TuningSpace;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::put_TuningSpace(
+ ITuningSpace *TuningSpace)
+{
+ OutputDebugStringW(L"CScanningTunner::put_TuningSpace\n");
+ m_TuningSpace = TuningSpace;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::EnumTuningSpaces(
+ IEnumTuningSpaces **ppEnum)
+{
+ OutputDebugStringW(L"CScanningTunner::EnumTuningSpaces : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::get_TuneRequest(
+ ITuneRequest **TuneRequest)
+{
+ OutputDebugStringW(L"CScanningTunner::get_TuneRequest : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::put_TuneRequest(
+ ITuneRequest *TuneRequest)
+{
+ OutputDebugStringW(L"CScanningTunner::put_TuneRequest : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::Validate(
+ ITuneRequest *TuneRequest)
+{
+ OutputDebugStringW(L"CScanningTunner::Validate : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::get_PreferredComponentTypes(
+ IComponentTypes **ComponentTypes)
+{
+ OutputDebugStringW(L"CScanningTunner::get_PreferredComponentTypes : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::put_PreferredComponentTypes(
+ IComponentTypes *ComponentTypes)
+{
+ OutputDebugStringW(L"CScanningTunner::put_PreferredComponentTypes : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::get_SignalStrength(
+ long *Strength)
+{
+ OutputDebugStringW(L"CScanningTunner::get_SignalStrength : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::TriggerSignalEvents(
+ long Interval)
+{
+ OutputDebugStringW(L"CScanningTunner::TriggerSignalEvents : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+//IScanningTuner
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::SeekUp()
+{
+ OutputDebugStringW(L"CScanningTunner::SeekUp : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::SeekDown()
+{
+ OutputDebugStringW(L"CScanningTunner::SeekDown : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::ScanUp(
+ long MillisecondsPause)
+{
+ OutputDebugStringW(L"CScanningTunner::ScanUp : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::ScanDown(
+ long MillisecondsPause)
+{
+ OutputDebugStringW(L"CScanningTunner::ScanDown : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::AutoProgram()
+{
+ OutputDebugStringW(L"CScanningTunner::AutoProgram : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CScanningTunner_fnConstructor(
+ IUnknown *pUnknown,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ CScanningTunner * handler = new CScanningTunner();
+
+#ifdef MSDVBNP_TRACE
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(riid, &lpstr);
+ swprintf(Buffer, L"CScanningTunner_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (!handler)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(handler->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete handler;
+ return E_NOINTERFACE;
+ }
+
+ return NOERROR;
+}
\ No newline at end of file
diff --git a/dll/directx/msvidctl/classfactory.cpp b/dll/directx/msvidctl/classfactory.cpp
new file mode 100644
index 00000000000..8af2a69546f
--- /dev/null
+++ b/dll/directx/msvidctl/classfactory.cpp
@@ -0,0 +1,106 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS BDA Proxy
+ * FILE: dll/directx/msvidctl/classfactory.cpp
+ * PURPOSE: ClassFactory interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
+const GUID IID_IClassFactory = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
+
+class CClassFactory : public IClassFactory
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+ if (!m_Ref)
+ {
+ delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+ HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject);
+ HRESULT WINAPI LockServer(BOOL fLock);
+
+ CClassFactory(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, IID *riidInst) : m_Ref(1), m_lpfnCI(lpfnCI), m_IID(riidInst)
+ {};
+
+ virtual ~CClassFactory(){};
+
+protected:
+ LONG m_Ref;
+ LPFNCREATEINSTANCE m_lpfnCI;
+ IID * m_IID;
+};
+
+HRESULT
+WINAPI
+CClassFactory::QueryInterface(
+ REFIID riid,
+ LPVOID *ppvObj)
+{
+ *ppvObj = NULL;
+ if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
+ {
+ *ppvObj = PVOID(this);
+ InterlockedIncrement(&m_Ref);
+ return S_OK;
+ }
+ return E_NOINTERFACE;
+}
+
+HRESULT
+WINAPI
+CClassFactory::CreateInstance(
+ LPUNKNOWN pUnkOuter,
+ REFIID riid,
+ LPVOID *ppvObject)
+{
+ *ppvObject = NULL;
+
+ if ( m_IID == NULL || IsEqualCLSID(riid, *m_IID) || IsEqualCLSID(riid, IID_IUnknown))
+ {
+ return m_lpfnCI(pUnkOuter, riid, ppvObject);
+ }
+
+ return E_NOINTERFACE;
+}
+
+HRESULT
+WINAPI
+CClassFactory::LockServer(
+ BOOL fLock)
+{
+ return E_NOTIMPL;
+}
+
+IClassFactory *
+CClassFactory_fnConstructor(
+ LPFNCREATEINSTANCE lpfnCI,
+ PLONG pcRefDll,
+ IID * riidInst)
+{
+ CClassFactory* factory = new CClassFactory(lpfnCI, pcRefDll, riidInst);
+
+ if (!factory)
+ return NULL;
+
+ if (pcRefDll)
+ InterlockedIncrement(pcRefDll);
+
+ return (LPCLASSFACTORY)factory;
+}
+
diff --git a/dll/directx/msvidctl/enumtuningspaces.cpp b/dll/directx/msvidctl/enumtuningspaces.cpp
new file mode 100644
index 00000000000..22d3e31bd47
--- /dev/null
+++ b/dll/directx/msvidctl/enumtuningspaces.cpp
@@ -0,0 +1,142 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS BDA Proxy
+ * FILE: dll/directx/msvidctl/tuningspace.cpp
+ * PURPOSE: ITuningSpace interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CEnumTuningSpaces : public IEnumTuningSpaces
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+ if (!m_Ref)
+ {
+ //delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+ // IEnumTuningSpaces methods
+ HRESULT STDMETHODCALLTYPE Next(ULONG celt, ITuningSpace **rgelt, ULONG *pceltFetched);
+ HRESULT STDMETHODCALLTYPE Skip(ULONG celt);
+ HRESULT STDMETHODCALLTYPE Reset();
+ HRESULT STDMETHODCALLTYPE Clone(IEnumTuningSpaces **ppEnum);
+
+ CEnumTuningSpaces() : m_Ref(0){};
+
+ virtual ~CEnumTuningSpaces(){};
+
+protected:
+ LONG m_Ref;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumTuningSpaces::QueryInterface(
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ if (IsEqualGUID(refiid, IID_IUnknown))
+ {
+ *Output = PVOID(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ if (IsEqualGUID(refiid, IID_IEnumTuningSpaces))
+ {
+ *Output = (IEnumTuningSpaces*)this;
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CEnumTuningSpaces::QueryInterface: NoInterface for %s\n", lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+
+ return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IEnumTuningSpaces
+//
+HRESULT
+STDMETHODCALLTYPE
+CEnumTuningSpaces::Next(ULONG celt, ITuningSpace **rgelt, ULONG *pceltFetched)
+{
+ OutputDebugStringW(L"CEnumTuningSpaces::Next : stub\n");
+ return CTuningSpace_fnConstructor(NULL, IID_ITuningSpace, (void**)rgelt);
+
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumTuningSpaces::Skip(ULONG celt)
+{
+ OutputDebugStringW(L"CEnumTuningSpaces::Skip : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumTuningSpaces::Reset()
+{
+ OutputDebugStringW(L"CEnumTuningSpaces::Reset : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumTuningSpaces::Clone(IEnumTuningSpaces **ppEnum)
+{
+ OutputDebugStringW(L"CEnumTuningSpaces::Clone : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CEnumTuningSpaces_fnConstructor(
+ IUnknown *pUnknown,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ // construct device control
+ CEnumTuningSpaces * tuningspaces = new CEnumTuningSpaces();
+
+#ifdef MSVIDCTL_TRACE
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(riid, &lpstr);
+ swprintf(Buffer, L"CEnumTuningSpaces_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (!tuningspaces)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(tuningspaces->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete tuningspaces;
+ return E_NOINTERFACE;
+ }
+
+ return NOERROR;
+}
+
diff --git a/dll/directx/msvidctl/msvidctl.cpp b/dll/directx/msvidctl/msvidctl.cpp
new file mode 100644
index 00000000000..b086e59d580
--- /dev/null
+++ b/dll/directx/msvidctl/msvidctl.cpp
@@ -0,0 +1,106 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS DVB
+ * FILE: dll/directx/msvidctl/msvidctl.cpp
+ * PURPOSE: ReactOS DVB Initialization
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+
+#include "precomp.h"
+
+static INTERFACE_TABLE InterfaceTable[] =
+{
+ {&CLSID_SystemTuningSpaces, CTuningSpaceContainer_fnConstructor},
+ {NULL, NULL}
+};
+
+extern "C"
+BOOL
+WINAPI
+DllMain(
+ HINSTANCE hInstDLL,
+ DWORD fdwReason,
+ LPVOID lpvReserved)
+{
+ switch (fdwReason)
+ {
+ case DLL_PROCESS_ATTACH:
+ CoInitialize(NULL);
+
+#ifdef MSDVBNP_TRACE
+ OutputDebugStringW(L"MSVIDCTL::DllMain()\n");
+#endif
+
+ DisableThreadLibraryCalls(hInstDLL);
+ break;
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+
+extern "C"
+KSDDKAPI
+HRESULT
+WINAPI
+DllUnregisterServer(void)
+{
+ return S_OK;
+}
+
+extern "C"
+KSDDKAPI
+HRESULT
+WINAPI
+DllRegisterServer(void)
+{
+ return S_OK;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+DllGetClassObject(
+ REFCLSID rclsid,
+ REFIID riid,
+ LPVOID *ppv)
+{
+ UINT i;
+ HRESULT hres = E_OUTOFMEMORY;
+ IClassFactory * pcf = NULL;
+
+ if (!ppv)
+ return E_INVALIDARG;
+
+ *ppv = NULL;
+
+ for (i = 0; InterfaceTable[i].riid; i++)
+ {
+ if (IsEqualIID(*InterfaceTable[i].riid, rclsid))
+ {
+ pcf = CClassFactory_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL);
+ break;
+ }
+ }
+
+ if (!pcf)
+ {
+ return CLASS_E_CLASSNOTAVAILABLE;
+ }
+
+ hres = pcf->QueryInterface(riid, ppv);
+ pcf->Release();
+
+ return hres;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+DllCanUnloadNow(void)
+{
+ return S_OK;
+}
diff --git a/dll/directx/msvidctl/msvidctl.rbuild b/dll/directx/msvidctl/msvidctl.rbuild
new file mode 100644
index 00000000000..a3da3fcbe09
--- /dev/null
+++ b/dll/directx/msvidctl/msvidctl.rbuild
@@ -0,0 +1,30 @@
+
+
+
+
+
+ .
+ ntdll
+ kernel32
+ advapi32
+ ole32
+ advapi32
+ msvcrt
+ strmiids
+
+ -fno-exceptions
+ -fno-rtti
+
+
+ /GR-
+
+
+ classfactory.cpp
+ enumtuningspaces.cpp
+ msvidctl.cpp
+ msvidctl.rc
+ tunerequest.cpp
+ tuningspace.cpp
+ tuningspace_container.cpp
+
+
diff --git a/dll/directx/msvidctl/msvidctl.rc b/dll/directx/msvidctl/msvidctl.rc
new file mode 100644
index 00000000000..43187901fe4
--- /dev/null
+++ b/dll/directx/msvidctl/msvidctl.rc
@@ -0,0 +1,12 @@
+#include
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS ActiveX Control for Streaming Video\0"
+#define REACTOS_STR_INTERNAL_NAME "MSVidCtl\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "MSVidCtl\0"
+#define REACTOS_STR_PRODUCT_VERSION "6.05.2600.3264\0"
+#define REACTOS_STR_FILE_VERSION "6.05.2600.3264\0"
+
+#include
diff --git a/dll/directx/msvidctl/msvidctl.spec b/dll/directx/msvidctl/msvidctl.spec
new file mode 100644
index 00000000000..5baed04ed66
--- /dev/null
+++ b/dll/directx/msvidctl/msvidctl.spec
@@ -0,0 +1,4 @@
+@ stdcall DllCanUnloadNow()
+@ stdcall DllGetClassObject(ptr ptr ptr)
+@ stdcall DllRegisterServer()
+@ stdcall DllUnregisterServer()
diff --git a/dll/directx/msvidctl/precomp.h b/dll/directx/msvidctl/precomp.h
new file mode 100644
index 00000000000..a5b86272e2d
--- /dev/null
+++ b/dll/directx/msvidctl/precomp.h
@@ -0,0 +1,72 @@
+#ifndef PRECOMP_H__
+#define PRECOMP_H__
+
+#define MSVIDCTL_TRACE
+#define BUILDING_KS
+#define _KSDDK_
+#include
+//#include
+#include
+#define __STREAMS__
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject);
+
+typedef struct
+{
+ const GUID* riid;
+ LPFNCREATEINSTANCE lpfnCI;
+} INTERFACE_TABLE;
+
+/* classfactory.cpp */
+IClassFactory *
+CClassFactory_fnConstructor(
+ LPFNCREATEINSTANCE lpfnCI,
+ PLONG pcRefDll,
+ IID * riidInst);
+
+/* tuningspace_container.cpp */
+HRESULT
+WINAPI
+CTuningSpaceContainer_fnConstructor(
+ IUnknown *pUnknown,
+ REFIID riid,
+ LPVOID * ppv);
+
+/* tuningspace.cpp */
+HRESULT
+WINAPI
+CTuningSpace_fnConstructor(
+ IUnknown *pUnknown,
+ REFIID riid,
+ LPVOID * ppv);
+
+/* tunerequest.cpp */
+HRESULT
+WINAPI
+CTuneRequest_fnConstructor(
+ IUnknown *pUnknown,
+ ITuningSpace * TuningSpace,
+ REFIID riid,
+ LPVOID * ppv);
+
+/* enumtuningspaces.cpp */
+HRESULT
+WINAPI
+CEnumTuningSpaces_fnConstructor(
+ IUnknown *pUnknown,
+ REFIID riid,
+ LPVOID * ppv);
+
+
+
+#endif
diff --git a/dll/directx/msvidctl/tunerequest.cpp b/dll/directx/msvidctl/tunerequest.cpp
new file mode 100644
index 00000000000..3bee7cfc194
--- /dev/null
+++ b/dll/directx/msvidctl/tunerequest.cpp
@@ -0,0 +1,331 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS BDA Proxy
+ * FILE: dll/directx/msvidctl/tuningspace.cpp
+ * PURPOSE: ITuningRequest interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CTuneRequest : public IDVBTuneRequest
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+ if (!m_Ref)
+ {
+ OutputDebugStringW(L"CTuneRequest::Release : delete\n");
+
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"CTuneRequest::Release : m_TuningSpace %p delete\n", m_TuningSpace);
+ OutputDebugStringW(Buffer);
+
+
+ m_TuningSpace->Release();
+ //delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+ //IDispatch methods
+ HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
+ HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
+ HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
+ HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
+
+ //ITuneRequest methods
+ HRESULT STDMETHODCALLTYPE get_TuningSpace(ITuningSpace **TuningSpace);
+ HRESULT STDMETHODCALLTYPE get_Components(IComponents **Components);
+ HRESULT STDMETHODCALLTYPE Clone(ITuneRequest **NewTuneRequest);
+ HRESULT STDMETHODCALLTYPE get_Locator(ILocator **Locator);
+ HRESULT STDMETHODCALLTYPE put_Locator(ILocator *Locator);
+
+ //IDVBTuneRequest methods
+ HRESULT STDMETHODCALLTYPE get_ONID(long *ONID);
+ HRESULT STDMETHODCALLTYPE put_ONID(long ONID);
+ HRESULT STDMETHODCALLTYPE get_TSID(long *TSID);
+ HRESULT STDMETHODCALLTYPE put_TSID(long TSID);
+ HRESULT STDMETHODCALLTYPE get_SID(long *SID);
+ HRESULT STDMETHODCALLTYPE put_SID(long SID);
+
+ CTuneRequest(ITuningSpace * TuningSpace) : m_Ref(0), m_ONID(-1), m_TSID(-1), m_SID(-1), m_Locator(0), m_TuningSpace(TuningSpace)
+ {
+ m_TuningSpace->AddRef();
+ };
+
+ CTuneRequest(ITuningSpace * TuningSpace, LONG ONID, LONG TSID, LONG SID, ILocator * Locator) : m_Ref(1), m_ONID(ONID), m_TSID(TSID), m_SID(SID), m_Locator(Locator), m_TuningSpace(TuningSpace)
+ {
+ if (m_Locator)
+ m_Locator->AddRef();
+
+ m_TuningSpace->AddRef();
+ };
+
+ virtual ~CTuneRequest(){};
+
+protected:
+ LONG m_Ref;
+ LONG m_ONID;
+ LONG m_TSID;
+ LONG m_SID;
+ ILocator * m_Locator;
+ ITuningSpace * m_TuningSpace;
+};
+
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::QueryInterface(
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ if (IsEqualGUID(refiid, IID_IUnknown))
+ {
+ *Output = PVOID(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ if (IsEqualGUID(refiid, IID_ITuneRequest))
+ {
+ *Output = (ITuneRequest*)this;
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ if (IsEqualGUID(refiid, IID_IDVBTuneRequest))
+ {
+ *Output = (IDVBTuneRequest*)this;
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CTuneRequest::QueryInterface: NoInterface for %s", lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+
+
+ return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IDispatch methods
+//
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::GetTypeInfoCount(UINT *pctinfo)
+{
+ OutputDebugStringW(L"CTuneRequest::GetTypeInfoCount : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
+{
+ OutputDebugStringW(L"CTuneRequest::GetTypeInfo : NotImplemented\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+ OutputDebugStringW(L"CTuneRequest::GetIDsOfNames : NotImplemented\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+ OutputDebugStringW(L"CTuneRequest::Invoke : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// ITuneRequest interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::get_TuningSpace(ITuningSpace **TuningSpace)
+{
+#ifdef MSVIDCTL_TRACE
+ OutputDebugStringW(L"CTuneRequest::get_TuningSpace\n");
+#endif
+
+ *TuningSpace = m_TuningSpace;
+ m_TuningSpace->AddRef();
+
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::get_Components(IComponents **Components)
+{
+ OutputDebugStringW(L"CTuneRequest::get_Components : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::Clone(ITuneRequest **NewTuneRequest)
+{
+#ifdef MSVIDCTL_TRACE
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"CTuneRequest::Clone %p\n", NewTuneRequest);
+ OutputDebugStringW(Buffer);
+#endif
+
+ *NewTuneRequest = new CTuneRequest(m_TuningSpace, m_ONID, m_TSID, m_SID, m_Locator);
+
+ if (!*NewTuneRequest)
+ return E_OUTOFMEMORY;
+
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::get_Locator(ILocator **Locator)
+{
+ OutputDebugStringW(L"CTuneRequest::get_Locator : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::put_Locator(ILocator *Locator)
+{
+ OutputDebugStringW(L"CTuneRequest::put_Locator : stub\n");
+ m_Locator = Locator;
+
+ return S_OK;
+}
+
+//-------------------------------------------------------------------
+// IDVBTuneRequest interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::get_ONID(long *ONID)
+{
+#ifdef MSVIDCTL_TRACE
+ OutputDebugStringW(L"CTuneRequest::get_ONID\n");
+#endif
+
+ *ONID = m_ONID;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::put_ONID(long ONID)
+{
+#ifdef MSVIDCTL_TRACE
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"CTuneRequest::put_ONID : %lu\n", ONID);
+ OutputDebugStringW(Buffer);
+#endif
+
+ m_ONID = ONID;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::get_TSID(long *TSID)
+{
+#ifdef MSVIDCTL_TRACE
+ OutputDebugStringW(L"CTuneRequest::get_TSID\n");
+#endif
+
+ *TSID = m_TSID;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::put_TSID(long TSID)
+{
+#ifdef MSVIDCTL_TRACE
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"CTuneRequest::put_TSID : %lu\n", TSID);
+ OutputDebugStringW(Buffer);
+#endif
+
+ m_TSID = TSID;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::get_SID(long *SID)
+{
+#ifdef MSVIDCTL_TRACE
+ OutputDebugStringW(L"CTuneRequest::get_SID\n");
+#endif
+
+ *SID = m_SID;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::put_SID(long SID)
+{
+#ifdef MSVIDCTL_TRACE
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"CTuneRequest::put_SID : %lu\n", SID);
+ OutputDebugStringW(Buffer);
+#endif
+
+ m_SID = SID;
+ return S_OK;
+}
+
+HRESULT
+WINAPI
+CTuneRequest_fnConstructor(
+ IUnknown *pUnknown,
+ ITuningSpace * TuningSpace,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ // construct device control
+ CTuneRequest * request = new CTuneRequest(TuningSpace);
+
+#ifdef MSVIDCTL_TRACE
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(riid, &lpstr);
+ swprintf(Buffer, L"CTuneRequest_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (!request)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(request->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete request;
+ return E_NOINTERFACE;
+ }
+
+ return NOERROR;
+}
diff --git a/dll/directx/msvidctl/tuningspace.cpp b/dll/directx/msvidctl/tuningspace.cpp
new file mode 100644
index 00000000000..035542e595d
--- /dev/null
+++ b/dll/directx/msvidctl/tuningspace.cpp
@@ -0,0 +1,365 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS BDA Proxy
+ * FILE: dll/directx/msvidctl/tuningspace.cpp
+ * PURPOSE: ITuningSpace interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+const GUID CLSID_DVBTNetworkProvider = {0x216c62df, 0x6d7f, 0x4e9a, {0x85, 0x71, 0x5, 0xf1, 0x4e, 0xdb, 0x76, 0x6a}};
+
+class CTuningSpace : public IDVBTuningSpace
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"CTuningSpace::Release : %p Ref %lu\n", this, m_Ref);
+ OutputDebugStringW(Buffer);
+
+ if (!m_Ref)
+ {
+ //delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+ // IDispatch methods
+ HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
+ HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
+ HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
+ HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
+
+
+ //ITuningSpace methods
+ HRESULT STDMETHODCALLTYPE get_UniqueName(BSTR *Name);
+ HRESULT STDMETHODCALLTYPE put_UniqueName(BSTR Name);
+ HRESULT STDMETHODCALLTYPE get_FriendlyName(BSTR *Name);
+ HRESULT STDMETHODCALLTYPE put_FriendlyName(BSTR Name);
+ HRESULT STDMETHODCALLTYPE get_CLSID(BSTR *SpaceCLSID);
+ HRESULT STDMETHODCALLTYPE get_NetworkType(BSTR *NetworkTypeGuid);
+ HRESULT STDMETHODCALLTYPE put_NetworkType(BSTR NetworkTypeGuid);
+ HRESULT STDMETHODCALLTYPE get__NetworkType(GUID *NetworkTypeGuid);
+ HRESULT STDMETHODCALLTYPE put__NetworkType(REFCLSID NetworkTypeGuid);
+ HRESULT STDMETHODCALLTYPE CreateTuneRequest(ITuneRequest **TuneRequest);
+ HRESULT STDMETHODCALLTYPE EnumCategoryGUIDs(IEnumGUID **ppEnum);
+ HRESULT STDMETHODCALLTYPE EnumDeviceMonikers(IEnumMoniker **ppEnum);
+ HRESULT STDMETHODCALLTYPE get_DefaultPreferredComponentTypes(IComponentTypes **ComponentTypes);
+ HRESULT STDMETHODCALLTYPE put_DefaultPreferredComponentTypes(IComponentTypes *NewComponentTypes);
+ HRESULT STDMETHODCALLTYPE get_FrequencyMapping(BSTR *pMapping);
+ HRESULT STDMETHODCALLTYPE put_FrequencyMapping(BSTR Mapping);
+ HRESULT STDMETHODCALLTYPE get_DefaultLocator(ILocator **LocatorVal);
+ HRESULT STDMETHODCALLTYPE put_DefaultLocator(ILocator *LocatorVal);
+ HRESULT STDMETHODCALLTYPE Clone(ITuningSpace **NewTS);
+ // IDVBTuningSpace
+ HRESULT STDMETHODCALLTYPE get_SystemType(DVBSystemType *SysType);
+ HRESULT STDMETHODCALLTYPE put_SystemType(DVBSystemType SysType);
+
+ CTuningSpace() : m_Ref(0){};
+
+ virtual ~CTuningSpace(){};
+
+protected:
+ LONG m_Ref;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::QueryInterface(
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ if (IsEqualGUID(refiid, IID_IUnknown))
+ {
+ *Output = PVOID(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ if (IsEqualGUID(refiid, IID_ITuningSpace))
+ {
+ *Output = (ITuningSpace*)this;
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ if (IsEqualGUID(refiid, IID_IDVBTuningSpace))
+ {
+ *Output = (IDVBTuningSpace*)this;
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CTuningSpace::QueryInterface: NoInterface for %s", lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+
+
+ return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IDispatch methods
+//
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::GetTypeInfoCount(UINT *pctinfo)
+{
+ OutputDebugStringW(L"CTuningSpace::GetTypeInfoCount : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
+{
+ OutputDebugStringW(L"CTuningSpace::GetTypeInfo : NotImplemented\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+ OutputDebugStringW(L"CTuningSpace::GetIDsOfNames : NotImplemented\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+ OutputDebugStringW(L"CTuningSpace::Invoke : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+
+//-------------------------------------------------------------------
+// ITuningSpace interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_UniqueName(BSTR *Name)
+{
+ OutputDebugStringW(L"CTuningSpace::get_UniqueName : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put_UniqueName(BSTR Name)
+{
+ OutputDebugStringW(L"CTuningSpace::put_UniqueName : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_FriendlyName(BSTR *Name)
+{
+ OutputDebugStringW(L"CTuningSpace::get_FriendlyName : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put_FriendlyName(BSTR Name)
+{
+ OutputDebugStringW(L"CTuningSpace::put_FriendlyName : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_CLSID(BSTR *SpaceCLSID)
+{
+ OutputDebugStringW(L"CTuningSpace::get_CLSID : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_NetworkType(BSTR *NetworkTypeGuid)
+{
+ OutputDebugStringW(L"CTuningSpace::get_NetworkType : stub\n");
+ return StringFromCLSID(CLSID_DVBTNetworkProvider, (LPOLESTR*)NetworkTypeGuid);
+
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put_NetworkType(BSTR NetworkTypeGuid)
+{
+ OutputDebugStringW(L"CTuningSpace::put_NetworkType : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get__NetworkType(GUID *NetworkTypeGuid)
+{
+#ifdef MSVIDCTL_TRACE
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"CTuningSpace::get__NetworkType : %p stub\n", NetworkTypeGuid);
+ OutputDebugStringW(Buffer);
+#endif
+
+ CopyMemory(NetworkTypeGuid, &CLSID_DVBTNetworkProvider, sizeof(GUID));
+ OutputDebugStringW(L"CTuningSpace::get__NetworkType : done\n");
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put__NetworkType(REFCLSID NetworkTypeGuid)
+{
+ OutputDebugStringW(L"CTuningSpace::put__NetworkType : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::CreateTuneRequest(ITuneRequest **TuneRequest)
+{
+ OutputDebugStringW(L"CTuningSpace::CreateTuneRequest : stub\n");
+ return CTuneRequest_fnConstructor(NULL, (ITuningSpace*)this, IID_ITuneRequest, (void**)TuneRequest);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::EnumCategoryGUIDs(IEnumGUID **ppEnum)
+{
+ OutputDebugStringW(L"CTuningSpace::EnumCategoryGUIDs : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::EnumDeviceMonikers(IEnumMoniker **ppEnum)
+{
+ OutputDebugStringW(L"CTuningSpace::EnumDeviceMonikers : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_DefaultPreferredComponentTypes(IComponentTypes **ComponentTypes)
+{
+ OutputDebugStringW(L"CTuningSpace::get_DefaultPreferredComponentTypes : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put_DefaultPreferredComponentTypes(IComponentTypes *NewComponentTypes)
+{
+ OutputDebugStringW(L"CTuningSpace::put_DefaultPreferredComponentTypes : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_FrequencyMapping(BSTR *pMapping)
+{
+ OutputDebugStringW(L"CTuningSpace::get_FrequencyMapping : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put_FrequencyMapping(BSTR Mapping)
+{
+ OutputDebugStringW(L"CTuningSpace::put_FrequencyMapping : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_DefaultLocator(ILocator **LocatorVal)
+{
+ OutputDebugStringW(L"CTuningSpace::get_DefaultLocator : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put_DefaultLocator(ILocator *LocatorVal)
+{
+ OutputDebugStringW(L"CTuningSpace::put_DefaultLocator : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::Clone(ITuningSpace **NewTS)
+{
+ OutputDebugStringW(L"CTuningSpace::Clone : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IDVBTuningSpace
+//
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_SystemType(DVBSystemType *SysType)
+{
+ OutputDebugStringW(L"CTuningSpace::get_SystemType : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put_SystemType(DVBSystemType SysType)
+{
+ OutputDebugStringW(L"CTuningSpace::put_SystemType : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CTuningSpace_fnConstructor(
+ IUnknown *pUnknown,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ // construct device control
+ CTuningSpace * space = new CTuningSpace();
+
+#ifdef MSVIDCTL_TRACE
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(riid, &lpstr);
+ swprintf(Buffer, L"CTuningSpace_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (!space)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(space->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete space;
+ return E_NOINTERFACE;
+ }
+
+ return NOERROR;
+}
+
+
diff --git a/dll/directx/msvidctl/tuningspace_container.cpp b/dll/directx/msvidctl/tuningspace_container.cpp
new file mode 100644
index 00000000000..e25fdc7a600
--- /dev/null
+++ b/dll/directx/msvidctl/tuningspace_container.cpp
@@ -0,0 +1,272 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS BDA Proxy
+ * FILE: dll/directx/msvidctl/tuningspace_container.cpp
+ * PURPOSE: ITuningSpaceContainer interface
+ *
+ * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
+ */
+#define _FORCENAMELESSUNION
+#include "precomp.h"
+
+
+class CTuningSpaceContainer : public ITuningSpaceContainer
+{
+public:
+
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+ if (!m_Ref)
+ {
+ OutputDebugStringW(L"CTuningSpaceContainer::Release : delete\n");
+ //delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+
+ // IDispatch methods
+ HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
+ HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
+ HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
+ HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
+
+ //ITuningSpaceContainer methods
+ HRESULT STDMETHODCALLTYPE get_Count(long *Count);
+ HRESULT STDMETHODCALLTYPE get__NewEnum(IEnumVARIANT **NewEnum);
+ HRESULT STDMETHODCALLTYPE get_Item(VARIANT varIndex, ITuningSpace **TuningSpace);
+ HRESULT STDMETHODCALLTYPE put_Item(VARIANT varIndex, ITuningSpace *TuningSpace);
+ HRESULT STDMETHODCALLTYPE TuningSpacesForCLSID(BSTR SpaceCLSID, ITuningSpaces **NewColl);
+ HRESULT STDMETHODCALLTYPE _TuningSpacesForCLSID(REFCLSID SpaceCLSID, ITuningSpaces **NewColl);
+ HRESULT STDMETHODCALLTYPE TuningSpacesForName(BSTR Name, ITuningSpaces **NewColl);
+ HRESULT STDMETHODCALLTYPE FindID(ITuningSpace *TuningSpace, long *ID);
+ HRESULT STDMETHODCALLTYPE Add(ITuningSpace *TuningSpace, VARIANT *NewIndex);
+ HRESULT STDMETHODCALLTYPE get_EnumTuningSpaces(IEnumTuningSpaces **ppEnum);
+ HRESULT STDMETHODCALLTYPE Remove(VARIANT Index);
+ HRESULT STDMETHODCALLTYPE get_MaxCount(long *MaxCount);
+ HRESULT STDMETHODCALLTYPE put_MaxCount(long MaxCount);
+
+ CTuningSpaceContainer() : m_Ref(0){};
+
+ virtual ~CTuningSpaceContainer(){};
+
+protected:
+ LONG m_Ref;
+
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::QueryInterface(
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+ if (IsEqualGUID(refiid, IID_IUnknown))
+ {
+ *Output = PVOID(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ if (IsEqualGUID(refiid, IID_ITuningSpaceContainer))
+ {
+ *Output = (ITuningSpaceContainer*)this;
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CTuningSpaceContainer::QueryInterface: NoInterface for %s", lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+
+
+ return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IDispatch methods
+//
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::GetTypeInfoCount(UINT *pctinfo)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::GetTypeInfoCount : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::GetTypeInfo : NotImplemented\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::GetIDsOfNames : NotImplemented\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::Invoke : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// ITuningSpaceContainer methods
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::get_Count(long *Count)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::get_Count : NotImplemented\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::get__NewEnum(IEnumVARIANT **NewEnum)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::get__NewEnum : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::get_Item(VARIANT varIndex, ITuningSpace **TuningSpace)
+{
+#ifdef MSVIDCTL_TRACE
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"CTuningSpaceContainer::get_Item : type %x value %s stub\n", varIndex.vt, varIndex.bstrVal);
+ OutputDebugStringW(Buffer);
+#endif
+
+ return CTuningSpace_fnConstructor(NULL, IID_ITuningSpace, (void**)TuningSpace);
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::put_Item(VARIANT varIndex, ITuningSpace *TuningSpace)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::put_Item : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::TuningSpacesForCLSID(BSTR SpaceCLSID, ITuningSpaces **NewColl)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::TuningSpacesForCLSID : NotImplemented\n");
+ return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::_TuningSpacesForCLSID(REFCLSID SpaceCLSID, ITuningSpaces **NewColl)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::_TuningSpacesForCLSID : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::TuningSpacesForName(BSTR Name, ITuningSpaces **NewColl)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::TuningSpacesForName : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::FindID(ITuningSpace *TuningSpace, long *ID)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::FindID : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::Add(ITuningSpace *TuningSpace, VARIANT *NewIndex)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::Add : stub\n");
+ TuningSpace->AddRef();
+ NewIndex->vt = VT_BSTR;
+ InterlockedIncrement(&m_Ref);
+ return TuningSpace->get_FriendlyName(&NewIndex->bstrVal);;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::get_EnumTuningSpaces(IEnumTuningSpaces **ppEnum)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::get_EnumTuningSpaces : stub\n");
+ return CEnumTuningSpaces_fnConstructor(NULL, IID_IEnumTuningSpaces, (void**)ppEnum);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::Remove(VARIANT Index)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::Remove: NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::get_MaxCount(long *MaxCount)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::get_MaxCount : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::put_MaxCount(long MaxCount)
+{
+ OutputDebugStringW(L"CTuningSpaceContainer::put_MaxCount : NotImplemented\n");
+ return E_NOTIMPL;
+}
+
+
+HRESULT
+WINAPI
+CTuningSpaceContainer_fnConstructor(
+ IUnknown *pUnknown,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ // construct device control
+ CTuningSpaceContainer * provider = new CTuningSpaceContainer();
+
+#ifdef MSVIDCTL_TRACE
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(riid, &lpstr);
+ swprintf(Buffer, L"CTuningSpaceContainer_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (!provider)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(provider->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete provider;
+ return E_NOINTERFACE;
+ }
+
+ return NOERROR;
+}
\ No newline at end of file
diff --git a/dll/directx/qedit/samplegrabber.c b/dll/directx/qedit/samplegrabber.c
index 4e80f24f4d5..d09d5546b19 100644
--- a/dll/directx/qedit/samplegrabber.c
+++ b/dll/directx/qedit/samplegrabber.c
@@ -33,19 +33,353 @@
WINE_DEFAULT_DEBUG_CHANNEL(qedit);
static WCHAR const vendor_name[] = { 'W', 'i', 'n', 'e', 0 };
+static WCHAR const pin_in_name[] = { 'I', 'n', 0 };
+static WCHAR const pin_out_name[] = { 'O', 'u', 't', 0 };
+
+IEnumPins *pinsenum_create(IBaseFilter *filter, IPin **pins, ULONG pinCount);
+IEnumMediaTypes *mediaenum_create(AM_MEDIA_TYPE *mtype);
+
+/* Fixed pins enumerator, holds filter referenced */
+typedef struct _PE_Impl {
+ IEnumPins pe;
+ IBaseFilter *filter;
+ LONG refCount;
+ ULONG numPins;
+ ULONG index;
+ IPin *pins[0];
+} PE_Impl;
+
+
+/* IEnumPins interface implementation */
+
+/* IUnknown */
+static ULONG WINAPI
+Fixed_IEnumPins_AddRef(IEnumPins *iface)
+{
+ PE_Impl *This = (PE_Impl *)iface;
+ ULONG refCount = InterlockedIncrement(&This->refCount);
+ TRACE("(%p) new ref = %u\n", This, refCount);
+ return refCount;
+}
+
+/* IUnknown */
+static ULONG WINAPI
+Fixed_IEnumPins_Release(IEnumPins *iface)
+{
+ PE_Impl *This = (PE_Impl *)iface;
+ ULONG refCount = InterlockedDecrement(&This->refCount);
+ TRACE("(%p) new ref = %u\n", This, refCount);
+ if (refCount == 0)
+ {
+ IBaseFilter_Release(This->filter);
+ CoTaskMemFree(This);
+ return 0;
+ }
+ return refCount;
+}
+
+/* IUnknown */
+static HRESULT WINAPI
+Fixed_IEnumPins_QueryInterface(IEnumPins *iface, REFIID riid, void **ppvObject)
+{
+ PE_Impl *This = (PE_Impl *)iface;
+ TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
+
+ if (IsEqualIID(riid, &IID_IUnknown) ||
+ IsEqualIID(riid, &IID_IEnumPins)) {
+ Fixed_IEnumPins_AddRef(iface);
+ *ppvObject = &(This->pins);
+ return S_OK;
+ }
+ *ppvObject = NULL;
+ WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject);
+ return E_NOINTERFACE;
+}
+
+/* IEnumPins */
+static HRESULT WINAPI
+Fixed_IEnumPins_Next(IEnumPins *iface, ULONG nPins, IPin **pins, ULONG *fetched)
+{
+ PE_Impl *This = (PE_Impl *)iface;
+ ULONG count = 0;
+ TRACE("(%p)->(%u, %p, %p) index = %u\n", This, nPins, pins, fetched, This->index);
+ if (!nPins)
+ return E_INVALIDARG;
+ if (!pins || ((nPins != 1) && !fetched))
+ return E_POINTER;
+ while ((count < nPins) && (This->index < This->numPins)) {
+ IPin *pin = This->pins[This->index++];
+ IPin_AddRef(pin);
+ pins[count++] = pin;
+ }
+ if (fetched)
+ *fetched = count;
+ return (count == nPins) ? S_OK : S_FALSE;
+}
+
+/* IEnumPins */
+static HRESULT WINAPI
+Fixed_IEnumPins_Skip(IEnumPins *iface, ULONG nPins)
+{
+ PE_Impl *This = (PE_Impl *)iface;
+ TRACE("(%p)->(%u) index = %u\n", This, nPins, This->index);
+ nPins += This->index;
+ if (nPins >= This->numPins) {
+ This->index = This->numPins;
+ return S_FALSE;
+ }
+ This->index = nPins;
+ return S_OK;
+}
+
+/* IEnumPins */
+static HRESULT WINAPI
+Fixed_IEnumPins_Reset(IEnumPins *iface)
+{
+ PE_Impl *This = (PE_Impl *)iface;
+ TRACE("(%p)->() index = %u\n", This, This->index);
+ This->index = 0;
+ return S_OK;
+}
+
+/* IEnumPins */
+static HRESULT WINAPI
+Fixed_IEnumPins_Clone(IEnumPins *iface, IEnumPins **pins)
+{
+ PE_Impl *This = (PE_Impl *)iface;
+ TRACE("(%p)->(%p) index = %u\n", This, pins, This->index);
+ if (!pins)
+ return E_POINTER;
+ *pins = pinsenum_create(This->filter, This->pins, This->numPins);
+ if (!*pins)
+ return E_OUTOFMEMORY;
+ ((PE_Impl *)*pins)->index = This->index;
+ return S_OK;
+}
+
+
+/* Virtual tables and constructor */
+
+static const IEnumPinsVtbl IEnumPins_VTable =
+{
+ Fixed_IEnumPins_QueryInterface,
+ Fixed_IEnumPins_AddRef,
+ Fixed_IEnumPins_Release,
+ Fixed_IEnumPins_Next,
+ Fixed_IEnumPins_Skip,
+ Fixed_IEnumPins_Reset,
+ Fixed_IEnumPins_Clone,
+};
+
+IEnumPins *pinsenum_create(IBaseFilter *filter, IPin **pins, ULONG pinCount)
+{
+ ULONG len = sizeof(PE_Impl) + (pinCount * sizeof(IPin *));
+ PE_Impl *obj = CoTaskMemAlloc(len);
+ if (obj) {
+ ULONG i;
+ ZeroMemory(obj, len);
+ obj->pe.lpVtbl = &IEnumPins_VTable;
+ obj->refCount = 1;
+ obj->filter = filter;
+ obj->numPins = pinCount;
+ obj->index = 0;
+ for (i=0; ipins[i] = pins[i];
+ IBaseFilter_AddRef(filter);
+ }
+ return &obj->pe;
+}
+
+
+/* Single media type enumerator */
+typedef struct _ME_Impl {
+ IEnumMediaTypes me;
+ LONG refCount;
+ BOOL past;
+ AM_MEDIA_TYPE mtype;
+} ME_Impl;
+
+
+/* IEnumMediaTypes interface implementation */
+
+/* IUnknown */
+static ULONG WINAPI
+Single_IEnumMediaTypes_AddRef(IEnumMediaTypes *iface)
+{
+ ME_Impl *This = (ME_Impl *)iface;
+ ULONG refCount = InterlockedIncrement(&This->refCount);
+ TRACE("(%p) new ref = %u\n", This, refCount);
+ return refCount;
+}
+
+/* IUnknown */
+static ULONG WINAPI
+Single_IEnumMediaTypes_Release(IEnumMediaTypes *iface)
+{
+ ME_Impl *This = (ME_Impl *)iface;
+ ULONG refCount = InterlockedDecrement(&This->refCount);
+ TRACE("(%p) new ref = %u\n", This, refCount);
+ if (refCount == 0)
+ {
+ if (This->mtype.pbFormat)
+ CoTaskMemFree(This->mtype.pbFormat);
+ CoTaskMemFree(This);
+ return 0;
+ }
+ return refCount;
+}
+
+/* IUnknown */
+static HRESULT WINAPI
+Single_IEnumMediaTypes_QueryInterface(IEnumMediaTypes *iface, REFIID riid, void **ppvObject)
+{
+ ME_Impl *This = (ME_Impl *)iface;
+ TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
+
+ if (IsEqualIID(riid, &IID_IUnknown) ||
+ IsEqualIID(riid, &IID_IEnumMediaTypes)) {
+ Single_IEnumMediaTypes_AddRef(iface);
+ *ppvObject = &(This->me);
+ return S_OK;
+ }
+ *ppvObject = NULL;
+ WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject);
+ return E_NOINTERFACE;
+}
+
+/* IEnumMediaTypes */
+static HRESULT WINAPI
+Single_IEnumMediaTypes_Next(IEnumMediaTypes *iface, ULONG nTypes, AM_MEDIA_TYPE **types, ULONG *fetched)
+{
+ ME_Impl *This = (ME_Impl *)iface;
+ ULONG count = 0;
+ TRACE("(%p)->(%u, %p, %p)\n", This, nTypes, types, fetched);
+ if (!nTypes)
+ return E_INVALIDARG;
+ if (!types || ((nTypes != 1) && !fetched))
+ return E_POINTER;
+ if (!This->past) {
+ AM_MEDIA_TYPE *mtype = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
+ *mtype = This->mtype;
+ if (mtype->cbFormat) {
+ mtype->pbFormat = CoTaskMemAlloc(mtype->cbFormat);
+ CopyMemory(mtype->pbFormat, This->mtype.pbFormat, mtype->cbFormat);
+ }
+ *types = mtype;
+ This->past = TRUE;
+ count = 1;
+ }
+ if (fetched)
+ *fetched = count;
+ return (count == nTypes) ? S_OK : S_FALSE;
+}
+
+/* IEnumMediaTypes */
+static HRESULT WINAPI
+Single_IEnumMediaTypes_Skip(IEnumMediaTypes *iface, ULONG nTypes)
+{
+ ME_Impl *This = (ME_Impl *)iface;
+ TRACE("(%p)->(%u)\n", This, nTypes);
+ if (nTypes)
+ This->past = TRUE;
+ return This->past ? S_FALSE : S_OK;
+}
+
+/* IEnumMediaTypes */
+static HRESULT WINAPI
+Single_IEnumMediaTypes_Reset(IEnumMediaTypes *iface)
+{
+ ME_Impl *This = (ME_Impl *)iface;
+ TRACE("(%p)->()\n", This);
+ This->past = FALSE;
+ return S_OK;
+}
+
+/* IEnumMediaTypes */
+static HRESULT WINAPI
+Single_IEnumMediaTypes_Clone(IEnumMediaTypes *iface, IEnumMediaTypes **me)
+{
+ ME_Impl *This = (ME_Impl *)iface;
+ TRACE("(%p)->(%p)\n", This, me);
+ if (!me)
+ return E_POINTER;
+ *me = mediaenum_create(&This->mtype);
+ if (!*me)
+ return E_OUTOFMEMORY;
+ ((ME_Impl *)*me)->past = This->past;
+ return S_OK;
+}
+
+
+/* Virtual tables and constructor */
+
+static const IEnumMediaTypesVtbl IEnumMediaTypes_VTable =
+{
+ Single_IEnumMediaTypes_QueryInterface,
+ Single_IEnumMediaTypes_AddRef,
+ Single_IEnumMediaTypes_Release,
+ Single_IEnumMediaTypes_Next,
+ Single_IEnumMediaTypes_Skip,
+ Single_IEnumMediaTypes_Reset,
+ Single_IEnumMediaTypes_Clone,
+};
+
+IEnumMediaTypes *mediaenum_create(AM_MEDIA_TYPE *mtype)
+{
+ ME_Impl *obj = CoTaskMemAlloc(sizeof(ME_Impl));
+ if (obj) {
+ ZeroMemory(obj, sizeof(ME_Impl));
+ obj->me.lpVtbl = &IEnumMediaTypes_VTable;
+ obj->refCount = 1;
+ obj->past = FALSE;
+ obj->mtype = *mtype;
+ obj->mtype.pUnk = NULL;
+ if (mtype->cbFormat) {
+ obj->mtype.pbFormat = CoTaskMemAlloc(mtype->cbFormat);
+ CopyMemory(obj->mtype.pbFormat, mtype->pbFormat, mtype->cbFormat);
+ }
+ else
+ obj->mtype.pbFormat = NULL;
+ }
+ return &obj->me;
+}
+
+
+/* Sample Grabber pin implementation */
+typedef struct _SG_Pin {
+ const IPinVtbl* lpVtbl;
+ PIN_DIRECTION dir;
+ WCHAR const *name;
+ struct _SG_Impl *sg;
+ IPin *pair;
+} SG_Pin;
/* Sample Grabber filter implementation */
typedef struct _SG_Impl {
const IBaseFilterVtbl* IBaseFilter_Vtbl;
const ISampleGrabberVtbl* ISampleGrabber_Vtbl;
+ const IMemInputPinVtbl* IMemInputPin_Vtbl;
/* TODO: IMediaPosition, IMediaSeeking, IQualityControl */
LONG refCount;
FILTER_INFO info;
FILTER_STATE state;
+ AM_MEDIA_TYPE mtype;
+ SG_Pin pin_in;
+ SG_Pin pin_out;
IMemAllocator *allocator;
IReferenceClock *refClock;
+ IMemInputPin *memOutput;
+ ISampleGrabberCB *grabberIface;
+ LONG grabberMethod;
+ LONG oneShot;
} SG_Impl;
+enum {
+ OneShot_None,
+ OneShot_Wait,
+ OneShot_Past,
+};
+
/* Get the SampleGrabber implementation This pointer from various interface pointers */
static inline SG_Impl *impl_from_IBaseFilter(IBaseFilter *iface)
{
@@ -57,6 +391,11 @@ static inline SG_Impl *impl_from_ISampleGrabber(ISampleGrabber *iface)
return (SG_Impl *)((char*)iface - FIELD_OFFSET(SG_Impl, ISampleGrabber_Vtbl));
}
+static inline SG_Impl *impl_from_IMemInputPin(IMemInputPin *iface)
+{
+ return (SG_Impl *)((char*)iface - FIELD_OFFSET(SG_Impl, IMemInputPin_Vtbl));
+}
+
/* Cleanup at end of life */
static void SampleGrabber_cleanup(SG_Impl *This)
@@ -68,6 +407,12 @@ static void SampleGrabber_cleanup(SG_Impl *This)
IMemAllocator_Release(This->allocator);
if (This->refClock)
IReferenceClock_Release(This->refClock);
+ if (This->memOutput)
+ IMemInputPin_Release(This->memOutput);
+ if (This->grabberIface)
+ ISampleGrabberCB_Release(This->grabberIface);
+ if (This->mtype.pbFormat)
+ CoTaskMemFree(This->mtype.pbFormat);
}
/* Common helper AddRef called from all interfaces */
@@ -110,8 +455,11 @@ static HRESULT SampleGrabber_query(SG_Impl *This, REFIID riid, void **ppvObject)
*ppvObject = &(This->ISampleGrabber_Vtbl);
return S_OK;
}
- else if (IsEqualIID(riid, &IID_IMemInputPin))
- FIXME("IMemInputPin not implemented\n");
+ else if (IsEqualIID(riid, &IID_IMemInputPin)) {
+ SampleGrabber_addref(This);
+ *ppvObject = &(This->IMemInputPin_Vtbl);
+ return S_OK;
+ }
else if (IsEqualIID(riid, &IID_IMediaPosition))
FIXME("IMediaPosition not implemented\n");
else if (IsEqualIID(riid, &IID_IMediaSeeking))
@@ -123,6 +471,45 @@ static HRESULT SampleGrabber_query(SG_Impl *This, REFIID riid, void **ppvObject)
return E_NOINTERFACE;
}
+/* Helper that calls installed sample callbacks */
+static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample)
+{
+ double time = 0.0;
+ REFERENCE_TIME tStart, tEnd;
+ if (SUCCEEDED(IMediaSample_GetTime(sample, &tStart, &tEnd)))
+ time = 1e-7 * tStart;
+ switch (This->grabberMethod) {
+ case 0:
+ {
+ ULONG ref = IMediaSample_AddRef(sample);
+ ISampleGrabberCB_SampleCB(This->grabberIface, time, sample);
+ ref = IMediaSample_Release(sample) + 1 - ref;
+ if (ref)
+ {
+ ERR("(%p) Callback referenced sample %p by %u\n", This, sample, ref);
+ /* ugly as hell but some apps are sooo buggy */
+ while (ref--)
+ IMediaSample_Release(sample);
+ }
+ }
+ break;
+ case 1:
+ {
+ BYTE *data = 0;
+ long size = IMediaSample_GetActualDataLength(sample);
+ if (size && SUCCEEDED(IMediaSample_GetPointer(sample, &data)) && data)
+ ISampleGrabberCB_BufferCB(This->grabberIface, time, data, size);
+ }
+ break;
+ case -1:
+ break;
+ default:
+ FIXME("unsupported method %ld\n", (long int)This->grabberMethod);
+ /* do not bother us again */
+ This->grabberMethod = -1;
+ }
+}
+
/* SampleGrabber implementation of IBaseFilter interface */
@@ -236,10 +623,14 @@ static HRESULT WINAPI
SampleGrabber_IBaseFilter_EnumPins(IBaseFilter *iface, IEnumPins **pins)
{
SG_Impl *This = impl_from_IBaseFilter(iface);
- FIXME("(%p)->(%p): stub\n", This, pins);
+ IPin *pin[2];
+ TRACE("(%p)->(%p)\n", This, pins);
if (!pins)
return E_POINTER;
- return E_OUTOFMEMORY;
+ pin[0] = (IPin*)&This->pin_in.lpVtbl;
+ pin[1] = (IPin*)&This->pin_out.lpVtbl;
+ *pins = pinsenum_create(iface, pin, 2);
+ return *pins ? S_OK : E_OUTOFMEMORY;
}
/* IBaseFilter */
@@ -247,9 +638,21 @@ static HRESULT WINAPI
SampleGrabber_IBaseFilter_FindPin(IBaseFilter *iface, LPCWSTR id, IPin **pin)
{
SG_Impl *This = impl_from_IBaseFilter(iface);
- FIXME("(%p)->(%s, %p): stub\n", This, debugstr_w(id), pin);
+ TRACE("(%p)->(%s, %p)\n", This, debugstr_w(id), pin);
if (!id || !pin)
return E_POINTER;
+ if (!lstrcmpiW(id,pin_in_name))
+ {
+ SampleGrabber_addref(This);
+ *pin = (IPin*)&(This->pin_in.lpVtbl);
+ return S_OK;
+ }
+ else if (!lstrcmpiW(id,pin_out_name))
+ {
+ SampleGrabber_addref(This);
+ *pin = (IPin*)&(This->pin_out.lpVtbl);
+ return S_OK;
+ }
*pin = NULL;
return VFW_E_NOT_FOUND;
}
@@ -277,6 +680,7 @@ SampleGrabber_IBaseFilter_JoinFilterGraph(IBaseFilter *iface, IFilterGraph *grap
This->info.pGraph = graph;
if (name)
lstrcpynW(This->info.achName,name,MAX_FILTER_NAME);
+ This->oneShot = OneShot_None;
return S_OK;
}
@@ -321,8 +725,9 @@ static HRESULT WINAPI
SampleGrabber_ISampleGrabber_SetOneShot(ISampleGrabber *iface, BOOL oneShot)
{
SG_Impl *This = impl_from_ISampleGrabber(iface);
- FIXME("(%p)->(%u): stub\n", This, oneShot);
- return E_NOTIMPL;
+ TRACE("(%p)->(%u)\n", This, oneShot);
+ This->oneShot = oneShot ? OneShot_Wait : OneShot_None;
+ return S_OK;
}
/* ISampleGrabber */
@@ -330,10 +735,24 @@ static HRESULT WINAPI
SampleGrabber_ISampleGrabber_SetMediaType(ISampleGrabber *iface, const AM_MEDIA_TYPE *type)
{
SG_Impl *This = impl_from_ISampleGrabber(iface);
- FIXME("(%p)->(%p): stub\n", This, type);
+ TRACE("(%p)->(%p)\n", This, type);
if (!type)
return E_POINTER;
- return E_NOTIMPL;
+ TRACE("Media type: %s/%s ssize: %u format: %s (%u bytes)\n",
+ debugstr_guid(&type->majortype), debugstr_guid(&type->subtype),
+ type->lSampleSize,
+ debugstr_guid(&type->formattype), type->cbFormat);
+ if (This->mtype.pbFormat)
+ CoTaskMemFree(This->mtype.pbFormat);
+ This->mtype = *type;
+ This->mtype.pUnk = NULL;
+ if (type->cbFormat) {
+ This->mtype.pbFormat = CoTaskMemAlloc(type->cbFormat);
+ CopyMemory(This->mtype.pbFormat, type->pbFormat, type->cbFormat);
+ }
+ else
+ This->mtype.pbFormat = NULL;
+ return S_OK;
}
/* ISampleGrabber */
@@ -341,10 +760,17 @@ static HRESULT WINAPI
SampleGrabber_ISampleGrabber_GetConnectedMediaType(ISampleGrabber *iface, AM_MEDIA_TYPE *type)
{
SG_Impl *This = impl_from_ISampleGrabber(iface);
- FIXME("(%p)->(%p): stub\n", This, type);
+ TRACE("(%p)->(%p)\n", This, type);
if (!type)
return E_POINTER;
- return E_NOTIMPL;
+ if (!This->pin_in.pair)
+ return VFW_E_NOT_CONNECTED;
+ *type = This->mtype;
+ if (type->cbFormat) {
+ type->pbFormat = CoTaskMemAlloc(type->cbFormat);
+ CopyMemory(type->pbFormat, This->mtype.pbFormat, type->cbFormat);
+ }
+ return S_OK;
}
/* ISampleGrabber */
@@ -383,10 +809,475 @@ static HRESULT WINAPI
SampleGrabber_ISampleGrabber_SetCallback(ISampleGrabber *iface, ISampleGrabberCB *cb, LONG whichMethod)
{
SG_Impl *This = impl_from_ISampleGrabber(iface);
- FIXME("(%p)->(%p, %u): stub\n", This, cb, whichMethod);
+ TRACE("(%p)->(%p, %u)\n", This, cb, whichMethod);
+ if (This->grabberIface)
+ ISampleGrabberCB_Release(This->grabberIface);
+ This->grabberIface = cb;
+ This->grabberMethod = whichMethod;
+ if (cb)
+ ISampleGrabberCB_AddRef(cb);
+ return S_OK;
+}
+
+
+/* SampleGrabber implementation of IMemInputPin interface */
+
+/* IUnknown */
+static HRESULT WINAPI
+SampleGrabber_IMemInputPin_QueryInterface(IMemInputPin *iface, REFIID riid, void **ppvObject)
+{
+ return SampleGrabber_query(impl_from_IMemInputPin(iface), riid, ppvObject);
+}
+
+/* IUnknown */
+static ULONG WINAPI
+SampleGrabber_IMemInputPin_AddRef(IMemInputPin *iface)
+{
+ return SampleGrabber_addref(impl_from_IMemInputPin(iface));
+}
+
+/* IUnknown */
+static ULONG WINAPI
+SampleGrabber_IMemInputPin_Release(IMemInputPin *iface)
+{
+ return SampleGrabber_release(impl_from_IMemInputPin(iface));
+}
+
+/* IMemInputPin */
+static HRESULT WINAPI
+SampleGrabber_IMemInputPin_GetAllocator(IMemInputPin *iface, IMemAllocator **allocator)
+{
+ SG_Impl *This = impl_from_IMemInputPin(iface);
+ TRACE("(%p)->(%p) allocator = %p\n", This, allocator, This->allocator);
+ if (!allocator)
+ return E_POINTER;
+ *allocator = This->allocator;
+ if (!*allocator)
+ return VFW_E_NO_ALLOCATOR;
+ IMemAllocator_AddRef(*allocator);
+ return S_OK;
+}
+
+/* IMemInputPin */
+static HRESULT WINAPI
+SampleGrabber_IMemInputPin_NotifyAllocator(IMemInputPin *iface, IMemAllocator *allocator, BOOL readOnly)
+{
+ SG_Impl *This = impl_from_IMemInputPin(iface);
+ TRACE("(%p)->(%p, %u) allocator = %p\n", This, allocator, readOnly, This->allocator);
+ if (This->allocator == allocator)
+ return S_OK;
+ if (This->allocator)
+ IMemAllocator_Release(This->allocator);
+ This->allocator = allocator;
+ if (allocator)
+ IMemAllocator_AddRef(allocator);
+ return S_OK;
+}
+
+/* IMemInputPin */
+static HRESULT WINAPI
+SampleGrabber_IMemInputPin_GetAllocatorRequirements(IMemInputPin *iface, ALLOCATOR_PROPERTIES *props)
+{
+ SG_Impl *This = impl_from_IMemInputPin(iface);
+ FIXME("(%p)->(%p): semi-stub\n", This, props);
+ if (!props)
+ return E_POINTER;
+ return This->memOutput ? IMemInputPin_GetAllocatorRequirements(This->memOutput, props) : E_NOTIMPL;
+}
+
+/* IMemInputPin */
+static HRESULT WINAPI
+SampleGrabber_IMemInputPin_Receive(IMemInputPin *iface, IMediaSample *sample)
+{
+ SG_Impl *This = impl_from_IMemInputPin(iface);
+ HRESULT hr;
+ TRACE("(%p)->(%p) output = %p, grabber = %p\n", This, sample, This->memOutput, This->grabberIface);
+ if (!sample)
+ return E_POINTER;
+ if ((This->state != State_Running) || (This->oneShot == OneShot_Past))
+ return S_FALSE;
+ if (This->grabberIface)
+ SampleGrabber_callback(This, sample);
+ hr = This->memOutput ? IMemInputPin_Receive(This->memOutput, sample) : S_OK;
+ if (This->oneShot == OneShot_Wait) {
+ This->oneShot = OneShot_Past;
+ hr = S_FALSE;
+ if (This->pin_out.pair)
+ IPin_EndOfStream(This->pin_out.pair);
+ }
+ return hr;
+}
+
+/* IMemInputPin */
+static HRESULT WINAPI
+SampleGrabber_IMemInputPin_ReceiveMultiple(IMemInputPin *iface, IMediaSample **samples, LONG nSamples, LONG *nProcessed)
+{
+ SG_Impl *This = impl_from_IMemInputPin(iface);
+ TRACE("(%p)->(%p, %u, %p) output = %p, grabber = %p\n", This, samples, nSamples, nProcessed, This->memOutput, This->grabberIface);
+ if (!samples || !nProcessed)
+ return E_POINTER;
+ if ((This->state != State_Running) || (This->oneShot == OneShot_Past))
+ return S_FALSE;
+ if (This->grabberIface) {
+ LONG idx;
+ for (idx = 0; idx < nSamples; idx++)
+ SampleGrabber_callback(This, samples[idx]);
+ }
+ return This->memOutput ? IMemInputPin_ReceiveMultiple(This->memOutput, samples, nSamples, nProcessed) : S_OK;
+}
+
+/* IMemInputPin */
+static HRESULT WINAPI
+SampleGrabber_IMemInputPin_ReceiveCanBlock(IMemInputPin *iface)
+{
+ SG_Impl *This = impl_from_IMemInputPin(iface);
+ TRACE("(%p)\n", This);
+ return This->memOutput ? IMemInputPin_ReceiveCanBlock(This->memOutput) : S_OK;
+}
+
+
+/* SampleGrabber member pin implementation */
+
+/* IUnknown */
+static ULONG WINAPI
+SampleGrabber_IPin_AddRef(IPin *iface)
+{
+ return SampleGrabber_addref(((SG_Pin *)iface)->sg);
+}
+
+/* IUnknown */
+static ULONG WINAPI
+SampleGrabber_IPin_Release(IPin *iface)
+{
+ return SampleGrabber_release(((SG_Pin *)iface)->sg);
+}
+
+/* IUnknown */
+static HRESULT WINAPI
+SampleGrabber_IPin_QueryInterface(IPin *iface, REFIID riid, void **ppvObject)
+{
+ SG_Pin *This = (SG_Pin *)iface;
+ TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
+
+ if (IsEqualIID(riid, &IID_IUnknown) ||
+ IsEqualIID(riid, &IID_IPin)) {
+ SampleGrabber_addref(This->sg);
+ *ppvObject = This;
+ return S_OK;
+ }
+ else if (IsEqualIID(riid, &IID_IMemInputPin)) {
+ SampleGrabber_addref(This->sg);
+ *ppvObject = &(This->sg->IMemInputPin_Vtbl);
+ return S_OK;
+ }
+ *ppvObject = NULL;
+ WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject);
+ return E_NOINTERFACE;
+}
+
+/* IPin - input pin */
+static HRESULT WINAPI
+SampleGrabber_In_IPin_Connect(IPin *iface, IPin *receiver, const AM_MEDIA_TYPE *mtype)
+{
+ WARN("(%p, %p): unexpected\n", receiver, mtype);
+ return E_UNEXPECTED;
+}
+
+/* IPin - output pin */
+static HRESULT WINAPI
+SampleGrabber_Out_IPin_Connect(IPin *iface, IPin *receiver, const AM_MEDIA_TYPE *type)
+{
+ SG_Pin *This = (SG_Pin *)iface;
+ HRESULT hr;
+ TRACE("(%p)->(%p, %p)\n", This, receiver, type);
+ if (!receiver)
+ return E_POINTER;
+ if (This->pair)
+ return VFW_E_ALREADY_CONNECTED;
+ if (This->sg->state != State_Stopped)
+ return VFW_E_NOT_STOPPED;
+ if (type) {
+ TRACE("Media type: %s/%s ssize: %u format: %s (%u bytes)\n",
+ debugstr_guid(&type->majortype), debugstr_guid(&type->subtype),
+ type->lSampleSize,
+ debugstr_guid(&type->formattype), type->cbFormat);
+ if (!IsEqualGUID(&This->sg->mtype.majortype,&GUID_NULL) &&
+ !IsEqualGUID(&This->sg->mtype.majortype,&type->majortype))
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ if (!IsEqualGUID(&This->sg->mtype.subtype,&MEDIASUBTYPE_None) &&
+ !IsEqualGUID(&This->sg->mtype.subtype,&type->subtype))
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ if (!IsEqualGUID(&This->sg->mtype.formattype,&GUID_NULL) &&
+ !IsEqualGUID(&This->sg->mtype.formattype,&FORMAT_None) &&
+ !IsEqualGUID(&This->sg->mtype.formattype,&type->formattype))
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ else
+ type = &This->sg->mtype;
+ if (!IsEqualGUID(&type->formattype, &FORMAT_None) &&
+ !IsEqualGUID(&type->formattype, &GUID_NULL) &&
+ !type->pbFormat)
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ hr = IPin_ReceiveConnection(receiver,(IPin*)&This->lpVtbl,type);
+ if (FAILED(hr))
+ return hr;
+ This->pair = receiver;
+ if (This->sg->memOutput) {
+ IMemInputPin_Release(This->sg->memOutput);
+ This->sg->memOutput = NULL;
+ }
+ IPin_QueryInterface(receiver,&IID_IMemInputPin,(void **)&(This->sg->memOutput));
+ TRACE("(%p) Accepted IPin %p, IMemInputPin %p\n", This, receiver, This->sg->memOutput);
+ return S_OK;
+}
+
+/* IPin - input pin */
+static HRESULT WINAPI
+SampleGrabber_In_IPin_ReceiveConnection(IPin *iface, IPin *connector, const AM_MEDIA_TYPE *type)
+{
+ SG_Pin *This = (SG_Pin *)iface;
+ TRACE("(%p)->(%p, %p)\n", This, connector, type);
+ if (!connector)
+ return E_POINTER;
+ if (This->pair)
+ return VFW_E_ALREADY_CONNECTED;
+ if (This->sg->state != State_Stopped)
+ return VFW_E_NOT_STOPPED;
+ if (type) {
+ TRACE("Media type: %s/%s ssize: %u format: %s (%u bytes)\n",
+ debugstr_guid(&type->majortype), debugstr_guid(&type->subtype),
+ type->lSampleSize,
+ debugstr_guid(&type->formattype), type->cbFormat);
+ if (!IsEqualGUID(&This->sg->mtype.majortype,&GUID_NULL) &&
+ !IsEqualGUID(&This->sg->mtype.majortype,&type->majortype))
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ if (!IsEqualGUID(&This->sg->mtype.subtype,&MEDIASUBTYPE_None) &&
+ !IsEqualGUID(&This->sg->mtype.subtype,&type->subtype))
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ if (!IsEqualGUID(&This->sg->mtype.formattype,&GUID_NULL) &&
+ !IsEqualGUID(&This->sg->mtype.formattype,&FORMAT_None) &&
+ !IsEqualGUID(&This->sg->mtype.formattype,&type->formattype))
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ if (!IsEqualGUID(&type->formattype, &FORMAT_None) &&
+ !IsEqualGUID(&type->formattype, &GUID_NULL) &&
+ !type->pbFormat)
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ if (This->sg->mtype.pbFormat)
+ CoTaskMemFree(This->sg->mtype.pbFormat);
+ This->sg->mtype = *type;
+ This->sg->mtype.pUnk = NULL;
+ if (type->cbFormat) {
+ This->sg->mtype.pbFormat = CoTaskMemAlloc(type->cbFormat);
+ CopyMemory(This->sg->mtype.pbFormat, type->pbFormat, type->cbFormat);
+ }
+ else
+ This->sg->mtype.pbFormat = NULL;
+ }
+ This->pair = connector;
+ TRACE("(%p) Accepted IPin %p\n", This, connector);
+ return S_OK;
+}
+
+/* IPin - output pin */
+static HRESULT WINAPI
+SampleGrabber_Out_IPin_ReceiveConnection(IPin *iface, IPin *connector, const AM_MEDIA_TYPE *mtype)
+{
+ WARN("(%p, %p): unexpected\n", connector, mtype);
+ return E_UNEXPECTED;
+}
+
+/* IPin - input pin */
+static HRESULT WINAPI
+SampleGrabber_In_IPin_Disconnect(IPin *iface)
+{
+ SG_Pin *This = (SG_Pin *)iface;
+ TRACE("(%p)->() pair = %p\n", This, This->pair);
+ if (This->sg->state != State_Stopped)
+ return VFW_E_NOT_STOPPED;
+ if (This->pair) {
+ This->pair = NULL;
+ return S_OK;
+ }
+ return S_FALSE;
+}
+
+/* IPin - output pin */
+static HRESULT WINAPI
+SampleGrabber_Out_IPin_Disconnect(IPin *iface)
+{
+ SG_Pin *This = (SG_Pin *)iface;
+ TRACE("(%p)->() pair = %p\n", This, This->pair);
+ if (This->sg->state != State_Stopped)
+ return VFW_E_NOT_STOPPED;
+ if (This->pair) {
+ This->pair = NULL;
+ if (This->sg->memOutput) {
+ IMemInputPin_Release(This->sg->memOutput);
+ This->sg->memOutput = NULL;
+ }
+ return S_OK;
+ }
+ return S_FALSE;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_ConnectedTo(IPin *iface, IPin **pin)
+{
+ SG_Pin *This = (SG_Pin *)iface;
+ TRACE("(%p)->(%p) pair = %p\n", This, pin, This->pair);
+ if (!pin)
+ return E_POINTER;
+ *pin = This->pair;
+ if (*pin) {
+ IPin_AddRef(*pin);
+ return S_OK;
+ }
+ return VFW_E_NOT_CONNECTED;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_ConnectionMediaType(IPin *iface, AM_MEDIA_TYPE *mtype)
+{
+ SG_Pin *This = (SG_Pin *)iface;
+ TRACE("(%p)->(%p)\n", This, mtype);
+ if (!mtype)
+ return E_POINTER;
+ if (!This->pair)
+ return VFW_E_NOT_CONNECTED;
+ *mtype = This->sg->mtype;
+ if (mtype->cbFormat) {
+ mtype->pbFormat = CoTaskMemAlloc(mtype->cbFormat);
+ CopyMemory(mtype->pbFormat, This->sg->mtype.pbFormat, mtype->cbFormat);
+ }
+ return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_QueryPinInfo(IPin *iface, PIN_INFO *info)
+{
+ SG_Pin *This = (SG_Pin *)iface;
+ TRACE("(%p)->(%p)\n", This, info);
+ if (!info)
+ return E_POINTER;
+ SampleGrabber_addref(This->sg);
+ info->pFilter = (IBaseFilter *)This->sg;
+ info->dir = This->dir;
+ lstrcpynW(info->achName,This->name,MAX_PIN_NAME);
+ return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_QueryDirection(IPin *iface, PIN_DIRECTION *dir)
+{
+ SG_Pin *This = (SG_Pin *)iface;
+ TRACE("(%p)->(%p)\n", This, dir);
+ if (!dir)
+ return E_POINTER;
+ *dir = This->dir;
+ return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_QueryId(IPin *iface, LPWSTR *id)
+{
+ SG_Pin *This = (SG_Pin *)iface;
+ int len;
+ TRACE("(%p)->(%p)\n", This, id);
+ if (!id)
+ return E_POINTER;
+ len = sizeof(WCHAR)*(1+lstrlenW(This->name));
+ *id = CoTaskMemAlloc(len);
+ CopyMemory(*id, This->name, len);
+ return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *mtype)
+{
+ TRACE("(%p)\n", mtype);
+ return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_EnumMediaTypes(IPin *iface, IEnumMediaTypes **mtypes)
+{
+ SG_Pin *This = (SG_Pin *)iface;
+ TRACE("(%p)->(%p)\n", This, mtypes);
+ if (!mtypes)
+ return E_POINTER;
+ *mtypes = mediaenum_create(&This->sg->mtype);
+ return *mtypes ? S_OK : E_OUTOFMEMORY;
+}
+
+/* IPin - input pin */
+static HRESULT WINAPI
+SampleGrabber_In_IPin_QueryInternalConnections(IPin *iface, IPin **pins, ULONG *nPins)
+{
+ SG_Pin *This = (SG_Pin *)iface;
+ TRACE("(%p)->(%p, %p) size = %u\n", This, pins, nPins, (nPins ? *nPins : 0));
+ if (!nPins)
+ return E_POINTER;
+ if (*nPins) {
+ if (!pins)
+ return E_POINTER;
+ IPin_AddRef((IPin*)&This->sg->pin_out.lpVtbl);
+ *pins = (IPin*)&This->sg->pin_out.lpVtbl;
+ *nPins = 1;
+ return S_OK;
+ }
+ *nPins = 1;
+ return S_FALSE;
+}
+
+/* IPin - output pin */
+static HRESULT WINAPI
+SampleGrabber_Out_IPin_QueryInternalConnections(IPin *iface, IPin **pins, ULONG *nPins)
+{
+ WARN("(%p, %p): unexpected\n", pins, nPins);
+ if (nPins)
+ *nPins = 0;
return E_NOTIMPL;
}
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_EndOfStream(IPin *iface)
+{
+ FIXME(": stub\n");
+ return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_BeginFlush(IPin *iface)
+{
+ FIXME(": stub\n");
+ return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_EndFlush(IPin *iface)
+{
+ FIXME(": stub\n");
+ return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_NewSegment(IPin *iface, REFERENCE_TIME tStart, REFERENCE_TIME tStop, double rate)
+{
+ FIXME(": stub\n");
+ return S_OK;
+}
+
/* SampleGrabber vtables and constructor */
@@ -423,6 +1314,63 @@ static const ISampleGrabberVtbl ISampleGrabber_VTable =
SampleGrabber_ISampleGrabber_SetCallback,
};
+static const IMemInputPinVtbl IMemInputPin_VTable =
+{
+ SampleGrabber_IMemInputPin_QueryInterface,
+ SampleGrabber_IMemInputPin_AddRef,
+ SampleGrabber_IMemInputPin_Release,
+ SampleGrabber_IMemInputPin_GetAllocator,
+ SampleGrabber_IMemInputPin_NotifyAllocator,
+ SampleGrabber_IMemInputPin_GetAllocatorRequirements,
+ SampleGrabber_IMemInputPin_Receive,
+ SampleGrabber_IMemInputPin_ReceiveMultiple,
+ SampleGrabber_IMemInputPin_ReceiveCanBlock,
+};
+
+static const IPinVtbl IPin_In_VTable =
+{
+ SampleGrabber_IPin_QueryInterface,
+ SampleGrabber_IPin_AddRef,
+ SampleGrabber_IPin_Release,
+ SampleGrabber_In_IPin_Connect,
+ SampleGrabber_In_IPin_ReceiveConnection,
+ SampleGrabber_In_IPin_Disconnect,
+ SampleGrabber_IPin_ConnectedTo,
+ SampleGrabber_IPin_ConnectionMediaType,
+ SampleGrabber_IPin_QueryPinInfo,
+ SampleGrabber_IPin_QueryDirection,
+ SampleGrabber_IPin_QueryId,
+ SampleGrabber_IPin_QueryAccept,
+ SampleGrabber_IPin_EnumMediaTypes,
+ SampleGrabber_In_IPin_QueryInternalConnections,
+ SampleGrabber_IPin_EndOfStream,
+ SampleGrabber_IPin_BeginFlush,
+ SampleGrabber_IPin_EndFlush,
+ SampleGrabber_IPin_NewSegment,
+};
+
+static const IPinVtbl IPin_Out_VTable =
+{
+ SampleGrabber_IPin_QueryInterface,
+ SampleGrabber_IPin_AddRef,
+ SampleGrabber_IPin_Release,
+ SampleGrabber_Out_IPin_Connect,
+ SampleGrabber_Out_IPin_ReceiveConnection,
+ SampleGrabber_Out_IPin_Disconnect,
+ SampleGrabber_IPin_ConnectedTo,
+ SampleGrabber_IPin_ConnectionMediaType,
+ SampleGrabber_IPin_QueryPinInfo,
+ SampleGrabber_IPin_QueryDirection,
+ SampleGrabber_IPin_QueryId,
+ SampleGrabber_IPin_QueryAccept,
+ SampleGrabber_IPin_EnumMediaTypes,
+ SampleGrabber_Out_IPin_QueryInternalConnections,
+ SampleGrabber_IPin_EndOfStream,
+ SampleGrabber_IPin_BeginFlush,
+ SampleGrabber_IPin_EndFlush,
+ SampleGrabber_IPin_NewSegment,
+};
+
HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv)
{
SG_Impl* obj = NULL;
@@ -442,11 +1390,29 @@ HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv)
obj->refCount = 1;
obj->IBaseFilter_Vtbl = &IBaseFilter_VTable;
obj->ISampleGrabber_Vtbl = &ISampleGrabber_VTable;
+ obj->IMemInputPin_Vtbl = &IMemInputPin_VTable;
+ obj->pin_in.lpVtbl = &IPin_In_VTable;
+ obj->pin_in.dir = PINDIR_INPUT;
+ obj->pin_in.name = pin_in_name;
+ obj->pin_in.sg = obj;
+ obj->pin_in.pair = NULL;
+ obj->pin_out.lpVtbl = &IPin_Out_VTable;
+ obj->pin_out.dir = PINDIR_OUTPUT;
+ obj->pin_out.name = pin_out_name;
+ obj->pin_out.sg = obj;
+ obj->pin_out.pair = NULL;
obj->info.achName[0] = 0;
obj->info.pGraph = NULL;
obj->state = State_Stopped;
+ obj->mtype.majortype = GUID_NULL;
+ obj->mtype.subtype = MEDIASUBTYPE_None;
+ obj->mtype.formattype = FORMAT_None;
obj->allocator = NULL;
obj->refClock = NULL;
+ obj->memOutput = NULL;
+ obj->grabberIface = NULL;
+ obj->grabberMethod = -1;
+ obj->oneShot = OneShot_None;
*ppv = obj;
return S_OK;
diff --git a/dll/directx/quartz/dsoundrender.c b/dll/directx/quartz/dsoundrender.c
index edb170da136..1d87a7f0047 100644
--- a/dll/directx/quartz/dsoundrender.c
+++ b/dll/directx/quartz/dsoundrender.c
@@ -32,6 +32,7 @@
#include "evcode.h"
#include "strmif.h"
#include "dsound.h"
+#include "amaudio.h"
#include "wine/unicode.h"
#include "wine/debug.h"
@@ -45,12 +46,14 @@ static const IPinVtbl DSoundRender_InputPin_Vtbl;
static const IBasicAudioVtbl IBasicAudio_Vtbl;
static const IReferenceClockVtbl IReferenceClock_Vtbl;
static const IMediaSeekingVtbl IMediaSeeking_Vtbl;
+static const IAMDirectSoundVtbl IAMDirectSound_Vtbl;
typedef struct DSoundRenderImpl
{
const IBaseFilterVtbl * lpVtbl;
const IBasicAudioVtbl *IBasicAudio_vtbl;
const IReferenceClockVtbl *IReferenceClock_vtbl;
+ const IAMDirectSoundVtbl *IAMDirectSound_vtbl;
LONG refCount;
CRITICAL_SECTION csFilter;
@@ -404,6 +407,7 @@ HRESULT DSoundRender_create(IUnknown * pUnkOuter, LPVOID * ppv)
pDSoundRender->lpVtbl = &DSoundRender_Vtbl;
pDSoundRender->IBasicAudio_vtbl = &IBasicAudio_Vtbl;
pDSoundRender->IReferenceClock_vtbl = &IReferenceClock_Vtbl;
+ pDSoundRender->IAMDirectSound_vtbl = &IAMDirectSound_Vtbl;
pDSoundRender->refCount = 1;
InitializeCriticalSection(&pDSoundRender->csFilter);
pDSoundRender->csFilter.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": DSoundRenderImpl.csFilter");
@@ -473,6 +477,8 @@ static HRESULT WINAPI DSoundRender_QueryInterface(IBaseFilter * iface, REFIID ri
*ppv = &This->IReferenceClock_vtbl;
else if (IsEqualIID(riid, &IID_IMediaSeeking))
*ppv = &This->mediaSeeking.lpVtbl;
+ else if (IsEqualIID(riid, &IID_IAMDirectSound))
+ *ppv = &This->IAMDirectSound_vtbl;
if (*ppv)
{
@@ -1328,3 +1334,121 @@ static const IMediaSeekingVtbl IMediaSeeking_Vtbl =
MediaSeekingImpl_GetRate,
MediaSeekingImpl_GetPreroll
};
+
+/*** IUnknown methods ***/
+static HRESULT WINAPI AMDirectSound_QueryInterface(IAMDirectSound *iface,
+ REFIID riid,
+ LPVOID*ppvObj)
+{
+ ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+ TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj);
+
+ return DSoundRender_QueryInterface((IBaseFilter*)This, riid, ppvObj);
+}
+
+static ULONG WINAPI AMDirectSound_AddRef(IAMDirectSound *iface)
+{
+ ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+ TRACE("(%p/%p)->()\n", This, iface);
+
+ return DSoundRender_AddRef((IBaseFilter*)This);
+}
+
+static ULONG WINAPI AMDirectSound_Release(IAMDirectSound *iface)
+{
+ ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+ TRACE("(%p/%p)->()\n", This, iface);
+
+ return DSoundRender_Release((IBaseFilter*)This);
+}
+
+/*** IAMDirectSound methods ***/
+static HRESULT WINAPI AMDirectSound_GetDirectSoundInterface(IAMDirectSound *iface, IDirectSound **ds)
+{
+ ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+ FIXME("(%p/%p)->(%p): stub\n", This, iface, ds);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AMDirectSound_GetPrimaryBufferInterface(IAMDirectSound *iface, IDirectSoundBuffer **buf)
+{
+ ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+ FIXME("(%p/%p)->(%p): stub\n", This, iface, buf);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AMDirectSound_GetSecondaryBufferInterface(IAMDirectSound *iface, IDirectSoundBuffer **buf)
+{
+ ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+ FIXME("(%p/%p)->(%p): stub\n", This, iface, buf);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AMDirectSound_ReleaseDirectSoundInterface(IAMDirectSound *iface, IDirectSound *ds)
+{
+ ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+ FIXME("(%p/%p)->(%p): stub\n", This, iface, ds);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AMDirectSound_ReleasePrimaryBufferInterface(IAMDirectSound *iface, IDirectSoundBuffer *buf)
+{
+ ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+ FIXME("(%p/%p)->(%p): stub\n", This, iface, buf);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AMDirectSound_ReleaseSecondaryBufferInterface(IAMDirectSound *iface, IDirectSoundBuffer *buf)
+{
+ ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+ FIXME("(%p/%p)->(%p): stub\n", This, iface, buf);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AMDirectSound_SetFocusWindow(IAMDirectSound *iface, HWND hwnd, BOOL bgsilent)
+{
+ ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+ FIXME("(%p/%p)->(%p,%d): stub\n", This, iface, hwnd, bgsilent);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AMDirectSound_GetFocusWindow(IAMDirectSound *iface, HWND hwnd)
+{
+ ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+ FIXME("(%p/%p)->(%p): stub\n", This, iface, hwnd);
+
+ return E_NOTIMPL;
+}
+
+static const IAMDirectSoundVtbl IAMDirectSound_Vtbl =
+{
+ AMDirectSound_QueryInterface,
+ AMDirectSound_AddRef,
+ AMDirectSound_Release,
+ AMDirectSound_GetDirectSoundInterface,
+ AMDirectSound_GetPrimaryBufferInterface,
+ AMDirectSound_GetSecondaryBufferInterface,
+ AMDirectSound_ReleaseDirectSoundInterface,
+ AMDirectSound_ReleasePrimaryBufferInterface,
+ AMDirectSound_ReleaseSecondaryBufferInterface,
+ AMDirectSound_SetFocusWindow,
+ AMDirectSound_GetFocusWindow
+};
diff --git a/dll/directx/quartz/filesource.c b/dll/directx/quartz/filesource.c
index 5f6350fb99f..cb9282c8bb5 100644
--- a/dll/directx/quartz/filesource.c
+++ b/dll/directx/quartz/filesource.c
@@ -395,7 +395,8 @@ static HRESULT WINAPI AsyncReader_QueryInterface(IBaseFilter * iface, REFIID rii
return S_OK;
}
- if (!IsEqualIID(riid, &IID_IPin) && !IsEqualIID(riid, &IID_IMediaSeeking) && !IsEqualIID(riid, &IID_IVideoWindow))
+ if (!IsEqualIID(riid, &IID_IPin) && !IsEqualIID(riid, &IID_IMediaSeeking) &&
+ !IsEqualIID(riid, &IID_IVideoWindow) && !IsEqualIID(riid, &IID_IBasicAudio))
FIXME("No interface for %s!\n", qzdebugstr_guid(riid));
return E_NOINTERFACE;
diff --git a/dll/directx/quartz/pin.c b/dll/directx/quartz/pin.c
index 2e24d520667..ca34d9331c5 100644
--- a/dll/directx/quartz/pin.c
+++ b/dll/directx/quartz/pin.c
@@ -765,9 +765,6 @@ HRESULT WINAPI OutputPin_Connect(IPin * iface, IPin * pReceivePin, const AM_MEDI
{
assert(pmtCandidate);
dump_AM_MEDIA_TYPE(pmtCandidate);
- if (!IsEqualGUID(&FORMAT_None, &pmtCandidate->formattype)
- && !IsEqualGUID(&GUID_NULL, &pmtCandidate->formattype))
- assert(pmtCandidate->pbFormat);
if (( !pmt || CompareMediaTypes(pmt, pmtCandidate, TRUE) ) &&
(This->pConnectSpecific(iface, pReceivePin, pmtCandidate) == S_OK))
{
diff --git a/dll/directx/wine/d3d8/d3d8_main.c b/dll/directx/wine/d3d8/d3d8_main.c
index 6300371842a..c471049714b 100644
--- a/dll/directx/wine/d3d8/d3d8_main.c
+++ b/dll/directx/wine/d3d8/d3d8_main.c
@@ -35,7 +35,7 @@ void WINAPI DebugSetMute(void) {
/* nothing to do */
}
-IDirect3D8* WINAPI Direct3DCreate8(UINT SDKVersion) {
+IDirect3D8* WINAPI DECLSPEC_HOTPATCH Direct3DCreate8(UINT SDKVersion) {
IDirect3D8Impl* object;
TRACE("SDKVersion = %x\n", SDKVersion);
@@ -79,7 +79,12 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
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);
+ static BOOL warned;
+
+ if (TRACE_ON(d3d8) || !warned) {
+ FIXME("(%p %p %p %d %p): stub\n", vertexshader, reserved1, reserved2, bool, toto);
+ warned = TRUE;
+ }
if (!vertexshader)
return E_FAIL;
@@ -109,7 +114,12 @@ HRESULT WINAPI ValidateVertexShader(DWORD* vertexshader, DWORD* reserved1, DWORD
HRESULT WINAPI ValidatePixelShader(DWORD* pixelshader, DWORD* reserved1, BOOL bool, DWORD* toto)
{
HRESULT ret;
- FIXME("(%p %p %d %p): stub\n", pixelshader, reserved1, bool, toto);
+ static BOOL warned;
+
+ if (TRACE_ON(d3d8) || !warned) {
+ FIXME("(%p %p %d %p): stub\n", pixelshader, reserved1, bool, toto);
+ warned = TRUE;
+ }
if (!pixelshader)
return E_FAIL;
diff --git a/dll/directx/wine/d3d8/d3d8_private.h b/dll/directx/wine/d3d8/d3d8_private.h
index 2c5f66f1d5f..4ba399b5d92 100644
--- a/dll/directx/wine/d3d8/d3d8_private.h
+++ b/dll/directx/wine/d3d8/d3d8_private.h
@@ -275,18 +275,6 @@ HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *devic
UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level,
DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality) DECLSPEC_HIDDEN;
-/* ------------------ */
-/* IDirect3DResource8 */
-/* ------------------ */
-
-/*****************************************************************************
- * Predeclare the interface implementation structures
- */
-extern const IDirect3DResource8Vtbl Direct3DResource8_Vtbl DECLSPEC_HIDDEN;
-
-/*****************************************************************************
- * IDirect3DResource8 implementation structure
- */
struct IDirect3DResource8Impl
{
/* IUnknown fields */
diff --git a/dll/directx/wine/d3d8/device.c b/dll/directx/wine/d3d8/device.c
index 5365640fd06..11697b2ff26 100644
--- a/dll/directx/wine/d3d8/device.c
+++ b/dll/directx/wine/d3d8/device.c
@@ -1047,7 +1047,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_BeginScene(LPDIRECT3DDEVICE8 iface) {
return hr;
}
-static HRESULT WINAPI IDirect3DDevice8Impl_EndScene(LPDIRECT3DDEVICE8 iface) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice8Impl_EndScene(LPDIRECT3DDEVICE8 iface) {
IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
HRESULT hr;
diff --git a/dll/directx/wine/d3d9/d3d9_main.c b/dll/directx/wine/d3d9/d3d9_main.c
index 339cc61c3be..c405a5747d7 100644
--- a/dll/directx/wine/d3d9/d3d9_main.c
+++ b/dll/directx/wine/d3d9/d3d9_main.c
@@ -33,7 +33,7 @@ void WINAPI DebugSetMute(void) {
/* nothing to do */
}
-IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion) {
+IDirect3D9* WINAPI DECLSPEC_HOTPATCH Direct3DCreate9(UINT SDKVersion) {
IDirect3D9Impl* object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D9Impl));
object->lpVtbl = &Direct3D9_Vtbl;
@@ -53,7 +53,7 @@ IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion) {
return (IDirect3D9*) object;
}
-HRESULT WINAPI Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex **direct3d9ex) {
+HRESULT WINAPI DECLSPEC_HOTPATCH Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex **direct3d9ex) {
IDirect3D9 *ret;
IDirect3D9Impl* object;
diff --git a/dll/directx/wine/d3d9/d3d9_private.h b/dll/directx/wine/d3d9/d3d9_private.h
index 7736beace67..eb3a032f18b 100644
--- a/dll/directx/wine/d3d9/d3d9_private.h
+++ b/dll/directx/wine/d3d9/d3d9_private.h
@@ -187,11 +187,6 @@ HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapte
extern HRESULT WINAPI IDirect3DDevice9Impl_GetSwapChain(IDirect3DDevice9Ex *iface,
UINT iSwapChain, IDirect3DSwapChain9 **pSwapChain) DECLSPEC_HIDDEN;
extern UINT WINAPI IDirect3DDevice9Impl_GetNumberOfSwapChains(IDirect3DDevice9Ex *iface) DECLSPEC_HIDDEN;
-extern HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(IDirect3DDevice9Ex *iface,
- D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9 **ppSB) DECLSPEC_HIDDEN;
-extern HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(IDirect3DDevice9Ex *iface) DECLSPEC_HIDDEN;
-extern HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(IDirect3DDevice9Ex *iface,
- IDirect3DStateBlock9 **ppSB) DECLSPEC_HIDDEN;
extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexDeclaration(IDirect3DDevice9Ex *iface,
IDirect3DVertexDeclaration9 *pDecl) DECLSPEC_HIDDEN;
extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexDeclaration(IDirect3DDevice9Ex *iface,
@@ -228,9 +223,6 @@ extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantB(IDirect3DDevi
UINT StartRegister, const BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN;
extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantB(IDirect3DDevice9Ex *iface,
UINT StartRegister, BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN;
-extern HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(IDirect3DDevice9Ex *iface,
- D3DQUERYTYPE Type, IDirect3DQuery9 **ppQuery) DECLSPEC_HIDDEN;
-
/* ---------------- */
/* IDirect3DVolume9 */
@@ -470,6 +462,8 @@ typedef struct IDirect3DStateBlock9Impl {
LPDIRECT3DDEVICE9EX parentDevice;
} IDirect3DStateBlock9Impl;
+HRESULT stateblock_init(IDirect3DStateBlock9Impl *stateblock, IDirect3DDevice9Impl *device,
+ D3DSTATEBLOCKTYPE type, IWineD3DStateBlock *wined3d_stateblock) DECLSPEC_HIDDEN;
/* --------------------------- */
/* IDirect3DVertexDeclaration9 */
@@ -564,4 +558,7 @@ typedef struct IDirect3DQuery9Impl {
LPDIRECT3DDEVICE9EX parentDevice;
} IDirect3DQuery9Impl;
+HRESULT query_init(IDirect3DQuery9Impl *query, IDirect3DDevice9Impl *device,
+ D3DQUERYTYPE type) DECLSPEC_HIDDEN;
+
#endif /* __WINE_D3D9_PRIVATE_H */
diff --git a/dll/directx/wine/d3d9/device.c b/dll/directx/wine/d3d9/device.c
index 6b70c84cf27..79a9ba01834 100644
--- a/dll/directx/wine/d3d9/device.c
+++ b/dll/directx/wine/d3d9/device.c
@@ -248,7 +248,7 @@ static ULONG WINAPI IDirect3DDevice9Impl_AddRef(LPDIRECT3DDEVICE9EX iface) {
return ref;
}
-static ULONG WINAPI IDirect3DDevice9Impl_Release(LPDIRECT3DDEVICE9EX iface) {
+static ULONG WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Release(LPDIRECT3DDEVICE9EX iface) {
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
ULONG ref;
@@ -452,7 +452,7 @@ static BOOL WINAPI IDirect3DDevice9Impl_ShowCursor(LPDIRECT3DDEVICE9EX ifac
return ret;
}
-static HRESULT WINAPI IDirect3DDevice9Impl_CreateAdditionalSwapChain(IDirect3DDevice9Ex *iface,
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_CreateAdditionalSwapChain(IDirect3DDevice9Ex *iface,
D3DPRESENT_PARAMETERS *present_parameters, IDirect3DSwapChain9 **swapchain)
{
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
@@ -541,7 +541,7 @@ static HRESULT WINAPI reset_enum_callback(IWineD3DResource *resource, void *data
return ret;
}
-static HRESULT WINAPI IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3DPRESENT_PARAMETERS* pPresentationParameters) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3DPRESENT_PARAMETERS* pPresentationParameters) {
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
WINED3DPRESENT_PARAMETERS localParameters;
HRESULT hr;
@@ -619,7 +619,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3DP
return hr;
}
-static HRESULT WINAPI IDirect3DDevice9Impl_Present(LPDIRECT3DDEVICE9EX iface, CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA*
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Present(LPDIRECT3DDEVICE9EX iface, CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA*
pDirtyRegion) {
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
@@ -1182,7 +1182,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_BeginScene(LPDIRECT3DDEVICE9EX ifac
return hr;
}
-static HRESULT WINAPI IDirect3DDevice9Impl_EndScene(LPDIRECT3DDEVICE9EX iface) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_EndScene(LPDIRECT3DDEVICE9EX iface) {
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
@@ -1388,7 +1388,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetClipPlane(LPDIRECT3DDEVICE9EX if
return hr;
}
-static HRESULT WINAPI IDirect3DDevice9Impl_SetRenderState(LPDIRECT3DDEVICE9EX iface, D3DRENDERSTATETYPE State, DWORD Value) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_SetRenderState(LPDIRECT3DDEVICE9EX iface, D3DRENDERSTATETYPE State, DWORD Value) {
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
@@ -1414,6 +1414,97 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetRenderState(LPDIRECT3DDEVICE9EX
return hr;
}
+static HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(IDirect3DDevice9Ex *iface,
+ D3DSTATEBLOCKTYPE type, IDirect3DStateBlock9 **stateblock)
+{
+ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+ IDirect3DStateBlock9Impl *object;
+ HRESULT hr;
+
+ TRACE("iface %p, type %#x, stateblock %p.\n", iface, type, stateblock);
+
+ if (type != D3DSBT_ALL && type != D3DSBT_PIXELSTATE && type != D3DSBT_VERTEXSTATE)
+ {
+ WARN("Unexpected stateblock type, returning D3DERR_INVALIDCALL.\n");
+ return D3DERR_INVALIDCALL;
+ }
+
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+ if (!object)
+ {
+ ERR("Failed to allocate stateblock memory.\n");
+ return E_OUTOFMEMORY;
+ }
+
+ hr = stateblock_init(object, This, type, NULL);
+ if (FAILED(hr))
+ {
+ WARN("Failed to initialize stateblock, hr %#x.\n", hr);
+ HeapFree(GetProcessHeap(), 0, object);
+ return hr;
+ }
+
+ TRACE("Created stateblock %p.\n", object);
+ *stateblock = (IDirect3DStateBlock9 *)object;
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(IDirect3DDevice9Ex *iface)
+{
+ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+ HRESULT hr;
+
+ TRACE("iface %p.\n", iface);
+
+ wined3d_mutex_lock();
+ hr = IWineD3DDevice_BeginStateBlock(This->WineD3DDevice);
+ wined3d_mutex_unlock();
+
+ return hr;
+}
+
+static HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(IDirect3DDevice9Ex *iface, IDirect3DStateBlock9 **stateblock)
+{
+ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+ IWineD3DStateBlock *wined3d_stateblock;
+ IDirect3DStateBlock9Impl *object;
+ HRESULT hr;
+
+ TRACE("iface %p, stateblock %p.\n", iface, stateblock);
+
+ wined3d_mutex_lock();
+ hr = IWineD3DDevice_EndStateBlock(This->WineD3DDevice, &wined3d_stateblock);
+ wined3d_mutex_unlock();
+ if (FAILED(hr))
+ {
+ WARN("IWineD3DDevice_EndStateBlock() failed, hr %#x.\n", hr);
+ return hr;
+ }
+
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+ if (!object)
+ {
+ ERR("Failed to allocate stateblock memory.\n");
+ IWineD3DStateBlock_Release(wined3d_stateblock);
+ return E_OUTOFMEMORY;
+ }
+
+ hr = stateblock_init(object, This, 0, wined3d_stateblock);
+ if (FAILED(hr))
+ {
+ WARN("Failed to initialize stateblock, hr %#x.\n", hr);
+ IWineD3DStateBlock_Release(wined3d_stateblock);
+ HeapFree(GetProcessHeap(), 0, object);
+ return hr;
+ }
+
+ TRACE("Created stateblock %p.\n", object);
+ *stateblock = (IDirect3DStateBlock9 *)object;
+
+ return D3D_OK;
+}
+
static HRESULT WINAPI IDirect3DDevice9Impl_SetClipStatus(LPDIRECT3DDEVICE9EX iface, CONST D3DCLIPSTATUS9* pClipStatus) {
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
@@ -1559,7 +1650,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetSamplerState(IDirect3DDevice9Ex *i
return hr;
}
-static HRESULT WINAPI IDirect3DDevice9Impl_SetSamplerState(LPDIRECT3DDEVICE9EX iface, DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_SetSamplerState(LPDIRECT3DDEVICE9EX iface, DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value) {
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
@@ -2178,6 +2269,37 @@ static HRESULT WINAPI IDirect3DDevice9Impl_DeletePatch(LPDIRECT3DDEVICE9EX ifa
return hr;
}
+static HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(IDirect3DDevice9Ex *iface,
+ D3DQUERYTYPE type, IDirect3DQuery9 **query)
+{
+ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+ IDirect3DQuery9Impl *object;
+ HRESULT hr;
+
+ TRACE("iface %p, type %#x, query %p.\n", iface, type, query);
+
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+ if (!object)
+ {
+ ERR("Failed to allocate query memory.\n");
+ return E_OUTOFMEMORY;
+ }
+
+ hr = query_init(object, This, type);
+ if (FAILED(hr))
+ {
+ WARN("Failed to initialize query, hr %#x.\n", hr);
+ HeapFree(GetProcessHeap(), 0, object);
+ return hr;
+ }
+
+ TRACE("Created query %p.\n", object);
+ if (query) *query = (IDirect3DQuery9 *)object;
+ else IDirect3DQuery9_Release((IDirect3DQuery9 *)object);
+
+ return D3D_OK;
+}
+
static HRESULT WINAPI IDirect3DDevice9ExImpl_SetConvolutionMonoKernel(IDirect3DDevice9Ex *iface,
UINT width, UINT height, float *rows, float *columns)
{
diff --git a/dll/directx/wine/d3d9/directx.c b/dll/directx/wine/d3d9/directx.c
index 5f5e8f913d4..1fcc8c47fcf 100644
--- a/dll/directx/wine/d3d9/directx.c
+++ b/dll/directx/wine/d3d9/directx.c
@@ -407,7 +407,7 @@ static HMONITOR WINAPI IDirect3D9Impl_GetAdapterMonitor(LPDIRECT3D9EX iface, UIN
return ret;
}
-static HRESULT WINAPI IDirect3D9Impl_CreateDevice(IDirect3D9Ex *iface, UINT adapter,
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3D9Impl_CreateDevice(IDirect3D9Ex *iface, UINT adapter,
D3DDEVTYPE device_type, HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters,
IDirect3DDevice9 **device)
{
@@ -465,7 +465,7 @@ static HRESULT WINAPI IDirect3D9ExImpl_GetAdapterDisplayModeEx(IDirect3D9Ex *ifa
return D3DERR_DRIVERINTERNALERROR;
}
-static HRESULT WINAPI IDirect3D9ExImpl_CreateDeviceEx(IDirect3D9Ex *iface,
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3D9ExImpl_CreateDeviceEx(IDirect3D9Ex *iface,
UINT adapter, D3DDEVTYPE device_type, HWND focus_window, DWORD flags,
D3DPRESENT_PARAMETERS *parameters, D3DDISPLAYMODEEX *mode, IDirect3DDevice9Ex **device)
{
diff --git a/dll/directx/wine/d3d9/query.c b/dll/directx/wine/d3d9/query.c
index ecb2e718eeb..a38dc9d15fb 100644
--- a/dll/directx/wine/d3d9/query.c
+++ b/dll/directx/wine/d3d9/query.c
@@ -150,49 +150,24 @@ static const IDirect3DQuery9Vtbl Direct3DQuery9_Vtbl =
IDirect3DQuery9Impl_GetData
};
+HRESULT query_init(IDirect3DQuery9Impl *query, IDirect3DDevice9Impl *device, D3DQUERYTYPE type)
+{
+ HRESULT hr;
-/* IDirect3DDevice9 IDirect3DQuery9 Methods follow: */
-HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(LPDIRECT3DDEVICE9EX iface, D3DQUERYTYPE Type, IDirect3DQuery9** ppQuery) {
- IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
- IDirect3DQuery9Impl *object = NULL;
- HRESULT hr = D3D_OK;
+ query->lpVtbl = &Direct3DQuery9_Vtbl;
+ query->ref = 1;
- TRACE("iface %p, type %#x, query %p.\n", iface, Type, ppQuery);
-
- if (!ppQuery)
+ wined3d_mutex_lock();
+ hr = IWineD3DDevice_CreateQuery(device->WineD3DDevice, type, &query->wineD3DQuery, (IUnknown *)query);
+ wined3d_mutex_unlock();
+ if (FAILED(hr))
{
- wined3d_mutex_lock();
- hr = IWineD3DDevice_CreateQuery(This->WineD3DDevice, Type, NULL, NULL);
- wined3d_mutex_unlock();
-
+ WARN("Failed to create wined3d query, hr %#x.\n", hr);
return hr;
}
- /* Allocate the storage for the device */
- object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DQuery9Impl));
- if (NULL == object) {
- ERR("Allocation of memory failed, returning D3DERR_OUTOFVIDEOMEMORY\n");
- return D3DERR_OUTOFVIDEOMEMORY;
- }
+ query->parentDevice = (IDirect3DDevice9Ex *)device;
+ IDirect3DDevice9Ex_AddRef(query->parentDevice);
- object->lpVtbl = &Direct3DQuery9_Vtbl;
- object->ref = 1;
-
- wined3d_mutex_lock();
- hr = IWineD3DDevice_CreateQuery(This->WineD3DDevice, Type, &object->wineD3DQuery, (IUnknown *)object);
- wined3d_mutex_unlock();
-
- if (FAILED(hr)) {
-
- /* free up object */
- WARN("(%p) call to IWineD3DDevice_CreateQuery failed\n", This);
- HeapFree(GetProcessHeap(), 0, object);
- } else {
- IDirect3DDevice9Ex_AddRef(iface);
- object->parentDevice = iface;
- *ppQuery = (LPDIRECT3DQUERY9) object;
- TRACE("(%p) : Created query %p\n", This , object);
- }
- TRACE("(%p) : returning %x\n", This, hr);
- return hr;
+ return D3D_OK;
}
diff --git a/dll/directx/wine/d3d9/stateblock.c b/dll/directx/wine/d3d9/stateblock.c
index 7cd3ba629e0..c4941db254b 100644
--- a/dll/directx/wine/d3d9/stateblock.c
+++ b/dll/directx/wine/d3d9/stateblock.c
@@ -123,87 +123,33 @@ static const IDirect3DStateBlock9Vtbl Direct3DStateBlock9_Vtbl =
IDirect3DStateBlock9Impl_Apply
};
-
-/* IDirect3DDevice9 IDirect3DStateBlock9 Methods follow: */
-HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(LPDIRECT3DDEVICE9EX iface, D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9** ppStateBlock) {
- IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
- IDirect3DStateBlock9Impl* object;
- HRESULT hrc = D3D_OK;
-
- TRACE("iface %p, type %#x, stateblock %p.\n", iface, Type, ppStateBlock);
-
- if(Type != D3DSBT_ALL && Type != D3DSBT_PIXELSTATE &&
- Type != D3DSBT_VERTEXSTATE ) {
- 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;
-
- wined3d_mutex_lock();
- hrc = IWineD3DDevice_CreateStateBlock(This->WineD3DDevice, (WINED3DSTATEBLOCKTYPE)Type, &object->wineD3DStateBlock, (IUnknown*)object);
- wined3d_mutex_unlock();
-
- if(hrc != D3D_OK){
- FIXME("(%p) Call to IWineD3DDevice_CreateStateBlock failed.\n", This);
- HeapFree(GetProcessHeap(), 0, object);
- } else {
- IDirect3DDevice9Ex_AddRef(iface);
- object->parentDevice = iface;
- *ppStateBlock = (IDirect3DStateBlock9*)object;
- TRACE("(%p) : Created stateblock %p\n", This, object);
- }
- TRACE("(%p) returning token (ptr to stateblock) of %p\n", This, object);
- return hrc;
-}
-
-HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(IDirect3DDevice9Ex *iface)
+HRESULT stateblock_init(IDirect3DStateBlock9Impl *stateblock, IDirect3DDevice9Impl *device,
+ D3DSTATEBLOCKTYPE type, IWineD3DStateBlock *wined3d_stateblock)
{
- IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
- TRACE("iface %p.\n", iface);
+ stateblock->lpVtbl = &Direct3DStateBlock9_Vtbl;
+ stateblock->ref = 1;
- wined3d_mutex_lock();
- hr = IWineD3DDevice_BeginStateBlock(This->WineD3DDevice);
- wined3d_mutex_unlock();
-
- return hr;
-}
-
-HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(IDirect3DDevice9Ex *iface, IDirect3DStateBlock9 **ppSB)
-{
- IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
- IWineD3DStateBlock *wineD3DStateBlock;
- IDirect3DStateBlock9Impl *object;
- HRESULT hr;
-
- TRACE("iface %p, stateblock %p.\n", iface, ppSB);
-
- /* Tell wineD3D to endstateblock before anything else (in case we run out
- * of memory later and cause locking problems) */
- wined3d_mutex_lock();
- hr=IWineD3DDevice_EndStateBlock(This->WineD3DDevice,&wineD3DStateBlock);
- wined3d_mutex_unlock();
-
- if (hr!= D3D_OK)
+ if (wined3d_stateblock)
{
- WARN("IWineD3DDevice_EndStateBlock returned an error\n");
- return hr;
+ stateblock->wineD3DStateBlock = wined3d_stateblock;
+ }
+ else
+ {
+ wined3d_mutex_lock();
+ hr = IWineD3DDevice_CreateStateBlock(device->WineD3DDevice, (WINED3DSTATEBLOCKTYPE)type,
+ &stateblock->wineD3DStateBlock, (IUnknown *)stateblock);
+ wined3d_mutex_unlock();
+ if (FAILED(hr))
+ {
+ WARN("Failed to create wined3d stateblock, hr %#x.\n", hr);
+ return hr;
+ }
}
- /* allocate a new IDirectD3DStateBlock */
- object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DStateBlock9Impl));
- if (!object) return E_OUTOFMEMORY;
- object->ref = 1;
- object->lpVtbl = &Direct3DStateBlock9_Vtbl;
- object->wineD3DStateBlock = wineD3DStateBlock;
- IDirect3DDevice9Ex_AddRef(iface);
- object->parentDevice = iface;
- *ppSB=(IDirect3DStateBlock9*)object;
- TRACE("(%p) Returning *ppSB %p, wineD3DStateBlock %p\n", This, *ppSB, wineD3DStateBlock);
+ stateblock->parentDevice = (IDirect3DDevice9Ex *)device;
+ IDirect3DDevice9Ex_AddRef(stateblock->parentDevice);
+
return D3D_OK;
}
diff --git a/dll/directx/wine/d3d9/swapchain.c b/dll/directx/wine/d3d9/swapchain.c
index 207504559ee..c692371a258 100644
--- a/dll/directx/wine/d3d9/swapchain.c
+++ b/dll/directx/wine/d3d9/swapchain.c
@@ -79,7 +79,7 @@ static ULONG WINAPI IDirect3DSwapChain9Impl_Release(LPDIRECT3DSWAPCHAIN9 iface)
}
/* IDirect3DSwapChain9 parts follow: */
-static HRESULT WINAPI IDirect3DSwapChain9Impl_Present(LPDIRECT3DSWAPCHAIN9 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion, DWORD dwFlags) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DSwapChain9Impl_Present(LPDIRECT3DSWAPCHAIN9 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion, DWORD dwFlags) {
IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface;
HRESULT hr;
@@ -269,7 +269,7 @@ HRESULT swapchain_init(IDirect3DSwapChain9Impl *swapchain, IDirect3DDevice9Impl
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice9Impl_GetSwapChain(LPDIRECT3DDEVICE9EX iface, UINT iSwapChain, IDirect3DSwapChain9** pSwapChain) {
+HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_GetSwapChain(LPDIRECT3DDEVICE9EX iface, UINT iSwapChain, IDirect3DSwapChain9** pSwapChain) {
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hrc = D3D_OK;
IWineD3DSwapChain *swapchain = NULL;
diff --git a/dll/directx/wine/d3dx9_36/d3dx9_36.rbuild b/dll/directx/wine/d3dx9_36/d3dx9_36.rbuild
index a09c4055f10..52fc95074c7 100644
--- a/dll/directx/wine/d3dx9_36/d3dx9_36.rbuild
+++ b/dll/directx/wine/d3dx9_36/d3dx9_36.rbuild
@@ -22,6 +22,7 @@
shader.c
sprite.c
surface.c
+ texture.c
util.c
version.rc
diff --git a/dll/directx/wine/d3dx9_36/d3dx9_36.spec b/dll/directx/wine/d3dx9_36/d3dx9_36.spec
index 08bb7f5db60..792408194d2 100644
--- a/dll/directx/wine/d3dx9_36/d3dx9_36.spec
+++ b/dll/directx/wine/d3dx9_36/d3dx9_36.spec
@@ -11,7 +11,7 @@
@ stub D3DXCleanMesh
@ stdcall D3DXColorAdjustContrast(ptr ptr long)
@ stdcall D3DXColorAdjustSaturation(ptr ptr long)
-@ stub D3DXCompileShader
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr)
@ stub D3DXCompileShaderFromFileA
@ stub D3DXCompileShaderFromFileW
@ stub D3DXCompileShaderFromResourceA
@@ -92,7 +92,7 @@
@ stub D3DXCreateTeapot
@ stub D3DXCreateTextA
@ stub D3DXCreateTextW
-@ stub D3DXCreateTexture
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr)
@ stub D3DXCreateTextureFromFileA
@ stub D3DXCreateTextureFromFileExA
@ stub D3DXCreateTextureFromFileExW
@@ -129,7 +129,7 @@
@ stub D3DXFillVolumeTexture
@ stub D3DXFillVolumeTextureTX
@ stub D3DXFilterTexture
-@ stub D3DXFindShaderComment
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr)
@ stub D3DXFloat16To32Array
@ stub D3DXFloat32To16Array
@ stub D3DXFrameAppendChild
@@ -157,8 +157,8 @@
@ stdcall D3DXGetImageInfoFromResourceA(long str ptr)
@ stdcall D3DXGetImageInfoFromResourceW(long wstr ptr)
@ stdcall D3DXGetPixelShaderProfile(ptr)
-@ stub D3DXGetShaderConstantTable
-@ stub D3DXGetShaderConstantTableEx
+@ stdcall D3DXGetShaderConstantTable(ptr ptr)
+@ stdcall D3DXGetShaderConstantTableEx(ptr long ptr)
@ stub D3DXGetShaderInputSemantics
@ stub D3DXGetShaderOutputSemantics
@ stub D3DXGetShaderSamplers
diff --git a/dll/directx/wine/d3dx9_36/shader.c b/dll/directx/wine/d3dx9_36/shader.c
index c05f7b74d90..e4de6b32dca 100644
--- a/dll/directx/wine/d3dx9_36/shader.c
+++ b/dll/directx/wine/d3dx9_36/shader.c
@@ -23,6 +23,7 @@
#include "windef.h"
#include "wingdi.h"
#include "d3dx9.h"
+#include "d3dx9shader.h"
#include "d3dx9_36_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
@@ -134,6 +135,41 @@ LPCSTR WINAPI D3DXGetVertexShaderProfile(LPDIRECT3DDEVICE9 device)
return NULL;
}
+HRESULT WINAPI D3DXFindShaderComment(CONST DWORD* byte_code, DWORD fourcc, LPCVOID* data, UINT* size)
+{
+ CONST DWORD *ptr = byte_code;
+
+ TRACE("(%p, %x, %p, %p)", byte_code, fourcc, data, size);
+
+ if (!byte_code)
+ return D3DERR_INVALIDCALL;
+
+ while (*++ptr != D3DSIO_END)
+ {
+ /* Check if it is a comment */
+ if ((*ptr & D3DSI_OPCODE_MASK) == D3DSIO_COMMENT)
+ {
+ DWORD comment_size = (*ptr & D3DSI_COMMENTSIZE_MASK) >> D3DSI_COMMENTSIZE_SHIFT;
+
+ /* Check if this is the comment we are looking for */
+ if (*(ptr + 1) == fourcc)
+ {
+ UINT ctab_size = (comment_size - 1) * sizeof(DWORD);
+ LPCVOID ctab_data = ptr + 2;
+ if (size)
+ *size = ctab_size;
+ if (data)
+ *data = ctab_data;
+ TRACE("Returning comment data at %p with size %d\n", ctab_data, ctab_size);
+ return D3D_OK;
+ }
+ ptr += comment_size;
+ }
+ }
+
+ return S_FALSE;
+}
+
HRESULT WINAPI D3DXAssembleShader(LPCSTR data,
UINT data_len,
CONST D3DXMACRO* defines,
@@ -142,7 +178,7 @@ HRESULT WINAPI D3DXAssembleShader(LPCSTR data,
LPD3DXBUFFER* shader,
LPD3DXBUFFER* error_messages)
{
- FIXME("stub\n");
+ FIXME("(%p, %d, %p, %p, %x, %p, %p): stub\n", data, data_len, defines, include, flags, shader, error_messages);
return D3DERR_INVALIDCALL;
}
@@ -177,7 +213,7 @@ HRESULT WINAPI D3DXAssembleShaderFromFileW(LPCWSTR filename,
LPD3DXBUFFER* shader,
LPD3DXBUFFER* error_messages)
{
- FIXME("stub\n");
+ FIXME("(%s, %p, %p, %x, %p, %p): stub\n", debugstr_w(filename), defines, include, flags, shader, error_messages);
return D3DERR_INVALIDCALL;
}
@@ -220,3 +256,382 @@ HRESULT WINAPI D3DXAssembleShaderFromResourceW(HMODULE module,
return D3DXAssembleShader(buffer, len, defines, include, flags,
shader, error_messages);
}
+
+HRESULT WINAPI D3DXCompileShader(LPCSTR pSrcData,
+ UINT srcDataLen,
+ CONST D3DXMACRO* pDefines,
+ LPD3DXINCLUDE pInclude,
+ LPCSTR pFunctionName,
+ LPCSTR pProfile,
+ DWORD Flags,
+ LPD3DXBUFFER* ppShader,
+ LPD3DXBUFFER* ppErrorMsgs,
+ LPD3DXCONSTANTTABLE * ppConstantTable)
+{
+ FIXME("(%p, %d, %p, %p, %p, %p, %d, %p, %p, %p): stub\n",
+ pSrcData, srcDataLen, pDefines, pInclude, pFunctionName,
+ pProfile, Flags, ppShader, ppErrorMsgs, ppConstantTable);
+ return D3DERR_INVALIDCALL;
+}
+
+static const struct ID3DXConstantTableVtbl ID3DXConstantTable_Vtbl;
+
+typedef struct ID3DXConstantTableImpl {
+ const ID3DXConstantTableVtbl *lpVtbl;
+ LONG ref;
+ LPVOID ctab;
+ DWORD size;
+} ID3DXConstantTableImpl;
+
+/*** IUnknown methods ***/
+static HRESULT WINAPI ID3DXConstantTableImpl_QueryInterface(ID3DXConstantTable* iface, REFIID riid, void** ppvObject)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppvObject);
+
+ if (IsEqualGUID(riid, &IID_IUnknown) ||
+ IsEqualGUID(riid, &IID_ID3DXConstantTable))
+ {
+ ID3DXConstantTable_AddRef(iface);
+ *ppvObject = This;
+ return S_OK;
+ }
+
+ ERR("Interface %s not found\n", debugstr_guid(riid));
+
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ID3DXConstantTableImpl_AddRef(ID3DXConstantTable* iface)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ TRACE("(%p)->(): AddRef from %d\n", This, This->ref);
+
+ return InterlockedIncrement(&This->ref);
+}
+
+static ULONG WINAPI ID3DXConstantTableImpl_Release(ID3DXConstantTable* iface)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p)->(): Release from %d\n", This, ref + 1);
+
+ if (!ref)
+ {
+ HeapFree(GetProcessHeap(), 0, This->ctab);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+/*** ID3DXBuffer methods ***/
+static LPVOID WINAPI ID3DXConstantTableImpl_GetBufferPointer(ID3DXConstantTable* iface)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ TRACE("(%p)->()\n", This);
+
+ return This->ctab;
+}
+
+static DWORD WINAPI ID3DXConstantTableImpl_GetBufferSize(ID3DXConstantTable* iface)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ TRACE("(%p)->()\n", This);
+
+ return This->size;
+}
+
+/*** ID3DXConstantTable methods ***/
+static HRESULT WINAPI ID3DXConstantTableImpl_GetDesc(ID3DXConstantTable* iface, D3DXCONSTANTTABLE_DESC *desc)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p): stub\n", This, desc);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_GetConstantDesc(ID3DXConstantTable* iface, D3DXHANDLE constant,
+ D3DXCONSTANT_DESC *desc, UINT *count)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %p): stub\n", This, constant, desc, count);
+
+ return E_NOTIMPL;
+}
+
+static D3DXHANDLE WINAPI ID3DXConstantTableImpl_GetConstant(ID3DXConstantTable* iface, D3DXHANDLE constant, UINT index)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %d): stub\n", This, constant, index);
+
+ return NULL;
+}
+
+static D3DXHANDLE WINAPI ID3DXConstantTableImpl_GetConstantByName(ID3DXConstantTable* iface, D3DXHANDLE constant, LPCSTR name)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %s): stub\n", This, constant, name);
+
+ return NULL;
+}
+
+static D3DXHANDLE WINAPI ID3DXConstantTableImpl_GetConstantByElement(ID3DXConstantTable* iface, D3DXHANDLE constant, UINT index)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %d): stub\n", This, constant, index);
+
+ return NULL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetDefaults(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p): stub\n", This, device);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetValue(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+ D3DXHANDLE constant, LPCVOID data, UINT bytes)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, data, bytes);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetBool(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+ D3DXHANDLE constant, BOOL b)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %d): stub\n", This, device, constant, b);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetBoolArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+ D3DXHANDLE constant, CONST BOOL* b, UINT count)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, b, count);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetInt(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, D3DXHANDLE constant, INT n)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %d): stub\n", This, device, constant, n);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetIntArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+ D3DXHANDLE constant, CONST INT* n, UINT count)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, n, count);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetFloat(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+ D3DXHANDLE constant, FLOAT f)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %f): stub\n", This, device, constant, f);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetFloatArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+ D3DXHANDLE constant, CONST FLOAT* f, UINT count)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, f, count);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetVector(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+ D3DXHANDLE constant, CONST D3DXVECTOR4* vector)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %p): stub\n", This, device, constant, vector);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetVectorArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+ D3DXHANDLE constant, CONST D3DXVECTOR4* vector, UINT count)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, vector, count);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrix(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+ D3DXHANDLE constant, CONST D3DXMATRIX* matrix)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %p): stub\n", This, device, constant, matrix);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+ D3DXHANDLE constant, CONST D3DXMATRIX* matrix, UINT count)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, matrix, count);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixPointerArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+ D3DXHANDLE constant, CONST D3DXMATRIX** matrix, UINT count)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, matrix, count);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixTranspose(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+ D3DXHANDLE constant, CONST D3DXMATRIX* matrix)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %p): stub\n", This, device, constant, matrix);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixTransposeArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+ D3DXHANDLE constant, CONST D3DXMATRIX* matrix, UINT count)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, matrix, count);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixTransposePointerArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+ D3DXHANDLE constant, CONST D3DXMATRIX** matrix, UINT count)
+{
+ ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+ FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, matrix, count);
+
+ return E_NOTIMPL;
+}
+
+static const struct ID3DXConstantTableVtbl ID3DXConstantTable_Vtbl =
+{
+ /*** IUnknown methods ***/
+ ID3DXConstantTableImpl_QueryInterface,
+ ID3DXConstantTableImpl_AddRef,
+ ID3DXConstantTableImpl_Release,
+ /*** ID3DXBuffer methods ***/
+ ID3DXConstantTableImpl_GetBufferPointer,
+ ID3DXConstantTableImpl_GetBufferSize,
+ /*** ID3DXConstantTable methods ***/
+ ID3DXConstantTableImpl_GetDesc,
+ ID3DXConstantTableImpl_GetConstantDesc,
+ ID3DXConstantTableImpl_GetConstant,
+ ID3DXConstantTableImpl_GetConstantByName,
+ ID3DXConstantTableImpl_GetConstantByElement,
+ ID3DXConstantTableImpl_SetDefaults,
+ ID3DXConstantTableImpl_SetValue,
+ ID3DXConstantTableImpl_SetBool,
+ ID3DXConstantTableImpl_SetBoolArray,
+ ID3DXConstantTableImpl_SetInt,
+ ID3DXConstantTableImpl_SetIntArray,
+ ID3DXConstantTableImpl_SetFloat,
+ ID3DXConstantTableImpl_SetFloatArray,
+ ID3DXConstantTableImpl_SetVector,
+ ID3DXConstantTableImpl_SetVectorArray,
+ ID3DXConstantTableImpl_SetMatrix,
+ ID3DXConstantTableImpl_SetMatrixArray,
+ ID3DXConstantTableImpl_SetMatrixPointerArray,
+ ID3DXConstantTableImpl_SetMatrixTranspose,
+ ID3DXConstantTableImpl_SetMatrixTransposeArray,
+ ID3DXConstantTableImpl_SetMatrixTransposePointerArray
+};
+
+HRESULT WINAPI D3DXGetShaderConstantTableEx(CONST DWORD* pFunction,
+ DWORD flags,
+ LPD3DXCONSTANTTABLE* ppConstantTable)
+{
+ ID3DXConstantTableImpl* object;
+ HRESULT hr;
+ LPCVOID data;
+ UINT size;
+
+ FIXME("(%p, %x, %p): semi-stub\n", pFunction, flags, ppConstantTable);
+
+ if (!pFunction || !ppConstantTable)
+ return D3DERR_INVALIDCALL;
+
+ hr = D3DXFindShaderComment(pFunction, MAKEFOURCC('C','T','A','B'), &data, &size);
+ if (hr != D3D_OK)
+ return D3DXERR_INVALIDDATA;
+
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXConstantTableImpl));
+ if (!object)
+ {
+ ERR("Out of memory\n");
+ return E_OUTOFMEMORY;
+ }
+
+ object->lpVtbl = &ID3DXConstantTable_Vtbl;
+ object->ref = 1;
+
+ object->ctab = HeapAlloc(GetProcessHeap(), 0, size);
+ if (!object->ctab)
+ {
+ HeapFree(GetProcessHeap(), 0, object);
+ ERR("Out of memory\n");
+ return E_OUTOFMEMORY;
+ }
+ object->size = size;
+ memcpy(object->ctab, data, object->size);
+
+ *ppConstantTable = (LPD3DXCONSTANTTABLE)object;
+
+ return D3D_OK;
+}
+
+HRESULT WINAPI D3DXGetShaderConstantTable(CONST DWORD* pFunction,
+ LPD3DXCONSTANTTABLE* ppConstantTable)
+{
+ TRACE("(%p, %p): Forwarded to D3DXGetShaderConstantTableEx\n", pFunction, ppConstantTable);
+
+ return D3DXGetShaderConstantTableEx(pFunction, 0, ppConstantTable);
+}
diff --git a/dll/directx/wine/d3dx9_36/surface.c b/dll/directx/wine/d3dx9_36/surface.c
index 4d8d1f61346..6de6de77ab2 100644
--- a/dll/directx/wine/d3dx9_36/surface.c
+++ b/dll/directx/wine/d3dx9_36/surface.c
@@ -47,7 +47,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
*/
HRESULT WINAPI D3DXGetImageInfoFromFileInMemory(LPCVOID data, UINT datasize, D3DXIMAGE_INFO *info)
{
- FIXME("stub\n");
+ FIXME("(%p, %d, %p): stub\n", data, datasize, info);
if(data && datasize && !info) return D3D_OK;
if( !data || !datasize ) return D3DERR_INVALIDCALL;
@@ -193,7 +193,9 @@ HRESULT WINAPI D3DXLoadSurfaceFromFileInMemory(LPDIRECT3DSURFACE9 pDestSurface,
D3DCOLOR Colorkey,
D3DXIMAGE_INFO *pSrcInfo)
{
- FIXME("stub\n");
+ FIXME("(%p, %p, %p, %p, %d, %p, %d, %x, %p): stub\n", pDestSurface, pDestPalette,
+ pDestRect, pSrcData, SrcDataSize, pSrcRect, dwFilter, Colorkey, pSrcInfo);
+
if( !pDestSurface || !pSrcData | !SrcDataSize ) return D3DERR_INVALIDCALL;
return E_NOTIMPL;
}
diff --git a/dll/directx/wine/d3dx9_36/texture.c b/dll/directx/wine/d3dx9_36/texture.c
new file mode 100644
index 00000000000..f47853a89df
--- /dev/null
+++ b/dll/directx/wine/d3dx9_36/texture.c
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2010 Christian Costa
+ *
+ * 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);
+
+HRESULT WINAPI D3DXCreateTexture(LPDIRECT3DDEVICE9 pDevice,
+ UINT width,
+ UINT height,
+ UINT miplevels,
+ DWORD usage,
+ D3DFORMAT format,
+ D3DPOOL pool,
+ LPDIRECT3DTEXTURE9 *ppTexture)
+{
+ FIXME("(%p, %d, %d, %d, %x, %x, %x, %p): semi-stub\n", pDevice, width, height, miplevels, usage, format,
+ pool, ppTexture);
+
+ return IDirect3DDevice9_CreateTexture(pDevice, width, height, miplevels, usage, format, pool, ppTexture, NULL);
+}
diff --git a/dll/directx/wine/ddraw/device.c b/dll/directx/wine/ddraw/device.c
index 67fc6f5e266..13ecfa133ac 100644
--- a/dll/directx/wine/ddraw/device.c
+++ b/dll/directx/wine/ddraw/device.c
@@ -1705,13 +1705,13 @@ IDirect3DDeviceImpl_7_EndScene(IDirect3DDevice7 *iface)
else return D3DERR_SCENE_NOT_IN_SCENE;
}
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
IDirect3DDeviceImpl_7_EndScene_FPUSetup(IDirect3DDevice7 *iface)
{
return IDirect3DDeviceImpl_7_EndScene(iface);
}
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
IDirect3DDeviceImpl_7_EndScene_FPUPreserve(IDirect3DDevice7 *iface)
{
HRESULT hr;
@@ -1724,7 +1724,7 @@ IDirect3DDeviceImpl_7_EndScene_FPUPreserve(IDirect3DDevice7 *iface)
return hr;
}
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
Thunk_IDirect3DDeviceImpl_3_EndScene(IDirect3DDevice3 *iface)
{
IDirect3DDeviceImpl *This = device_from_device3(iface);
@@ -1732,7 +1732,7 @@ Thunk_IDirect3DDeviceImpl_3_EndScene(IDirect3DDevice3 *iface)
return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This);
}
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
Thunk_IDirect3DDeviceImpl_2_EndScene(IDirect3DDevice2 *iface)
{
IDirect3DDeviceImpl *This = device_from_device2(iface);
@@ -1740,7 +1740,7 @@ Thunk_IDirect3DDeviceImpl_2_EndScene(IDirect3DDevice2 *iface)
return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This);
}
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
Thunk_IDirect3DDeviceImpl_1_EndScene(IDirect3DDevice *iface)
{
IDirect3DDeviceImpl *This = device_from_device1(iface);
@@ -2580,7 +2580,8 @@ IDirect3DDeviceImpl_3_GetRenderState(IDirect3DDevice3 *iface,
}
if (!(colorop == WINED3DTOP_MODULATE && colorarg1 == WINED3DTA_TEXTURE && colorarg2 == WINED3DTA_CURRENT &&
- alphaop == WINED3DTOP_SELECTARG1 && alphaarg1 == (tex_alpha ? WINED3DTA_TEXTURE : WINED3DTA_CURRENT)))
+ alphaop == (tex_alpha ? WINED3DTOP_SELECTARG1 : WINED3DTOP_SELECTARG2) &&
+ alphaarg1 == WINED3DTA_TEXTURE && alphaarg2 == WINED3DTA_CURRENT))
{
ERR("Unexpected texture stage state setup, returning D3DTBLEND_MODULATE - likely erroneous\n");
}
@@ -2852,16 +2853,12 @@ IDirect3DDeviceImpl_3_SetRenderState(IDirect3DDevice3 *iface,
IWineD3DBaseTexture_Release(tex);
}
- IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG1);
if (tex_alpha)
- {
- IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_TEXTURE);
- }
+ IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG1);
else
- {
- IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_CURRENT);
- }
-
+ IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG2);
+ IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_TEXTURE);
+ IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG2, WINED3DTA_CURRENT);
IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_COLORARG1, WINED3DTA_TEXTURE);
IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_COLORARG2, WINED3DTA_CURRENT);
IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_COLOROP, WINED3DTOP_MODULATE);
@@ -4664,15 +4661,11 @@ IDirect3DDeviceImpl_3_SetTexture(IDirect3DDevice3 *iface,
IWineD3DBaseTexture_Release(tex);
}
- /* alphaop is WINED3DTOP_SELECTARG1 if it's D3DTBLEND_MODULATE, so only modify alphaarg1 */
+ /* Arg 1/2 are already set to WINED3DTA_TEXTURE/WINED3DTA_CURRENT in case of D3DTBLEND_MODULATE */
if (tex_alpha)
- {
- IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_TEXTURE);
- }
+ IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG1);
else
- {
- IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_CURRENT);
- }
+ IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG2);
}
LeaveCriticalSection(&ddraw_cs);
diff --git a/dll/directx/wine/ddraw/main.c b/dll/directx/wine/ddraw/main.c
index 079800d9a2b..bc23987ed81 100644
--- a/dll/directx/wine/ddraw/main.c
+++ b/dll/directx/wine/ddraw/main.c
@@ -302,7 +302,7 @@ err_out:
* Arguments, return values: See DDRAW_Create
*
***********************************************************************/
-HRESULT WINAPI
+HRESULT WINAPI DECLSPEC_HOTPATCH
DirectDrawCreate(GUID *GUID,
LPDIRECTDRAW *DD,
IUnknown *UnkOuter)
@@ -325,7 +325,7 @@ DirectDrawCreate(GUID *GUID,
* Arguments, return values: See DDRAW_Create
*
***********************************************************************/
-HRESULT WINAPI
+HRESULT WINAPI DECLSPEC_HOTPATCH
DirectDrawCreateEx(GUID *GUID,
LPVOID *DD,
REFIID iid,
@@ -742,14 +742,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
*/
HRESULT WINAPI DllCanUnloadNow(void)
{
- HRESULT hr;
- FIXME("(void): stub\n");
-
- EnterCriticalSection(&ddraw_cs);
- hr = S_FALSE;
- LeaveCriticalSection(&ddraw_cs);
-
- return hr;
+ return S_FALSE;
}
/*******************************************************************************
diff --git a/dll/directx/wine/ddraw/vertexbuffer.c b/dll/directx/wine/ddraw/vertexbuffer.c
index df7528b45cb..f16cf124392 100644
--- a/dll/directx/wine/ddraw/vertexbuffer.c
+++ b/dll/directx/wine/ddraw/vertexbuffer.c
@@ -236,8 +236,17 @@ IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface,
IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
WINED3DBUFFER_DESC Desc;
HRESULT hr;
+ DWORD wined3d_flags = 0;
TRACE("(%p)->(%08x,%p,%p)\n", This, Flags, Data, Size);
+ /* Writeonly: Pointless. Event: Unsupported by native according to the sdk
+ * nosyslock: Not applicable
+ */
+ if(!(Flags & DDLOCK_WAIT)) wined3d_flags |= WINED3DLOCK_DONOTWAIT;
+ if(Flags & DDLOCK_READONLY) wined3d_flags |= WINED3DLOCK_READONLY;
+ if(Flags & DDLOCK_NOOVERWRITE) wined3d_flags |= WINED3DLOCK_NOOVERWRITE;
+ if(Flags & DDLOCK_DISCARDCONTENTS) wined3d_flags |= WINED3DLOCK_DISCARD;
+
EnterCriticalSection(&ddraw_cs);
if(Size)
{
@@ -253,7 +262,7 @@ IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface,
}
hr = IWineD3DBuffer_Map(This->wineD3DVertexBuffer, 0 /* OffsetToLock */,
- 0 /* SizeToLock, 0 == Full lock */, (BYTE **)Data, Flags);
+ 0 /* SizeToLock, 0 == Full lock */, (BYTE **)Data, wined3d_flags);
LeaveCriticalSection(&ddraw_cs);
return hr;
}
diff --git a/dll/directx/wine/ddraw/viewport.c b/dll/directx/wine/ddraw/viewport.c
index 9b0698903f5..b637df1b0f5 100644
--- a/dll/directx/wine/ddraw/viewport.c
+++ b/dll/directx/wine/ddraw/viewport.c
@@ -255,14 +255,25 @@ IDirect3DViewportImpl_GetViewport(IDirect3DViewport3 *iface,
TRACE("(%p/%p)->(%p)\n", This, iface, lpData);
EnterCriticalSection(&ddraw_cs);
- if (This->use_vp2 != 0) {
- ERR(" Requesting to get a D3DVIEWPORT struct where a D3DVIEWPORT2 was set !\n");
- LeaveCriticalSection(&ddraw_cs);
- return DDERR_INVALIDPARAMS;
- }
dwSize = lpData->dwSize;
memset(lpData, 0, dwSize);
- memcpy(lpData, &(This->viewports.vp1), dwSize);
+ if (!This->use_vp2)
+ memcpy(lpData, &(This->viewports.vp1), dwSize);
+ else {
+ D3DVIEWPORT vp1;
+ vp1.dwSize = sizeof(vp1);
+ vp1.dwX = This->viewports.vp2.dwX;
+ vp1.dwY = This->viewports.vp2.dwY;
+ vp1.dwWidth = This->viewports.vp2.dwWidth;
+ vp1.dwHeight = This->viewports.vp2.dwHeight;
+ vp1.dvMaxX = 0.0;
+ vp1.dvMaxY = 0.0;
+ vp1.dvScaleX = 0.0;
+ vp1.dvScaleY = 0.0;
+ vp1.dvMinZ = This->viewports.vp2.dvMinZ;
+ vp1.dvMaxZ = This->viewports.vp2.dvMaxZ;
+ memcpy(lpData, &vp1, dwSize);
+ }
if (TRACE_ON(d3d7)) {
TRACE(" returning D3DVIEWPORT :\n");
@@ -908,14 +919,25 @@ IDirect3DViewportImpl_GetViewport2(IDirect3DViewport3 *iface,
TRACE("(%p)->(%p)\n", This, lpData);
EnterCriticalSection(&ddraw_cs);
- if (This->use_vp2 != 1) {
- ERR(" Requesting to get a D3DVIEWPORT2 struct where a D3DVIEWPORT was set !\n");
- LeaveCriticalSection(&ddraw_cs);
- return DDERR_INVALIDPARAMS;
- }
dwSize = lpData->dwSize;
memset(lpData, 0, dwSize);
- memcpy(lpData, &(This->viewports.vp2), dwSize);
+ if (This->use_vp2)
+ memcpy(lpData, &(This->viewports.vp2), dwSize);
+ else {
+ D3DVIEWPORT2 vp2;
+ vp2.dwSize = sizeof(vp2);
+ vp2.dwX = This->viewports.vp1.dwX;
+ vp2.dwY = This->viewports.vp1.dwY;
+ vp2.dwWidth = This->viewports.vp1.dwWidth;
+ vp2.dwHeight = This->viewports.vp1.dwHeight;
+ vp2.dvClipX = 0.0;
+ vp2.dvClipY = 0.0;
+ vp2.dvClipWidth = 0.0;
+ vp2.dvClipHeight = 0.0;
+ vp2.dvMinZ = This->viewports.vp1.dvMinZ;
+ vp2.dvMaxZ = This->viewports.vp1.dvMaxZ;
+ memcpy(lpData, &vp2, dwSize);
+ }
if (TRACE_ON(d3d7)) {
TRACE(" returning D3DVIEWPORT2 :\n");
diff --git a/dll/directx/wine/wined3d/arb_program_shader.c b/dll/directx/wine/wined3d/arb_program_shader.c
index 1fdae2a4105..cf7638605eb 100644
--- a/dll/directx/wine/wined3d/arb_program_shader.c
+++ b/dll/directx/wine/wined3d/arb_program_shader.c
@@ -41,6 +41,45 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d);
#define GLINFO_LOCATION (*gl_info)
+/* Extract a line. Note that this modifies the source string. */
+static char *get_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;
+}
+
+static void shader_arb_dump_program_source(const char *source)
+{
+ unsigned long source_size;
+ char *ptr, *line, *tmp;
+
+ source_size = strlen(source) + 1;
+ tmp = HeapAlloc(GetProcessHeap(), 0, source_size);
+ if (!tmp)
+ {
+ ERR("Failed to allocate %lu bytes for shader source.\n", source_size);
+ return;
+ }
+ memcpy(tmp, source, source_size);
+
+ ptr = tmp;
+ while ((line = get_line(&ptr))) FIXME(" %s\n", line);
+ FIXME("\n");
+
+ HeapFree(GetProcessHeap(), 0, tmp);
+}
+
/* GL locking for state handlers is done by the caller. */
static BOOL need_mova_const(IWineD3DBaseShader *shader, const struct wined3d_gl_info *gl_info)
{
@@ -1122,10 +1161,10 @@ static void gen_color_correction(struct wined3d_shader_buffer *buffer, const cha
{
DWORD mask;
- if (is_yuv_fixup(fixup))
+ if (is_complex_fixup(fixup))
{
- enum yuv_fixup yuv_fixup = get_yuv_fixup(fixup);
- FIXME("YUV fixup (%#x) not supported\n", yuv_fixup);
+ enum complex_fixup complex_fixup = get_complex_fixup(fixup);
+ FIXME("Complex fixup (%#x) not supported\n", complex_fixup);
return;
}
@@ -1761,8 +1800,8 @@ static void pshader_hw_texkill(const struct wined3d_shader_instruction *ins)
static void pshader_hw_tex(const struct wined3d_shader_instruction *ins)
{
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
- IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major,
ins->ctx->reg_maps->shader_version.minor);
@@ -1856,8 +1895,8 @@ static void pshader_hw_texcoord(const struct wined3d_shader_instruction *ins)
static void pshader_hw_texreg2ar(const struct wined3d_shader_instruction *ins)
{
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
- IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
DWORD flags;
DWORD reg1 = ins->dst[0].reg.idx;
@@ -1904,7 +1943,8 @@ static void pshader_hw_texreg2rgb(const struct wined3d_shader_instruction *ins)
static void pshader_hw_texbem(const struct wined3d_shader_instruction *ins)
{
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device;
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
char reg_coord[40], dst_reg[50], src_reg[50];
@@ -1936,8 +1976,8 @@ static void pshader_hw_texbem(const struct wined3d_shader_instruction *ins)
/* 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) {
+ if (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");
@@ -1975,8 +2015,8 @@ static void pshader_hw_texm3x2pad(const struct wined3d_shader_instruction *ins)
static void pshader_hw_texm3x2tex(const struct wined3d_shader_instruction *ins)
{
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
- IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
DWORD flags;
DWORD reg = ins->dst[0].reg.idx;
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
@@ -1997,10 +2037,10 @@ static void pshader_hw_texm3x2tex(const struct wined3d_shader_instruction *ins)
static void pshader_hw_texm3x3pad(const struct wined3d_shader_instruction *ins)
{
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
DWORD reg = ins->dst[0].reg.idx;
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
- SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
char src0_name[50], dst_name[50];
struct wined3d_shader_register tmp_reg = ins->dst[0].reg;
BOOL is_color;
@@ -2020,12 +2060,12 @@ static void pshader_hw_texm3x3pad(const struct wined3d_shader_instruction *ins)
static void pshader_hw_texm3x3tex(const struct wined3d_shader_instruction *ins)
{
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
- IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
+ SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
DWORD flags;
DWORD reg = ins->dst[0].reg.idx;
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
- SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
char dst_str[50];
char src0_name[50], dst_name[50];
BOOL is_color;
@@ -2043,12 +2083,12 @@ static void pshader_hw_texm3x3tex(const struct wined3d_shader_instruction *ins)
static void pshader_hw_texm3x3vspec(const struct wined3d_shader_instruction *ins)
{
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
- IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
+ SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
DWORD flags;
DWORD reg = ins->dst[0].reg.idx;
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
- SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
char dst_str[50];
char src0_name[50];
char dst_reg[50];
@@ -2085,11 +2125,11 @@ static void pshader_hw_texm3x3vspec(const struct wined3d_shader_instruction *ins
static void pshader_hw_texm3x3spec(const struct wined3d_shader_instruction *ins)
{
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
- IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
+ SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
DWORD flags;
DWORD reg = ins->dst[0].reg.idx;
- SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
char dst_str[50];
char src0_name[50];
@@ -3046,8 +3086,9 @@ static GLuint create_arb_blt_vertex_program(const struct wined3d_gl_info *gl_inf
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
if (pos != -1)
{
- FIXME("Vertex program error at position %d: %s\n", pos,
+ FIXME("Vertex program error at position %d: %s\n\n", pos,
debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+ shader_arb_dump_program_source(blt_vprogram);
}
else
{
@@ -3108,8 +3149,9 @@ static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_i
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
if (pos != -1)
{
- FIXME("Fragment program error at position %d: %s\n", pos,
+ FIXME("Fragment program error at position %d: %s\n\n", pos,
debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+ shader_arb_dump_program_source(blt_fprograms[tex_type]);
}
else
{
@@ -3564,8 +3606,9 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
if (errPos != -1)
{
- FIXME("HW PixelShader Error at position %d: %s\n",
+ FIXME("HW PixelShader Error at position %d: %s\n\n",
errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+ shader_arb_dump_program_source(buffer->buffer);
retval = 0;
}
else
@@ -3974,8 +4017,9 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
if (errPos != -1)
{
- FIXME("HW VertexShader Error at position %d: %s\n",
+ FIXME("HW VertexShader Error at position %d: %s\n\n",
errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+ shader_arb_dump_program_source(buffer->buffer);
ret = -1;
}
else
@@ -4448,8 +4492,7 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) {
if (shader_is_pshader_version(baseShader->baseShader.reg_maps.shader_version.type))
{
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *) iface;
- struct arb_pshader_private *shader_data = This->baseShader.backend_data;
+ struct arb_pshader_private *shader_data = baseShader->baseShader.backend_data;
UINT i;
if(!shader_data) return; /* This can happen if a shader was never compiled */
@@ -4471,10 +4514,11 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) {
HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
HeapFree(GetProcessHeap(), 0, shader_data);
- This->baseShader.backend_data = NULL;
- } else {
- IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *) iface;
- struct arb_vshader_private *shader_data = This->baseShader.backend_data;
+ baseShader->baseShader.backend_data = NULL;
+ }
+ else
+ {
+ struct arb_vshader_private *shader_data = baseShader->baseShader.backend_data;
UINT i;
if(!shader_data) return; /* This can happen if a shader was never compiled */
@@ -4496,7 +4540,7 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) {
HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
HeapFree(GetProcessHeap(), 0, shader_data);
- This->baseShader.backend_data = NULL;
+ baseShader->baseShader.backend_data = NULL;
}
}
@@ -4565,8 +4609,7 @@ 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)
+static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps)
{
DWORD vs_consts = min(gl_info->limits.arb_vs_float_constants, gl_info->limits.arb_vs_native_constants);
DWORD ps_consts = min(gl_info->limits.arb_ps_float_constants, gl_info->limits.arb_ps_native_constants);
@@ -4574,7 +4617,7 @@ static void shader_arb_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_
/* We don't have an ARB fixed function pipeline yet, so let the none backend set its caps,
* then overwrite the shader specific ones
*/
- none_shader_backend.shader_get_caps(devtype, gl_info, pCaps);
+ none_shader_backend.shader_get_caps(gl_info, pCaps);
if (gl_info->supported[ARB_VERTEX_PROGRAM])
{
@@ -4630,8 +4673,8 @@ static BOOL shader_arb_color_fixup_supported(struct color_fixup_desc fixup)
dump_color_fixup_desc(fixup);
}
- /* We support everything except YUV conversions. */
- if (!is_yuv_fixup(fixup))
+ /* We support everything except complex conversions. */
+ if (!is_complex_fixup(fixup))
{
TRACE("[OK]\n");
return TRUE;
@@ -4678,6 +4721,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
/* WINED3DSIH_CMP */ pshader_hw_cmp,
/* WINED3DSIH_CND */ pshader_hw_cnd,
/* WINED3DSIH_CRS */ shader_hw_map2gl,
+ /* WINED3DSIH_CUT */ NULL,
/* WINED3DSIH_DCL */ NULL,
/* WINED3DSIH_DEF */ NULL,
/* WINED3DSIH_DEFB */ NULL,
@@ -4689,20 +4733,24 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
/* WINED3DSIH_DSX */ shader_hw_map2gl,
/* WINED3DSIH_DSY */ shader_hw_dsy,
/* WINED3DSIH_ELSE */ shader_hw_else,
+ /* WINED3DSIH_EMIT */ NULL,
/* 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_IADD */ NULL,
/* WINED3DSIH_IF */ NULL /* Hardcoded into the shader */,
/* WINED3DSIH_IFC */ shader_hw_ifc,
+ /* WINED3DSIH_IGE */ NULL,
/* WINED3DSIH_LABEL */ shader_hw_label,
/* WINED3DSIH_LIT */ 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_LT */ NULL,
/* WINED3DSIH_M3x2 */ shader_hw_mnxn,
/* WINED3DSIH_M3x3 */ shader_hw_mnxn,
/* WINED3DSIH_M3x4 */ shader_hw_mnxn,
@@ -5229,7 +5277,7 @@ static void arbfp_free(IWineD3DDevice *iface) {
}
}
-static void arbfp_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
+static void arbfp_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
{
caps->TextureOpCaps = WINED3DTEXOPCAPS_DISABLE |
WINED3DTEXOPCAPS_SELECTARG1 |
@@ -5858,8 +5906,9 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
if (pos != -1)
{
- FIXME("Fragment program error at position %d: %s\n", pos,
+ FIXME("Fragment program error at position %d: %s\n\n", pos,
debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+ shader_arb_dump_program_source(buffer.buffer);
}
else
{
@@ -6180,6 +6229,7 @@ struct arbfp_blit_priv {
GLenum yuy2_rect_shader, yuy2_2d_shader;
GLenum uyvy_rect_shader, uyvy_2d_shader;
GLenum yv12_rect_shader, yv12_2d_shader;
+ GLenum p8_rect_shader, p8_2d_shader;
};
static HRESULT arbfp_blit_alloc(IWineD3DDevice *iface) {
@@ -6204,20 +6254,22 @@ 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");
+ GL_EXTCALL(glDeleteProgramsARB(1, &priv->p8_rect_shader));
+ GL_EXTCALL(glDeleteProgramsARB(1, &priv->p8_2d_shader));
+ checkGLcall("Delete yuv and p8 programs");
LEAVE_GL();
HeapFree(GetProcessHeap(), 0, device->blit_priv);
device->blit_priv = NULL;
}
-static BOOL gen_planar_yuv_read(struct wined3d_shader_buffer *buffer, enum yuv_fixup yuv_fixup,
+static BOOL gen_planar_yuv_read(struct wined3d_shader_buffer *buffer, enum complex_fixup fixup,
GLenum textype, char *luminance)
{
char chroma;
const char *tex, *texinstr;
- if (yuv_fixup == YUV_FIXUP_UYVY) {
+ if (fixup == COMPLEX_FIXUP_UYVY) {
chroma = 'x';
*luminance = 'w';
} else {
@@ -6445,8 +6497,74 @@ static BOOL gen_yv12_read(struct wined3d_shader_buffer *buffer, GLenum textype,
return TRUE;
}
+static GLuint gen_p8_shader(IWineD3DDeviceImpl *device, GLenum textype)
+{
+ GLenum shader;
+ struct wined3d_shader_buffer buffer;
+ struct arbfp_blit_priv *priv = device->blit_priv;
+ GLint pos;
+
+ /* Shader header */
+ if (!shader_buffer_init(&buffer))
+ {
+ ERR("Failed to initialize shader buffer.\n");
+ return 0;
+ }
+
+ ENTER_GL();
+ GL_EXTCALL(glGenProgramsARB(1, &shader));
+ GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, shader));
+ LEAVE_GL();
+ if(!shader) {
+ shader_buffer_free(&buffer);
+ return 0;
+ }
+
+ shader_addline(&buffer, "!!ARBfp1.0\n");
+ shader_addline(&buffer, "TEMP index;\n");
+
+ /* { 255/256, 0.5/255*255/256, 0, 0 } */
+ shader_addline(&buffer, "PARAM constants = { 0.996, 0.00195, 0, 0 };\n");
+
+ /* The alpha-component contains the palette index */
+ if(textype == GL_TEXTURE_RECTANGLE_ARB)
+ shader_addline(&buffer, "TXP index, fragment.texcoord[0], texture[0], RECT;\n");
+ else
+ shader_addline(&buffer, "TEX index, fragment.texcoord[0], texture[0], 2D;\n");
+
+ /* Scale the index by 255/256 and add a bias of '0.5' in order to sample in the middle */
+ shader_addline(&buffer, "MAD index.a, index.a, constants.x, constants.y;\n");
+
+ /* Use the alpha-component as an index in the palette to get the final color */
+ shader_addline(&buffer, "TEX result.color, index.a, texture[1], 1D;\n");
+ shader_addline(&buffer, "END\n");
+
+ ENTER_GL();
+ GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
+ strlen(buffer.buffer), buffer.buffer));
+ checkGLcall("glProgramStringARB()");
+
+ glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
+ if (pos != -1)
+ {
+ FIXME("Fragment program error at position %d: %s\n\n", pos,
+ debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+ shader_arb_dump_program_source(buffer.buffer);
+ }
+
+ if (textype == GL_TEXTURE_RECTANGLE_ARB)
+ priv->p8_rect_shader = shader;
+ else
+ priv->p8_2d_shader = shader;
+
+ shader_buffer_free(&buffer);
+ LEAVE_GL();
+
+ return shader;
+}
+
/* Context activation is done by the caller. */
-static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixup, GLenum textype)
+static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum complex_fixup yuv_fixup, GLenum textype)
{
GLenum shader;
struct wined3d_shader_buffer buffer;
@@ -6519,8 +6637,8 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu
switch (yuv_fixup)
{
- case YUV_FIXUP_UYVY:
- case YUV_FIXUP_YUY2:
+ case COMPLEX_FIXUP_UYVY:
+ case COMPLEX_FIXUP_YUY2:
if (!gen_planar_yuv_read(&buffer, yuv_fixup, textype, &luminance_component))
{
shader_buffer_free(&buffer);
@@ -6528,7 +6646,7 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu
}
break;
- case YUV_FIXUP_YV12:
+ case COMPLEX_FIXUP_YV12:
if (!gen_yv12_read(&buffer, textype, &luminance_component))
{
shader_buffer_free(&buffer);
@@ -6562,8 +6680,9 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
if (pos != -1)
{
- FIXME("Fragment program error at position %d: %s\n", pos,
+ FIXME("Fragment program error at position %d: %s\n\n", pos,
debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+ shader_arb_dump_program_source(buffer.buffer);
}
else
{
@@ -6579,20 +6698,22 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu
switch (yuv_fixup)
{
- case YUV_FIXUP_YUY2:
+ case COMPLEX_FIXUP_YUY2:
if (textype == GL_TEXTURE_RECTANGLE_ARB) priv->yuy2_rect_shader = shader;
else priv->yuy2_2d_shader = shader;
break;
- case YUV_FIXUP_UYVY:
+ case COMPLEX_FIXUP_UYVY:
if (textype == GL_TEXTURE_RECTANGLE_ARB) priv->uyvy_rect_shader = shader;
else priv->uyvy_2d_shader = shader;
break;
- case YUV_FIXUP_YV12:
+ case COMPLEX_FIXUP_YV12:
if (textype == GL_TEXTURE_RECTANGLE_ARB) priv->yv12_rect_shader = shader;
else priv->yv12_2d_shader = shader;
break;
+ default:
+ ERR("Unsupported complex fixup: %d\n", yuv_fixup);
}
return shader;
@@ -6606,9 +6727,9 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface;
float size[4] = {width, height, 1, 1};
struct arbfp_blit_priv *priv = device->blit_priv;
- enum yuv_fixup yuv_fixup;
+ enum complex_fixup fixup;
- if (!is_yuv_fixup(format_desc->color_fixup))
+ if (!is_complex_fixup(format_desc->color_fixup))
{
TRACE("Fixup:\n");
dump_color_fixup_desc(format_desc->color_fixup);
@@ -6620,24 +6741,29 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD
return WINED3D_OK;
}
- yuv_fixup = get_yuv_fixup(format_desc->color_fixup);
+ fixup = get_complex_fixup(format_desc->color_fixup);
- switch(yuv_fixup)
+ switch(fixup)
{
- case YUV_FIXUP_YUY2:
+ case COMPLEX_FIXUP_YUY2:
shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->yuy2_rect_shader : priv->yuy2_2d_shader;
break;
- case YUV_FIXUP_UYVY:
+ case COMPLEX_FIXUP_UYVY:
shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->uyvy_rect_shader : priv->uyvy_2d_shader;
break;
- case YUV_FIXUP_YV12:
+ case COMPLEX_FIXUP_YV12:
shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->yv12_rect_shader : priv->yv12_2d_shader;
break;
+ case COMPLEX_FIXUP_P8:
+ shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->p8_rect_shader : priv->p8_2d_shader;
+ if (!shader) shader = gen_p8_shader(device, textype);
+ break;
+
default:
- FIXME("Unsupported YUV fixup %#x, not setting a shader\n", yuv_fixup);
+ FIXME("Unsupported complex fixup %#x, not setting a shader\n", fixup);
ENTER_GL();
glEnable(textype);
checkGLcall("glEnable(textype)");
@@ -6645,7 +6771,7 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD
return E_NOTIMPL;
}
- if (!shader) shader = gen_yuv_shader(device, yuv_fixup, textype);
+ if (!shader) shader = gen_yuv_shader(device, fixup, textype);
ENTER_GL();
glEnable(GL_FRAGMENT_PROGRAM_ARB);
@@ -6684,7 +6810,7 @@ static void arbfp_blit_unset(IWineD3DDevice *iface) {
static BOOL arbfp_blit_color_fixup_supported(struct color_fixup_desc fixup)
{
- enum yuv_fixup yuv_fixup;
+ enum complex_fixup complex_fixup;
if (TRACE_ON(d3d_shader) && TRACE_ON(d3d))
{
@@ -6699,23 +6825,24 @@ static BOOL arbfp_blit_color_fixup_supported(struct color_fixup_desc fixup)
}
/* We only support YUV conversions. */
- if (!is_yuv_fixup(fixup))
+ if (!is_complex_fixup(fixup))
{
TRACE("[FAILED]\n");
return FALSE;
}
- yuv_fixup = get_yuv_fixup(fixup);
- switch(yuv_fixup)
+ complex_fixup = get_complex_fixup(fixup);
+ switch(complex_fixup)
{
- case YUV_FIXUP_YUY2:
- case YUV_FIXUP_UYVY:
- case YUV_FIXUP_YV12:
+ case COMPLEX_FIXUP_YUY2:
+ case COMPLEX_FIXUP_UYVY:
+ case COMPLEX_FIXUP_YV12:
+ case COMPLEX_FIXUP_P8:
TRACE("[OK]\n");
return TRUE;
default:
- FIXME("Unsupported YUV fixup %#x\n", yuv_fixup);
+ FIXME("Unsupported YUV fixup %#x\n", complex_fixup);
TRACE("[FAILED]\n");
return FALSE;
}
diff --git a/dll/directx/wine/wined3d/ati_fragment_shader.c b/dll/directx/wine/wined3d/ati_fragment_shader.c
index becd4475d0a..0f911e9dc15 100644
--- a/dll/directx/wine/wined3d/ati_fragment_shader.c
+++ b/dll/directx/wine/wined3d/ati_fragment_shader.c
@@ -1061,7 +1061,7 @@ static void atifs_enable(IWineD3DDevice *iface, BOOL enable) {
LEAVE_GL();
}
-static void atifs_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
+static void atifs_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
{
caps->TextureOpCaps = WINED3DTEXOPCAPS_DISABLE |
WINED3DTEXOPCAPS_SELECTARG1 |
diff --git a/dll/directx/wine/wined3d/baseshader.c b/dll/directx/wine/wined3d/baseshader.c
deleted file mode 100644
index 14416c47197..00000000000
--- a/dll/directx/wine/wined3d/baseshader.c
+++ /dev/null
@@ -1,1439 +0,0 @@
-/*
- * shaders implementation
- *
- * Copyright 2002-2003 Jason Edmeades
- * Copyright 2002-2003 Raphael Junqueira
- * Copyright 2004 Christian Costa
- * Copyright 2005 Oliver Stieber
- * Copyright 2006 Ivan Gyurdiev
- * 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
- * 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 "wined3d_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
-WINE_DECLARE_DEBUG_CHANNEL(d3d);
-
-static const char *shader_opcode_names[] =
-{
- /* WINED3DSIH_ABS */ "abs",
- /* WINED3DSIH_ADD */ "add",
- /* WINED3DSIH_BEM */ "bem",
- /* WINED3DSIH_BREAK */ "break",
- /* WINED3DSIH_BREAKC */ "breakc",
- /* WINED3DSIH_BREAKP */ "breakp",
- /* WINED3DSIH_CALL */ "call",
- /* WINED3DSIH_CALLNZ */ "callnz",
- /* WINED3DSIH_CMP */ "cmp",
- /* WINED3DSIH_CND */ "cnd",
- /* WINED3DSIH_CRS */ "crs",
- /* WINED3DSIH_DCL */ "dcl",
- /* WINED3DSIH_DEF */ "def",
- /* WINED3DSIH_DEFB */ "defb",
- /* WINED3DSIH_DEFI */ "defi",
- /* WINED3DSIH_DP2ADD */ "dp2add",
- /* WINED3DSIH_DP3 */ "dp3",
- /* WINED3DSIH_DP4 */ "dp4",
- /* WINED3DSIH_DST */ "dst",
- /* WINED3DSIH_DSX */ "dsx",
- /* WINED3DSIH_DSY */ "dsy",
- /* WINED3DSIH_ELSE */ "else",
- /* WINED3DSIH_ENDIF */ "endif",
- /* WINED3DSIH_ENDLOOP */ "endloop",
- /* WINED3DSIH_ENDREP */ "endrep",
- /* WINED3DSIH_EXP */ "exp",
- /* WINED3DSIH_EXPP */ "expp",
- /* WINED3DSIH_FRC */ "frc",
- /* WINED3DSIH_IF */ "if",
- /* WINED3DSIH_IFC */ "ifc",
- /* WINED3DSIH_LABEL */ "label",
- /* WINED3DSIH_LIT */ "lit",
- /* WINED3DSIH_LOG */ "log",
- /* WINED3DSIH_LOGP */ "logp",
- /* WINED3DSIH_LOOP */ "loop",
- /* WINED3DSIH_LRP */ "lrp",
- /* WINED3DSIH_M3x2 */ "m3x2",
- /* WINED3DSIH_M3x3 */ "m3x3",
- /* WINED3DSIH_M3x4 */ "m3x4",
- /* WINED3DSIH_M4x3 */ "m4x3",
- /* WINED3DSIH_M4x4 */ "m4x4",
- /* WINED3DSIH_MAD */ "mad",
- /* WINED3DSIH_MAX */ "max",
- /* WINED3DSIH_MIN */ "min",
- /* WINED3DSIH_MOV */ "mov",
- /* WINED3DSIH_MOVA */ "mova",
- /* WINED3DSIH_MUL */ "mul",
- /* WINED3DSIH_NOP */ "nop",
- /* WINED3DSIH_NRM */ "nrm",
- /* WINED3DSIH_PHASE */ "phase",
- /* WINED3DSIH_POW */ "pow",
- /* WINED3DSIH_RCP */ "rcp",
- /* WINED3DSIH_REP */ "rep",
- /* WINED3DSIH_RET */ "ret",
- /* WINED3DSIH_RSQ */ "rsq",
- /* WINED3DSIH_SETP */ "setp",
- /* WINED3DSIH_SGE */ "sge",
- /* WINED3DSIH_SGN */ "sgn",
- /* WINED3DSIH_SINCOS */ "sincos",
- /* WINED3DSIH_SLT */ "slt",
- /* WINED3DSIH_SUB */ "sub",
- /* WINED3DSIH_TEX */ "texld",
- /* WINED3DSIH_TEXBEM */ "texbem",
- /* WINED3DSIH_TEXBEML */ "texbeml",
- /* WINED3DSIH_TEXCOORD */ "texcrd",
- /* WINED3DSIH_TEXDEPTH */ "texdepth",
- /* WINED3DSIH_TEXDP3 */ "texdp3",
- /* WINED3DSIH_TEXDP3TEX */ "texdp3tex",
- /* WINED3DSIH_TEXKILL */ "texkill",
- /* WINED3DSIH_TEXLDD */ "texldd",
- /* WINED3DSIH_TEXLDL */ "texldl",
- /* WINED3DSIH_TEXM3x2DEPTH */ "texm3x2depth",
- /* WINED3DSIH_TEXM3x2PAD */ "texm3x2pad",
- /* WINED3DSIH_TEXM3x2TEX */ "texm3x2tex",
- /* WINED3DSIH_TEXM3x3 */ "texm3x3",
- /* WINED3DSIH_TEXM3x3DIFF */ "texm3x3diff",
- /* WINED3DSIH_TEXM3x3PAD */ "texm3x3pad",
- /* WINED3DSIH_TEXM3x3SPEC */ "texm3x3spec",
- /* WINED3DSIH_TEXM3x3TEX */ "texm3x3tex",
- /* WINED3DSIH_TEXM3x3VSPEC */ "texm3x3vspec",
- /* WINED3DSIH_TEXREG2AR */ "texreg2ar",
- /* WINED3DSIH_TEXREG2GB */ "texreg2gb",
- /* WINED3DSIH_TEXREG2RGB */ "texreg2rgb",
-};
-
-const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token)
-{
- switch (version_token >> 16)
- {
- case WINED3D_SM1_VS:
- case WINED3D_SM1_PS:
- return &sm1_shader_frontend;
-
- case WINED3D_SM4_PS:
- case WINED3D_SM4_VS:
- case WINED3D_SM4_GS:
- return &sm4_shader_frontend;
-
- default:
- FIXME("Unrecognised version token %#x\n", version_token);
- return NULL;
- }
-}
-
-void shader_buffer_clear(struct wined3d_shader_buffer *buffer)
-{
- buffer->buffer[0] = '\0';
- buffer->bsize = 0;
- buffer->lineNo = 0;
- buffer->newline = TRUE;
-}
-
-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(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 */ || (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;
- return -1;
- }
-
- if (buffer->newline) {
- TRACE("GL HW (%u, %u) : %s", buffer->lineNo + 1, buffer->bsize, base);
- buffer->newline = FALSE;
- } else {
- TRACE("%s", base);
- }
-
- buffer->bsize += rc;
- if (buffer->buffer[buffer->bsize-1] == '\n') {
- buffer->lineNo++;
- buffer->newline = TRUE;
- }
- return 0;
-}
-
-int shader_addline(struct wined3d_shader_buffer *buffer, const char *format, ...)
-{
- int ret;
- va_list args;
-
- va_start(args, format);
- ret = shader_vaddline(buffer, format, args);
- va_end(args);
-
- return ret;
-}
-
-void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device,
- IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
-{
- shader->ref = 1;
- shader->device = (IWineD3DDevice *)device;
- shader->parent = parent;
- shader->parent_ops = parent_ops;
- list_init(&shader->linked_programs);
- list_add_head(&device->shaders, &shader->shader_list_entry);
-}
-
-/* Convert floating point offset relative
- * to a register file to an absolute offset for float constants */
-static unsigned int shader_get_float_offset(WINED3DSHADER_PARAM_REGISTER_TYPE register_type, UINT register_idx)
-{
- switch (register_type)
- {
- case WINED3DSPR_CONST: return register_idx;
- case WINED3DSPR_CONST2: return 2048 + register_idx;
- case WINED3DSPR_CONST3: return 4096 + register_idx;
- case WINED3DSPR_CONST4: return 6144 + register_idx;
- default:
- FIXME("Unsupported register type: %d\n", register_type);
- return register_idx;
- }
-}
-
-static void shader_delete_constant_list(struct list* clist) {
-
- struct list *ptr;
- struct local_constant* constant;
-
- ptr = list_head(clist);
- while (ptr) {
- constant = LIST_ENTRY(ptr, struct local_constant, entry);
- ptr = list_next(clist, ptr);
- HeapFree(GetProcessHeap(), 0, constant);
- }
- list_init(clist);
-}
-
-static inline void set_bitmap_bit(DWORD *bitmap, DWORD bit)
-{
- DWORD idx, shift;
- idx = bit >> 5;
- shift = bit & 0x1f;
- bitmap[idx] |= (1 << shift);
-}
-
-static void shader_record_register_usage(IWineD3DBaseShaderImpl *This, struct shader_reg_maps *reg_maps,
- const struct wined3d_shader_register *reg, enum wined3d_shader_type shader_type)
-{
- switch (reg->type)
- {
- case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */
- 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 |= 1 << reg->idx;
- break;
-
- case WINED3DSPR_INPUT:
- if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
- {
- 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
- * that v0, v1 and v2 aren't read because aL can be negative */
- unsigned int i;
- for (i = 0; i < MAX_REG_INPUT; ++i)
- {
- ((IWineD3DPixelShaderImpl *)This)->input_reg_used[i] = TRUE;
- }
- }
- else
- {
- ((IWineD3DPixelShaderImpl *)This)->input_reg_used[reg->idx] = TRUE;
- }
- }
- else reg_maps->input_registers |= 1 << reg->idx;
- break;
-
- case WINED3DSPR_RASTOUT:
- if (reg->idx == 1) reg_maps->fog = 1;
- break;
-
- case WINED3DSPR_MISCTYPE:
- 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 (reg->rel_addr)
- {
- if (shader_type != WINED3D_SHADER_TYPE_PIXEL)
- {
- 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, reg->idx);
- }
- break;
-
- case WINED3DSPR_CONSTINT:
- reg_maps->integer_constants |= (1 << reg->idx);
- break;
-
- case WINED3DSPR_CONSTBOOL:
- 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", reg->type, reg->idx);
- break;
- }
-}
-
-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 ? 3 : 0;
-
- case WINED3DSIH_M4x3:
- case WINED3DSIH_M3x3:
- return param == 1 ? 2 : 0;
-
- case WINED3DSIH_M3x2:
- return param == 1 ? 1 : 0;
-
- default:
- return 0;
- }
-}
-
-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",
-};
-
-static const char *shader_semantic_name_from_usage(WINED3DDECLUSAGE usage)
-{
- if (usage >= sizeof(semantic_names) / sizeof(*semantic_names))
- {
- FIXME("Unrecognized usage %#x\n", usage);
- return "UNRECOGNIZED";
- }
-
- return semantic_names[usage];
-}
-
-WINED3DDECLUSAGE shader_usage_from_semantic_name(const char *name)
-{
- unsigned int i;
-
- for (i = 0; i < sizeof(semantic_names) / sizeof(*semantic_names); ++i)
- {
- if (!strcmp(name, semantic_names[i])) return i;
- }
-
- return ~0U;
-}
-
-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_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;
-
- /* There are some minor differences between pixel and vertex shaders */
-
- memset(reg_maps, 0, sizeof(*reg_maps));
-
- /* get_registers_used is called on every compile on some 1.x shaders, which can result
- * in stacking up a collection of local constants. Delete the old constants if existing
- */
- shader_delete_constant_list(&This->baseShader.constantsF);
- shader_delete_constant_list(&This->baseShader.constantsB);
- shader_delete_constant_list(&This->baseShader.constantsI);
-
- fe->shader_read_header(fe_data, &pToken, &shader_version);
- reg_maps->shader_version = shader_version;
-
- reg_maps->constf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
- sizeof(*reg_maps->constf) * ((constf_size + 31) / 32));
- if(!reg_maps->constf) {
- ERR("Out of memory\n");
- return E_OUTOFMEMORY;
- }
-
- while (!fe->shader_is_end(fe_data, &pToken))
- {
- struct wined3d_shader_instruction ins;
- const char *comment;
- UINT param_size;
-
- /* Skip comments */
- fe->shader_read_comment(&pToken, &comment);
- if (comment) continue;
-
- /* Fetch opcode */
- fe->shader_read_opcode(fe_data, &pToken, &ins, ¶m_size);
-
- /* Unhandled opcode, and its parameters */
- if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
- {
- TRACE("Skipping unrecognized instruction.\n");
- pToken += param_size;
- continue;
- }
-
- /* Handle declarations */
- if (ins.handler_idx == WINED3DSIH_DCL)
- {
- struct wined3d_shader_semantic semantic;
-
- fe->shader_read_semantic(&pToken, &semantic);
-
- switch (semantic.reg.reg.type)
- {
- /* Mark input registers used. */
- case WINED3DSPR_INPUT:
- reg_maps->input_registers |= 1 << semantic.reg.reg.idx;
- 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->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;
-
- /* Save sampler usage token */
- case WINED3DSPR_SAMPLER:
- reg_maps->sampler_type[semantic.reg.reg.idx] = semantic.sampler_type;
- break;
-
- default:
- TRACE("Not recording DCL register type %#x.\n", semantic.reg.reg.type);
- break;
- }
- }
- else if (ins.handler_idx == WINED3DSIH_DEF)
- {
- struct wined3d_shader_dst_param dst;
- struct wined3d_shader_src_param rel_addr;
-
- local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
- if (!lconst) return E_OUTOFMEMORY;
-
- fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
- lconst->idx = dst.reg.idx;
-
- memcpy(lconst->value, pToken, 4 * sizeof(DWORD));
- pToken += 4;
-
- /* In pixel shader 1.X shaders, the constants are clamped between [-1;1] */
- if (shader_version.major == 1 && shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
- {
- float *value = (float *) lconst->value;
- 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);
- }
- else if (ins.handler_idx == WINED3DSIH_DEFI)
- {
- struct wined3d_shader_dst_param dst;
- struct wined3d_shader_src_param rel_addr;
-
- local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
- if (!lconst) return E_OUTOFMEMORY;
-
- fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
- lconst->idx = dst.reg.idx;
-
- memcpy(lconst->value, pToken, 4 * sizeof(DWORD));
- 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)
- {
- struct wined3d_shader_dst_param dst;
- struct wined3d_shader_src_param rel_addr;
-
- local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
- if (!lconst) return E_OUTOFMEMORY;
-
- fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
- lconst->idx = dst.reg.idx;
-
- memcpy(lconst->value, pToken, sizeof(DWORD));
- ++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
- || ins.handler_idx == WINED3DSIH_REP)
- {
- struct wined3d_shader_src_param src, rel_addr;
-
- fe->shader_read_src_param(fe_data, &pToken, &src, &rel_addr);
-
- /* Rep and Loop always use an integer constant for the control parameters */
- if (ins.handler_idx == WINED3DSIH_REP)
- {
- reg_maps->integer_constants |= 1 << src.reg.idx;
- }
- else
- {
- fe->shader_read_src_param(fe_data, &pToken, &src, &rel_addr);
- reg_maps->integer_constants |= 1 << src.reg.idx;
- }
-
- cur_loop_depth++;
- if(cur_loop_depth > max_loop_depth)
- max_loop_depth = cur_loop_depth;
- }
- else if (ins.handler_idx == WINED3DSIH_ENDLOOP
- || ins.handler_idx == WINED3DSIH_ENDREP)
- {
- cur_loop_depth--;
- }
- /* For subroutine prototypes */
- else if (ins.handler_idx == WINED3DSIH_LABEL)
- {
- struct wined3d_shader_src_param src, rel_addr;
-
- fe->shader_read_src_param(fe_data, &pToken, &src, &rel_addr);
- 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.
- *
- * Relative addressing tokens are ignored, but that's
- * okay, since we'll catch any address registers when
- * they are initialized (required by spec) */
-
- if (ins.dst_count)
- {
- struct wined3d_shader_dst_param dst_param;
- struct wined3d_shader_src_param dst_rel_addr;
-
- 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 (shader_version.type == WINED3D_SHADER_TYPE_VERTEX && shader_version.major < 3
- && dst_param.reg.type == WINED3DSPR_TEXCRDOUT)
- {
- reg_maps->texcoord_mask[dst_param.reg.idx] |= dst_param.write_mask;
- }
-
- if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
- {
- 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
- && (ins.handler_idx == WINED3DSIH_TEX
- || ins.handler_idx == WINED3DSIH_TEXBEM
- || ins.handler_idx == WINED3DSIH_TEXBEML
- || ins.handler_idx == WINED3DSIH_TEXDP3TEX
- || ins.handler_idx == WINED3DSIH_TEXM3x2TEX
- || ins.handler_idx == WINED3DSIH_TEXM3x3SPEC
- || ins.handler_idx == WINED3DSIH_TEXM3x3TEX
- || ins.handler_idx == WINED3DSIH_TEXM3x3VSPEC
- || ins.handler_idx == WINED3DSIH_TEXREG2AR
- || ins.handler_idx == WINED3DSIH_TEXREG2GB
- || ins.handler_idx == WINED3DSIH_TEXREG2RGB))
- {
- /* Fake sampler usage, only set reserved bit and ttype */
- DWORD sampler_code = dst_param.reg.idx;
-
- TRACE("Setting fake 2D sampler for 1.x pixelshader\n");
- reg_maps->sampler_type[sampler_code] = WINED3DSTT_2D;
-
- /* texbem is only valid with < 1.4 pixel shaders */
- if (ins.handler_idx == WINED3DSIH_TEXBEM
- || ins.handler_idx == WINED3DSIH_TEXBEML)
- {
- reg_maps->bumpmat |= 1 << dst_param.reg.idx;
- if (ins.handler_idx == WINED3DSIH_TEXBEML)
- {
- reg_maps->luminanceparams |= 1 << dst_param.reg.idx;
- }
- }
- }
- else if (ins.handler_idx == WINED3DSIH_BEM)
- {
- reg_maps->bumpmat |= 1 << dst_param.reg.idx;
- }
- }
-
- if (ins.handler_idx == WINED3DSIH_NRM)
- {
- reg_maps->usesnrm = 1;
- }
- else if (ins.handler_idx == WINED3DSIH_DSY)
- {
- 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);
- count = get_instr_extra_regcount(ins.handler_idx, i);
-
- shader_record_register_usage(This, reg_maps, &src_param.reg, shader_version.type);
- while (count)
- {
- ++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 = ((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)
-{
- TRACE("dcl");
-
- if (semantic->reg.reg.type == WINED3DSPR_SAMPLER)
- {
- switch (semantic->sampler_type)
- {
- case WINED3DSTT_2D: TRACE("_2d"); break;
- case WINED3DSTT_CUBE: TRACE("_cube"); break;
- case WINED3DSTT_VOLUME: TRACE("_volume"); break;
- default: TRACE("_unknown_ttype(0x%08x)", semantic->sampler_type);
- }
- }
- else
- {
- /* Pixel shaders 3.0 don't have usage semantics */
- if (shader_version->major < 3 && shader_version->type == WINED3D_SHADER_TYPE_PIXEL)
- return;
- else
- TRACE("_");
-
- switch (semantic->usage)
- {
- case WINED3DDECLUSAGE_POSITION:
- TRACE("position%d", semantic->usage_idx);
- break;
- case WINED3DDECLUSAGE_BLENDINDICES:
- TRACE("blend");
- break;
- case WINED3DDECLUSAGE_BLENDWEIGHT:
- TRACE("weight");
- break;
- case WINED3DDECLUSAGE_NORMAL:
- TRACE("normal%d", semantic->usage_idx);
- break;
- case WINED3DDECLUSAGE_PSIZE:
- TRACE("psize");
- break;
- case WINED3DDECLUSAGE_COLOR:
- if (semantic->usage_idx == 0) TRACE("color");
- else TRACE("specular%d", (semantic->usage_idx - 1));
- break;
- case WINED3DDECLUSAGE_TEXCOORD:
- TRACE("texture%d", semantic->usage_idx);
- break;
- case WINED3DDECLUSAGE_TANGENT:
- TRACE("tangent");
- break;
- case WINED3DDECLUSAGE_BINORMAL:
- TRACE("binormal");
- break;
- case WINED3DDECLUSAGE_TESSFACTOR:
- TRACE("tessfactor");
- break;
- case WINED3DDECLUSAGE_POSITIONT:
- TRACE("positionT%d", semantic->usage_idx);
- break;
- case WINED3DDECLUSAGE_FOG:
- TRACE("fog");
- break;
- case WINED3DDECLUSAGE_DEPTH:
- TRACE("depth");
- break;
- case WINED3DDECLUSAGE_SAMPLE:
- TRACE("sample");
- break;
- default:
- FIXME("unknown_semantics(0x%08x)", semantic->usage);
- }
- }
-}
-
-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 = reg->idx;
-
- switch (reg->type)
- {
- case WINED3DSPR_TEMP:
- TRACE("r");
- break;
-
- case WINED3DSPR_INPUT:
- TRACE("v");
- break;
-
- case WINED3DSPR_CONST:
- case WINED3DSPR_CONST2:
- case WINED3DSPR_CONST3:
- case WINED3DSPR_CONST4:
- TRACE("c");
- offset = shader_get_float_offset(reg->type, reg->idx);
- break;
-
- case WINED3DSPR_TEXTURE: /* vs: case WINED3DSPR_ADDR */
- TRACE("%c", shader_version->type == WINED3D_SHADER_TYPE_PIXEL ? 't' : 'a');
- break;
-
- case WINED3DSPR_RASTOUT:
- TRACE("%s", rastout_reg_names[reg->idx]);
- break;
-
- case WINED3DSPR_COLOROUT:
- TRACE("oC");
- break;
-
- case WINED3DSPR_DEPTHOUT:
- TRACE("oDepth");
- break;
-
- case WINED3DSPR_ATTROUT:
- TRACE("oD");
- break;
-
- case WINED3DSPR_TEXCRDOUT:
- /* Vertex shaders >= 3.0 use general purpose output registers
- * (WINED3DSPR_OUTPUT), which can include an address token */
- if (shader_version->major >= 3) TRACE("o");
- else TRACE("oT");
- break;
-
- case WINED3DSPR_CONSTINT:
- TRACE("i");
- break;
-
- case WINED3DSPR_CONSTBOOL:
- TRACE("b");
- break;
-
- case WINED3DSPR_LABEL:
- TRACE("l");
- break;
-
- case WINED3DSPR_LOOP:
- TRACE("aL");
- break;
-
- case WINED3DSPR_SAMPLER:
- TRACE("s");
- break;
-
- case WINED3DSPR_MISCTYPE:
- if (reg->idx > 1) FIXME("Unhandled misctype register %d\n", reg->idx);
- else TRACE("%s", misctype_reg_names[reg->idx]);
- break;
-
- case WINED3DSPR_PREDICATE:
- TRACE("p");
- break;
-
- case WINED3DSPR_IMMCONST:
- TRACE("l");
- break;
-
- case WINED3DSPR_CONSTBUFFER:
- TRACE("cb");
- break;
-
- default:
- TRACE("unhandled_rtype(%#x)", reg->type);
- break;
- }
-
- if (reg->type == WINED3DSPR_IMMCONST)
- {
- TRACE("(");
- switch (reg->immconst_type)
- {
- case WINED3D_IMMCONST_FLOAT:
- TRACE("%.8e", *(const float *)reg->immconst_data);
- break;
-
- case WINED3D_IMMCONST_FLOAT4:
- TRACE("%.8e, %.8e, %.8e, %.8e",
- *(const float *)®->immconst_data[0], *(const float *)®->immconst_data[1],
- *(const float *)®->immconst_data[2], *(const float *)®->immconst_data[3]);
- break;
-
- default:
- TRACE("", reg->immconst_type);
- break;
- }
- TRACE(")");
- }
- else if (reg->type != WINED3DSPR_RASTOUT && reg->type != WINED3DSPR_MISCTYPE)
- {
- if (reg->array_idx != ~0U)
- {
- 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("]");
- }
- }
-}
-
-void shader_dump_dst_param(const struct wined3d_shader_dst_param *param,
- const struct wined3d_shader_version *shader_version)
-{
- DWORD write_mask = param->write_mask;
-
- shader_dump_register(¶m->reg, shader_version);
-
- if (write_mask != WINED3DSP_WRITEMASK_ALL)
- {
- static const char *write_mask_chars = "xyzw";
-
- TRACE(".");
- if (write_mask & WINED3DSP_WRITEMASK_0) TRACE("%c", write_mask_chars[0]);
- if (write_mask & WINED3DSP_WRITEMASK_1) TRACE("%c", write_mask_chars[1]);
- if (write_mask & WINED3DSP_WRITEMASK_2) TRACE("%c", write_mask_chars[2]);
- if (write_mask & WINED3DSP_WRITEMASK_3) TRACE("%c", write_mask_chars[3]);
- }
-}
-
-void shader_dump_src_param(const struct wined3d_shader_src_param *param,
- const struct wined3d_shader_version *shader_version)
-{
- DWORD src_modifier = param->modifiers;
- DWORD swizzle = param->swizzle;
-
- if (src_modifier == WINED3DSPSM_NEG
- || src_modifier == WINED3DSPSM_BIASNEG
- || src_modifier == WINED3DSPSM_SIGNNEG
- || src_modifier == WINED3DSPSM_X2NEG
- || src_modifier == WINED3DSPSM_ABSNEG)
- TRACE("-");
- else if (src_modifier == WINED3DSPSM_COMP)
- TRACE("1-");
- else if (src_modifier == WINED3DSPSM_NOT)
- TRACE("!");
-
- if (src_modifier == WINED3DSPSM_ABS || src_modifier == WINED3DSPSM_ABSNEG)
- TRACE("abs(");
-
- shader_dump_register(¶m->reg, shader_version);
-
- if (src_modifier)
- {
- switch (src_modifier)
- {
- case WINED3DSPSM_NONE: break;
- case WINED3DSPSM_NEG: break;
- case WINED3DSPSM_NOT: break;
- case WINED3DSPSM_BIAS: TRACE("_bias"); break;
- case WINED3DSPSM_BIASNEG: TRACE("_bias"); break;
- case WINED3DSPSM_SIGN: TRACE("_bx2"); break;
- case WINED3DSPSM_SIGNNEG: TRACE("_bx2"); break;
- case WINED3DSPSM_COMP: break;
- case WINED3DSPSM_X2: TRACE("_x2"); break;
- case WINED3DSPSM_X2NEG: TRACE("_x2"); break;
- case WINED3DSPSM_DZ: TRACE("_dz"); break;
- case WINED3DSPSM_DW: TRACE("_dw"); break;
- case WINED3DSPSM_ABSNEG: TRACE(")"); break;
- case WINED3DSPSM_ABS: TRACE(")"); break;
- default:
- TRACE("_unknown_modifier(%#x)", src_modifier);
- }
- }
-
- if (swizzle != WINED3DSP_NOSWIZZLE)
- {
- static const char *swizzle_chars = "xyzw";
- DWORD swizzle_x = swizzle & 0x03;
- DWORD swizzle_y = (swizzle >> 2) & 0x03;
- DWORD swizzle_z = (swizzle >> 4) & 0x03;
- DWORD swizzle_w = (swizzle >> 6) & 0x03;
-
- if (swizzle_x == swizzle_y
- && swizzle_x == swizzle_z
- && swizzle_x == swizzle_w)
- {
- TRACE(".%c", swizzle_chars[swizzle_x]);
- }
- else
- {
- TRACE(".%c%c%c%c", swizzle_chars[swizzle_x], swizzle_chars[swizzle_y],
- swizzle_chars[swizzle_z], swizzle_chars[swizzle_w]);
- }
- }
-}
-
-/* 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, 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 struct wined3d_shader_frontend *fe = This->baseShader.frontend;
- void *fe_data = This->baseShader.frontend_data;
- struct wined3d_shader_src_param src_rel_addr[4];
- struct wined3d_shader_src_param src_param[4];
- struct wined3d_shader_version shader_version;
- struct wined3d_shader_src_param dst_rel_addr;
- struct wined3d_shader_dst_param dst_param;
- struct wined3d_shader_instruction ins;
- struct wined3d_shader_context ctx;
- const DWORD *pToken = pFunction;
- 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;
- ins.src = src_param;
- This->baseShader.parse_state.current_row = 0;
-
- fe->shader_read_header(fe_data, &pToken, &shader_version);
-
- while (!fe->shader_is_end(fe_data, &pToken))
- {
- const char *comment;
- UINT param_size;
-
- /* Skip comment tokens */
- fe->shader_read_comment(&pToken, &comment);
- if (comment) continue;
-
- /* Read opcode */
- fe->shader_read_opcode(fe_data, &pToken, &ins, ¶m_size);
-
- /* Unknown opcode and its parameters */
- if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
- {
- TRACE("Skipping unrecognized instruction.\n");
- pToken += param_size;
- continue;
- }
-
- /* Nothing to do */
- if (ins.handler_idx == WINED3DSIH_DCL
- || ins.handler_idx == WINED3DSIH_NOP
- || ins.handler_idx == WINED3DSIH_DEF
- || ins.handler_idx == WINED3DSIH_DEFI
- || ins.handler_idx == WINED3DSIH_DEFB
- || ins.handler_idx == WINED3DSIH_PHASE)
- {
- pToken += param_size;
- continue;
- }
-
- /* Destination token */
- if (ins.dst_count) fe->shader_read_dst_param(fe_data, &pToken, &dst_param, &dst_rel_addr);
-
- /* Predication token */
- if (ins.predicate) ins.predicate = *pToken++;
-
- /* Other source tokens */
- for (i = 0; i < ins.src_count; ++i)
- {
- fe->shader_read_src_param(fe_data, &pToken, &src_param[i], &src_rel_addr[i]);
- }
-
- /* Call appropriate function for output target */
- device->shader_backend->shader_handle_instruction(&ins);
- }
-}
-
-static void shader_dump_ins_modifiers(const struct wined3d_shader_dst_param *dst)
-{
- DWORD mmask = dst->modifiers;
-
- switch (dst->shift)
- {
- case 0: break;
- case 13: TRACE("_d8"); break;
- case 14: TRACE("_d4"); break;
- case 15: TRACE("_d2"); break;
- case 1: TRACE("_x2"); break;
- case 2: TRACE("_x4"); break;
- case 3: TRACE("_x8"); break;
- default: TRACE("_unhandled_shift(%d)", dst->shift); break;
- }
-
- if (mmask & WINED3DSPDM_SATURATE) TRACE("_sat");
- if (mmask & WINED3DSPDM_PARTIALPRECISION) TRACE("_pp");
- if (mmask & WINED3DSPDM_MSAMPCENTROID) TRACE("_centroid");
-
- mmask &= ~(WINED3DSPDM_SATURATE | WINED3DSPDM_PARTIALPRECISION | WINED3DSPDM_MSAMPCENTROID);
- if (mmask)
- FIXME("_unrecognized_modifier(%#x)", mmask);
-}
-
-void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *pFunction)
-{
- 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);
-
- 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))
- {
- struct wined3d_shader_instruction ins;
- const char *comment;
- UINT param_size;
-
- /* comment */
- fe->shader_read_comment(&pToken, &comment);
- if (comment)
- {
- TRACE("//%s\n", comment);
- continue;
- }
-
- fe->shader_read_opcode(fe_data, &pToken, &ins, ¶m_size);
- if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
- {
- TRACE("Skipping unrecognized instruction.\n");
- pToken += param_size;
- continue;
- }
-
- if (ins.handler_idx == WINED3DSIH_DCL)
- {
- struct wined3d_shader_semantic semantic;
-
- fe->shader_read_semantic(&pToken, &semantic);
-
- shader_dump_decl_usage(&semantic, &shader_version);
- shader_dump_ins_modifiers(&semantic.reg);
- TRACE(" ");
- shader_dump_dst_param(&semantic.reg, &shader_version);
- }
- else if (ins.handler_idx == WINED3DSIH_DEF)
- {
- struct wined3d_shader_dst_param dst;
- struct wined3d_shader_src_param rel_addr;
-
- fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
-
- TRACE("def c%u = %f, %f, %f, %f", shader_get_float_offset(dst.reg.type, dst.reg.idx),
- *(const float *)(pToken),
- *(const float *)(pToken + 1),
- *(const float *)(pToken + 2),
- *(const float *)(pToken + 3));
- pToken += 4;
- }
- else if (ins.handler_idx == WINED3DSIH_DEFI)
- {
- struct wined3d_shader_dst_param dst;
- struct wined3d_shader_src_param rel_addr;
-
- fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
-
- TRACE("defi i%u = %d, %d, %d, %d", dst.reg.idx,
- *(pToken),
- *(pToken + 1),
- *(pToken + 2),
- *(pToken + 3));
- pToken += 4;
- }
- else if (ins.handler_idx == WINED3DSIH_DEFB)
- {
- struct wined3d_shader_dst_param dst;
- struct wined3d_shader_src_param rel_addr;
-
- fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
-
- TRACE("defb b%u = %s", dst.reg.idx, *pToken ? "true" : "false");
- ++pToken;
- }
- else
- {
- struct wined3d_shader_src_param dst_rel_addr, src_rel_addr;
- struct wined3d_shader_dst_param dst_param;
- struct wined3d_shader_src_param src_param;
-
- if (ins.dst_count)
- {
- fe->shader_read_dst_param(fe_data, &pToken, &dst_param, &dst_rel_addr);
- }
-
- /* Print out predication source token first - it follows
- * the destination token. */
- if (ins.predicate)
- {
- fe->shader_read_src_param(fe_data, &pToken, &src_param, &src_rel_addr);
- TRACE("(");
- shader_dump_src_param(&src_param, &shader_version);
- TRACE(") ");
- }
-
- /* PixWin marks instructions with the coissue flag with a '+' */
- if (ins.coissue) TRACE("+");
-
- TRACE("%s", shader_opcode_names[ins.handler_idx]);
-
- if (ins.handler_idx == WINED3DSIH_IFC
- || ins.handler_idx == WINED3DSIH_BREAKC)
- {
- switch (ins.flags)
- {
- case COMPARISON_GT: TRACE("_gt"); break;
- case COMPARISON_EQ: TRACE("_eq"); break;
- case COMPARISON_GE: TRACE("_ge"); break;
- case COMPARISON_LT: TRACE("_lt"); break;
- case COMPARISON_NE: TRACE("_ne"); break;
- case COMPARISON_LE: TRACE("_le"); break;
- default: TRACE("_(%u)", ins.flags);
- }
- }
- else if (ins.handler_idx == WINED3DSIH_TEX
- && shader_version.major >= 2
- && (ins.flags & WINED3DSI_TEXLD_PROJECT))
- {
- TRACE("p");
- }
-
- /* We already read the destination token, print it. */
- if (ins.dst_count)
- {
- shader_dump_ins_modifiers(&dst_param);
- TRACE(" ");
- shader_dump_dst_param(&dst_param, &shader_version);
- }
-
- /* Other source tokens */
- for (i = ins.dst_count; i < (ins.dst_count + ins.src_count); ++i)
- {
- fe->shader_read_src_param(fe_data, &pToken, &src_param, &src_rel_addr);
- TRACE(!i ? " " : ", ");
- shader_dump_src_param(&src_param, &shader_version);
- }
- }
- TRACE("\n");
- }
-}
-
-void shader_cleanup(IWineD3DBaseShader *iface)
-{
- IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)iface;
-
- ((IWineD3DDeviceImpl *)This->baseShader.device)->shader_backend->shader_destroy(iface);
- HeapFree(GetProcessHeap(), 0, This->baseShader.reg_maps.constf);
- HeapFree(GetProcessHeap(), 0, This->baseShader.function);
- shader_delete_constant_list(&This->baseShader.constantsF);
- shader_delete_constant_list(&This->baseShader.constantsB);
- shader_delete_constant_list(&This->baseShader.constantsI);
- list_remove(&This->baseShader.shader_list_entry);
-
- if (This->baseShader.frontend && This->baseShader.frontend_data)
- {
- This->baseShader.frontend->shader_free(This->baseShader.frontend_data);
- }
-}
-
-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(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 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.0f;
-}
-
-static BOOL shader_none_color_fixup_supported(struct color_fixup_desc fixup)
-{
- if (TRACE_ON(d3d_shader) && TRACE_ON(d3d))
- {
- TRACE("Checking support for fixup:\n");
- dump_color_fixup_desc(fixup);
- }
-
- /* Faked to make some apps happy. */
- if (!is_yuv_fixup(fixup))
- {
- TRACE("[OK]\n");
- return TRUE;
- }
-
- TRACE("[FAILED]\n");
- return FALSE;
-}
-
-const shader_backend_t none_shader_backend = {
- shader_none_handle_instruction,
- shader_none_select,
- shader_none_select_depth_blt,
- shader_none_deselect_depth_blt,
- shader_none_update_float_vertex_constants,
- shader_none_update_float_pixel_constants,
- shader_none_load_constants,
- shader_none_load_np2fixup_constants,
- shader_none_destroy,
- shader_none_alloc,
- shader_none_free,
- shader_none_dirty_const,
- shader_none_get_caps,
- shader_none_color_fixup_supported,
-};
diff --git a/dll/directx/wine/wined3d/buffer.c b/dll/directx/wine/wined3d/buffer.c
index 20201b12eb3..e22d311beb9 100644
--- a/dll/directx/wine/wined3d/buffer.c
+++ b/dll/directx/wine/wined3d/buffer.c
@@ -3,7 +3,7 @@
* Copyright 2002-2005 Raphael Junqueira
* Copyright 2004 Christian Costa
* Copyright 2005 Oliver Stieber
- * Copyright 2007 Stefan Dösinger for CodeWeavers
+ * Copyright 2007-2010 Stefan Dösinger for CodeWeavers
* Copyright 2009 Henri Verbeet for CodeWeavers
*
* This library is free software; you can redistribute it and/or
@@ -56,7 +56,13 @@ static inline BOOL buffer_add_dirty_area(struct wined3d_buffer *This, UINT offse
}
}
- if(!offset && !size)
+ if(offset > This->resource.size || offset + size > This->resource.size)
+ {
+ WARN("Invalid range dirtified, marking entire buffer dirty\n");
+ offset = 0;
+ size = This->resource.size;
+ }
+ else if(!offset && !size)
{
size = This->resource.size;
}
@@ -145,11 +151,6 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This)
{
TRACE("Gl usage = GL_STREAM_DRAW_ARB\n");
gl_usage = GL_STREAM_DRAW_ARB;
- }
- else
- {
- TRACE("Gl usage = GL_DYNAMIC_DRAW_ARB\n");
- gl_usage = GL_DYNAMIC_DRAW_ARB;
if(gl_info->supported[APPLE_FLUSH_BUFFER_RANGE])
{
@@ -157,6 +158,12 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This)
checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE)");
This->flags |= WINED3D_BUFFER_FLUSH;
}
+ /* No setup is needed here for GL_ARB_map_buffer_range */
+ }
+ else
+ {
+ TRACE("Gl usage = GL_DYNAMIC_DRAW_ARB\n");
+ gl_usage = GL_DYNAMIC_DRAW_ARB;
}
/* Reserve memory for the buffer. The amount of data won't change
@@ -483,7 +490,7 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This)
* FLOAT16s if not supported. Also, we can't iterate over the array, so use macros to generate code for all
* the attributes that our current fixed function pipeline implementation cares for.
*/
- BOOL support_d3dcolor = gl_info->supported[EXT_VERTEX_ARRAY_BGRA];
+ BOOL support_d3dcolor = gl_info->supported[ARB_VERTEX_ARRAY_BGRA];
ret = buffer_check_attribute(This, si, WINED3D_FFP_POSITION,
TRUE, TRUE, FALSE, &stride_this_run, &float16_used) || ret;
ret = buffer_check_attribute(This, si, WINED3D_FFP_NORMAL,
@@ -1026,6 +1033,51 @@ static WINED3DRESOURCETYPE STDMETHODCALLTYPE buffer_GetType(IWineD3DBuffer *ifac
/* IWineD3DBuffer methods */
+static DWORD buffer_sanitize_flags(DWORD flags)
+{
+ /* Not all flags make sense together, but Windows never returns an error. Catch the
+ * cases that could cause issues */
+ if(flags & WINED3DLOCK_READONLY)
+ {
+ if(flags & WINED3DLOCK_DISCARD)
+ {
+ WARN("WINED3DLOCK_READONLY combined with WINED3DLOCK_DISCARD, ignoring flags\n");
+ return 0;
+ }
+ if(flags & WINED3DLOCK_NOOVERWRITE)
+ {
+ WARN("WINED3DLOCK_READONLY combined with WINED3DLOCK_NOOVERWRITE, ignoring flags\n");
+ return 0;
+ }
+ }
+ else if((flags & (WINED3DLOCK_DISCARD | WINED3DLOCK_NOOVERWRITE)) == (WINED3DLOCK_DISCARD | WINED3DLOCK_NOOVERWRITE))
+ {
+ WARN("WINED3DLOCK_DISCARD and WINED3DLOCK_NOOVERWRITE used together, ignoring\n");
+ return 0;
+ }
+
+ return flags;
+}
+
+static GLbitfield buffer_gl_map_flags(DWORD d3d_flags)
+{
+ GLbitfield ret = 0;
+
+ if (!(d3d_flags & WINED3DLOCK_READONLY)) ret = GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT;
+
+ if (d3d_flags & (WINED3DLOCK_DISCARD | WINED3DLOCK_NOOVERWRITE))
+ {
+ if(d3d_flags & WINED3DLOCK_DISCARD) ret |= GL_MAP_INVALIDATE_BUFFER_BIT;
+ ret |= GL_MAP_UNSYNCHRONIZED_BIT;
+ }
+ else
+ {
+ ret |= GL_MAP_READ_BIT;
+ }
+
+ return ret;
+}
+
static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset, UINT size, BYTE **data, DWORD flags)
{
struct wined3d_buffer *This = (struct wined3d_buffer *)iface;
@@ -1033,7 +1085,11 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset,
TRACE("iface %p, offset %u, size %u, data %p, flags %#x\n", iface, offset, size, data, flags);
- if (!buffer_add_dirty_area(This, offset, size)) return E_OUTOFMEMORY;
+ flags = buffer_sanitize_flags(flags);
+ if (!(flags & WINED3DLOCK_READONLY))
+ {
+ if (!buffer_add_dirty_area(This, offset, size)) return E_OUTOFMEMORY;
+ }
count = InterlockedIncrement(&This->lock_count);
@@ -1043,6 +1099,7 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset,
{
IWineD3DDeviceImpl *device = This->resource.device;
struct wined3d_context *context;
+ const struct wined3d_gl_info *gl_info;
if(This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
{
@@ -1050,9 +1107,20 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset,
}
context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ gl_info = context->gl_info;
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));
+
+ if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+ {
+ GLbitfield mapflags = buffer_gl_map_flags(flags);
+ This->resource.allocatedMemory = GL_EXTCALL(glMapBufferRange(This->buffer_type_hint, 0,
+ This->resource.size, mapflags));
+ }
+ else
+ {
+ This->resource.allocatedMemory = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_READ_WRITE_ARB));
+ }
LEAVE_GL();
context_release(context);
}
@@ -1093,6 +1161,7 @@ static HRESULT STDMETHODCALLTYPE buffer_Unmap(IWineD3DBuffer *iface)
if(!(This->flags & WINED3D_BUFFER_DOUBLEBUFFER) && This->buffer_object)
{
IWineD3DDeviceImpl *device = This->resource.device;
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
if(This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
@@ -1101,10 +1170,21 @@ static HRESULT STDMETHODCALLTYPE buffer_Unmap(IWineD3DBuffer *iface)
}
context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ gl_info = context->gl_info;
ENTER_GL();
GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
- if(This->flags & WINED3D_BUFFER_FLUSH)
+ if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+ {
+ for(i = 0; i < This->modified_areas; i++)
+ {
+ GL_EXTCALL(glFlushMappedBufferRange(This->buffer_type_hint,
+ This->maps[i].offset,
+ This->maps[i].size));
+ checkGLcall("glFlushMappedBufferRange");
+ }
+ }
+ else if (This->flags & WINED3D_BUFFER_FLUSH)
{
for(i = 0; i < This->modified_areas; i++)
{
@@ -1196,8 +1276,7 @@ HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device,
TRACE("size %#x, usage %#x, format %s, memory @ %p, iface @ %p.\n", buffer->resource.size, buffer->resource.usage,
debug_d3dformat(buffer->resource.format_desc->format), buffer->resource.allocatedMemory, buffer);
- /* TODO: GL_ARB_map_buffer_range */
- dynamic_buffer_ok = gl_info->supported[APPLE_FLUSH_BUFFER_RANGE];
+ dynamic_buffer_ok = gl_info->supported[APPLE_FLUSH_BUFFER_RANGE] || gl_info->supported[ARB_MAP_BUFFER_RANGE];
/* Observations show that drawStridedSlow is faster on dynamic VBs than converting +
* drawStridedFast (half-life 2 and others).
diff --git a/dll/directx/wine/wined3d/context.c b/dll/directx/wine/wined3d/context.c
index 2aec7d6bfd3..08789855812 100644
--- a/dll/directx/wine/wined3d/context.c
+++ b/dll/directx/wine/wined3d/context.c
@@ -114,7 +114,7 @@ static void context_destroy_fbo(struct wined3d_context *context, GLuint *fbo)
}
/* GL locking is done by the caller */
-static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOOL force_preload)
+static void context_apply_attachment_filter_states(IWineD3DSurface *surface)
{
const IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
IWineD3DDeviceImpl *device = surface_impl->resource.device;
@@ -148,7 +148,7 @@ static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOO
IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture_impl);
}
- if (update_minfilter || update_magfilter || force_preload)
+ if (update_minfilter || update_magfilter)
{
GLenum target, bind_target;
GLint old_binding;
@@ -166,8 +166,6 @@ static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOO
glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARB, &old_binding);
}
- surface_internal_preload(surface, SRGB_RGB);
-
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);
@@ -208,7 +206,8 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context,
}
else
{
- context_apply_attachment_filter_states(depth_stencil, TRUE);
+ surface_prepare_texture(depth_stencil_impl, FALSE);
+ context_apply_attachment_filter_states(depth_stencil);
if (format_flags & WINED3DFMT_FLAG_DEPTH)
{
@@ -253,14 +252,15 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context,
void context_attach_surface_fbo(const struct wined3d_context *context,
GLenum fbo_target, DWORD idx, IWineD3DSurface *surface)
{
- const IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
+ 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(surface, TRUE);
+ surface_prepare_texture(surface_impl, FALSE);
+ context_apply_attachment_filter_states(surface);
gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx, surface_impl->texture_target,
surface_impl->texture_name, surface_impl->texture_level);
@@ -431,10 +431,10 @@ static void context_apply_fbo_entry(struct wined3d_context *context, struct fbo_
for (i = 0; i < gl_info->limits.buffers; ++i)
{
if (device->render_targets[i])
- context_apply_attachment_filter_states(device->render_targets[i], FALSE);
+ context_apply_attachment_filter_states(device->render_targets[i]);
}
if (device->stencilBufferTarget)
- context_apply_attachment_filter_states(device->stencilBufferTarget, FALSE);
+ context_apply_attachment_filter_states(device->stencilBufferTarget);
}
for (i = 0; i < gl_info->limits.buffers; ++i)
@@ -532,32 +532,38 @@ void context_alloc_event_query(struct wined3d_context *context, struct wined3d_e
if (context->free_event_query_count)
{
- query->id = context->free_event_queries[--context->free_event_query_count];
+ query->object = context->free_event_queries[--context->free_event_query_count];
}
else
{
- if (gl_info->supported[APPLE_FENCE])
+ if (gl_info->supported[ARB_SYNC])
+ {
+ /* Using ARB_sync, not much to do here. */
+ query->object.sync = NULL;
+ TRACE("Allocated event query %p in context %p.\n", query->object.sync, context);
+ }
+ else if (gl_info->supported[APPLE_FENCE])
{
ENTER_GL();
- GL_EXTCALL(glGenFencesAPPLE(1, &query->id));
+ GL_EXTCALL(glGenFencesAPPLE(1, &query->object.id));
checkGLcall("glGenFencesAPPLE");
LEAVE_GL();
- TRACE("Allocated event query %u in context %p.\n", query->id, context);
+ TRACE("Allocated event query %u in context %p.\n", query->object.id, context);
}
else if(gl_info->supported[NV_FENCE])
{
ENTER_GL();
- GL_EXTCALL(glGenFencesNV(1, &query->id));
+ GL_EXTCALL(glGenFencesNV(1, &query->object.id));
checkGLcall("glGenFencesNV");
LEAVE_GL();
- TRACE("Allocated event query %u in context %p.\n", query->id, context);
+ TRACE("Allocated event query %u in context %p.\n", query->object.id, context);
}
else
{
WARN("Event queries not supported, not allocating query id.\n");
- query->id = 0;
+ query->object.id = 0;
}
}
@@ -575,12 +581,12 @@ void context_free_event_query(struct wined3d_event_query *query)
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,
+ union wined3d_gl_query_object *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);
+ ERR("Failed to grow free list, leaking query %u in context %p.\n", query->object.id, context);
return;
}
@@ -588,7 +594,7 @@ void context_free_event_query(struct wined3d_event_query *query)
context->free_event_queries = new_data;
}
- context->free_event_queries[context->free_event_query_count++] = query->id;
+ context->free_event_queries[context->free_event_query_count++] = query->object;
}
void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource, WINED3DRESOURCETYPE type)
@@ -661,6 +667,7 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
struct fbo_entry *entry, *entry2;
HGLRC restore_ctx;
HDC restore_dc;
+ unsigned int i;
restore_ctx = pwglGetCurrentContext();
restore_dc = pwglGetCurrentDC();
@@ -682,8 +689,12 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
{
if (context->valid)
{
- if (gl_info->supported[APPLE_FENCE]) GL_EXTCALL(glDeleteFencesAPPLE(1, &event_query->id));
- else if (gl_info->supported[NV_FENCE]) GL_EXTCALL(glDeleteFencesNV(1, &event_query->id));
+ if (gl_info->supported[ARB_SYNC])
+ {
+ if (event_query->object.sync) GL_EXTCALL(glDeleteSync(event_query->object.sync));
+ }
+ else if (gl_info->supported[APPLE_FENCE]) GL_EXTCALL(glDeleteFencesAPPLE(1, &event_query->object.id));
+ else if (gl_info->supported[NV_FENCE]) GL_EXTCALL(glDeleteFencesNV(1, &event_query->object.id));
}
event_query->context = NULL;
}
@@ -720,10 +731,24 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
if (gl_info->supported[ARB_OCCLUSION_QUERY])
GL_EXTCALL(glDeleteQueriesARB(context->free_occlusion_query_count, context->free_occlusion_queries));
- if (gl_info->supported[APPLE_FENCE])
- GL_EXTCALL(glDeleteFencesAPPLE(context->free_event_query_count, context->free_event_queries));
+ if (gl_info->supported[ARB_SYNC])
+ {
+ if (event_query->object.sync) GL_EXTCALL(glDeleteSync(event_query->object.sync));
+ }
+ else if (gl_info->supported[APPLE_FENCE])
+ {
+ for (i = 0; i < context->free_event_query_count; ++i)
+ {
+ GL_EXTCALL(glDeleteFencesAPPLE(1, &context->free_event_queries[i].id));
+ }
+ }
else if (gl_info->supported[NV_FENCE])
- GL_EXTCALL(glDeleteFencesNV(context->free_event_query_count, context->free_event_queries));
+ {
+ for (i = 0; i < context->free_event_query_count; ++i)
+ {
+ GL_EXTCALL(glDeleteFencesNV(1, &context->free_event_queries[i].id));
+ }
+ }
checkGLcall("context cleanup");
}
@@ -2131,6 +2156,8 @@ static void context_apply_state(struct wined3d_context *context, IWineD3DDeviceI
if (context->render_offscreen)
{
FIXME("Activating for CTXUSAGE_BLIT for an offscreen target with ORM_FBO. This should be avoided.\n");
+ surface_internal_preload(context->current_rt, SRGB_RGB);
+
ENTER_GL();
context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo);
context_attach_surface_fbo(context, GL_FRAMEBUFFER, 0, context->current_rt);
@@ -2189,6 +2216,9 @@ static void context_apply_state(struct wined3d_context *context, IWineD3DDeviceI
}
IWineD3DDeviceImpl_FindTexUnitMap(device);
+ device_preload_textures(device);
+ if (isStateDirty(context, STATE_VDECL))
+ device_update_stream_info(device, context->gl_info);
ENTER_GL();
for (i = 0; i < context->numDirtyEntries; ++i)
diff --git a/dll/directx/wine/wined3d/device.c b/dll/directx/wine/wined3d/device.c
index 34495d396d9..6682aa4635e 100644
--- a/dll/directx/wine/wined3d/device.c
+++ b/dll/directx/wine/wined3d/device.c
@@ -179,8 +179,6 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
{
/* We need to deal with frequency data! */
IWineD3DVertexDeclarationImpl *declaration = (IWineD3DVertexDeclarationImpl *)This->stateBlock->vertexDecl;
- UINT stream_count = This->stateBlock->streamIsUP ? 0 : declaration->num_streams;
- const DWORD *streams = declaration->streams;
unsigned int i;
stream_info->use_map = 0;
@@ -298,7 +296,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
stream_info->elements[idx].stream_idx = element->input_slot;
stream_info->elements[idx].buffer_object = buffer_object;
- if (!This->adapter->gl_info.supported[EXT_VERTEX_ARRAY_BGRA]
+ if (!This->adapter->gl_info.supported[ARB_VERTEX_ARRAY_BGRA]
&& element->format_desc->format == WINED3DFMT_B8G8R8A8_UNORM)
{
stream_info->swizzle_map |= 1 << idx;
@@ -307,17 +305,29 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
}
}
- /* Now call PreLoad on all the vertex buffers. In the very rare case
- * that the buffers stopps converting PreLoad will dirtify the VDECL again.
- * The vertex buffer can now use the strided structure in the device instead of finding its
- * own again.
- *
- * NULL streams won't be recorded in the array, UP streams won't be either. A stream is only
- * once in there. */
- for (i = 0; i < stream_count; ++i)
+ if (!This->stateBlock->streamIsUP)
{
- IWineD3DBuffer *vb = This->stateBlock->streamSource[streams[i]];
- if (vb) IWineD3DBuffer_PreLoad(vb);
+ WORD map = stream_info->use_map;
+
+ /* PreLoad all the vertex buffers. */
+ for (i = 0; map; map >>= 1, ++i)
+ {
+ struct wined3d_stream_info_element *element;
+ struct wined3d_buffer *buffer;
+
+ if (!(map & 1)) continue;
+
+ element = &stream_info->elements[i];
+ buffer = (struct wined3d_buffer *)This->stateBlock->streamSource[element->stream_idx];
+ IWineD3DBuffer_PreLoad((IWineD3DBuffer *)buffer);
+
+ /* If PreLoad dropped the buffer object, update the stream info. */
+ if (buffer->buffer_object != element->buffer_object)
+ {
+ element->buffer_object = 0;
+ element->data = buffer_get_sysmem(buffer) + (ptrdiff_t)element->data;
+ }
+ }
}
}
@@ -332,7 +342,7 @@ static void stream_info_element_from_strided(const struct wined3d_gl_info *gl_in
e->buffer_object = 0;
}
-void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info,
+static void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info,
const struct WineDirect3DVertexStridedData *strided, struct wined3d_stream_info *stream_info)
{
unsigned int i;
@@ -361,7 +371,7 @@ void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info,
{
if (!stream_info->elements[i].format_desc) continue;
- if (!gl_info->supported[EXT_VERTEX_ARRAY_BGRA]
+ if (!gl_info->supported[ARB_VERTEX_ARRAY_BGRA]
&& stream_info->elements[i].format_desc->format == WINED3DFMT_B8G8R8A8_UNORM)
{
stream_info->swizzle_map |= 1 << i;
@@ -370,6 +380,120 @@ void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info,
}
}
+static void device_trace_strided_stream_info(const struct wined3d_stream_info *stream_info)
+{
+ TRACE("Strided Data:\n");
+ TRACE_STRIDED(stream_info, WINED3D_FFP_POSITION);
+ TRACE_STRIDED(stream_info, WINED3D_FFP_BLENDWEIGHT);
+ TRACE_STRIDED(stream_info, WINED3D_FFP_BLENDINDICES);
+ TRACE_STRIDED(stream_info, WINED3D_FFP_NORMAL);
+ TRACE_STRIDED(stream_info, WINED3D_FFP_PSIZE);
+ TRACE_STRIDED(stream_info, WINED3D_FFP_DIFFUSE);
+ TRACE_STRIDED(stream_info, WINED3D_FFP_SPECULAR);
+ TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD0);
+ TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD1);
+ TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD2);
+ TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD3);
+ TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD4);
+ TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD5);
+ TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD6);
+ TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD7);
+}
+
+/* Context activation is done by the caller. */
+void device_update_stream_info(IWineD3DDeviceImpl *device, const struct wined3d_gl_info *gl_info)
+{
+ struct wined3d_stream_info *stream_info = &device->strided_streams;
+ IWineD3DStateBlockImpl *stateblock = device->stateBlock;
+ BOOL vs = stateblock->vertexShader && device->vs_selected_mode != SHADER_NONE;
+ BOOL fixup = FALSE;
+
+ if (device->up_strided)
+ {
+ /* Note: this is a ddraw fixed-function code path. */
+ TRACE("=============================== Strided Input ================================\n");
+ device_stream_info_from_strided(gl_info, device->up_strided, stream_info);
+ if (TRACE_ON(d3d)) device_trace_strided_stream_info(stream_info);
+ }
+ else
+ {
+ TRACE("============================= Vertex Declaration =============================\n");
+ device_stream_info_from_declaration(device, vs, stream_info, &fixup);
+ }
+
+ if (vs && !stream_info->position_transformed)
+ {
+ if (((IWineD3DVertexDeclarationImpl *)stateblock->vertexDecl)->half_float_conv_needed && !fixup)
+ {
+ TRACE("Using drawStridedSlow with vertex shaders for FLOAT16 conversion.\n");
+ device->useDrawStridedSlow = TRUE;
+ }
+ else
+ {
+ device->useDrawStridedSlow = FALSE;
+ }
+ }
+ else
+ {
+ WORD slow_mask = (1 << WINED3D_FFP_PSIZE);
+ slow_mask |= -!gl_info->supported[ARB_VERTEX_ARRAY_BGRA]
+ & ((1 << WINED3D_FFP_DIFFUSE) | (1 << WINED3D_FFP_SPECULAR));
+
+ if ((stream_info->position_transformed || (stream_info->use_map & slow_mask)) && !fixup)
+ {
+ device->useDrawStridedSlow = TRUE;
+ }
+ else
+ {
+ device->useDrawStridedSlow = FALSE;
+ }
+ }
+}
+
+static void device_preload_texture(IWineD3DStateBlockImpl *stateblock, unsigned int idx)
+{
+ IWineD3DBaseTextureImpl *texture;
+ enum WINED3DSRGB srgb;
+
+ if (!(texture = (IWineD3DBaseTextureImpl *)stateblock->textures[idx])) return;
+ srgb = stateblock->samplerState[idx][WINED3DSAMP_SRGBTEXTURE] ? SRGB_SRGB : SRGB_RGB;
+ texture->baseTexture.internal_preload((IWineD3DBaseTexture *)texture, srgb);
+}
+
+void device_preload_textures(IWineD3DDeviceImpl *device)
+{
+ IWineD3DStateBlockImpl *stateblock = device->stateBlock;
+ unsigned int i;
+
+ if (use_vs(stateblock))
+ {
+ for (i = 0; i < MAX_VERTEX_SAMPLERS; ++i)
+ {
+ if (((IWineD3DBaseShaderImpl *)stateblock->vertexShader)->baseShader.reg_maps.sampler_type[i])
+ device_preload_texture(stateblock, MAX_FRAGMENT_SAMPLERS + i);
+ }
+ }
+
+ if (use_ps(stateblock))
+ {
+ for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i)
+ {
+ if (((IWineD3DBaseShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.sampler_type[i])
+ device_preload_texture(stateblock, i);
+ }
+ }
+ else
+ {
+ WORD ffu_map = device->fixed_function_usage_map;
+
+ for (i = 0; ffu_map; ffu_map >>= 1, ++i)
+ {
+ if (ffu_map & 1)
+ device_preload_texture(stateblock, i);
+ }
+ }
+}
+
/**********************************************************
* IUnknown parts follows
**********************************************************/
@@ -596,7 +720,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, UI
IWineD3DSurfaceImpl *object;
HRESULT hr;
- TRACE("(%p) Create surface\n",This);
+ TRACE("iface %p, width %u, height %u, format %s (%#x), lockable %#x, discard %#x, level %u\n",
+ iface, Width, Height, debug_d3dformat(Format), Format, Lockable, Discard, Level);
+ TRACE("surface %p, usage %s (%#x), pool %s (%#x), multisample_type %#x, multisample_quality %u\n",
+ ppSurface, debug_d3dusage(Usage), Usage, debug_d3dpool(Pool), Pool, MultiSample, MultisampleQuality);
+ TRACE("surface_type %#x, parent %p, parent_ops %p.\n", Impl, parent, parent_ops);
if (Impl == SURFACE_OPENGL && !This->adapter)
{
@@ -784,104 +912,33 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface
return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface, WINED3DQUERYTYPE Type, IWineD3DQuery **ppQuery, IUnknown* parent) {
+static HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface,
+ WINED3DQUERYTYPE type, IWineD3DQuery **query, IUnknown *parent)
+{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
- IWineD3DQueryImpl *object; /*NOTE: impl ref allowed since this is a create function */
- HRESULT hr = WINED3DERR_NOTAVAILABLE;
- const IWineD3DQueryVtbl *vtable;
+ IWineD3DQueryImpl *object;
+ HRESULT hr;
- /* Just a check to see if we support this type of query */
- switch(Type) {
- case WINED3DQUERYTYPE_OCCLUSION:
- TRACE("(%p) occlusion query\n", This);
- if (gl_info->supported[ARB_OCCLUSION_QUERY])
- hr = WINED3D_OK;
- else
- WARN("Unsupported in local OpenGL implementation: ARB_OCCLUSION_QUERY/NV_OCCLUSION_QUERY\n");
+ TRACE("iface %p, type %#x, query %p, parent %p.\n", iface, type, query, parent);
- vtable = &IWineD3DOcclusionQuery_Vtbl;
- break;
-
- case WINED3DQUERYTYPE_EVENT:
- if (!gl_info->supported[NV_FENCE] && !gl_info->supported[APPLE_FENCE])
- {
- /* Half-Life 2 needs this query. It does not render the main menu correctly otherwise
- * Pretend to support it, faking this query does not do much harm except potentially lowering performance
- */
- FIXME("(%p) Event query: Unimplemented, but pretending to be supported\n", This);
- }
- vtable = &IWineD3DEventQuery_Vtbl;
- hr = WINED3D_OK;
- break;
-
- case WINED3DQUERYTYPE_VCACHE:
- case WINED3DQUERYTYPE_RESOURCEMANAGER:
- case WINED3DQUERYTYPE_VERTEXSTATS:
- case WINED3DQUERYTYPE_TIMESTAMP:
- case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
- case WINED3DQUERYTYPE_TIMESTAMPFREQ:
- case WINED3DQUERYTYPE_PIPELINETIMINGS:
- case WINED3DQUERYTYPE_INTERFACETIMINGS:
- case WINED3DQUERYTYPE_VERTEXTIMINGS:
- case WINED3DQUERYTYPE_PIXELTIMINGS:
- case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
- case WINED3DQUERYTYPE_CACHEUTILIZATION:
- default:
- /* Use the base Query vtable until we have a special one for each query */
- vtable = &IWineD3DQuery_Vtbl;
- FIXME("(%p) Unhandled query type %d\n", This, Type);
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+ if (!object)
+ {
+ ERR("Failed to allocate query memory.\n");
+ return E_OUTOFMEMORY;
}
- if(NULL == ppQuery || hr != WINED3D_OK) {
+
+ hr = query_init(object, This, type, parent);
+ if (FAILED(hr))
+ {
+ WARN("Failed to initialize query, hr %#x.\n", hr);
+ HeapFree(GetProcessHeap(), 0, object);
return hr;
}
- object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
- if(!object)
- {
- ERR("Out of memory\n");
- *ppQuery = NULL;
- return WINED3DERR_OUTOFVIDEOMEMORY;
- }
+ TRACE("Created query %p.\n", object);
+ *query = (IWineD3DQuery *)object;
- object->lpVtbl = vtable;
- object->type = Type;
- object->state = QUERY_CREATED;
- object->device = This;
- object->parent = parent;
- object->ref = 1;
-
- *ppQuery = (IWineD3DQuery *)object;
-
- /* allocated the 'extended' data based on the type of query requested */
- switch(Type){
- case WINED3DQUERYTYPE_OCCLUSION:
- object->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_occlusion_query));
- ((struct wined3d_occlusion_query *)object->extendedData)->context = NULL;
- break;
-
- case WINED3DQUERYTYPE_EVENT:
- object->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_event_query));
- ((struct wined3d_event_query *)object->extendedData)->context = NULL;
- break;
-
- case WINED3DQUERYTYPE_VCACHE:
- case WINED3DQUERYTYPE_RESOURCEMANAGER:
- case WINED3DQUERYTYPE_VERTEXSTATS:
- case WINED3DQUERYTYPE_TIMESTAMP:
- case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
- case WINED3DQUERYTYPE_TIMESTAMPFREQ:
- case WINED3DQUERYTYPE_PIPELINETIMINGS:
- case WINED3DQUERYTYPE_INTERFACETIMINGS:
- case WINED3DQUERYTYPE_VERTEXTIMINGS:
- case WINED3DQUERYTYPE_PIXELTIMINGS:
- case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
- case WINED3DQUERYTYPE_CACHEUTILIZATION:
- default:
- object->extendedData = 0;
- FIXME("(%p) Unhandled query type %d\n",This , Type);
- }
- TRACE("(%p) : Created Query %p\n", This, object);
return WINED3D_OK;
}
@@ -1663,14 +1720,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface,
}
}
- /* Delete the palette conversion shader if it is around */
- if(This->paletteConversionShader) {
- ENTER_GL();
- GL_EXTCALL(glDeleteProgramsARB(1, &This->paletteConversionShader));
- LEAVE_GL();
- This->paletteConversionShader = 0;
- }
-
/* Delete the pbuffer context if there is any */
if(This->pbufferContext) context_destroy(This, This->pbufferContext);
@@ -3054,15 +3103,17 @@ static void device_update_fixed_function_usage_map(IWineD3DDeviceImpl *This) {
}
}
-static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This) {
+static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This, const struct wined3d_gl_info *gl_info)
+{
unsigned int i, tex;
WORD ffu_map;
device_update_fixed_function_usage_map(This);
ffu_map = This->fixed_function_usage_map;
- if (This->max_ffp_textures == This->max_ffp_texture_stages ||
- This->stateBlock->lowest_disabled_stage <= This->max_ffp_textures) {
+ if (This->max_ffp_textures == gl_info->limits.texture_stages
+ || This->stateBlock->lowest_disabled_stage <= This->max_ffp_textures)
+ {
for (i = 0; ffu_map; ffu_map >>= 1, ++i)
{
if (!(ffu_map & 1)) continue;
@@ -3092,7 +3143,8 @@ static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This) {
}
}
-static void device_map_psamplers(IWineD3DDeviceImpl *This) {
+static void device_map_psamplers(IWineD3DDeviceImpl *This, const struct wined3d_gl_info *gl_info)
+{
const WINED3DSAMPLER_TEXTURE_TYPE *sampler_type =
((IWineD3DPixelShaderImpl *)This->stateBlock->pixelShader)->baseShader.reg_maps.sampler_type;
unsigned int i;
@@ -3102,7 +3154,8 @@ static void device_map_psamplers(IWineD3DDeviceImpl *This) {
{
device_map_stage(This, i, i);
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SAMPLER(i));
- if (i < MAX_TEXTURES) {
+ if (i < gl_info->limits.texture_stages)
+ {
markTextureStagesDirty(This, i);
}
}
@@ -3133,11 +3186,12 @@ static BOOL device_unit_free_for_vs(IWineD3DDeviceImpl *This, const DWORD *pshad
return !vshader_sampler_tokens[current_mapping - MAX_FRAGMENT_SAMPLERS];
}
-static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps) {
+static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps, const struct wined3d_gl_info *gl_info)
+{
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 = min(MAX_COMBINED_SAMPLERS, This->adapter->gl_info.limits.combined_samplers) - 1;
+ int start = min(MAX_COMBINED_SAMPLERS, gl_info->limits.combined_samplers) - 1;
int i;
if (ps) {
@@ -3174,7 +3228,9 @@ static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps) {
}
}
-void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) {
+void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This)
+{
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
BOOL vs = use_vs(This->stateBlock);
BOOL ps = use_ps(This->stateBlock);
/*
@@ -3184,15 +3240,10 @@ void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) {
* -> When the mapping of a stage is changed, sampler and ALL texture stage states have
* to be reset. Because of that try to work with a 1:1 mapping as much as possible
*/
- if (ps) {
- device_map_psamplers(This);
- } else {
- device_map_fixed_function_samplers(This);
- }
+ if (ps) device_map_psamplers(This, gl_info);
+ else device_map_fixed_function_samplers(This, gl_info);
- if (vs) {
- device_map_vsamplers(This, ps);
- }
+ if (vs) device_map_vsamplers(This, ps, gl_info);
}
static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShader(IWineD3DDevice *iface, IWineD3DPixelShader *pShader) {
@@ -3806,11 +3857,14 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface,
static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *iface, DWORD Stage, WINED3DTEXTURESTAGESTATETYPE Type, DWORD Value) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
DWORD oldValue = This->updateStateBlock->textureState[Stage][Type];
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
TRACE("(%p) : Stage=%d, Type=%s(%d), Value=%d\n", This, Stage, debug_d3dtexturestate(Type), Type, Value);
- if (Stage >= MAX_TEXTURES) {
- WARN("Attempting to set stage %u which is higher than the max stage %u, ignoring\n", Stage, MAX_TEXTURES - 1);
+ if (Stage >= gl_info->limits.texture_stages)
+ {
+ WARN("Attempting to set stage %u which is higher than the max stage %u, ignoring.\n",
+ Stage, gl_info->limits.texture_stages - 1);
return WINED3D_OK;
}
@@ -3891,6 +3945,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface,
DWORD stage, IWineD3DBaseTexture *texture)
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
IWineD3DBaseTexture *prev;
TRACE("iface %p, stage %u, texture %p.\n", iface, stage, texture);
@@ -3949,7 +4004,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface,
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_PIXELSHADER);
}
- if (!prev && stage < MAX_TEXTURES)
+ if (!prev && stage < gl_info->limits.texture_stages)
{
/* The source arguments for color and alpha ops have different
* meanings when a NULL texture is bound, so the COLOROP and
@@ -3968,7 +4023,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface,
IWineD3DBaseTexture_Release(prev);
- if (!texture && stage < MAX_TEXTURES)
+ if (!texture && stage < gl_info->limits.texture_stages)
{
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_TEXTURESTAGE(stage, WINED3DTSS_COLOROP));
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_TEXTURESTAGE(stage, WINED3DTSS_ALPHAOP));
@@ -4206,7 +4261,6 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
const WINED3DVIEWPORT *vp = &This->stateBlock->viewport;
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
@@ -4376,12 +4430,7 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
LEAVE_GL();
- if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)target, &IID_IWineD3DSwapChain, (void **)&swapchain))) {
- if (target == (IWineD3DSurfaceImpl*) swapchain->frontBuffer) {
- wglFlush();
- }
- IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
- }
+ wglFlush(); /* Flush to ensure ordering across contexts. */
context_release(context);
@@ -5340,6 +5389,9 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface,
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
struct wined3d_context *context;
+ if (rect) IWineD3DSurface_LoadLocation(surface, SFLAG_INDRAWABLE, NULL);
+ IWineD3DSurface_ModifyLocation(surface, SFLAG_INDRAWABLE, TRUE);
+
if (!surface_is_offscreen(surface))
{
TRACE("Surface %p is onscreen\n", surface);
@@ -5386,6 +5438,9 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface,
checkGLcall("glClear");
LEAVE_GL();
+
+ wglFlush(); /* Flush to ensure ordering across contexts. */
+
context_release(context);
}
@@ -5685,6 +5740,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetFrontBackBuffers(IWineD3DDevice *ifa
if(Swapchain->backBuffer[0]) {
IWineD3DSurface_SetContainer(Swapchain->backBuffer[0], (IWineD3DBase *) Swapchain);
((IWineD3DSurfaceImpl *)Swapchain->backBuffer[0])->Flags |= SFLAG_SWAPCHAIN;
+ Swapchain->presentParms.BackBufferWidth = BackImpl->currentDesc.Width;
+ Swapchain->presentParms.BackBufferHeight = BackImpl->currentDesc.Height;
+ Swapchain->presentParms.BackBufferFormat = BackImpl->resource.format_desc->format;
} else {
HeapFree(GetProcessHeap(), 0, Swapchain->backBuffer);
Swapchain->backBuffer = NULL;
@@ -5738,6 +5796,12 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
break;
}
+ /* Make sure the drawables are up-to-date. Note that loading the
+ * destination surface isn't strictly required if we overwrite the
+ * entire surface. */
+ IWineD3DSurface_LoadLocation(src_surface, SFLAG_INDRAWABLE, NULL);
+ IWineD3DSurface_LoadLocation(dst_surface, SFLAG_INDRAWABLE, NULL);
+
/* Attach src surface to src fbo */
src_swapchain = get_swapchain(src_surface);
dst_swapchain = get_swapchain(dst_surface);
@@ -5753,9 +5817,6 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
GLenum buffer = surface_get_gl_buffer(src_surface);
TRACE("Source surface %p is onscreen\n", src_surface);
- /* 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);
if(buffer == GL_FRONT) {
RECT windowsize;
@@ -5792,9 +5853,6 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
GLenum buffer = surface_get_gl_buffer(dst_surface);
TRACE("Destination surface %p is onscreen\n", dst_surface);
- /* 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);
if(buffer == GL_FRONT) {
RECT windowsize;
@@ -5839,6 +5897,9 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
}
LEAVE_GL();
+
+ wglFlush(); /* Flush to ensure ordering across contexts. */
+
context_release(context);
IWineD3DSurface_ModifyLocation(dst_surface, SFLAG_INDRAWABLE, TRUE);
@@ -6982,20 +7043,19 @@ HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
for (i = 0; i < PATCHMAP_SIZE; ++i) list_init(&device->patches[i]);
select_shader_mode(&adapter->gl_info, &device->ps_selected_mode, &device->vs_selected_mode);
- device->shader_backend = select_shader_backend(adapter, device_type);
+ device->shader_backend = adapter->shader_backend;
memset(&shader_caps, 0, sizeof(shader_caps));
- device->shader_backend->shader_get_caps(device_type, &adapter->gl_info, &shader_caps);
+ device->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
device->d3d_vshader_constantF = shader_caps.MaxVertexShaderConst;
device->d3d_pshader_constantF = shader_caps.MaxPixelShaderConst;
device->vs_clipping = shader_caps.VSClipping;
memset(&ffp_caps, 0, sizeof(ffp_caps));
- fragment_pipeline = select_fragment_implementation(adapter, device_type);
+ fragment_pipeline = adapter->fragment_pipe;
device->frag_pipe = fragment_pipeline;
- fragment_pipeline->get_caps(device_type, &adapter->gl_info, &ffp_caps);
+ fragment_pipeline->get_caps(&adapter->gl_info, &ffp_caps);
device->max_ffp_textures = ffp_caps.MaxSimultaneousTextures;
- device->max_ffp_texture_stages = ffp_caps.MaxTextureBlendStages;
hr = compile_state_table(device->StateTable, device->multistate_funcs, &adapter->gl_info,
ffp_vertexstate_template, fragment_pipeline, misc_state_template);
@@ -7006,7 +7066,7 @@ HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
return hr;
}
- device->blitter = select_blit_implementation(adapter, device_type);
+ device->blitter = adapter->blitter;
return WINED3D_OK;
}
diff --git a/dll/directx/wine/wined3d/directx.c b/dll/directx/wine/wined3d/directx.c
index 855f97ffdda..812e5ccc9e8 100644
--- a/dll/directx/wine/wined3d/directx.c
+++ b/dll/directx/wine/wined3d/directx.c
@@ -30,6 +30,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d);
WINE_DECLARE_DEBUG_CHANNEL(d3d_caps);
#define GLINFO_LOCATION (*gl_info)
+#define WINE_DEFAULT_VIDMEM (64 * 1024 * 1024)
+#define MAKEDWORD_VERSION(maj, min) ((maj & 0xffff) << 16) | (min & 0xffff)
/* The d3d device ID */
static const GUID IID_D3DDEVICE_D3DUID = { 0xaeb2cdd4, 0x6e41, 0x43ea, { 0x94,0x1c,0x83,0x61,0xcc,0x76,0x07,0x81 } };
@@ -43,17 +45,10 @@ static const struct {
/* APPLE */
{"GL_APPLE_client_storage", APPLE_CLIENT_STORAGE, 0 },
{"GL_APPLE_fence", APPLE_FENCE, 0 },
- {"GL_APPLE_flush_render", APPLE_FLUSH_RENDER, 0 },
- {"GL_APPLE_ycbcr_422", APPLE_YCBCR_422, 0 },
{"GL_APPLE_float_pixels", APPLE_FLOAT_PIXELS, 0 },
{"GL_APPLE_flush_buffer_range", APPLE_FLUSH_BUFFER_RANGE, 0 },
-
- /* ATI */
- {"GL_ATI_separate_stencil", ATI_SEPARATE_STENCIL, 0 },
- {"GL_ATI_texture_env_combine3", ATI_TEXTURE_ENV_COMBINE3, 0 },
- {"GL_ATI_texture_mirror_once", ATI_TEXTURE_MIRROR_ONCE, 0 },
- {"GL_ATI_fragment_shader", ATI_FRAGMENT_SHADER, 0 },
- {"GL_ATI_texture_compression_3dc", ATI_TEXTURE_COMPRESSION_3DC, 0 },
+ {"GL_APPLE_flush_render", APPLE_FLUSH_RENDER, 0 },
+ {"GL_APPLE_ycbcr_422", APPLE_YCBCR_422, 0 },
/* ARB */
{"GL_ARB_color_buffer_float", ARB_COLOR_BUFFER_FLOAT, 0 },
@@ -66,7 +61,9 @@ static const struct {
{"GL_ARB_framebuffer_object", ARB_FRAMEBUFFER_OBJECT, 0 },
{"GL_ARB_geometry_shader4", ARB_GEOMETRY_SHADER4, 0 },
{"GL_ARB_half_float_pixel", ARB_HALF_FLOAT_PIXEL, 0 },
+ {"GL_ARB_half_float_vertex", ARB_HALF_FLOAT_VERTEX, 0 },
{"GL_ARB_imaging", ARB_IMAGING, 0 },
+ {"GL_ARB_map_buffer_range", ARB_MAP_BUFFER_RANGE, 0 },
{"GL_ARB_multisample", ARB_MULTISAMPLE, 0 }, /* needs GLX_ARB_MULTISAMPLE as well */
{"GL_ARB_multitexture", ARB_MULTITEXTURE, 0 },
{"GL_ARB_occlusion_query", ARB_OCCLUSION_QUERY, 0 },
@@ -74,6 +71,10 @@ static const struct {
{"GL_ARB_point_parameters", ARB_POINT_PARAMETERS, 0 },
{"GL_ARB_point_sprite", ARB_POINT_SPRITE, 0 },
{"GL_ARB_provoking_vertex", ARB_PROVOKING_VERTEX, 0 },
+ {"GL_ARB_shader_objects", ARB_SHADER_OBJECTS, 0 },
+ {"GL_ARB_shader_texture_lod", ARB_SHADER_TEXTURE_LOD, 0 },
+ {"GL_ARB_shading_language_100", ARB_SHADING_LANGUAGE_100, 0 },
+ {"GL_ARB_sync", ARB_SYNC, 0 },
{"GL_ARB_texture_border_clamp", ARB_TEXTURE_BORDER_CLAMP, 0 },
{"GL_ARB_texture_compression", ARB_TEXTURE_COMPRESSION, 0 },
{"GL_ARB_texture_cube_map", ARB_TEXTURE_CUBE_MAP, 0 },
@@ -85,23 +86,30 @@ static const struct {
{"GL_ARB_texture_non_power_of_two", ARB_TEXTURE_NON_POWER_OF_TWO, MAKEDWORD_VERSION(2, 0) },
{"GL_ARB_texture_rectangle", ARB_TEXTURE_RECTANGLE, 0 },
{"GL_ARB_texture_rg", ARB_TEXTURE_RG, 0 },
+ {"GL_ARB_vertex_array_bgra", ARB_VERTEX_ARRAY_BGRA, 0 },
{"GL_ARB_vertex_blend", ARB_VERTEX_BLEND, 0 },
{"GL_ARB_vertex_buffer_object", ARB_VERTEX_BUFFER_OBJECT, 0 },
{"GL_ARB_vertex_program", ARB_VERTEX_PROGRAM, 0 },
{"GL_ARB_vertex_shader", ARB_VERTEX_SHADER, 0 },
- {"GL_ARB_shader_objects", ARB_SHADER_OBJECTS, 0 },
- {"GL_ARB_shader_texture_lod", ARB_SHADER_TEXTURE_LOD, 0 },
- {"GL_ARB_half_float_vertex", ARB_HALF_FLOAT_VERTEX, 0 },
+
+ /* ATI */
+ {"GL_ATI_fragment_shader", ATI_FRAGMENT_SHADER, 0 },
+ {"GL_ATI_separate_stencil", ATI_SEPARATE_STENCIL, 0 },
+ {"GL_ATI_texture_compression_3dc", ATI_TEXTURE_COMPRESSION_3DC, 0 },
+ {"GL_ATI_texture_env_combine3", ATI_TEXTURE_ENV_COMBINE3, 0 },
+ {"GL_ATI_texture_mirror_once", ATI_TEXTURE_MIRROR_ONCE, 0 },
/* EXT */
{"GL_EXT_blend_color", EXT_BLEND_COLOR, 0 },
- {"GL_EXT_blend_minmax", EXT_BLEND_MINMAX, 0 },
{"GL_EXT_blend_equation_separate", EXT_BLEND_EQUATION_SEPARATE, 0 },
{"GL_EXT_blend_func_separate", EXT_BLEND_FUNC_SEPARATE, 0 },
+ {"GL_EXT_blend_minmax", EXT_BLEND_MINMAX, 0 },
{"GL_EXT_fog_coord", EXT_FOG_COORD, 0 },
{"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_gpu_program_parameters", EXT_GPU_PROGRAM_PARAMETERS, 0 },
+ {"GL_EXT_gpu_shader4", EXT_GPU_SHADER4, 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 },
@@ -110,42 +118,36 @@ static const struct {
{"GL_EXT_stencil_two_side", EXT_STENCIL_TWO_SIDE, 0 },
{"GL_EXT_stencil_wrap", EXT_STENCIL_WRAP, 0 },
{"GL_EXT_texture3D", EXT_TEXTURE3D, MAKEDWORD_VERSION(1, 2) },
- {"GL_EXT_texture_compression_s3tc", EXT_TEXTURE_COMPRESSION_S3TC, 0 },
{"GL_EXT_texture_compression_rgtc", EXT_TEXTURE_COMPRESSION_RGTC, 0 },
+ {"GL_EXT_texture_compression_s3tc", EXT_TEXTURE_COMPRESSION_S3TC, 0 },
{"GL_EXT_texture_env_add", EXT_TEXTURE_ENV_ADD, 0 },
{"GL_EXT_texture_env_combine", EXT_TEXTURE_ENV_COMBINE, 0 },
{"GL_EXT_texture_env_dot3", EXT_TEXTURE_ENV_DOT3, 0 },
- {"GL_EXT_texture_sRGB", EXT_TEXTURE_SRGB, 0 },
- {"GL_EXT_texture_swizzle", EXT_TEXTURE_SWIZZLE, 0 },
{"GL_EXT_texture_filter_anisotropic", EXT_TEXTURE_FILTER_ANISOTROPIC, 0 },
- {"GL_EXT_texture_lod", EXT_TEXTURE_LOD, 0 },
{"GL_EXT_texture_lod_bias", EXT_TEXTURE_LOD_BIAS, 0 },
+ {"GL_EXT_texture_sRGB", EXT_TEXTURE_SRGB, 0 },
{"GL_EXT_vertex_array_bgra", EXT_VERTEX_ARRAY_BGRA, 0 },
- {"GL_EXT_vertex_shader", EXT_VERTEX_SHADER, 0 },
- {"GL_EXT_gpu_program_parameters", EXT_GPU_PROGRAM_PARAMETERS, 0 },
/* NV */
- {"GL_NV_half_float", NV_HALF_FLOAT, 0 },
+ {"GL_NV_depth_clamp", NV_DEPTH_CLAMP, 0 },
{"GL_NV_fence", NV_FENCE, 0 },
{"GL_NV_fog_distance", NV_FOG_DISTANCE, 0 },
{"GL_NV_fragment_program", NV_FRAGMENT_PROGRAM, 0 },
{"GL_NV_fragment_program2", NV_FRAGMENT_PROGRAM2, 0 },
+ {"GL_NV_fragment_program_option", NV_FRAGMENT_PROGRAM_OPTION, 0 },
+ {"GL_NV_half_float", NV_HALF_FLOAT, 0 },
+ {"GL_NV_light_max_exponent", NV_LIGHT_MAX_EXPONENT, 0 },
{"GL_NV_register_combiners", NV_REGISTER_COMBINERS, 0 },
{"GL_NV_register_combiners2", NV_REGISTER_COMBINERS2, 0 },
{"GL_NV_texgen_reflection", NV_TEXGEN_REFLECTION, 0 },
{"GL_NV_texture_env_combine4", NV_TEXTURE_ENV_COMBINE4, 0 },
{"GL_NV_texture_shader", NV_TEXTURE_SHADER, 0 },
{"GL_NV_texture_shader2", NV_TEXTURE_SHADER2, 0 },
- {"GL_NV_texture_shader3", NV_TEXTURE_SHADER3, 0 },
- {"GL_NV_occlusion_query", NV_OCCLUSION_QUERY, 0 },
{"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 },
/* SGI */
{"GL_SGIS_generate_mipmap", SGIS_GENERATE_MIPMAP, 0 },
@@ -435,9 +437,9 @@ static DWORD ver_for_ext(GL_SupportedExt ext)
}
static BOOL match_ati_r300_to_500(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+ enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
{
- if (vendor != VENDOR_ATI) return FALSE;
+ if (card_vendor != HW_VENDOR_ATI) return FALSE;
if (device == CARD_ATI_RADEON_9500) return TRUE;
if (device == CARD_ATI_RADEON_X700) return TRUE;
if (device == CARD_ATI_RADEON_X1600) return TRUE;
@@ -445,9 +447,9 @@ static BOOL match_ati_r300_to_500(const struct wined3d_gl_info *gl_info, const c
}
static BOOL match_geforce5(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+ enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
{
- if (vendor == VENDOR_NVIDIA)
+ if (card_vendor == HW_VENDOR_NVIDIA)
{
if (device == CARD_NVIDIA_GEFORCEFX_5800 || device == CARD_NVIDIA_GEFORCEFX_5600)
{
@@ -458,7 +460,7 @@ static BOOL match_geforce5(const struct wined3d_gl_info *gl_info, const char *gl
}
static BOOL match_apple(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+ enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
{
/* 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
@@ -470,18 +472,15 @@ static BOOL match_apple(const struct wined3d_gl_info *gl_info, const char *gl_re
* 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])
+ * DirectDraw, not OpenGL.
+ *
+ * This test has been moved into wined3d_guess_gl_vendor()
+ */
+ if (gl_vendor == GL_VENDOR_APPLE)
{
return TRUE;
}
- else
- {
- return FALSE;
- }
+ return FALSE;
}
/* Context activation is done by the caller. */
@@ -554,31 +553,29 @@ static void test_pbo_functionality(struct wined3d_gl_info *gl_info)
}
static BOOL match_apple_intel(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+ enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
{
- return vendor == VENDOR_INTEL && match_apple(gl_info, gl_renderer, vendor, device);
+ return (card_vendor == HW_VENDOR_INTEL) && (gl_vendor == GL_VENDOR_APPLE);
}
static BOOL match_apple_nonr500ati(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+ enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
{
- if (!match_apple(gl_info, gl_renderer, vendor, device)) return FALSE;
- if (vendor != VENDOR_ATI) return FALSE;
+ if (gl_vendor != GL_VENDOR_APPLE) return FALSE;
+ if (card_vendor != HW_VENDOR_ATI) return FALSE;
if (device == CARD_ATI_RADEON_X1600) return FALSE;
return TRUE;
}
static BOOL match_fglrx(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+ enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
{
- if (vendor != VENDOR_ATI) return FALSE;
- if (match_apple(gl_info, gl_renderer, vendor, device)) return FALSE;
- if (strstr(gl_renderer, "DRI")) return FALSE; /* Filter out Mesa DRI drivers. */
- return TRUE;
+ return (gl_vendor == GL_VENDOR_ATI);
+
}
static BOOL match_dx10_capable(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+ enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
{
/* 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.
@@ -592,7 +589,7 @@ static BOOL match_dx10_capable(const struct wined3d_gl_info *gl_info, const char
/* 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,
- enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+ enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
{
GLenum error;
DWORD data[16];
@@ -619,15 +616,15 @@ static BOOL match_allows_spec_alpha(const struct wined3d_gl_info *gl_info, const
}
static BOOL match_apple_nvts(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+ enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
{
- if (!match_apple(gl_info, gl_renderer, vendor, device)) return FALSE;
+ if (!match_apple(gl_info, gl_renderer, gl_vendor, card_vendor, device)) return FALSE;
return gl_info->supported[NV_TEXTURE_SHADER];
}
/* A GL context is provided by the caller */
static BOOL match_broken_nv_clip(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+ enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
{
GLuint prog;
BOOL ret = FALSE;
@@ -793,7 +790,6 @@ static void quirk_apple_nvts(struct wined3d_gl_info *gl_info)
{
gl_info->supported[NV_TEXTURE_SHADER] = FALSE;
gl_info->supported[NV_TEXTURE_SHADER2] = FALSE;
- gl_info->supported[NV_TEXTURE_SHADER3] = FALSE;
}
static void quirk_disable_nvvp_clip(struct wined3d_gl_info *gl_info)
@@ -804,7 +800,7 @@ static void quirk_disable_nvvp_clip(struct wined3d_gl_info *gl_info)
struct driver_quirk
{
BOOL (*match)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- enum wined3d_pci_vendor vendor, enum wined3d_pci_device device);
+ enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device);
void (*apply)(struct wined3d_gl_info *gl_info);
const char *description;
};
@@ -923,51 +919,51 @@ static const struct driver_version_information driver_version_table[] =
* 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", 1, 8, 6 },
- {VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT2, "NVIDIA RIVA TNT2/TNT2 Pro", 1, 8, 6 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE, "NVIDIA GeForce 256", 1, 8, 6 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2_MX, "NVIDIA GeForce2 MX/MX 400", 6, 4, 3 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2, "NVIDIA GeForce2 GTS/GeForce2 Pro", 1, 8, 6 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE3, "NVIDIA GeForce3", 6, 10, 9371 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_MX, "NVIDIA GeForce4 MX 460", 6, 10, 9371 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_TI4200, "NVIDIA GeForce4 Ti 4200", 6, 10, 9371 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5200, "NVIDIA GeForce FX 5200", 15, 11, 7516 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5600, "NVIDIA GeForce FX 5600", 15, 11, 7516 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5800, "NVIDIA GeForce FX 5800", 15, 11, 7516 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6200, "NVIDIA GeForce 6200", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6600GT, "NVIDIA GeForce 6600 GT", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6800, "NVIDIA GeForce 6800", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7300, "NVIDIA GeForce Go 7300", 15, 11, 8585 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7400, "NVIDIA GeForce Go 7400", 15, 11, 8585 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7600, "NVIDIA GeForce 7600 GT", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7800GT, "NVIDIA GeForce 7800 GT", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8300GS, "NVIDIA GeForce 8300 GS", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600GT, "NVIDIA GeForce 8600 GT", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600MGT, "NVIDIA GeForce 8600M GT", 15, 11, 8585 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8800GTS, "NVIDIA GeForce 8800 GTS", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9200, "NVIDIA GeForce 9200", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9400GT, "NVIDIA GeForce 9400 GT", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9500GT, "NVIDIA GeForce 9500 GT", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9600GT, "NVIDIA GeForce 9600 GT", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9800GT, "NVIDIA GeForce 9800 GT", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX260, "NVIDIA GeForce GTX 260", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX275, "NVIDIA GeForce GTX 275", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX280, "NVIDIA GeForce GTX 280", 15, 11, 8618 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT240, "NVIDIA GeForce GT 240", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT, "NVIDIA RIVA TNT", 1, 8, 6 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT2, "NVIDIA RIVA TNT2/TNT2 Pro", 1, 8, 6 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE, "NVIDIA GeForce 256", 1, 8, 6 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2_MX, "NVIDIA GeForce2 MX/MX 400", 6, 4, 3 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2, "NVIDIA GeForce2 GTS/GeForce2 Pro", 1, 8, 6 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE3, "NVIDIA GeForce3", 6, 10, 9371 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_MX, "NVIDIA GeForce4 MX 460", 6, 10, 9371 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_TI4200, "NVIDIA GeForce4 Ti 4200", 6, 10, 9371 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5200, "NVIDIA GeForce FX 5200", 15, 11, 7516 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5600, "NVIDIA GeForce FX 5600", 15, 11, 7516 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5800, "NVIDIA GeForce FX 5800", 15, 11, 7516 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6200, "NVIDIA GeForce 6200", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6600GT, "NVIDIA GeForce 6600 GT", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6800, "NVIDIA GeForce 6800", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7300, "NVIDIA GeForce Go 7300", 15, 11, 8585 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7400, "NVIDIA GeForce Go 7400", 15, 11, 8585 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7600, "NVIDIA GeForce 7600 GT", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7800GT, "NVIDIA GeForce 7800 GT", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8300GS, "NVIDIA GeForce 8300 GS", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600GT, "NVIDIA GeForce 8600 GT", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600MGT, "NVIDIA GeForce 8600M GT", 15, 11, 8585 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8800GTS, "NVIDIA GeForce 8800 GTS", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9200, "NVIDIA GeForce 9200", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9400GT, "NVIDIA GeForce 9400 GT", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9500GT, "NVIDIA GeForce 9500 GT", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9600GT, "NVIDIA GeForce 9600 GT", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9800GT, "NVIDIA GeForce 9800 GT", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX260, "NVIDIA GeForce GTX 260", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX275, "NVIDIA GeForce GTX 275", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX280, "NVIDIA GeForce GTX 280", 15, 11, 8618 },
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT240, "NVIDIA GeForce GT 240", 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", 14, 10, 6764 },
- {VENDOR_ATI, CARD_ATI_RADEON_X700, "ATI Radeon X700 SE", 14, 10, 6764 },
- {VENDOR_ATI, CARD_ATI_RADEON_X1600, "ATI Radeon X1600 Series", 14, 10, 6764 },
- {VENDOR_ATI, CARD_ATI_RADEON_HD2300, "ATI Mobility Radeon HD 2300", 14, 10, 6764 },
- {VENDOR_ATI, CARD_ATI_RADEON_HD2600, "ATI Mobility Radeon HD 2600", 14, 10, 6764 },
- {VENDOR_ATI, CARD_ATI_RADEON_HD2900, "ATI Radeon HD 2900 XT", 14, 10, 6764 },
- {VENDOR_ATI, CARD_ATI_RADEON_HD4350, "ATI Radeon HD 4350", 14, 10, 6764 },
- {VENDOR_ATI, CARD_ATI_RADEON_HD4600, "ATI Radeon HD 4600 Series", 14, 10, 6764 },
- {VENDOR_ATI, CARD_ATI_RADEON_HD4700, "ATI Radeon HD 4700 Series", 14, 10, 6764 },
- {VENDOR_ATI, CARD_ATI_RADEON_HD4800, "ATI Radeon HD 4800 Series", 14, 10, 6764 },
- {VENDOR_ATI, CARD_ATI_RADEON_HD5700, "ATI Radeon HD 5700 Series", 14, 10, 8681 },
- {VENDOR_ATI, CARD_ATI_RADEON_HD5800, "ATI Radeon HD 5800 Series", 14, 10, 8681 },
+ {HW_VENDOR_ATI, CARD_ATI_RADEON_9500, "ATI Radeon 9500", 14, 10, 6764 },
+ {HW_VENDOR_ATI, CARD_ATI_RADEON_X700, "ATI Radeon X700 SE", 14, 10, 6764 },
+ {HW_VENDOR_ATI, CARD_ATI_RADEON_X1600, "ATI Radeon X1600 Series", 14, 10, 6764 },
+ {HW_VENDOR_ATI, CARD_ATI_RADEON_HD2300, "ATI Mobility Radeon HD 2300", 14, 10, 6764 },
+ {HW_VENDOR_ATI, CARD_ATI_RADEON_HD2600, "ATI Mobility Radeon HD 2600", 14, 10, 6764 },
+ {HW_VENDOR_ATI, CARD_ATI_RADEON_HD2900, "ATI Radeon HD 2900 XT", 14, 10, 6764 },
+ {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4350, "ATI Radeon HD 4350", 14, 10, 6764 },
+ {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4600, "ATI Radeon HD 4600 Series", 14, 10, 6764 },
+ {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4700, "ATI Radeon HD 4700 Series", 14, 10, 6764 },
+ {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4800, "ATI Radeon HD 4800 Series", 14, 10, 6764 },
+ {HW_VENDOR_ATI, CARD_ATI_RADEON_HD5700, "ATI Radeon HD 5700 Series", 14, 10, 8681 },
+ {HW_VENDOR_ATI, CARD_ATI_RADEON_HD5800, "ATI Radeon HD 5800 Series", 14, 10, 8681 },
/* TODO: Add information about legacy ATI hardware, Intel and other cards. */
};
@@ -995,14 +991,15 @@ static void init_driver_info(struct wined3d_driver_info *driver_info,
switch (vendor)
{
- case VENDOR_ATI:
+ case HW_VENDOR_ATI:
driver_info->name = "ati2dvag.dll";
break;
- case VENDOR_NVIDIA:
+ case HW_VENDOR_NVIDIA:
driver_info->name = "nv4_disp.dll";
break;
+ case HW_VENDOR_INTEL:
default:
FIXME_(d3d_caps)("Unhandled vendor %04x.\n", vendor);
driver_info->name = "Display";
@@ -1077,13 +1074,13 @@ static void init_driver_info(struct wined3d_driver_info *driver_info,
/* Context activation is done by the caller. */
static void fixup_extensions(struct wined3d_gl_info *gl_info, const char *gl_renderer,
- enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+ enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
{
unsigned int i;
for (i = 0; i < (sizeof(quirk_table) / sizeof(*quirk_table)); ++i)
{
- if (!quirk_table[i].match(gl_info, gl_renderer, vendor, device)) continue;
+ if (!quirk_table[i].match(gl_info, gl_renderer, gl_vendor, card_vendor, device)) continue;
TRACE_(d3d_caps)("Applying driver quirk \"%s\".\n", quirk_table[i].description);
quirk_table[i].apply(gl_info);
}
@@ -1110,34 +1107,760 @@ static DWORD wined3d_parse_gl_version(const char *gl_version)
return MAKEDWORD_VERSION(major, minor);
}
-static enum wined3d_pci_vendor wined3d_guess_vendor(const char *gl_vendor, const char *gl_renderer)
+static enum wined3d_gl_vendor wined3d_guess_gl_vendor(struct wined3d_gl_info *gl_info, const char *gl_vendor_string, const char *gl_renderer)
{
- if (strstr(gl_vendor, "NVIDIA"))
- return VENDOR_NVIDIA;
- if (strstr(gl_vendor, "ATI"))
- return VENDOR_ATI;
+ /* 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 GL_VENDOR_APPLE;
- if (strstr(gl_vendor, "Intel(R)")
+ if (strstr(gl_vendor_string, "NVIDIA"))
+ return GL_VENDOR_NVIDIA;
+
+ if (strstr(gl_vendor_string, "ATI"))
+ return GL_VENDOR_ATI;
+
+ if (strstr(gl_vendor_string, "Intel(R)")
|| strstr(gl_renderer, "Intel(R)")
- || strstr(gl_vendor, "Intel Inc."))
- return VENDOR_INTEL;
+ || strstr(gl_vendor_string, "Intel Inc."))
+ return GL_VENDOR_INTEL;
- if (strstr(gl_vendor, "Mesa")
- || strstr(gl_vendor, "DRI R300 Project")
- || strstr(gl_vendor, "Tungsten Graphics, Inc")
- || strstr(gl_vendor, "VMware, Inc."))
- return VENDOR_MESA;
+ if (strstr(gl_vendor_string, "Mesa")
+ || strstr(gl_vendor_string, "Advanced Micro Devices, Inc.")
+ || strstr(gl_vendor_string, "DRI R300 Project")
+ || strstr(gl_vendor_string, "X.Org R300 Project")
+ || strstr(gl_vendor_string, "Tungsten Graphics, Inc")
+ || strstr(gl_vendor_string, "VMware, Inc.")
+ || strstr(gl_renderer, "Mesa")
+ || strstr(gl_renderer, "Gallium"))
+ return GL_VENDOR_MESA;
- FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning VENDOR_WINE.\n", debugstr_a(gl_vendor));
+ FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning GL_VENDOR_WINE.\n", debugstr_a(gl_vendor_string));
- return VENDOR_WINE;
+ return GL_VENDOR_WINE;
}
-static enum wined3d_pci_device wined3d_guess_card(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- enum wined3d_pci_vendor *vendor, unsigned int *vidmem)
+static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_string, const char *gl_renderer)
{
- /* Below is a list of Nvidia and ATI GPUs. Both vendors have dozens of
+ if (strstr(gl_vendor_string, "NVIDIA"))
+ return HW_VENDOR_NVIDIA;
+
+ if (strstr(gl_vendor_string, "ATI")
+ || strstr(gl_vendor_string, "Advanced Micro Devices, Inc.")
+ || strstr(gl_vendor_string, "X.Org R300 Project")
+ || strstr(gl_vendor_string, "DRI R300 Project"))
+ return HW_VENDOR_ATI;
+
+ if (strstr(gl_vendor_string, "Intel(R)")
+ || strstr(gl_renderer, "Intel(R)")
+ || strstr(gl_vendor_string, "Intel Inc."))
+ return HW_VENDOR_INTEL;
+
+ if (strstr(gl_vendor_string, "Mesa")
+ || strstr(gl_vendor_string, "Tungsten Graphics, Inc")
+ || strstr(gl_vendor_string, "VMware, Inc."))
+ return HW_VENDOR_WINE;
+
+ FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning HW_VENDOR_NVIDIA.\n", debugstr_a(gl_vendor_string));
+
+ return HW_VENDOR_NVIDIA;
+}
+
+
+
+enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+ unsigned int *vidmem )
+{
+ /* 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;
+ }
+ /* Geforce 200 - midend */
+ if (strstr(gl_renderer, "GT 240"))
+ {
+ *vidmem = 512;
+ return CARD_NVIDIA_GEFORCE_GT240;
+ }
+
+ /* 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, "8100")
+ || strstr(gl_renderer, "8200")
+ || 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 */
+
+}
+
+enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+ unsigned int *vidmem )
+{
+ /* 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 EG CYPRESS XT / PRO HD5800 - highend */
+ if (strstr(gl_renderer, "HD 5800") /* Radeon EG CYPRESS HD58xx generic renderer string */
+ || strstr(gl_renderer, "HD 5850") /* Radeon EG CYPRESS XT */
+ || strstr(gl_renderer, "HD 5870")) /* Radeon EG CYPRESS PRO */
+ {
+ *vidmem = 1024; /* note: HD58xx cards use 1024MB */
+ return CARD_ATI_RADEON_HD5800;
+ }
+
+ /* Radeon EG JUNIPER XT / LE HD5700 - midend */
+ if (strstr(gl_renderer, "HD 5700") /* Radeon EG JUNIPER HD57xx generic renderer string */
+ || strstr(gl_renderer, "HD 5750") /* Radeon EG JUNIPER LE */
+ || strstr(gl_renderer, "HD 5770")) /* Radeon EG JUNIPER XT */
+ {
+ *vidmem = 512; /* note: HD5770 cards use 1024MB and HD5750 cards use 512MB or 1024MB */
+ return CARD_ATI_RADEON_HD5700;
+ }
+
+ /* 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;
+
+}
+
+enum wined3d_pci_device select_card_intel_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+ unsigned int *vidmem )
+{
+ 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;
+
+}
+
+enum wined3d_pci_device (select_card_ati_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+ unsigned int *vidmem )
+{
+ /* 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 (strstr(gl_renderer, "Gallium"))
+ {
+ /* Radeon R7xx HD4800 - highend */
+ if (strstr(gl_renderer, "R700") /* Radeon R7xx HD48xx generic renderer string */
+ || strstr(gl_renderer, "RV770") /* Radeon RV770 */
+ || strstr(gl_renderer, "RV790")) /* Radeon RV790 */
+ {
+ *vidmem = 512; /* note: HD4890 cards use 1024MB */
+ return CARD_ATI_RADEON_HD4800;
+ }
+
+ /* Radeon R740 HD4700 - midend */
+ if (strstr(gl_renderer, "RV740")) /* Radeon RV740 */
+ {
+ *vidmem = 512;
+ return CARD_ATI_RADEON_HD4700;
+ }
+
+ /* Radeon R730 HD4600 - midend */
+ if (strstr(gl_renderer, "RV730")) /* Radeon RV730 */
+ {
+ *vidmem = 512;
+ return CARD_ATI_RADEON_HD4600;
+ }
+
+ /* Radeon R710 HD4500/HD4350 - lowend */
+ if (strstr(gl_renderer, "RV710")) /* Radeon RV710 */
+ {
+ *vidmem = 256;
+ return CARD_ATI_RADEON_HD4350;
+ }
+
+ /* Radeon R6xx HD2900/HD3800 - highend */
+ if (strstr(gl_renderer, "R600")
+ || strstr(gl_renderer, "RV670")
+ || strstr(gl_renderer, "R680"))
+ {
+ *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, "RV630")
+ || strstr(gl_renderer, "RV635"))
+ {
+ *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */
+ return CARD_ATI_RADEON_HD2600;
+ }
+
+ /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
+ if (strstr(gl_renderer, "RV610")
+ || strstr(gl_renderer, "RV620"))
+ {
+ *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
+ return CARD_ATI_RADEON_HD2300;
+ }
+
+ /* Radeon R6xx/R7xx integrated */
+ if (strstr(gl_renderer, "RS780")
+ || strstr(gl_renderer, "RS880"))
+ {
+ *vidmem = 128; /* 128MB */
+ return CARD_ATI_RADEON_HD3200;
+ }
+
+ /* Radeon R5xx */
+ if (strstr(gl_renderer, "RV530")
+ || strstr(gl_renderer, "RV535")
+ || strstr(gl_renderer, "RV560")
+ || strstr(gl_renderer, "R520")
+ || strstr(gl_renderer, "RV570")
+ || strstr(gl_renderer, "R580"))
+ {
+ *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, "R410")
+ || strstr(gl_renderer, "R420")
+ || strstr(gl_renderer, "R423")
+ || strstr(gl_renderer, "R430")
+ || strstr(gl_renderer, "R480")
+ || strstr(gl_renderer, "R481")
+ || strstr(gl_renderer, "RV410")
+ || strstr(gl_renderer, "RV515")
+ || strstr(gl_renderer, "RV516"))
+ {
+ *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, "RS400")
+ || strstr(gl_renderer, "RS480")
+ || strstr(gl_renderer, "RS482")
+ || strstr(gl_renderer, "RS485")
+ || strstr(gl_renderer, "RS600")
+ || strstr(gl_renderer, "RS690")
+ || strstr(gl_renderer, "RS740"))
+ {
+ *vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */
+ return CARD_ATI_RADEON_XPRESS_200M;
+ }
+
+ /* Radeon R3xx */
+ if (strstr(gl_renderer, "R300")
+ || strstr(gl_renderer, "RV350")
+ || strstr(gl_renderer, "RV351")
+ || strstr(gl_renderer, "RV360")
+ || strstr(gl_renderer, "RV370")
+ || strstr(gl_renderer, "R350")
+ || strstr(gl_renderer, "R360"))
+ {
+ *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_D3D9_CAPABLE(gl_info))
+ {
+ /* Radeon R7xx HD4800 - highend */
+ if (strstr(gl_renderer, "(R700") /* Radeon R7xx HD48xx generic renderer string */
+ || strstr(gl_renderer, "(RV770") /* Radeon RV770 */
+ || strstr(gl_renderer, "(RV790")) /* Radeon RV790 */
+ {
+ *vidmem = 512; /* note: HD4890 cards use 1024MB */
+ return CARD_ATI_RADEON_HD4800;
+ }
+
+ /* Radeon R740 HD4700 - midend */
+ if (strstr(gl_renderer, "(RV740")) /* Radeon RV740 */
+ {
+ *vidmem = 512;
+ return CARD_ATI_RADEON_HD4700;
+ }
+
+ /* Radeon R730 HD4600 - midend */
+ if (strstr(gl_renderer, "(RV730")) /* Radeon RV730 */
+ {
+ *vidmem = 512;
+ return CARD_ATI_RADEON_HD4600;
+ }
+
+ /* Radeon R710 HD4500/HD4350 - lowend */
+ if (strstr(gl_renderer, "(RV710")) /* Radeon RV710 */
+ {
+ *vidmem = 256;
+ return CARD_ATI_RADEON_HD4350;
+ }
+
+ /* Radeon R6xx HD2900/HD3800 - highend */
+ if (strstr(gl_renderer, "(R600")
+ || strstr(gl_renderer, "(RV670")
+ || strstr(gl_renderer, "(R680"))
+ {
+ *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, "(RV630")
+ || strstr(gl_renderer, "(RV635"))
+ {
+ *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */
+ return CARD_ATI_RADEON_HD2600;
+ }
+
+ /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
+ if (strstr(gl_renderer, "(RV610")
+ || strstr(gl_renderer, "(RV620"))
+ {
+ *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
+ return CARD_ATI_RADEON_HD2300;
+ }
+
+ /* Radeon R6xx/R7xx integrated */
+ if (strstr(gl_renderer, "(RS780")
+ || strstr(gl_renderer, "(RS880"))
+ {
+ *vidmem = 128; /* 128MB */
+ return CARD_ATI_RADEON_HD3200;
+ }
+ }
+
+ 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;
+
+}
+
+enum wined3d_pci_device (select_card_nvidia_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+ unsigned int *vidmem )
+{
+ FIXME_(d3d_caps)("Card selection not handled for Mesa Nouveau driver\n");
+ 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;
+}
+
+enum wined3d_pci_device (select_card_intel_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+ unsigned int *vidmem )
+{
+ FIXME_(d3d_caps)("Card selection not handled for Mesa Intel driver\n");
+ return CARD_INTEL_I915G;
+}
+
+
+struct vendor_card_selection
+{
+ enum wined3d_gl_vendor gl_vendor;
+ enum wined3d_pci_vendor card_vendor;
+ const char *description; /* Description of the card selector i.e. Apple OS/X Intel */
+ enum wined3d_pci_device (*select_card)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+ unsigned int *vidmem );
+};
+
+static const struct vendor_card_selection vendor_card_select_table[] =
+{
+ {GL_VENDOR_NVIDIA, HW_VENDOR_NVIDIA, "Nvidia binary driver", select_card_nvidia_binary},
+ {GL_VENDOR_APPLE, HW_VENDOR_NVIDIA, "Apple OSX NVidia binary driver", select_card_nvidia_binary},
+ {GL_VENDOR_APPLE, HW_VENDOR_ATI, "Apple OSX AMD/ATI binary driver", select_card_ati_binary},
+ {GL_VENDOR_APPLE, HW_VENDOR_INTEL, "Apple OSX Intel binary driver", select_card_intel_binary},
+ {GL_VENDOR_ATI, HW_VENDOR_ATI, "AMD/ATI binary driver", select_card_ati_binary},
+ {GL_VENDOR_MESA, HW_VENDOR_ATI, "Mesa AMD/ATI driver", select_card_ati_mesa},
+ {GL_VENDOR_MESA, HW_VENDOR_NVIDIA, "Mesa Nouveau driver", select_card_nvidia_mesa},
+ {GL_VENDOR_MESA, HW_VENDOR_INTEL, "Mesa Intel driver", select_card_intel_mesa}
+};
+
+
+static enum wined3d_pci_device wined3d_guess_card(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+ enum wined3d_gl_vendor *gl_vendor, enum wined3d_pci_vendor *card_vendor, unsigned int *vidmem)
+{
+ /* Above 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.
@@ -1192,451 +1915,84 @@ static enum wined3d_pci_device wined3d_guess_card(const struct wined3d_gl_info *
* memory behind our backs if really needed. Note that the amount of video
* memory can be overruled using a registry setting. */
- switch (*vendor)
+ int i;
+
+ for (i = 0; i < (sizeof(vendor_card_select_table) / sizeof(*vendor_card_select_table)); ++i)
{
- 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;
- }
- /* Geforce 200 - midend */
- if (strstr(gl_renderer, "GT 240"))
- {
- *vidmem = 512;
- return CARD_NVIDIA_GEFORCE_GT240;
- }
-
- /* 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, "8100")
- || strstr(gl_renderer, "8200")
- || 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 EG CYPRESS XT / PRO HD5800 - highend */
- if (strstr(gl_renderer, "HD 5800") /* Radeon EG CYPRESS HD58xx generic renderer string */
- || strstr(gl_renderer, "HD 5850") /* Radeon EG CYPRESS XT */
- || strstr(gl_renderer, "HD 5870")) /* Radeon EG CYPRESS PRO */
- {
- *vidmem = 1024; /* note: HD58xx cards use 1024MB */
- return CARD_ATI_RADEON_HD5800;
- }
-
- /* Radeon EG JUNIPER XT / LE HD5700 - midend */
- if (strstr(gl_renderer, "HD 5700") /* Radeon EG JUNIPER HD57xx generic renderer string */
- || strstr(gl_renderer, "HD 5750") /* Radeon EG JUNIPER LE */
- || strstr(gl_renderer, "HD 5770")) /* Radeon EG JUNIPER XT */
- {
- *vidmem = 512; /* note: HD5770 cards use 1024MB and HD5750 cards use 512MB or 1024MB */
- return CARD_ATI_RADEON_HD5700;
- }
-
- /* 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;
+ if ((vendor_card_select_table[i].gl_vendor != *gl_vendor)
+ || (vendor_card_select_table[i].card_vendor != *card_vendor))
+ continue;
+ TRACE_(d3d_caps)("Applying card_selector \"%s\".\n", vendor_card_select_table[i].description);
+ return vendor_card_select_table[i].select_card(gl_info, gl_renderer, vidmem);
}
+
+ FIXME_(d3d_caps)("No card selector available for GL vendor %d and card vendor %04x.\n",
+ *gl_vendor, *card_vendor);
+
+ /* 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. */
+ *card_vendor = HW_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;
+}
+
+static const struct fragment_pipeline *select_fragment_implementation(struct wined3d_adapter *adapter)
+{
+ const struct wined3d_gl_info *gl_info = &adapter->gl_info;
+ int vs_selected_mode, ps_selected_mode;
+
+ select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode);
+ if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL)
+ && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_fragment_pipeline;
+ else if (ps_selected_mode == SHADER_ATI) return &atifs_fragment_pipeline;
+ else if (gl_info->supported[NV_REGISTER_COMBINERS]
+ && gl_info->supported[NV_TEXTURE_SHADER2]) return &nvts_fragment_pipeline;
+ else if (gl_info->supported[NV_REGISTER_COMBINERS]) return &nvrc_fragment_pipeline;
+ else return &ffp_fragment_pipeline;
+}
+
+static const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter)
+{
+ int vs_selected_mode, ps_selected_mode;
+
+ select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode);
+ if (vs_selected_mode == SHADER_GLSL || ps_selected_mode == SHADER_GLSL) return &glsl_shader_backend;
+ if (vs_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_ARB) return &arb_program_shader_backend;
+ return &none_shader_backend;
+}
+
+static const struct blit_shader *select_blit_implementation(struct wined3d_adapter *adapter)
+{
+ const struct wined3d_gl_info *gl_info = &adapter->gl_info;
+ int vs_selected_mode, ps_selected_mode;
+
+ select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode);
+ if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL)
+ && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_blit;
+ else return &ffp_blit;
}
/* Context activation is done by the caller. */
-static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, struct wined3d_gl_info *gl_info)
+static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter)
{
+ struct wined3d_driver_info *driver_info = &adapter->driver_info;
+ struct wined3d_gl_info *gl_info = &adapter->gl_info;
const char *GL_Extensions = NULL;
const char *WGL_Extensions = NULL;
- const char *gl_string = NULL;
- enum wined3d_pci_vendor vendor;
+ const char *gl_vendor_str, *gl_renderer_str, *gl_version_str;
+ struct fragment_caps fragment_caps;
+ enum wined3d_gl_vendor gl_vendor;
+ enum wined3d_pci_vendor card_vendor;
enum wined3d_pci_device device;
GLint gl_max;
GLfloat gl_floatv[2];
unsigned i;
HDC hdc;
unsigned int vidmem=0;
- char *gl_renderer;
DWORD gl_version;
size_t len;
@@ -1644,48 +2000,34 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
ENTER_GL();
- gl_string = (const char *)glGetString(GL_RENDERER);
- TRACE_(d3d_caps)("GL_RENDERER: %s.\n", debugstr_a(gl_string));
- if (!gl_string)
+ gl_renderer_str = (const char *)glGetString(GL_RENDERER);
+ TRACE_(d3d_caps)("GL_RENDERER: %s.\n", debugstr_a(gl_renderer_str));
+ if (!gl_renderer_str)
{
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)
+ gl_vendor_str = (const char *)glGetString(GL_VENDOR);
+ TRACE_(d3d_caps)("GL_VENDOR: %s.\n", debugstr_a(gl_vendor_str));
+ if (!gl_vendor_str)
{
LEAVE_GL();
ERR_(d3d_caps)("Received a NULL GL_VENDOR.\n");
- HeapFree(GetProcessHeap(), 0, gl_renderer);
return FALSE;
}
- vendor = wined3d_guess_vendor(gl_string, gl_renderer);
- TRACE_(d3d_caps)("found GL_VENDOR (%s)->(0x%04x)\n", debugstr_a(gl_string), vendor);
/* Parse the GL_VERSION field into major and minor information */
- gl_string = (const char *)glGetString(GL_VERSION);
- TRACE_(d3d_caps)("GL_VERSION: %s.\n", debugstr_a(gl_string));
- if (!gl_string)
+ gl_version_str = (const char *)glGetString(GL_VERSION);
+ TRACE_(d3d_caps)("GL_VERSION: %s.\n", debugstr_a(gl_version_str));
+ if (!gl_version_str)
{
LEAVE_GL();
ERR_(d3d_caps)("Received a NULL GL_VERSION.\n");
- HeapFree(GetProcessHeap(), 0, gl_renderer);
return FALSE;
}
- gl_version = wined3d_parse_gl_version(gl_string);
+ gl_version = wined3d_parse_gl_version(gl_version_str);
/*
* Initialize openGL extension related variables
@@ -1694,7 +2036,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
memset(gl_info->supported, 0, sizeof(gl_info->supported));
gl_info->limits.buffers = 1;
gl_info->limits.textures = 1;
- gl_info->limits.texture_stages = 1;
gl_info->limits.fragment_samplers = 1;
gl_info->limits.vertex_samplers = 0;
gl_info->limits.combined_samplers = gl_info->limits.fragment_samplers + gl_info->limits.vertex_samplers;
@@ -1734,7 +2075,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
{
LEAVE_GL();
ERR_(d3d_caps)("Received a NULL GL_EXTENSIONS.\n");
- HeapFree(GetProcessHeap(), 0, gl_renderer);
return FALSE;
}
@@ -1831,6 +2171,12 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
gl_info->supported[ARB_HALF_FLOAT_PIXEL] = TRUE;
}
}
+ if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+ {
+ /* GL_ARB_map_buffer_range and GL_APPLE_flush_buffer_range provide the same
+ * functionality. Prefer the ARB extension */
+ gl_info->supported[APPLE_FLUSH_BUFFER_RANGE] = FALSE;
+ }
if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
{
TRACE_(d3d_caps)(" IMPLIED: NVIDIA (NV) Texture Gen Reflection support.\n");
@@ -1841,6 +2187,11 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
TRACE_(d3d_caps)(" IMPLIED: ARB_depth_clamp support (by NV_depth_clamp).\n");
gl_info->supported[ARB_DEPTH_CLAMP] = TRUE;
}
+ if (!gl_info->supported[ARB_VERTEX_ARRAY_BGRA] && gl_info->supported[EXT_VERTEX_ARRAY_BGRA])
+ {
+ TRACE_(d3d_caps)(" IMPLIED: ARB_vertex_array_bgra support (by EXT_vertex_array_bgra).\n");
+ gl_info->supported[ARB_VERTEX_ARRAY_BGRA] = TRUE;
+ }
if (gl_info->supported[NV_TEXTURE_SHADER2])
{
if (gl_info->supported[NV_REGISTER_COMBINERS])
@@ -1851,6 +2202,13 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
gl_info->supported[ATI_FRAGMENT_SHADER] = FALSE;
}
}
+
+ if (gl_info->supported[NV_REGISTER_COMBINERS])
+ {
+ glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &gl_max);
+ gl_info->limits.general_combiners = gl_max;
+ TRACE_(d3d_caps)("Max general combiners: %d.\n", gl_max);
+ }
if (gl_info->supported[ARB_DRAW_BUFFERS])
{
glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &gl_max);
@@ -1863,18 +2221,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
gl_info->limits.textures = min(MAX_TEXTURES, gl_max);
TRACE_(d3d_caps)("Max textures: %d.\n", gl_info->limits.textures);
- if (gl_info->supported[NV_REGISTER_COMBINERS])
- {
- GLint tmp;
- glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &tmp);
- gl_info->limits.texture_stages = min(MAX_TEXTURES, tmp);
- }
- else
- {
- gl_info->limits.texture_stages = min(MAX_TEXTURES, gl_max);
- }
- TRACE_(d3d_caps)("Max texture stages: %d.\n", gl_info->limits.texture_stages);
-
if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
{
GLint tmp;
@@ -1998,6 +2344,11 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
gl_info->limits.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[ARB_SHADING_LANGUAGE_100])
+ {
+ const char *str = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION_ARB);
+ TRACE_(d3d_caps)("GLSL version string: %s.\n", debugstr_a(str));
+ }
if (gl_info->supported[NV_LIGHT_MAX_EXPONENT])
{
glGetFloatv(GL_MAX_SHININESS_NV, &gl_info->limits.shininess);
@@ -2024,7 +2375,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
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])
{
@@ -2043,6 +2393,14 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
LEAVE_GL();
+ adapter->fragment_pipe = select_fragment_implementation(adapter);
+ adapter->shader_backend = select_shader_backend(adapter);
+ adapter->blitter = select_blit_implementation(adapter);
+
+ adapter->fragment_pipe->get_caps(gl_info, &fragment_caps);
+ gl_info->limits.texture_stages = fragment_caps.MaxTextureBlendStages;
+ TRACE_(d3d_caps)("Max texture stages: %u.\n", gl_info->limits.texture_stages);
+
/* 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
* shaders), but 8 texture stages (register combiners). */
@@ -2113,8 +2471,12 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
gl_info->limits.buffers = 1;
}
- device = wined3d_guess_card(gl_info, gl_renderer, &vendor, &vidmem);
- TRACE_(d3d_caps)("FOUND (fake) card: 0x%x (vendor id), 0x%x (device id)\n", vendor, device);
+ gl_vendor = wined3d_guess_gl_vendor(gl_info, gl_vendor_str, gl_renderer_str);
+ card_vendor = wined3d_guess_card_vendor(gl_vendor_str, gl_renderer_str);
+ TRACE_(d3d_caps)("found GL_VENDOR (%s)->(0x%04x/0x%04x)\n", debugstr_a(gl_vendor_str), gl_vendor, card_vendor);
+
+ device = wined3d_guess_card(gl_info, gl_renderer_str, &gl_vendor, &card_vendor, &vidmem);
+ TRACE_(d3d_caps)("FOUND (fake) card: 0x%x (vendor id), 0x%x (device id)\n", card_vendor, device);
/* If we have an estimate use it, else default to 64MB; */
if(vidmem)
@@ -2176,11 +2538,10 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
}
}
- fixup_extensions(gl_info, gl_renderer, vendor, device);
- init_driver_info(driver_info, vendor, device);
+ fixup_extensions(gl_info, gl_renderer_str, gl_vendor, card_vendor, device);
+ init_driver_info(driver_info, card_vendor, device);
add_gl_compat_wrappers(gl_info);
- HeapFree(GetProcessHeap(), 0, gl_renderer);
return TRUE;
}
@@ -2644,7 +3005,10 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, U
continue;
if(cfgs[i].blueSize != blueSize)
continue;
- if(cfgs[i].alphaSize != alphaSize)
+ /* Not all drivers report alpha-less formats since they use 32-bit anyway, so accept alpha even if we didn't ask for it. */
+ if(alphaSize && cfgs[i].alphaSize != alphaSize)
+ continue;
+ if(cfgs[i].colorSize != (glDesc->byte_count << 3))
continue;
TRACE("Found iPixelFormat=%d to support MultiSampleType=%d for format %s\n", cfgs[i].iPixelFormat, MultiSampleType, debug_d3dformat(SurfaceFormat));
@@ -2748,8 +3112,6 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceType(IWineD3D *iface, UINT Adapter
static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter,
WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc)
{
- const struct fragment_pipeline *fp;
-
switch(format_desc->format)
{
case WINED3DFMT_R8G8_SNORM:
@@ -2760,8 +3122,7 @@ static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter,
/* Ask the fixed function pipeline implementation if it can deal
* with the conversion. If we've got a GL extension giving native
* support this will be an identity conversion. */
- fp = select_fragment_implementation(adapter, DeviceType);
- if (fp->color_fixup_supported(format_desc->color_fixup))
+ if (adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup))
{
TRACE_(d3d_caps)("[OK]\n");
return TRUE;
@@ -2951,8 +3312,6 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc)
{
const struct wined3d_gl_info *gl_info = &adapter->gl_info;
- const shader_backend_t *shader_backend;
- const struct fragment_pipeline *fp;
switch (format_desc->format)
{
@@ -3030,8 +3389,7 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
/* Ask the shader backend if it can deal with the conversion. If
* we've got a GL extension giving native support this will be an
* identity conversion. */
- shader_backend = select_shader_backend(adapter, DeviceType);
- if (shader_backend->shader_color_fixup_supported(format_desc->color_fixup))
+ if (adapter->shader_backend->shader_color_fixup_supported(format_desc->color_fixup))
{
TRACE_(d3d_caps)("[OK]\n");
return TRUE;
@@ -3147,10 +3505,8 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
if (gl_info->supported[ATI_TEXTURE_COMPRESSION_3DC]
|| gl_info->supported[EXT_TEXTURE_COMPRESSION_RGTC])
{
- shader_backend = select_shader_backend(adapter, DeviceType);
- fp = select_fragment_implementation(adapter, DeviceType);
- if (shader_backend->shader_color_fixup_supported(format_desc->color_fixup)
- && fp->color_fixup_supported(format_desc->color_fixup))
+ if (adapter->shader_backend->shader_color_fixup_supported(format_desc->color_fixup)
+ && adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup))
{
TRACE_(d3d_caps)("[OK]\n");
return TRUE;
@@ -3186,8 +3542,6 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, const struct GlPixelFormatDesc *adapter_format_desc,
WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *check_format_desc, WINED3DSURFTYPE SurfaceType)
{
- const struct blit_shader *blitter;
-
if(SurfaceType == SURFACE_GDI) {
switch(check_format_desc->format)
{
@@ -3223,8 +3577,7 @@ static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, const struct
if (CheckDepthStencilCapability(adapter, adapter_format_desc, check_format_desc)) return TRUE;
/* If opengl can't process the format natively, the blitter may be able to convert it */
- blitter = select_blit_implementation(adapter, DeviceType);
- if (blitter->color_fixup_supported(check_format_desc->color_fixup))
+ if (adapter->blitter->color_fixup_supported(check_format_desc->color_fixup))
{
TRACE_(d3d_caps)("[OK]\n");
return TRUE;
@@ -3789,8 +4142,6 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
int ps_selected_mode;
struct shader_caps shader_caps;
struct fragment_caps fragment_caps;
- const shader_backend_t *shader_backend;
- const struct fragment_pipeline *frag_pipeline = NULL;
DWORD ckey_caps, blit_caps, fx_caps;
TRACE_(d3d_caps)("(%p)->(Adptr:%d, DevType: %x, pCaps: %p)\n", This, Adapter, DeviceType, pCaps);
@@ -4167,12 +4518,10 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
pCaps->VertexTextureFilterCaps = 0;
memset(&shader_caps, 0, sizeof(shader_caps));
- shader_backend = select_shader_backend(adapter, DeviceType);
- shader_backend->shader_get_caps(DeviceType, &adapter->gl_info, &shader_caps);
+ adapter->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
memset(&fragment_caps, 0, sizeof(fragment_caps));
- frag_pipeline = select_fragment_implementation(adapter, DeviceType);
- frag_pipeline->get_caps(DeviceType, &adapter->gl_info, &fragment_caps);
+ adapter->fragment_pipe->get_caps(&adapter->gl_info, &fragment_caps);
/* Add shader misc caps. Only some of them belong to the shader parts of the pipeline */
pCaps->PrimitiveMiscCaps |= fragment_caps.PrimitiveMiscCaps;
@@ -4697,7 +5046,7 @@ BOOL InitAdapters(IWineD3DImpl *This)
goto nogl_adapter;
}
- ret = IWineD3DImpl_FillGLCaps(&adapter->driver_info, &adapter->gl_info);
+ ret = IWineD3DImpl_FillGLCaps(adapter);
if(!ret) {
ERR("Failed to initialize gl caps for default adapter\n");
WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
@@ -4729,8 +5078,8 @@ BOOL InitAdapters(IWineD3DImpl *This)
if (gl_info->supported[WGL_ARB_PIXEL_FORMAT])
{
int attribute;
- int attribs[10];
- int values[10];
+ int attribs[11];
+ int values[11];
int nAttribs = 0;
attribute = WGL_NUMBER_PIXEL_FORMATS_ARB;
@@ -4742,6 +5091,7 @@ BOOL InitAdapters(IWineD3DImpl *This)
attribs[nAttribs++] = WGL_GREEN_BITS_ARB;
attribs[nAttribs++] = WGL_BLUE_BITS_ARB;
attribs[nAttribs++] = WGL_ALPHA_BITS_ARB;
+ attribs[nAttribs++] = WGL_COLOR_BITS_ARB;
attribs[nAttribs++] = WGL_DEPTH_BITS_ARB;
attribs[nAttribs++] = WGL_STENCIL_BITS_ARB;
attribs[nAttribs++] = WGL_DRAW_TO_WINDOW_ARB;
@@ -4762,12 +5112,13 @@ BOOL InitAdapters(IWineD3DImpl *This)
cfgs->greenSize = values[1];
cfgs->blueSize = values[2];
cfgs->alphaSize = values[3];
- cfgs->depthSize = values[4];
- cfgs->stencilSize = values[5];
- cfgs->windowDrawable = values[6];
- cfgs->iPixelType = values[7];
- cfgs->doubleBuffer = values[8];
- cfgs->auxBuffers = values[9];
+ cfgs->colorSize = values[4];
+ cfgs->depthSize = values[5];
+ cfgs->stencilSize = values[6];
+ cfgs->windowDrawable = values[7];
+ cfgs->iPixelType = values[8];
+ cfgs->doubleBuffer = values[9];
+ cfgs->auxBuffers = values[10];
cfgs->pbufferDrawable = FALSE;
/* Check for pbuffer support when it is around as
@@ -4794,7 +5145,7 @@ BOOL InitAdapters(IWineD3DImpl *This)
}
}
- TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, depth=%d, stencil=%d, windowDrawable=%d, pbufferDrawable=%d\n", cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer, cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize, cfgs->depthSize, cfgs->stencilSize, cfgs->windowDrawable, cfgs->pbufferDrawable);
+ TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, depth=%d, stencil=%d, samples=%d, windowDrawable=%d, pbufferDrawable=%d\n", cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer, cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize, cfgs->depthSize, cfgs->stencilSize, cfgs->numSamples, cfgs->windowDrawable, cfgs->pbufferDrawable);
cfgs++;
}
}
@@ -4828,6 +5179,7 @@ BOOL InitAdapters(IWineD3DImpl *This)
cfgs->greenSize = ppfd.cGreenBits;
cfgs->blueSize = ppfd.cBlueBits;
cfgs->alphaSize = ppfd.cAlphaBits;
+ cfgs->colorSize = ppfd.cColorBits;
cfgs->depthSize = ppfd.cDepthBits;
cfgs->stencilSize = ppfd.cStencilBits;
cfgs->pbufferDrawable = 0;
diff --git a/dll/directx/wine/wined3d/drawprim.c b/dll/directx/wine/wined3d/drawprim.c
index dbeb7993f9f..b29d012b9d1 100644
--- a/dll/directx/wine/wined3d/drawprim.c
+++ b/dll/directx/wine/wined3d/drawprim.c
@@ -334,7 +334,7 @@ static inline void send_attribute(IWineD3DDeviceImpl *This, WINED3DFORMAT format
GL_EXTCALL(glVertexAttrib4ubvARB(index, ptr));
break;
case WINED3DFMT_B8G8R8A8_UNORM:
- if (gl_info->supported[EXT_VERTEX_ARRAY_BGRA])
+ if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA])
{
const DWORD *src = ptr;
DWORD c = *src & 0xff00ff00;
@@ -690,6 +690,9 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
/* Finished updating the screen, restore lock */
LEAVE_GL();
+
+ wglFlush(); /* Flush to ensure ordering across contexts. */
+
context_release(context);
TRACE("Done all gl drawing\n");
@@ -1100,7 +1103,7 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
if(patch->has_texcoords) {
vtxStride += 4 * sizeof(float);
}
- memset(&patch->strided, 0, sizeof(&patch->strided));
+ memset(&patch->strided, 0, sizeof(patch->strided));
patch->strided.position.format = WINED3DFMT_R32G32B32_FLOAT;
patch->strided.position.lpData = (BYTE *) patch->mem;
patch->strided.position.dwStride = vtxStride;
diff --git a/dll/directx/wine/wined3d/glsl_shader.c b/dll/directx/wine/wined3d/glsl_shader.c
index 90b5092d38f..cb23ee6aa0e 100644
--- a/dll/directx/wine/wined3d/glsl_shader.c
+++ b/dll/directx/wine/wined3d/glsl_shader.c
@@ -156,6 +156,20 @@ struct glsl_vshader_private
UINT num_gl_shaders, shader_array_size;
};
+static const char *debug_gl_shader_type(GLenum type)
+{
+ switch (type)
+ {
+#define WINED3D_TO_STR(u) case u: return #u
+ WINED3D_TO_STR(GL_VERTEX_SHADER_ARB);
+ WINED3D_TO_STR(GL_GEOMETRY_SHADER_ARB);
+ WINED3D_TO_STR(GL_FRAGMENT_SHADER_ARB);
+#undef WINED3D_TO_STR
+ default:
+ return wine_dbg_sprintf("UNKNOWN(%#x)", type);
+ }
+}
+
/* Extract a line from the info log.
* Note that this modifies the source string. */
static char *get_info_log_line(char **ptr)
@@ -238,6 +252,81 @@ static void print_glsl_info_log(const struct wined3d_gl_info *gl_info, GLhandleA
}
}
+/* GL locking is done by the caller. */
+static void shader_glsl_dump_program_source(const struct wined3d_gl_info *gl_info, GLhandleARB program)
+{
+ GLint i, object_count, source_size;
+ GLhandleARB *objects;
+ char *source = NULL;
+
+ GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_ATTACHED_OBJECTS_ARB, &object_count));
+ objects = HeapAlloc(GetProcessHeap(), 0, object_count * sizeof(*objects));
+ if (!objects)
+ {
+ ERR("Failed to allocate object array memory.\n");
+ return;
+ }
+
+ GL_EXTCALL(glGetAttachedObjectsARB(program, object_count, NULL, objects));
+ for (i = 0; i < object_count; ++i)
+ {
+ char *ptr, *line;
+ GLint tmp;
+
+ GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_SHADER_SOURCE_LENGTH_ARB, &tmp));
+
+ if (!source || source_size < tmp)
+ {
+ HeapFree(GetProcessHeap(), 0, source);
+
+ source = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, tmp);
+ if (!source)
+ {
+ ERR("Failed to allocate %d bytes for shader source.\n", tmp);
+ HeapFree(GetProcessHeap(), 0, objects);
+ return;
+ }
+ source_size = tmp;
+ }
+
+ FIXME("Object %u:\n", objects[i]);
+ GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_SUBTYPE_ARB, &tmp));
+ FIXME(" GL_OBJECT_SUBTYPE_ARB: %s.\n", debug_gl_shader_type(tmp));
+ GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_COMPILE_STATUS_ARB, &tmp));
+ FIXME(" GL_OBJECT_COMPILE_STATUS_ARB: %d.\n", tmp);
+ FIXME("\n");
+
+ ptr = source;
+ GL_EXTCALL(glGetShaderSourceARB(objects[i], source_size, NULL, source));
+ while ((line = get_info_log_line(&ptr))) FIXME(" %s\n", line);
+ FIXME("\n");
+ }
+
+ HeapFree(GetProcessHeap(), 0, source);
+ HeapFree(GetProcessHeap(), 0, objects);
+}
+
+/* GL locking is done by the caller. */
+static void shader_glsl_validate_link(const struct wined3d_gl_info *gl_info, GLhandleARB program)
+{
+ GLint tmp;
+
+ if (!TRACE_ON(d3d_shader) && !FIXME_ON(d3d_shader)) return;
+
+ GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_TYPE_ARB, &tmp));
+ if (tmp == GL_PROGRAM_OBJECT_ARB)
+ {
+ GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_LINK_STATUS_ARB, &tmp));
+ if (!tmp)
+ {
+ FIXME("Program %u link status invalid.\n", program);
+ shader_glsl_dump_program_source(gl_info, program);
+ }
+ }
+
+ print_glsl_info_log(gl_info, program);
+}
+
/**
* Loads (pixel shader) samplers
*/
@@ -1083,6 +1172,8 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
}
}
+ shader_addline(buffer, "const float FLT_MAX = 1e38;\n");
+
/* Start the main program */
shader_addline(buffer, "void main() {\n");
if(pshader && reg_maps->vpos) {
@@ -1194,8 +1285,7 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
static const char * const hwrastout_reg_names[] = { "gl_Position", "gl_FogFragCoord", "gl_PointSize" };
IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
- IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
- const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
char pshader = shader_is_pshader_version(This->baseShader.reg_maps.shader_version.type);
*is_color = FALSE;
@@ -1552,7 +1642,8 @@ static inline const char *shader_get_comp_op(DWORD op)
}
}
-static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, glsl_sample_function_t *sample_function)
+static void shader_glsl_get_sample_function(const struct wined3d_gl_info *gl_info,
+ DWORD sampler_type, DWORD flags, glsl_sample_function_t *sample_function)
{
BOOL projected = flags & WINED3D_GLSL_SAMPLE_PROJECTED;
BOOL texrect = flags & WINED3D_GLSL_SAMPLE_RECT;
@@ -1564,9 +1655,21 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls
case WINED3DSTT_1D:
if(lod) {
sample_function->name = projected ? "texture1DProjLod" : "texture1DLod";
- } else if(grad) {
- sample_function->name = projected ? "texture1DProjGradARB" : "texture1DGradARB";
- } else {
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = projected ? "texture1DProjGrad" : "texture1DGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = projected ? "texture1DProjGradARB" : "texture1DGradARB";
+ else
+ {
+ FIXME("Unsupported 1D grad function.\n");
+ sample_function->name = "unsupported1DGrad";
+ }
+ }
+ else
+ {
sample_function->name = projected ? "texture1DProj" : "texture1D";
}
sample_function->coord_mask = WINED3DSP_WRITEMASK_0;
@@ -1575,20 +1678,41 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls
if(texrect) {
if(lod) {
sample_function->name = projected ? "texture2DRectProjLod" : "texture2DRectLod";
- } else if(grad) {
- /* What good are texrect grad functions? I don't know, but GL_EXT_gpu_shader4 defines them.
- * There is no GL_ARB_shader_texture_lod spec yet, so I don't know if they're defined there
- */
- sample_function->name = projected ? "shadow2DRectProjGradARB" : "shadow2DRectGradARB";
- } else {
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = projected ? "texture2DRectProjGrad" : "texture2DRectGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = projected ? "texture2DRectProjGradARB" : "texture2DRectGradARB";
+ else
+ {
+ FIXME("Unsupported RECT grad function.\n");
+ sample_function->name = "unsupported2DRectGrad";
+ }
+ }
+ else
+ {
sample_function->name = projected ? "texture2DRectProj" : "texture2DRect";
}
} else {
if(lod) {
sample_function->name = projected ? "texture2DProjLod" : "texture2DLod";
- } else if(grad) {
- sample_function->name = projected ? "texture2DProjGradARB" : "texture2DGradARB";
- } else {
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = projected ? "texture2DProjGrad" : "texture2DGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = projected ? "texture2DProjGradARB" : "texture2DGradARB";
+ else
+ {
+ FIXME("Unsupported 2D grad function.\n");
+ sample_function->name = "unsupported2DGrad";
+ }
+ }
+ else
+ {
sample_function->name = projected ? "texture2DProj" : "texture2D";
}
}
@@ -1597,9 +1721,21 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls
case WINED3DSTT_CUBE:
if(lod) {
sample_function->name = "textureCubeLod";
- } else if(grad) {
- sample_function->name = "textureCubeGradARB";
- } else {
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = "textureCubeGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = "textureCubeGradARB";
+ else
+ {
+ FIXME("Unsupported Cube grad function.\n");
+ sample_function->name = "unsupportedCubeGrad";
+ }
+ }
+ else
+ {
sample_function->name = "textureCube";
}
sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
@@ -1607,9 +1743,21 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls
case WINED3DSTT_VOLUME:
if(lod) {
sample_function->name = projected ? "texture3DProjLod" : "texture3DLod";
- } else if(grad) {
- sample_function->name = projected ? "texture3DProjGradARB" : "texture3DGradARB";
- } else {
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = projected ? "texture3DProjGrad" : "texture3DGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = projected ? "texture3DProjGradARB" : "texture3DGradARB";
+ else
+ {
+ FIXME("Unsupported 3D grad function.\n");
+ sample_function->name = "unsupported3DGrad";
+ }
+ }
+ else
+ {
sample_function->name = projected ? "texture3DProj" : "texture3D";
}
sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
@@ -1681,10 +1829,10 @@ static void shader_glsl_color_correction(const struct wined3d_shader_instruction
if (!mask) return; /* Nothing to do */
- if (is_yuv_fixup(fixup))
+ if (is_complex_fixup(fixup))
{
- enum yuv_fixup yuv_fixup = get_yuv_fixup(fixup);
- FIXME("YUV fixup (%#x) not supported\n", yuv_fixup);
+ enum complex_fixup complex_fixup = get_complex_fixup(fixup);
+ FIXME("Complex fixup (%#x) not supported\n",complex_fixup);
return;
}
@@ -1822,6 +1970,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)
{
+ const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
glsl_src_param_t src0_param;
DWORD write_mask;
@@ -1847,12 +1996,26 @@ static void shader_glsl_mov(const struct wined3d_shader_instruction *ins)
{
/* We need to *round* to the nearest int here. */
unsigned int mask_size = shader_glsl_get_write_mask_size(write_mask);
- if (mask_size > 1) {
- shader_addline(buffer, "ivec%d(floor(abs(%s) + vec%d(0.5)) * sign(%s)));\n", mask_size, src0_param.param_str, mask_size, src0_param.param_str);
- } else {
- shader_addline(buffer, "int(floor(abs(%s) + 0.5) * sign(%s)));\n", src0_param.param_str, src0_param.param_str);
+
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ {
+ if (mask_size > 1)
+ shader_addline(buffer, "ivec%d(round(%s)));\n", mask_size, src0_param.param_str);
+ else
+ shader_addline(buffer, "int(round(%s)));\n", src0_param.param_str);
}
- } else {
+ else
+ {
+ if (mask_size > 1)
+ shader_addline(buffer, "ivec%d(floor(abs(%s) + vec%d(0.5)) * sign(%s)));\n",
+ mask_size, src0_param.param_str, mask_size, src0_param.param_str);
+ else
+ shader_addline(buffer, "int(floor(abs(%s) + 0.5) * sign(%s)));\n",
+ src0_param.param_str, src0_param.param_str);
+ }
+ }
+ else
+ {
shader_addline(buffer, "%s);\n", src0_param.param_str);
}
}
@@ -1942,10 +2105,15 @@ static void shader_glsl_log(const struct wined3d_shader_instruction *ins)
shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_0, &src0_param);
- if (dst_size > 1) {
- shader_addline(buffer, "vec%d(log2(abs(%s))));\n", dst_size, src0_param.param_str);
- } else {
- shader_addline(buffer, "log2(abs(%s)));\n", src0_param.param_str);
+ if (dst_size > 1)
+ {
+ shader_addline(buffer, "vec%d(%s == 0.0 ? -FLT_MAX : log2(abs(%s))));\n",
+ dst_size, src0_param.param_str, src0_param.param_str);
+ }
+ else
+ {
+ shader_addline(buffer, "%s == 0.0 ? -FLT_MAX : log2(abs(%s)));\n",
+ src0_param.param_str, src0_param.param_str);
}
}
@@ -1966,7 +2134,6 @@ static void shader_glsl_map2gl(const struct wined3d_shader_instruction *ins)
case WINED3DSIH_MAX: instruction = "max"; break;
case WINED3DSIH_ABS: instruction = "abs"; break;
case WINED3DSIH_FRC: instruction = "fract"; break;
- case WINED3DSIH_NRM: instruction = "normalize"; break;
case WINED3DSIH_EXP: instruction = "exp2"; break;
case WINED3DSIH_DSX: instruction = "dFdx"; break;
case WINED3DSIH_DSY: instruction = "ycorrection.y * dFdy"; break;
@@ -1993,6 +2160,22 @@ static void shader_glsl_map2gl(const struct wined3d_shader_instruction *ins)
shader_addline(buffer, "));\n");
}
+static void shader_glsl_nrm(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ glsl_src_param_t src_param;
+ DWORD write_mask;
+ char dst_mask[6];
+
+ write_mask = shader_glsl_get_write_mask(ins->dst, dst_mask);
+ shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src_param);
+
+ shader_addline(buffer, "tmp0.x = length(%s);\n", src_param.param_str);
+ shader_glsl_append_dst(buffer, ins);
+ shader_addline(buffer, "tmp0.x == 0.0 ? (%s * FLT_MAX) : (%s / tmp0.x));",
+ src_param.param_str, src_param.param_str);
+}
+
/** Process the WINED3DSIO_EXPP instruction in GLSL:
* For shader model 1.x, do the following (and honor the writemask, so use a temporary variable):
* dst.x = 2^(floor(src))
@@ -2046,10 +2229,15 @@ static void shader_glsl_rcp(const struct wined3d_shader_instruction *ins)
mask_size = shader_glsl_get_write_mask_size(write_mask);
shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &src_param);
- if (mask_size > 1) {
- shader_addline(ins->ctx->buffer, "vec%d(1.0 / %s));\n", mask_size, src_param.param_str);
- } else {
- shader_addline(ins->ctx->buffer, "1.0 / %s);\n", src_param.param_str);
+ if (mask_size > 1)
+ {
+ shader_addline(ins->ctx->buffer, "vec%d(%s == 0.0 ? FLT_MAX : 1.0 / %s));\n",
+ mask_size, src_param.param_str, src_param.param_str);
+ }
+ else
+ {
+ shader_addline(ins->ctx->buffer, "%s == 0.0 ? FLT_MAX : 1.0 / %s);\n",
+ src_param.param_str, src_param.param_str);
}
}
@@ -2065,10 +2253,15 @@ static void shader_glsl_rsq(const struct wined3d_shader_instruction *ins)
shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &src_param);
- if (mask_size > 1) {
- shader_addline(buffer, "vec%d(inversesqrt(%s)));\n", mask_size, src_param.param_str);
- } else {
- shader_addline(buffer, "inversesqrt(%s));\n", src_param.param_str);
+ if (mask_size > 1)
+ {
+ shader_addline(buffer, "vec%d(%s == 0.0 ? FLT_MAX : inversesqrt(abs(%s))));\n",
+ mask_size, src_param.param_str, src_param.param_str);
+ }
+ else
+ {
+ shader_addline(buffer, "%s == 0.0 ? FLT_MAX : inversesqrt(abs(%s)));\n",
+ src_param.param_str, src_param.param_str);
}
}
@@ -2671,10 +2864,11 @@ static void shader_glsl_ret(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;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major,
ins->ctx->reg_maps->shader_version.minor);
+ const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
glsl_sample_function_t sample_function;
DWORD sample_flags = 0;
WINED3DSAMPLER_TEXTURE_TYPE sampler_type;
@@ -2728,7 +2922,7 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
}
- shader_glsl_get_sample_function(sampler_type, sample_flags, &sample_function);
+ shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function);
mask |= sample_function.coord_mask;
if (shader_version < WINED3D_SHADER_VERSION(2,0)) swizzle = WINED3DSP_NOSWIZZLE;
@@ -2762,7 +2956,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 struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = ins->ctx->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;
@@ -2770,7 +2964,7 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
DWORD sampler_idx;
DWORD swizzle = ins->src[1].swizzle;
- if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD] && !gl_info->supported[EXT_GPU_SHADER4])
{
FIXME("texldd used, but not supported by hardware. Falling back to regular tex\n");
return shader_glsl_tex(ins);
@@ -2783,7 +2977,7 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
}
- shader_glsl_get_sample_function(sampler_type, sample_flags, &sample_function);
+ shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function);
shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &coord_param);
shader_glsl_add_src_param(ins, &ins->src[2], sample_function.coord_mask, &dx_param);
shader_glsl_add_src_param(ins, &ins->src[3], sample_function.coord_mask, &dy_param);
@@ -2796,7 +2990,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;
+ const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
glsl_sample_function_t sample_function;
glsl_src_param_t coord_param, lod_param;
DWORD sample_flags = WINED3D_GLSL_SAMPLE_LOD;
@@ -2810,12 +3004,12 @@ static void shader_glsl_texldl(const struct wined3d_shader_instruction *ins)
IWineD3DBaseTexture_GetTextureDimensions(deviceImpl->stateBlock->textures[sampler_idx]) == GL_TEXTURE_RECTANGLE_ARB) {
sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
}
- shader_glsl_get_sample_function(sampler_type, sample_flags, &sample_function);
+ shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function);
shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &coord_param);
shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &lod_param);
- if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD]
+ if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD] && !gl_info->supported[EXT_GPU_SHADER4]
&& 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.
@@ -2877,6 +3071,7 @@ static void shader_glsl_texcoord(const struct wined3d_shader_instruction *ins)
* then perform a 1D texture lookup from stage dstregnum, place into dst. */
static void shader_glsl_texdp3tex(const struct wined3d_shader_instruction *ins)
{
+ const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
glsl_src_param_t src0_param;
glsl_sample_function_t sample_function;
DWORD sampler_idx = ins->dst[0].reg.idx;
@@ -2891,7 +3086,7 @@ static void shader_glsl_texdp3tex(const struct wined3d_shader_instruction *ins)
*
* It is a dependent read - not valid with conditional NP2 textures
*/
- shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
mask_size = shader_glsl_get_write_mask_size(sample_function.coord_mask);
switch(mask_size)
@@ -2990,7 +3185,7 @@ static void shader_glsl_texm3x2pad(const struct wined3d_shader_instruction *ins)
* Calculate the 1st or 2nd row of a 3-row matrix multiplication. */
static void shader_glsl_texm3x3pad(const struct wined3d_shader_instruction *ins)
{
- IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
DWORD reg = ins->dst[0].reg.idx;
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
@@ -3004,6 +3199,7 @@ static void shader_glsl_texm3x3pad(const struct wined3d_shader_instruction *ins)
static void shader_glsl_texm3x2tex(const struct wined3d_shader_instruction *ins)
{
+ const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
DWORD reg = ins->dst[0].reg.idx;
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
@@ -3014,7 +3210,7 @@ static void shader_glsl_texm3x2tex(const struct wined3d_shader_instruction *ins)
shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param);
shader_addline(buffer, "tmp0.y = dot(T%u.xyz, %s);\n", reg, src0_param.param_str);
- shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
/* Sample the texture using the calculated coordinates */
shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xy");
@@ -3025,10 +3221,11 @@ static void shader_glsl_texm3x2tex(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;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
+ const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
glsl_src_param_t src0_param;
DWORD reg = ins->dst[0].reg.idx;
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
- SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[reg];
glsl_sample_function_t sample_function;
@@ -3036,7 +3233,7 @@ static void shader_glsl_texm3x3tex(const struct wined3d_shader_instruction *ins)
shader_addline(ins->ctx->buffer, "tmp0.z = dot(T%u.xyz, %s);\n", reg, src0_param.param_str);
/* Dependent read, not valid with conditional NP2 */
- shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
/* Sample the texture using the calculated coordinates */
shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz");
@@ -3049,11 +3246,11 @@ static void shader_glsl_texm3x3tex(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;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
glsl_src_param_t src0_param;
char dst_mask[6];
DWORD reg = ins->dst[0].reg.idx;
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
- SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param);
@@ -3068,7 +3265,8 @@ static void shader_glsl_texm3x3(const struct wined3d_shader_instruction *ins)
* Perform the final texture lookup based on the previous 2 3x3 matrix multiplies */
static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins)
{
- IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
DWORD reg = ins->dst[0].reg.idx;
glsl_src_param_t src0_param;
glsl_src_param_t src1_param;
@@ -3087,7 +3285,7 @@ static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins
shader_addline(buffer, "tmp0.xyz = -reflect((%s), normalize(tmp0.xyz));\n", src1_param.param_str);
/* Dependent read, not valid with conditional NP2 */
- shader_glsl_get_sample_function(stype, 0, &sample_function);
+ shader_glsl_get_sample_function(gl_info, stype, 0, &sample_function);
/* Sample the texture */
shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz");
@@ -3099,7 +3297,8 @@ static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins
* Perform the final texture lookup based on the previous 2 3x3 matrix multiplies */
static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *ins)
{
- IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
DWORD reg = ins->dst[0].reg.idx;
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
SHADER_PARSE_STATE* current_state = &shader->baseShader.parse_state;
@@ -3119,7 +3318,7 @@ static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *in
shader_addline(buffer, "tmp0.xyz = -reflect(tmp1.xyz, normalize(tmp0.xyz));\n");
/* Dependent read, not valid with conditional NP2 */
- shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
/* Sample the texture using the calculated coordinates */
shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz");
@@ -3133,8 +3332,9 @@ static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *in
*/
static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins)
{
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
- IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
+ const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
glsl_sample_function_t sample_function;
glsl_src_param_t coord_param;
WINED3DSAMPLER_TEXTURE_TYPE sampler_type;
@@ -3148,7 +3348,7 @@ static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins)
sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
/* Dependent read, not valid with conditional NP2 */
- shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
mask = sample_function.coord_mask;
shader_glsl_write_mask_to_str(mask, coord_mask);
@@ -3207,6 +3407,7 @@ static void shader_glsl_bem(const struct wined3d_shader_instruction *ins)
* Sample 2D texture at dst using the alpha & red (wx) components of src as texture coordinates */
static void shader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins)
{
+ const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
glsl_src_param_t src0_param;
DWORD sampler_idx = ins->dst[0].reg.idx;
WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
@@ -3214,7 +3415,7 @@ static void shader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins)
shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_ALL, &src0_param);
- shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL,
"%s.wx", src0_param.reg_name);
}
@@ -3223,6 +3424,7 @@ static void shader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins)
* Sample 2D texture at dst using the green & blue (yz) components of src as texture coordinates */
static void shader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins)
{
+ const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
glsl_src_param_t src0_param;
DWORD sampler_idx = ins->dst[0].reg.idx;
WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
@@ -3230,7 +3432,7 @@ static void shader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins)
shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_ALL, &src0_param);
- shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL,
"%s.yz", src0_param.reg_name);
}
@@ -3239,13 +3441,14 @@ static void shader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins)
* Sample texture at dst using the rgb (xyz) components of src as texture coordinates */
static void shader_glsl_texreg2rgb(const struct wined3d_shader_instruction *ins)
{
+ const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
glsl_src_param_t src0_param;
DWORD sampler_idx = ins->dst[0].reg.idx;
WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
glsl_sample_function_t sample_function;
/* Dependent read, not valid with conditional NP2 */
- shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &src0_param);
shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL,
@@ -3759,6 +3962,10 @@ static GLuint shader_glsl_generate_pshader(const struct wined3d_context *context
*/
shader_addline(buffer, "#extension GL_ARB_texture_rectangle : enable\n");
}
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ {
+ shader_addline(buffer, "#extension GL_EXT_gpu_shader4 : enable\n");
+ }
/* Base Declarations */
shader_generate_glsl_declarations(context, buffer, (IWineD3DBaseShader *)This, reg_maps, &priv_ctx);
@@ -3846,6 +4053,11 @@ static GLuint shader_glsl_generate_vshader(const struct wined3d_context *context
shader_addline(buffer, "#version 120\n");
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ {
+ shader_addline(buffer, "#extension GL_EXT_gpu_shader4 : enable\n");
+ }
+
memset(&priv_ctx, 0, sizeof(priv_ctx));
priv_ctx.cur_vs_args = args;
@@ -4149,7 +4361,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
/* Link the program */
TRACE("Linking GLSL shader program %u\n", programId);
GL_EXTCALL(glLinkProgramARB(programId));
- print_glsl_info_log(gl_info, programId);
+ shader_glsl_validate_link(gl_info, programId);
entry->vuniformF_locations = HeapAlloc(GetProcessHeap(), 0,
sizeof(GLhandleARB) * gl_info->limits.glsl_vs_float_constants);
@@ -4230,10 +4442,12 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
* load them now to have them hardcoded in the GLSL program. This saves some CPU cycles
* later
*/
- if(pshader && !((IWineD3DPixelShaderImpl*)pshader)->baseShader.load_local_constsF) {
+ if (pshader && !((IWineD3DBaseShaderImpl *)pshader)->baseShader.load_local_constsF)
+ {
hardcode_local_constants((IWineD3DBaseShaderImpl *) pshader, gl_info, programId, 'P');
}
- if(vshader && !((IWineD3DVertexShaderImpl*)vshader)->baseShader.load_local_constsF) {
+ if (vshader && !((IWineD3DBaseShaderImpl *)vshader)->baseShader.load_local_constsF)
+ {
hardcode_local_constants((IWineD3DBaseShaderImpl *) vshader, gl_info, programId, 'V');
}
}
@@ -4303,7 +4517,7 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info,
GL_EXTCALL(glAttachObjectARB(program_id, pshader_id));
GL_EXTCALL(glLinkProgramARB(program_id));
- print_glsl_info_log(gl_info, program_id);
+ shader_glsl_validate_link(gl_info, program_id);
/* Once linked we can mark the shaders for deletion. They will be deleted once the program
* is destroyed
@@ -4394,8 +4608,6 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)This->baseShader.device;
struct shader_glsl_priv *priv = device->shader_priv;
const struct wined3d_gl_info *gl_info;
- IWineD3DPixelShaderImpl *ps = NULL;
- IWineD3DVertexShaderImpl *vs = NULL;
struct wined3d_context *context;
/* Note: Do not use QueryInterface here to find out which shader type this is because this code
@@ -4405,12 +4617,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
if(pshader) {
struct glsl_pshader_private *shader_data;
- ps = (IWineD3DPixelShaderImpl *) This;
- shader_data = ps->baseShader.backend_data;
+ shader_data = This->baseShader.backend_data;
if(!shader_data || shader_data->num_gl_shaders == 0)
{
HeapFree(GetProcessHeap(), 0, shader_data);
- ps->baseShader.backend_data = NULL;
+ This->baseShader.backend_data = NULL;
return;
}
@@ -4425,12 +4636,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
}
} else {
struct glsl_vshader_private *shader_data;
- vs = (IWineD3DVertexShaderImpl *) This;
- shader_data = vs->baseShader.backend_data;
+ shader_data = This->baseShader.backend_data;
if(!shader_data || shader_data->num_gl_shaders == 0)
{
HeapFree(GetProcessHeap(), 0, shader_data);
- vs->baseShader.backend_data = NULL;
+ This->baseShader.backend_data = NULL;
return;
}
@@ -4466,7 +4676,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
if(pshader) {
UINT i;
- struct glsl_pshader_private *shader_data = ps->baseShader.backend_data;
+ struct glsl_pshader_private *shader_data = This->baseShader.backend_data;
ENTER_GL();
for(i = 0; i < shader_data->num_gl_shaders; i++) {
@@ -4476,11 +4686,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
}
LEAVE_GL();
HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
- HeapFree(GetProcessHeap(), 0, shader_data);
- ps->baseShader.backend_data = NULL;
- } else {
+ }
+ else
+ {
UINT i;
- struct glsl_vshader_private *shader_data = vs->baseShader.backend_data;
+ struct glsl_vshader_private *shader_data = This->baseShader.backend_data;
ENTER_GL();
for(i = 0; i < shader_data->num_gl_shaders; i++) {
@@ -4490,10 +4700,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
}
LEAVE_GL();
HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
- HeapFree(GetProcessHeap(), 0, shader_data);
- vs->baseShader.backend_data = NULL;
}
+ HeapFree(GetProcessHeap(), 0, This->baseShader.backend_data);
+ This->baseShader.backend_data = NULL;
+
context_release(context);
}
@@ -4632,8 +4843,7 @@ static BOOL shader_glsl_dirty_const(IWineD3DDevice *iface) {
return FALSE;
}
-static void shader_glsl_get_caps(WINED3DDEVTYPE devtype,
- const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps)
+static void shader_glsl_get_caps(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 based
@@ -4697,7 +4907,7 @@ static BOOL shader_glsl_color_fixup_supported(struct color_fixup_desc fixup)
}
/* We support everything except YUV conversions. */
- if (!is_yuv_fixup(fixup))
+ if (!is_complex_fixup(fixup))
{
TRACE("[OK]\n");
return TRUE;
@@ -4720,6 +4930,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB
/* WINED3DSIH_CMP */ shader_glsl_cmp,
/* WINED3DSIH_CND */ shader_glsl_cnd,
/* WINED3DSIH_CRS */ shader_glsl_cross,
+ /* WINED3DSIH_CUT */ NULL,
/* WINED3DSIH_DCL */ NULL,
/* WINED3DSIH_DEF */ NULL,
/* WINED3DSIH_DEFB */ NULL,
@@ -4731,20 +4942,24 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB
/* WINED3DSIH_DSX */ shader_glsl_map2gl,
/* WINED3DSIH_DSY */ shader_glsl_map2gl,
/* WINED3DSIH_ELSE */ shader_glsl_else,
+ /* WINED3DSIH_EMIT */ NULL,
/* WINED3DSIH_ENDIF */ shader_glsl_end,
/* WINED3DSIH_ENDLOOP */ shader_glsl_end,
/* WINED3DSIH_ENDREP */ shader_glsl_end,
/* WINED3DSIH_EXP */ shader_glsl_map2gl,
/* WINED3DSIH_EXPP */ shader_glsl_expp,
/* WINED3DSIH_FRC */ shader_glsl_map2gl,
+ /* WINED3DSIH_IADD */ NULL,
/* WINED3DSIH_IF */ shader_glsl_if,
/* WINED3DSIH_IFC */ shader_glsl_ifc,
+ /* WINED3DSIH_IGE */ NULL,
/* WINED3DSIH_LABEL */ shader_glsl_label,
/* WINED3DSIH_LIT */ shader_glsl_lit,
/* WINED3DSIH_LOG */ shader_glsl_log,
/* WINED3DSIH_LOGP */ shader_glsl_log,
/* WINED3DSIH_LOOP */ shader_glsl_loop,
/* WINED3DSIH_LRP */ shader_glsl_lrp,
+ /* WINED3DSIH_LT */ NULL,
/* WINED3DSIH_M3x2 */ shader_glsl_mnxn,
/* WINED3DSIH_M3x3 */ shader_glsl_mnxn,
/* WINED3DSIH_M3x4 */ shader_glsl_mnxn,
@@ -4757,7 +4972,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB
/* WINED3DSIH_MOVA */ shader_glsl_mov,
/* WINED3DSIH_MUL */ shader_glsl_arith,
/* WINED3DSIH_NOP */ NULL,
- /* WINED3DSIH_NRM */ shader_glsl_map2gl,
+ /* WINED3DSIH_NRM */ shader_glsl_nrm,
/* WINED3DSIH_PHASE */ NULL,
/* WINED3DSIH_POW */ shader_glsl_pow,
/* WINED3DSIH_RCP */ shader_glsl_rcp,
diff --git a/dll/directx/wine/wined3d/nvidia_texture_shader.c b/dll/directx/wine/wined3d/nvidia_texture_shader.c
index 82a71dab3b9..64bb883d6c8 100644
--- a/dll/directx/wine/wined3d/nvidia_texture_shader.c
+++ b/dll/directx/wine/wined3d/nvidia_texture_shader.c
@@ -627,8 +627,7 @@ static void nvts_enable(IWineD3DDevice *iface, BOOL enable) {
LEAVE_GL();
}
-static void nvrc_fragment_get_caps(WINED3DDEVTYPE devtype,
- const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
+static void nvrc_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
{
pCaps->TextureOpCaps = WINED3DTEXOPCAPS_ADD |
WINED3DTEXOPCAPS_ADDSIGNED |
@@ -671,7 +670,7 @@ static void nvrc_fragment_get_caps(WINED3DDEVTYPE devtype,
WINED3DTEXOPCAPS_PREMODULATE */
#endif
- pCaps->MaxTextureBlendStages = gl_info->limits.texture_stages;
+ pCaps->MaxTextureBlendStages = min(MAX_TEXTURES, gl_info->limits.general_combiners);
pCaps->MaxSimultaneousTextures = gl_info->limits.textures;
pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_TSSARGTEMP;
diff --git a/dll/directx/wine/wined3d/query.c b/dll/directx/wine/wined3d/query.c
index 1280a3b629d..3860e2c95b5 100644
--- a/dll/directx/wine/wined3d/query.c
+++ b/dll/directx/wine/wined3d/query.c
@@ -24,15 +24,164 @@
#include "config.h"
#include "wined3d_private.h"
+WINE_DEFAULT_DEBUG_CHANNEL(d3d);
+#define GLINFO_LOCATION (*gl_info)
+
+static HRESULT wined3d_event_query_init(const struct wined3d_gl_info *gl_info, struct wined3d_event_query **query)
+{
+ struct wined3d_event_query *ret;
+ *query = NULL;
+ if (!gl_info->supported[ARB_SYNC] && !gl_info->supported[NV_FENCE]
+ && !gl_info->supported[APPLE_FENCE]) return E_NOTIMPL;
+
+ ret = HeapAlloc(GetProcessHeap(), 0, sizeof(*ret));
+ if (!ret)
+ {
+ ERR("Failed to allocate a wined3d event query structure.\n");
+ return E_OUTOFMEMORY;
+ }
+ ret->context = NULL;
+ *query = ret;
+ return WINED3D_OK;
+}
+
+static void wined3d_event_query_destroy(struct wined3d_event_query *query)
+{
+ if (query->context) context_free_event_query(query);
+ HeapFree(GetProcessHeap(), 0, query);
+}
+
+static enum wined3d_event_query_result wined3d_event_query_test(struct wined3d_event_query *query, IWineD3DDeviceImpl *device)
+{
+ struct wined3d_context *context;
+ const struct wined3d_gl_info *gl_info;
+ enum wined3d_event_query_result ret;
+ BOOL fence_result;
+
+ TRACE("(%p) : device %p\n", query, device);
+
+ if (query->context == NULL)
+ {
+ TRACE("Query not started\n");
+ return WINED3D_EVENT_QUERY_NOT_STARTED;
+ }
+
+ if (!query->context->gl_info->supported[ARB_SYNC] && query->context->tid != GetCurrentThreadId())
+ {
+ WARN("Event query tested from wrong thread\n");
+ return WINED3D_EVENT_QUERY_WRONG_THREAD;
+ }
+
+ context = context_acquire(device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+ gl_info = context->gl_info;
+
+ ENTER_GL();
+
+ if (gl_info->supported[ARB_SYNC])
+ {
+ GLenum gl_ret = GL_EXTCALL(glClientWaitSync(query->object.sync, 0, 0));
+ checkGLcall("glClientWaitSync");
+
+ switch (gl_ret)
+ {
+ case GL_ALREADY_SIGNALED:
+ case GL_CONDITION_SATISFIED:
+ ret = WINED3D_EVENT_QUERY_OK;
+ break;
+
+ case GL_TIMEOUT_EXPIRED:
+ ret = WINED3D_EVENT_QUERY_WAITING;
+ break;
+
+ case GL_WAIT_FAILED:
+ default:
+ ERR("glClientWaitSync returned %#x.\n", gl_ret);
+ ret = WINED3D_EVENT_QUERY_ERROR;
+ }
+ }
+ else if (gl_info->supported[APPLE_FENCE])
+ {
+ fence_result = GL_EXTCALL(glTestFenceAPPLE(query->object.id));
+ checkGLcall("glTestFenceAPPLE");
+ if (fence_result) ret = WINED3D_EVENT_QUERY_OK;
+ else ret = WINED3D_EVENT_QUERY_WAITING;
+ }
+ else if (gl_info->supported[NV_FENCE])
+ {
+ fence_result = GL_EXTCALL(glTestFenceNV(query->object.id));
+ checkGLcall("glTestFenceNV");
+ if (fence_result) ret = WINED3D_EVENT_QUERY_OK;
+ else ret = WINED3D_EVENT_QUERY_WAITING;
+ }
+ else
+ {
+ ERR("Event query created despite lack of GL support\n");
+ ret = WINED3D_EVENT_QUERY_ERROR;
+ }
+
+ LEAVE_GL();
+
+ context_release(context);
+ return ret;
+}
+
+static void wined3d_event_query_issue(struct wined3d_event_query *query, IWineD3DDeviceImpl *device)
+{
+ const struct wined3d_gl_info *gl_info;
+ struct wined3d_context *context;
+
+ if (query->context)
+ {
+ if (!query->context->gl_info->supported[ARB_SYNC] && query->context->tid != GetCurrentThreadId())
+ {
+ context_free_event_query(query);
+ context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context_alloc_event_query(context, query);
+ }
+ else
+ {
+ context = context_acquire(device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+ }
+ }
+ else
+ {
+ context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context_alloc_event_query(context, query);
+ }
+
+ gl_info = context->gl_info;
+
+ ENTER_GL();
+
+ if (gl_info->supported[ARB_SYNC])
+ {
+ if (query->object.sync) GL_EXTCALL(glDeleteSync(query->object.sync));
+ checkGLcall("glDeleteSync");
+ query->object.sync = GL_EXTCALL(glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0));
+ checkGLcall("glFenceSync");
+ }
+ else if (gl_info->supported[APPLE_FENCE])
+ {
+ GL_EXTCALL(glSetFenceAPPLE(query->object.id));
+ checkGLcall("glSetFenceAPPLE");
+ }
+ else if (gl_info->supported[NV_FENCE])
+ {
+ GL_EXTCALL(glSetFenceNV(query->object.id, GL_ALL_COMPLETED_NV));
+ checkGLcall("glSetFenceNV");
+ }
+
+ LEAVE_GL();
+
+ context_release(context);
+}
+
/*
* Occlusion Queries:
* http://www.gris.uni-tuebingen.de/~bartz/Publications/paper/hww98.pdf
* http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt
*/
-WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION This->device->adapter->gl_info
-
/* *******************************************
IWineD3DQuery IUnknown parts follow
******************************************* */
@@ -70,17 +219,16 @@ static ULONG WINAPI IWineD3DQueryImpl_Release(IWineD3DQuery *iface) {
if (This->type == WINED3DQUERYTYPE_EVENT)
{
struct wined3d_event_query *query = This->extendedData;
-
- if (query->context) context_free_event_query(query);
+ if (query) wined3d_event_query_destroy(query);
}
else if (This->type == WINED3DQUERYTYPE_OCCLUSION)
{
struct wined3d_occlusion_query *query = This->extendedData;
if (query->context) context_free_occlusion_query(query);
+ HeapFree(GetProcessHeap(), 0, This->extendedData);
}
- HeapFree(GetProcessHeap(), 0, This->extendedData);
HeapFree(GetProcessHeap(), 0, This);
}
return ref;
@@ -101,168 +249,6 @@ static HRESULT WINAPI IWineD3DQueryImpl_GetParent(IWineD3DQuery *iface, IUnknown
return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pData, DWORD dwSize, DWORD dwGetDataFlags){
- IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
- HRESULT res = S_OK;
-
- TRACE("(%p) : type %#x, pData %p, dwSize %#x, dwGetDataFlags %#x\n", This, This->type, pData, dwSize, dwGetDataFlags);
-
- switch (This->type){
-
- case WINED3DQUERYTYPE_VCACHE:
- {
-
- WINED3DDEVINFO_VCACHE *data = pData;
- FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_VCACHE\n", This);
- if(pData == NULL || dwSize == 0) break;
- data->Pattern = WINEMAKEFOURCC('C','A','C','H');
- data->OptMethod = 0; /*0 get longest strips, 1 optimize vertex cache*/
- data->CacheSize = 0; /*cache size, only required if OptMethod == 1*/
- data->MagicNumber = 0; /*only required if OptMethod == 1 (used internally)*/
-
- }
- break;
- case WINED3DQUERYTYPE_RESOURCEMANAGER:
- {
- WINED3DDEVINFO_RESOURCEMANAGER *data = pData;
- int i;
- FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_RESOURCEMANAGER\n", This);
- if(pData == NULL || dwSize == 0) break;
- for(i = 0; i < WINED3DRTYPECOUNT; i++){
- /*I'm setting the default values to 1 so as to reduce the risk of a div/0 in the caller*/
- /* isTextureResident could be used to get some of this information */
- data->stats[i].bThrashing = FALSE;
- data->stats[i].ApproxBytesDownloaded = 1;
- data->stats[i].NumEvicts = 1;
- data->stats[i].NumVidCreates = 1;
- data->stats[i].LastPri = 1;
- data->stats[i].NumUsed = 1;
- data->stats[i].NumUsedInVidMem = 1;
- data->stats[i].WorkingSet = 1;
- data->stats[i].WorkingSetBytes = 1;
- data->stats[i].TotalManaged = 1;
- data->stats[i].TotalBytes = 1;
- }
-
- }
- break;
- case WINED3DQUERYTYPE_VERTEXSTATS:
- {
- WINED3DDEVINFO_VERTEXSTATS *data = pData;
- FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_VERTEXSTATS\n", This);
- if(pData == NULL || dwSize == 0) break;
- data->NumRenderedTriangles = 1;
- data->NumExtraClippingTriangles = 1;
-
- }
- break;
- case WINED3DQUERYTYPE_TIMESTAMP:
- {
- UINT64* data = pData;
- FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_TIMESTAMP\n", This);
- if(pData == NULL || dwSize == 0) break;
- *data = 1; /*Don't know what this is supposed to be*/
- }
- break;
- case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
- {
- BOOL* data = pData;
- FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_TIMESTAMPDISJOINT\n", This);
- if(pData == NULL || dwSize == 0) break;
- *data = FALSE; /*Don't know what this is supposed to be*/
- }
- break;
- case WINED3DQUERYTYPE_TIMESTAMPFREQ:
- {
- UINT64* data = pData;
- FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_TIMESTAMPFREQ\n", This);
- if(pData == NULL || dwSize == 0) break;
- *data = 1; /*Don't know what this is supposed to be*/
- }
- break;
- case WINED3DQUERYTYPE_PIPELINETIMINGS:
- {
- WINED3DDEVINFO_PIPELINETIMINGS *data = pData;
- FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_PIPELINETIMINGS\n", This);
- if(pData == NULL || dwSize == 0) break;
-
- data->VertexProcessingTimePercent = 1.0f;
- data->PixelProcessingTimePercent = 1.0f;
- data->OtherGPUProcessingTimePercent = 97.0f;
- data->GPUIdleTimePercent = 1.0f;
- }
- break;
- case WINED3DQUERYTYPE_INTERFACETIMINGS:
- {
- WINED3DDEVINFO_INTERFACETIMINGS *data = pData;
- FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_INTERFACETIMINGS\n", This);
-
- if(pData == NULL || dwSize == 0) break;
- data->WaitingForGPUToUseApplicationResourceTimePercent = 1.0f;
- data->WaitingForGPUToAcceptMoreCommandsTimePercent = 1.0f;
- data->WaitingForGPUToStayWithinLatencyTimePercent = 1.0f;
- data->WaitingForGPUExclusiveResourceTimePercent = 1.0f;
- data->WaitingForGPUOtherTimePercent = 96.0f;
- }
-
- break;
- case WINED3DQUERYTYPE_VERTEXTIMINGS:
- {
- WINED3DDEVINFO_STAGETIMINGS *data = pData;
- FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_VERTEXTIMINGS\n", This);
-
- if(pData == NULL || dwSize == 0) break;
- data->MemoryProcessingPercent = 50.0f;
- data->ComputationProcessingPercent = 50.0f;
-
- }
- break;
- case WINED3DQUERYTYPE_PIXELTIMINGS:
- {
- WINED3DDEVINFO_STAGETIMINGS *data = pData;
- FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_PIXELTIMINGS\n", This);
-
- if(pData == NULL || dwSize == 0) break;
- data->MemoryProcessingPercent = 50.0f;
- data->ComputationProcessingPercent = 50.0f;
- }
- break;
- case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
- {
- WINED3DDEVINFO_BANDWIDTHTIMINGS *data = pData;
- FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_BANDWIDTHTIMINGS\n", This);
-
- if(pData == NULL || dwSize == 0) break;
- data->MaxBandwidthUtilized = 1.0f;
- data->FrontEndUploadMemoryUtilizedPercent = 1.0f;
- data->VertexRateUtilizedPercent = 1.0f;
- data->TriangleSetupRateUtilizedPercent = 1.0f;
- data->FillRateUtilizedPercent = 97.0f;
- }
- break;
- case WINED3DQUERYTYPE_CACHEUTILIZATION:
- {
- WINED3DDEVINFO_CACHEUTILIZATION *data = pData;
- FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_CACHEUTILIZATION\n", This);
-
- if(pData == NULL || dwSize == 0) break;
- data->TextureCacheHitRate = 1.0f;
- data->PostTransformVertexCacheHitRate = 1.0f;
- }
-
-
- break;
- default:
- FIXME("(%p) Unhandled query type %d\n",This , This->type);
-
- };
-
- /*dwGetDataFlags = 0 || D3DGETDATA_FLUSH
- D3DGETDATA_FLUSH may return WINED3DERR_DEVICELOST if the device is lost
- */
- return res; /* S_OK if the query data is available*/
-}
-
static HRESULT WINAPI IWineD3DOcclusionQueryImpl_GetData(IWineD3DQuery* iface, void* pData, DWORD dwSize, DWORD dwGetDataFlags) {
IWineD3DQueryImpl *This = (IWineD3DQueryImpl *) iface;
struct wined3d_occlusion_query *query = This->extendedData;
@@ -341,108 +327,44 @@ 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;
- struct wined3d_context *context;
BOOL *data = pData;
+ enum wined3d_event_query_result ret;
TRACE("(%p) : type D3DQUERY_EVENT, pData %p, dwSize %#x, dwGetDataFlags %#x\n", This, pData, dwSize, dwGetDataFlags);
if (!pData || !dwSize) return S_OK;
-
- if (!query->context)
+ if (!query)
{
- TRACE("Query not started, returning TRUE.\n");
+ WARN("(%p): Event query not supported by GL, reporting GPU idle\n", This);
*data = TRUE;
-
return S_OK;
}
- if (query->context->tid != GetCurrentThreadId())
+ ret = wined3d_event_query_test(query, This->device);
+ switch(ret)
{
- /* See comment in IWineD3DQuery::Issue, event query codeblock */
- FIXME("Wrong thread, reporting GPU idle.\n");
- *data = TRUE;
+ case WINED3D_EVENT_QUERY_OK:
+ case WINED3D_EVENT_QUERY_NOT_STARTED:
+ *data = TRUE;
+ break;
- return S_OK;
+ case WINED3D_EVENT_QUERY_WAITING:
+ *data = FALSE;
+ break;
+
+ case WINED3D_EVENT_QUERY_WRONG_THREAD:
+ FIXME("(%p) Wrong thread, reporting GPU idle.\n", This);
+ *data = TRUE;
+ break;
+
+ case WINED3D_EVENT_QUERY_ERROR:
+ ERR("The GL event query failed, returning D3DERR_INVALIDCALL\n");
+ return WINED3DERR_INVALIDCALL;
}
- context = context_acquire(This->device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
-
- ENTER_GL();
-
- if (context->gl_info->supported[APPLE_FENCE])
- {
- *data = GL_EXTCALL(glTestFenceAPPLE(query->id));
- checkGLcall("glTestFenceAPPLE");
- }
- else if (context->gl_info->supported[NV_FENCE])
- {
- *data = GL_EXTCALL(glTestFenceNV(query->id));
- checkGLcall("glTestFenceNV");
- }
- else
- {
- WARN("(%p): reporting GPU idle\n", This);
- *data = TRUE;
- }
-
- LEAVE_GL();
-
- context_release(context);
-
return S_OK;
}
-static DWORD WINAPI IWineD3DQueryImpl_GetDataSize(IWineD3DQuery* iface){
- IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
- int dataSize = 0;
- TRACE("(%p) : type %#x\n", This, This->type);
- switch(This->type){
- case WINED3DQUERYTYPE_VCACHE:
- dataSize = sizeof(WINED3DDEVINFO_VCACHE);
- break;
- case WINED3DQUERYTYPE_RESOURCEMANAGER:
- dataSize = sizeof(WINED3DDEVINFO_RESOURCEMANAGER);
- break;
- case WINED3DQUERYTYPE_VERTEXSTATS:
- dataSize = sizeof(WINED3DDEVINFO_VERTEXSTATS);
- break;
- case WINED3DQUERYTYPE_EVENT:
- dataSize = sizeof(BOOL);
- break;
- case WINED3DQUERYTYPE_TIMESTAMP:
- dataSize = sizeof(UINT64);
- break;
- case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
- dataSize = sizeof(BOOL);
- break;
- case WINED3DQUERYTYPE_TIMESTAMPFREQ:
- dataSize = sizeof(UINT64);
- break;
- case WINED3DQUERYTYPE_PIPELINETIMINGS:
- dataSize = sizeof(WINED3DDEVINFO_PIPELINETIMINGS);
- break;
- case WINED3DQUERYTYPE_INTERFACETIMINGS:
- dataSize = sizeof(WINED3DDEVINFO_INTERFACETIMINGS);
- break;
- case WINED3DQUERYTYPE_VERTEXTIMINGS:
- dataSize = sizeof(WINED3DDEVINFO_STAGETIMINGS);
- break;
- case WINED3DQUERYTYPE_PIXELTIMINGS:
- dataSize = sizeof(WINED3DDEVINFO_STAGETIMINGS);
- break;
- case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
- dataSize = sizeof(WINED3DQUERYTYPE_BANDWIDTHTIMINGS);
- break;
- case WINED3DQUERYTYPE_CACHEUTILIZATION:
- dataSize = sizeof(WINED3DDEVINFO_CACHEUTILIZATION);
- break;
- default:
- FIXME("(%p) Unhandled query type %d\n",This , This->type);
- dataSize = 0;
- }
- return dataSize;
-}
-
static DWORD WINAPI IWineD3DEventQueryImpl_GetDataSize(IWineD3DQuery* iface){
TRACE("(%p) : type D3DQUERY_EVENT\n", iface);
@@ -460,7 +382,6 @@ static WINED3DQUERYTYPE WINAPI IWineD3DQueryImpl_GetType(IWineD3DQuery* iface){
return This->type;
}
-
static HRESULT WINAPI IWineD3DEventQueryImpl_Issue(IWineD3DQuery* iface, DWORD dwIssueFlags) {
IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
@@ -468,43 +389,11 @@ static HRESULT WINAPI IWineD3DEventQueryImpl_Issue(IWineD3DQuery* iface, DWORD
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 = context_acquire(This->device, NULL, CTXUSAGE_RESOURCELOAD);
- context_alloc_event_query(context, query);
- }
- else
- {
- context = context_acquire(This->device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
- }
- }
- else
- {
- context = context_acquire(This->device, NULL, CTXUSAGE_RESOURCELOAD);
- context_alloc_event_query(context, query);
- }
+ /* Faked event query support */
+ if (!query) return WINED3D_OK;
- ENTER_GL();
-
- if (context->gl_info->supported[APPLE_FENCE])
- {
- GL_EXTCALL(glSetFenceAPPLE(query->id));
- checkGLcall("glSetFenceAPPLE");
- }
- else if (context->gl_info->supported[NV_FENCE])
- {
- GL_EXTCALL(glSetFenceNV(query->id, GL_ALL_COMPLETED_NV));
- checkGLcall("glSetFenceNV");
- }
-
- LEAVE_GL();
-
- context_release(context);
+ wined3d_event_query_issue(query, This->device);
}
else if(dwIssueFlags & WINED3DISSUE_BEGIN)
{
@@ -604,43 +493,7 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_Issue(IWineD3DQuery* iface, D
return WINED3D_OK; /* can be WINED3DERR_INVALIDCALL. */
}
-static HRESULT WINAPI IWineD3DQueryImpl_Issue(IWineD3DQuery* iface, DWORD dwIssueFlags){
- IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
-
- TRACE("(%p) : dwIssueFlags %#x, type %#x\n", This, dwIssueFlags, This->type);
-
- /* The fixme is printed when the app asks for the resulting data */
- WARN("(%p) : Unhandled query type %#x\n", This, This->type);
-
- if(dwIssueFlags & WINED3DISSUE_BEGIN) {
- This->state = QUERY_BUILDING;
- } else {
- This->state = QUERY_SIGNALLED;
- }
-
- return WINED3D_OK; /* can be WINED3DERR_INVALIDCALL. */
-}
-
-
-/**********************************************************
- * IWineD3DQuery VTbl follows
- **********************************************************/
-
-const IWineD3DQueryVtbl IWineD3DQuery_Vtbl =
-{
- /*** IUnknown methods ***/
- IWineD3DQueryImpl_QueryInterface,
- IWineD3DQueryImpl_AddRef,
- IWineD3DQueryImpl_Release,
- /*** IWineD3Dquery methods ***/
- IWineD3DQueryImpl_GetParent,
- IWineD3DQueryImpl_GetData,
- IWineD3DQueryImpl_GetDataSize,
- IWineD3DQueryImpl_GetType,
- IWineD3DQueryImpl_Issue
-};
-
-const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl =
+static const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl =
{
/*** IUnknown methods ***/
IWineD3DQueryImpl_QueryInterface,
@@ -654,7 +507,7 @@ const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl =
IWineD3DEventQueryImpl_Issue
};
-const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl =
+static const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl =
{
/*** IUnknown methods ***/
IWineD3DQueryImpl_QueryInterface,
@@ -667,3 +520,72 @@ const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl =
IWineD3DQueryImpl_GetType,
IWineD3DOcclusionQueryImpl_Issue
};
+
+HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device,
+ WINED3DQUERYTYPE type, IUnknown *parent)
+{
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ HRESULT hr;
+
+ switch (type)
+ {
+ case WINED3DQUERYTYPE_OCCLUSION:
+ TRACE("Occlusion query.\n");
+ if (!gl_info->supported[ARB_OCCLUSION_QUERY])
+ {
+ WARN("Unsupported in local OpenGL implementation: ARB_OCCLUSION_QUERY.\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ query->lpVtbl = &IWineD3DOcclusionQuery_Vtbl;
+ query->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_occlusion_query));
+ if (!query->extendedData)
+ {
+ ERR("Failed to allocate occlusion query extended data.\n");
+ return E_OUTOFMEMORY;
+ }
+ ((struct wined3d_occlusion_query *)query->extendedData)->context = NULL;
+ break;
+
+ case WINED3DQUERYTYPE_EVENT:
+ TRACE("Event query.\n");
+ query->lpVtbl = &IWineD3DEventQuery_Vtbl;
+ hr = wined3d_event_query_init(gl_info, (struct wined3d_event_query **) &query->extendedData);
+ if (hr == E_NOTIMPL)
+ {
+ /* Half-Life 2 needs this query. It does not render the main
+ * menu correctly otherwise. Pretend to support it, faking
+ * this query does not do much harm except potentially
+ * lowering performance. */
+ FIXME("Event query: Unimplemented, but pretending to be supported.\n");
+ }
+ else if(FAILED(hr))
+ {
+ return hr;
+ }
+ break;
+
+ case WINED3DQUERYTYPE_VCACHE:
+ case WINED3DQUERYTYPE_RESOURCEMANAGER:
+ case WINED3DQUERYTYPE_VERTEXSTATS:
+ case WINED3DQUERYTYPE_TIMESTAMP:
+ case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
+ case WINED3DQUERYTYPE_TIMESTAMPFREQ:
+ case WINED3DQUERYTYPE_PIPELINETIMINGS:
+ case WINED3DQUERYTYPE_INTERFACETIMINGS:
+ case WINED3DQUERYTYPE_VERTEXTIMINGS:
+ case WINED3DQUERYTYPE_PIXELTIMINGS:
+ case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
+ case WINED3DQUERYTYPE_CACHEUTILIZATION:
+ default:
+ FIXME("Unhandled query type %#x.\n", type);
+ return WINED3DERR_NOTAVAILABLE;
+ }
+
+ query->type = type;
+ query->state = QUERY_CREATED;
+ query->device = device;
+ query->parent = parent;
+ query->ref = 1;
+
+ return WINED3D_OK;
+}
diff --git a/dll/directx/wine/wined3d/shader.c b/dll/directx/wine/wined3d/shader.c
index 398ea641835..307cadf804c 100644
--- a/dll/directx/wine/wined3d/shader.c
+++ b/dll/directx/wine/wined3d/shader.c
@@ -26,10 +26,1433 @@
#include
#include
+#include
#include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
+WINE_DECLARE_DEBUG_CHANNEL(d3d);
+
+static const char *shader_opcode_names[] =
+{
+ /* WINED3DSIH_ABS */ "abs",
+ /* WINED3DSIH_ADD */ "add",
+ /* WINED3DSIH_BEM */ "bem",
+ /* WINED3DSIH_BREAK */ "break",
+ /* WINED3DSIH_BREAKC */ "breakc",
+ /* WINED3DSIH_BREAKP */ "breakp",
+ /* WINED3DSIH_CALL */ "call",
+ /* WINED3DSIH_CALLNZ */ "callnz",
+ /* WINED3DSIH_CMP */ "cmp",
+ /* WINED3DSIH_CND */ "cnd",
+ /* WINED3DSIH_CRS */ "crs",
+ /* WINED3DSIH_CUT */ "cut",
+ /* WINED3DSIH_DCL */ "dcl",
+ /* WINED3DSIH_DEF */ "def",
+ /* WINED3DSIH_DEFB */ "defb",
+ /* WINED3DSIH_DEFI */ "defi",
+ /* WINED3DSIH_DP2ADD */ "dp2add",
+ /* WINED3DSIH_DP3 */ "dp3",
+ /* WINED3DSIH_DP4 */ "dp4",
+ /* WINED3DSIH_DST */ "dst",
+ /* WINED3DSIH_DSX */ "dsx",
+ /* WINED3DSIH_DSY */ "dsy",
+ /* WINED3DSIH_ELSE */ "else",
+ /* WINED3DSIH_EMIT */ "emit",
+ /* WINED3DSIH_ENDIF */ "endif",
+ /* WINED3DSIH_ENDLOOP */ "endloop",
+ /* WINED3DSIH_ENDREP */ "endrep",
+ /* WINED3DSIH_EXP */ "exp",
+ /* WINED3DSIH_EXPP */ "expp",
+ /* WINED3DSIH_FRC */ "frc",
+ /* WINED3DSIH_IADD */ "iadd",
+ /* WINED3DSIH_IF */ "if",
+ /* WINED3DSIH_IFC */ "ifc",
+ /* WINED3DSIH_IGE */ "ige",
+ /* WINED3DSIH_LABEL */ "label",
+ /* WINED3DSIH_LIT */ "lit",
+ /* WINED3DSIH_LOG */ "log",
+ /* WINED3DSIH_LOGP */ "logp",
+ /* WINED3DSIH_LOOP */ "loop",
+ /* WINED3DSIH_LRP */ "lrp",
+ /* WINED3DSIH_LT */ "lt",
+ /* WINED3DSIH_M3x2 */ "m3x2",
+ /* WINED3DSIH_M3x3 */ "m3x3",
+ /* WINED3DSIH_M3x4 */ "m3x4",
+ /* WINED3DSIH_M4x3 */ "m4x3",
+ /* WINED3DSIH_M4x4 */ "m4x4",
+ /* WINED3DSIH_MAD */ "mad",
+ /* WINED3DSIH_MAX */ "max",
+ /* WINED3DSIH_MIN */ "min",
+ /* WINED3DSIH_MOV */ "mov",
+ /* WINED3DSIH_MOVA */ "mova",
+ /* WINED3DSIH_MUL */ "mul",
+ /* WINED3DSIH_NOP */ "nop",
+ /* WINED3DSIH_NRM */ "nrm",
+ /* WINED3DSIH_PHASE */ "phase",
+ /* WINED3DSIH_POW */ "pow",
+ /* WINED3DSIH_RCP */ "rcp",
+ /* WINED3DSIH_REP */ "rep",
+ /* WINED3DSIH_RET */ "ret",
+ /* WINED3DSIH_RSQ */ "rsq",
+ /* WINED3DSIH_SETP */ "setp",
+ /* WINED3DSIH_SGE */ "sge",
+ /* WINED3DSIH_SGN */ "sgn",
+ /* WINED3DSIH_SINCOS */ "sincos",
+ /* WINED3DSIH_SLT */ "slt",
+ /* WINED3DSIH_SUB */ "sub",
+ /* WINED3DSIH_TEX */ "texld",
+ /* WINED3DSIH_TEXBEM */ "texbem",
+ /* WINED3DSIH_TEXBEML */ "texbeml",
+ /* WINED3DSIH_TEXCOORD */ "texcrd",
+ /* WINED3DSIH_TEXDEPTH */ "texdepth",
+ /* WINED3DSIH_TEXDP3 */ "texdp3",
+ /* WINED3DSIH_TEXDP3TEX */ "texdp3tex",
+ /* WINED3DSIH_TEXKILL */ "texkill",
+ /* WINED3DSIH_TEXLDD */ "texldd",
+ /* WINED3DSIH_TEXLDL */ "texldl",
+ /* WINED3DSIH_TEXM3x2DEPTH */ "texm3x2depth",
+ /* WINED3DSIH_TEXM3x2PAD */ "texm3x2pad",
+ /* WINED3DSIH_TEXM3x2TEX */ "texm3x2tex",
+ /* WINED3DSIH_TEXM3x3 */ "texm3x3",
+ /* WINED3DSIH_TEXM3x3DIFF */ "texm3x3diff",
+ /* WINED3DSIH_TEXM3x3PAD */ "texm3x3pad",
+ /* WINED3DSIH_TEXM3x3SPEC */ "texm3x3spec",
+ /* WINED3DSIH_TEXM3x3TEX */ "texm3x3tex",
+ /* WINED3DSIH_TEXM3x3VSPEC */ "texm3x3vspec",
+ /* WINED3DSIH_TEXREG2AR */ "texreg2ar",
+ /* WINED3DSIH_TEXREG2GB */ "texreg2gb",
+ /* WINED3DSIH_TEXREG2RGB */ "texreg2rgb",
+};
+
+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",
+};
+
+static const char *shader_semantic_name_from_usage(WINED3DDECLUSAGE usage)
+{
+ if (usage >= sizeof(semantic_names) / sizeof(*semantic_names))
+ {
+ FIXME("Unrecognized usage %#x.\n", usage);
+ return "UNRECOGNIZED";
+ }
+
+ return semantic_names[usage];
+}
+
+static WINED3DDECLUSAGE shader_usage_from_semantic_name(const char *name)
+{
+ unsigned int i;
+
+ for (i = 0; i < sizeof(semantic_names) / sizeof(*semantic_names); ++i)
+ {
+ if (!strcmp(name, semantic_names[i])) return i;
+ }
+
+ return ~0U;
+}
+
+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;
+}
+
+static const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token)
+{
+ switch (version_token >> 16)
+ {
+ case WINED3D_SM1_VS:
+ case WINED3D_SM1_PS:
+ return &sm1_shader_frontend;
+
+ case WINED3D_SM4_PS:
+ case WINED3D_SM4_VS:
+ case WINED3D_SM4_GS:
+ return &sm4_shader_frontend;
+
+ default:
+ FIXME("Unrecognised version token %#x\n", version_token);
+ return NULL;
+ }
+}
+
+void shader_buffer_clear(struct wined3d_shader_buffer *buffer)
+{
+ buffer->buffer[0] = '\0';
+ buffer->bsize = 0;
+ buffer->lineNo = 0;
+ buffer->newline = TRUE;
+}
+
+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(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 */ || (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;
+ return -1;
+ }
+
+ if (buffer->newline)
+ {
+ TRACE("GL HW (%u, %u) : %s", buffer->lineNo + 1, buffer->bsize, base);
+ buffer->newline = FALSE;
+ }
+ else
+ {
+ TRACE("%s", base);
+ }
+
+ buffer->bsize += rc;
+ if (buffer->buffer[buffer->bsize-1] == '\n')
+ {
+ ++buffer->lineNo;
+ buffer->newline = TRUE;
+ }
+
+ return 0;
+}
+
+int shader_addline(struct wined3d_shader_buffer *buffer, const char *format, ...)
+{
+ va_list args;
+ int ret;
+
+ va_start(args, format);
+ ret = shader_vaddline(buffer, format, args);
+ va_end(args);
+
+ return ret;
+}
+
+static void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device,
+ IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
+{
+ shader->ref = 1;
+ shader->device = (IWineD3DDevice *)device;
+ shader->parent = parent;
+ shader->parent_ops = parent_ops;
+ list_init(&shader->linked_programs);
+ list_add_head(&device->shaders, &shader->shader_list_entry);
+}
+
+/* Convert floating point offset relative to a register file to an absolute
+ * offset for float constants. */
+static unsigned int shader_get_float_offset(WINED3DSHADER_PARAM_REGISTER_TYPE register_type, UINT register_idx)
+{
+ switch (register_type)
+ {
+ case WINED3DSPR_CONST: return register_idx;
+ case WINED3DSPR_CONST2: return 2048 + register_idx;
+ case WINED3DSPR_CONST3: return 4096 + register_idx;
+ case WINED3DSPR_CONST4: return 6144 + register_idx;
+ default:
+ FIXME("Unsupported register type: %u.\n", register_type);
+ return register_idx;
+ }
+}
+
+static void shader_delete_constant_list(struct list *clist)
+{
+ struct local_constant *constant;
+ struct list *ptr;
+
+ ptr = list_head(clist);
+ while (ptr)
+ {
+ constant = LIST_ENTRY(ptr, struct local_constant, entry);
+ ptr = list_next(clist, ptr);
+ HeapFree(GetProcessHeap(), 0, constant);
+ }
+ list_init(clist);
+}
+
+static inline void set_bitmap_bit(DWORD *bitmap, DWORD bit)
+{
+ DWORD idx, shift;
+ idx = bit >> 5;
+ shift = bit & 0x1f;
+ bitmap[idx] |= (1 << shift);
+}
+
+static void shader_record_register_usage(IWineD3DBaseShaderImpl *shader, struct shader_reg_maps *reg_maps,
+ const struct wined3d_shader_register *reg, enum wined3d_shader_type shader_type)
+{
+ switch (reg->type)
+ {
+ case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */
+ 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 |= 1 << reg->idx;
+ break;
+
+ case WINED3DSPR_INPUT:
+ if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
+ {
+ 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
+ * that v0, v1 and v2 aren't read because aL can be negative */
+ unsigned int i;
+ for (i = 0; i < MAX_REG_INPUT; ++i)
+ {
+ ((IWineD3DPixelShaderImpl *)shader)->input_reg_used[i] = TRUE;
+ }
+ }
+ else
+ {
+ ((IWineD3DPixelShaderImpl *)shader)->input_reg_used[reg->idx] = TRUE;
+ }
+ }
+ else reg_maps->input_registers |= 1 << reg->idx;
+ break;
+
+ case WINED3DSPR_RASTOUT:
+ if (reg->idx == 1) reg_maps->fog = 1;
+ break;
+
+ case WINED3DSPR_MISCTYPE:
+ 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 (reg->rel_addr)
+ {
+ if (shader_type != WINED3D_SHADER_TYPE_PIXEL)
+ {
+ if (reg->idx < ((IWineD3DVertexShaderImpl *)shader)->min_rel_offset)
+ {
+ ((IWineD3DVertexShaderImpl *)shader)->min_rel_offset = reg->idx;
+ }
+ if (reg->idx > ((IWineD3DVertexShaderImpl *)shader)->max_rel_offset)
+ {
+ ((IWineD3DVertexShaderImpl *)shader)->max_rel_offset = reg->idx;
+ }
+ }
+ reg_maps->usesrelconstF = TRUE;
+ }
+ else
+ {
+ set_bitmap_bit(reg_maps->constf, reg->idx);
+ }
+ break;
+
+ case WINED3DSPR_CONSTINT:
+ reg_maps->integer_constants |= (1 << reg->idx);
+ break;
+
+ case WINED3DSPR_CONSTBOOL:
+ 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", reg->type, reg->idx);
+ break;
+ }
+}
+
+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 ? 3 : 0;
+
+ case WINED3DSIH_M4x3:
+ case WINED3DSIH_M3x3:
+ return param == 1 ? 2 : 0;
+
+ case WINED3DSIH_M3x2:
+ return param == 1 ? 1 : 0;
+
+ default:
+ return 0;
+ }
+}
+
+/* Note that this does not count the loop register as an address register. */
+static HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3d_shader_frontend *fe,
+ struct shader_reg_maps *reg_maps, struct wined3d_shader_signature_element *input_signature,
+ struct wined3d_shader_signature_element *output_signature, const DWORD *byte_code, DWORD constf_size)
+{
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface;
+ unsigned int cur_loop_depth = 0, max_loop_depth = 0;
+ void *fe_data = shader->baseShader.frontend_data;
+ struct wined3d_shader_version shader_version;
+ const DWORD *ptr = byte_code;
+
+ memset(reg_maps, 0, sizeof(*reg_maps));
+
+ /* get_registers_used() is called on every compile on some 1.x shaders,
+ * which can result in stacking up a collection of local constants.
+ * Delete the old constants if existing. */
+ shader_delete_constant_list(&shader->baseShader.constantsF);
+ shader_delete_constant_list(&shader->baseShader.constantsB);
+ shader_delete_constant_list(&shader->baseShader.constantsI);
+
+ fe->shader_read_header(fe_data, &ptr, &shader_version);
+ reg_maps->shader_version = shader_version;
+
+ reg_maps->constf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ sizeof(*reg_maps->constf) * ((constf_size + 31) / 32));
+ if (!reg_maps->constf)
+ {
+ ERR("Failed to allocate constant map memory.\n");
+ return E_OUTOFMEMORY;
+ }
+
+ while (!fe->shader_is_end(fe_data, &ptr))
+ {
+ struct wined3d_shader_instruction ins;
+ const char *comment;
+ UINT comment_size;
+ UINT param_size;
+
+ /* Skip comments. */
+ fe->shader_read_comment(&ptr, &comment, &comment_size);
+ if (comment) continue;
+
+ /* Fetch opcode. */
+ fe->shader_read_opcode(fe_data, &ptr, &ins, ¶m_size);
+
+ /* Unhandled opcode, and its parameters. */
+ if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
+ {
+ TRACE("Skipping unrecognized instruction.\n");
+ ptr += param_size;
+ continue;
+ }
+
+ /* Handle declarations. */
+ if (ins.handler_idx == WINED3DSIH_DCL)
+ {
+ struct wined3d_shader_semantic semantic;
+
+ fe->shader_read_semantic(&ptr, &semantic);
+
+ switch (semantic.reg.reg.type)
+ {
+ /* Mark input registers used. */
+ case WINED3DSPR_INPUT:
+ reg_maps->input_registers |= 1 << semantic.reg.reg.idx;
+ shader_signature_from_semantic(&input_signature[semantic.reg.reg.idx], &semantic);
+ break;
+
+ /* Vertex shader: mark 3.0 output registers used, save token. */
+ case WINED3DSPR_OUTPUT:
+ 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;
+
+ /* Save sampler usage token. */
+ case WINED3DSPR_SAMPLER:
+ reg_maps->sampler_type[semantic.reg.reg.idx] = semantic.sampler_type;
+ break;
+
+ default:
+ TRACE("Not recording DCL register type %#x.\n", semantic.reg.reg.type);
+ break;
+ }
+ }
+ else if (ins.handler_idx == WINED3DSIH_DEF)
+ {
+ struct wined3d_shader_src_param rel_addr;
+ struct wined3d_shader_dst_param dst;
+
+ local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
+ if (!lconst) return E_OUTOFMEMORY;
+
+ fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+ lconst->idx = dst.reg.idx;
+
+ memcpy(lconst->value, ptr, 4 * sizeof(DWORD));
+ ptr += 4;
+
+ /* In pixel shader 1.X shaders, the constants are clamped between [-1;1] */
+ if (shader_version.major == 1 && shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
+ {
+ float *value = (float *)lconst->value;
+ 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(&shader->baseShader.constantsF, &lconst->entry);
+ }
+ else if (ins.handler_idx == WINED3DSIH_DEFI)
+ {
+ struct wined3d_shader_src_param rel_addr;
+ struct wined3d_shader_dst_param dst;
+
+ local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
+ if (!lconst) return E_OUTOFMEMORY;
+
+ fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+ lconst->idx = dst.reg.idx;
+
+ memcpy(lconst->value, ptr, 4 * sizeof(DWORD));
+ ptr += 4;
+
+ list_add_head(&shader->baseShader.constantsI, &lconst->entry);
+ reg_maps->local_int_consts |= (1 << dst.reg.idx);
+ }
+ else if (ins.handler_idx == WINED3DSIH_DEFB)
+ {
+ struct wined3d_shader_src_param rel_addr;
+ struct wined3d_shader_dst_param dst;
+
+ local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
+ if (!lconst) return E_OUTOFMEMORY;
+
+ fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+ lconst->idx = dst.reg.idx;
+
+ memcpy(lconst->value, ptr, sizeof(DWORD));
+ ++ptr;
+
+ list_add_head(&shader->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
+ || ins.handler_idx == WINED3DSIH_REP)
+ {
+ struct wined3d_shader_src_param src, rel_addr;
+
+ fe->shader_read_src_param(fe_data, &ptr, &src, &rel_addr);
+
+ /* Rep and Loop always use an integer constant for the control parameters. */
+ if (ins.handler_idx == WINED3DSIH_REP)
+ {
+ reg_maps->integer_constants |= 1 << src.reg.idx;
+ }
+ else
+ {
+ fe->shader_read_src_param(fe_data, &ptr, &src, &rel_addr);
+ reg_maps->integer_constants |= 1 << src.reg.idx;
+ }
+
+ cur_loop_depth++;
+ if (cur_loop_depth > max_loop_depth) max_loop_depth = cur_loop_depth;
+ }
+ else if (ins.handler_idx == WINED3DSIH_ENDLOOP
+ || ins.handler_idx == WINED3DSIH_ENDREP)
+ {
+ cur_loop_depth--;
+ }
+ /* For subroutine prototypes. */
+ else if (ins.handler_idx == WINED3DSIH_LABEL)
+ {
+ struct wined3d_shader_src_param src, rel_addr;
+
+ fe->shader_read_src_param(fe_data, &ptr, &src, &rel_addr);
+ reg_maps->labels |= 1 << src.reg.idx;
+ }
+ /* Set texture, address, temporary registers. */
+ else
+ {
+ BOOL color0_mov = FALSE;
+ int i, limit;
+
+ /* This will loop over all the registers and try to
+ * make a bitmask of the ones we're interested in.
+ *
+ * Relative addressing tokens are ignored, but that's
+ * okay, since we'll catch any address registers when
+ * they are initialized (required by spec). */
+ if (ins.dst_count)
+ {
+ struct wined3d_shader_src_param dst_rel_addr;
+ struct wined3d_shader_dst_param dst_param;
+
+ fe->shader_read_dst_param(fe_data, &ptr, &dst_param, &dst_rel_addr);
+
+ shader_record_register_usage(shader, 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 (shader_version.type == WINED3D_SHADER_TYPE_VERTEX && shader_version.major < 3
+ && dst_param.reg.type == WINED3DSPR_TEXCRDOUT)
+ {
+ reg_maps->texcoord_mask[dst_param.reg.idx] |= dst_param.write_mask;
+ }
+
+ if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
+ {
+ IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)shader;
+
+ 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
+ && (ins.handler_idx == WINED3DSIH_TEX
+ || ins.handler_idx == WINED3DSIH_TEXBEM
+ || ins.handler_idx == WINED3DSIH_TEXBEML
+ || ins.handler_idx == WINED3DSIH_TEXDP3TEX
+ || ins.handler_idx == WINED3DSIH_TEXM3x2TEX
+ || ins.handler_idx == WINED3DSIH_TEXM3x3SPEC
+ || ins.handler_idx == WINED3DSIH_TEXM3x3TEX
+ || ins.handler_idx == WINED3DSIH_TEXM3x3VSPEC
+ || ins.handler_idx == WINED3DSIH_TEXREG2AR
+ || ins.handler_idx == WINED3DSIH_TEXREG2GB
+ || ins.handler_idx == WINED3DSIH_TEXREG2RGB))
+ {
+ /* Fake sampler usage, only set reserved bit and type. */
+ DWORD sampler_code = dst_param.reg.idx;
+
+ TRACE("Setting fake 2D sampler for 1.x pixelshader.\n");
+ reg_maps->sampler_type[sampler_code] = WINED3DSTT_2D;
+
+ /* texbem is only valid with < 1.4 pixel shaders */
+ if (ins.handler_idx == WINED3DSIH_TEXBEM
+ || ins.handler_idx == WINED3DSIH_TEXBEML)
+ {
+ reg_maps->bumpmat |= 1 << dst_param.reg.idx;
+ if (ins.handler_idx == WINED3DSIH_TEXBEML)
+ {
+ reg_maps->luminanceparams |= 1 << dst_param.reg.idx;
+ }
+ }
+ }
+ else if (ins.handler_idx == WINED3DSIH_BEM)
+ {
+ reg_maps->bumpmat |= 1 << dst_param.reg.idx;
+ }
+ }
+
+ if (ins.handler_idx == WINED3DSIH_NRM) reg_maps->usesnrm = 1;
+ else if (ins.handler_idx == WINED3DSIH_DSY) 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, &ptr, &src_param, &src_rel_addr);
+ count = get_instr_extra_regcount(ins.handler_idx, i);
+
+ shader_record_register_usage(shader, reg_maps, &src_param.reg, shader_version.type);
+ while (count)
+ {
+ ++src_param.reg.idx;
+ shader_record_register_usage(shader, reg_maps, &src_param.reg, shader_version.type);
+ --count;
+ }
+
+ if (color0_mov)
+ {
+ IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)shader;
+ 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;
+
+ shader->baseShader.functionLength = ((const char *)ptr - (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)
+{
+ TRACE("dcl");
+
+ if (semantic->reg.reg.type == WINED3DSPR_SAMPLER)
+ {
+ switch (semantic->sampler_type)
+ {
+ case WINED3DSTT_2D: TRACE("_2d"); break;
+ case WINED3DSTT_CUBE: TRACE("_cube"); break;
+ case WINED3DSTT_VOLUME: TRACE("_volume"); break;
+ default: TRACE("_unknown_ttype(0x%08x)", semantic->sampler_type);
+ }
+ }
+ else
+ {
+ /* Pixel shaders 3.0 don't have usage semantics. */
+ if (shader_version->major < 3 && shader_version->type == WINED3D_SHADER_TYPE_PIXEL) return;
+ else TRACE("_");
+
+ switch (semantic->usage)
+ {
+ case WINED3DDECLUSAGE_POSITION:
+ TRACE("position%u", semantic->usage_idx);
+ break;
+
+ case WINED3DDECLUSAGE_BLENDINDICES:
+ TRACE("blend");
+ break;
+
+ case WINED3DDECLUSAGE_BLENDWEIGHT:
+ TRACE("weight");
+ break;
+
+ case WINED3DDECLUSAGE_NORMAL:
+ TRACE("normal%u", semantic->usage_idx);
+ break;
+
+ case WINED3DDECLUSAGE_PSIZE:
+ TRACE("psize");
+ break;
+
+ case WINED3DDECLUSAGE_COLOR:
+ if (semantic->usage_idx == 0) TRACE("color");
+ else TRACE("specular%u", (semantic->usage_idx - 1));
+ break;
+
+ case WINED3DDECLUSAGE_TEXCOORD:
+ TRACE("texture%u", semantic->usage_idx);
+ break;
+
+ case WINED3DDECLUSAGE_TANGENT:
+ TRACE("tangent");
+ break;
+
+ case WINED3DDECLUSAGE_BINORMAL:
+ TRACE("binormal");
+ break;
+
+ case WINED3DDECLUSAGE_TESSFACTOR:
+ TRACE("tessfactor");
+ break;
+
+ case WINED3DDECLUSAGE_POSITIONT:
+ TRACE("positionT%u", semantic->usage_idx);
+ break;
+
+ case WINED3DDECLUSAGE_FOG:
+ TRACE("fog");
+ break;
+
+ case WINED3DDECLUSAGE_DEPTH:
+ TRACE("depth");
+ break;
+
+ case WINED3DDECLUSAGE_SAMPLE:
+ TRACE("sample");
+ break;
+
+ default:
+ FIXME("unknown_semantics(0x%08x)", semantic->usage);
+ }
+ }
+}
+
+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 = reg->idx;
+
+ switch (reg->type)
+ {
+ case WINED3DSPR_TEMP:
+ TRACE("r");
+ break;
+
+ case WINED3DSPR_INPUT:
+ TRACE("v");
+ break;
+
+ case WINED3DSPR_CONST:
+ case WINED3DSPR_CONST2:
+ case WINED3DSPR_CONST3:
+ case WINED3DSPR_CONST4:
+ TRACE("c");
+ offset = shader_get_float_offset(reg->type, reg->idx);
+ break;
+
+ case WINED3DSPR_TEXTURE: /* vs: case WINED3DSPR_ADDR */
+ TRACE("%c", shader_version->type == WINED3D_SHADER_TYPE_PIXEL ? 't' : 'a');
+ break;
+
+ case WINED3DSPR_RASTOUT:
+ TRACE("%s", rastout_reg_names[reg->idx]);
+ break;
+
+ case WINED3DSPR_COLOROUT:
+ TRACE("oC");
+ break;
+
+ case WINED3DSPR_DEPTHOUT:
+ TRACE("oDepth");
+ break;
+
+ case WINED3DSPR_ATTROUT:
+ TRACE("oD");
+ break;
+
+ case WINED3DSPR_TEXCRDOUT:
+ /* Vertex shaders >= 3.0 use general purpose output registers
+ * (WINED3DSPR_OUTPUT), which can include an address token. */
+ if (shader_version->major >= 3) TRACE("o");
+ else TRACE("oT");
+ break;
+
+ case WINED3DSPR_CONSTINT:
+ TRACE("i");
+ break;
+
+ case WINED3DSPR_CONSTBOOL:
+ TRACE("b");
+ break;
+
+ case WINED3DSPR_LABEL:
+ TRACE("l");
+ break;
+
+ case WINED3DSPR_LOOP:
+ TRACE("aL");
+ break;
+
+ case WINED3DSPR_SAMPLER:
+ TRACE("s");
+ break;
+
+ case WINED3DSPR_MISCTYPE:
+ if (reg->idx > 1) FIXME("Unhandled misctype register %u.\n", reg->idx);
+ else TRACE("%s", misctype_reg_names[reg->idx]);
+ break;
+
+ case WINED3DSPR_PREDICATE:
+ TRACE("p");
+ break;
+
+ case WINED3DSPR_IMMCONST:
+ TRACE("l");
+ break;
+
+ case WINED3DSPR_CONSTBUFFER:
+ TRACE("cb");
+ break;
+
+ default:
+ TRACE("unhandled_rtype(%#x)", reg->type);
+ break;
+ }
+
+ if (reg->type == WINED3DSPR_IMMCONST)
+ {
+ TRACE("(");
+ switch (reg->immconst_type)
+ {
+ case WINED3D_IMMCONST_FLOAT:
+ TRACE("%.8e", *(const float *)reg->immconst_data);
+ break;
+
+ case WINED3D_IMMCONST_FLOAT4:
+ TRACE("%.8e, %.8e, %.8e, %.8e",
+ *(const float *)®->immconst_data[0], *(const float *)®->immconst_data[1],
+ *(const float *)®->immconst_data[2], *(const float *)®->immconst_data[3]);
+ break;
+
+ default:
+ TRACE("", reg->immconst_type);
+ break;
+ }
+ TRACE(")");
+ }
+ else if (reg->type != WINED3DSPR_RASTOUT && reg->type != WINED3DSPR_MISCTYPE)
+ {
+ if (reg->array_idx != ~0U)
+ {
+ 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("]");
+ }
+ }
+}
+
+void shader_dump_dst_param(const struct wined3d_shader_dst_param *param,
+ const struct wined3d_shader_version *shader_version)
+{
+ DWORD write_mask = param->write_mask;
+
+ shader_dump_register(¶m->reg, shader_version);
+
+ if (write_mask != WINED3DSP_WRITEMASK_ALL)
+ {
+ static const char *write_mask_chars = "xyzw";
+
+ TRACE(".");
+ if (write_mask & WINED3DSP_WRITEMASK_0) TRACE("%c", write_mask_chars[0]);
+ if (write_mask & WINED3DSP_WRITEMASK_1) TRACE("%c", write_mask_chars[1]);
+ if (write_mask & WINED3DSP_WRITEMASK_2) TRACE("%c", write_mask_chars[2]);
+ if (write_mask & WINED3DSP_WRITEMASK_3) TRACE("%c", write_mask_chars[3]);
+ }
+}
+
+void shader_dump_src_param(const struct wined3d_shader_src_param *param,
+ const struct wined3d_shader_version *shader_version)
+{
+ DWORD src_modifier = param->modifiers;
+ DWORD swizzle = param->swizzle;
+
+ if (src_modifier == WINED3DSPSM_NEG
+ || src_modifier == WINED3DSPSM_BIASNEG
+ || src_modifier == WINED3DSPSM_SIGNNEG
+ || src_modifier == WINED3DSPSM_X2NEG
+ || src_modifier == WINED3DSPSM_ABSNEG)
+ TRACE("-");
+ else if (src_modifier == WINED3DSPSM_COMP)
+ TRACE("1-");
+ else if (src_modifier == WINED3DSPSM_NOT)
+ TRACE("!");
+
+ if (src_modifier == WINED3DSPSM_ABS || src_modifier == WINED3DSPSM_ABSNEG)
+ TRACE("abs(");
+
+ shader_dump_register(¶m->reg, shader_version);
+
+ if (src_modifier)
+ {
+ switch (src_modifier)
+ {
+ case WINED3DSPSM_NONE: break;
+ case WINED3DSPSM_NEG: break;
+ case WINED3DSPSM_NOT: break;
+ case WINED3DSPSM_BIAS: TRACE("_bias"); break;
+ case WINED3DSPSM_BIASNEG: TRACE("_bias"); break;
+ case WINED3DSPSM_SIGN: TRACE("_bx2"); break;
+ case WINED3DSPSM_SIGNNEG: TRACE("_bx2"); break;
+ case WINED3DSPSM_COMP: break;
+ case WINED3DSPSM_X2: TRACE("_x2"); break;
+ case WINED3DSPSM_X2NEG: TRACE("_x2"); break;
+ case WINED3DSPSM_DZ: TRACE("_dz"); break;
+ case WINED3DSPSM_DW: TRACE("_dw"); break;
+ case WINED3DSPSM_ABSNEG: TRACE(")"); break;
+ case WINED3DSPSM_ABS: TRACE(")"); break;
+ default: TRACE("_unknown_modifier(%#x)", src_modifier);
+ }
+ }
+
+ if (swizzle != WINED3DSP_NOSWIZZLE)
+ {
+ static const char *swizzle_chars = "xyzw";
+ DWORD swizzle_x = swizzle & 0x03;
+ DWORD swizzle_y = (swizzle >> 2) & 0x03;
+ DWORD swizzle_z = (swizzle >> 4) & 0x03;
+ DWORD swizzle_w = (swizzle >> 6) & 0x03;
+
+ if (swizzle_x == swizzle_y
+ && swizzle_x == swizzle_z
+ && swizzle_x == swizzle_w)
+ {
+ TRACE(".%c", swizzle_chars[swizzle_x]);
+ }
+ else
+ {
+ TRACE(".%c%c%c%c", swizzle_chars[swizzle_x], swizzle_chars[swizzle_y],
+ swizzle_chars[swizzle_z], swizzle_chars[swizzle_w]);
+ }
+ }
+}
+
+/* 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, struct wined3d_shader_buffer *buffer,
+ const shader_reg_maps *reg_maps, const DWORD *byte_code, void *backend_ctx)
+{
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface;
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device;
+ const struct wined3d_shader_frontend *fe = shader->baseShader.frontend;
+ void *fe_data = shader->baseShader.frontend_data;
+ struct wined3d_shader_src_param src_rel_addr[4];
+ struct wined3d_shader_src_param src_param[4];
+ struct wined3d_shader_version shader_version;
+ struct wined3d_shader_src_param dst_rel_addr;
+ struct wined3d_shader_dst_param dst_param;
+ struct wined3d_shader_instruction ins;
+ struct wined3d_shader_context ctx;
+ const DWORD *ptr = byte_code;
+ DWORD i;
+
+ /* Initialize current parsing state. */
+ ctx.shader = iface;
+ ctx.gl_info = &device->adapter->gl_info;
+ ctx.reg_maps = reg_maps;
+ ctx.buffer = buffer;
+ ctx.backend_data = backend_ctx;
+
+ ins.ctx = &ctx;
+ ins.dst = &dst_param;
+ ins.src = src_param;
+ shader->baseShader.parse_state.current_row = 0;
+
+ fe->shader_read_header(fe_data, &ptr, &shader_version);
+
+ while (!fe->shader_is_end(fe_data, &ptr))
+ {
+ const char *comment;
+ UINT comment_size;
+ UINT param_size;
+
+ /* Skip comment tokens. */
+ fe->shader_read_comment(&ptr, &comment, &comment_size);
+ if (comment) continue;
+
+ /* Read opcode. */
+ fe->shader_read_opcode(fe_data, &ptr, &ins, ¶m_size);
+
+ /* Unknown opcode and its parameters. */
+ if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
+ {
+ TRACE("Skipping unrecognized instruction.\n");
+ ptr += param_size;
+ continue;
+ }
+
+ /* Nothing to do. */
+ if (ins.handler_idx == WINED3DSIH_DCL
+ || ins.handler_idx == WINED3DSIH_NOP
+ || ins.handler_idx == WINED3DSIH_DEF
+ || ins.handler_idx == WINED3DSIH_DEFI
+ || ins.handler_idx == WINED3DSIH_DEFB
+ || ins.handler_idx == WINED3DSIH_PHASE)
+ {
+ ptr += param_size;
+ continue;
+ }
+
+ /* Destination token */
+ if (ins.dst_count) fe->shader_read_dst_param(fe_data, &ptr, &dst_param, &dst_rel_addr);
+
+ /* Predication token */
+ if (ins.predicate) ins.predicate = *ptr++;
+
+ /* Other source tokens */
+ for (i = 0; i < ins.src_count; ++i)
+ {
+ fe->shader_read_src_param(fe_data, &ptr, &src_param[i], &src_rel_addr[i]);
+ }
+
+ /* Call appropriate function for output target */
+ device->shader_backend->shader_handle_instruction(&ins);
+ }
+}
+
+static void shader_dump_ins_modifiers(const struct wined3d_shader_dst_param *dst)
+{
+ DWORD mmask = dst->modifiers;
+
+ switch (dst->shift)
+ {
+ case 0: break;
+ case 13: TRACE("_d8"); break;
+ case 14: TRACE("_d4"); break;
+ case 15: TRACE("_d2"); break;
+ case 1: TRACE("_x2"); break;
+ case 2: TRACE("_x4"); break;
+ case 3: TRACE("_x8"); break;
+ default: TRACE("_unhandled_shift(%d)", dst->shift); break;
+ }
+
+ if (mmask & WINED3DSPDM_SATURATE) TRACE("_sat");
+ if (mmask & WINED3DSPDM_PARTIALPRECISION) TRACE("_pp");
+ if (mmask & WINED3DSPDM_MSAMPCENTROID) TRACE("_centroid");
+
+ mmask &= ~(WINED3DSPDM_SATURATE | WINED3DSPDM_PARTIALPRECISION | WINED3DSPDM_MSAMPCENTROID);
+ if (mmask) FIXME("_unrecognized_modifier(%#x)", mmask);
+}
+
+static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *byte_code)
+{
+ struct wined3d_shader_version shader_version;
+ const DWORD *ptr = byte_code;
+ const char *type_prefix;
+ DWORD i;
+
+ TRACE("Parsing %p.\n", byte_code);
+
+ fe->shader_read_header(fe_data, &ptr, &shader_version);
+
+ 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, &ptr))
+ {
+ struct wined3d_shader_instruction ins;
+ const char *comment;
+ UINT comment_size;
+ UINT param_size;
+
+ /* comment */
+ fe->shader_read_comment(&ptr, &comment, &comment_size);
+ if (comment)
+ {
+ if (comment_size > 4 && *(const DWORD *)comment == WINEMAKEFOURCC('T', 'E', 'X', 'T'))
+ {
+ const char *end = comment + comment_size;
+ const char *ptr = comment + 4;
+ const char *line = ptr;
+
+ TRACE("// TEXT\n");
+ while (ptr != end)
+ {
+ if (*ptr == '\n')
+ {
+ UINT len = ptr - line;
+ if (len && *(ptr - 1) == '\r') --len;
+ TRACE("// %s\n", debugstr_an(line, len));
+ line = ++ptr;
+ }
+ else ++ptr;
+ }
+ if (line != ptr) TRACE("// %s\n", debugstr_an(line, ptr - line));
+ }
+ else TRACE("// %s\n", debugstr_an(comment, comment_size));
+ continue;
+ }
+
+ fe->shader_read_opcode(fe_data, &ptr, &ins, ¶m_size);
+ if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
+ {
+ TRACE("Skipping unrecognized instruction.\n");
+ ptr += param_size;
+ continue;
+ }
+
+ if (ins.handler_idx == WINED3DSIH_DCL)
+ {
+ struct wined3d_shader_semantic semantic;
+
+ fe->shader_read_semantic(&ptr, &semantic);
+
+ shader_dump_decl_usage(&semantic, &shader_version);
+ shader_dump_ins_modifiers(&semantic.reg);
+ TRACE(" ");
+ shader_dump_dst_param(&semantic.reg, &shader_version);
+ }
+ else if (ins.handler_idx == WINED3DSIH_DEF)
+ {
+ struct wined3d_shader_src_param rel_addr;
+ struct wined3d_shader_dst_param dst;
+
+ fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+
+ TRACE("def c%u = %f, %f, %f, %f", shader_get_float_offset(dst.reg.type, dst.reg.idx),
+ *(const float *)(ptr),
+ *(const float *)(ptr + 1),
+ *(const float *)(ptr + 2),
+ *(const float *)(ptr + 3));
+ ptr += 4;
+ }
+ else if (ins.handler_idx == WINED3DSIH_DEFI)
+ {
+ struct wined3d_shader_src_param rel_addr;
+ struct wined3d_shader_dst_param dst;
+
+ fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+
+ TRACE("defi i%u = %d, %d, %d, %d", dst.reg.idx,
+ *(ptr),
+ *(ptr + 1),
+ *(ptr + 2),
+ *(ptr + 3));
+ ptr += 4;
+ }
+ else if (ins.handler_idx == WINED3DSIH_DEFB)
+ {
+ struct wined3d_shader_src_param rel_addr;
+ struct wined3d_shader_dst_param dst;
+
+ fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+
+ TRACE("defb b%u = %s", dst.reg.idx, *ptr ? "true" : "false");
+ ++ptr;
+ }
+ else
+ {
+ struct wined3d_shader_src_param dst_rel_addr, src_rel_addr;
+ struct wined3d_shader_dst_param dst_param;
+ struct wined3d_shader_src_param src_param;
+
+ if (ins.dst_count)
+ {
+ fe->shader_read_dst_param(fe_data, &ptr, &dst_param, &dst_rel_addr);
+ }
+
+ /* Print out predication source token first - it follows
+ * the destination token. */
+ if (ins.predicate)
+ {
+ fe->shader_read_src_param(fe_data, &ptr, &src_param, &src_rel_addr);
+ TRACE("(");
+ shader_dump_src_param(&src_param, &shader_version);
+ TRACE(") ");
+ }
+
+ /* PixWin marks instructions with the coissue flag with a '+' */
+ if (ins.coissue) TRACE("+");
+
+ TRACE("%s", shader_opcode_names[ins.handler_idx]);
+
+ if (ins.handler_idx == WINED3DSIH_IFC
+ || ins.handler_idx == WINED3DSIH_BREAKC)
+ {
+ switch (ins.flags)
+ {
+ case COMPARISON_GT: TRACE("_gt"); break;
+ case COMPARISON_EQ: TRACE("_eq"); break;
+ case COMPARISON_GE: TRACE("_ge"); break;
+ case COMPARISON_LT: TRACE("_lt"); break;
+ case COMPARISON_NE: TRACE("_ne"); break;
+ case COMPARISON_LE: TRACE("_le"); break;
+ default: TRACE("_(%u)", ins.flags);
+ }
+ }
+ else if (ins.handler_idx == WINED3DSIH_TEX
+ && shader_version.major >= 2
+ && (ins.flags & WINED3DSI_TEXLD_PROJECT))
+ {
+ TRACE("p");
+ }
+
+ /* We already read the destination token, print it. */
+ if (ins.dst_count)
+ {
+ shader_dump_ins_modifiers(&dst_param);
+ TRACE(" ");
+ shader_dump_dst_param(&dst_param, &shader_version);
+ }
+
+ /* Other source tokens */
+ for (i = ins.dst_count; i < (ins.dst_count + ins.src_count); ++i)
+ {
+ fe->shader_read_src_param(fe_data, &ptr, &src_param, &src_rel_addr);
+ TRACE(!i ? " " : ", ");
+ shader_dump_src_param(&src_param, &shader_version);
+ }
+ }
+ TRACE("\n");
+ }
+}
+
+static void shader_cleanup(IWineD3DBaseShader *iface)
+{
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface;
+
+ ((IWineD3DDeviceImpl *)shader->baseShader.device)->shader_backend->shader_destroy(iface);
+ HeapFree(GetProcessHeap(), 0, shader->baseShader.reg_maps.constf);
+ HeapFree(GetProcessHeap(), 0, shader->baseShader.function);
+ shader_delete_constant_list(&shader->baseShader.constantsF);
+ shader_delete_constant_list(&shader->baseShader.constantsB);
+ shader_delete_constant_list(&shader->baseShader.constantsI);
+ list_remove(&shader->baseShader.shader_list_entry);
+
+ if (shader->baseShader.frontend && shader->baseShader.frontend_data)
+ {
+ shader->baseShader.frontend->shader_free(shader->baseShader.frontend_data);
+ }
+}
+
+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(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 void shader_none_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *caps)
+{
+ /* Set the shader caps to 0 for the none shader backend */
+ caps->VertexShaderVersion = 0;
+ caps->PixelShaderVersion = 0;
+ caps->PixelShader1xMaxValue = 0.0f;
+}
+
+static BOOL shader_none_color_fixup_supported(struct color_fixup_desc fixup)
+{
+ if (TRACE_ON(d3d_shader) && TRACE_ON(d3d))
+ {
+ TRACE("Checking support for fixup:\n");
+ dump_color_fixup_desc(fixup);
+ }
+
+ /* Faked to make some apps happy. */
+ if (!is_complex_fixup(fixup))
+ {
+ TRACE("[OK]\n");
+ return TRUE;
+ }
+
+ TRACE("[FAILED]\n");
+ return FALSE;
+}
+
+const shader_backend_t none_shader_backend = {
+ shader_none_handle_instruction,
+ shader_none_select,
+ shader_none_select_depth_blt,
+ shader_none_deselect_depth_blt,
+ shader_none_update_float_vertex_constants,
+ shader_none_update_float_pixel_constants,
+ shader_none_load_constants,
+ shader_none_load_np2fixup_constants,
+ shader_none_destroy,
+ shader_none_alloc,
+ shader_none_free,
+ shader_none_dirty_const,
+ shader_none_get_caps,
+ shader_none_color_fixup_supported,
+};
static void shader_get_parent(IWineD3DBaseShaderImpl *shader, IUnknown **parent)
{
diff --git a/dll/directx/wine/wined3d/shader_sm1.c b/dll/directx/wine/wined3d/shader_sm1.c
index 64876b38032..aa1da56c5ba 100644
--- a/dll/directx/wine/wined3d/shader_sm1.c
+++ b/dll/directx/wine/wined3d/shader_sm1.c
@@ -641,9 +641,10 @@ static void shader_sm1_read_semantic(const DWORD **ptr, struct wined3d_shader_se
shader_parse_dst_param(dst_token, NULL, &semantic->reg);
}
-static void shader_sm1_read_comment(const DWORD **ptr, const char **comment)
+static void shader_sm1_read_comment(const DWORD **ptr, const char **comment, UINT *comment_size)
{
DWORD token = **ptr;
+ UINT size;
if ((token & WINED3DSI_OPCODE_MASK) != WINED3D_SM1_OP_COMMENT)
{
@@ -651,8 +652,10 @@ static void shader_sm1_read_comment(const DWORD **ptr, const char **comment)
return;
}
+ size = (token & WINED3DSI_COMMENTSIZE_MASK) >> WINED3DSI_COMMENTSIZE_SHIFT;
*comment = (const char *)++(*ptr);
- *ptr += (token & WINED3DSI_COMMENTSIZE_MASK) >> WINED3DSI_COMMENTSIZE_SHIFT;
+ *comment_size = size * sizeof(DWORD);
+ *ptr += size;
}
static BOOL shader_sm1_is_end(void *data, const DWORD **ptr)
diff --git a/dll/directx/wine/wined3d/shader_sm4.c b/dll/directx/wine/wined3d/shader_sm4.c
index 91aa882c888..b4637904f10 100644
--- a/dll/directx/wine/wined3d/shader_sm4.c
+++ b/dll/directx/wine/wined3d/shader_sm4.c
@@ -49,10 +49,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
enum wined3d_sm4_opcode
{
WINED3D_SM4_OP_ADD = 0x00,
+ WINED3D_SM4_OP_BREAK = 0x02,
+ WINED3D_SM4_OP_BREAKC = 0x03,
+ WINED3D_SM4_OP_CUT = 0x09,
WINED3D_SM4_OP_DP3 = 0x10,
WINED3D_SM4_OP_DP4 = 0x11,
+ WINED3D_SM4_OP_EMIT = 0x13,
+ WINED3D_SM4_OP_ENDIF = 0x15,
+ WINED3D_SM4_OP_ENDLOOP = 0x16,
WINED3D_SM4_OP_EXP = 0x19,
+ WINED3D_SM4_OP_IADD = 0x1e,
+ WINED3D_SM4_OP_IF = 0x1f,
+ WINED3D_SM4_OP_IGE = 0x21,
WINED3D_SM4_OP_LOG = 0x2f,
+ WINED3D_SM4_OP_LT = 0x31,
WINED3D_SM4_OP_MIN = 0x33,
WINED3D_SM4_OP_MAX = 0x34,
WINED3D_SM4_OP_MOV = 0x36,
@@ -102,10 +112,20 @@ struct sysval_map
static const struct wined3d_sm4_opcode_info opcode_table[] =
{
{WINED3D_SM4_OP_ADD, WINED3DSIH_ADD, 1, 2},
+ {WINED3D_SM4_OP_BREAK, WINED3DSIH_BREAK, 0, 0},
+ {WINED3D_SM4_OP_BREAKC, WINED3DSIH_BREAKP, 0, 1},
+ {WINED3D_SM4_OP_CUT, WINED3DSIH_CUT, 0, 0},
{WINED3D_SM4_OP_DP3, WINED3DSIH_DP3, 1, 2},
{WINED3D_SM4_OP_DP4, WINED3DSIH_DP4, 1, 2},
+ {WINED3D_SM4_OP_EMIT, WINED3DSIH_EMIT, 0, 0},
+ {WINED3D_SM4_OP_ENDIF, WINED3DSIH_ENDIF, 0, 0},
+ {WINED3D_SM4_OP_ENDLOOP,WINED3DSIH_ENDLOOP, 0, 0},
{WINED3D_SM4_OP_EXP, WINED3DSIH_EXP, 1, 1},
+ {WINED3D_SM4_OP_IADD, WINED3DSIH_IADD, 1, 2},
+ {WINED3D_SM4_OP_IF, WINED3DSIH_IF, 0, 1},
+ {WINED3D_SM4_OP_IGE, WINED3DSIH_IGE, 1, 2},
{WINED3D_SM4_OP_LOG, WINED3DSIH_LOG, 1, 1},
+ {WINED3D_SM4_OP_LT, WINED3DSIH_LT, 1, 2},
{WINED3D_SM4_OP_MIN, WINED3DSIH_MIN, 1, 2},
{WINED3D_SM4_OP_MAX, WINED3DSIH_MAX, 1, 2},
{WINED3D_SM4_OP_MOV, WINED3DSIH_MOV, 1, 1},
@@ -386,9 +406,9 @@ static void shader_sm4_read_semantic(const DWORD **ptr, struct wined3d_shader_se
FIXME("ptr %p, semantic %p stub!\n", ptr, semantic);
}
-static void shader_sm4_read_comment(const DWORD **ptr, const char **comment)
+static void shader_sm4_read_comment(const DWORD **ptr, const char **comment, UINT *comment_size)
{
- FIXME("ptr %p, comment %p stub!\n", ptr, comment);
+ FIXME("ptr %p, comment %p, comment_size %p stub!\n", ptr, comment, comment_size);
*comment = NULL;
}
diff --git a/dll/directx/wine/wined3d/state.c b/dll/directx/wine/wined3d/state.c
index adb426b904b..5efe069bb19 100644
--- a/dll/directx/wine/wined3d/state.c
+++ b/dll/directx/wine/wined3d/state.c
@@ -584,6 +584,10 @@ static void state_clipping(DWORD state, IWineD3DStateBlockImpl *stateblock, stru
glEnable(GL_DEPTH_CLAMP);
checkGLcall("glEnable(GL_DEPTH_CLAMP)");
}
+ else
+ {
+ FIXME("Clipping disabled, but ARB_depth_clamp isn't supported.\n");
+ }
}
if (enable & WINED3DCLIPPLANE0) { glEnable(GL_CLIP_PLANE0); checkGLcall("glEnable(clip plane 0)"); }
@@ -3523,7 +3527,6 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wine
if(stateblock->textures[sampler]) {
BOOL srgb = stateblock->samplerState[sampler][WINED3DSAMP_SRGBTEXTURE];
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);
basetexture_apply_state_changes(stateblock->textures[sampler],
stateblock->textureState[sampler], stateblock->samplerState[sampler], gl_info);
@@ -3597,9 +3600,9 @@ void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, struct w
}
} else {
/* Disabled the pixel shader - color ops weren't applied
- * while it was enabled, so re-apply them.
- */
- for(i=0; i < MAX_TEXTURES; i++) {
+ * while it was enabled, so re-apply them. */
+ for (i = 0; i < context->gl_info->limits.texture_stages; ++i)
+ {
if(!isStateDirty(context, STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP))) {
device->StateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP)].apply
(STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP), stateblock, context);
@@ -3880,62 +3883,18 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock
glLoadIdentity();
checkGLcall("glLoadIdentity");
- if(context->last_was_rhw) {
- double X, Y, height, width, minZ, maxZ;
+ if (context->last_was_rhw)
+ {
+ double x = stateblock->viewport.X;
+ double y = stateblock->viewport.Y;
+ double w = stateblock->viewport.Width;
+ double h = stateblock->viewport.Height;
- X = stateblock->viewport.X;
- Y = stateblock->viewport.Y;
- height = stateblock->viewport.Height;
- width = stateblock->viewport.Width;
- minZ = stateblock->viewport.MinZ;
- maxZ = stateblock->viewport.MaxZ;
-
- if (!stateblock->device->untransformed)
- {
- /* Transformed vertices are supposed to bypass the whole transform pipeline including
- * frustum clipping. This can't be done in opengl, so this code adjusts the Z range to
- * suppress depth clipping. This can be done because it is an orthogonal projection and
- * the Z coordinate does not affect the size of the primitives. Half Life 1 and Prince of
- * Persia 3D need this.
- *
- * Note that using minZ and maxZ here doesn't entirely fix the problem, since view frustum
- * clipping is still enabled, but it seems to fix it for all apps tested so far. A minor
- * problem can be witnessed in half-life 1 engine based games, the weapon is clipped close
- * to the viewer.
- *
- * Also note that this breaks z comparison against z values filled in with clear,
- * but no app depending on that and disabled clipping has been found yet. Comparing
- * primitives against themselves works, so the Z buffer is still intact for normal hidden
- * surface removal.
- *
- * We could disable clipping entirely by setting the near to infinity and far to -infinity,
- * but this would break Z buffer operation. Raising the range to something less than
- * infinity would help a bit at the cost of Z precision, but it wouldn't eliminate the
- * problem either.
- */
- TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ);
- if (context->render_offscreen)
- {
- glOrtho(X, X + width, -Y, -Y - height, -minZ, -maxZ);
- } else {
- glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ);
- }
- } else {
- /* If the app mixes transformed and untransformed primitives we can't use the coordinate system
- * trick above because this would mess up transformed and untransformed Z order. Pass the z position
- * unmodified to opengl.
- *
- * If the app depends on mixed types and disabled clipping we're out of luck without a pipeline
- * replacement shader.
- */
- TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, 1.0, -1.0);
- 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);
- }
- }
+ TRACE("Calling glOrtho with x %.8e, y %.8e, w %.8e, h %.8e.\n", x, y, w, h);
+ if (context->render_offscreen)
+ glOrtho(x, x + w, -y, -y - h, 0.0, -1.0);
+ else
+ glOrtho(x, x + w, y + h, y, 0.0, -1.0);
checkGLcall("glOrtho");
/* Window Coord 0 is the middle of the first pixel, so translate by 1/2 pixels */
@@ -4167,7 +4126,7 @@ static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock,
GL_EXTCALL(glVertexAttrib4NubvARB(i, ptr));
break;
case WINED3DFMT_B8G8R8A8_UNORM:
- if (gl_info->supported[EXT_VERTEX_ARRAY_BGRA])
+ if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA])
{
const DWORD *src = (const DWORD *)ptr;
DWORD c = *src & 0xff00ff00;
@@ -4479,87 +4438,11 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
loadTexCoords(context, stateblock, si, &curVBO);
}
-static inline void drawPrimitiveTraceDataLocations(const struct wined3d_stream_info *dataLocations)
-{
- /* Dump out what parts we have supplied */
- TRACE("Strided Data:\n");
- TRACE_STRIDED((dataLocations), WINED3D_FFP_POSITION);
- TRACE_STRIDED((dataLocations), WINED3D_FFP_BLENDWEIGHT);
- TRACE_STRIDED((dataLocations), WINED3D_FFP_BLENDINDICES);
- TRACE_STRIDED((dataLocations), WINED3D_FFP_NORMAL);
- TRACE_STRIDED((dataLocations), WINED3D_FFP_PSIZE);
- TRACE_STRIDED((dataLocations), WINED3D_FFP_DIFFUSE);
- TRACE_STRIDED((dataLocations), WINED3D_FFP_SPECULAR);
- TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD0);
- TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD1);
- TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD2);
- TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD3);
- TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD4);
- TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD5);
- TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD6);
- TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD7);
-}
-
static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- const struct wined3d_gl_info *gl_info = context->gl_info;
IWineD3DDeviceImpl *device = stateblock->device;
- BOOL fixup = FALSE;
- struct wined3d_stream_info *dataLocations = &device->strided_streams;
- BOOL useVertexShaderFunction;
- BOOL load_numbered = FALSE;
- BOOL load_named = FALSE;
-
- useVertexShaderFunction = (device->vs_selected_mode != SHADER_NONE && stateblock->vertexShader) ? TRUE : FALSE;
-
- if(device->up_strided) {
- /* Note: this is a ddraw fixed-function code path */
- TRACE("================ Strided Input ===================\n");
- device_stream_info_from_strided(gl_info, device->up_strided, dataLocations);
-
- if(TRACE_ON(d3d)) {
- drawPrimitiveTraceDataLocations(dataLocations);
- }
- } else {
- /* Note: This is a fixed function or shader codepath.
- * This means it must handle both types of strided data.
- * Shaders must go through here to zero the strided data, even if they
- * don't set any declaration at all
- */
- TRACE("================ Vertex Declaration ===================\n");
- device_stream_info_from_declaration(device, useVertexShaderFunction, dataLocations, &fixup);
- }
-
- if (dataLocations->position_transformed) useVertexShaderFunction = FALSE;
-
- if(useVertexShaderFunction) {
- if(((IWineD3DVertexDeclarationImpl *) stateblock->vertexDecl)->half_float_conv_needed && !fixup) {
- TRACE("Using drawStridedSlow with vertex shaders for FLOAT16 conversion\n");
- device->useDrawStridedSlow = TRUE;
- } else {
- load_numbered = TRUE;
- device->useDrawStridedSlow = FALSE;
- }
- }
- else
- {
- WORD slow_mask = (1 << WINED3D_FFP_PSIZE);
- slow_mask |= -!gl_info->supported[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;
- }
- }
+ BOOL load_numbered = use_vs(stateblock) && !device->useDrawStridedSlow;
+ BOOL load_named = !use_vs(stateblock) && !device->useDrawStridedSlow;
if (context->numberedArraysLoaded && !load_numbered)
{
@@ -4576,13 +4459,13 @@ static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wi
if (load_numbered)
{
TRACE("Loading numbered arrays\n");
- loadNumberedArrays(stateblock, dataLocations, context);
+ loadNumberedArrays(stateblock, &device->strided_streams, context);
context->numberedArraysLoaded = TRUE;
}
else if (load_named)
{
TRACE("Loading vertex data\n");
- loadVertexData(context, stateblock, dataLocations);
+ loadVertexData(context, stateblock, &device->strided_streams);
context->namedArraysLoaded = TRUE;
}
}
@@ -5634,8 +5517,7 @@ static const struct StateEntryTemplate ffp_fragmentstate_template[] = {
/* Context activation is done by the caller. */
static void ffp_enable(IWineD3DDevice *iface, BOOL enable) { }
-static void ffp_fragment_get_caps(WINED3DDEVTYPE devtype,
- const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
+static void ffp_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
{
pCaps->TextureOpCaps = WINED3DTEXOPCAPS_ADD |
WINED3DTEXOPCAPS_ADDSIGNED |
@@ -5670,7 +5552,7 @@ static void ffp_fragment_get_caps(WINED3DDEVTYPE devtype,
if (gl_info->supported[ARB_TEXTURE_ENV_DOT3])
pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_DOTPRODUCT3;
- pCaps->MaxTextureBlendStages = gl_info->limits.texture_stages;
+ pCaps->MaxTextureBlendStages = gl_info->limits.textures;
pCaps->MaxSimultaneousTextures = gl_info->limits.textures;
}
@@ -5725,6 +5607,43 @@ static void multistate_apply_3(DWORD state, IWineD3DStateBlockImpl *stateblock,
stateblock->device->multistate_funcs[state][2](state, stateblock, context);
}
+static void prune_invalid_states(struct StateEntry *state_table, const struct wined3d_gl_info *gl_info)
+{
+ unsigned int start, last, i;
+
+ start = STATE_TEXTURESTAGE(gl_info->limits.texture_stages, 0);
+ last = STATE_TEXTURESTAGE(MAX_TEXTURES - 1, WINED3D_HIGHEST_TEXTURE_STATE);
+ for (i = start; i <= last; ++i)
+ {
+ state_table[i].representative = 0;
+ state_table[i].apply = state_undefined;
+ }
+
+ start = STATE_TRANSFORM(WINED3DTS_TEXTURE0 + gl_info->limits.texture_stages);
+ last = STATE_TRANSFORM(WINED3DTS_TEXTURE0 + MAX_TEXTURES - 1);
+ for (i = start; i <= last; ++i)
+ {
+ state_table[i].representative = 0;
+ state_table[i].apply = state_undefined;
+ }
+}
+
+static void validate_state_table(struct StateEntry *state_table)
+{
+ unsigned int i;
+
+ for (i = 0; i < STATE_HIGHEST + 1; ++i)
+ {
+ DWORD rep = state_table[i].representative;
+ if (rep && !state_table[rep].representative)
+ {
+ ERR("State %s (%#x) has invalid representative %s (%#x).\n",
+ debug_d3dstate(i), i, debug_d3dstate(rep), rep);
+ state_table[i].representative = 0;
+ }
+ }
+}
+
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)
@@ -5824,6 +5743,9 @@ HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_
}
}
+ prune_invalid_states(StateTable, gl_info);
+ validate_state_table(StateTable);
+
return WINED3D_OK;
out_of_mem:
diff --git a/dll/directx/wine/wined3d/surface.c b/dll/directx/wine/wined3d/surface.c
index 8dcc6915bbf..d17d35cc16d 100644
--- a/dll/directx/wine/wined3d/surface.c
+++ b/dll/directx/wine/wined3d/surface.c
@@ -1253,6 +1253,37 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb)
TRACE("Updated target %d\n", This->texture_target);
}
+/* Context activation is done by the caller. */
+void surface_prepare_texture(IWineD3DSurfaceImpl *surface, BOOL srgb)
+{
+ DWORD alloc_flag = srgb ? SFLAG_SRGBALLOCATED : SFLAG_ALLOCATED;
+ GLenum format, internal, type;
+ GLsizei width, height;
+ CONVERT_TYPES convert;
+ int bpp;
+
+ if (surface->Flags & alloc_flag) return;
+
+ d3dfmt_get_conv(surface, TRUE, TRUE, &format, &internal, &type, &convert, &bpp, srgb);
+ if(convert != NO_CONVERSION) surface->Flags |= SFLAG_CONVERTED;
+ else surface->Flags &= ~SFLAG_CONVERTED;
+
+ if ((surface->Flags & SFLAG_NONPOW2) && !(surface->Flags & SFLAG_OVERSIZE))
+ {
+ width = surface->pow2Width;
+ height = surface->pow2Height;
+ }
+ else
+ {
+ width = surface->glRect.right - surface->glRect.left;
+ height = surface->glRect.bottom - surface->glRect.top;
+ }
+
+ surface_bind_and_dirtify(surface, srgb);
+ surface_allocate_surface(surface, internal, width, height, format, type);
+ surface->Flags |= alloc_flag;
+}
+
static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This)
{
IWineD3DDeviceImpl *device = This->resource.device;
@@ -1822,7 +1853,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
* in which the main render target uses p8. Some games like GTA Vice City use P8 for texturing which
* conflicts with this.
*/
- if (!(gl_info->supported[EXT_PALETTED_TEXTURE] || (gl_info->supported[ARB_FRAGMENT_PROGRAM]
+ if (!(gl_info->supported[EXT_PALETTED_TEXTURE] || (device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup)
&& device->render_targets && This == (IWineD3DSurfaceImpl*)device->render_targets[0]))
|| colorkey_active || !use_texturing)
{
@@ -1836,7 +1867,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
*convert = CONVERT_PALETTED;
}
}
- else if (!gl_info->supported[EXT_PALETTED_TEXTURE] && gl_info->supported[ARB_FRAGMENT_PROGRAM])
+ else if (!gl_info->supported[EXT_PALETTED_TEXTURE] && device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup))
{
*format = GL_ALPHA;
*type = GL_UNSIGNED_BYTE;
@@ -2553,34 +2584,10 @@ 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");
+ device->blitter->set_shader((IWineD3DDevice *) device, This->resource.format_desc,
+ This->texture_target, This->pow2Width, This->pow2Height);
+
ENTER_GL();
-
- /* Create the fragment program if we don't have it */
- if(!device->paletteConversionShader)
- {
- const char *fragment_palette_conversion =
- "!!ARBfp1.0\n"
- "TEMP index;\n"
- /* { 255/256, 0.5/255*255/256, 0, 0 } */
- "PARAM constants = { 0.996, 0.00195, 0, 0 };\n"
- /* The alpha-component contains the palette index */
- "TEX index, fragment.texcoord[0], texture[0], 2D;\n"
- /* Scale the index by 255/256 and add a bias of '0.5' in order to sample in the middle */
- "MAD index.a, index.a, constants.x, constants.y;\n"
- /* Use the alpha-component as an index in the palette to get the final color */
- "TEX result.color, index.a, texture[1], 1D;\n"
- "END";
-
- glEnable(GL_FRAGMENT_PROGRAM_ARB);
- GL_EXTCALL(glGenProgramsARB(1, &device->paletteConversionShader));
- GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, device->paletteConversionShader));
- GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(fragment_palette_conversion), fragment_palette_conversion));
- glDisable(GL_FRAGMENT_PROGRAM_ARB);
- }
-
- glEnable(GL_FRAGMENT_PROGRAM_ARB);
- GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, device->paletteConversionShader));
-
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE1));
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
@@ -2594,7 +2601,6 @@ static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES conve
/* Rebind the texture because it isn't bound anymore */
glBindTexture(This->texture_target, This->texture_name);
-
LEAVE_GL();
}
}
@@ -2700,7 +2706,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadTexture(IWineD3DSurface *iface, BO
static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL srgb) {
/* TODO: check for locks */
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- IWineD3DDeviceImpl *device = This->resource.device;
IWineD3DBaseTexture *baseTexture = NULL;
TRACE("(%p)Checking to see if the container is a base texture\n", This);
@@ -2711,13 +2716,11 @@ static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL
}
else
{
- struct wined3d_context *context = NULL;
GLuint *name;
TRACE("(%p) : Binding surface\n", This);
name = srgb ? &This->texture_name_srgb : &This->texture_name;
- if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
ENTER_GL();
@@ -2751,8 +2754,6 @@ static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL
checkGLcall("glBindTexture");
LEAVE_GL();
-
- if (context) context_release(context);
}
}
@@ -3447,6 +3448,9 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
}
LEAVE_GL();
+
+ wglFlush(); /* Flush to ensure ordering across contexts. */
+
context_release(context);
/* The texture is now most up to date - If the surface is a render target and has a drawable, this
@@ -3921,9 +3925,7 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
/* Leave the opengl state valid for blitting */
myDevice->blitter->unset_shader((IWineD3DDevice *) myDevice);
- /* Flush in case the drawable is used by multiple GL contexts */
- if(dstSwapchain && (This == (IWineD3DSurfaceImpl *) dstSwapchain->frontBuffer || dstSwapchain->num_contexts >= 2))
- wglFlush();
+ wglFlush(); /* Flush to ensure ordering across contexts. */
context_release(context);
@@ -4552,7 +4554,11 @@ void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *co
else context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
LEAVE_GL();
- } else {
+
+ wglFlush(); /* Flush to ensure ordering across contexts. */
+ }
+ else
+ {
FIXME("No up to date depth stencil location\n");
}
} else if (location == SFLAG_DS_ONSCREEN) {
@@ -4569,7 +4575,11 @@ void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *co
if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER, &context->current_fbo->id);
LEAVE_GL();
- } else {
+
+ wglFlush(); /* Flush to ensure ordering across contexts. */
+ }
+ else
+ {
FIXME("No up to date depth stencil location\n");
}
} else {
@@ -4656,11 +4666,10 @@ static inline void cube_coords_float(const RECT *r, UINT w, UINT h, struct float
static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT *rect_in)
{
IWineD3DDeviceImpl *device = This->resource.device;
+ IWineD3DBaseTextureImpl *texture;
struct wined3d_context *context;
struct coords coords[4];
RECT rect;
- IWineD3DSwapChain *swapchain;
- IWineD3DBaseTexture *texture;
GLenum bind_target;
struct float_rect f;
@@ -4802,25 +4811,16 @@ static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT
LEAVE_GL();
- if(SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface*)This, &IID_IWineD3DSwapChain, (void **) &swapchain)))
- {
- /* 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)
- wglFlush();
+ wglFlush(); /* Flush to ensure ordering across contexts. */
- IWineD3DSwapChain_Release(swapchain);
- } else {
- /* We changed the filtering settings on the texture. Inform the container about this to get the filters
- * reset properly next draw
- */
- if(SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface*)This, &IID_IWineD3DBaseTexture, (void **) &texture)))
- {
- ((IWineD3DBaseTextureImpl *) texture)->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT;
- ((IWineD3DBaseTextureImpl *) texture)->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT;
- ((IWineD3DBaseTextureImpl *) texture)->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE;
- IWineD3DBaseTexture_Release(texture);
- }
+ /* We changed the filtering settings on the texture. Inform the
+ * container about this to get the filters reset properly next draw. */
+ if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)This, &IID_IWineD3DBaseTexture, (void **)&texture)))
+ {
+ texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT;
+ texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT;
+ texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE;
+ IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture);
}
context_release(context);
@@ -4977,7 +4977,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
{
/* Upload from system memory */
BOOL srgb = flag == SFLAG_INSRGBTEX;
- DWORD alloc_flag = srgb ? SFLAG_SRGBALLOCATED : SFLAG_ALLOCATED;
struct wined3d_context *context = NULL;
d3dfmt_get_conv(This, TRUE /* We need color keying */, TRUE /* We will use textures */,
@@ -5004,6 +5003,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
}
if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+
+ surface_prepare_texture(This, srgb);
surface_bind_and_dirtify(This, srgb);
if(This->CKeyFlags & WINEDDSD_CKSRCBLT) {
@@ -5037,17 +5038,13 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
return WINED3DERR_OUTOFVIDEOMEMORY;
}
d3dfmt_convert_surface(This->resource.allocatedMemory, mem, pitch, width, height, outpitch, convert, This);
-
- This->Flags |= SFLAG_CONVERTED;
}
else if (This->resource.format_desc->format == WINED3DFMT_P8_UINT
- && (gl_info->supported[EXT_PALETTED_TEXTURE] || gl_info->supported[ARB_FRAGMENT_PROGRAM]))
+ && (gl_info->supported[EXT_PALETTED_TEXTURE] || device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup)))
{
d3dfmt_p8_upload_palette(iface, convert);
- This->Flags &= ~SFLAG_CONVERTED;
mem = This->resource.allocatedMemory;
} else {
- This->Flags &= ~SFLAG_CONVERTED;
mem = This->resource.allocatedMemory;
}
@@ -5058,10 +5055,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
if ((This->Flags & SFLAG_NONPOW2) && !(This->Flags & SFLAG_OVERSIZE)) {
TRACE("non power of two support\n");
- if(!(This->Flags & alloc_flag)) {
- surface_allocate_surface(This, internal, This->pow2Width, This->pow2Height, format, type);
- This->Flags |= alloc_flag;
- }
if (mem || (This->Flags & SFLAG_PBO)) {
surface_upload_data(This, internal, This->currentDesc.Width, This->currentDesc.Height, format, type, mem);
}
@@ -5069,10 +5062,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
/* When making the realloc conditional, keep in mind that GL_APPLE_client_storage may be in use, and This->resource.allocatedMemory
* changed. So also keep track of memory changes. In this case the texture has to be reallocated
*/
- if(!(This->Flags & alloc_flag)) {
- surface_allocate_surface(This, internal, This->glRect.right - This->glRect.left, This->glRect.bottom - This->glRect.top, format, type);
- This->Flags |= alloc_flag;
- }
if (mem || (This->Flags & SFLAG_PBO)) {
surface_upload_data(This, internal, This->glRect.right - This->glRect.left, This->glRect.bottom - This->glRect.top, format, type, mem);
}
diff --git a/dll/directx/wine/wined3d/swapchain.c b/dll/directx/wine/wined3d/swapchain.c
index 6493704014b..cbdb961f705 100644
--- a/dll/directx/wine/wined3d/swapchain.c
+++ b/dll/directx/wine/wined3d/swapchain.c
@@ -217,6 +217,8 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
unsigned int sync;
int retval;
+ IWineD3DSwapChain_SetDestWindowOverride(iface, hDestWindowOverride);
+
context = context_acquire(This->device, This->backBuffer[0], CTXUSAGE_RESOURCELOAD);
/* Render the cursor onto the back buffer, using our nifty directdraw blitting code :-) */
@@ -272,12 +274,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
IWineD3DSurface_BltFast(This->backBuffer[0], 0, 0, This->device->logo_surface, NULL, WINEDDBLTFAST_SRCCOLORKEY);
}
- TRACE("presetting HDC %p\n", This->context[0]->hdc);
-
- /* Don't call checkGLcall, as glGetError is not applicable here */
- if (hDestWindowOverride && This->win_handle != hDestWindowOverride) {
- IWineD3DSwapChain_SetDestWindowOverride(iface, hDestWindowOverride);
- }
+ TRACE("Presenting HDC %p.\n", context->hdc);
render_to_fbo = This->render_to_fbo;
@@ -343,7 +340,8 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
swapchain_blit(This, context, &src_rect, &dst_rect);
}
- SwapBuffers(This->context[0]->hdc); /* TODO: cycle through the swapchain buffers */
+ if (This->num_contexts > 1) wglFinish();
+ SwapBuffers(context->hdc); /* TODO: cycle through the swapchain buffers */
TRACE("SwapBuffers called, Starting new frame\n");
/* FPS support */
@@ -521,7 +519,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_SetDestWindowOverride(IWineD3DSwapCh
WINED3DLOCKED_RECT r;
BYTE *mem;
- if(window == This->win_handle) return WINED3D_OK;
+ if (!window || window == This->win_handle) return WINED3D_OK;
TRACE("Performing dest override of swapchain %p from window %p to %p\n", This, This->win_handle, window);
if (This->context[0] == This->device->contexts[0])
@@ -913,10 +911,15 @@ err:
HeapFree(GetProcessHeap(), 0, swapchain->backBuffer);
}
- if (swapchain->context && swapchain->context[0])
+ if (swapchain->context)
{
- context_release(swapchain->context[0]);
- context_destroy(device, swapchain->context[0]);
+ if (swapchain->context[0])
+ {
+ context_release(swapchain->context[0]);
+ context_destroy(device, swapchain->context[0]);
+ swapchain->num_contexts = 0;
+ }
+ HeapFree(GetProcessHeap(), 0, swapchain->context);
}
if (swapchain->frontBuffer) IWineD3DSurface_Release(swapchain->frontBuffer);
diff --git a/dll/directx/wine/wined3d/utils.c b/dll/directx/wine/wined3d/utils.c
index c1e921da976..2ff16752c33 100644
--- a/dll/directx/wine/wined3d/utils.c
+++ b/dll/directx/wine/wined3d/utils.c
@@ -387,7 +387,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = {
GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
WINED3D_GL_EXT_NONE},
- {WINED3DFMT_R16G16_UNORM, GL_RGB16_EXT, GL_RGB16_EXT, GL_RGBA16_EXT,
+ {WINED3DFMT_R16G16_UNORM, GL_RGB16, GL_RGB16, GL_RGBA16,
GL_RGB, GL_UNSIGNED_SHORT,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
WINED3D_GL_EXT_NONE},
@@ -395,7 +395,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = {
GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
WINED3D_GL_EXT_NONE},
- {WINED3DFMT_R16G16B16A16_UNORM, GL_RGBA16_EXT, GL_RGBA16_EXT, 0,
+ {WINED3DFMT_R16G16B16A16_UNORM, GL_RGBA16, GL_RGBA16, 0,
GL_RGBA, GL_UNSIGNED_SHORT,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
WINED3D_GL_EXT_NONE},
@@ -445,7 +445,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = {
GL_RGBA, GL_BYTE,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
NV_TEXTURE_SHADER},
- {WINED3DFMT_R16G16_SNORM, GL_RGB16_EXT, GL_RGB16_EXT, 0,
+ {WINED3DFMT_R16G16_SNORM, GL_RGB16, GL_RGB16, 0,
GL_BGR, GL_UNSIGNED_SHORT,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
WINED3D_GL_EXT_NONE},
@@ -506,7 +506,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = {
GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH,
ARB_DEPTH_TEXTURE},
- {WINED3DFMT_L16_UNORM, GL_LUMINANCE16_EXT, GL_LUMINANCE16_EXT, 0,
+ {WINED3DFMT_L16_UNORM, GL_LUMINANCE16, GL_LUMINANCE16, 0,
GL_LUMINANCE, GL_UNSIGNED_SHORT,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
WINED3D_GL_EXT_NONE},
@@ -950,7 +950,7 @@ static void init_format_filter_info(struct wined3d_gl_info *gl_info, enum wined3
if(wined3d_settings.offscreen_rendering_mode != ORM_FBO)
{
WARN("No FBO support, or no FBO ORM, guessing filter info from GL caps\n");
- if (vendor == VENDOR_NVIDIA && gl_info->supported[ARB_TEXTURE_FLOAT])
+ if (vendor == HW_VENDOR_NVIDIA && gl_info->supported[ARB_TEXTURE_FLOAT])
{
TRACE("Nvidia card with texture_float support: Assuming float16 blending\n");
filtered = TRUE;
@@ -1088,17 +1088,20 @@ static void apply_format_fixups(struct wined3d_gl_info *gl_info)
if (!gl_info->supported[APPLE_YCBCR_422])
{
idx = getFmtIdx(WINED3DFMT_YUY2);
- gl_info->gl_formats[idx].color_fixup = create_yuv_fixup_desc(YUV_FIXUP_YUY2);
+ gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YUY2);
idx = getFmtIdx(WINED3DFMT_UYVY);
- gl_info->gl_formats[idx].color_fixup = create_yuv_fixup_desc(YUV_FIXUP_UYVY);
+ gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_UYVY);
}
idx = getFmtIdx(WINED3DFMT_YV12);
gl_info->gl_formats[idx].heightscale = 1.5f;
- gl_info->gl_formats[idx].color_fixup = create_yuv_fixup_desc(YUV_FIXUP_YV12);
+ gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YV12);
- if (gl_info->supported[EXT_VERTEX_ARRAY_BGRA])
+ idx = getFmtIdx(WINED3DFMT_P8_UINT);
+ gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_P8);
+
+ if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA])
{
idx = getFmtIdx(WINED3DFMT_B8G8R8A8_UNORM);
gl_info->gl_formats[idx].gl_vtx_format = GL_BGRA;
@@ -1786,6 +1789,51 @@ const char* debug_d3dtstype(WINED3DTRANSFORMSTATETYPE tstype) {
}
}
+const char *debug_d3dstate(DWORD state)
+{
+ if (STATE_IS_RENDER(state))
+ return wine_dbg_sprintf("STATE_RENDER(%s)", debug_d3drenderstate(state - STATE_RENDER(0)));
+ if (STATE_IS_TEXTURESTAGE(state))
+ {
+ DWORD texture_stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
+ DWORD texture_state = state - STATE_TEXTURESTAGE(texture_stage, 0);
+ return wine_dbg_sprintf("STATE_TEXTURESTAGE(%#x, %s)",
+ texture_stage, debug_d3dtexturestate(texture_state));
+ }
+ if (STATE_IS_SAMPLER(state))
+ return wine_dbg_sprintf("STATE_SAMPLER(%#x)", state - STATE_SAMPLER(0));
+ if (STATE_IS_PIXELSHADER(state))
+ return "STATE_PIXELSHADER";
+ if (STATE_IS_TRANSFORM(state))
+ return wine_dbg_sprintf("STATE_TRANSFORM(%s)", debug_d3dtstype(state - STATE_TRANSFORM(0)));
+ if (STATE_IS_STREAMSRC(state))
+ return "STATE_STREAMSRC";
+ if (STATE_IS_INDEXBUFFER(state))
+ return "STATE_INDEXBUFFER";
+ if (STATE_IS_VDECL(state))
+ return "STATE_VDECL";
+ if (STATE_IS_VSHADER(state))
+ return "STATE_VSHADER";
+ if (STATE_IS_VIEWPORT(state))
+ return "STATE_VIEWPORT";
+ if (STATE_IS_VERTEXSHADERCONSTANT(state))
+ return "STATE_VERTEXSHADERCONSTANT";
+ if (STATE_IS_PIXELSHADERCONSTANT(state))
+ return "STATE_PIXELSHADERCONSTANT";
+ if (STATE_IS_ACTIVELIGHT(state))
+ return wine_dbg_sprintf("STATE_ACTIVELIGHT(%#x)", state - STATE_ACTIVELIGHT(0));
+ if (STATE_IS_SCISSORRECT(state))
+ return "STATE_SCISSORRECT";
+ if (STATE_IS_CLIPPLANE(state))
+ return wine_dbg_sprintf("STATE_CLIPPLANE(%#x)", state - STATE_CLIPPLANE(0));
+ if (STATE_IS_MATERIAL(state))
+ return "STATE_MATERIAL";
+ if (STATE_IS_FRONTFACE(state))
+ return "STATE_FRONTFACE";
+
+ return wine_dbg_sprintf("UNKNOWN_STATE(%#x)", state);
+}
+
const char* debug_d3dpool(WINED3DPOOL Pool) {
switch (Pool) {
#define POOL_TO_STR(p) case p: return #p
@@ -1868,8 +1916,8 @@ static const char *debug_fixup_channel_source(enum fixup_channel_source source)
WINED3D_TO_STR(CHANNEL_SOURCE_Y);
WINED3D_TO_STR(CHANNEL_SOURCE_Z);
WINED3D_TO_STR(CHANNEL_SOURCE_W);
- WINED3D_TO_STR(CHANNEL_SOURCE_YUV0);
- WINED3D_TO_STR(CHANNEL_SOURCE_YUV1);
+ WINED3D_TO_STR(CHANNEL_SOURCE_COMPLEX0);
+ WINED3D_TO_STR(CHANNEL_SOURCE_COMPLEX1);
#undef WINED3D_TO_STR
default:
FIXME("Unrecognized fixup_channel_source %#x\n", source);
@@ -1877,26 +1925,27 @@ static const char *debug_fixup_channel_source(enum fixup_channel_source source)
}
}
-static const char *debug_yuv_fixup(enum yuv_fixup yuv_fixup)
+static const char *debug_complex_fixup(enum complex_fixup fixup)
{
- switch(yuv_fixup)
+ switch(fixup)
{
#define WINED3D_TO_STR(x) case x: return #x
- WINED3D_TO_STR(YUV_FIXUP_YUY2);
- WINED3D_TO_STR(YUV_FIXUP_UYVY);
- WINED3D_TO_STR(YUV_FIXUP_YV12);
+ WINED3D_TO_STR(COMPLEX_FIXUP_YUY2);
+ WINED3D_TO_STR(COMPLEX_FIXUP_UYVY);
+ WINED3D_TO_STR(COMPLEX_FIXUP_YV12);
+ WINED3D_TO_STR(COMPLEX_FIXUP_P8);
#undef WINED3D_TO_STR
default:
- FIXME("Unrecognized YUV fixup %#x\n", yuv_fixup);
+ FIXME("Unrecognized complex fixup %#x\n", fixup);
return "unrecognized";
}
}
void dump_color_fixup_desc(struct color_fixup_desc fixup)
{
- if (is_yuv_fixup(fixup))
+ if (is_complex_fixup(fixup))
{
- TRACE("\tYUV: %s\n", debug_yuv_fixup(get_yuv_fixup(fixup)));
+ TRACE("\tComplex: %s\n", debug_complex_fixup(get_complex_fixup(fixup)));
return;
}
@@ -2795,40 +2844,3 @@ void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected,
else if (gl_info->supported[ATI_FRAGMENT_SHADER]) *ps_selected = SHADER_ATI;
else *ps_selected = SHADER_NONE;
}
-
-const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter, WINED3DDEVTYPE device_type)
-{
- int vs_selected_mode, ps_selected_mode;
-
- select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode);
- if (vs_selected_mode == SHADER_GLSL || ps_selected_mode == SHADER_GLSL) return &glsl_shader_backend;
- if (vs_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_ARB) return &arb_program_shader_backend;
- return &none_shader_backend;
-}
-
-const struct fragment_pipeline *select_fragment_implementation(struct wined3d_adapter *adapter,
- WINED3DDEVTYPE device_type)
-{
- const struct wined3d_gl_info *gl_info = &adapter->gl_info;
- int vs_selected_mode, ps_selected_mode;
-
- select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode);
- if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL)
- && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_fragment_pipeline;
- else if (ps_selected_mode == SHADER_ATI) return &atifs_fragment_pipeline;
- else if (gl_info->supported[NV_REGISTER_COMBINERS]
- && gl_info->supported[NV_TEXTURE_SHADER2]) return &nvts_fragment_pipeline;
- else if (gl_info->supported[NV_REGISTER_COMBINERS]) return &nvrc_fragment_pipeline;
- else return &ffp_fragment_pipeline;
-}
-
-const struct blit_shader *select_blit_implementation(struct wined3d_adapter *adapter, WINED3DDEVTYPE device_type)
-{
- const struct wined3d_gl_info *gl_info = &adapter->gl_info;
- int vs_selected_mode, ps_selected_mode;
-
- select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode);
- if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL)
- && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_blit;
- else return &ffp_blit;
-}
diff --git a/dll/directx/wine/wined3d/wined3d.rbuild b/dll/directx/wine/wined3d/wined3d.rbuild
index 7262e66e4b5..5a42ff6064a 100644
--- a/dll/directx/wine/wined3d/wined3d.rbuild
+++ b/dll/directx/wine/wined3d/wined3d.rbuild
@@ -16,7 +16,6 @@
ati_fragment_shader.c
arb_program_shader.c
- baseshader.c
basetexture.c
buffer.c
clipper.c
diff --git a/dll/directx/wine/wined3d/wined3d_gl.h b/dll/directx/wine/wined3d/wined3d_gl.h
index d6d9794933f..f8097d65cb9 100644
--- a/dll/directx/wine/wined3d/wined3d_gl.h
+++ b/dll/directx/wine/wined3d/wined3d_gl.h
@@ -75,6 +75,9 @@ typedef double GLclampd;
typedef void GLvoid;
typedef ptrdiff_t GLintptr;
typedef ptrdiff_t GLsizeiptr;
+typedef INT64 GLint64;
+typedef UINT64 GLuint64;
+typedef struct __GLsync *GLsync;
/* Booleans */
#define GL_FALSE 0x0
@@ -804,6 +807,197 @@ typedef ptrdiff_t GLsizeiptr;
#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
#define GL_MULTISAMPLE_BIT 0x20000000
+/* GL_VERSION_2_0 */
+#ifndef GL_VERSION_2_0
+#define GL_VERSION_2_0 1
+#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
+#define GL_CURRENT_VERTEX_ATTRIB 0x8626
+#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
+#define GL_STENCIL_BACK_FUNC 0x8800
+#define GL_STENCIL_BACK_FAIL 0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
+#define GL_MAX_DRAW_BUFFERS 0x8824
+#define GL_DRAW_BUFFER0 0x8825
+#define GL_DRAW_BUFFER1 0x8826
+#define GL_DRAW_BUFFER2 0x8827
+#define GL_DRAW_BUFFER3 0x8828
+#define GL_DRAW_BUFFER4 0x8829
+#define GL_DRAW_BUFFER5 0x882a
+#define GL_DRAW_BUFFER6 0x882b
+#define GL_DRAW_BUFFER7 0x882c
+#define GL_DRAW_BUFFER8 0x882d
+#define GL_DRAW_BUFFER9 0x882e
+#define GL_DRAW_BUFFER10 0x882f
+#define GL_DRAW_BUFFER11 0x8830
+#define GL_DRAW_BUFFER12 0x8831
+#define GL_DRAW_BUFFER13 0x8832
+#define GL_DRAW_BUFFER14 0x8833
+#define GL_DRAW_BUFFER15 0x8834
+#define GL_BLEND_EQUATION_ALPHA 0x883d
+#define GL_POINT_SPRITE 0x8861
+#define GL_COORD_REPLACE 0x8862
+#define GL_MAX_VERTEX_ATTRIBS 0x8869
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886a
+#define GL_MAX_TEXTURE_COORDS 0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
+#define GL_FRAGMENT_SHADER 0x8b30
+#define GL_VERTEX_SHADER 0x8b31
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8b49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8b4a
+#define GL_MAX_VARYING_FLOATS 0x8b4b
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8b4c
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8b4d
+#define GL_SHADER_TYPE 0x8b4f
+#define GL_FLOAT_VEC2 0x8b50
+#define GL_FLOAT_VEC3 0x8b51
+#define GL_FLOAT_VEC4 0x8b52
+#define GL_INT_VEC2 0x8b53
+#define GL_INT_VEC3 0x8b54
+#define GL_INT_VEC4 0x8b55
+#define GL_BOOL 0x8b56
+#define GL_BOOL_VEC2 0x8b57
+#define GL_BOOL_VEC3 0x8b58
+#define GL_BOOL_VEC4 0x8b59
+#define GL_FLOAT_MAT2 0x8b5a
+#define GL_FLOAT_MAT3 0x8b5b
+#define GL_FLOAT_MAT4 0x8b5c
+#define GL_SAMPLER_1D 0x8b5d
+#define GL_SAMPLER_2D 0x8b5e
+#define GL_SAMPLER_3D 0x8b5f
+#define GL_SAMPLER_CUBE 0x8b60
+#define GL_SAMPLER_1D_SHADOW 0x8b61
+#define GL_SAMPLER_2D_SHADOW 0x8b62
+#define GL_DELETE_STATUS 0x8b80
+#define GL_COMPILE_STATUS 0x8b81
+#define GL_LINK_STATUS 0x8b82
+#define GL_VALIDATE_STATUS 0x8b83
+#define GL_INFO_LOG_LENGTH 0x8b84
+#define GL_ATTACHED_SHADERS 0x8b85
+#define GL_ACTIVE_UNIFORMS 0x8b86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8b87
+#define GL_SHADER_SOURCE_LENGTH 0x8b88
+#define GL_ACTIVE_ATTRIBUTES 0x8b89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8b8a
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8b8b
+#define GL_SHADING_LANGUAGE_VERSION 0x8b8c
+#define GL_CURRENT_PROGRAM 0x8b8d
+#define GL_POINT_SPRITE_COORD_ORIGIN 0x8ca0
+#define GL_LOWER_LEFT 0x8ca1
+#define GL_UPPER_LEFT 0x8ca2
+#define GL_STENCIL_BACK_REF 0x8ca3
+#define GL_STENCIL_BACK_VALUE_MASK 0x8ca4
+#define GL_STENCIL_BACK_WRITEMASK 0x8ca5
+typedef char GLchar;
+#endif
+typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSPROC)(GLsizei n, const GLenum *bufs);
+typedef void (WINE_GLAPI *PGLFNSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (WINE_GLAPI *PGLFNSTENCILFUNCSEPARATEPROC)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
+typedef void (WINE_GLAPI *PGLFNSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask);
+typedef void (WINE_GLAPI *PGLFNATTACHSHADERPROC)(GLuint program, GLuint shader);
+typedef void (WINE_GLAPI *PGLFNBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar *name);
+typedef void (WINE_GLAPI *PGLFNCOMPILESHADERPROC)(GLuint shader);
+typedef GLuint (WINE_GLAPI *PGLFNCREATEPROGRAMPROC)(void);
+typedef GLuint (WINE_GLAPI *PGLFNCREATESHADERPROC)(GLenum type);
+typedef void (WINE_GLAPI *PGLFNDELETEPROGRAMPROC)(GLuint program);
+typedef void (WINE_GLAPI *PGLFNDELETESHADERPROC)(GLuint shader);
+typedef void (WINE_GLAPI *PGLFNDETACHSHADERPROC)(GLuint program, GLuint shader);
+typedef void (WINE_GLAPI *PGLFNDISABLEVERTEXATTRIBARRAYPROC)(GLuint index);
+typedef void (WINE_GLAPI *PGLFNENABLEVERTEXATTRIBARRAYPROC)(GLuint index);
+typedef void (WINE_GLAPI *PGLFNGETACTIVEATTRIBPROC)(GLuint program,
+ GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (WINE_GLAPI *PGLFNGETACTIVEUNIFORMPROC)(GLuint program,
+ GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (WINE_GLAPI *PGLFNGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+typedef GLint (WINE_GLAPI *PGLFNGETATTRIBLOCATIONPROC)(GLuint program, const GLchar *name);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMINFOLOGPROC)(GLuint program,
+ GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (WINE_GLAPI *PGLFNGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (WINE_GLAPI *PGLFNGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+typedef GLint (WINE_GLAPI *PGLFNGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar *name);
+typedef void (WINE_GLAPI *PGLFNGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETUNIFORMIVPROC)(GLuint program, GLint location, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, GLvoid* *pointer);
+typedef GLboolean (WINE_GLAPI *PGLFNISPROGRAMPROC)(GLuint program);
+typedef GLboolean (WINE_GLAPI *PGLFNISSHADERPROC)(GLuint shader);
+typedef void (WINE_GLAPI *PGLFNLINKPROGRAMPROC)(GLuint program);
+typedef void (WINE_GLAPI *PGLFNSHADERSOURCEPROC)(GLuint shader,
+ GLsizei count, const GLchar* *string, const GLint *length);
+typedef void (WINE_GLAPI *PGLFNUSEPROGRAMPROC)(GLuint program);
+typedef void (WINE_GLAPI *PGLFNUNIFORM1FPROC)(GLint location, GLfloat v0);
+typedef void (WINE_GLAPI *PGLFNUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1);
+typedef void (WINE_GLAPI *PGLFNUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (WINE_GLAPI *PGLFNUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (WINE_GLAPI *PGLFNUNIFORM1IPROC)(GLint location, GLint v0);
+typedef void (WINE_GLAPI *PGLFNUNIFORM2IPROC)(GLint location, GLint v0, GLint v1);
+typedef void (WINE_GLAPI *PGLFNUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (WINE_GLAPI *PGLFNUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (WINE_GLAPI *PGLFNUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORMMATRIX2FVPROC)(GLint location,
+ GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORMMATRIX3FVPROC)(GLint location,
+ GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORMMATRIX4FVPROC)(GLint location,
+ GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNVALIDATEPROGRAMPROC)(GLuint program);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DPROC)(GLuint index, GLdouble x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FPROC)(GLuint index, GLfloat x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SPROC)(GLuint index, GLshort x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SVPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SVPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SVPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NIVPROC)(GLuint index, const GLint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4IVPROC)(GLuint index, const GLint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SVPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4USVPROC)(GLuint index, const GLushort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBPOINTERPROC)(GLuint index,
+ GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+
void (WINE_GLAPI *glAccum)(GLenum op, GLfloat value) DECLSPEC_HIDDEN;
void (WINE_GLAPI *glAlphaFunc)(GLenum func, GLclampf ref) DECLSPEC_HIDDEN;
GLboolean (WINE_GLAPI *glAreTexturesResident)(GLsizei n, const GLuint *textures, GLboolean *residences) DECLSPEC_HIDDEN;
@@ -1524,68 +1718,273 @@ BOOL (WINAPI *pwglShareLists)(HGLRC, HGLRC) DECLSPEC_HIDDEN;
USE_WGL_FUNC(wglMakeCurrent) \
USE_WGL_FUNC(wglShareLists)
+/* OpenGL extensions. */
+typedef enum wined3d_gl_extension
+{
+ WINED3D_GL_EXT_NONE,
-/****************************************************
- * OpenGL Extensions (EXT and ARB)
- * #defines and functions pointer
- ****************************************************/
+ /* APPLE */
+ APPLE_CLIENT_STORAGE,
+ APPLE_FENCE,
+ APPLE_FLOAT_PIXELS,
+ APPLE_FLUSH_BUFFER_RANGE,
+ APPLE_FLUSH_RENDER,
+ APPLE_YCBCR_422,
+ /* ARB */
+ ARB_COLOR_BUFFER_FLOAT,
+ ARB_DEPTH_BUFFER_FLOAT,
+ ARB_DEPTH_CLAMP,
+ ARB_DEPTH_TEXTURE,
+ ARB_DRAW_BUFFERS,
+ ARB_FRAGMENT_PROGRAM,
+ ARB_FRAGMENT_SHADER,
+ ARB_FRAMEBUFFER_OBJECT,
+ ARB_GEOMETRY_SHADER4,
+ ARB_HALF_FLOAT_PIXEL,
+ ARB_HALF_FLOAT_VERTEX,
+ ARB_IMAGING,
+ ARB_MAP_BUFFER_RANGE,
+ ARB_MULTISAMPLE,
+ ARB_MULTITEXTURE,
+ ARB_OCCLUSION_QUERY,
+ ARB_PIXEL_BUFFER_OBJECT,
+ ARB_POINT_PARAMETERS,
+ ARB_POINT_SPRITE,
+ ARB_PROVOKING_VERTEX,
+ ARB_SHADER_OBJECTS,
+ ARB_SHADER_TEXTURE_LOD,
+ ARB_SHADING_LANGUAGE_100,
+ ARB_SYNC,
+ ARB_TEXTURE_BORDER_CLAMP,
+ ARB_TEXTURE_COMPRESSION,
+ ARB_TEXTURE_CUBE_MAP,
+ ARB_TEXTURE_ENV_ADD,
+ ARB_TEXTURE_ENV_COMBINE,
+ ARB_TEXTURE_ENV_DOT3,
+ ARB_TEXTURE_FLOAT,
+ ARB_TEXTURE_MIRRORED_REPEAT,
+ ARB_TEXTURE_NON_POWER_OF_TWO,
+ ARB_TEXTURE_RECTANGLE,
+ ARB_TEXTURE_RG,
+ ARB_VERTEX_ARRAY_BGRA,
+ ARB_VERTEX_BLEND,
+ ARB_VERTEX_BUFFER_OBJECT,
+ ARB_VERTEX_PROGRAM,
+ ARB_VERTEX_SHADER,
+ /* ATI */
+ ATI_FRAGMENT_SHADER,
+ ATI_SEPARATE_STENCIL,
+ ATI_TEXTURE_COMPRESSION_3DC,
+ ATI_TEXTURE_ENV_COMBINE3,
+ ATI_TEXTURE_MIRROR_ONCE,
+ /* EXT */
+ EXT_BLEND_COLOR,
+ EXT_BLEND_EQUATION_SEPARATE,
+ EXT_BLEND_FUNC_SEPARATE,
+ EXT_BLEND_MINMAX,
+ EXT_FOG_COORD,
+ EXT_FRAMEBUFFER_BLIT,
+ EXT_FRAMEBUFFER_MULTISAMPLE,
+ EXT_FRAMEBUFFER_OBJECT,
+ EXT_GPU_PROGRAM_PARAMETERS,
+ EXT_GPU_SHADER4,
+ EXT_PACKED_DEPTH_STENCIL,
+ EXT_PALETTED_TEXTURE,
+ EXT_POINT_PARAMETERS,
+ EXT_PROVOKING_VERTEX,
+ EXT_SECONDARY_COLOR,
+ EXT_STENCIL_TWO_SIDE,
+ EXT_STENCIL_WRAP,
+ EXT_TEXTURE3D,
+ EXT_TEXTURE_COMPRESSION_RGTC,
+ EXT_TEXTURE_COMPRESSION_S3TC,
+ EXT_TEXTURE_ENV_ADD,
+ EXT_TEXTURE_ENV_COMBINE,
+ EXT_TEXTURE_ENV_DOT3,
+ EXT_TEXTURE_FILTER_ANISOTROPIC,
+ EXT_TEXTURE_LOD_BIAS,
+ EXT_TEXTURE_SRGB,
+ EXT_VERTEX_ARRAY_BGRA,
+ /* NVIDIA */
+ NV_DEPTH_CLAMP,
+ NV_FENCE,
+ NV_FOG_DISTANCE,
+ NV_FRAGMENT_PROGRAM,
+ NV_FRAGMENT_PROGRAM2,
+ NV_FRAGMENT_PROGRAM_OPTION,
+ NV_HALF_FLOAT,
+ NV_LIGHT_MAX_EXPONENT,
+ NV_REGISTER_COMBINERS,
+ NV_REGISTER_COMBINERS2,
+ NV_TEXGEN_REFLECTION,
+ NV_TEXTURE_ENV_COMBINE4,
+ NV_TEXTURE_SHADER,
+ NV_TEXTURE_SHADER2,
+ NV_VERTEX_PROGRAM,
+ NV_VERTEX_PROGRAM1_1,
+ NV_VERTEX_PROGRAM2,
+ NV_VERTEX_PROGRAM2_OPTION,
+ NV_VERTEX_PROGRAM3,
+ /* SGI */
+ SGIS_GENERATE_MIPMAP,
+ SGI_VIDEO_SYNC,
+ /* WGL extensions */
+ WGL_ARB_PBUFFER,
+ WGL_ARB_PIXEL_FORMAT,
+ WGL_WINE_PIXEL_FORMAT_PASSTHROUGH,
+ /* Internally used */
+ WINE_NORMALIZED_TEXRECT,
+
+ WINED3D_GL_EXT_COUNT,
+} GL_SupportedExt;
+
+/* GL_APPLE_client_storage */
+#ifndef GL_APPLE_client_storage
+#define GL_APPLE_client_storage 1
+#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85b2
+#endif
+
+/* GL_APPLE_fence */
+#ifndef GL_APPLE_fence
+#define GL_APPLE_fence 1
+#define GL_DRAW_PIXELS_APPLE 0x8a0a
+#define GL_FENCE_APPLE 0x8a0b
+#endif
+typedef void (WINE_GLAPI *PGLFNGENFENCESAPPLEPROC)(GLsizei, GLuint *);
+typedef void (WINE_GLAPI *PGLFNDELETEFENCESAPPLEPROC)(GLuint, const GLuint *);
+typedef void (WINE_GLAPI *PGLFNSETFENCEAPPLEPROC)(GLuint);
+typedef GLboolean (WINE_GLAPI *PGLFNTESTFENCEAPPLEPROC)(GLuint);
+typedef void (WINE_GLAPI *PGLFNFINISHFENCEAPPLEPROC)(GLuint);
+typedef GLboolean (WINE_GLAPI *PGLFNISFENCEAPPLEPROC)(GLuint);
+typedef GLboolean (WINE_GLAPI *PGLFNTESTOBJECTAPPLEPROC)(GLenum, GLuint);
+typedef void (WINE_GLAPI *PGLFNFINISHOBJECTAPPLEPROC)(GLenum, GLuint);
+
+/* GL_APPLE_float_pixels */
+#ifndef GL_APPLE_float_pixels
+#define GL_APPLE_float_pixels 1
+#define GL_HALF_APPLE 0x140b
+#define GL_COLOR_FLOAT_APPLE 0x8a0f
+#define GL_RGBA_FLOAT32_APPLE 0x8814
+#define GL_RGB_FLOAT32_APPLE 0x8815
+#define GL_ALPHA_FLOAT32_APPLE 0x8816
+#define GL_INTENSITY_FLOAT32_APPLE 0x8817
+#define GL_LUMINANCE_FLOAT32_APPLE 0x8818
+#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819
+#define GL_RGBA_FLOAT16_APPLE 0x881a
+#define GL_RGB_FLOAT16_APPLE 0x881b
+#define GL_ALPHA_FLOAT16_APPLE 0x881c
+#define GL_INTENSITY_FLOAT16_APPLE 0x881d
+#define GL_LUMINANCE_FLOAT16_APPLE 0x881e
+#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881f
+#endif
+
+/* GL_APPLE_flush_buffer_range */
+#ifndef GL_APPLE_flush_buffer_range
+#define GL_APPLE_flush_buffer_range 1
+#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8a12
+#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8a13
+typedef void (WINE_GLAPI *PGLFNBUFFERPARAMETERIAPPLE)(GLenum target, GLenum pname, GLint param);
+typedef void (WINE_GLAPI *PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE)(GLenum target, GLintptr offset, GLsizeiptr size);
+#endif
+
+/* GL_APPLE_flush_render */
+typedef void (WINE_GLAPI *PGLFNFLUSHRENDERAPPLEPROC)(void);
+typedef void (WINE_GLAPI *PGLFNFINISHRENDERAPPLEPROC)(void);
+
+/* GL_APPLE_ycbcr_422 */
+#ifndef GL_APPLE_ycbcr_422
+#define GL_APPLE_ycbcr_422 1
+#define GL_YCBCR_422_APPLE 0x85b9
+#define UNSIGNED_SHORT_8_8_APPLE 0x85ba
+#define UNSIGNED_SHORT_8_8_REV_APPLE 0x85bb
+#endif
/* GL_ARB_color_buffer_float */
#ifndef GL_ARB_color_buffer_float
-#define GL_RGBA_FLOAT_MODE_ARB 0x8820
-#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A
-#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B
-#define GL_CLAMP_READ_COLOR_ARB 0x891C
-#define GL_FIXED_ONLY_ARB 0x891D
+#define GL_ARB_color_buffer_float 1
+#define GL_RGBA_FLOAT_MODE_ARB 0x8820
+#define GL_CLAMP_VERTEX_COLOR_ARB 0x891a
+#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891b
+#define GL_CLAMP_READ_COLOR_ARB 0x891c
+#define GL_FIXED_ONLY_ARB 0x891d
#endif
-typedef void (WINE_GLAPI *PGLFNCLAMPCOLORARBPROC) (GLenum target, GLenum clamp);
+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
+#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
+#define GL_DEPTH_CLAMP 0x864f
#endif
/* GL_ARB_depth_texture */
#ifndef GL_ARB_depth_texture
#define GL_ARB_depth_texture 1
-#define GL_DEPTH_COMPONENT16_ARB 0x81A5
-#define GL_DEPTH_COMPONENT24_ARB 0x81A6
-#define GL_DEPTH_COMPONENT32_ARB 0x81A7
-#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A
-#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B
+#define GL_DEPTH_COMPONENT16_ARB 0x81a5
+#define GL_DEPTH_COMPONENT24_ARB 0x81a6
+#define GL_DEPTH_COMPONENT32_ARB 0x81a7
+#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884a
+#define GL_DEPTH_TEXTURE_MODE_ARB 0x884b
#endif
/* GL_ARB_draw_buffers */
#ifndef GL_ARB_draw_buffers
#define GL_ARB_draw_buffers 1
-#define GL_MAX_DRAW_BUFFERS_ARB 0x8824
-#define GL_DRAW_BUFFER0_ARB 0x8825
-#define GL_DRAW_BUFFER1_ARB 0x8826
-#define GL_DRAW_BUFFER2_ARB 0x8827
-#define GL_DRAW_BUFFER3_ARB 0x8828
-#define GL_DRAW_BUFFER4_ARB 0x8829
-#define GL_DRAW_BUFFER5_ARB 0x882A
-#define GL_DRAW_BUFFER6_ARB 0x882B
-#define GL_DRAW_BUFFER7_ARB 0x882C
-#define GL_DRAW_BUFFER8_ARB 0x882D
-#define GL_DRAW_BUFFER9_ARB 0x882E
-#define GL_DRAW_BUFFER10_ARB 0x882F
-#define GL_DRAW_BUFFER11_ARB 0x8830
-#define GL_DRAW_BUFFER12_ARB 0x8831
-#define GL_DRAW_BUFFER13_ARB 0x8832
-#define GL_DRAW_BUFFER14_ARB 0x8833
-#define GL_DRAW_BUFFER15_ARB 0x8834
+#define GL_MAX_DRAW_BUFFERS_ARB 0x8824
+#define GL_DRAW_BUFFER0_ARB 0x8825
+#define GL_DRAW_BUFFER1_ARB 0x8826
+#define GL_DRAW_BUFFER2_ARB 0x8827
+#define GL_DRAW_BUFFER3_ARB 0x8828
+#define GL_DRAW_BUFFER4_ARB 0x8829
+#define GL_DRAW_BUFFER5_ARB 0x882a
+#define GL_DRAW_BUFFER6_ARB 0x882b
+#define GL_DRAW_BUFFER7_ARB 0x882c
+#define GL_DRAW_BUFFER8_ARB 0x882d
+#define GL_DRAW_BUFFER9_ARB 0x882e
+#define GL_DRAW_BUFFER10_ARB 0x882f
+#define GL_DRAW_BUFFER11_ARB 0x8830
+#define GL_DRAW_BUFFER12_ARB 0x8831
+#define GL_DRAW_BUFFER13_ARB 0x8832
+#define GL_DRAW_BUFFER14_ARB 0x8833
+#define GL_DRAW_BUFFER15_ARB 0x8834
+#endif
+typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSARBPROC)(GLsizei n, const GLenum *bufs);
+
+/* GL_ARB_fragment_program */
+#ifndef GL_ARB_fragment_program
+#define GL_ARB_fragment_program 1
+#define GL_FRAGMENT_PROGRAM_ARB 0x8804
+#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805
+#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806
+#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807
+#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808
+#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809
+#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880a
+#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880b
+#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880c
+#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880d
+#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880e
+#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880f
+#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810
+#define GL_MAX_TEXTURE_COORDS_ARB 0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872
+/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */
+#endif
+
+/* GL_ARB_fragment_shader */
+#ifndef GL_ARB_fragment_shader
+#define GL_ARB_fragment_shader 1
+#define GL_FRAGMENT_SHADER_ARB 0x8b30
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8b49
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8b8b
#endif
-typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs);
/* GL_ARB_framebuffer_object */
#ifndef GL_ARB_framebuffer_object
@@ -1665,58 +2064,59 @@ typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *buf
#define GL_DEPTH24_STENCIL8 0x88f0
#define GL_TEXTURE_STENCIL_SIZE 0x88f1
#endif
-typedef GLboolean (WINE_GLAPI * PGLFNGLISRENDERBUFFERPROC)(GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint *renderbuffers);
-typedef void (WINE_GLAPI * PGLFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint *renderbuffers);
-typedef void (WINE_GLAPI * PGLFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat,
+typedef GLboolean (WINE_GLAPI *PGLFNGLISRENDERBUFFERPROC)(GLuint renderbuffer);
+typedef void (WINE_GLAPI *PGLFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer);
+typedef void (WINE_GLAPI *PGLFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint *renderbuffers);
+typedef void (WINE_GLAPI *PGLFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint *renderbuffers);
+typedef void (WINE_GLAPI *PGLFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat,
GLsizei width, GLsizei height);
-typedef void (WINE_GLAPI * PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples,
+typedef void (WINE_GLAPI *PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples,
GLenum internalformat, GLsizei width, GLsizei height);
-typedef void (WINE_GLAPI * PGLFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params);
-typedef GLboolean (WINE_GLAPI * PGLFNGLISFRAMEBUFFERPROC)(GLuint framebuffer);
-typedef void (WINE_GLAPI * PGLFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer);
-typedef void (WINE_GLAPI * PGLFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint *framebuffers);
-typedef void (WINE_GLAPI * PGLFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint *framebuffers);
-typedef GLenum (WINE_GLAPI * PGLFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params);
+typedef GLboolean (WINE_GLAPI *PGLFNGLISFRAMEBUFFERPROC)(GLuint framebuffer);
+typedef void (WINE_GLAPI *PGLFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer);
+typedef void (WINE_GLAPI *PGLFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint *framebuffers);
+typedef void (WINE_GLAPI *PGLFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint *framebuffers);
+typedef GLenum (WINE_GLAPI *PGLFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level, GLint layer);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment,
GLuint texture, GLint level, GLint layer);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment,
GLenum renderbuffertarget, GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment,
GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
+typedef void (WINE_GLAPI *PGLFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
-typedef void (WINE_GLAPI * PGLFNGLGENERATEMIPMAPPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGLGENERATEMIPMAPPROC)(GLenum target);
/* GL_ARB_geometry_shader4 */
#ifndef GL_ARB_geometry_shader4
-#define GL_GEOMETRY_SHADER_ARB 0x8dd9
-#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8dda
-#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8ddb
-#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8ddc
-#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8c29
-#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8ddd
-#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8dde
-#define GL_MAX_VARYING_COMPONENTS_ARB 0x8b4b
-#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8ddf
-#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8de0
-#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8de1
-#define GL_LINES_ADJACENCY_ARB 0x000a
-#define GL_LINE_STRIP_ADJACENCY_ARB 0x000b
-#define GL_TRIANGLES_ADJACENCY_ARB 0x000c
-#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000d
-#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8da8
-#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8da9
-#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8da7
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8cd4
-#define GL_PROGRAM_POINT_SIZE_ARB 0x8642
+#define GL_ARB_geometry_shader4 1
+#define GL_GEOMETRY_SHADER_ARB 0x8dd9
+#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8dda
+#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8ddb
+#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8ddc
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8c29
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8ddd
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8dde
+#define GL_MAX_VARYING_COMPONENTS_ARB 0x8b4b
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8ddf
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8de0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8de1
+#define GL_LINES_ADJACENCY_ARB 0x000a
+#define GL_LINE_STRIP_ADJACENCY_ARB 0x000b
+#define GL_TRIANGLES_ADJACENCY_ARB 0x000c
+#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000d
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8da8
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8da9
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8da7
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8cd4
+#define GL_PROGRAM_POINT_SIZE_ARB 0x8642
#endif
typedef void (WINE_GLAPI *PGLFNPROGRAMPARAMETERIARBPROC)(GLuint program, GLenum pname, GLint value);
typedef void (WINE_GLAPI *PGLFNFRAMEBUFFERTEXTUREARBPROC)(GLenum target, GLenum attachment,
@@ -1726,380 +2126,1067 @@ typedef void (WINE_GLAPI *PGLFNFRAMEBUFFERTEXTURELAYERARBPROC)(GLenum target, GL
typedef void (WINE_GLAPI *PGLFNFRAMEBUFFERTEXTUREFACEARBPROC)(GLenum target, GLenum attachment,
GLuint texture, GLint level, GLenum face);
+/* GL_ARB_half_float_pixel */
+#ifndef GL_ARB_half_float_pixel
+#define GL_ARB_half_float_pixel 1
+#define GL_HALF_FLOAT_ARB 0x140b
+#endif
+
+/* GL_ARB_half_float_vertex */
+#ifndef GL_ARB_half_float_vertex
+#define GL_ARB_half_float_vertex 1
+/* No _ARB, see extension spec */
+#define GL_HALF_FLOAT 0x140b
+#endif
+
/* GL_ARB_imaging */
#ifndef GL_ARB_imaging
#define GL_ARB_imaging 1
-#define GL_CONSTANT_COLOR 0x8001
-#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
-#define GL_CONSTANT_ALPHA 0x8003
-#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
-#define GL_BLEND_COLOR 0x8005
-#define GL_FUNC_ADD 0x8006
-#define GL_MIN 0x8007
-#define GL_MAX 0x8008
-#define GL_BLEND_EQUATION 0x8009
-#define GL_FUNC_SUBTRACT 0x800A
-#define GL_FUNC_REVERSE_SUBTRACT 0x800B
-#define GL_CONVOLUTION_1D 0x8010
-#define GL_CONVOLUTION_2D 0x8011
-#define GL_SEPARABLE_2D 0x8012
-#define GL_CONVOLUTION_BORDER_MODE 0x8013
-#define GL_CONVOLUTION_FILTER_SCALE 0x8014
-#define GL_CONVOLUTION_FILTER_BIAS 0x8015
-#define GL_REDUCE 0x8016
-#define GL_CONVOLUTION_FORMAT 0x8017
-#define GL_CONVOLUTION_WIDTH 0x8018
-#define GL_CONVOLUTION_HEIGHT 0x8019
-#define GL_MAX_CONVOLUTION_WIDTH 0x801A
-#define GL_MAX_CONVOLUTION_HEIGHT 0x801B
-#define GL_POST_CONVOLUTION_RED_SCALE 0x801C
-#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D
-#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E
-#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F
-#define GL_POST_CONVOLUTION_RED_BIAS 0x8020
-#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021
-#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022
-#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023
-#define GL_HISTOGRAM 0x8024
-#define GL_PROXY_HISTOGRAM 0x8025
-#define GL_HISTOGRAM_WIDTH 0x8026
-#define GL_HISTOGRAM_FORMAT 0x8027
-#define GL_HISTOGRAM_RED_SIZE 0x8028
-#define GL_HISTOGRAM_GREEN_SIZE 0x8029
-#define GL_HISTOGRAM_BLUE_SIZE 0x802A
-#define GL_HISTOGRAM_ALPHA_SIZE 0x802B
-#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C
-#define GL_HISTOGRAM_SINK 0x802D
-#define GL_MINMAX 0x802E
-#define GL_MINMAX_FORMAT 0x802F
-#define GL_MINMAX_SINK 0x8030
-#define GL_TABLE_TOO_LARGE 0x8031
-#define GL_COLOR_MATRIX 0x80B1
-#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2
-#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3
-#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4
-#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5
-#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6
-#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7
-#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8
-#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9
-#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA
-#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB
-#define GL_COLOR_TABLE 0x80D0
-#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1
-#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2
-#define GL_PROXY_COLOR_TABLE 0x80D3
-#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4
-#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5
-#define GL_COLOR_TABLE_SCALE 0x80D6
-#define GL_COLOR_TABLE_BIAS 0x80D7
-#define GL_COLOR_TABLE_FORMAT 0x80D8
-#define GL_COLOR_TABLE_WIDTH 0x80D9
-#define GL_COLOR_TABLE_RED_SIZE 0x80DA
-#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB
-#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC
-#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD
-#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE
-#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF
-#define GL_CONSTANT_BORDER 0x8151
-#define GL_REPLICATE_BORDER 0x8153
-#define GL_CONVOLUTION_BORDER_COLOR 0x8154
+#define GL_CONSTANT_COLOR 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
+#define GL_CONSTANT_ALPHA 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
+#define GL_BLEND_COLOR 0x8005
+#define GL_FUNC_ADD 0x8006
+#define GL_MIN 0x8007
+#define GL_MAX 0x8008
+#define GL_BLEND_EQUATION 0x8009
+#define GL_FUNC_SUBTRACT 0x800a
+#define GL_FUNC_REVERSE_SUBTRACT 0x800b
+#define GL_CONVOLUTION_1D 0x8010
+#define GL_CONVOLUTION_2D 0x8011
+#define GL_SEPARABLE_2D 0x8012
+#define GL_CONVOLUTION_BORDER_MODE 0x8013
+#define GL_CONVOLUTION_FILTER_SCALE 0x8014
+#define GL_CONVOLUTION_FILTER_BIAS 0x8015
+#define GL_REDUCE 0x8016
+#define GL_CONVOLUTION_FORMAT 0x8017
+#define GL_CONVOLUTION_WIDTH 0x8018
+#define GL_CONVOLUTION_HEIGHT 0x8019
+#define GL_MAX_CONVOLUTION_WIDTH 0x801a
+#define GL_MAX_CONVOLUTION_HEIGHT 0x801b
+#define GL_POST_CONVOLUTION_RED_SCALE 0x801d
+#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801f
+#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801e
+#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801f
+#define GL_POST_CONVOLUTION_RED_BIAS 0x8020
+#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021
+#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022
+#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023
+#define GL_HISTOGRAM 0x8024
+#define GL_PROXY_HISTOGRAM 0x8025
+#define GL_HISTOGRAM_WIDTH 0x8026
+#define GL_HISTOGRAM_FORMAT 0x8027
+#define GL_HISTOGRAM_RED_SIZE 0x8028
+#define GL_HISTOGRAM_GREEN_SIZE 0x8029
+#define GL_HISTOGRAM_BLUE_SIZE 0x802a
+#define GL_HISTOGRAM_ALPHA_SIZE 0x802b
+#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802c
+#define GL_HISTOGRAM_SINK 0x802d
+#define GL_MINMAX 0x802e
+#define GL_MINMAX_FORMAT 0x802f
+#define GL_MINMAX_SINK 0x8030
+#define GL_TABLE_TOO_LARGE 0x8031
+#define GL_COLOR_MATRIX 0x80b1
+#define GL_COLOR_MATRIX_STACK_DEPTH 0x80b2
+#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80b3
+#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80b4
+#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80b5
+#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80b6
+#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80b7
+#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80b8
+#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80b9
+#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80ba
+#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80bb
+#define GL_COLOR_TABLE 0x80d0
+#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80d1
+#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80d2
+#define GL_PROXY_COLOR_TABLE 0x80d3
+#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80d4
+#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80d5
+#define GL_COLOR_TABLE_SCALE 0x80d6
+#define GL_COLOR_TABLE_BIAS 0x80d7
+#define GL_COLOR_TABLE_FORMAT 0x80d8
+#define GL_COLOR_TABLE_WIDTH 0x80d9
+#define GL_COLOR_TABLE_RED_SIZE 0x80da
+#define GL_COLOR_TABLE_GREEN_SIZE 0x80db
+#define GL_COLOR_TABLE_BLUE_SIZE 0x80dc
+#define GL_COLOR_TABLE_ALPHA_SIZE 0x80dd
+#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80de
+#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80df
+#define GL_CONSTANT_BORDER 0x8151
+#define GL_REPLICATE_BORDER 0x8153
+#define GL_CONVOLUTION_BORDER_COLOR 0x8154
#endif
-typedef void (WINE_GLAPI *PGLFNBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONPROC) (GLenum mode);
+typedef void (WINE_GLAPI *PGLFNBLENDCOLORPROC)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONPROC)(GLenum mode);
+
+/* GL_ARB_map_buffer_range */
+#ifndef GL_ARB_map_buffer_range
+#define GL_ARB_map_buffer_range 1
+#define GL_MAP_READ_BIT 0x0001
+#define GL_MAP_WRITE_BIT 0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
+#endif
+typedef GLvoid *(WINE_GLAPI *PGLFNMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (WINE_GLAPI *PGLFNFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length);
+
+/* GL_ARB_multisample */
+#ifndef GL_ARB_multisample
+#define GL_ARB_multisample 1
+#define GL_MULTISAMPLE_ARB 0x809d
+#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809e
+#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809f
+#define GL_SAMPLE_COVERAGE_ARB 0x80a0
+#define GL_SAMPLE_BUFFERS_ARB 0x80a8
+#define GL_SAMPLES_ARB 0x80a9
+#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80aa
+#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80ab
+#define GL_MULTISAMPLE_BIT_ARB 0x20000000
+#endif
+typedef void (WINE_GLAPI *WINED3D_PFNGLSAMPLECOVERAGEARBPROC)(GLclampf value, GLboolean invert);
+
/* GL_ARB_multitexture */
#ifndef GL_ARB_multitexture
#define GL_ARB_multitexture 1
-#define GL_TEXTURE0_ARB 0x84C0
-#define GL_TEXTURE1_ARB 0x84C1
-#define GL_TEXTURE2_ARB 0x84C2
-#define GL_TEXTURE3_ARB 0x84C3
-#define GL_TEXTURE4_ARB 0x84C4
-#define GL_TEXTURE5_ARB 0x84C5
-#define GL_TEXTURE6_ARB 0x84C6
-#define GL_TEXTURE7_ARB 0x84C7
-#define GL_TEXTURE8_ARB 0x84C8
-#define GL_TEXTURE9_ARB 0x84C9
-#define GL_TEXTURE10_ARB 0x84CA
-#define GL_TEXTURE11_ARB 0x84CB
-#define GL_TEXTURE12_ARB 0x84CC
-#define GL_TEXTURE13_ARB 0x84CD
-#define GL_TEXTURE14_ARB 0x84CE
-#define GL_TEXTURE15_ARB 0x84CF
-#define GL_TEXTURE16_ARB 0x84D0
-#define GL_TEXTURE17_ARB 0x84D1
-#define GL_TEXTURE18_ARB 0x84D2
-#define GL_TEXTURE19_ARB 0x84D3
-#define GL_TEXTURE20_ARB 0x84D4
-#define GL_TEXTURE21_ARB 0x84D5
-#define GL_TEXTURE22_ARB 0x84D6
-#define GL_TEXTURE23_ARB 0x84D7
-#define GL_TEXTURE24_ARB 0x84D8
-#define GL_TEXTURE25_ARB 0x84D9
-#define GL_TEXTURE26_ARB 0x84DA
-#define GL_TEXTURE27_ARB 0x84DB
-#define GL_TEXTURE28_ARB 0x84DC
-#define GL_TEXTURE29_ARB 0x84DD
-#define GL_TEXTURE30_ARB 0x84DE
-#define GL_TEXTURE31_ARB 0x84DF
-#define GL_ACTIVE_TEXTURE_ARB 0x84E0
-#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1
-#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2
+#define GL_TEXTURE0_ARB 0x84c0
+#define GL_TEXTURE1_ARB 0x84c1
+#define GL_TEXTURE2_ARB 0x84c2
+#define GL_TEXTURE3_ARB 0x84c3
+#define GL_TEXTURE4_ARB 0x84c4
+#define GL_TEXTURE5_ARB 0x84c5
+#define GL_TEXTURE6_ARB 0x84c6
+#define GL_TEXTURE7_ARB 0x84c7
+#define GL_TEXTURE8_ARB 0x84c8
+#define GL_TEXTURE9_ARB 0x84c9
+#define GL_TEXTURE10_ARB 0x84ca
+#define GL_TEXTURE11_ARB 0x84cb
+#define GL_TEXTURE12_ARB 0x84cc
+#define GL_TEXTURE13_ARB 0x84cd
+#define GL_TEXTURE14_ARB 0x84ce
+#define GL_TEXTURE15_ARB 0x84cf
+#define GL_TEXTURE16_ARB 0x84d0
+#define GL_TEXTURE17_ARB 0x84d1
+#define GL_TEXTURE18_ARB 0x84d2
+#define GL_TEXTURE19_ARB 0x84d3
+#define GL_TEXTURE20_ARB 0x84d4
+#define GL_TEXTURE21_ARB 0x84d5
+#define GL_TEXTURE22_ARB 0x84d6
+#define GL_TEXTURE23_ARB 0x84d7
+#define GL_TEXTURE24_ARB 0x84d8
+#define GL_TEXTURE25_ARB 0x84d9
+#define GL_TEXTURE26_ARB 0x84da
+#define GL_TEXTURE27_ARB 0x84db
+#define GL_TEXTURE28_ARB 0x84dc
+#define GL_TEXTURE29_ARB 0x84dd
+#define GL_TEXTURE30_ARB 0x84de
+#define GL_TEXTURE31_ARB 0x84df
+#define GL_ACTIVE_TEXTURE_ARB 0x84e0
+#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84e1
+#define GL_MAX_TEXTURE_UNITS_ARB 0x84e2
#endif
-typedef void (WINE_GLAPI *WINED3D_PFNGLACTIVETEXTUREARBPROC) (GLenum texture);
-typedef void (WINE_GLAPI *WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLACTIVETEXTUREARBPROC)(GLenum texture);
+typedef void (WINE_GLAPI *WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC)(GLenum texture);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FARBPROC)(GLenum target, GLfloat s);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FVARBPROC)(GLenum target, const GLfloat *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FARBPROC)(GLenum target, GLfloat s, GLfloat t);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FVARBPROC)(GLenum target, const GLfloat *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FVARBPROC)(GLenum target, const GLfloat *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FARBPROC)(GLenum target,
+ GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FVARBPROC)(GLenum target, const GLfloat *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2SVARBPROC)(GLenum target, const GLshort *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4SVARBPROC)(GLenum target, const GLshort *v);
-/* GL_ARB_texture_cube_map */
-#ifndef GL_ARB_texture_cube_map
-#define GL_ARB_texture_cube_map 1
-#define GL_NORMAL_MAP_ARB 0x8511
-#define GL_REFLECTION_MAP_ARB 0x8512
-#define GL_TEXTURE_CUBE_MAP_ARB 0x8513
-#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A
-#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B
-#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C
+/* GL_ARB_occlusion_query */
+#ifndef GL_ARB_occlusion_query
+#define GL_ARB_occlusion_query 1
+#define GL_SAMPLES_PASSED_ARB 0x8914
+#define GL_QUERY_COUNTER_BITS_ARB 0x8864
+#define GL_CURRENT_QUERY_ARB 0x8865
+#define GL_QUERY_RESULT_ARB 0x8866
+#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867
+#endif
+typedef void (WINE_GLAPI *PGLFNGENQUERIESARBPROC)(GLsizei n, GLuint *queries);
+typedef void (WINE_GLAPI *PGLFNDELETEQUERIESARBPROC)(GLsizei n, const GLuint *queries);
+typedef GLboolean (WINE_GLAPI *PGLFNISQUERYARBPROC)(GLuint query);
+typedef void (WINE_GLAPI *PGLFNBEGINQUERYARBPROC)(GLenum target, GLuint query);
+typedef void (WINE_GLAPI *PGLFNENDQUERYARBPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGETQUERYIVARBPROC)(GLenum target, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETQUERYOBJECTIVARBPROC)(GLuint query, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETQUERYOBJECTUIVARBPROC)(GLuint query, GLenum pname, GLuint *params);
+
+/* GL_ARB_pixel_buffer_object */
+#ifndef GL_ARB_pixel_buffer_object
+#define GL_ARB_pixel_buffer_object 1
+#define GL_PIXEL_PACK_BUFFER_ARB 0x88eb
+#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88ec
+#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ed
+#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88ef
#endif
/* GL_ARB_point_parameters */
#ifndef GL_ARB_point_parameters
#define GL_ARB_point_parameters 1
-#define GL_POINT_SIZE_MIN_ARB 0x8126
-#define GL_POINT_SIZE_MAX_ARB 0x8127
-#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128
-#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129
+#define GL_POINT_SIZE_MIN_ARB 0x8126
+#define GL_POINT_SIZE_MAX_ARB 0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128
+#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129
+#endif
+typedef void (WINE_GLAPI *PGLFNGLPOINTPARAMETERFARBPROC)(GLenum pname, GLfloat param);
+typedef void (WINE_GLAPI *PGLFNGLPOINTPARAMETERFVARBPROC)(GLenum pname, const GLfloat *params);
+
+/* GL_ARB_point_sprite */
+#ifndef GL_ARB_point_sprite
+#define GL_ARB_point_sprite 1
+#define GL_POINT_SPRITE_ARB 0x8861
+#define GL_COORD_REPLACE_ARB 0x8862
#endif
-typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param);
-typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params);
/* GL_ARB_provoking_vertex */
#ifndef GL_ARB_provoking_vertex
#define GL_ARB_provoking_vertex 1
-#define GL_FIRST_VERTEX_CONVENTION 0x8e4d
-#define GL_LAST_VERTEX_CONVENTION 0x8e4e
-#define GL_PROVOKING_VERTEX 0x8e4f
-#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8e4c
+#define GL_FIRST_VERTEX_CONVENTION 0x8e4d
+#define GL_LAST_VERTEX_CONVENTION 0x8e4e
+#define GL_PROVOKING_VERTEX 0x8e4f
+#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8e4c
+#endif
+typedef void (WINE_GLAPI *PGLFNGLPROVOKINGVERTEXPROC)(GLenum mode);
+
+/* GL_ARB_shader_objects */
+#ifndef GL_ARB_shader_objects
+#define GL_ARB_shader_objects 1
+typedef char GLcharARB;
+typedef unsigned int GLhandleARB;
+#define GL_PROGRAM_OBJECT_ARB 0x8b40
+#define GL_OBJECT_TYPE_ARB 0x8b4e
+#define GL_OBJECT_SUBTYPE_ARB 0x8b4f
+#define GL_OBJECT_DELETE_STATUS_ARB 0x8b80
+#define GL_OBJECT_COMPILE_STATUS_ARB 0x8b81
+#define GL_OBJECT_LINK_STATUS_ARB 0x8b82
+#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8b83
+#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8b84
+#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8b85
+#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8b86
+#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8b87
+#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8b88
+#define GL_SHADER_OBJECT_ARB 0x8b48
+#define GL_FLOAT_VEC2_ARB 0x8b50
+#define GL_FLOAT_VEC3_ARB 0x8b51
+#define GL_FLOAT_VEC4_ARB 0x8b52
+#define GL_INT_VEC2_ARB 0x8b53
+#define GL_INT_VEC3_ARB 0x8b54
+#define GL_INT_VEC4_ARB 0x8b55
+#define GL_BOOL_ARB 0x8b56
+#define GL_BOOL_VEC2_ARB 0x8b57
+#define GL_BOOL_VEC3_ARB 0x8b58
+#define GL_BOOL_VEC4_ARB 0x8b59
+#define GL_FLOAT_MAT2_ARB 0x8b5a
+#define GL_FLOAT_MAT3_ARB 0x8b5b
+#define GL_FLOAT_MAT4_ARB 0x8b5c
+#define GL_SAMPLER_1D_ARB 0x8b5d
+#define GL_SAMPLER_2D_ARB 0x8b5e
+#define GL_SAMPLER_3D_ARB 0x8b5f
+#define GL_SAMPLER_CUBE_ARB 0x8b60
+#define GL_SAMPLER_1D_SHADOW_ARB 0x8b61
+#define GL_SAMPLER_2D_SHADOW_ARB 0x8b62
+#define GL_SAMPLER_2D_RECT_ARB 0x8b63
+#define GL_SAMPELR_2D_RECT_SHADOW_ARB 0x8b64
+#endif
+
+/* GL_ARB_shading_language_100 */
+#ifndef GL_ARB_shading_language_100
+#define GL_ARB_shading_language_100 1
+#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8b8c
+#endif
+
+/* GL_ARB_sync */
+#ifndef GL_ARB_sync
+#define GL_ARB_sync 1
+#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
+#define GL_OBJECT_TYPE 0x9112
+#define GL_SYNC_CONDITION 0x9113
+#define GL_SYNC_STATUS 0x9114
+#define GL_SYNC_FLAGS 0x9115
+#define GL_SYNC_FENCE 0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
+#define GL_UNSIGNALED 0x9118
+#define GL_SIGNALED 0x9119
+#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
+#define GL_TIMEOUT_IGNORED 0xffffffffffffffffULL
+#define GL_ALREADY_SIGNALED 0x911a
+#define GL_TIMEOUT_EXPIRED 0x911b
+#define GL_CONDITION_SATISFIED 0x911c
+#define GL_WAIT_FAILED 0x911d
+#endif
+typedef GLsync (WINE_GLAPI *PGLFNFENCESYNCPROC)(GLenum condition, GLbitfield flags);
+typedef GLboolean (WINE_GLAPI *PGLFNISSYNCPROC)(GLsync sync);
+typedef GLvoid (WINE_GLAPI *PGLFNDELETESYNCPROC)(GLsync sync);
+typedef GLenum (WINE_GLAPI *PGLFNCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef GLvoid (WINE_GLAPI *PGLFNWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef GLvoid (WINE_GLAPI *PGLFNGETINTEGER64VPROC)(GLenum pname, GLint64 *params);
+typedef GLvoid (WINE_GLAPI *PGLFNGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei bufsize,
+ GLsizei *length, GLint *values);
+
+/* GL_ARB_texture_border_clamp */
+#ifndef GL_ARB_texture_border_clamp
+#define GL_ARB_texture_border_clamp 1
+#define GL_CLAMP_TO_BORDER_ARB 0x812d
+#endif
+
+/* GL_ARB_texture_cube_map */
+#ifndef GL_ARB_texture_cube_map
+#define GL_ARB_texture_cube_map 1
+#define GL_NORMAL_MAP_ARB 0x8511
+#define GL_REFLECTION_MAP_ARB 0x8512
+#define GL_TEXTURE_CUBE_MAP_ARB 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851a
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851b
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851c
+#endif
+
+/* GL_ARB_texture_env_dot3 */
+#ifndef GL_ARB_texture_env_dot3
+#define GL_ARB_texture_env_dot3 1
+#define GL_DOT3_RGB_ARB 0x86ae
+#define GL_DOT3_RGBA_ARB 0x86af
+#endif
+
+/* GL_ARB_texture_float */
+#ifndef GL_ARB_texture_float
+#define GL_ARB_texture_float 1
+#define GL_RGBA32F_ARB 0x8814
+#define GL_RGB32F_ARB 0x8815
+#define GL_RGBA16F_ARB 0x881a
+#define GL_RGB16F_ARB 0x881b
+#endif
+
+/* GL_ARB_texture_mirrored_repeat */
+#ifndef GL_ARB_texture_mirrored_repeat
+#define GL_ARB_texture_mirrored_repeat 1
+#define GL_MIRRORED_REPEAT_ARB 0x8370
+#endif
+
+/* GL_ARB_texture_rectangle */
+#ifndef GL_ARB_texture_rectangle
+#define GL_ARB_texture_rectangle 1
+#define GL_TEXTURE_RECTANGLE_ARB 0x84f5
+#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84f6
+#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84f7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84f8
+#define GL_SAMPLER_2D_RECT_ARB 0x8b63
+#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8b64
+#endif
+
+/* GL_ARB_texture_rg */
+#ifndef GL_ARB_texture_rg
+#define GL_ARB_texture_rg 1
+#define GL_RG 0x8227
+#define GL_RG_INTEGER 0x8228
+#define GL_R8 0x8229
+#define GL_R16 0x822a
+#define GL_RG8 0x822b
+#define GL_RG16 0x822c
+#define GL_R16F 0x822d
+#define GL_R32F 0x822e
+#define GL_RG16F 0x822f
+#define GL_RG32F 0x8230
+#define GL_R8I 0x8231
+#define GL_R8UI 0x8232
+#define GL_R16I 0x8233
+#define GL_R16UI 0x8234
+#define GL_R32I 0x8235
+#define GL_R32UI 0x8236
+#define GL_RG8I 0x8237
+#define GL_RG8UI 0x8238
+#define GL_RG16I 0x8239
+#define GL_RG16UI 0x823a
+#define GL_RG32I 0x823b
+#define GL_RG32UI 0x823c
#endif
-typedef void (WINE_GLAPI * PGLFNGLPROVOKINGVERTEXPROC)(GLenum mode);
/* GL_ARB_vertex_blend */
#ifndef GL_ARB_vertex_blend
#define GL_ARB_vertex_blend 1
-#define GL_MAX_VERTEX_UNITS_ARB 0x86A4
-#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5
-#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6
-#define GL_VERTEX_BLEND_ARB 0x86A7
-#define GL_CURRENT_WEIGHT_ARB 0x86A8
-#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9
-#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA
-#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB
-#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC
-#define GL_WEIGHT_ARRAY_ARB 0x86AD
-#define GL_MODELVIEW0_ARB 0x1700
-#define GL_MODELVIEW1_ARB 0x850A
-#define GL_MODELVIEW2_ARB 0x8722
-#define GL_MODELVIEW3_ARB 0x8723
-#define GL_MODELVIEW4_ARB 0x8724
-#define GL_MODELVIEW5_ARB 0x8725
-#define GL_MODELVIEW6_ARB 0x8726
-#define GL_MODELVIEW7_ARB 0x8727
-#define GL_MODELVIEW8_ARB 0x8728
-#define GL_MODELVIEW9_ARB 0x8729
-#define GL_MODELVIEW10_ARB 0x872A
-#define GL_MODELVIEW11_ARB 0x872B
-#define GL_MODELVIEW12_ARB 0x872C
-#define GL_MODELVIEW13_ARB 0x872D
-#define GL_MODELVIEW14_ARB 0x872E
-#define GL_MODELVIEW15_ARB 0x872F
-#define GL_MODELVIEW16_ARB 0x8730
-#define GL_MODELVIEW17_ARB 0x8731
-#define GL_MODELVIEW18_ARB 0x8732
-#define GL_MODELVIEW19_ARB 0x8733
-#define GL_MODELVIEW20_ARB 0x8734
-#define GL_MODELVIEW21_ARB 0x8735
-#define GL_MODELVIEW22_ARB 0x8736
-#define GL_MODELVIEW23_ARB 0x8737
-#define GL_MODELVIEW24_ARB 0x8738
-#define GL_MODELVIEW25_ARB 0x8739
-#define GL_MODELVIEW26_ARB 0x873A
-#define GL_MODELVIEW27_ARB 0x873B
-#define GL_MODELVIEW28_ARB 0x873C
-#define GL_MODELVIEW29_ARB 0x873D
-#define GL_MODELVIEW30_ARB 0x873E
-#define GL_MODELVIEW31_ARB 0x873F
+#define GL_MAX_VERTEX_UNITS_ARB 0x86a4
+#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86a5
+#define GL_WEIGHT_SUM_UNITY_ARB 0x86a6
+#define GL_VERTEX_BLEND_ARB 0x86a7
+#define GL_CURRENT_WEIGHT_ARB 0x86a8
+#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86a9
+#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86aa
+#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86ab
+#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86ac
+#define GL_WEIGHT_ARRAY_ARB 0x86ad
+#define GL_MODELVIEW0_ARB 0x1700
+#define GL_MODELVIEW1_ARB 0x850a
+#define GL_MODELVIEW2_ARB 0x8722
+#define GL_MODELVIEW3_ARB 0x8723
+#define GL_MODELVIEW4_ARB 0x8724
+#define GL_MODELVIEW5_ARB 0x8725
+#define GL_MODELVIEW6_ARB 0x8726
+#define GL_MODELVIEW7_ARB 0x8727
+#define GL_MODELVIEW8_ARB 0x8728
+#define GL_MODELVIEW9_ARB 0x8729
+#define GL_MODELVIEW10_ARB 0x872a
+#define GL_MODELVIEW11_ARB 0x872b
+#define GL_MODELVIEW12_ARB 0x872c
+#define GL_MODELVIEW13_ARB 0x872d
+#define GL_MODELVIEW14_ARB 0x872e
+#define GL_MODELVIEW15_ARB 0x872f
+#define GL_MODELVIEW16_ARB 0x8730
+#define GL_MODELVIEW17_ARB 0x8731
+#define GL_MODELVIEW18_ARB 0x8732
+#define GL_MODELVIEW19_ARB 0x8733
+#define GL_MODELVIEW20_ARB 0x8734
+#define GL_MODELVIEW21_ARB 0x8735
+#define GL_MODELVIEW22_ARB 0x8736
+#define GL_MODELVIEW23_ARB 0x8737
+#define GL_MODELVIEW24_ARB 0x8738
+#define GL_MODELVIEW25_ARB 0x8739
+#define GL_MODELVIEW26_ARB 0x873a
+#define GL_MODELVIEW27_ARB 0x873b
+#define GL_MODELVIEW28_ARB 0x873c
+#define GL_MODELVIEW29_ARB 0x873d
+#define GL_MODELVIEW30_ARB 0x873e
+#define GL_MODELVIEW31_ARB 0x873f
#endif
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTPOINTERARB) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTBV) (GLint size, const GLbyte *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTSV) (GLint size, const GLshort *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTIV) (GLint size, const GLint *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTFV) (GLint size, const GLfloat *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTDV) (GLint size, const GLdouble *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTUBV) (GLint size, const GLubyte *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTUSV) (GLint size, const GLushort *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTUIV) (GLint size, const GLuint *weights);
-typedef void (WINE_GLAPI * PGLFNGLVERTEXBLENDARB) (GLint count);
-/* GL_ARB_pixel_buffer_object */
-#ifndef GL_ARB_pixel_buffer_object
-#define GL_ARB_pixel_buffer_object 1
-#endif
-#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB
-#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC
-#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED
-#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF
-/* GL_EXT_framebuffer_object */
-#ifndef GL_EXT_framebuffer_object
-#define GL_EXT_framebuffer_object 1
-#define GL_FRAMEBUFFER_EXT 0x8D40
-#define GL_RENDERBUFFER_EXT 0x8D41
-#define GL_STENCIL_INDEX1_EXT 0x8D46
-#define GL_STENCIL_INDEX4_EXT 0x8D47
-#define GL_STENCIL_INDEX8_EXT 0x8D48
-#define GL_STENCIL_INDEX16_EXT 0x8D49
-#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42
-#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43
-#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44
-#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50
-#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51
-#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52
-#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53
-#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54
-#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4
-#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
-#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1
-#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2
-#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3
-#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4
-#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5
-#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6
-#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7
-#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8
-#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9
-#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA
-#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB
-#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC
-#define GL_COLOR_ATTACHMENT13_EXT 0x8CED
-#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE
-#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF
-#define GL_DEPTH_ATTACHMENT_EXT 0x8D00
-#define GL_STENCIL_ATTACHMENT_EXT 0x8D20
-#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5
-#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6
-#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7
-#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9
-#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA
-#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB
-#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC
-#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD
-#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6
-#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7
-#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF
-#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8
-#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTPOINTERARB)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTBV)(GLint size, const GLbyte *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTSV)(GLint size, const GLshort *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTIV)(GLint size, const GLint *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTFV)(GLint size, const GLfloat *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTDV)(GLint size, const GLdouble *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTUBV)(GLint size, const GLubyte *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTUSV)(GLint size, const GLushort *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTUIV)(GLint size, const GLuint *weights);
+typedef void (WINE_GLAPI *PGLFNGLVERTEXBLENDARB)(GLint count);
+/* GL_ARB_vertex_buffer_object */
+#ifndef GL_ARB_vertex_buffer_object
+#define GL_ARB_vertex_buffer_object 1
+#define GL_BUFFER_SIZE_ARB 0x8764
+#define GL_BUFFER_USAGE_ARB 0x8765
+#define GL_ARRAY_BUFFER_ARB 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893
+#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895
+#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896
+#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897
+#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898
+#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889a
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889b
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889c
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889d
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889e
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889f
+#define GL_READ_ONLY_ARB 0x88b8
+#define GL_WRITE_ONLY_ARB 0x88b9
+#define GL_READ_WRITE_ARB 0x88ba
+#define GL_BUFFER_ACCESS_ARB 0x88bb
+#define GL_BUFFER_MAPPED_ARB 0x88bc
+#define GL_BUFFER_MAP_POINTER_ARB 0x88bd
+#define GL_STREAM_DRAW_ARB 0x88e0
+#define GL_STREAM_READ_ARB 0x88e1
+#define GL_STREAM_COPY_ARB 0x88e2
+#define GL_STATIC_DRAW_ARB 0x88e4
+#define GL_STATIC_READ_ARB 0x88e5
+#define GL_STATIC_COPY_ARB 0x88e6
+#define GL_DYNAMIC_DRAW_ARB 0x88e8
+#define GL_DYNAMIC_READ_ARB 0x88e9
+#define GL_DYNAMIC_COPY_ARB 0x88ea
#endif
-typedef GLboolean (WINE_GLAPI * PGLFNGLISRENDERBUFFEREXTPROC)(GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLBINDRENDERBUFFEREXTPROC)(GLenum target, GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLDELETERENDERBUFFERSEXTPROC)(GLsizei n, const GLuint *renderbuffers);
-typedef void (WINE_GLAPI * PGLFNGLGENRENDERBUFFERSEXTPROC)(GLsizei n, GLuint *renderbuffers);
-typedef void (WINE_GLAPI * PGLFNGLRENDERBUFFERSTORAGEEXTPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-typedef void (WINE_GLAPI * PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint *params);
-typedef GLboolean (WINE_GLAPI * PGLFNGLISFRAMEBUFFEREXTPROC)(GLuint framebuffer);
-typedef void (WINE_GLAPI * PGLFNGLBINDFRAMEBUFFEREXTPROC)(GLenum target, GLuint framebuffer);
-typedef void (WINE_GLAPI * PGLFNGLDELETEFRAMEBUFFERSEXTPROC)(GLsizei n, const GLuint *framebuffers);
-typedef void (WINE_GLAPI * PGLFNGLGENFRAMEBUFFERSEXTPROC)(GLsizei n, GLuint *framebuffers);
-typedef GLenum (WINE_GLAPI * PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(GLenum target);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLenum target, GLenum attachment, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGLGENERATEMIPMAPEXTPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNBINDBUFFERARBPROC)(GLenum target, GLuint buffer);
+typedef void (WINE_GLAPI *PGLFNDELETEBUFFERSARBPROC)(GLsizei n, const GLuint *buffers);
+typedef void (WINE_GLAPI *PGLFNGENBUFFERSARBPROC)(GLsizei n, GLuint *buffers);
+typedef GLboolean (WINE_GLAPI *PGLFNISBUFFERARBPROC)(GLuint buffer);
+typedef void (WINE_GLAPI *PGLFNBUFFERDATAARBPROC)(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+typedef void (WINE_GLAPI *PGLFNBUFFERSUBDATAARBPROC)(GLenum target,
+ GLintptr offset, GLsizeiptr size, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNGETBUFFERSUBDATAARBPROC)(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+typedef GLvoid* (WINE_GLAPI *PGLFNMAPBUFFERARBPROC)(GLenum target, GLenum access);
+typedef GLboolean (WINE_GLAPI *PGLFNUNMAPBUFFERARBPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGETBUFFERPARAMETERIVARBPROC)(GLenum target, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETBUFFERPOINTERVARBPROC)(GLenum target, GLenum pname, GLvoid* *params);
+
+/* GL_ARB_vertex_program */
+#ifndef GL_ARB_vertex_program
+#define GL_ARB_vertex_program 1
+#define GL_VERTEX_PROGRAM_ARB 0x8620
+#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643
+#define GL_COLOR_SUM_ARB 0x8458
+#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886a
+#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645
+#define GL_PROGRAM_LENGTH_ARB 0x8627
+#define GL_PROGRAM_FORMAT_ARB 0x8876
+#define GL_PROGRAM_BINDING_ARB 0x8677
+#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88a0
+#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88a1
+#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88a2
+#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88a3
+#define GL_PROGRAM_TEMPORARIES_ARB 0x88a4
+#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88a5
+#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88a6
+#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88a7
+#define GL_PROGRAM_PARAMETERS_ARB 0x88a8
+#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88a9
+#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88aa
+#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88ab
+#define GL_PROGRAM_ATTRIBS_ARB 0x88ac
+#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88ad
+#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88ae
+#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88af
+#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88b0
+#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88b1
+#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88b2
+#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88b3
+#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88b4
+#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88b5
+#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88b6
+#define GL_PROGRAM_STRING_ARB 0x8628
+#define GL_PROGRAM_ERROR_POSITION_ARB 0x864b
+#define GL_CURRENT_MATRIX_ARB 0x8641
+#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88b7
+#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640
+#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869
+#define GL_MAX_PROGRAM_MATRICES_ARB 0x862f
+#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862e
+#define GL_PROGRAM_ERROR_STRING_ARB 0x8874
+#define GL_MATRIX0_ARB 0x88c0
+#define GL_MATRIX1_ARB 0x88c1
+#define GL_MATRIX2_ARB 0x88c2
+#define GL_MATRIX3_ARB 0x88c3
+#define GL_MATRIX4_ARB 0x88c4
+#define GL_MATRIX5_ARB 0x88c5
+#define GL_MATRIX6_ARB 0x88c6
+#define GL_MATRIX7_ARB 0x88c7
+#define GL_MATRIX8_ARB 0x88c8
+#define GL_MATRIX9_ARB 0x88c9
+#define GL_MATRIX10_ARB 0x88ca
+#define GL_MATRIX11_ARB 0x88cb
+#define GL_MATRIX12_ARB 0x88cc
+#define GL_MATRIX13_ARB 0x88cd
+#define GL_MATRIX14_ARB 0x88ce
+#define GL_MATRIX15_ARB 0x88cf
+#define GL_MATRIX16_ARB 0x88d0
+#define GL_MATRIX17_ARB 0x88d1
+#define GL_MATRIX18_ARB 0x88d2
+#define GL_MATRIX19_ARB 0x88d3
+#define GL_MATRIX20_ARB 0x88d4
+#define GL_MATRIX21_ARB 0x88d5
+#define GL_MATRIX22_ARB 0x88d6
+#define GL_MATRIX23_ARB 0x88d7
+#define GL_MATRIX24_ARB 0x88d8
+#define GL_MATRIX25_ARB 0x88d9
+#define GL_MATRIX26_ARB 0x88da
+#define GL_MATRIX27_ARB 0x88db
+#define GL_MATRIX28_ARB 0x88dc
+#define GL_MATRIX29_ARB 0x88dd
+#define GL_MATRIX30_ARB 0x88de
+#define GL_MATRIX31_ARB 0x88df
+#endif
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DARBPROC)(GLuint index, GLdouble x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DVARBPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FARBPROC)(GLuint index, GLfloat x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FVARBPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SARBPROC)(GLuint index, GLshort x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SVARBPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DARBPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DVARBPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FARBPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FVARBPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SARBPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SVARBPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DVARBPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FVARBPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SVARBPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NBVARBPROC)(GLuint index, const GLbyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NIVARBPROC)(GLuint index, const GLint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NSVARBPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBARBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBVARBPROC)(GLuint index, const GLubyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUIVARBPROC)(GLuint index, const GLuint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUSVARBPROC)(GLuint index, const GLushort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4BVARBPROC)(GLuint index, const GLbyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DVARBPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FVARBPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4IVARBPROC)(GLuint index, const GLint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SVARBPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UBVARBPROC)(GLuint index, const GLubyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UIVARBPROC)(GLuint index, const GLuint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4USVARBPROC)(GLuint index, const GLushort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBPOINTERARBPROC)(GLuint index, GLint size,
+ GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+typedef void (WINE_GLAPI *PGLFNENABLEVERTEXATTRIBARRAYARBPROC)(GLuint index);
+typedef void (WINE_GLAPI *PGLFNDISABLEVERTEXATTRIBARRAYARBPROC)(GLuint index);
+typedef void (WINE_GLAPI *PGLFNPROGRAMSTRINGARBPROC)(GLenum target, GLenum format, GLsizei len, const GLvoid *string);
+typedef void (WINE_GLAPI *PGLFNBINDPROGRAMARBPROC)(GLenum target, GLuint program);
+typedef void (WINE_GLAPI *PGLFNDELETEPROGRAMSARBPROC)(GLsizei n, const GLuint *programs);
+typedef void (WINE_GLAPI *PGLFNGENPROGRAMSARBPROC)(GLsizei n, GLuint *programs);
+typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4DARBPROC)(GLenum target,
+ GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4FARBPROC)(GLenum target,
+ GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4DARBPROC)(GLenum target,
+ GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4FARBPROC)(GLenum target,
+ GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMENVPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMENVPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMLOCALPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMLOCALPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMIVARBPROC)(GLenum target, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMSTRINGARBPROC)(GLenum target, GLenum pname, GLvoid *string);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBDVARBPROC)(GLuint index, GLenum pname, GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBFVARBPROC)(GLuint index, GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBIVARBPROC)(GLuint index, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBPOINTERVARBPROC)(GLuint index, GLenum pname, GLvoid* *pointer);
+typedef GLboolean (WINE_GLAPI *PGLFNISPROGRAMARBPROC)(GLuint program);
+
+/* GL_ARB_vertex_shader */
+#ifndef GL_ARB_vertex_shader
+#define GL_ARB_vertex_shader 1
+#define GL_VERTEX_SHADER_ARB 0x8b31
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8b4a
+#define GL_MAX_VARYING_FLOATS_ARB 0x8b4b
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8b4c
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8b4d
+#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8b89
+#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8b8a
+#endif
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC)(GLhandleARB obj, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC)(GLhandleARB obj, GLenum pname, GLfloat *params);
+typedef GLint (WINE_GLAPI *WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB *name);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETACTIVEUNIFORMARBPROC)(GLhandleARB programObj, GLuint index,
+ GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1IARBPROC)(GLint location, GLint v0);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2IARBPROC)(GLint location, GLint v0, GLint v1);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1FARBPROC)(GLint location, GLfloat v0);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2FARBPROC)(GLint location, GLfloat v0, GLfloat v1);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4FARBPROC)(GLint location,
+ GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1IVARBPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2IVARBPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3IVARBPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4IVARBPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1FVARBPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2FVARBPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3FVARBPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4FVARBPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC)(GLint location,
+ GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC)(GLint location,
+ GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC)(GLint location,
+ GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETUNIFORMFVARBPROC)(GLhandleARB programObj, GLint location, GLfloat *params);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETUNIFORMIVARBPROC)(GLhandleARB programObj, GLint location, GLint *params);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETINFOLOGARBPROC)(GLhandleARB obj,
+ GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC)(GLhandleARB programObj);
+typedef GLhandleARB (WINE_GLAPI *WINED3D_PFNGLCREATESHADEROBJECTARBPROC)(GLenum shaderType);
+typedef void (WINE_GLAPI *WINED3D_PFNGLSHADERSOURCEARBPROC)(GLhandleARB shaderObj,
+ GLsizei count, const GLcharARB* *string, const GLint *length);
+typedef void (WINE_GLAPI *WINED3D_PFNGLCOMPILESHADERARBPROC)(GLhandleARB shaderObj);
+typedef GLhandleARB (WINE_GLAPI *WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC)(void);
+typedef void (WINE_GLAPI *WINED3D_PFNGLATTACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB obj);
+typedef void (WINE_GLAPI *WINED3D_PFNGLLINKPROGRAMARBPROC)(GLhandleARB programObj);
+typedef void (WINE_GLAPI *WINED3D_PFNGLDETACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB attachedObj);
+typedef void (WINE_GLAPI *WINED3D_PFNGLDELETEOBJECTARBPROC)(GLhandleARB obj);
+typedef void (WINE_GLAPI *WINED3D_PFNGLVALIDATEPROGRAMARBPROC)(GLhandleARB programObj);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC)(GLhandleARB containerObj,
+ GLsizei maxCount, GLsizei *count, GLhandleARB *obj);
+typedef GLhandleARB (WINE_GLAPI *WINED3D_PFNGLGETHANDLEARBPROC)(GLenum pname);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETSHADERSOURCEARBPROC)(GLhandleARB obj,
+ GLsizei maxLength, GLsizei *length, GLcharARB *source);
+typedef void (WINE_GLAPI *WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC)(GLhandleARB programObj,
+ GLuint index, const GLcharARB *name);
+typedef GLint (WINE_GLAPI *WINED3D_PFNGLGETATTRIBLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB *name);
+
+/* GL_ATI_fragment_shader */
+#ifndef GL_ATI_fragment_shader
+#define GL_ATI_fragment_shader 1
+#define GL_FRAGMENT_SHADER_ATI 0x8920
+#define GL_REG_0_ATI 0x8921
+#define GL_REG_1_ATI 0x8922
+#define GL_REG_2_ATI 0x8923
+#define GL_REG_3_ATI 0x8924
+#define GL_REG_4_ATI 0x8925
+#define GL_REG_5_ATI 0x8926
+#define GL_CON_0_ATI 0x8941
+#define GL_CON_1_ATI 0x8942
+#define GL_CON_2_ATI 0x8943
+#define GL_CON_3_ATI 0x8944
+#define GL_CON_4_ATI 0x8945
+#define GL_CON_5_ATI 0x8946
+#define GL_CON_6_ATI 0x8947
+#define GL_CON_7_ATI 0x8948
+#define GL_MOV_ATI 0x8961
+#define GL_ADD_ATI 0x8963
+#define GL_MUL_ATI 0x8964
+#define GL_SUB_ATI 0x8965
+#define GL_DOT3_ATI 0x8966
+#define GL_DOT4_ATI 0x8967
+#define GL_MAD_ATI 0x8968
+#define GL_LERP_ATI 0x8969
+#define GL_CND_ATI 0x896a
+#define GL_CND0_ATI 0x896b
+#define GL_DOT2_ADD_ATI 0x896c
+#define GL_SECONDARY_INTERPOLATOR_ATI 0x896d
+#define GL_SWIZZLE_STR_ATI 0x8976
+#define GL_SWIZZLE_STQ_ATI 0x8977
+#define GL_SWIZZLE_STR_DR_ATI 0x8978
+#define GL_SWIZZLE_STQ_DQ_ATI 0x8979
+#define GL_RED_BIT_ATI 0x00000001
+#define GL_GREEN_BIT_ATI 0x00000002
+#define GL_BLUE_BIT_ATI 0x00000004
+#define GL_2X_BIT_ATI 0x00000001
+#define GL_4X_BIT_ATI 0x00000002
+#define GL_8X_BIT_ATI 0x00000004
+#define GL_HALF_BIT_ATI 0x00000008
+#define GL_QUARTER_BIT_ATI 0x00000010
+#define GL_EIGHTH_BIT_ATI 0x00000020
+#define GL_SATURATE_BIT_ATI 0x00000040
+#define GL_COMP_BIT_ATI 0x00000002
+#define GL_NEGATE_BIT_ATI 0x00000004
+#define GL_BIAS_BIT_ATI 0x00000008
+#endif
+typedef GLuint (WINE_GLAPI *PGLFNGENFRAGMENTSHADERSATI)(GLuint range);
+typedef void (WINE_GLAPI *PGLFNBINDFRAGMENTSHADERATI)(GLuint id);
+typedef void (WINE_GLAPI *PGLFNDELETEFRAGMENTSHADERATI)(GLuint id);
+typedef void (WINE_GLAPI *PGLFNBEGINFRAGMENTSHADERATI)(void);
+typedef void (WINE_GLAPI *PGLFNENDFRAGMENTSHADERATI)(void);
+typedef void (WINE_GLAPI *PGLFNPASSTEXCOORDATI)(GLuint dst, GLuint coord, GLenum swizzle);
+typedef void (WINE_GLAPI *PGLFNSAMPLEMAPATI)(GLuint dst, GLuint interp, GLenum swizzle);
+typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP1ATI)(GLenum op, GLuint dst, GLuint dstMask,
+ GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
+typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP2ATI)(GLenum op, GLuint dst, GLuint dstMask,
+ GLuint dstMod, GLuint arg1, GLuint arg1Rep,
+ GLuint arg1Mod, GLuint arg2, GLuint arg2Rep,
+ GLuint arg2Mod);
+typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP3ATI)(GLenum 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);
+typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP1ATI)(GLenum op, GLuint dst, GLuint dstMod,
+ GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
+typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP2ATI)(GLenum op, GLuint dst, GLuint dstMod,
+ GLuint arg1, GLuint arg1Rep, GLuint arg1Mod,
+ GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
+typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP3ATI)(GLenum op, GLuint dst, GLuint dstMod,
+ GLuint arg1, GLuint arg1Rep, GLuint arg1Mod,
+ GLuint arg2, GLuint arg2Rep, GLuint arg2Mod,
+ GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);
+typedef void (WINE_GLAPI *PGLFNSETFRAGMENTSHADERCONSTANTATI)(GLuint dst, const GLfloat *value);
+
+/* GL_ATI_separate_stencil */
+#ifndef GL_ATI_separate_stencil
+#define GL_ATI_separate_stencil 1
+#define GL_STENCIL_BACK_FUNC_ATI 0x8800
+#define GL_STENCIL_BACK_FAIL_ATI 0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803
+#endif
+typedef void (WINE_GLAPI *PGLFNSTENCILOPSEPARATEATIPROC)(GLenum, GLenum, GLenum, GLenum);
+typedef void (WINE_GLAPI *PGLFNSTENCILFUNCSEPARATEATIPROC)(GLenum, GLenum, GLint, GLuint);
+
+/* GL_ATI_texture_compression_3dc */
+#ifndef GL_ATI_texture_compression_3dc
+#define GL_ATI_texture_compression_3dc 1
+#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837
+#endif
+
+/* GL_ATI_texture_env_combine3 */
+#ifndef GL_ATI_texture_env_combine3
+#define GL_ATI_texture_env_combine3 1
+#define GL_MODULATE_ADD_ATI 0x8744
+#define GL_MODULATE_SIGNED_ADD_ATI 0x8745
+#define GL_MODULATE_SUBTRACT_ATI 0x8746
+/* #define ONE */
+/* #define ZERO */
+#endif
+
+/* GL_ATI_texture_mirror_once */
+#ifndef GL_ATI_texture_mirror_once
+#define GL_ATI_texture_mirror_once 1
+#define GL_MIRROR_CLAMP_ATI 0x8742
+#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743
+#endif
+
+/* GL_EXT_blend_equation_separate */
+typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONSEPARATEEXTPROC)(GLenum modeRGB, GLenum modeAlpha);
+
+/* GL_EXT_blend_func_separate */
+#ifndef GL_EXT_blend_func_separate
+#define GL_EXT_blend_func_separate 1
+#define GL_BLEND_DST_RGB_EXT 0x80c8
+#define GL_BLEND_SRC_RGB_EXT 0x80c9
+#define GL_BLEND_DST_ALPHA_EXT 0x80ca
+#define GL_BLEND_SRC_ALPHA_EXT 0x80cb
+#endif
+typedef void (WINE_GLAPI *PGLFNBLENDFUNCSEPARATEEXTPROC)(GLenum sfactorRGB, GLenum dfactorRGB,
+ GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+/* GL_EXT_fog_coord */
+#ifndef GL_EXT_fog_coord
+#define GL_EXT_fog_coord 1
+#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450
+#define GL_FOG_COORDINATE_EXT 0x8451
+#define GL_FRAGMENT_DEPTH_EXT 0x8452
+#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453
+#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454
+#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455
+#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456
+#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457
+#endif
+typedef void (WINE_GLAPI *PGLFNGLFOGCOORDFEXTPROC)(GLfloat coord);
+typedef void (WINE_GLAPI *PGLFNGLFOGCOORDFVEXTPROC)(const GLfloat *coord);
+typedef void (WINE_GLAPI *PGLFNGLFOGCOORDDEXTPROC)(GLdouble coord);
+typedef void (WINE_GLAPI *PGLFNGLFOGCOORDDVEXTPROC)(const GLdouble *coord);
+typedef void (WINE_GLAPI *PGLFNGLFOGCOORDPOINTEREXTPROC)(GLenum type, GLsizei stride, GLvoid *data);
+
/* GL_EXT_framebuffer_blit */
#ifndef GL_EXT_framebuffer_blit
#define GL_EXT_framebuffer_blit 1
-#define GL_READ_FRAMEBUFFER_EXT 0x8CA8
-#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9
-#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6
-#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA
+#define GL_READ_FRAMEBUFFER_EXT 0x8ca8
+#define GL_DRAW_FRAMEBUFFER_EXT 0x8ca9
+#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8ca6
+#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8caa
#endif
-typedef void (WINE_GLAPI * PGLFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (WINE_GLAPI *PGLFNGLBLITFRAMEBUFFEREXTPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
+ GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
/* GL_EXT_framebuffer_multisample */
#ifndef GL_EXT_framebuffer_multisample
#define GL_EXT_framebuffer_multisample 1
-#define GL_RENDERBUFFER_SAMPLES_EXT 0x8cab
-#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8d56
-#define GL_MAX_SAMPLES_EXT 0x8d57
+#define GL_RENDERBUFFER_SAMPLES_EXT 0x8cab
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8d56
+#define GL_MAX_SAMPLES_EXT 0x8d57
#endif
-typedef void (WINE_GLAPI * PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (WINE_GLAPI *PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples,
+ GLenum internalformat, GLsizei width, GLsizei height);
+
+/* GL_EXT_framebuffer_object */
+#ifndef GL_EXT_framebuffer_object
+#define GL_EXT_framebuffer_object 1
+#define GL_FRAMEBUFFER_EXT 0x8d40
+#define GL_RENDERBUFFER_EXT 0x8d41
+#define GL_STENCIL_INDEX1_EXT 0x8d46
+#define GL_STENCIL_INDEX4_EXT 0x8d47
+#define GL_STENCIL_INDEX8_EXT 0x8d48
+#define GL_STENCIL_INDEX16_EXT 0x8d49
+#define GL_RENDERBUFFER_WIDTH_EXT 0x8d42
+#define GL_RENDERBUFFER_HEIGHT_EXT 0x8d43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8d44
+#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8d50
+#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8d51
+#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8d52
+#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8d53
+#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8d54
+#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8d55
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8cd0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8cd1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8cd2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8cd3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8cd4
+#define GL_COLOR_ATTACHMENT0_EXT 0x8ce0
+#define GL_COLOR_ATTACHMENT1_EXT 0x8ce1
+#define GL_COLOR_ATTACHMENT2_EXT 0x8ce2
+#define GL_COLOR_ATTACHMENT3_EXT 0x8ce3
+#define GL_COLOR_ATTACHMENT4_EXT 0x8ce4
+#define GL_COLOR_ATTACHMENT5_EXT 0x8ce5
+#define GL_COLOR_ATTACHMENT6_EXT 0x8ce6
+#define GL_COLOR_ATTACHMENT7_EXT 0x8ce7
+#define GL_COLOR_ATTACHMENT8_EXT 0x8ce8
+#define GL_COLOR_ATTACHMENT9_EXT 0x8ce9
+#define GL_COLOR_ATTACHMENT10_EXT 0x8cea
+#define GL_COLOR_ATTACHMENT11_EXT 0x8ceb
+#define GL_COLOR_ATTACHMENT12_EXT 0x8cec
+#define GL_COLOR_ATTACHMENT13_EXT 0x8ced
+#define GL_COLOR_ATTACHMENT14_EXT 0x8cee
+#define GL_COLOR_ATTACHMENT15_EXT 0x8cef
+#define GL_DEPTH_ATTACHMENT_EXT 0x8d00
+#define GL_STENCIL_ATTACHMENT_EXT 0x8d20
+#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8cd5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8cd6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8cd7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8cd9
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8cda
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8cdb
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8cdc
+#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8cdd
+#define GL_FRAMEBUFFER_BINDING_EXT 0x8ca6
+#define GL_RENDERBUFFER_BINDING_EXT 0x8ca7
+#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8cdF
+#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84e8
+#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506
+#endif
+typedef GLboolean (WINE_GLAPI *PGLFNGLISRENDERBUFFEREXTPROC)(GLuint renderbuffer);
+typedef void (WINE_GLAPI *PGLFNGLBINDRENDERBUFFEREXTPROC)(GLenum target, GLuint renderbuffer);
+typedef void (WINE_GLAPI *PGLFNGLDELETERENDERBUFFERSEXTPROC)(GLsizei n, const GLuint *renderbuffers);
+typedef void (WINE_GLAPI *PGLFNGLGENRENDERBUFFERSEXTPROC)(GLsizei n, GLuint *renderbuffers);
+typedef void (WINE_GLAPI *PGLFNGLRENDERBUFFERSTORAGEEXTPROC)(GLenum target,
+ GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (WINE_GLAPI *PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint *params);
+typedef GLboolean (WINE_GLAPI *PGLFNGLISFRAMEBUFFEREXTPROC)(GLuint framebuffer);
+typedef void (WINE_GLAPI *PGLFNGLBINDFRAMEBUFFEREXTPROC)(GLenum target, GLuint framebuffer);
+typedef void (WINE_GLAPI *PGLFNGLDELETEFRAMEBUFFERSEXTPROC)(GLsizei n, const GLuint *framebuffers);
+typedef void (WINE_GLAPI *PGLFNGLGENFRAMEBUFFERSEXTPROC)(GLsizei n, GLuint *framebuffers);
+typedef GLenum (WINE_GLAPI *PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC)(GLenum target, GLenum attachment,
+ GLenum textarget, GLuint texture, GLint level);
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC)(GLenum target, GLenum attachment,
+ GLenum textarget, GLuint texture, GLint level);
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC)(GLenum target, GLenum attachment,
+ GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)(GLenum target, GLenum attachment,
+ GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (WINE_GLAPI *PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLenum target,
+ GLenum attachment, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGLGENERATEMIPMAPEXTPROC)(GLenum target);
+
+/* GL_EXT_gpu_program_parameters */
+#ifndef GL_EXT_gpu_program_parameters
+#define GL_EXT_gpu_program_parameters 1
+typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETERS4FVEXTPROC)(GLenum target,
+ GLuint index, GLsizei count, const float *params);
+typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC)(GLenum target,
+ GLuint index, GLsizei count, const float *params);
+#endif
+
+/* GL_EXT_gpu_shader4 */
+#ifndef GL_EXT_gpu_shader4
+#define GL_EXT_gpu_shader4 1
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88fd
+#define GL_SAMPLER_1D_ARRAY_EXT 0x8dc0
+#define GL_SAMPLER_2D_ARRAY_EXT 0x8dc1
+#define GL_SAMPLER_BUFFER_EXT 0x8dc2
+#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8dc3
+#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8dc4
+#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8dc5
+#define GL_UNSIGNED_INT_VEC2_EXT 0x8dc6
+#define GL_UNSIGNED_INT_VEC3_EXT 0x8dc7
+#define GL_UNSIGNED_INT_VEC4_EXT 0x8dc8
+#define GL_INT_SAMPLER_1D_EXT 0x8dc9
+#define GL_INT_SAMPLER_2D_EXT 0x8dca
+#define GL_INT_SAMPLER_3D_EXT 0x8dcb
+#define GL_INT_SAMPLER_CUBE_EXT 0x8dcc
+#define GL_INT_SAMPLER_2D_RECT_EXT 0x8dcd
+#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8dce
+#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8dcf
+#define GL_INT_SAMPLER_BUFFER_EXT 0x8dd0
+#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8dd1
+#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8dd2
+#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8dd3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8dd4
+#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8dd5
+#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8dd6
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8dd7
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8dd8
+#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905
+#endif
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1IEXTPROC)(GLuint index, GLint x);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2IEXTPROC)(GLuint index, GLint x, GLint y);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3IEXTPROC)(GLuint index, GLint x, GLint y, GLint z);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4IEXTPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1UIEXTPROC)(GLuint index, GLuint x);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2UIEXTPROC)(GLuint index, GLuint x, GLuint y);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3UIEXTPROC)(GLuint index, GLuint x, GLuint y, GLuint z);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4UIEXTPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1IVEXTPROC)(GLuint index, const GLint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2IVEXTPROC)(GLuint index, const GLint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3IVEXTPROC)(GLuint index, const GLint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4IVEXTPROC)(GLuint index, const GLint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1UIVEXTPROC)(GLuint index, const GLuint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2UIVEXTPROC)(GLuint index, const GLuint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3UIVEXTPROC)(GLuint index, const GLuint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4UIVEXTPROC)(GLuint index, const GLuint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4BVEXTPROC)(GLuint index, const GLbyte *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4SVEXTPROC)(GLuint index, const GLshort *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4UBVEXTPROC)(GLuint index, const GLubyte *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4USVEXTPROC)(GLuint index, const GLushort *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBIPOINTEREXTPROC)(GLuint index, GLint size, GLenum type,
+ GLsizei stride, const GLvoid *pointer);
+typedef GLvoid (WINE_GLAPI *PGLFNGETVERTEXATTRIBIIVEXTPROC)(GLuint index, GLenum pname, GLint *params);
+typedef GLvoid (WINE_GLAPI *PGLFNGETVERTEXATTRIBIUIVEXTPROC)(GLuint index, GLenum pname, GLuint *params);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM1UIEXTPROC)(GLint location, GLuint v0);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM2UIEXTPROC)(GLint location, GLuint v0, GLuint v1);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM3UIEXTPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM4UIEXTPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM1UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM2UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM3UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM4UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value);
+typedef GLvoid (WINE_GLAPI *PGLFNGETUNIFORMUIVEXTPROC)(GLuint program, GLint location, const GLuint *params);
+typedef GLvoid (WINE_GLAPI *PGLFNBINDFRAGDATALOCATIONEXTPROC)(GLuint program, GLuint color_number, const GLchar *name);
+typedef GLint (WINE_GLAPI *PGLFNGETFRAGDATALOCATIONEXTPROC)(GLuint program, const GLchar *name);
/* 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
+#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
-#define GL_COLOR_SUM_EXT 0x8458
-#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459
-#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A
-#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B
-#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C
-#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D
-#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E
-#endif
-typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue);
-typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue);
-typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v);
-typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
/* GL_EXT_paletted_texture */
#ifndef GL_EXT_paletted_texture
#define GL_EXT_paletted_texture 1
-#define GL_COLOR_INDEX1_EXT 0x80E2
-#define GL_COLOR_INDEX2_EXT 0x80E3
-#define GL_COLOR_INDEX4_EXT 0x80E4
-#define GL_COLOR_INDEX8_EXT 0x80E5
-#define GL_COLOR_INDEX12_EXT 0x80E6
-#define GL_COLOR_INDEX16_EXT 0x80E7
-#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED
+#define GL_COLOR_INDEX1_EXT 0x80e2
+#define GL_COLOR_INDEX2_EXT 0x80e3
+#define GL_COLOR_INDEX4_EXT 0x80e4
+#define GL_COLOR_INDEX8_EXT 0x80e5
+#define GL_COLOR_INDEX12_EXT 0x80e6
+#define GL_COLOR_INDEX16_EXT 0x80e7
+#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ed
#endif
-typedef void (WINE_GLAPI * PGLFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+typedef void (WINE_GLAPI *PGLFNGLCOLORTABLEEXTPROC)(GLenum target, GLenum internalFormat,
+ GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
/* GL_EXT_point_parameters */
#ifndef GL_EXT_point_parameters
#define GL_EXT_point_parameters 1
-#define GL_POINT_SIZE_MIN_EXT 0x8126
-#define GL_POINT_SIZE_MAX_EXT 0x8127
-#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128
-#define GL_DISTANCE_ATTENUATION_EXT 0x8129
+#define GL_POINT_SIZE_MIN_EXT 0x8126
+#define GL_POINT_SIZE_MAX_EXT 0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128
+#define GL_DISTANCE_ATTENUATION_EXT 0x8129
#endif
-typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param);
-typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params);
+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
@@ -2109,2025 +3196,1304 @@ typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const
#define GL_PROVOKING_VERTEX_EXT 0x8e4f
#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8e4c
#endif
-typedef void (WINE_GLAPI * PGLFNGLPROVOKINGVERTEXEXTPROC)(GLenum mode);
+typedef void (WINE_GLAPI *PGLFNGLPROVOKINGVERTEXEXTPROC)(GLenum mode);
+
+/* GL_EXT_secondary_color */
+#ifndef GL_EXT_secondary_color
+#define GL_EXT_secondary_color 1
+#define GL_COLOR_SUM_EXT 0x8458
+#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459
+#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845a
+#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845b
+#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845c
+#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845d
+#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845e
+#endif
+typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3FEXTPROC)(GLfloat red, GLfloat green, GLfloat blue);
+typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3FVEXTPROC)(const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3UBEXTPROC)(GLubyte red, GLubyte green, GLubyte blue);
+typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3UBVEXTPROC)(const GLubyte *v);
+typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLORPOINTEREXTPROC)(GLint size, GLenum type,
+ GLsizei stride, const GLvoid *pointer);
+
+/* GL_EXT_stencil_two_side */
+#ifndef GL_EXT_stencil_two_side
+#define GL_EXT_stencil_two_side 1
+#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910
+#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911
+#endif
+typedef void (WINE_GLAPI *PGLFNACTIVESTENCILFACEEXTPROC)(GLenum face);
+
+/* GL_EXT_stencil_wrap */
+#ifndef GL_EXT_stencil_wrap
+#define GL_EXT_stencil_wrap 1
+#define GL_INCR_WRAP_EXT 0x8507
+#define GL_DECR_WRAP_EXT 0x8508
+#endif
/* GL_EXT_texture3D */
#ifndef GL_EXT_texture3D
#define GL_EXT_texture3D 1
-#define GL_PACK_SKIP_IMAGES_EXT 0x806B
-#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C
-#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D
-#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E
-#define GL_TEXTURE_3D_EXT 0x806F
-#define GL_PROXY_TEXTURE_3D_EXT 0x8070
-#define GL_TEXTURE_DEPTH_EXT 0x8071
-#define GL_TEXTURE_WRAP_R_EXT 0x8072
-#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073
+#define GL_PACK_SKIP_IMAGES_EXT 0x806b
+#define GL_PACK_IMAGE_HEIGHT_EXT 0x806c
+#define GL_UNPACK_SKIP_IMAGES_EXT 0x806d
+#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806e
+#define GL_TEXTURE_3D_EXT 0x806f
+#define GL_PROXY_TEXTURE_3D_EXT 0x8070
+#define GL_TEXTURE_DEPTH_EXT 0x8071
+#define GL_TEXTURE_WRAP_R_EXT 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073
#endif
-typedef void (WINE_GLAPI * PGLFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-typedef void (WINE_GLAPI * PGLFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
-/* GL_EXT_texture_env_combine */
-#ifndef GL_EXT_texture_env_combine
-#define GL_EXT_texture_env_combine 1
-#define GL_COMBINE_EXT 0x8570
-#define GL_COMBINE_RGB_EXT 0x8571
-#define GL_COMBINE_ALPHA_EXT 0x8572
-#define GL_RGB_SCALE_EXT 0x8573
-#define GL_ADD_SIGNED_EXT 0x8574
-#define GL_INTERPOLATE_EXT 0x8575
-#define GL_SUBTRACT_EXT 0x84E7
-#define GL_CONSTANT_EXT 0x8576
-#define GL_PRIMARY_COLOR_EXT 0x8577
-#define GL_PREVIOUS_EXT 0x8578
-#define GL_SOURCE0_RGB_EXT 0x8580
-#define GL_SOURCE1_RGB_EXT 0x8581
-#define GL_SOURCE2_RGB_EXT 0x8582
-#define GL_SOURCE3_RGB_EXT 0x8583
-#define GL_SOURCE4_RGB_EXT 0x8584
-#define GL_SOURCE5_RGB_EXT 0x8585
-#define GL_SOURCE6_RGB_EXT 0x8586
-#define GL_SOURCE7_RGB_EXT 0x8587
-#define GL_SOURCE0_ALPHA_EXT 0x8588
-#define GL_SOURCE1_ALPHA_EXT 0x8589
-#define GL_SOURCE2_ALPHA_EXT 0x858A
-#define GL_SOURCE3_ALPHA_EXT 0x858B
-#define GL_SOURCE4_ALPHA_EXT 0x858C
-#define GL_SOURCE5_ALPHA_EXT 0x858D
-#define GL_SOURCE6_ALPHA_EXT 0x858E
-#define GL_SOURCE7_ALPHA_EXT 0x858F
-#define GL_OPERAND0_RGB_EXT 0x8590
-#define GL_OPERAND1_RGB_EXT 0x8591
-#define GL_OPERAND2_RGB_EXT 0x8592
-#define GL_OPERAND3_RGB_EXT 0x8593
-#define GL_OPERAND4_RGB_EXT 0x8594
-#define GL_OPERAND5_RGB_EXT 0x8595
-#define GL_OPERAND6_RGB_EXT 0x8596
-#define GL_OPERAND7_RGB_EXT 0x8597
-#define GL_OPERAND0_ALPHA_EXT 0x8598
-#define GL_OPERAND1_ALPHA_EXT 0x8599
-#define GL_OPERAND2_ALPHA_EXT 0x859A
-#define GL_OPERAND3_ALPHA_EXT 0x859B
-#define GL_OPERAND4_ALPHA_EXT 0x859C
-#define GL_OPERAND5_ALPHA_EXT 0x859D
-#define GL_OPERAND6_ALPHA_EXT 0x859E
-#define GL_OPERAND7_ALPHA_EXT 0x859F
-#endif
-/* GL_EXT_texture_env_dot3 */
-#ifndef GL_EXT_texture_env_dot3
-#define GL_EXT_texture_env_dot3 1
-#define GL_DOT3_RGB_EXT 0x8740
-#define GL_DOT3_RGBA_EXT 0x8741
-#endif
-/* GL_EXT_texture_lod_bias */
-#ifndef GL_EXT_texture_lod_bias
-#define GL_EXT_texture_lod_bias 1
-#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD
-#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500
-#define GL_TEXTURE_LOD_BIAS_EXT 0x8501
-#endif
-/* GL_ARB_texture_border_clamp */
-#ifndef GL_ARB_texture_border_clamp
-#define GL_ARB_texture_border_clamp 1
-#define GL_CLAMP_TO_BORDER_ARB 0x812D
-#endif
-/* GL_EXT_texture_filter_anisotropic */
-#ifndef GL_EXT_texture_filter_anisotropic
-#define GL_EXT_texture_filter_anisotropic 1
-#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
-#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
-#endif
-/* GL_ARB_texture_mirrored_repeat (full support GL1.4) */
-#ifndef GL_ARB_texture_mirrored_repeat
-#define GL_ARB_texture_mirrored_repeat 1
-#define GL_MIRRORED_REPEAT_ARB 0x8370
-#endif
-/* GL_ATI_texture_mirror_once */
-#ifndef GL_ATI_texture_mirror_once
-#define GL_ATI_texture_mirror_once 1
-#define GL_MIRROR_CLAMP_ATI 0x8742
-#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743
-#endif
-/* GL_ARB_texture_env_dot3 */
-#ifndef GL_ARB_texture_env_dot3
-#define GL_ARB_texture_env_dot3 1
-#define GL_DOT3_RGB_ARB 0x86AE
-#define GL_DOT3_RGBA_ARB 0x86AF
-#endif
-/* GL_EXT_texture_env_dot3 */
-#ifndef GL_EXT_texture_env_dot3
-#define GL_EXT_texture_env_dot3 1
-#define GL_DOT3_RGB_EXT 0x8740
-#define GL_DOT3_RGBA_EXT 0x8741
-#endif
-/* GL_EXT_texture_sRGB */
-#ifndef GL_EXT_texture_sRGB
-#define GL_EXT_texture_sRGB 1
-#define GL_SRGB_EXT 0x8C40
-#define GL_SRGB8_EXT 0x8C41
-#define GL_SRGB_ALPHA_EXT 0x8C42
-#define GL_SRGB8_ALPHA8_EXT 0x8C43
-#define GL_SLUMINANCE_ALPHA_EXT 0x8C44
-#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45
-#define GL_SLUMINANCE_EXT 0x8C46
-#define GL_SLUMINANCE8_EXT 0x8C47
-#define GL_COMPRESSED_SRGB_EXT 0x8C48
-#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49
-#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A
-#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B
-#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F
-#endif
-/* GL_ARB_texture_float */
-#ifndef GL_ARB_texture_float
-#define GL_ARB_texture_float 1
-#define GL_RGBA32F_ARB 0x8814
-#define GL_RGB32F_ARB 0x8815
-#define GL_RGBA16F_ARB 0x881A
-#define GL_RGB16F_ARB 0x881B
-#endif
-/* GL_ARB_texture_rg */
-#ifndef GL_ARB_texture_rg
-#define GL_RG 0x8227
-#define GL_RG_INTEGER 0x8228
-#define GL_R8 0x8229
-#define GL_R16 0x822A
-#define GL_RG8 0x822B
-#define GL_RG16 0x822C
-#define GL_R16F 0x822D
-#define GL_R32F 0x822E
-#define GL_RG16F 0x822F
-#define GL_RG32F 0x8230
-#define GL_R8I 0x8231
-#define GL_R8UI 0x8232
-#define GL_R16I 0x8233
-#define GL_R16UI 0x8234
-#define GL_R32I 0x8235
-#define GL_R32UI 0x8236
-#define GL_RG8I 0x8237
-#define GL_RG8UI 0x8238
-#define GL_RG16I 0x8239
-#define GL_RG16UI 0x823A
-#define GL_RG32I 0x823B
-#define GL_RG32UI 0x823C
-#endif
-/* GL_EXT_texture_swizzle */
-#ifndef GL_EXT_texture_swizzle
-#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42
-#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43
-#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44
-#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45
-#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46
-#endif
-/* GL_ARB_half_float_pixel */
-#ifndef GL_ARB_half_float_pixel
-#define GL_ARB_half_float_pixel
-#define GL_HALF_FLOAT_ARB 0x140B
-#endif
-/* GL_ARB_vertex_program */
-#ifndef GL_ARB_vertex_program
-#define GL_ARB_vertex_program 1
-#define GL_VERTEX_PROGRAM_ARB 0x8620
-#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642
-#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643
-#define GL_COLOR_SUM_ARB 0x8458
-#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875
-#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622
-#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623
-#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624
-#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625
-#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A
-#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626
-#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645
-#define GL_PROGRAM_LENGTH_ARB 0x8627
-#define GL_PROGRAM_FORMAT_ARB 0x8876
-#define GL_PROGRAM_BINDING_ARB 0x8677
-#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0
-#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1
-#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2
-#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3
-#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4
-#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5
-#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6
-#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7
-#define GL_PROGRAM_PARAMETERS_ARB 0x88A8
-#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9
-#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA
-#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB
-#define GL_PROGRAM_ATTRIBS_ARB 0x88AC
-#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD
-#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE
-#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF
-#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0
-#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1
-#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2
-#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3
-#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4
-#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5
-#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6
-#define GL_PROGRAM_STRING_ARB 0x8628
-#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B
-#define GL_CURRENT_MATRIX_ARB 0x8641
-#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7
-#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640
-#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869
-#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F
-#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E
-#define GL_PROGRAM_ERROR_STRING_ARB 0x8874
-#define GL_MATRIX0_ARB 0x88C0
-#define GL_MATRIX1_ARB 0x88C1
-#define GL_MATRIX2_ARB 0x88C2
-#define GL_MATRIX3_ARB 0x88C3
-#define GL_MATRIX4_ARB 0x88C4
-#define GL_MATRIX5_ARB 0x88C5
-#define GL_MATRIX6_ARB 0x88C6
-#define GL_MATRIX7_ARB 0x88C7
-#define GL_MATRIX8_ARB 0x88C8
-#define GL_MATRIX9_ARB 0x88C9
-#define GL_MATRIX10_ARB 0x88CA
-#define GL_MATRIX11_ARB 0x88CB
-#define GL_MATRIX12_ARB 0x88CC
-#define GL_MATRIX13_ARB 0x88CD
-#define GL_MATRIX14_ARB 0x88CE
-#define GL_MATRIX15_ARB 0x88CF
-#define GL_MATRIX16_ARB 0x88D0
-#define GL_MATRIX17_ARB 0x88D1
-#define GL_MATRIX18_ARB 0x88D2
-#define GL_MATRIX19_ARB 0x88D3
-#define GL_MATRIX20_ARB 0x88D4
-#define GL_MATRIX21_ARB 0x88D5
-#define GL_MATRIX22_ARB 0x88D6
-#define GL_MATRIX23_ARB 0x88D7
-#define GL_MATRIX24_ARB 0x88D8
-#define GL_MATRIX25_ARB 0x88D9
-#define GL_MATRIX26_ARB 0x88DA
-#define GL_MATRIX27_ARB 0x88DB
-#define GL_MATRIX28_ARB 0x88DC
-#define GL_MATRIX29_ARB 0x88DD
-#define GL_MATRIX30_ARB 0x88DE
-#define GL_MATRIX31_ARB 0x88DF
-#endif
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
-typedef void (WINE_GLAPI * PGLFNENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
-typedef void (WINE_GLAPI * PGLFNDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
-typedef void (WINE_GLAPI * PGLFNPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string);
-typedef void (WINE_GLAPI * PGLFNBINDPROGRAMARBPROC) (GLenum target, GLuint program);
-typedef void (WINE_GLAPI * PGLFNDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs);
-typedef void (WINE_GLAPI * PGLFNGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs);
-typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer);
-typedef GLboolean (WINE_GLAPI * PGLFNISPROGRAMARBPROC) (GLuint program);
-#ifndef GL_ARB_fragment_program
-#define GL_ARB_fragment_program 1
-#define GL_FRAGMENT_PROGRAM_ARB 0x8804
-#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805
-#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806
-#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807
-#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808
-#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809
-#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A
-#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B
-#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C
-#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D
-#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E
-#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F
-#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810
-#define GL_MAX_TEXTURE_COORDS_ARB 0x8871
-#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872
-/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */
-#endif
-/* GL_ARB_multisample */
-#ifndef GL_ARB_multisample
-#define GL_ARB_multisample 1
-#define GL_MULTISAMPLE_ARB 0x809D
-#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E
-#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F
-#define GL_SAMPLE_COVERAGE_ARB 0x80A0
-#define GL_SAMPLE_BUFFERS_ARB 0x80A8
-#define GL_SAMPLES_ARB 0x80A9
-#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA
-#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB
-#define GL_MULTISAMPLE_BIT_ARB 0x20000000
-#endif
-typedef void (WINE_GLAPI * WINED3D_PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert);
-/* GL_ARB_vertex_buffer_object */
-#ifndef GL_ARB_vertex_buffer_object
-#define GL_ARB_vertex_buffer_object 1
-#define GL_BUFFER_SIZE_ARB 0x8764
-#define GL_BUFFER_USAGE_ARB 0x8765
-#define GL_ARRAY_BUFFER_ARB 0x8892
-#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893
-#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894
-#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895
-#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896
-#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897
-#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898
-#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899
-#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A
-#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B
-#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C
-#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D
-#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E
-#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F
-#define GL_READ_ONLY_ARB 0x88B8
-#define GL_WRITE_ONLY_ARB 0x88B9
-#define GL_READ_WRITE_ARB 0x88BA
-#define GL_BUFFER_ACCESS_ARB 0x88BB
-#define GL_BUFFER_MAPPED_ARB 0x88BC
-#define GL_BUFFER_MAP_POINTER_ARB 0x88BD
-#define GL_STREAM_DRAW_ARB 0x88E0
-#define GL_STREAM_READ_ARB 0x88E1
-#define GL_STREAM_COPY_ARB 0x88E2
-#define GL_STATIC_DRAW_ARB 0x88E4
-#define GL_STATIC_READ_ARB 0x88E5
-#define GL_STATIC_COPY_ARB 0x88E6
-#define GL_DYNAMIC_DRAW_ARB 0x88E8
-#define GL_DYNAMIC_READ_ARB 0x88E9
-#define GL_DYNAMIC_COPY_ARB 0x88EA
-#endif
-typedef void (WINE_GLAPI * PGLFNBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
-typedef void (WINE_GLAPI * PGLFNDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers);
-typedef void (WINE_GLAPI * PGLFNGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers);
-typedef GLboolean (WINE_GLAPI * PGLFNISBUFFERARBPROC) (GLuint buffer);
-typedef void (WINE_GLAPI * PGLFNBUFFERDATAARBPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
-typedef void (WINE_GLAPI * PGLFNBUFFERSUBDATAARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
-typedef GLvoid* (WINE_GLAPI * PGLFNMAPBUFFERARBPROC) (GLenum target, GLenum access);
-typedef GLboolean (WINE_GLAPI * PGLFNUNMAPBUFFERARBPROC) (GLenum target);
-typedef void (WINE_GLAPI * PGLFNGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params);
-/* GL_EXT_blend_equation_separate */
-typedef void (WINE_GLAPI * PGLFNBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-/* GL_EXT_blend_func_separate */
-#ifndef GL_EXT_blend_func_separate
-#define GL_BLEND_DST_RGB_EXT 0x80C8
-#define GL_BLEND_SRC_RGB_EXT 0x80C9
-#define GL_BLEND_DST_ALPHA_EXT 0x80CA
-#define GL_BLEND_SRC_ALPHA_EXT 0x80CB
-#endif
-typedef void (WINE_GLAPI * PGLFNBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha);
-/* GL_EXT_fog_coord */
-#ifndef GL_EXT_fog_coord
-#define GL_EXT_fog_coord 1
-#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450
-#define GL_FOG_COORDINATE_EXT 0x8451
-#define GL_FRAGMENT_DEPTH_EXT 0x8452
-#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453
-#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454
-#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455
-#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456
-#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457
-#endif /* GL_EXT_fog_coord */
-typedef void (WINE_GLAPI * PGLFNGLFOGCOORDFEXTPROC) (GLfloat coord);
-typedef void (WINE_GLAPI * PGLFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord);
-typedef void (WINE_GLAPI * PGLFNGLFOGCOORDDEXTPROC) (GLdouble coord);
-typedef void (WINE_GLAPI * PGLFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord);
-typedef void (WINE_GLAPI * PGLFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, GLvoid *data);
-/* GL_ARB_shader_objects (GLSL) */
-#ifndef GL_ARB_shader_objects
-#define GL_ARB_shader_objects 1
-typedef char GLcharARB;
-typedef unsigned int GLhandleARB;
-#define GL_PROGRAM_OBJECT_ARB 0x8B40
-#define GL_OBJECT_TYPE_ARB 0x8B4E
-#define GL_OBJECT_SUBTYPE_ARB 0x8B4F
-#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80
-#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81
-#define GL_OBJECT_LINK_STATUS_ARB 0x8B82
-#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83
-#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84
-#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85
-#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86
-#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87
-#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88
-#define GL_SHADER_OBJECT_ARB 0x8B48
-#define GL_FLOAT_VEC2_ARB 0x8B50
-#define GL_FLOAT_VEC3_ARB 0x8B51
-#define GL_FLOAT_VEC4_ARB 0x8B52
-#define GL_INT_VEC2_ARB 0x8B53
-#define GL_INT_VEC3_ARB 0x8B54
-#define GL_INT_VEC4_ARB 0x8B55
-#define GL_BOOL_ARB 0x8B56
-#define GL_BOOL_VEC2_ARB 0x8B57
-#define GL_BOOL_VEC3_ARB 0x8B58
-#define GL_BOOL_VEC4_ARB 0x8B59
-#define GL_FLOAT_MAT2_ARB 0x8B5A
-#define GL_FLOAT_MAT3_ARB 0x8B5B
-#define GL_FLOAT_MAT4_ARB 0x8B5C
-#define GL_SAMPLER_1D_ARB 0x8B5D
-#define GL_SAMPLER_2D_ARB 0x8B5E
-#define GL_SAMPLER_3D_ARB 0x8B5F
-#define GL_SAMPLER_CUBE_ARB 0x8B60
-#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61
-#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62
-#define GL_SAMPLER_2D_RECT_ARB 0x8B63
-#define GL_SAMPELR_2D_RECT_SHADOW_ARB 0x8B64
-#endif
-#ifndef GL_ARB_shading_language_100
-#define GL_ARB_shading_language_100 1
-#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C
-#endif
-#ifndef GL_ARB_fragment_shader
-#define GL_ARB_fragment_shader 1
-#define GL_FRAGMENT_SHADER_ARB 0x8B30
-#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49
-#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B
-#endif
-#ifndef GL_ARB_vertex_shader
-#define GL_ARB_vertex_shader 1
-#define GL_VERTEX_SHADER_ARB 0x8B31
-#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A
-#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B
-#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C
-#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D
-#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89
-#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A
-#endif
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params);
-typedef GLint (WINE_GLAPI * WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj);
-typedef GLhandleARB (WINE_GLAPI * WINED3D_PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType);
-typedef void (WINE_GLAPI * WINED3D_PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length);
-typedef void (WINE_GLAPI * WINED3D_PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj);
-typedef GLhandleARB (WINE_GLAPI * WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC) (void);
-typedef void (WINE_GLAPI * WINED3D_PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj);
-typedef void (WINE_GLAPI * WINED3D_PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj);
-typedef void (WINE_GLAPI * WINED3D_PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj);
-typedef void (WINE_GLAPI * WINED3D_PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj);
-typedef void (WINE_GLAPI * WINED3D_PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj);
-typedef GLhandleARB (WINE_GLAPI * WINED3D_PFNGLGETHANDLEARBPROC) (GLenum pname);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source);
-typedef void (WINE_GLAPI * WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name);
-typedef GLint (WINE_GLAPI * WINED3D_PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name);
-/* GL_ARB_pixel_buffer_object */
-#ifndef GL_ARB_pixel_buffer_object
-#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB
-#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC
-#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED
-#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF
-#endif
-/* GL_EXT_texture */
-#ifndef GL_EXT_texture
-#define GL_EXT_texture 1
-#define GL_ALPHA4_EXT 0x803B
-#define GL_ALPHA8_EXT 0x803C
-#define GL_ALPHA12_EXT 0x803D
-#define GL_ALPHA16_EXT 0x803E
-#define GL_LUMINANCE4_EXT 0x803F
-#define GL_LUMINANCE8_EXT 0x8040
-#define GL_LUMINANCE12_EXT 0x8041
-#define GL_LUMINANCE16_EXT 0x8042
-#define GL_LUMINANCE4_ALPHA4_EXT 0x8043
-#define GL_LUMINANCE6_ALPHA2_EXT 0x8044
-#define GL_LUMINANCE8_ALPHA8_EXT 0x8045
-#define GL_LUMINANCE12_ALPHA4_EXT 0x8046
-#define GL_LUMINANCE12_ALPHA12_EXT 0x8047
-#define GL_LUMINANCE16_ALPHA16_EXT 0x8048
-#define GL_INTENSITY_EXT 0x8049
-#define GL_INTENSITY4_EXT 0x804A
-#define GL_INTENSITY8_EXT 0x804B
-#define GL_INTENSITY12_EXT 0x804C
-#define GL_INTENSITY16_EXT 0x804D
-#define GL_RGB2_EXT 0x804E
-#define GL_RGB4_EXT 0x804F
-#define GL_RGB5_EXT 0x8050
-#define GL_RGB8_EXT 0x8051
-#define GL_RGB10_EXT 0x8052
-#define GL_RGB12_EXT 0x8053
-#define GL_RGB16_EXT 0x8054
-#define GL_RGBA2_EXT 0x8055
-#define GL_RGBA4_EXT 0x8056
-#define GL_RGB5_A1_EXT 0x8057
-#define GL_RGBA8_EXT 0x8058
-#define GL_RGB10_A2_EXT 0x8059
-#define GL_RGBA12_EXT 0x805A
-#define GL_RGBA16_EXT 0x805B
-#define GL_TEXTURE_RED_SIZE_EXT 0x805C
-#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D
-#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E
-#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F
-#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060
-#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061
-#define GL_REPLACE_EXT 0x8062
-#define GL_PROXY_TEXTURE_1D_EXT 0x8063
-#define GL_PROXY_TEXTURE_2D_EXT 0x8064
-#define GL_TEXTURE_TOO_LARGE_EXT 0x8065
+typedef void (WINE_GLAPI *PGLFNGLTEXIMAGE3DEXTPROC)(GLenum target, GLint level, GLenum internalformat,
+ GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+typedef void (WINE_GLAPI *PGLFNGLTEXSUBIMAGE3DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+ GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+
+/* GL_EXT_texture_compression_rgtc */
+#ifndef GL_EXT_texture_compression_rgtc
+#define GL_EXT_texture_compression_rgtc 1
+#define GL_COMPRESSED_RED_RGTC1_EXT 0x8dbb
+#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8dbc
+#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8dbd
+#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8dbe
#endif
+
/* GL_EXT_texture_compression_s3tc */
#ifndef GL_EXT_texture_compression_s3tc
#define GL_EXT_texture_compression_s3tc 1
-#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
-#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
-#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
-#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83f0
+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83f1
+#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83f2
+#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83f3
#endif
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img);
-/* GL_EXT_stencil_wrap */
-#ifndef GL_EXT_stencil_wrap
-#define GL_EXT_stencil_wrap 1
-#define GL_INCR_WRAP_EXT 0x8507
-#define GL_DECR_WRAP_EXT 0x8508
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat,
+ GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat,
+ GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat,
+ GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level,
+ GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
+ GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+ GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset,
+ GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void *img);
+
+/* GL_EXT_texture_env_combine */
+#ifndef GL_EXT_texture_env_combine
+#define GL_EXT_texture_env_combine 1
+#define GL_COMBINE_EXT 0x8570
+#define GL_COMBINE_RGB_EXT 0x8571
+#define GL_COMBINE_ALPHA_EXT 0x8572
+#define GL_RGB_SCALE_EXT 0x8573
+#define GL_ADD_SIGNED_EXT 0x8574
+#define GL_INTERPOLATE_EXT 0x8575
+#define GL_SUBTRACT_EXT 0x84e7
+#define GL_CONSTANT_EXT 0x8576
+#define GL_PRIMARY_COLOR_EXT 0x8577
+#define GL_PREVIOUS_EXT 0x8578
+#define GL_SOURCE0_RGB_EXT 0x8580
+#define GL_SOURCE1_RGB_EXT 0x8581
+#define GL_SOURCE2_RGB_EXT 0x8582
+#define GL_SOURCE3_RGB_EXT 0x8583
+#define GL_SOURCE4_RGB_EXT 0x8584
+#define GL_SOURCE5_RGB_EXT 0x8585
+#define GL_SOURCE6_RGB_EXT 0x8586
+#define GL_SOURCE7_RGB_EXT 0x8587
+#define GL_SOURCE0_ALPHA_EXT 0x8588
+#define GL_SOURCE1_ALPHA_EXT 0x8589
+#define GL_SOURCE2_ALPHA_EXT 0x858a
+#define GL_SOURCE3_ALPHA_EXT 0x858b
+#define GL_SOURCE4_ALPHA_EXT 0x858c
+#define GL_SOURCE5_ALPHA_EXT 0x858d
+#define GL_SOURCE6_ALPHA_EXT 0x858e
+#define GL_SOURCE7_ALPHA_EXT 0x858f
+#define GL_OPERAND0_RGB_EXT 0x8590
+#define GL_OPERAND1_RGB_EXT 0x8591
+#define GL_OPERAND2_RGB_EXT 0x8592
+#define GL_OPERAND3_RGB_EXT 0x8593
+#define GL_OPERAND4_RGB_EXT 0x8594
+#define GL_OPERAND5_RGB_EXT 0x8595
+#define GL_OPERAND6_RGB_EXT 0x8596
+#define GL_OPERAND7_RGB_EXT 0x8597
+#define GL_OPERAND0_ALPHA_EXT 0x8598
+#define GL_OPERAND1_ALPHA_EXT 0x8599
+#define GL_OPERAND2_ALPHA_EXT 0x859a
+#define GL_OPERAND3_ALPHA_EXT 0x859b
+#define GL_OPERAND4_ALPHA_EXT 0x859c
+#define GL_OPERAND5_ALPHA_EXT 0x859d
+#define GL_OPERAND6_ALPHA_EXT 0x859e
+#define GL_OPERAND7_ALPHA_EXT 0x859f
#endif
-/* GL_ARB_half_float_vertex */
-#ifndef GL_ARB_half_float_vertex
-#define GL_ARB_half_float_vertex
-/* No _ARB, see extension spec */
-#define GL_HALF_FLOAT 0x140B
+/* GL_EXT_texture_env_dot3 */
+#ifndef GL_EXT_texture_env_dot3
+#define GL_EXT_texture_env_dot3 1
+#define GL_DOT3_RGB_EXT 0x8740
+#define GL_DOT3_RGBA_EXT 0x8741
#endif
-/* GL_NV_half_float */
-#ifndef GL_NV_half_float
-#define GL_NV_half_float 1
-typedef unsigned short GLhalfNV;
-#define GL_HALF_FLOAT_NV 0x140B
+
+/* GL_EXT_texture_filter_anisotropic */
+#ifndef GL_EXT_texture_filter_anisotropic
+#define GL_EXT_texture_filter_anisotropic 1
+#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84fe
+#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84ff
#endif
-typedef void (WINE_GLAPI * PGLFNVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y);
-typedef void (WINE_GLAPI * PGLFNVERTEX2HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z);
-typedef void (WINE_GLAPI * PGLFNVERTEX3HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
-typedef void (WINE_GLAPI * PGLFNVERTEX4HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz);
-typedef void (WINE_GLAPI * PGLFNNORMAL3HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue);
-typedef void (WINE_GLAPI * PGLFNCOLOR3HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha);
-typedef void (WINE_GLAPI * PGLFNCOLOR4HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD1HNVPROC) (GLhalfNV s);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD1HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD2HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD3HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD4HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNFOGCOORDHNVPROC) (GLhalfNV fog);
-typedef void (WINE_GLAPI * PGLFNFOGCOORDHVNVPROC) (const GLhalfNV *fog);
-typedef void (WINE_GLAPI * PGLFNSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue);
-typedef void (WINE_GLAPI * PGLFNSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXWEIGHTHNVPROC) (GLhalfNV weight);
-typedef void (WINE_GLAPI * PGLFNVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
+
+/* GL_EXT_texture_lod_bias */
+#ifndef GL_EXT_texture_lod_bias
+#define GL_EXT_texture_lod_bias 1
+#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84fd
+#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500
+#define GL_TEXTURE_LOD_BIAS_EXT 0x8501
+#endif
+
+/* GL_EXT_texture_sRGB */
+#ifndef GL_EXT_texture_sRGB
+#define GL_EXT_texture_sRGB 1
+#define GL_SRGB_EXT 0x8c40
+#define GL_SRGB8_EXT 0x8c41
+#define GL_SRGB_ALPHA_EXT 0x8c42
+#define GL_SRGB8_ALPHA8_EXT 0x8c43
+#define GL_SLUMINANCE_ALPHA_EXT 0x8c44
+#define GL_SLUMINANCE8_ALPHA8_EXT 0x8c45
+#define GL_SLUMINANCE_EXT 0x8c46
+#define GL_SLUMINANCE8_EXT 0x8c47
+#define GL_COMPRESSED_SRGB_EXT 0x8c48
+#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8c49
+#define GL_COMPRESSED_SLUMINANCE_EXT 0x8c4a
+#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8c4b
+#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8c4c
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8c4d
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8c4e
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8c4f
+#endif
+
+/* GL_NV_depth_clamp */
+#ifndef GL_NV_depth_clamp
+#define GL_NV_depth_clamp 1
+#define GL_DEPTH_CLAMP_NV 0x864f
+#endif
+
+/* GL_NV_fence */
+#ifndef GL_NV_fence
+#define GL_NV_fence 1
+#define GL_ALL_COMPLETED_NV 0x84f2
+#define GL_FENCE_STATUS_NV 0x84f3
+#define GL_FENCE_CONDITION_NV 0x84f4
+#endif
+typedef void (WINE_GLAPI *PGLFNGENFENCESNVPROC)(GLsizei, GLuint *);
+typedef void (WINE_GLAPI *PGLFNDELETEFENCESNVPROC)(GLuint, const GLuint *);
+typedef void (WINE_GLAPI *PGLFNSETFENCENVPROC)(GLuint, GLenum);
+typedef GLboolean (WINE_GLAPI *PGLFNTESTFENCENVPROC)(GLuint);
+typedef void (WINE_GLAPI *PGLFNFINISHFENCENVPROC)(GLuint);
+typedef GLboolean (WINE_GLAPI *PGLFNISFENCENVPROC)(GLuint);
+typedef void (WINE_GLAPI *PGLFNGETFENCEIVNVPROC)(GLuint, GLenum, GLint *);
/* GL_NV_fog_distance */
#ifndef GL_NV_fog_distance
#define GL_NV_fog_distance 1
-#define GL_FOG_DISTANCE_MODE_NV 0x855A
-#define GL_EYE_RADIAL_NV 0x855B
-#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C
+#define GL_FOG_DISTANCE_MODE_NV 0x855a
+#define GL_EYE_RADIAL_NV 0x855b
+#define GL_EYE_PLANE_ABSOLUTE_NV 0x855c
/* reuse GL_EYE_PLANE */
#endif
-/* GL_NV_texgen_reflection */
-#ifndef GL_NV_texgen_reflection
-#define GL_NV_texgen_reflection 1
-#define GL_NORMAL_MAP_NV 0x8511
-#define GL_REFLECTION_MAP_NV 0x8512
+
+/* GL_NV_half_float */
+#ifndef GL_NV_half_float
+#define GL_NV_half_float 1
+typedef unsigned short GLhalfNV;
+#define GL_HALF_FLOAT_NV 0x140b
#endif
-/* GL_NV_texture_env_combine4 */
-#ifndef GL_NV_texture_env_combine4
-#define GL_NV_texture_env_combine4 1
-#define GL_COMBINE4_NV 0x8503
-#define GL_SOURCE3_RGB_NV 0x8583
-#define GL_SOURCE3_ALPHA_NV 0x858B
-#define GL_OPERAND3_RGB_NV 0x8593
-#define GL_OPERAND3_ALPHA_NV 0x859B
+typedef void (WINE_GLAPI *PGLFNVERTEX2HNVPROC)(GLhalfNV x, GLhalfNV y);
+typedef void (WINE_GLAPI *PGLFNVERTEX2HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEX3HNVPROC)(GLhalfNV x, GLhalfNV y, GLhalfNV z);
+typedef void (WINE_GLAPI *PGLFNVERTEX3HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEX4HNVPROC)(GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
+typedef void (WINE_GLAPI *PGLFNVERTEX4HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNNORMAL3HNVPROC)(GLhalfNV nx, GLhalfNV ny, GLhalfNV nz);
+typedef void (WINE_GLAPI *PGLFNNORMAL3HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNCOLOR3HNVPROC)(GLhalfNV red, GLhalfNV green, GLhalfNV blue);
+typedef void (WINE_GLAPI *PGLFNCOLOR3HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNCOLOR4HNVPROC)(GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha);
+typedef void (WINE_GLAPI *PGLFNCOLOR4HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD1HNVPROC)(GLhalfNV s);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD1HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD2HNVPROC)(GLhalfNV s, GLhalfNV t);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD2HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD3HNVPROC)(GLhalfNV s, GLhalfNV t, GLhalfNV r);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD3HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD4HNVPROC)(GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD4HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD1HNVPROC)(GLenum target, GLhalfNV s);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD1HVNVPROC)(GLenum target, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD2HNVPROC)(GLenum target, GLhalfNV s, GLhalfNV t);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD2HVNVPROC)(GLenum target, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD3HNVPROC)(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD3HVNVPROC)(GLenum target, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD4HNVPROC)(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD4HVNVPROC)(GLenum target, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNFOGCOORDHNVPROC)(GLhalfNV fog);
+typedef void (WINE_GLAPI *PGLFNFOGCOORDHVNVPROC)(const GLhalfNV *fog);
+typedef void (WINE_GLAPI *PGLFNSECONDARYCOLOR3HNVPROC)(GLhalfNV red, GLhalfNV green, GLhalfNV blue);
+typedef void (WINE_GLAPI *PGLFNSECONDARYCOLOR3HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXWEIGHTHNVPROC)(GLhalfNV weight);
+typedef void (WINE_GLAPI *PGLFNVERTEXWEIGHTHVNVPROC)(const GLhalfNV *weight);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1HNVPROC)(GLuint index, GLhalfNV x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1HVNVPROC)(GLuint index, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2HNVPROC)(GLuint index, GLhalfNV x, GLhalfNV y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2HVNVPROC)(GLuint index, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3HNVPROC)(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3HVNVPROC)(GLuint index, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4HNVPROC)(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4HVNVPROC)(GLuint index, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS1HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS2HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS3HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS4HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v);
+
+/* GL_NV_light_max_exponent */
+#ifndef GL_NV_light_max_exponent
+#define GL_NV_light_max_exponent 1
+#define GL_MAX_SHININESS_NV 0x8504
+#define GL_MAX_SPOT_EXPONENT_NV 0x8505
#endif
+
/* GL_NV_register_combiners */
#ifndef GL_NV_register_combiners
#define GL_NV_register_combiners 1
-#define GL_REGISTER_COMBINERS_NV 0x8522
-#define GL_VARIABLE_A_NV 0x8523
-#define GL_VARIABLE_B_NV 0x8524
-#define GL_VARIABLE_C_NV 0x8525
-#define GL_VARIABLE_D_NV 0x8526
-#define GL_VARIABLE_E_NV 0x8527
-#define GL_VARIABLE_F_NV 0x8528
-#define GL_VARIABLE_G_NV 0x8529
-#define GL_CONSTANT_COLOR0_NV 0x852A
-#define GL_CONSTANT_COLOR1_NV 0x852B
-#define GL_PRIMARY_COLOR_NV 0x852C
-#define GL_SECONDARY_COLOR_NV 0x852D
-#define GL_SPARE0_NV 0x852E
-#define GL_SPARE1_NV 0x852F
-#define GL_DISCARD_NV 0x8530
-#define GL_E_TIMES_F_NV 0x8531
-#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532
-#define GL_UNSIGNED_IDENTITY_NV 0x8536
-#define GL_UNSIGNED_INVERT_NV 0x8537
-#define GL_EXPAND_NORMAL_NV 0x8538
-#define GL_EXPAND_NEGATE_NV 0x8539
-#define GL_HALF_BIAS_NORMAL_NV 0x853A
-#define GL_HALF_BIAS_NEGATE_NV 0x853B
-#define GL_SIGNED_IDENTITY_NV 0x853C
-#define GL_SIGNED_NEGATE_NV 0x853D
-#define GL_SCALE_BY_TWO_NV 0x853E
-#define GL_SCALE_BY_FOUR_NV 0x853F
-#define GL_SCALE_BY_ONE_HALF_NV 0x8540
-#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541
-#define GL_COMBINER_INPUT_NV 0x8542
-#define GL_COMBINER_MAPPING_NV 0x8543
-#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544
-#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545
-#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546
-#define GL_COMBINER_MUX_SUM_NV 0x8547
-#define GL_COMBINER_SCALE_NV 0x8548
-#define GL_COMBINER_BIAS_NV 0x8549
-#define GL_COMBINER_AB_OUTPUT_NV 0x854A
-#define GL_COMBINER_CD_OUTPUT_NV 0x854B
-#define GL_COMBINER_SUM_OUTPUT_NV 0x854C
-#define GL_MAX_GENERAL_COMBINERS_NV 0x854D
-#define GL_NUM_GENERAL_COMBINERS_NV 0x854E
-#define GL_COLOR_SUM_CLAMP_NV 0x854F
-#define GL_COMBINER0_NV 0x8550
-#define GL_COMBINER1_NV 0x8551
-#define GL_COMBINER2_NV 0x8552
-#define GL_COMBINER3_NV 0x8553
-#define GL_COMBINER4_NV 0x8554
-#define GL_COMBINER5_NV 0x8555
-#define GL_COMBINER6_NV 0x8556
-#define GL_COMBINER7_NV 0x8557
+#define GL_REGISTER_COMBINERS_NV 0x8522
+#define GL_VARIABLE_A_NV 0x8523
+#define GL_VARIABLE_B_NV 0x8524
+#define GL_VARIABLE_C_NV 0x8525
+#define GL_VARIABLE_D_NV 0x8526
+#define GL_VARIABLE_E_NV 0x8527
+#define GL_VARIABLE_F_NV 0x8528
+#define GL_VARIABLE_G_NV 0x8529
+#define GL_CONSTANT_COLOR0_NV 0x852a
+#define GL_CONSTANT_COLOR1_NV 0x852b
+#define GL_PRIMARY_COLOR_NV 0x852c
+#define GL_SECONDARY_COLOR_NV 0x852d
+#define GL_SPARE0_NV 0x852e
+#define GL_SPARE1_NV 0x852f
+#define GL_DISCARD_NV 0x8530
+#define GL_E_TIMES_F_NV 0x8531
+#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532
+#define GL_UNSIGNED_IDENTITY_NV 0x8536
+#define GL_UNSIGNED_INVERT_NV 0x8537
+#define GL_EXPAND_NORMAL_NV 0x8538
+#define GL_EXPAND_NEGATE_NV 0x8539
+#define GL_HALF_BIAS_NORMAL_NV 0x853a
+#define GL_HALF_BIAS_NEGATE_NV 0x853b
+#define GL_SIGNED_IDENTITY_NV 0x853c
+#define GL_SIGNED_NEGATE_NV 0x853d
+#define GL_SCALE_BY_TWO_NV 0x853e
+#define GL_SCALE_BY_FOUR_NV 0x853f
+#define GL_SCALE_BY_ONE_HALF_NV 0x8540
+#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541
+#define GL_COMBINER_INPUT_NV 0x8542
+#define GL_COMBINER_MAPPING_NV 0x8543
+#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544
+#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545
+#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546
+#define GL_COMBINER_MUX_SUM_NV 0x8547
+#define GL_COMBINER_SCALE_NV 0x8548
+#define GL_COMBINER_BIAS_NV 0x8549
+#define GL_COMBINER_AB_OUTPUT_NV 0x854a
+#define GL_COMBINER_CD_OUTPUT_NV 0x854b
+#define GL_COMBINER_SUM_OUTPUT_NV 0x854c
+#define GL_MAX_GENERAL_COMBINERS_NV 0x854d
+#define GL_NUM_GENERAL_COMBINERS_NV 0x854e
+#define GL_COLOR_SUM_CLAMP_NV 0x854f
+#define GL_COMBINER0_NV 0x8550
+#define GL_COMBINER1_NV 0x8551
+#define GL_COMBINER2_NV 0x8552
+#define GL_COMBINER3_NV 0x8553
+#define GL_COMBINER4_NV 0x8554
+#define GL_COMBINER5_NV 0x8555
+#define GL_COMBINER6_NV 0x8556
+#define GL_COMBINER7_NV 0x8557
/* reuse GL_TEXTURE0_ARB */
/* reuse GL_TEXTURE1_ARB */
/* reuse GL_ZERO */
/* reuse GL_NONE */
/* reuse GL_FOG */
#endif
-typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param);
-typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params);
-typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param);
-typedef void (WINE_GLAPI * PGLFNCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
-typedef void (WINE_GLAPI * PGLFNCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);
-typedef void (WINE_GLAPI * PGLFNFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
-typedef void (WINE_GLAPI * PGLFNGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERFVNVPROC)(GLenum pname, const GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERFNVPROC)(GLenum pname, GLfloat param);
+typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERIVNVPROC)(GLenum pname, const GLint *params);
+typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERINVPROC)(GLenum pname, GLint param);
+typedef void (WINE_GLAPI *PGLFNCOMBINERINPUTNVPROC)(GLenum stage, GLenum portion,
+ GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
+typedef void (WINE_GLAPI *PGLFNCOMBINEROUTPUTNVPROC)(GLenum stage, GLenum portion,
+ GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias,
+ GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);
+typedef void (WINE_GLAPI *PGLFNFINALCOMBINERINPUTNVPROC)(GLenum variable, GLenum input,
+ GLenum mapping, GLenum componentUsage);
+typedef void (WINE_GLAPI *PGLFNGETCOMBINERINPUTPARAMETERFVNVPROC)(GLenum stage, GLenum portion,
+ GLenum variable, GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETCOMBINERINPUTPARAMETERIVNVPROC)(GLenum stage, GLenum portion,
+ GLenum variable, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETCOMBINEROUTPUTPARAMETERFVNVPROC)(GLenum stage, GLenum portion,
+ GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETCOMBINEROUTPUTPARAMETERIVNVPROC)(GLenum stage, GLenum portion,
+ GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETFINALCOMBINERINPUTPARAMETERFVNVPROC)(GLenum variable, GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETFINALCOMBINERINPUTPARAMETERIVNVPROC)(GLenum variable, GLenum pname, GLint *params);
+
/* GL_NV_register_combiners2 */
#ifndef GL_NV_register_combiners2
#define GL_NV_register_combiners2 1
-#define GL_PER_STAGE_CONSTANTS_NV 0x8535
+#define GL_PER_STAGE_CONSTANTS_NV 0x8535
#endif
-typedef void (WINE_GLAPI * PGLFNCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNCOMBINERSTAGEPARAMETERFVNVPROC)(GLenum stage, GLenum pname, const GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETCOMBINERSTAGEPARAMETERFVNVPROC)(GLenum stage, GLenum pname, GLfloat *params);
+
+/* GL_NV_texgen_reflection */
+#ifndef GL_NV_texgen_reflection
+#define GL_NV_texgen_reflection 1
+#define GL_NORMAL_MAP_NV 0x8511
+#define GL_REFLECTION_MAP_NV 0x8512
+#endif
+
+/* GL_NV_texture_env_combine4 */
+#ifndef GL_NV_texture_env_combine4
+#define GL_NV_texture_env_combine4 1
+#define GL_COMBINE4_NV 0x8503
+#define GL_SOURCE3_RGB_NV 0x8583
+#define GL_SOURCE3_ALPHA_NV 0x858b
+#define GL_OPERAND3_RGB_NV 0x8593
+#define GL_OPERAND3_ALPHA_NV 0x859b
+#endif
+
/* GL_NV_texture_shader */
#ifndef GL_NV_texture_shader
#define GL_NV_texture_shader 1
-#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C
-#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D
-#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E
-#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9
-#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA
-#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB
-#define GL_DSDT_MAG_INTENSITY_NV 0x86DC
-#define GL_SHADER_CONSISTENT_NV 0x86DD
-#define GL_TEXTURE_SHADER_NV 0x86DE
-#define GL_SHADER_OPERATION_NV 0x86DF
-#define GL_CULL_MODES_NV 0x86E0
-#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1
-#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2
-#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3
-#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV
-#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV
-#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV
-#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4
-#define GL_CONST_EYE_NV 0x86E5
-#define GL_PASS_THROUGH_NV 0x86E6
-#define GL_CULL_FRAGMENT_NV 0x86E7
-#define GL_OFFSET_TEXTURE_2D_NV 0x86E8
-#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9
-#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA
-#define GL_DOT_PRODUCT_NV 0x86EC
-#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED
-#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE
-#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0
-#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1
-#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2
-#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3
-#define GL_HILO_NV 0x86F4
-#define GL_DSDT_NV 0x86F5
-#define GL_DSDT_MAG_NV 0x86F6
-#define GL_DSDT_MAG_VIB_NV 0x86F7
-#define GL_HILO16_NV 0x86F8
-#define GL_SIGNED_HILO_NV 0x86F9
-#define GL_SIGNED_HILO16_NV 0x86FA
-#define GL_SIGNED_RGBA_NV 0x86FB
-#define GL_SIGNED_RGBA8_NV 0x86FC
-#define GL_SIGNED_RGB_NV 0x86FE
-#define GL_SIGNED_RGB8_NV 0x86FF
-#define GL_SIGNED_LUMINANCE_NV 0x8701
-#define GL_SIGNED_LUMINANCE8_NV 0x8702
-#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703
-#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704
-#define GL_SIGNED_ALPHA_NV 0x8705
-#define GL_SIGNED_ALPHA8_NV 0x8706
-#define GL_SIGNED_INTENSITY_NV 0x8707
-#define GL_SIGNED_INTENSITY8_NV 0x8708
-#define GL_DSDT8_NV 0x8709
-#define GL_DSDT8_MAG8_NV 0x870A
-#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B
-#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C
-#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D
-#define GL_HI_SCALE_NV 0x870E
-#define GL_LO_SCALE_NV 0x870F
-#define GL_DS_SCALE_NV 0x8710
-#define GL_DT_SCALE_NV 0x8711
-#define GL_MAGNITUDE_SCALE_NV 0x8712
-#define GL_VIBRANCE_SCALE_NV 0x8713
-#define GL_HI_BIAS_NV 0x8714
-#define GL_LO_BIAS_NV 0x8715
-#define GL_DS_BIAS_NV 0x8716
-#define GL_DT_BIAS_NV 0x8717
-#define GL_MAGNITUDE_BIAS_NV 0x8718
-#define GL_VIBRANCE_BIAS_NV 0x8719
-#define GL_TEXTURE_BORDER_VALUES_NV 0x871A
-#define GL_TEXTURE_HI_SIZE_NV 0x871B
-#define GL_TEXTURE_LO_SIZE_NV 0x871C
-#define GL_TEXTURE_DS_SIZE_NV 0x871D
-#define GL_TEXTURE_DT_SIZE_NV 0x871E
-#define GL_TEXTURE_MAG_SIZE_NV 0x871F
+#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864c
+#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864d
+#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864e
+#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86d9
+#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86da
+#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86db
+#define GL_DSDT_MAG_INTENSITY_NV 0x86dc
+#define GL_SHADER_CONSISTENT_NV 0x86dd
+#define GL_TEXTURE_SHADER_NV 0x86de
+#define GL_SHADER_OPERATION_NV 0x86df
+#define GL_CULL_MODES_NV 0x86e0
+#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86e1
+#define GL_OFFSET_TEXTURE_SCALE_NV 0x86e2
+#define GL_OFFSET_TEXTURE_BIAS_NV 0x86e3
+#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV
+#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV
+#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV
+#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86e4
+#define GL_CONST_EYE_NV 0x86e5
+#define GL_PASS_THROUGH_NV 0x86e6
+#define GL_CULL_FRAGMENT_NV 0x86e7
+#define GL_OFFSET_TEXTURE_2D_NV 0x86e8
+#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86e9
+#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86ea
+#define GL_DOT_PRODUCT_NV 0x86ec
+#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ed
+#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86ee
+#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86f0
+#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86f1
+#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86f2
+#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86f3
+#define GL_HILO_NV 0x86f4
+#define GL_DSDT_NV 0x86f5
+#define GL_DSDT_MAG_NV 0x86f6
+#define GL_DSDT_MAG_VIB_NV 0x86f7
+#define GL_HILO16_NV 0x86f8
+#define GL_SIGNED_HILO_NV 0x86f9
+#define GL_SIGNED_HILO16_NV 0x86fa
+#define GL_SIGNED_RGBA_NV 0x86fb
+#define GL_SIGNED_RGBA8_NV 0x86fc
+#define GL_SIGNED_RGB_NV 0x86fe
+#define GL_SIGNED_RGB8_NV 0x86ff
+#define GL_SIGNED_LUMINANCE_NV 0x8701
+#define GL_SIGNED_LUMINANCE8_NV 0x8702
+#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703
+#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704
+#define GL_SIGNED_ALPHA_NV 0x8705
+#define GL_SIGNED_ALPHA8_NV 0x8706
+#define GL_SIGNED_INTENSITY_NV 0x8707
+#define GL_SIGNED_INTENSITY8_NV 0x8708
+#define GL_DSDT8_NV 0x8709
+#define GL_DSDT8_MAG8_NV 0x870a
+#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870b
+#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870c
+#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870d
+#define GL_HI_SCALE_NV 0x870e
+#define GL_LO_SCALE_NV 0x870f
+#define GL_DS_SCALE_NV 0x8710
+#define GL_DT_SCALE_NV 0x8711
+#define GL_MAGNITUDE_SCALE_NV 0x8712
+#define GL_VIBRANCE_SCALE_NV 0x8713
+#define GL_HI_BIAS_NV 0x8714
+#define GL_LO_BIAS_NV 0x8715
+#define GL_DS_BIAS_NV 0x8716
+#define GL_DT_BIAS_NV 0x8717
+#define GL_MAGNITUDE_BIAS_NV 0x8718
+#define GL_VIBRANCE_BIAS_NV 0x8719
+#define GL_TEXTURE_BORDER_VALUES_NV 0x871a
+#define GL_TEXTURE_HI_SIZE_NV 0x871b
+#define GL_TEXTURE_LO_SIZE_NV 0x871c
+#define GL_TEXTURE_DS_SIZE_NV 0x871d
+#define GL_TEXTURE_DT_SIZE_NV 0x871e
+#define GL_TEXTURE_MAG_SIZE_NV 0x871f
#endif
+
/* GL_NV_texture_shader2 */
#ifndef GL_NV_texture_shader2
#define GL_NV_texture_shader2 1
-#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF
-#endif
-/* GL_NV_texture_shader3 */
-#ifndef GL_NV_texture_shader3
-#define GL_NV_texture_shader3 1
-#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850
-#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851
-#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852
-#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853
-#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854
-#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855
-#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856
-#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857
-#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858
-#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859
-#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A
-#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B
-#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C
-#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D
-#define GL_HILO8_NV 0x885E
-#define GL_SIGNED_HILO8_NV 0x885F
-#define GL_FORCE_BLUE_TO_ONE_NV 0x8860
-#endif
-/* GL_ATI_texture_env_combine3 */
-#ifndef GL_ATI_texture_env_combine3
-#define GL_ATI_texture_env_combine3 1
-#define GL_MODULATE_ADD_ATI 0x8744
-#define GL_MODULATE_SIGNED_ADD_ATI 0x8745
-#define GL_MODULATE_SUBTRACT_ATI 0x8746
-/* #define ONE */
-/* #define ZERO */
-#endif
-
-/**
- * Point sprites
- */
-/* GL_ARB_point_sprite */
-#ifndef GL_ARB_point_sprite
-#define GL_ARB_point_sprite 1
-#define GL_POINT_SPRITE_ARB 0x8861
-#define GL_COORD_REPLACE_ARB 0x8862
-#endif
-/**
- * @TODO: GL_NV_point_sprite
- */
-
-/**
- * Occlusion Queries
- */
-/* GL_ARB_occlusion_query */
-#ifndef GL_ARB_occlusion_query
-#define GL_ARB_occlusion_query 1
-#define GL_SAMPLES_PASSED_ARB 0x8914
-#define GL_QUERY_COUNTER_BITS_ARB 0x8864
-#define GL_CURRENT_QUERY_ARB 0x8865
-#define GL_QUERY_RESULT_ARB 0x8866
-#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867
-#endif
-typedef void (WINE_GLAPI * PGLFNGENQUERIESARBPROC) (GLsizei n, GLuint *queries);
-typedef void (WINE_GLAPI * PGLFNDELETEQUERIESARBPROC) (GLsizei n, const GLuint *queries);
-typedef GLboolean (WINE_GLAPI * PGLFNISQUERYARBPROC) (GLuint query);
-typedef void (WINE_GLAPI * PGLFNBEGINQUERYARBPROC) (GLenum target, GLuint query);
-typedef void (WINE_GLAPI * PGLFNENDQUERYARBPROC) (GLenum target);
-typedef void (WINE_GLAPI * PGLFNGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETQUERYOBJECTIVARBPROC) (GLuint query, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETQUERYOBJECTUIVARBPROC) (GLuint query, GLenum pname, GLuint *params);
-/* GL_HP_occlusion_test isn't complete, but it's constants are used by GL_NV_occlusion_query */
-#ifndef GL_HP_occlusion_test
-#define GL_HP_occlusion_test 1
-#define GL_OCCLUSION_TEST_HP 0x8165
-#define GL_OCCLUSION_TEST_RESULT_HP 0x8165
-#endif
-/* GL_NV_occlusion_query */
-#ifndef GL_NV_occlusion_query
-#define GL_NV_occlusion_query 1
-#define GL_PIXEL_COUNTER_BITS_NV 0x8864
-#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865
-#define GL_PIXEL_COUNT_NV 0x8866
-#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867
-#endif
-typedef void (WINE_GLAPI * PGLFNGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids);
-typedef void (WINE_GLAPI * PGLFNDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids);
-typedef GLboolean (WINE_GLAPI * PGLFNISOCCLUSIONQUERYNVPROC) (GLuint id);
-typedef void (WINE_GLAPI * PGLFNBEGINOCCLUSIONQUERYNVPROC) (GLuint id);
-typedef void (WINE_GLAPI * PGLFNENDOCCLUSIONQUERYNVPROC) (void);
-typedef void (WINE_GLAPI * PGLFNGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params);
-/* GL_EXT_stencil_two_side */
-#ifndef GL_EXT_stencil_two_side
-#define GL_EXT_stencil_two_side 1
-#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910
-#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911
-#endif
-typedef void (WINE_GLAPI * PGLFNACTIVESTENCILFACEEXTPROC) (GLenum face);
-/* GL_ATI_separate_stencil */
-#ifndef GL_ATI_separate_stencil
-#define GL_ATI_separate_stencil 1
-#define GL_STENCIL_BACK_FUNC_ATI 0x8800
-#define GL_STENCIL_BACK_FAIL_ATI 0x8801
-#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802
-#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803
-#endif
-typedef void (WINE_GLAPI * PGLFNSTENCILOPSEPARATEATIPROC) (GLenum, GLenum, GLenum, GLenum);
-typedef void (WINE_GLAPI * PGLFNSTENCILFUNCSEPARATEATIPROC) (GLenum, GLenum, GLint, GLuint);
-/* GL_NV_fence */
-#ifndef GL_NV_fence
-#define GL_NV_fence 1
-#define GL_ALL_COMPLETED_NV 0x84F2
-#define GL_FENCE_STATUS_NV 0x84F3
-#define GL_FENCE_CONDITION_NV 0x84F4
-#endif
-typedef void (WINE_GLAPI * PGLFNGENFENCESNVPROC) (GLsizei, GLuint *);
-typedef void (WINE_GLAPI * PGLFNDELETEFENCESNVPROC) (GLuint, const GLuint *);
-typedef void (WINE_GLAPI * PGLFNSETFENCENVPROC) (GLuint, GLenum);
-typedef GLboolean (WINE_GLAPI * PGLFNTESTFENCENVPROC) (GLuint);
-typedef void (WINE_GLAPI * PGLFNFINISHFENCENVPROC) (GLuint);
-typedef GLboolean (WINE_GLAPI * PGLFNISFENCENVPROC) (GLuint);
-typedef void (WINE_GLAPI * PGLFNGETFENCEIVNVPROC) (GLuint, GLenum, GLint *);
-/* GL_APPLE_fence */
-#ifndef GL_APPLE_fence
-#define GL_APPLE_fence 1
-#define GL_DRAW_PIXELS_APPLE 0x8A0A
-#define GL_FENCE_APPLE 0x8A0B
-#endif
-typedef void (WINE_GLAPI * PGLFNGENFENCESAPPLEPROC) (GLsizei, GLuint *);
-typedef void (WINE_GLAPI * PGLFNDELETEFENCESAPPLEPROC) (GLuint, const GLuint *);
-typedef void (WINE_GLAPI * PGLFNSETFENCEAPPLEPROC) (GLuint);
-typedef GLboolean (WINE_GLAPI * PGLFNTESTFENCEAPPLEPROC) (GLuint);
-typedef void (WINE_GLAPI * PGLFNFINISHFENCEAPPLEPROC) (GLuint);
-typedef GLboolean (WINE_GLAPI * PGLFNISFENCEAPPLEPROC) (GLuint);
-typedef GLboolean (WINE_GLAPI * PGLFNTESTOBJECTAPPLEPROC) (GLenum, GLuint);
-typedef void (WINE_GLAPI * PGLFNFINISHOBJECTAPPLEPROC) (GLenum, GLuint);
-/* GL_APPLE_client_storage */
-#ifndef GL_APPLE_client_storage
-#define GL_APPLE_client_storage 1
-#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2
-#endif
-/* GLX_SGI_video_sync */
-typedef int (WINE_GLAPI * PGLXFNGETVIDEOSYNCSGIPROC) (unsigned int *);
-typedef int (WINE_GLAPI * PGLXFNWAITVIDEOSYNCSGIPROC) (int, int, unsigned int *);
-
-/* GL_SGIS_generate_mipmap */
-#ifndef GLX_SGIS_generate_mipmap
-#define GL_GENERATE_MIPMAP_SGIS 0x8191
-#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192
-#define GLX_SGIS_generate_mipmap
-#endif
-
-/* GL_NV_depth_clamp */
-#ifndef GL_NV_depth_clamp
-#define GL_DEPTH_CLAMP_NV 0x864F
-#endif
-
-/* GL_APPLE_flush_render */
-typedef void (WINE_GLAPI * PGLFNFLUSHRENDERAPPLEPROC) (void);
-typedef void (WINE_GLAPI * PGLFNFINISHRENDERAPPLEPROC) (void);
-
-/* GL_APPLE_ycbcr_422 */
-#ifndef GL_APPLE_ycbcr_422
-#define GL_APPLE_ycbcr_422
-#define GL_YCBCR_422_APPLE 0x85B9
-#define UNSIGNED_SHORT_8_8_APPLE 0x85BA
-#define UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB
-#endif
-
-/* GL_ARB_texture_rectangle */
-#ifndef GL_ARB_texture_rectangle
-#define GL_ARB_texture_rectangle
-#define GL_TEXTURE_RECTANGLE_ARB 0x84F5
-#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6
-#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7
-#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8
-#define GL_SAMPLER_2D_RECT_ARB 0x8B63
-#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64
-#endif
-
-/* GL_APPLE_float_pixels */
-#ifndef GL_APPLE_float_pixels
-#define GL_APPLE_float_pixels
-#define GL_HALF_APPLE 0x140B
-#define GL_COLOR_FLOAT_APPLE 0x8A0F
-#define GL_RGBA_FLOAT32_APPLE 0x8814
-#define GL_RGB_FLOAT32_APPLE 0x8815
-#define GL_ALPHA_FLOAT32_APPLE 0x8816
-#define GL_INTENSITY_FLOAT32_APPLE 0x8817
-#define GL_LUMINANCE_FLOAT32_APPLE 0x8818
-#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819
-#define GL_RGBA_FLOAT16_APPLE 0x881A
-#define GL_RGB_FLOAT16_APPLE 0x881B
-#define GL_ALPHA_FLOAT16_APPLE 0x881C
-#define GL_INTENSITY_FLOAT16_APPLE 0x881D
-#define GL_LUMINANCE_FLOAT16_APPLE 0x881E
-#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F
-#endif
-
-/* GL_EXT_gpu_program_parameters */
-#ifndef GL_EXT_gpu_program_parameters
-#define GL_EXT_gpu_program_parameters
-typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const float *params);
-typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const float *params);
-#endif
-
-/* GL_NV_light_max_exponent */
-#ifndef GL_NV_light_max_exponent
-#define GL_NV_light_max_exponent
-#define GL_MAX_SHININESS_NV 0x8504
-#define GL_MAX_SPOT_EXPONENT_NV 0x8505
-#endif
-
-/* GL_ATI_fragment_shader */
-#ifndef GL_ATI_fragment_shader
-#define GL_ATI_fragment_shader
-typedef GLuint (WINE_GLAPI *PGLFNGENFRAGMENTSHADERSATI) (GLuint range);
-typedef void (WINE_GLAPI *PGLFNBINDFRAGMENTSHADERATI) (GLuint id);
-typedef void (WINE_GLAPI *PGLFNDELETEFRAGMENTSHADERATI) (GLuint id);
-typedef void (WINE_GLAPI *PGLFNBEGINFRAGMENTSHADERATI) (void);
-typedef void (WINE_GLAPI *PGLFNENDFRAGMENTSHADERATI) (void);
-typedef void (WINE_GLAPI *PGLFNPASSTEXCOORDATI) (GLuint dst, GLuint coord, GLenum swizzle);
-typedef void (WINE_GLAPI *PGLFNSAMPLEMAPATI) (GLuint dst, GLuint interp, GLenum swizzle);
-typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP1ATI) (GLenum op, GLuint dst, GLuint dstMask,
- GLuint dstMod, GLuint arg1, GLuint arg1Rep,
- GLuint arg1Mod);
-typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP2ATI) (GLenum op, GLuint dst, GLuint dstMask,
- GLuint dstMod, GLuint arg1, GLuint arg1Rep,
- GLuint arg1Mod, GLuint arg2, GLuint arg2Rep,
- GLuint arg2Mod);
-typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP3ATI) (GLenum 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);
-typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP1ATI) (GLenum op, GLuint dst, GLuint dstMod,
- GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
-typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP2ATI) (GLenum op, GLuint dst, GLuint dstMod,
- GLuint arg1, GLuint arg1Rep, GLuint arg1Mod,
- GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
-typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP3ATI) (GLenum op, GLuint dst, GLuint dstMod,
- GLuint arg1, GLuint arg1Rep, GLuint arg1Mod,
- GLuint arg2, GLuint arg2Rep, GLuint arg2Mod,
- GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);
-typedef void (WINE_GLAPI *PGLFNSETFRAGMENTSHADERCONSTANTATI) (GLuint dst, const GLfloat *value);
-#define GL_FRAGMENT_SHADER_ATI 0x8920
-#define GL_REG_0_ATI 0x8921
-#define GL_REG_1_ATI 0x8922
-#define GL_REG_2_ATI 0x8923
-#define GL_REG_3_ATI 0x8924
-#define GL_REG_4_ATI 0x8925
-#define GL_REG_5_ATI 0x8926
-#define GL_CON_0_ATI 0x8941
-#define GL_CON_1_ATI 0x8942
-#define GL_CON_2_ATI 0x8943
-#define GL_CON_3_ATI 0x8944
-#define GL_CON_4_ATI 0x8945
-#define GL_CON_5_ATI 0x8946
-#define GL_CON_6_ATI 0x8947
-#define GL_CON_7_ATI 0x8948
-#define GL_MOV_ATI 0x8961
-#define GL_ADD_ATI 0x8963
-#define GL_MUL_ATI 0x8964
-#define GL_SUB_ATI 0x8965
-#define GL_DOT3_ATI 0x8966
-#define GL_DOT4_ATI 0x8967
-#define GL_MAD_ATI 0x8968
-#define GL_LERP_ATI 0x8969
-#define GL_CND_ATI 0x896A
-#define GL_CND0_ATI 0x896B
-#define GL_DOT2_ADD_ATI 0x896C
-#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D
-#define GL_SWIZZLE_STR_ATI 0x8976
-#define GL_SWIZZLE_STQ_ATI 0x8977
-#define GL_SWIZZLE_STR_DR_ATI 0x8978
-#define GL_SWIZZLE_STQ_DQ_ATI 0x8979
-#define GL_RED_BIT_ATI 0x00000001
-#define GL_GREEN_BIT_ATI 0x00000002
-#define GL_BLUE_BIT_ATI 0x00000004
-#define GL_2X_BIT_ATI 0x00000001
-#define GL_4X_BIT_ATI 0x00000002
-#define GL_8X_BIT_ATI 0x00000004
-#define GL_HALF_BIT_ATI 0x00000008
-#define GL_QUARTER_BIT_ATI 0x00000010
-#define GL_EIGHTH_BIT_ATI 0x00000020
-#define GL_SATURATE_BIT_ATI 0x00000040
-#define GL_2X_BIT_ATI 0x00000001
-#define GL_COMP_BIT_ATI 0x00000002
-#define GL_NEGATE_BIT_ATI 0x00000004
-#define GL_BIAS_BIT_ATI 0x00000008
-#endif
-/* GL_ATI_texture_compression_3dc */
-#ifndef GL_ATI_texture_compression_3dc
-#define GL_ATI_texture_compression_3dc
-#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837
-#endif
-/* GL_EXT_texture_compression_rgtc */
-#ifndef GL_EXT_texture_compression_rgtc
-#define GL_EXT_texture_compression_rgtc
-#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB
-#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC
-#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD
-#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE
+#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86ef
#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
+#define GL_NV_vertex_program2_option 1
+#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88f4
+#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88f5
#endif
-/* GL_APPLE_flush_buffer_range */
-#ifndef GL_APPLE_flush_buffer_range
-#define GL_APPLE_flush_buffer_range
-#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12
-#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13
-typedef void (WINE_GLAPI *PGLFNBUFFERPARAMETERIAPPLE) (GLenum target, GLenum pname, GLint param);
-typedef void (WINE_GLAPI *PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE) (GLenum target, GLintptr offset, GLsizeiptr size);
+/* GL_SGIS_generate_mipmap */
+#ifndef GLX_SGIS_generate_mipmap
+#define GLX_SGIS_generate_mipmap 1
+#define GL_GENERATE_MIPMAP_SGIS 0x8191
+#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192
#endif
-/* GL_VERSION_2_0 */
-#ifndef GL_VERSION_2_0
-#define GL_VERSION_2_0 1
-#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION
-#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
-#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
-#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
-#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
-#define GL_CURRENT_VERTEX_ATTRIB 0x8626
-#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642
-#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643
-#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
-#define GL_STENCIL_BACK_FUNC 0x8800
-#define GL_STENCIL_BACK_FAIL 0x8801
-#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
-#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
-#define GL_MAX_DRAW_BUFFERS 0x8824
-#define GL_DRAW_BUFFER0 0x8825
-#define GL_DRAW_BUFFER1 0x8826
-#define GL_DRAW_BUFFER2 0x8827
-#define GL_DRAW_BUFFER3 0x8828
-#define GL_DRAW_BUFFER4 0x8829
-#define GL_DRAW_BUFFER5 0x882A
-#define GL_DRAW_BUFFER6 0x882B
-#define GL_DRAW_BUFFER7 0x882C
-#define GL_DRAW_BUFFER8 0x882D
-#define GL_DRAW_BUFFER9 0x882E
-#define GL_DRAW_BUFFER10 0x882F
-#define GL_DRAW_BUFFER11 0x8830
-#define GL_DRAW_BUFFER12 0x8831
-#define GL_DRAW_BUFFER13 0x8832
-#define GL_DRAW_BUFFER14 0x8833
-#define GL_DRAW_BUFFER15 0x8834
-#define GL_BLEND_EQUATION_ALPHA 0x883D
-#define GL_POINT_SPRITE 0x8861
-#define GL_COORD_REPLACE 0x8862
-#define GL_MAX_VERTEX_ATTRIBS 0x8869
-#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
-#define GL_MAX_TEXTURE_COORDS 0x8871
-#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
-#define GL_FRAGMENT_SHADER 0x8B30
-#define GL_VERTEX_SHADER 0x8B31
-#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
-#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A
-#define GL_MAX_VARYING_FLOATS 0x8B4B
-#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
-#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
-#define GL_SHADER_TYPE 0x8B4F
-#define GL_FLOAT_VEC2 0x8B50
-#define GL_FLOAT_VEC3 0x8B51
-#define GL_FLOAT_VEC4 0x8B52
-#define GL_INT_VEC2 0x8B53
-#define GL_INT_VEC3 0x8B54
-#define GL_INT_VEC4 0x8B55
-#define GL_BOOL 0x8B56
-#define GL_BOOL_VEC2 0x8B57
-#define GL_BOOL_VEC3 0x8B58
-#define GL_BOOL_VEC4 0x8B59
-#define GL_FLOAT_MAT2 0x8B5A
-#define GL_FLOAT_MAT3 0x8B5B
-#define GL_FLOAT_MAT4 0x8B5C
-#define GL_SAMPLER_1D 0x8B5D
-#define GL_SAMPLER_2D 0x8B5E
-#define GL_SAMPLER_3D 0x8B5F
-#define GL_SAMPLER_CUBE 0x8B60
-#define GL_SAMPLER_1D_SHADOW 0x8B61
-#define GL_SAMPLER_2D_SHADOW 0x8B62
-#define GL_DELETE_STATUS 0x8B80
-#define GL_COMPILE_STATUS 0x8B81
-#define GL_LINK_STATUS 0x8B82
-#define GL_VALIDATE_STATUS 0x8B83
-#define GL_INFO_LOG_LENGTH 0x8B84
-#define GL_ATTACHED_SHADERS 0x8B85
-#define GL_ACTIVE_UNIFORMS 0x8B86
-#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
-#define GL_SHADER_SOURCE_LENGTH 0x8B88
-#define GL_ACTIVE_ATTRIBUTES 0x8B89
-#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
-#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
-#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
-#define GL_CURRENT_PROGRAM 0x8B8D
-#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0
-#define GL_LOWER_LEFT 0x8CA1
-#define GL_UPPER_LEFT 0x8CA2
-#define GL_STENCIL_BACK_REF 0x8CA3
-#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
-#define GL_STENCIL_BACK_WRITEMASK 0x8CA5
-typedef char GLchar;
-#endif
-typedef void (WINE_GLAPI * PGLFNBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
-typedef void (WINE_GLAPI * PGLFNDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs);
-typedef void (WINE_GLAPI * PGLFNSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
-typedef void (WINE_GLAPI * PGLFNSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
-typedef void (WINE_GLAPI * PGLFNSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);
-typedef void (WINE_GLAPI * PGLFNATTACHSHADERPROC) (GLuint program, GLuint shader);
-typedef void (WINE_GLAPI * PGLFNBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);
-typedef void (WINE_GLAPI * PGLFNCOMPILESHADERPROC) (GLuint shader);
-typedef GLuint (WINE_GLAPI * PGLFNCREATEPROGRAMPROC) (void);
-typedef GLuint (WINE_GLAPI * PGLFNCREATESHADERPROC) (GLenum type);
-typedef void (WINE_GLAPI * PGLFNDELETEPROGRAMPROC) (GLuint program);
-typedef void (WINE_GLAPI * PGLFNDELETESHADERPROC) (GLuint shader);
-typedef void (WINE_GLAPI * PGLFNDETACHSHADERPROC) (GLuint program, GLuint shader);
-typedef void (WINE_GLAPI * PGLFNDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
-typedef void (WINE_GLAPI * PGLFNENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
-typedef void (WINE_GLAPI * PGLFNGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
-typedef void (WINE_GLAPI * PGLFNGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
-typedef void (WINE_GLAPI * PGLFNGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
-typedef GLint (WINE_GLAPI * PGLFNGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-typedef void (WINE_GLAPI * PGLFNGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-typedef void (WINE_GLAPI * PGLFNGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
-typedef GLint (WINE_GLAPI * PGLFNGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
-typedef void (WINE_GLAPI * PGLFNGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer);
-typedef GLboolean (WINE_GLAPI * PGLFNISPROGRAMPROC) (GLuint program);
-typedef GLboolean (WINE_GLAPI * PGLFNISSHADERPROC) (GLuint shader);
-typedef void (WINE_GLAPI * PGLFNLINKPROGRAMPROC) (GLuint program);
-typedef void (WINE_GLAPI * PGLFNSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length);
-typedef void (WINE_GLAPI * PGLFNUSEPROGRAMPROC) (GLuint program);
-typedef void (WINE_GLAPI * PGLFNUNIFORM1FPROC) (GLint location, GLfloat v0);
-typedef void (WINE_GLAPI * PGLFNUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
-typedef void (WINE_GLAPI * PGLFNUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-typedef void (WINE_GLAPI * PGLFNUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-typedef void (WINE_GLAPI * PGLFNUNIFORM1IPROC) (GLint location, GLint v0);
-typedef void (WINE_GLAPI * PGLFNUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
-typedef void (WINE_GLAPI * PGLFNUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
-typedef void (WINE_GLAPI * PGLFNUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-typedef void (WINE_GLAPI * PGLFNUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNVALIDATEPROGRAMPROC) (GLuint program);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DPROC) (GLuint index, GLdouble x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SPROC) (GLuint index, GLshort x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
-
-
-/****************************************************
- * OpenGL Official Version
- * defines
- ****************************************************/
-/* GL_VERSION_1_3 */
-#if !defined(GL_DOT3_RGBA)
-# define GL_DOT3_RGBA 0x8741
-#endif
-#if !defined(GL_SUBTRACT)
-# define GL_SUBTRACT 0x84E7
-#endif
-
-
-/****************************************************
- * Enumerated types
- ****************************************************/
-#define WINE_DEFAULT_VIDMEM 64*1024*1024
-
-#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,
- ARB_FRAMEBUFFER_OBJECT,
- ARB_GEOMETRY_SHADER4,
- ARB_IMAGING,
- ARB_MULTISAMPLE,
- ARB_MULTITEXTURE,
- ARB_OCCLUSION_QUERY,
- ARB_POINT_PARAMETERS,
- ARB_PROVOKING_VERTEX,
- ARB_PIXEL_BUFFER_OBJECT,
- ARB_POINT_SPRITE,
- ARB_TEXTURE_COMPRESSION,
- ARB_TEXTURE_CUBE_MAP,
- ARB_TEXTURE_ENV_ADD,
- ARB_TEXTURE_ENV_COMBINE,
- ARB_TEXTURE_ENV_DOT3,
- ARB_TEXTURE_FLOAT,
- ARB_HALF_FLOAT_PIXEL,
- ARB_TEXTURE_BORDER_CLAMP,
- ARB_TEXTURE_MIRRORED_REPEAT,
- ARB_TEXTURE_NON_POWER_OF_TWO,
- ARB_TEXTURE_RECTANGLE,
- ARB_TEXTURE_RG,
- ARB_VERTEX_PROGRAM,
- ARB_VERTEX_BLEND,
- ARB_VERTEX_BUFFER_OBJECT,
- ARB_VERTEX_SHADER,
- ARB_SHADER_OBJECTS,
- ARB_SHADER_TEXTURE_LOD,
- ARB_HALF_FLOAT_VERTEX,
- /* EXT */
- EXT_BLEND_COLOR,
- EXT_BLEND_MINMAX,
- EXT_BLEND_EQUATION_SEPARATE,
- EXT_BLEND_FUNC_SEPARATE,
- EXT_FOG_COORD,
- 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,
- EXT_TEXTURE3D,
- EXT_TEXTURE_COMPRESSION_S3TC,
- EXT_TEXTURE_COMPRESSION_RGTC,
- EXT_TEXTURE_FILTER_ANISOTROPIC,
- EXT_TEXTURE_LOD,
- EXT_TEXTURE_LOD_BIAS,
- EXT_TEXTURE_ENV_ADD,
- EXT_TEXTURE_ENV_COMBINE,
- EXT_TEXTURE_ENV_DOT3,
- EXT_TEXTURE_SRGB,
- EXT_TEXTURE_SWIZZLE,
- EXT_GPU_PROGRAM_PARAMETERS,
- EXT_VERTEX_ARRAY_BGRA,
- /* NVIDIA */
- NV_HALF_FLOAT,
- NV_FOG_DISTANCE,
- NV_FRAGMENT_PROGRAM,
- NV_FRAGMENT_PROGRAM2,
- NV_OCCLUSION_QUERY,
- NV_REGISTER_COMBINERS,
- NV_REGISTER_COMBINERS2,
- NV_TEXGEN_REFLECTION,
- NV_TEXTURE_ENV_COMBINE4,
- NV_TEXTURE_SHADER,
- NV_TEXTURE_SHADER2,
- NV_TEXTURE_SHADER3,
- 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,
- /* ATI */
- ATI_SEPARATE_STENCIL,
- ATI_TEXTURE_ENV_COMBINE3,
- ATI_TEXTURE_MIRROR_ONCE,
- EXT_VERTEX_SHADER,
- ATI_FRAGMENT_SHADER,
- ATI_TEXTURE_COMPRESSION_3DC,
- /* APPLE */
- APPLE_FENCE,
- APPLE_CLIENT_STORAGE,
- APPLE_FLUSH_RENDER,
- APPLE_YCBCR_422,
- APPLE_FLOAT_PIXELS,
- APPLE_FLUSH_BUFFER_RANGE,
- /* SGI */
- SGI_VIDEO_SYNC,
- SGIS_GENERATE_MIPMAP,
-
- /* Internally used */
- WINE_NORMALIZED_TEXRECT,
-
- /* WGL extensions */
- WGL_ARB_PBUFFER,
- WGL_ARB_PIXEL_FORMAT,
- WGL_WINE_PIXEL_FORMAT_PASSTHROUGH,
-
- WINED3D_GL_EXT_COUNT,
-} GL_SupportedExt;
-
-
-/****************************************************
- * #Defines
- ****************************************************/
-#define GL_EXT_FUNCS_GEN \
- /** ARB Extensions **/ \
- /* GL_ARB_color_buffer_float */ \
- USE_GL_FUNC(PGLFNCLAMPCOLORARBPROC, glClampColorARB, ARB_COLOR_BUFFER_FLOAT, NULL )\
- /* GL_ARB_draw_buffers */ \
- USE_GL_FUNC(PGLFNDRAWBUFFERSARBPROC, glDrawBuffersARB, ARB_DRAW_BUFFERS, NULL )\
- /* GL_ARB_framebuffer_object */ \
- USE_GL_FUNC(PGLFNGLISRENDERBUFFERPROC, glIsRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVPROC, glGetRenderbufferParameteriv, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLISFRAMEBUFFERPROC, glIsFramebuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DPROC, glFramebufferTexture1D, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DPROC, glFramebufferTexture3D, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURELAYERPROC, glFramebufferTextureLayer, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC, glGetFramebufferAttachmentParameteriv, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLGENERATEMIPMAPPROC, glGenerateMipmap, ARB_FRAMEBUFFER_OBJECT, NULL )\
- /* GL_ARB_geometry_shader4 */ \
- USE_GL_FUNC(PGLFNPROGRAMPARAMETERIARBPROC, glProgramParameteriARB, ARB_GEOMETRY_SHADER4, NULL ) \
- USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREARBPROC, glFramebufferTextureARB, ARB_GEOMETRY_SHADER4, NULL ) \
- USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTURELAYERARBPROC, glFramebufferTextureLayerARB, ARB_GEOMETRY_SHADER4, NULL ) \
- USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREFACEARBPROC, glFramebufferTextureFaceARB, ARB_GEOMETRY_SHADER4, NULL ) \
- /* GL_ARB_imaging, GL_EXT_blend_minmax */ \
- USE_GL_FUNC(PGLFNBLENDCOLORPROC, glBlendColorEXT, EXT_BLEND_COLOR, NULL )\
- USE_GL_FUNC(PGLFNBLENDEQUATIONPROC, glBlendEquationEXT, EXT_BLEND_MINMAX, NULL )\
- /* GL_ARB_multisample */ \
- USE_GL_FUNC(WINED3D_PFNGLSAMPLECOVERAGEARBPROC, glSampleCoverageARB, ARB_MULTISAMPLE, NULL )\
- /* GL_ARB_multitexture */ \
- USE_GL_FUNC(WINED3D_PFNGLACTIVETEXTUREARBPROC, glActiveTextureARB, ARB_MULTITEXTURE, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC, glClientActiveTextureARB, ARB_MULTITEXTURE, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FARBPROC, glMultiTexCoord1fARB, ARB_MULTITEXTURE, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FVARBPROC, glMultiTexCoord1fvARB, ARB_MULTITEXTURE, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FARBPROC, glMultiTexCoord2fARB, ARB_MULTITEXTURE, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FVARBPROC, glMultiTexCoord2fvARB, ARB_MULTITEXTURE, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FARBPROC, glMultiTexCoord3fARB, ARB_MULTITEXTURE, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FVARBPROC, glMultiTexCoord3fvARB, ARB_MULTITEXTURE, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FARBPROC, glMultiTexCoord4fARB, ARB_MULTITEXTURE, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FVARBPROC, glMultiTexCoord4fvARB, ARB_MULTITEXTURE, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2SVARBPROC, glMultiTexCoord2svARB, ARB_MULTITEXTURE, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4SVARBPROC, glMultiTexCoord4svARB, ARB_MULTITEXTURE, NULL )\
- /* GL_ARB_occlusion_query */ \
- USE_GL_FUNC(PGLFNGENQUERIESARBPROC, glGenQueriesARB, ARB_OCCLUSION_QUERY, NULL )\
- USE_GL_FUNC(PGLFNDELETEQUERIESARBPROC, glDeleteQueriesARB, ARB_OCCLUSION_QUERY, NULL )\
- USE_GL_FUNC(PGLFNBEGINQUERYARBPROC, glBeginQueryARB, ARB_OCCLUSION_QUERY, NULL )\
- USE_GL_FUNC(PGLFNENDQUERYARBPROC, glEndQueryARB, ARB_OCCLUSION_QUERY, NULL )\
- USE_GL_FUNC(PGLFNGETQUERYOBJECTIVARBPROC, glGetQueryObjectivARB, ARB_OCCLUSION_QUERY, NULL )\
- USE_GL_FUNC(PGLFNGETQUERYOBJECTUIVARBPROC, glGetQueryObjectuivARB, ARB_OCCLUSION_QUERY, NULL )\
- /* GL_ARB_point_parameters */ \
- USE_GL_FUNC(PGLFNGLPOINTPARAMETERFARBPROC, glPointParameterfARB, ARB_POINT_PARAMETERS, NULL )\
- USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVARBPROC, glPointParameterfvARB, ARB_POINT_PARAMETERS, NULL )\
- /* GL_ARB_provoking_vertex */ \
- USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXPROC, glProvokingVertex, ARB_PROVOKING_VERTEX, NULL)\
- /* GL_ARB_texture_compression */ \
- USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE2DPROC, glCompressedTexImage2DARB, ARB_TEXTURE_COMPRESSION,NULL )\
- USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE3DPROC, glCompressedTexImage3DARB, ARB_TEXTURE_COMPRESSION,NULL )\
- USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC, glCompressedTexSubImage2DARB, ARB_TEXTURE_COMPRESSION,NULL )\
- USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC, glCompressedTexSubImage3DARB, ARB_TEXTURE_COMPRESSION,NULL )\
- USE_GL_FUNC(PGLFNGETCOMPRESSEDTEXIMAGEPROC, glGetCompressedTexImageARB, ARB_TEXTURE_COMPRESSION,NULL )\
- /* GL_ARB_vertex_blend */ \
- USE_GL_FUNC(PGLFNGLWEIGHTPOINTERARB, glWeightPointerARB, ARB_VERTEX_BLEND, NULL )\
- USE_GL_FUNC(PGLFNGLWEIGHTBV, glWeightbvARB, ARB_VERTEX_BLEND, NULL )\
- USE_GL_FUNC(PGLFNGLWEIGHTSV, glWeightsvARB, ARB_VERTEX_BLEND, NULL )\
- USE_GL_FUNC(PGLFNGLWEIGHTIV, glWeightivARB, ARB_VERTEX_BLEND, NULL )\
- USE_GL_FUNC(PGLFNGLWEIGHTFV, glWeightfvARB, ARB_VERTEX_BLEND, NULL )\
- USE_GL_FUNC(PGLFNGLWEIGHTDV, glWeightdvARB, ARB_VERTEX_BLEND, NULL )\
- USE_GL_FUNC(PGLFNGLWEIGHTUBV, glWeightubvARB, ARB_VERTEX_BLEND, NULL )\
- USE_GL_FUNC(PGLFNGLWEIGHTUSV, glWeightusvARB, ARB_VERTEX_BLEND, NULL )\
- USE_GL_FUNC(PGLFNGLWEIGHTUIV, glWeightuivARB, ARB_VERTEX_BLEND, NULL )\
- USE_GL_FUNC(PGLFNGLVERTEXBLENDARB, glVertexBlendARB, ARB_VERTEX_BLEND, NULL )\
- /* GL_ARB_vertex_buffer_object */ \
- USE_GL_FUNC(PGLFNBINDBUFFERARBPROC, glBindBufferARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\
- USE_GL_FUNC(PGLFNDELETEBUFFERSARBPROC, glDeleteBuffersARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\
- USE_GL_FUNC(PGLFNGENBUFFERSARBPROC, glGenBuffersARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\
- USE_GL_FUNC(PGLFNISBUFFERARBPROC, glIsBufferARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\
- USE_GL_FUNC(PGLFNBUFFERDATAARBPROC, glBufferDataARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\
- USE_GL_FUNC(PGLFNBUFFERSUBDATAARBPROC, glBufferSubDataARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\
- USE_GL_FUNC(PGLFNGETBUFFERSUBDATAARBPROC, glGetBufferSubDataARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\
- USE_GL_FUNC(PGLFNMAPBUFFERARBPROC, glMapBufferARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\
- USE_GL_FUNC(PGLFNUNMAPBUFFERARBPROC, glUnmapBufferARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\
- USE_GL_FUNC(PGLFNGETBUFFERPARAMETERIVARBPROC, glGetBufferParameterivARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\
- USE_GL_FUNC(PGLFNGETBUFFERPOINTERVARBPROC, glGetBufferPointervARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\
- /** EXT Extensions **/ \
- /* GL_EXT_blend_equation_separate */ \
- USE_GL_FUNC(PGLFNBLENDFUNCSEPARATEEXTPROC, glBlendFuncSeparateEXT, EXT_BLEND_FUNC_SEPARATE, NULL)\
- /* GL_EXT_blend_func_separate */ \
- USE_GL_FUNC(PGLFNBLENDEQUATIONSEPARATEEXTPROC, glBlendEquationSeparateEXT, EXT_BLEND_EQUATION_SEPARATE, NULL)\
- /* GL_EXT_fog_coord */ \
- USE_GL_FUNC(PGLFNGLFOGCOORDFEXTPROC, glFogCoordfEXT, EXT_FOG_COORD, NULL )\
- USE_GL_FUNC(PGLFNGLFOGCOORDFVEXTPROC, glFogCoordfvEXT, EXT_FOG_COORD, NULL )\
- USE_GL_FUNC(PGLFNGLFOGCOORDDEXTPROC, glFogCoorddEXT, EXT_FOG_COORD, NULL )\
- USE_GL_FUNC(PGLFNGLFOGCOORDDVEXTPROC, glFogCoorddvEXT, EXT_FOG_COORD, NULL )\
- USE_GL_FUNC(PGLFNGLFOGCOORDPOINTEREXTPROC, glFogCoordPointerEXT, EXT_FOG_COORD, NULL )\
- /* GL_EXT_framebuffer_object */ \
- USE_GL_FUNC(PGLFNGLISRENDERBUFFEREXTPROC, glIsRenderbufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSEXTPROC, glGenRenderbuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLISFRAMEBUFFEREXTPROC, glIsFramebufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSEXTPROC, glDeleteFramebuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSEXTPROC, glGenFramebuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC, glFramebufferTexture1DEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC, glFramebufferTexture2DEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC, glFramebufferTexture3DEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, glFramebufferRenderbufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLGENERATEMIPMAPEXTPROC, glGenerateMipmapEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC, glGetRenderbufferParameterivEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC, glGetFramebufferAttachmentParameterivEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\
- /* GL_EXT_framebuffer_blit */ \
- USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFEREXTPROC, glBlitFramebufferEXT, EXT_FRAMEBUFFER_BLIT, NULL )\
- /* GL_EXT_framebuffer_multisample */ \
- USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, glRenderbufferStorageMultisampleEXT, EXT_FRAMEBUFFER_MULTISAMPLE, NULL )\
- /* GL_EXT_paletted_texture */ \
- USE_GL_FUNC(PGLFNGLCOLORTABLEEXTPROC, glColorTableEXT, EXT_PALETTED_TEXTURE, NULL )\
- /* 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 )\
- USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FEXTPROC, glSecondaryColor3fEXT, EXT_SECONDARY_COLOR, NULL )\
- USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FVEXTPROC, glSecondaryColor3fvEXT, EXT_SECONDARY_COLOR, NULL )\
- USE_GL_FUNC(PGLFNGLSECONDARYCOLORPOINTEREXTPROC, glSecondaryColorPointerEXT, EXT_SECONDARY_COLOR, NULL )\
- /* GL_EXT_texture3D */ \
- USE_GL_FUNC(PGLFNGLTEXIMAGE3DEXTPROC, glTexImage3DEXT, EXT_TEXTURE3D, glTexImage3D)\
- USE_GL_FUNC(PGLFNGLTEXSUBIMAGE3DEXTPROC, glTexSubImage3DEXT, EXT_TEXTURE3D, glTexSubImage3D)\
- /* GL_ARB_vertex_program */ \
- USE_GL_FUNC(PGLFNGENPROGRAMSARBPROC, glGenProgramsARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNBINDPROGRAMARBPROC, glBindProgramARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNPROGRAMSTRINGARBPROC, glProgramStringARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNDELETEPROGRAMSARBPROC, glDeleteProgramsARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNPROGRAMENVPARAMETER4FVARBPROC, glProgramEnvParameter4fvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETER4FVARBPROC, glProgramLocalParameter4fvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIBPOINTERARBPROC, glVertexAttribPointerARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNENABLEVERTEXATTRIBARRAYARBPROC, glEnableVertexAttribArrayARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNDISABLEVERTEXATTRIBARRAYARBPROC, glDisableVertexAttribArrayARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB1DARBPROC, glVertexAttrib1dARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB1DVARBPROC, glVertexAttrib1dvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB1FARBPROC, glVertexAttrib1fARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB1FVARBPROC, glVertexAttrib1fvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB1SARBPROC, glVertexAttrib1sARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB1SVARBPROC, glVertexAttrib1svARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB2DARBPROC, glVertexAttrib2dARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB2DVARBPROC, glVertexAttrib2dvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB2FARBPROC, glVertexAttrib2fARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB2FVARBPROC, glVertexAttrib2fvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB2SARBPROC, glVertexAttrib2sARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB2SVARBPROC, glVertexAttrib2svARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB3DARBPROC, glVertexAttrib3dARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB3DVARBPROC, glVertexAttrib3dvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB3FARBPROC, glVertexAttrib3fARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB3FVARBPROC, glVertexAttrib3fvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB3SARBPROC, glVertexAttrib3sARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB3SVARBPROC, glVertexAttrib3svARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4NBVARBPROC, glVertexAttrib4NbvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4NIVARBPROC, glVertexAttrib4NivARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4NSVARBPROC, glVertexAttrib4NsvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBARBPROC, glVertexAttrib4NubARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBVARBPROC, glVertexAttrib4NubvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4NUIVARBPROC, glVertexAttrib4NuivARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4NUSVARBPROC, glVertexAttrib4NusvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4BVARBPROC, glVertexAttrib4bvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4DARBPROC, glVertexAttrib4dARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4DVARBPROC, glVertexAttrib4dvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4FARBPROC, glVertexAttrib4fARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4FVARBPROC, glVertexAttrib4fvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4IVARBPROC, glVertexAttrib4ivARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4SARBPROC, glVertexAttrib4sARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4SVARBPROC, glVertexAttrib4svARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4UBVARBPROC, glVertexAttrib4ubvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4UIVARBPROC, glVertexAttrib4uivARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4USVARBPROC, glVertexAttrib4usvARB, ARB_VERTEX_PROGRAM, NULL )\
- USE_GL_FUNC(PGLFNGETPROGRAMIVARBPROC, glGetProgramivARB, ARB_VERTEX_PROGRAM, NULL )\
- /* GL_ARB_shader_objects */ \
- USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC, glGetObjectParameterivARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC, glGetObjectParameterfvARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC, glGetUniformLocationARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLGETACTIVEUNIFORMARBPROC, glGetActiveUniformARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC, glUniform1iARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IARBPROC, glUniform2iARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IARBPROC, glUniform3iARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IARBPROC, glUniform4iARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC, glUniform1fARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FARBPROC, glUniform2fARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FARBPROC, glUniform3fARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FARBPROC, glUniform4fARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM1FVARBPROC, glUniform1fvARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FVARBPROC, glUniform2fvARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FVARBPROC, glUniform3fvARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FVARBPROC, glUniform4fvARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IVARBPROC, glUniform1ivARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IVARBPROC, glUniform2ivARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IVARBPROC, glUniform3ivARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IVARBPROC, glUniform4ivARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC, glUniformMatrix2fvARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC, glUniformMatrix3fvARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC, glUniformMatrix4fvARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMFVARBPROC, glGetUniformfvARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMIVARBPROC, glGetUniformivARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLGETINFOLOGARBPROC, glGetInfoLogARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC, glUseProgramObjectARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLCREATESHADEROBJECTARBPROC, glCreateShaderObjectARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLSHADERSOURCEARBPROC, glShaderSourceARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLCOMPILESHADERARBPROC, glCompileShaderARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC, glCreateProgramObjectARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLATTACHOBJECTARBPROC, glAttachObjectARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLLINKPROGRAMARBPROC, glLinkProgramARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLDETACHOBJECTARBPROC, glDetachObjectARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLDELETEOBJECTARBPROC, glDeleteObjectARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLVALIDATEPROGRAMARBPROC, glValidateProgramARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC, glGetAttachedObjectsARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLGETHANDLEARBPROC, glGetHandleARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLGETSHADERSOURCEARBPROC, glGetShaderSourceARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC, glBindAttribLocationARB, ARB_SHADER_OBJECTS, NULL )\
- USE_GL_FUNC(WINED3D_PFNGLGETATTRIBLOCATIONARBPROC, glGetAttribLocationARB, ARB_SHADER_OBJECTS, NULL )\
- /* GL_EXT_stencil_two_side */ \
- USE_GL_FUNC(PGLFNACTIVESTENCILFACEEXTPROC, glActiveStencilFaceEXT, EXT_STENCIL_TWO_SIDE, NULL )\
- /* GL_ATI_separate_stencil */ \
- USE_GL_FUNC(PGLFNSTENCILOPSEPARATEATIPROC, glStencilOpSeparateATI, ATI_SEPARATE_STENCIL, NULL )\
- USE_GL_FUNC(PGLFNSTENCILFUNCSEPARATEATIPROC, glStencilFuncSeparateATI, ATI_SEPARATE_STENCIL, NULL )\
- /* GL_NV_half_float */ \
- USE_GL_FUNC(PGLFNVERTEX2HNVPROC, glVertex2hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEX2HVNVPROC, glVertex2hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEX3HNVPROC, glVertex3hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEX3HVNVPROC, glVertex3hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEX4HNVPROC, glVertex4hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEX4HVNVPROC, glVertex4hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNNORMAL3HNVPROC, glNormal3hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNNORMAL3HVNVPROC, glNormal3hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNCOLOR3HNVPROC, glColor3hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNCOLOR3HVNVPROC, glColor3hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNCOLOR4HNVPROC, glColor4hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNCOLOR4HVNVPROC, glColor4hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNTEXCOORD1HNVPROC, glTexCoord1hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNTEXCOORD1HVNVPROC, glTexCoord1hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNTEXCOORD2HNVPROC, glTexCoord2hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNTEXCOORD2HVNVPROC, glTexCoord2hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNTEXCOORD3HNVPROC, glTexCoord3hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNTEXCOORD3HVNVPROC, glTexCoord3hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNTEXCOORD4HNVPROC, glTexCoord4hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNTEXCOORD4HVNVPROC, glTexCoord4hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNMULTITEXCOORD1HNVPROC, glMultiTexCoord1hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNMULTITEXCOORD1HVNVPROC, glMultiTexCoord1hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNMULTITEXCOORD2HNVPROC, glMultiTexCoord2hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNMULTITEXCOORD2HVNVPROC, glMultiTexCoord2hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNMULTITEXCOORD3HNVPROC, glMultiTexCoord3hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNMULTITEXCOORD3HVNVPROC, glMultiTexCoord3hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNMULTITEXCOORD4HNVPROC, glMultiTexCoord4hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNMULTITEXCOORD4HVNVPROC, glMultiTexCoord4hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNFOGCOORDHNVPROC, glFogCoordhNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNFOGCOORDHVNVPROC, glFogCoordhvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNSECONDARYCOLOR3HNVPROC, glSecondaryColor3hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNSECONDARYCOLOR3HVNVPROC, glSecondaryColor3hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEXWEIGHTHNVPROC, glVertexWeighthNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEXWEIGHTHVNVPROC, glVertexWeighthvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB1HNVPROC, glVertexAttrib1hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB1HVNVPROC, glVertexAttrib1hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB2HNVPROC, glVertexAttrib2hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB2HVNVPROC, glVertexAttrib2hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB3HNVPROC, glVertexAttrib3hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB3HVNVPROC, glVertexAttrib3hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4HNVPROC, glVertexAttrib4hNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIB4HVNVPROC, glVertexAttrib4hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIBS1HVNVPROC, glVertexAttribs1hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIBS2HVNVPROC, glVertexAttribs2hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIBS3HVNVPROC, glVertexAttribs3hvNV, NV_HALF_FLOAT, NULL )\
- USE_GL_FUNC(PGLFNVERTEXATTRIBS4HVNVPROC, glVertexAttribs4hvNV, NV_HALF_FLOAT, NULL )\
- /* GL_NV_register_combiners */ \
- USE_GL_FUNC(PGLFNCOMBINERINPUTNVPROC, glCombinerInputNV, NV_REGISTER_COMBINERS, NULL )\
- USE_GL_FUNC(PGLFNCOMBINEROUTPUTNVPROC, glCombinerOutputNV, NV_REGISTER_COMBINERS, NULL )\
- USE_GL_FUNC(PGLFNCOMBINERPARAMETERFNVPROC, glCombinerParameterfNV, NV_REGISTER_COMBINERS, NULL )\
- USE_GL_FUNC(PGLFNCOMBINERPARAMETERFVNVPROC, glCombinerParameterfvNV, NV_REGISTER_COMBINERS, NULL )\
- USE_GL_FUNC(PGLFNCOMBINERPARAMETERINVPROC, glCombinerParameteriNV, NV_REGISTER_COMBINERS, NULL )\
- USE_GL_FUNC(PGLFNCOMBINERPARAMETERIVNVPROC, glCombinerParameterivNV, NV_REGISTER_COMBINERS, NULL )\
- USE_GL_FUNC(PGLFNFINALCOMBINERINPUTNVPROC, glFinalCombinerInputNV, NV_REGISTER_COMBINERS, NULL )\
- /* GL_NV_fence */ \
- USE_GL_FUNC(PGLFNGENFENCESNVPROC, glGenFencesNV, NV_FENCE, NULL )\
- USE_GL_FUNC(PGLFNDELETEFENCESNVPROC, glDeleteFencesNV, NV_FENCE, NULL )\
- USE_GL_FUNC(PGLFNSETFENCENVPROC, glSetFenceNV, NV_FENCE, NULL )\
- USE_GL_FUNC(PGLFNTESTFENCENVPROC, glTestFenceNV, NV_FENCE, NULL )\
- USE_GL_FUNC(PGLFNFINISHFENCENVPROC, glFinishFenceNV, NV_FENCE, NULL )\
- USE_GL_FUNC(PGLFNISFENCENVPROC, glIsFenceNV, NV_FENCE, NULL )\
- USE_GL_FUNC(PGLFNGETFENCEIVNVPROC, glGetFenceivNV, NV_FENCE, NULL )\
- /* GL_APPLE_fence */ \
- USE_GL_FUNC(PGLFNGENFENCESAPPLEPROC, glGenFencesAPPLE, APPLE_FENCE, NULL )\
- USE_GL_FUNC(PGLFNDELETEFENCESAPPLEPROC, glDeleteFencesAPPLE, APPLE_FENCE, NULL )\
- USE_GL_FUNC(PGLFNSETFENCEAPPLEPROC, glSetFenceAPPLE, APPLE_FENCE, NULL )\
- USE_GL_FUNC(PGLFNTESTFENCEAPPLEPROC, glTestFenceAPPLE, APPLE_FENCE, NULL )\
- USE_GL_FUNC(PGLFNFINISHFENCEAPPLEPROC, glFinishFenceAPPLE, APPLE_FENCE, NULL )\
- USE_GL_FUNC(PGLFNISFENCEAPPLEPROC, glIsFenceAPPLE, APPLE_FENCE, NULL )\
- USE_GL_FUNC(PGLFNTESTOBJECTAPPLEPROC, glTestObjectAPPLE, APPLE_FENCE, NULL )\
- USE_GL_FUNC(PGLFNFINISHOBJECTAPPLEPROC, glFinishObjectAPPLE, APPLE_FENCE, NULL )\
- /* GLX_SGI_video_sync */ \
- USE_GL_FUNC(PGLXFNGETVIDEOSYNCSGIPROC, glXGetVideoSyncSGI, SGI_VIDEO_SYNC, NULL )\
- USE_GL_FUNC(PGLXFNWAITVIDEOSYNCSGIPROC, glXWaitVideoSyncSGI, SGI_VIDEO_SYNC, NULL )\
- /* GL_APPLE_flush_render */ \
- USE_GL_FUNC(PGLFNFLUSHRENDERAPPLEPROC, glFlushRenderAPPLE, APPLE_FLUSH_RENDER, NULL )\
- USE_GL_FUNC(PGLFNFINISHRENDERAPPLEPROC, glFinishRenderAPPLE, APPLE_FLUSH_RENDER, NULL )\
- /* GL_EXT_gpu_program_parameters */ \
- USE_GL_FUNC(PGLFNPROGRAMENVPARAMETERS4FVEXTPROC, glProgramEnvParameters4fvEXT, EXT_GPU_PROGRAM_PARAMETERS,NULL )\
- USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC, glProgramLocalParameters4fvEXT, EXT_GPU_PROGRAM_PARAMETERS,NULL )\
- /* GL_ATI_fragment_shader */ \
- USE_GL_FUNC(PGLFNGENFRAGMENTSHADERSATI, glGenFragmentShadersATI, ATI_FRAGMENT_SHADER, NULL )\
- USE_GL_FUNC(PGLFNBINDFRAGMENTSHADERATI, glBindFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL )\
- USE_GL_FUNC(PGLFNDELETEFRAGMENTSHADERATI, glDeleteFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL )\
- USE_GL_FUNC(PGLFNBEGINFRAGMENTSHADERATI, glBeginFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL )\
- USE_GL_FUNC(PGLFNENDFRAGMENTSHADERATI, glEndFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL )\
- USE_GL_FUNC(PGLFNPASSTEXCOORDATI, glPassTexCoordATI, ATI_FRAGMENT_SHADER, NULL )\
- USE_GL_FUNC(PGLFNSAMPLEMAPATI, glSampleMapATI, ATI_FRAGMENT_SHADER, NULL )\
- USE_GL_FUNC(PGLFNCOLORFRAGMENTOP1ATI, glColorFragmentOp1ATI, ATI_FRAGMENT_SHADER, NULL )\
- USE_GL_FUNC(PGLFNCOLORFRAGMENTOP2ATI, glColorFragmentOp2ATI, ATI_FRAGMENT_SHADER, NULL )\
- USE_GL_FUNC(PGLFNCOLORFRAGMENTOP3ATI, glColorFragmentOp3ATI, ATI_FRAGMENT_SHADER, NULL )\
- USE_GL_FUNC(PGLFNALPHAFRAGMENTOP1ATI, glAlphaFragmentOp1ATI, ATI_FRAGMENT_SHADER, NULL )\
- USE_GL_FUNC(PGLFNALPHAFRAGMENTOP2ATI, glAlphaFragmentOp2ATI, ATI_FRAGMENT_SHADER, NULL )\
- USE_GL_FUNC(PGLFNALPHAFRAGMENTOP3ATI, glAlphaFragmentOp3ATI, ATI_FRAGMENT_SHADER, NULL )\
- USE_GL_FUNC(PGLFNSETFRAGMENTSHADERCONSTANTATI, glSetFragmentShaderConstantATI, ATI_FRAGMENT_SHADER, NULL )\
- /* GL_APPLE_flush_buffer_range */ \
- USE_GL_FUNC(PGLFNBUFFERPARAMETERIAPPLE, glBufferParameteriAPPLE, APPLE_FLUSH_BUFFER_RANGE,NULL)\
- USE_GL_FUNC(PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE, glFlushMappedBufferRangeAPPLE, APPLE_FLUSH_BUFFER_RANGE,NULL)
-
-
-/****************************************************
- * OpenGL WGL defines and functions pointer
- ****************************************************/
+/* GLX_SGI_video_sync */
+typedef int (WINE_GLAPI *PGLXFNGETVIDEOSYNCSGIPROC)(unsigned int *);
+typedef int (WINE_GLAPI *PGLXFNWAITVIDEOSYNCSGIPROC)(int, int, unsigned int *);
/* WGL_ARB_extensions_string */
-typedef const char * (WINAPI * WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);
+typedef const char *(WINAPI *WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc);
+
/* WGL_ARB_multisample */
#ifndef WGL_ARB_multisample
-#define WGL_SAMPLE_BUFFERS_ARB 0x2041
-#define WGL_SAMPLES_ARB 0x2042
+#define WGL_ARB_multisample 1
+#define WGL_SAMPLE_BUFFERS_ARB 0x2041
+#define WGL_SAMPLES_ARB 0x2042
#endif
-/* WGL_ARB_pixel_format */
-#ifndef WGL_ARB_pixel_format
-#define WGL_ARB_pixel_format 1
-#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
-#define WGL_DRAW_TO_WINDOW_ARB 0x2001
-#define WGL_DRAW_TO_BITMAP_ARB 0x2002
-#define WGL_ACCELERATION_ARB 0x2003
-#define WGL_NEED_PALETTE_ARB 0x2004
-#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
-#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
-#define WGL_SWAP_METHOD_ARB 0x2007
-#define WGL_NUMBER_OVERLAYS_ARB 0x2008
-#define WGL_NUMBER_UNDERLAYS_ARB 0x2009
-#define WGL_TRANSPARENT_ARB 0x200A
-#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
-#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
-#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
-#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
-#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
-#define WGL_SHARE_DEPTH_ARB 0x200C
-#define WGL_SHARE_STENCIL_ARB 0x200D
-#define WGL_SHARE_ACCUM_ARB 0x200E
-#define WGL_SUPPORT_GDI_ARB 0x200F
-#define WGL_SUPPORT_OPENGL_ARB 0x2010
-#define WGL_DOUBLE_BUFFER_ARB 0x2011
-#define WGL_STEREO_ARB 0x2012
-#define WGL_PIXEL_TYPE_ARB 0x2013
-#define WGL_COLOR_BITS_ARB 0x2014
-#define WGL_RED_BITS_ARB 0x2015
-#define WGL_RED_SHIFT_ARB 0x2016
-#define WGL_GREEN_BITS_ARB 0x2017
-#define WGL_GREEN_SHIFT_ARB 0x2018
-#define WGL_BLUE_BITS_ARB 0x2019
-#define WGL_BLUE_SHIFT_ARB 0x201A
-#define WGL_ALPHA_BITS_ARB 0x201B
-#define WGL_ALPHA_SHIFT_ARB 0x201C
-#define WGL_ACCUM_BITS_ARB 0x201D
-#define WGL_ACCUM_RED_BITS_ARB 0x201E
-#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
-#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
-#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
-#define WGL_DEPTH_BITS_ARB 0x2022
-#define WGL_STENCIL_BITS_ARB 0x2023
-#define WGL_AUX_BUFFERS_ARB 0x2024
-#define WGL_NO_ACCELERATION_ARB 0x2025
-#define WGL_GENERIC_ACCELERATION_ARB 0x2026
-#define WGL_FULL_ACCELERATION_ARB 0x2027
-#define WGL_SWAP_EXCHANGE_ARB 0x2028
-#define WGL_SWAP_COPY_ARB 0x2029
-#define WGL_SWAP_UNDEFINED_ARB 0x202A
-#define WGL_TYPE_RGBA_ARB 0x202B
-#define WGL_TYPE_COLORINDEX_ARB 0x202C
-#endif
-typedef BOOL (WINAPI * WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
-typedef BOOL (WINAPI * WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
-typedef BOOL (WINAPI * WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
-/* WGL_ARB_make_current_read */
-typedef BOOL (WINAPI * WINED3D_PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
-typedef HDC (WINAPI * WINED3D_PFNWGLGETCURRENTREADDCARBPROC) (void);
+
/* WGL_ARB_pbuffer */
#ifndef WGL_ARB_pbuffer
#define WGL_ARB_pbuffer 1
-#define WGL_DRAW_TO_PBUFFER_ARB 0x202D
-#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E
-#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F
-#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
-#define WGL_PBUFFER_LARGEST_ARB 0x2033
-#define WGL_PBUFFER_WIDTH_ARB 0x2034
-#define WGL_PBUFFER_HEIGHT_ARB 0x2035
-#define WGL_PBUFFER_LOST_ARB 0x2036
+#define WGL_DRAW_TO_PBUFFER_ARB 0x202d
+#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202e
+#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202f
+#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
+#define WGL_PBUFFER_LARGEST_ARB 0x2033
+#define WGL_PBUFFER_WIDTH_ARB 0x2034
+#define WGL_PBUFFER_HEIGHT_ARB 0x2035
+#define WGL_PBUFFER_LOST_ARB 0x2036
#endif
DECLARE_HANDLE(HPBUFFERARB);
-typedef HPBUFFERARB (WINAPI * WINED3D_PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
-typedef HDC (WINAPI * WINED3D_PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer);
-typedef int (WINAPI * WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC);
-typedef BOOL (WINAPI * WINED3D_PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer);
-typedef BOOL (WINAPI * WINED3D_PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
+typedef HPBUFFERARB (WINAPI *WINED3D_PFNWGLCREATEPBUFFERARBPROC)(HDC hDC, int iPixelFormat,
+ int iWidth, int iHeight, const int *piAttribList);
+typedef HDC (WINAPI *WINED3D_PFNWGLGETPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer);
+typedef int (WINAPI *WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer, HDC hDC);
+typedef BOOL (WINAPI *WINED3D_PFNWGLDESTROYPBUFFERARBPROC)(HPBUFFERARB hPbuffer);
+typedef BOOL (WINAPI *WINED3D_PFNWGLQUERYPBUFFERARBPROC)(HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
+
+/* WGL_ARB_pixel_format */
+#ifndef WGL_ARB_pixel_format
+#define WGL_ARB_pixel_format 1
+#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
+#define WGL_DRAW_TO_WINDOW_ARB 0x2001
+#define WGL_DRAW_TO_BITMAP_ARB 0x2002
+#define WGL_ACCELERATION_ARB 0x2003
+#define WGL_NEED_PALETTE_ARB 0x2004
+#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
+#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
+#define WGL_SWAP_METHOD_ARB 0x2007
+#define WGL_NUMBER_OVERLAYS_ARB 0x2008
+#define WGL_NUMBER_UNDERLAYS_ARB 0x2009
+#define WGL_TRANSPARENT_ARB 0x200a
+#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
+#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
+#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
+#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203a
+#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203b
+#define WGL_SHARE_DEPTH_ARB 0x200c
+#define WGL_SHARE_STENCIL_ARB 0x200d
+#define WGL_SHARE_ACCUM_ARB 0x200e
+#define WGL_SUPPORT_GDI_ARB 0x200f
+#define WGL_SUPPORT_OPENGL_ARB 0x2010
+#define WGL_DOUBLE_BUFFER_ARB 0x2011
+#define WGL_STEREO_ARB 0x2012
+#define WGL_PIXEL_TYPE_ARB 0x2013
+#define WGL_COLOR_BITS_ARB 0x2014
+#define WGL_RED_BITS_ARB 0x2015
+#define WGL_RED_SHIFT_ARB 0x2016
+#define WGL_GREEN_BITS_ARB 0x2017
+#define WGL_GREEN_SHIFT_ARB 0x2018
+#define WGL_BLUE_BITS_ARB 0x2019
+#define WGL_BLUE_SHIFT_ARB 0x201a
+#define WGL_ALPHA_BITS_ARB 0x201b
+#define WGL_ALPHA_SHIFT_ARB 0x201c
+#define WGL_ACCUM_BITS_ARB 0x201d
+#define WGL_ACCUM_RED_BITS_ARB 0x201e
+#define WGL_ACCUM_GREEN_BITS_ARB 0x201f
+#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
+#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
+#define WGL_DEPTH_BITS_ARB 0x2022
+#define WGL_STENCIL_BITS_ARB 0x2023
+#define WGL_AUX_BUFFERS_ARB 0x2024
+#define WGL_NO_ACCELERATION_ARB 0x2025
+#define WGL_GENERIC_ACCELERATION_ARB 0x2026
+#define WGL_FULL_ACCELERATION_ARB 0x2027
+#define WGL_SWAP_EXCHANGE_ARB 0x2028
+#define WGL_SWAP_COPY_ARB 0x2029
+#define WGL_SWAP_UNDEFINED_ARB 0x202a
+#define WGL_TYPE_RGBA_ARB 0x202b
+#define WGL_TYPE_COLORINDEX_ARB 0x202c
+#endif
+typedef BOOL (WINAPI *WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(HDC hdc, int iPixelFormat,
+ int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
+typedef BOOL (WINAPI *WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC)(HDC hdc, int iPixelFormat,
+ int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
+typedef BOOL (WINAPI *WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC)(HDC hdc, const int *piAttribIList,
+ const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
+
+/* WGL_ARB_pixel_format_float */
#ifndef WGL_ARB_pixel_format_float
#define WGL_ARB_pixel_format_float 1
-#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0
+#define WGL_TYPE_RGBA_FLOAT_ARB 0x21a0
#endif
+
/* WGL_WINE_pixel_format_passthrough */
-typedef BOOL (WINAPI * WINED3D_PFNWGLSETPIXELFORMATWINE) (HDC hdc, int iPixelFormat, const PIXELFORMATDESCRIPTOR* ppfd);
+typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelFormat,
+ const PIXELFORMATDESCRIPTOR *ppfd);
+
+#define GL_EXT_FUNCS_GEN \
+ /* GL_APPLE_fence */ \
+ USE_GL_FUNC(PGLFNGENFENCESAPPLEPROC, \
+ glGenFencesAPPLE, APPLE_FENCE, NULL) \
+ USE_GL_FUNC(PGLFNDELETEFENCESAPPLEPROC, \
+ glDeleteFencesAPPLE, APPLE_FENCE, NULL) \
+ USE_GL_FUNC(PGLFNSETFENCEAPPLEPROC, \
+ glSetFenceAPPLE, APPLE_FENCE, NULL) \
+ USE_GL_FUNC(PGLFNTESTFENCEAPPLEPROC, \
+ glTestFenceAPPLE, APPLE_FENCE, NULL) \
+ USE_GL_FUNC(PGLFNFINISHFENCEAPPLEPROC, \
+ glFinishFenceAPPLE, APPLE_FENCE, NULL) \
+ USE_GL_FUNC(PGLFNISFENCEAPPLEPROC, \
+ glIsFenceAPPLE, APPLE_FENCE, NULL) \
+ USE_GL_FUNC(PGLFNTESTOBJECTAPPLEPROC, \
+ glTestObjectAPPLE, APPLE_FENCE, NULL) \
+ USE_GL_FUNC(PGLFNFINISHOBJECTAPPLEPROC, \
+ glFinishObjectAPPLE, APPLE_FENCE, NULL) \
+ /* GL_APPLE_flush_buffer_range */ \
+ USE_GL_FUNC(PGLFNBUFFERPARAMETERIAPPLE, \
+ glBufferParameteriAPPLE, APPLE_FLUSH_BUFFER_RANGE, NULL) \
+ USE_GL_FUNC(PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE, \
+ glFlushMappedBufferRangeAPPLE, APPLE_FLUSH_BUFFER_RANGE, NULL) \
+ /* GL_APPLE_flush_render */ \
+ USE_GL_FUNC(PGLFNFLUSHRENDERAPPLEPROC, \
+ glFlushRenderAPPLE, APPLE_FLUSH_RENDER, NULL) \
+ USE_GL_FUNC(PGLFNFINISHRENDERAPPLEPROC, \
+ glFinishRenderAPPLE, APPLE_FLUSH_RENDER, NULL) \
+ /* GL_ARB_color_buffer_float */ \
+ USE_GL_FUNC(PGLFNCLAMPCOLORARBPROC, \
+ glClampColorARB, ARB_COLOR_BUFFER_FLOAT, NULL) \
+ /* GL_ARB_draw_buffers */ \
+ USE_GL_FUNC(PGLFNDRAWBUFFERSARBPROC, \
+ glDrawBuffersARB, ARB_DRAW_BUFFERS, NULL) \
+ /* GL_ARB_framebuffer_object */ \
+ USE_GL_FUNC(PGLFNGLISRENDERBUFFERPROC, \
+ glIsRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLBINDRENDERBUFFERPROC, \
+ glBindRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSPROC, \
+ glDeleteRenderbuffers, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSPROC, \
+ glGenRenderbuffers, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEPROC, \
+ glRenderbufferStorage, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC, \
+ glRenderbufferStorageMultisample, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVPROC, \
+ glGetRenderbufferParameteriv, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLISFRAMEBUFFERPROC, \
+ glIsFramebuffer, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFERPROC, \
+ glBindFramebuffer, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSPROC, \
+ glDeleteFramebuffers, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSPROC, \
+ glGenFramebuffers, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSPROC, \
+ glCheckFramebufferStatus, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DPROC, \
+ glFramebufferTexture1D, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DPROC, \
+ glFramebufferTexture2D, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DPROC, \
+ glFramebufferTexture3D, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURELAYERPROC, \
+ glFramebufferTextureLayer, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFERPROC, \
+ glFramebufferRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC, \
+ glGetFramebufferAttachmentParameteriv, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFERPROC, \
+ glBlitFramebuffer, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLGENERATEMIPMAPPROC, \
+ glGenerateMipmap, ARB_FRAMEBUFFER_OBJECT, NULL) \
+ /* GL_ARB_geometry_shader4 */ \
+ USE_GL_FUNC(PGLFNPROGRAMPARAMETERIARBPROC, \
+ glProgramParameteriARB, ARB_GEOMETRY_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREARBPROC, \
+ glFramebufferTextureARB, ARB_GEOMETRY_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTURELAYERARBPROC, \
+ glFramebufferTextureLayerARB, ARB_GEOMETRY_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREFACEARBPROC, \
+ glFramebufferTextureFaceARB, ARB_GEOMETRY_SHADER4, NULL) \
+ /* GL_ARB_imaging, GL_EXT_blend_minmax */ \
+ USE_GL_FUNC(PGLFNBLENDCOLORPROC, \
+ glBlendColorEXT, EXT_BLEND_COLOR, NULL) \
+ USE_GL_FUNC(PGLFNBLENDEQUATIONPROC, \
+ glBlendEquationEXT, EXT_BLEND_MINMAX, NULL) \
+ /* GL_ARB_map_buffer_range */ \
+ USE_GL_FUNC(PGLFNMAPBUFFERRANGEPROC, \
+ glMapBufferRange, ARB_MAP_BUFFER_RANGE, NULL) \
+ USE_GL_FUNC(PGLFNFLUSHMAPPEDBUFFERRANGEPROC, \
+ glFlushMappedBufferRange, ARB_MAP_BUFFER_RANGE, NULL) \
+ /* GL_ARB_multisample */ \
+ USE_GL_FUNC(WINED3D_PFNGLSAMPLECOVERAGEARBPROC, \
+ glSampleCoverageARB, ARB_MULTISAMPLE, NULL) \
+ /* GL_ARB_multitexture */ \
+ USE_GL_FUNC(WINED3D_PFNGLACTIVETEXTUREARBPROC, \
+ glActiveTextureARB, ARB_MULTITEXTURE, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC, \
+ glClientActiveTextureARB, ARB_MULTITEXTURE, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FARBPROC, \
+ glMultiTexCoord1fARB, ARB_MULTITEXTURE, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FVARBPROC, \
+ glMultiTexCoord1fvARB, ARB_MULTITEXTURE, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FARBPROC, \
+ glMultiTexCoord2fARB, ARB_MULTITEXTURE, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FVARBPROC, \
+ glMultiTexCoord2fvARB, ARB_MULTITEXTURE, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FARBPROC, \
+ glMultiTexCoord3fARB, ARB_MULTITEXTURE, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FVARBPROC, \
+ glMultiTexCoord3fvARB, ARB_MULTITEXTURE, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FARBPROC, \
+ glMultiTexCoord4fARB, ARB_MULTITEXTURE, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FVARBPROC, \
+ glMultiTexCoord4fvARB, ARB_MULTITEXTURE, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2SVARBPROC, \
+ glMultiTexCoord2svARB, ARB_MULTITEXTURE, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4SVARBPROC, \
+ glMultiTexCoord4svARB, ARB_MULTITEXTURE, NULL) \
+ /* GL_ARB_occlusion_query */ \
+ USE_GL_FUNC(PGLFNGENQUERIESARBPROC, \
+ glGenQueriesARB, ARB_OCCLUSION_QUERY, NULL) \
+ USE_GL_FUNC(PGLFNDELETEQUERIESARBPROC, \
+ glDeleteQueriesARB, ARB_OCCLUSION_QUERY, NULL) \
+ USE_GL_FUNC(PGLFNBEGINQUERYARBPROC, \
+ glBeginQueryARB, ARB_OCCLUSION_QUERY, NULL) \
+ USE_GL_FUNC(PGLFNENDQUERYARBPROC, \
+ glEndQueryARB, ARB_OCCLUSION_QUERY, NULL) \
+ USE_GL_FUNC(PGLFNGETQUERYOBJECTIVARBPROC, \
+ glGetQueryObjectivARB, ARB_OCCLUSION_QUERY, NULL) \
+ USE_GL_FUNC(PGLFNGETQUERYOBJECTUIVARBPROC, \
+ glGetQueryObjectuivARB, ARB_OCCLUSION_QUERY, NULL) \
+ /* GL_ARB_point_parameters */ \
+ USE_GL_FUNC(PGLFNGLPOINTPARAMETERFARBPROC, \
+ glPointParameterfARB, ARB_POINT_PARAMETERS, NULL) \
+ USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVARBPROC, \
+ glPointParameterfvARB, ARB_POINT_PARAMETERS, NULL) \
+ /* GL_ARB_provoking_vertex */ \
+ USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXPROC, \
+ glProvokingVertex, ARB_PROVOKING_VERTEX, NULL) \
+ /* GL_ARB_shader_objects */ \
+ USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC, \
+ glGetObjectParameterivARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC, \
+ glGetObjectParameterfvARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC, \
+ glGetUniformLocationARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLGETACTIVEUNIFORMARBPROC, \
+ glGetActiveUniformARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC, \
+ glUniform1iARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IARBPROC, \
+ glUniform2iARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IARBPROC, \
+ glUniform3iARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IARBPROC, \
+ glUniform4iARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC, \
+ glUniform1fARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FARBPROC, \
+ glUniform2fARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FARBPROC, \
+ glUniform3fARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FARBPROC, \
+ glUniform4fARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM1FVARBPROC, \
+ glUniform1fvARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FVARBPROC, \
+ glUniform2fvARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FVARBPROC, \
+ glUniform3fvARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FVARBPROC, \
+ glUniform4fvARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IVARBPROC, \
+ glUniform1ivARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IVARBPROC, \
+ glUniform2ivARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IVARBPROC, \
+ glUniform3ivARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IVARBPROC, \
+ glUniform4ivARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC, \
+ glUniformMatrix2fvARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC, \
+ glUniformMatrix3fvARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC, \
+ glUniformMatrix4fvARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMFVARBPROC, \
+ glGetUniformfvARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMIVARBPROC, \
+ glGetUniformivARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLGETINFOLOGARBPROC, \
+ glGetInfoLogARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC, \
+ glUseProgramObjectARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLCREATESHADEROBJECTARBPROC, \
+ glCreateShaderObjectARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLSHADERSOURCEARBPROC, \
+ glShaderSourceARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLCOMPILESHADERARBPROC, \
+ glCompileShaderARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC, \
+ glCreateProgramObjectARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLATTACHOBJECTARBPROC, \
+ glAttachObjectARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLLINKPROGRAMARBPROC, \
+ glLinkProgramARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLDETACHOBJECTARBPROC, \
+ glDetachObjectARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLDELETEOBJECTARBPROC, \
+ glDeleteObjectARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLVALIDATEPROGRAMARBPROC, \
+ glValidateProgramARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC, \
+ glGetAttachedObjectsARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLGETHANDLEARBPROC, \
+ glGetHandleARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLGETSHADERSOURCEARBPROC, \
+ glGetShaderSourceARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC, \
+ glBindAttribLocationARB, ARB_SHADER_OBJECTS, NULL) \
+ USE_GL_FUNC(WINED3D_PFNGLGETATTRIBLOCATIONARBPROC, \
+ glGetAttribLocationARB, ARB_SHADER_OBJECTS, NULL) \
+ /* GL_ARB_sync */ \
+ USE_GL_FUNC(PGLFNFENCESYNCPROC, \
+ glFenceSync, ARB_SYNC, NULL) \
+ USE_GL_FUNC(PGLFNISSYNCPROC, \
+ glIsSync, ARB_SYNC, NULL) \
+ USE_GL_FUNC(PGLFNDELETESYNCPROC, \
+ glDeleteSync, ARB_SYNC, NULL) \
+ USE_GL_FUNC(PGLFNCLIENTWAITSYNCPROC, \
+ glClientWaitSync, ARB_SYNC, NULL) \
+ USE_GL_FUNC(PGLFNWAITSYNCPROC, \
+ glWaitSync, ARB_SYNC, NULL) \
+ USE_GL_FUNC(PGLFNGETINTEGER64VPROC, \
+ glGetInteger64v, ARB_SYNC, NULL) \
+ USE_GL_FUNC(PGLFNGETSYNCIVPROC, \
+ glGetSynciv, ARB_SYNC, NULL) \
+ /* GL_ARB_texture_compression */ \
+ USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE2DPROC, \
+ glCompressedTexImage2DARB, ARB_TEXTURE_COMPRESSION, NULL) \
+ USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE3DPROC, \
+ glCompressedTexImage3DARB, ARB_TEXTURE_COMPRESSION, NULL) \
+ USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC, \
+ glCompressedTexSubImage2DARB, ARB_TEXTURE_COMPRESSION, NULL) \
+ USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC, \
+ glCompressedTexSubImage3DARB, ARB_TEXTURE_COMPRESSION, NULL) \
+ USE_GL_FUNC(PGLFNGETCOMPRESSEDTEXIMAGEPROC, \
+ glGetCompressedTexImageARB, ARB_TEXTURE_COMPRESSION, NULL) \
+ /* GL_ARB_vertex_blend */ \
+ USE_GL_FUNC(PGLFNGLWEIGHTPOINTERARB, \
+ glWeightPointerARB, ARB_VERTEX_BLEND, NULL) \
+ USE_GL_FUNC(PGLFNGLWEIGHTBV, \
+ glWeightbvARB, ARB_VERTEX_BLEND, NULL) \
+ USE_GL_FUNC(PGLFNGLWEIGHTSV, \
+ glWeightsvARB, ARB_VERTEX_BLEND, NULL) \
+ USE_GL_FUNC(PGLFNGLWEIGHTIV, \
+ glWeightivARB, ARB_VERTEX_BLEND, NULL) \
+ USE_GL_FUNC(PGLFNGLWEIGHTFV, \
+ glWeightfvARB, ARB_VERTEX_BLEND, NULL) \
+ USE_GL_FUNC(PGLFNGLWEIGHTDV, \
+ glWeightdvARB, ARB_VERTEX_BLEND, NULL) \
+ USE_GL_FUNC(PGLFNGLWEIGHTUBV, \
+ glWeightubvARB, ARB_VERTEX_BLEND, NULL) \
+ USE_GL_FUNC(PGLFNGLWEIGHTUSV, \
+ glWeightusvARB, ARB_VERTEX_BLEND, NULL) \
+ USE_GL_FUNC(PGLFNGLWEIGHTUIV, \
+ glWeightuivARB, ARB_VERTEX_BLEND, NULL) \
+ USE_GL_FUNC(PGLFNGLVERTEXBLENDARB, \
+ glVertexBlendARB, ARB_VERTEX_BLEND, NULL) \
+ /* GL_ARB_vertex_buffer_object */ \
+ USE_GL_FUNC(PGLFNBINDBUFFERARBPROC, \
+ glBindBufferARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNDELETEBUFFERSARBPROC, \
+ glDeleteBuffersARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGENBUFFERSARBPROC, \
+ glGenBuffersARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNISBUFFERARBPROC, \
+ glIsBufferARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNBUFFERDATAARBPROC, \
+ glBufferDataARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNBUFFERSUBDATAARBPROC, \
+ glBufferSubDataARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGETBUFFERSUBDATAARBPROC, \
+ glGetBufferSubDataARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNMAPBUFFERARBPROC, \
+ glMapBufferARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNUNMAPBUFFERARBPROC, \
+ glUnmapBufferARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGETBUFFERPARAMETERIVARBPROC, \
+ glGetBufferParameterivARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGETBUFFERPOINTERVARBPROC, \
+ glGetBufferPointervARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \
+ /* GL_ARB_vertex_program */ \
+ USE_GL_FUNC(PGLFNGENPROGRAMSARBPROC, \
+ glGenProgramsARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNBINDPROGRAMARBPROC, \
+ glBindProgramARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNPROGRAMSTRINGARBPROC, \
+ glProgramStringARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNDELETEPROGRAMSARBPROC, \
+ glDeleteProgramsARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNPROGRAMENVPARAMETER4FVARBPROC, \
+ glProgramEnvParameter4fvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETER4FVARBPROC, \
+ glProgramLocalParameter4fvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBPOINTERARBPROC, \
+ glVertexAttribPointerARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNENABLEVERTEXATTRIBARRAYARBPROC, \
+ glEnableVertexAttribArrayARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNDISABLEVERTEXATTRIBARRAYARBPROC, \
+ glDisableVertexAttribArrayARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB1DARBPROC, \
+ glVertexAttrib1dARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB1DVARBPROC, \
+ glVertexAttrib1dvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB1FARBPROC, \
+ glVertexAttrib1fARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB1FVARBPROC, \
+ glVertexAttrib1fvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB1SARBPROC, \
+ glVertexAttrib1sARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB1SVARBPROC, \
+ glVertexAttrib1svARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB2DARBPROC, \
+ glVertexAttrib2dARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB2DVARBPROC, \
+ glVertexAttrib2dvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB2FARBPROC, \
+ glVertexAttrib2fARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB2FVARBPROC, \
+ glVertexAttrib2fvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB2SARBPROC, \
+ glVertexAttrib2sARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB2SVARBPROC, \
+ glVertexAttrib2svARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB3DARBPROC, \
+ glVertexAttrib3dARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB3DVARBPROC, \
+ glVertexAttrib3dvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB3FARBPROC, \
+ glVertexAttrib3fARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB3FVARBPROC, \
+ glVertexAttrib3fvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB3SARBPROC, \
+ glVertexAttrib3sARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB3SVARBPROC, \
+ glVertexAttrib3svARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4NBVARBPROC, \
+ glVertexAttrib4NbvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4NIVARBPROC, \
+ glVertexAttrib4NivARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4NSVARBPROC, \
+ glVertexAttrib4NsvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBARBPROC, \
+ glVertexAttrib4NubARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBVARBPROC, \
+ glVertexAttrib4NubvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4NUIVARBPROC, \
+ glVertexAttrib4NuivARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4NUSVARBPROC, \
+ glVertexAttrib4NusvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4BVARBPROC, \
+ glVertexAttrib4bvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4DARBPROC, \
+ glVertexAttrib4dARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4DVARBPROC, \
+ glVertexAttrib4dvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4FARBPROC, \
+ glVertexAttrib4fARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4FVARBPROC, \
+ glVertexAttrib4fvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4IVARBPROC, \
+ glVertexAttrib4ivARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4SARBPROC, \
+ glVertexAttrib4sARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4SVARBPROC, \
+ glVertexAttrib4svARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4UBVARBPROC, \
+ glVertexAttrib4ubvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4UIVARBPROC, \
+ glVertexAttrib4uivARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4USVARBPROC, \
+ glVertexAttrib4usvARB, ARB_VERTEX_PROGRAM, NULL) \
+ USE_GL_FUNC(PGLFNGETPROGRAMIVARBPROC, \
+ glGetProgramivARB, ARB_VERTEX_PROGRAM, NULL) \
+ /* GL_ATI_fragment_shader */ \
+ USE_GL_FUNC(PGLFNGENFRAGMENTSHADERSATI, \
+ glGenFragmentShadersATI, ATI_FRAGMENT_SHADER, NULL) \
+ USE_GL_FUNC(PGLFNBINDFRAGMENTSHADERATI, \
+ glBindFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL) \
+ USE_GL_FUNC(PGLFNDELETEFRAGMENTSHADERATI, \
+ glDeleteFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL) \
+ USE_GL_FUNC(PGLFNBEGINFRAGMENTSHADERATI, \
+ glBeginFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL) \
+ USE_GL_FUNC(PGLFNENDFRAGMENTSHADERATI, \
+ glEndFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL) \
+ USE_GL_FUNC(PGLFNPASSTEXCOORDATI, \
+ glPassTexCoordATI, ATI_FRAGMENT_SHADER, NULL) \
+ USE_GL_FUNC(PGLFNSAMPLEMAPATI, \
+ glSampleMapATI, ATI_FRAGMENT_SHADER, NULL) \
+ USE_GL_FUNC(PGLFNCOLORFRAGMENTOP1ATI, \
+ glColorFragmentOp1ATI, ATI_FRAGMENT_SHADER, NULL) \
+ USE_GL_FUNC(PGLFNCOLORFRAGMENTOP2ATI, \
+ glColorFragmentOp2ATI, ATI_FRAGMENT_SHADER, NULL) \
+ USE_GL_FUNC(PGLFNCOLORFRAGMENTOP3ATI, \
+ glColorFragmentOp3ATI, ATI_FRAGMENT_SHADER, NULL) \
+ USE_GL_FUNC(PGLFNALPHAFRAGMENTOP1ATI, \
+ glAlphaFragmentOp1ATI, ATI_FRAGMENT_SHADER, NULL) \
+ USE_GL_FUNC(PGLFNALPHAFRAGMENTOP2ATI, \
+ glAlphaFragmentOp2ATI, ATI_FRAGMENT_SHADER, NULL) \
+ USE_GL_FUNC(PGLFNALPHAFRAGMENTOP3ATI, \
+ glAlphaFragmentOp3ATI, ATI_FRAGMENT_SHADER, NULL) \
+ USE_GL_FUNC(PGLFNSETFRAGMENTSHADERCONSTANTATI, \
+ glSetFragmentShaderConstantATI, ATI_FRAGMENT_SHADER, NULL) \
+ /* GL_ATI_separate_stencil */ \
+ USE_GL_FUNC(PGLFNSTENCILOPSEPARATEATIPROC, \
+ glStencilOpSeparateATI, ATI_SEPARATE_STENCIL, NULL) \
+ USE_GL_FUNC(PGLFNSTENCILFUNCSEPARATEATIPROC, \
+ glStencilFuncSeparateATI, ATI_SEPARATE_STENCIL, NULL) \
+ /* GL_EXT_blend_equation_separate */ \
+ USE_GL_FUNC(PGLFNBLENDFUNCSEPARATEEXTPROC, \
+ glBlendFuncSeparateEXT, EXT_BLEND_FUNC_SEPARATE, NULL) \
+ /* GL_EXT_blend_func_separate */ \
+ USE_GL_FUNC(PGLFNBLENDEQUATIONSEPARATEEXTPROC, \
+ glBlendEquationSeparateEXT, EXT_BLEND_EQUATION_SEPARATE, NULL) \
+ /* GL_EXT_fog_coord */ \
+ USE_GL_FUNC(PGLFNGLFOGCOORDFEXTPROC, \
+ glFogCoordfEXT, EXT_FOG_COORD, NULL) \
+ USE_GL_FUNC(PGLFNGLFOGCOORDFVEXTPROC, \
+ glFogCoordfvEXT, EXT_FOG_COORD, NULL) \
+ USE_GL_FUNC(PGLFNGLFOGCOORDDEXTPROC, \
+ glFogCoorddEXT, EXT_FOG_COORD, NULL) \
+ USE_GL_FUNC(PGLFNGLFOGCOORDDVEXTPROC, \
+ glFogCoorddvEXT, EXT_FOG_COORD, NULL) \
+ USE_GL_FUNC(PGLFNGLFOGCOORDPOINTEREXTPROC, \
+ glFogCoordPointerEXT, EXT_FOG_COORD, NULL) \
+ /* GL_EXT_framebuffer_blit */ \
+ USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFEREXTPROC, \
+ glBlitFramebufferEXT, EXT_FRAMEBUFFER_BLIT, NULL) \
+ /* GL_EXT_framebuffer_multisample */ \
+ USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, \
+ glRenderbufferStorageMultisampleEXT, EXT_FRAMEBUFFER_MULTISAMPLE, NULL) \
+ /* GL_EXT_framebuffer_object */ \
+ USE_GL_FUNC(PGLFNGLISRENDERBUFFEREXTPROC, \
+ glIsRenderbufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLBINDRENDERBUFFEREXTPROC, \
+ glBindRenderbufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSEXTPROC, \
+ glDeleteRenderbuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSEXTPROC, \
+ glGenRenderbuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEEXTPROC, \
+ glRenderbufferStorageEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLISFRAMEBUFFEREXTPROC, \
+ glIsFramebufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFEREXTPROC, \
+ glBindFramebufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSEXTPROC, \
+ glDeleteFramebuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSEXTPROC, \
+ glGenFramebuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, \
+ glCheckFramebufferStatusEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC, \
+ glFramebufferTexture1DEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC, \
+ glFramebufferTexture2DEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC, \
+ glFramebufferTexture3DEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, \
+ glFramebufferRenderbufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLGENERATEMIPMAPEXTPROC, \
+ glGenerateMipmapEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC, \
+ glGetRenderbufferParameterivEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC, \
+ glGetFramebufferAttachmentParameterivEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \
+ /* GL_EXT_gpu_program_parameters */ \
+ USE_GL_FUNC(PGLFNPROGRAMENVPARAMETERS4FVEXTPROC, \
+ glProgramEnvParameters4fvEXT, EXT_GPU_PROGRAM_PARAMETERS, NULL) \
+ USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC, \
+ glProgramLocalParameters4fvEXT, EXT_GPU_PROGRAM_PARAMETERS, NULL) \
+ /* GL_EXT_gpu_shader4 */\
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI1IEXTPROC, \
+ glVertexAttribI1iEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI2IEXTPROC, \
+ glVertexAttribI2iEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI3IEXTPROC, \
+ glVertexAttribI3iEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI4IEXTPROC, \
+ glVertexAttribI4iEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI1UIEXTPROC, \
+ glVertexAttribI1uiEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI2UIEXTPROC, \
+ glVertexAttribI2uiEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI3UIEXTPROC, \
+ glVertexAttribI3uiEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI4UIEXTPROC, \
+ glVertexAttribI4uiEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI1IVEXTPROC, \
+ glVertexAttribI1ivEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI2IVEXTPROC, \
+ glVertexAttribI2ivEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI3IVEXTPROC, \
+ glVertexAttribI3ivEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI4IVEXTPROC, \
+ glVertexAttribI4ivEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI1UIVEXTPROC, \
+ glVertexAttribI1uivEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI2UIVEXTPROC, \
+ glVertexAttribI2uivEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI3UIVEXTPROC, \
+ glVertexAttribI3uivEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI4UIVEXTPROC, \
+ glVertexAttribI4uivEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI4BVEXTPROC, \
+ glVertexAttribI4bvEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI4SVEXTPROC, \
+ glVertexAttribI4svEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI4UBVEXTPROC, \
+ glVertexAttribI4ubvEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBI4USVEXTPROC, \
+ glVertexAttribI4usvEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBIPOINTEREXTPROC, \
+ glVertexAttribIPointerEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNGETVERTEXATTRIBIIVEXTPROC, \
+ glVertexAttribIivEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNGETVERTEXATTRIBIUIVEXTPROC, \
+ glVertexAttribIuivEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNUNIFORM1UIEXTPROC, \
+ glUniform1uiEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNUNIFORM2UIEXTPROC, \
+ glUniform2uiEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNUNIFORM3UIEXTPROC, \
+ glUniform3uiEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNUNIFORM4UIEXTPROC, \
+ glUniform4uiEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNUNIFORM1UIVEXTPROC, \
+ glUniform1uivEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNUNIFORM2UIVEXTPROC, \
+ glUniform2uivEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNUNIFORM3UIVEXTPROC, \
+ glUniform3uivEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNUNIFORM4UIVEXTPROC, \
+ glUniform4uivEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNGETUNIFORMUIVEXTPROC, \
+ glGetUniformuivEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNBINDFRAGDATALOCATIONEXTPROC, \
+ glBindFragDataLocationEXT, EXT_GPU_SHADER4, NULL) \
+ USE_GL_FUNC(PGLFNGETFRAGDATALOCATIONEXTPROC, \
+ glGetFragDataLocationEXT, EXT_GPU_SHADER4, NULL) \
+ /* GL_EXT_paletted_texture */ \
+ USE_GL_FUNC(PGLFNGLCOLORTABLEEXTPROC, \
+ glColorTableEXT, EXT_PALETTED_TEXTURE, NULL) \
+ /* 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) \
+ USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FEXTPROC, \
+ glSecondaryColor3fEXT, EXT_SECONDARY_COLOR, NULL) \
+ USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FVEXTPROC, \
+ glSecondaryColor3fvEXT, EXT_SECONDARY_COLOR, NULL) \
+ USE_GL_FUNC(PGLFNGLSECONDARYCOLORPOINTEREXTPROC, \
+ glSecondaryColorPointerEXT, EXT_SECONDARY_COLOR, NULL) \
+ /* GL_EXT_stencil_two_side */ \
+ USE_GL_FUNC(PGLFNACTIVESTENCILFACEEXTPROC, \
+ glActiveStencilFaceEXT, EXT_STENCIL_TWO_SIDE, NULL) \
+ /* GL_EXT_texture3D */ \
+ USE_GL_FUNC(PGLFNGLTEXIMAGE3DEXTPROC, \
+ glTexImage3DEXT, EXT_TEXTURE3D, glTexImage3D) \
+ USE_GL_FUNC(PGLFNGLTEXSUBIMAGE3DEXTPROC, \
+ glTexSubImage3DEXT, EXT_TEXTURE3D, glTexSubImage3D) \
+ /* GL_NV_fence */ \
+ USE_GL_FUNC(PGLFNGENFENCESNVPROC, \
+ glGenFencesNV, NV_FENCE, NULL) \
+ USE_GL_FUNC(PGLFNDELETEFENCESNVPROC, \
+ glDeleteFencesNV, NV_FENCE, NULL) \
+ USE_GL_FUNC(PGLFNSETFENCENVPROC, \
+ glSetFenceNV, NV_FENCE, NULL) \
+ USE_GL_FUNC(PGLFNTESTFENCENVPROC, \
+ glTestFenceNV, NV_FENCE, NULL) \
+ USE_GL_FUNC(PGLFNFINISHFENCENVPROC, \
+ glFinishFenceNV, NV_FENCE, NULL) \
+ USE_GL_FUNC(PGLFNISFENCENVPROC, \
+ glIsFenceNV, NV_FENCE, NULL) \
+ USE_GL_FUNC(PGLFNGETFENCEIVNVPROC, \
+ glGetFenceivNV, NV_FENCE, NULL) \
+ /* GL_NV_half_float */ \
+ USE_GL_FUNC(PGLFNVERTEX2HNVPROC, \
+ glVertex2hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEX2HVNVPROC, \
+ glVertex2hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEX3HNVPROC, \
+ glVertex3hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEX3HVNVPROC, \
+ glVertex3hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEX4HNVPROC, \
+ glVertex4hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEX4HVNVPROC, \
+ glVertex4hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNNORMAL3HNVPROC, \
+ glNormal3hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNNORMAL3HVNVPROC, \
+ glNormal3hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNCOLOR3HNVPROC, \
+ glColor3hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNCOLOR3HVNVPROC, \
+ glColor3hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNCOLOR4HNVPROC, \
+ glColor4hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNCOLOR4HVNVPROC, \
+ glColor4hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNTEXCOORD1HNVPROC, \
+ glTexCoord1hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNTEXCOORD1HVNVPROC, \
+ glTexCoord1hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNTEXCOORD2HNVPROC, \
+ glTexCoord2hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNTEXCOORD2HVNVPROC, \
+ glTexCoord2hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNTEXCOORD3HNVPROC, \
+ glTexCoord3hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNTEXCOORD3HVNVPROC, \
+ glTexCoord3hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNTEXCOORD4HNVPROC, \
+ glTexCoord4hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNTEXCOORD4HVNVPROC, \
+ glTexCoord4hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNMULTITEXCOORD1HNVPROC, \
+ glMultiTexCoord1hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNMULTITEXCOORD1HVNVPROC, \
+ glMultiTexCoord1hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNMULTITEXCOORD2HNVPROC, \
+ glMultiTexCoord2hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNMULTITEXCOORD2HVNVPROC, \
+ glMultiTexCoord2hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNMULTITEXCOORD3HNVPROC, \
+ glMultiTexCoord3hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNMULTITEXCOORD3HVNVPROC, \
+ glMultiTexCoord3hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNMULTITEXCOORD4HNVPROC, \
+ glMultiTexCoord4hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNMULTITEXCOORD4HVNVPROC, \
+ glMultiTexCoord4hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNFOGCOORDHNVPROC, \
+ glFogCoordhNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNFOGCOORDHVNVPROC, \
+ glFogCoordhvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNSECONDARYCOLOR3HNVPROC, \
+ glSecondaryColor3hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNSECONDARYCOLOR3HVNVPROC, \
+ glSecondaryColor3hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXWEIGHTHNVPROC, \
+ glVertexWeighthNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXWEIGHTHVNVPROC, \
+ glVertexWeighthvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB1HNVPROC, \
+ glVertexAttrib1hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB1HVNVPROC, \
+ glVertexAttrib1hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB2HNVPROC, \
+ glVertexAttrib2hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB2HVNVPROC, \
+ glVertexAttrib2hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB3HNVPROC, \
+ glVertexAttrib3hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB3HVNVPROC, \
+ glVertexAttrib3hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4HNVPROC, \
+ glVertexAttrib4hNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIB4HVNVPROC, \
+ glVertexAttrib4hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBS1HVNVPROC, \
+ glVertexAttribs1hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBS2HVNVPROC, \
+ glVertexAttribs2hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBS3HVNVPROC, \
+ glVertexAttribs3hvNV, NV_HALF_FLOAT, NULL) \
+ USE_GL_FUNC(PGLFNVERTEXATTRIBS4HVNVPROC, \
+ glVertexAttribs4hvNV, NV_HALF_FLOAT, NULL) \
+ /* GL_NV_register_combiners */ \
+ USE_GL_FUNC(PGLFNCOMBINERINPUTNVPROC, \
+ glCombinerInputNV, NV_REGISTER_COMBINERS, NULL) \
+ USE_GL_FUNC(PGLFNCOMBINEROUTPUTNVPROC, \
+ glCombinerOutputNV, NV_REGISTER_COMBINERS, NULL) \
+ USE_GL_FUNC(PGLFNCOMBINERPARAMETERFNVPROC, \
+ glCombinerParameterfNV, NV_REGISTER_COMBINERS, NULL) \
+ USE_GL_FUNC(PGLFNCOMBINERPARAMETERFVNVPROC, \
+ glCombinerParameterfvNV, NV_REGISTER_COMBINERS, NULL) \
+ USE_GL_FUNC(PGLFNCOMBINERPARAMETERINVPROC, \
+ glCombinerParameteriNV, NV_REGISTER_COMBINERS, NULL) \
+ USE_GL_FUNC(PGLFNCOMBINERPARAMETERIVNVPROC, \
+ glCombinerParameterivNV, NV_REGISTER_COMBINERS, NULL) \
+ USE_GL_FUNC(PGLFNFINALCOMBINERINPUTNVPROC, \
+ glFinalCombinerInputNV, NV_REGISTER_COMBINERS, NULL) \
+ /* GLX_SGI_video_sync */ \
+ USE_GL_FUNC(PGLXFNGETVIDEOSYNCSGIPROC, \
+ glXGetVideoSyncSGI, SGI_VIDEO_SYNC, NULL) \
+ USE_GL_FUNC(PGLXFNWAITVIDEOSYNCSGIPROC, \
+ glXWaitVideoSyncSGI, SGI_VIDEO_SYNC, NULL)
#define WGL_EXT_FUNCS_GEN \
- USE_GL_FUNC(WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC, wglGetExtensionsStringARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC, wglGetPixelFormatAttribivARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC, wglGetPixelFormatAttribfvARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC, wglChoosePixelFormatARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLMAKECONTEXTCURRENTARBPROC, wglMakeContextCurrentARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLGETCURRENTREADDCARBPROC, wglGetCurrentReadDCARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLCREATEPBUFFERARBPROC, wglCreatePbufferARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLGETPBUFFERDCARBPROC, wglGetPbufferDCARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC, wglReleasePbufferDCARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLDESTROYPBUFFERARBPROC, wglDestroyPbufferARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLQUERYPBUFFERARBPROC, wglQueryPbufferARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLSETPIXELFORMATWINE, wglSetPixelFormatWINE, 0, NULL)
-
-
-/****************************************************
- * Structures
- ****************************************************/
-
-struct wined3d_fbo_ops
-{
- PGLFNGLISRENDERBUFFERPROC glIsRenderbuffer;
- PGLFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
- PGLFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
- PGLFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
- PGLFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
- PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
- PGLFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv;
- PGLFNGLISFRAMEBUFFERPROC glIsFramebuffer;
- PGLFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
- PGLFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
- PGLFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
- PGLFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
- PGLFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D;
- PGLFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
- PGLFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D;
- PGLFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
- PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv;
- PGLFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
- PGLFNGLGENERATEMIPMAPPROC glGenerateMipmap;
-};
-
-struct wined3d_gl_limits
-{
- UINT buffers;
- UINT lights;
- UINT textures;
- UINT texture_stages;
- UINT fragment_samplers;
- UINT vertex_samplers;
- UINT combined_samplers;
- UINT sampler_stages;
- UINT clipplanes;
- UINT texture_size;
- UINT texture3d_size;
- float pointsize_max;
- float pointsize_min;
- UINT point_sprite_units;
- UINT blends;
- UINT anisotropy;
- float shininess;
-
- UINT glsl_varyings;
- UINT glsl_vs_float_constants;
- UINT glsl_ps_float_constants;
-
- UINT arb_vs_float_constants;
- UINT arb_vs_native_constants;
- UINT arb_vs_instructions;
- UINT arb_vs_temps;
- UINT arb_ps_float_constants;
- UINT arb_ps_local_constants;
- UINT arb_ps_native_constants;
- UINT arb_ps_instructions;
- UINT arb_ps_temps;
-};
-
-#define USE_GL_FUNC(type, pfn, ext, replace) type pfn;
-
-struct wined3d_gl_info
-{
- UINT vidmem;
- struct wined3d_gl_limits limits;
- DWORD reserved_glsl_constants;
- DWORD quirks;
- BOOL supported[WINED3D_GL_EXT_COUNT];
- GLint wrap_lookup[WINED3DTADDRESS_MIRRORONCE - WINED3DTADDRESS_WRAP + 1];
-
- struct wined3d_fbo_ops fbo_ops;
- /* GL function pointers */
- GL_EXT_FUNCS_GEN
- /* WGL function pointers */
- WGL_EXT_FUNCS_GEN
-
- struct GlPixelFormatDesc *gl_formats;
-};
-
-#undef USE_GL_FUNC
+ USE_GL_FUNC(WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC, wglGetExtensionsStringARB, 0, NULL) \
+ USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC, wglGetPixelFormatAttribivARB, 0, NULL) \
+ USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC, wglGetPixelFormatAttribfvARB, 0, NULL) \
+ USE_GL_FUNC(WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC, wglChoosePixelFormatARB, 0, NULL) \
+ USE_GL_FUNC(WINED3D_PFNWGLCREATEPBUFFERARBPROC, wglCreatePbufferARB, 0, NULL) \
+ USE_GL_FUNC(WINED3D_PFNWGLGETPBUFFERDCARBPROC, wglGetPbufferDCARB, 0, NULL) \
+ USE_GL_FUNC(WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC, wglReleasePbufferDCARB, 0, NULL) \
+ USE_GL_FUNC(WINED3D_PFNWGLDESTROYPBUFFERARBPROC, wglDestroyPbufferARB, 0, NULL) \
+ USE_GL_FUNC(WINED3D_PFNWGLQUERYPBUFFERARBPROC, wglQueryPbufferARB, 0, NULL) \
+ USE_GL_FUNC(WINED3D_PFNWGLSETPIXELFORMATWINE, wglSetPixelFormatWINE, 0, NULL)
#endif /* __WINE_WINED3D_GL */
diff --git a/dll/directx/wine/wined3d/wined3d_private.h b/dll/directx/wine/wined3d/wined3d_private.h
index de0bcdc2c54..1d5cd974645 100644
--- a/dll/directx/wine/wined3d/wined3d_private.h
+++ b/dll/directx/wine/wined3d/wined3d_private.h
@@ -61,15 +61,16 @@ enum fixup_channel_source
CHANNEL_SOURCE_Y = 3,
CHANNEL_SOURCE_Z = 4,
CHANNEL_SOURCE_W = 5,
- CHANNEL_SOURCE_YUV0 = 6,
- CHANNEL_SOURCE_YUV1 = 7,
+ CHANNEL_SOURCE_COMPLEX0 = 6,
+ CHANNEL_SOURCE_COMPLEX1 = 7,
};
-enum yuv_fixup
+enum complex_fixup
{
- YUV_FIXUP_YUY2 = 0,
- YUV_FIXUP_UYVY = 1,
- YUV_FIXUP_YV12 = 2,
+ COMPLEX_FIXUP_YUY2 = 0,
+ COMPLEX_FIXUP_UYVY = 1,
+ COMPLEX_FIXUP_YV12 = 2,
+ COMPLEX_FIXUP_P8 = 3,
};
#include
@@ -103,14 +104,14 @@ static inline struct color_fixup_desc create_color_fixup_desc(
return fixup;
}
-static inline struct color_fixup_desc create_yuv_fixup_desc(enum yuv_fixup yuv_fixup)
+static inline struct color_fixup_desc create_complex_fixup_desc(enum complex_fixup complex_fixup)
{
struct color_fixup_desc fixup =
{
- 0, yuv_fixup & (1 << 0) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0,
- 0, yuv_fixup & (1 << 1) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0,
- 0, yuv_fixup & (1 << 2) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0,
- 0, yuv_fixup & (1 << 3) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0,
+ 0, complex_fixup & (1 << 0) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
+ 0, complex_fixup & (1 << 1) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
+ 0, complex_fixup & (1 << 2) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
+ 0, complex_fixup & (1 << 3) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
};
return fixup;
}
@@ -120,19 +121,19 @@ static inline BOOL is_identity_fixup(struct color_fixup_desc fixup)
return !memcmp(&fixup, &COLOR_FIXUP_IDENTITY, sizeof(fixup));
}
-static inline BOOL is_yuv_fixup(struct color_fixup_desc fixup)
+static inline BOOL is_complex_fixup(struct color_fixup_desc fixup)
{
- return fixup.x_source == CHANNEL_SOURCE_YUV0 || fixup.x_source == CHANNEL_SOURCE_YUV1;
+ return fixup.x_source == CHANNEL_SOURCE_COMPLEX0 || fixup.x_source == CHANNEL_SOURCE_COMPLEX1;
}
-static inline enum yuv_fixup get_yuv_fixup(struct color_fixup_desc fixup)
+static inline enum complex_fixup get_complex_fixup(struct color_fixup_desc fixup)
{
- enum yuv_fixup yuv_fixup = 0;
- if (fixup.x_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 0);
- if (fixup.y_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 1);
- if (fixup.z_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 2);
- if (fixup.w_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 3);
- return yuv_fixup;
+ enum complex_fixup complex_fixup = 0;
+ if (fixup.x_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 0);
+ if (fixup.y_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 1);
+ if (fixup.z_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 2);
+ if (fixup.w_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 3);
+ return complex_fixup;
}
void *wined3d_rb_alloc(size_t size) DECLSPEC_HIDDEN;
@@ -410,6 +411,7 @@ enum WINED3D_SHADER_INSTRUCTION_HANDLER
WINED3DSIH_CMP,
WINED3DSIH_CND,
WINED3DSIH_CRS,
+ WINED3DSIH_CUT,
WINED3DSIH_DCL,
WINED3DSIH_DEF,
WINED3DSIH_DEFB,
@@ -421,20 +423,24 @@ enum WINED3D_SHADER_INSTRUCTION_HANDLER
WINED3DSIH_DSX,
WINED3DSIH_DSY,
WINED3DSIH_ELSE,
+ WINED3DSIH_EMIT,
WINED3DSIH_ENDIF,
WINED3DSIH_ENDLOOP,
WINED3DSIH_ENDREP,
WINED3DSIH_EXP,
WINED3DSIH_EXPP,
WINED3DSIH_FRC,
+ WINED3DSIH_IADD,
WINED3DSIH_IF,
WINED3DSIH_IFC,
+ WINED3DSIH_IGE,
WINED3DSIH_LABEL,
WINED3DSIH_LIT,
WINED3DSIH_LOG,
WINED3DSIH_LOGP,
WINED3DSIH_LOOP,
WINED3DSIH_LRP,
+ WINED3DSIH_LT,
WINED3DSIH_M3x2,
WINED3DSIH_M3x3,
WINED3DSIH_M3x4,
@@ -544,6 +550,7 @@ typedef struct shader_reg_maps
struct wined3d_shader_context
{
IWineD3DBaseShader *shader;
+ const struct wined3d_gl_info *gl_info;
const struct shader_reg_maps *reg_maps;
struct wined3d_shader_buffer *buffer;
void *backend_data;
@@ -619,7 +626,7 @@ struct wined3d_shader_frontend
void (*shader_read_dst_param)(void *data, const DWORD **ptr, struct wined3d_shader_dst_param *dst_param,
struct wined3d_shader_src_param *dst_rel_addr);
void (*shader_read_semantic)(const DWORD **ptr, struct wined3d_shader_semantic *semantic);
- void (*shader_read_comment)(const DWORD **ptr, const char **comment);
+ void (*shader_read_comment)(const DWORD **ptr, const char **comment, UINT *comment_size);
BOOL (*shader_is_end)(void *data, const DWORD **ptr);
};
@@ -714,7 +721,7 @@ typedef struct {
HRESULT (*shader_alloc_private)(IWineD3DDevice *iface);
void (*shader_free_private)(IWineD3DDevice *iface);
BOOL (*shader_dirtifyable_constants)(IWineD3DDevice *iface);
- void (*shader_get_caps)(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct shader_caps *caps);
+ void (*shader_get_caps)(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;
@@ -988,8 +995,10 @@ extern glMultiTexCoordFunc multi_texcoord_funcs[WINED3D_FFP_EMIT_COUNT] DECLSPEC
#define STATE_IS_CLIPPLANE(a) ((a) >= STATE_CLIPPLANE(0) && (a) <= STATE_CLIPPLANE(MAX_CLIPPLANES - 1))
#define STATE_MATERIAL (STATE_CLIPPLANE(MAX_CLIPPLANES))
+#define STATE_IS_MATERIAL(a) ((a) == STATE_MATERIAL)
#define STATE_FRONTFACE (STATE_MATERIAL + 1)
+#define STATE_IS_FRONTFACE(a) ((a) == STATE_FRONTFACE)
#define STATE_HIGHEST (STATE_FRONTFACE)
@@ -1008,13 +1017,28 @@ struct wined3d_occlusion_query
struct wined3d_context *context;
};
+union wined3d_gl_query_object
+{
+ GLuint id;
+ GLsync sync;
+};
+
struct wined3d_event_query
{
struct list entry;
- GLuint id;
+ union wined3d_gl_query_object object;
struct wined3d_context *context;
};
+enum wined3d_event_query_result
+{
+ WINED3D_EVENT_QUERY_OK,
+ WINED3D_EVENT_QUERY_WAITING,
+ WINED3D_EVENT_QUERY_NOT_STARTED,
+ WINED3D_EVENT_QUERY_WRONG_THREAD,
+ WINED3D_EVENT_QUERY_ERROR
+};
+
struct wined3d_context
{
const struct wined3d_gl_info *gl_info;
@@ -1084,7 +1108,7 @@ struct wined3d_context
UINT free_occlusion_query_count;
struct list occlusion_queries;
- GLuint *free_event_queries;
+ union wined3d_gl_query_object *free_event_queries;
UINT free_event_query_size;
UINT free_event_query_count;
struct list event_queries;
@@ -1122,7 +1146,7 @@ struct fragment_caps
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);
+ void (*get_caps)(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);
@@ -1224,7 +1248,7 @@ typedef struct WineD3D_PixelFormat
{
int iPixelFormat; /* WGL pixel format */
int iPixelType; /* WGL pixel type e.g. WGL_TYPE_RGBA_ARB, WGL_TYPE_RGBA_FLOAT_ARB or WGL_TYPE_COLORINDEX_ARB */
- int redSize, greenSize, blueSize, alphaSize;
+ int redSize, greenSize, blueSize, alphaSize, colorSize;
int depthSize, stencilSize;
BOOL windowDrawable;
BOOL pbufferDrawable;
@@ -1233,13 +1257,23 @@ typedef struct WineD3D_PixelFormat
int numSamples;
} WineD3D_PixelFormat;
+enum wined3d_gl_vendor
+{
+ GL_VENDOR_WINE,
+ GL_VENDOR_APPLE,
+ GL_VENDOR_ATI,
+ GL_VENDOR_INTEL,
+ GL_VENDOR_MESA,
+ GL_VENDOR_NVIDIA,
+};
+
+
enum wined3d_pci_vendor
{
- VENDOR_WINE = 0x0000,
- VENDOR_MESA = 0x0001,
- VENDOR_ATI = 0x1002,
- VENDOR_NVIDIA = 0x10de,
- VENDOR_INTEL = 0x8086,
+ HW_VENDOR_WINE = 0x0000,
+ HW_VENDOR_ATI = 0x1002,
+ HW_VENDOR_NVIDIA = 0x10de,
+ HW_VENDOR_INTEL = 0x8086,
};
enum wined3d_pci_device
@@ -1323,6 +1357,85 @@ enum wined3d_pci_device
CARD_INTEL_X3100 = 0x2a02, /* Found in Macs. Same as GMA 965? */
};
+struct wined3d_fbo_ops
+{
+ PGLFNGLISRENDERBUFFERPROC glIsRenderbuffer;
+ PGLFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
+ PGLFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
+ PGLFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
+ PGLFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
+ PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
+ PGLFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv;
+ PGLFNGLISFRAMEBUFFERPROC glIsFramebuffer;
+ PGLFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
+ PGLFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
+ PGLFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
+ PGLFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
+ PGLFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D;
+ PGLFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
+ PGLFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D;
+ PGLFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
+ PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv;
+ PGLFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
+ PGLFNGLGENERATEMIPMAPPROC glGenerateMipmap;
+};
+
+struct wined3d_gl_limits
+{
+ UINT buffers;
+ UINT lights;
+ UINT textures;
+ UINT texture_stages;
+ UINT fragment_samplers;
+ UINT vertex_samplers;
+ UINT combined_samplers;
+ UINT general_combiners;
+ UINT sampler_stages;
+ UINT clipplanes;
+ UINT texture_size;
+ UINT texture3d_size;
+ float pointsize_max;
+ float pointsize_min;
+ UINT point_sprite_units;
+ UINT blends;
+ UINT anisotropy;
+ float shininess;
+
+ UINT glsl_varyings;
+ UINT glsl_vs_float_constants;
+ UINT glsl_ps_float_constants;
+
+ UINT arb_vs_float_constants;
+ UINT arb_vs_native_constants;
+ UINT arb_vs_instructions;
+ UINT arb_vs_temps;
+ UINT arb_ps_float_constants;
+ UINT arb_ps_local_constants;
+ UINT arb_ps_native_constants;
+ UINT arb_ps_instructions;
+ UINT arb_ps_temps;
+};
+
+struct wined3d_gl_info
+{
+ UINT vidmem;
+ struct wined3d_gl_limits limits;
+ DWORD reserved_glsl_constants;
+ DWORD quirks;
+ BOOL supported[WINED3D_GL_EXT_COUNT];
+ GLint wrap_lookup[WINED3DTADDRESS_MIRRORONCE - WINED3DTADDRESS_WRAP + 1];
+
+ struct wined3d_fbo_ops fbo_ops;
+#define USE_GL_FUNC(type, pfn, ext, replace) type pfn;
+ /* GL function pointers */
+ GL_EXT_FUNCS_GEN
+ /* WGL function pointers */
+ WGL_EXT_FUNCS_GEN
+#undef USE_GL_FUNC
+
+ struct GlPixelFormatDesc *gl_formats;
+};
+
struct wined3d_driver_info
{
enum wined3d_pci_vendor vendor;
@@ -1348,6 +1461,10 @@ struct wined3d_adapter
unsigned int TextureRam; /* Amount of texture memory both video ram + AGP/TurboCache/HyperMemory/.. */
unsigned int UsedTextureRam;
LUID luid;
+
+ const struct fragment_pipeline *fragment_pipe;
+ const shader_backend_t *shader_backend;
+ const struct blit_shader *blitter;
};
BOOL initPixelFormats(struct wined3d_gl_info *gl_info, enum wined3d_pci_vendor vendor) DECLSPEC_HIDDEN;
@@ -1497,7 +1614,7 @@ struct IWineD3DDeviceImpl
const struct fragment_pipeline *frag_pipe;
const struct blit_shader *blitter;
- unsigned int max_ffp_textures, max_ffp_texture_stages;
+ unsigned int max_ffp_textures;
DWORD d3d_vshader_constantF, d3d_pshader_constantF; /* Advertised d3d caps, not GL ones */
DWORD vs_clipping;
@@ -1547,7 +1664,6 @@ struct IWineD3DDeviceImpl
UINT NumberOfPalettes;
PALETTEENTRY **palettes;
UINT currentPalette;
- UINT paletteConversionShader;
/* For rendering to a texture using glCopyTexImage */
GLenum *draw_buffers;
@@ -1602,14 +1718,14 @@ struct IWineD3DDeviceImpl
HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
UINT adapter_idx, WINED3DDEVTYPE device_type, HWND focus_window, DWORD flags,
IUnknown *parent, IWineD3DDeviceParent *device_parent) DECLSPEC_HIDDEN;
+void device_preload_textures(IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
LRESULT device_process_message(IWineD3DDeviceImpl *device, HWND window,
UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc) DECLSPEC_HIDDEN;
void device_resource_add(IWineD3DDeviceImpl *This, IWineD3DResource *resource) DECLSPEC_HIDDEN;
void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resource) DECLSPEC_HIDDEN;
void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
BOOL use_vshader, struct wined3d_stream_info *stream_info, BOOL *fixup) DECLSPEC_HIDDEN;
-void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info,
- const struct WineDirect3DVertexStridedData *strided, struct wined3d_stream_info *stream_info) DECLSPEC_HIDDEN;
+void device_update_stream_info(IWineD3DDeviceImpl *device, const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, DWORD Count,
const WINED3DRECT *pRects, DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil) DECLSPEC_HIDDEN;
void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) DECLSPEC_HIDDEN;
@@ -1745,6 +1861,7 @@ typedef struct IWineD3DBaseTextureClass
void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb) DECLSPEC_HIDDEN;
BOOL surface_init_sysmem(IWineD3DSurface *iface) DECLSPEC_HIDDEN;
BOOL surface_is_offscreen(IWineD3DSurface *iface) DECLSPEC_HIDDEN;
+void surface_prepare_texture(IWineD3DSurfaceImpl *surface, BOOL srgb) DECLSPEC_HIDDEN;
typedef struct IWineD3DBaseTextureImpl
{
@@ -2342,9 +2459,8 @@ typedef struct IWineD3DQueryImpl
void *extendedData;
} IWineD3DQueryImpl;
-extern const IWineD3DQueryVtbl IWineD3DQuery_Vtbl DECLSPEC_HIDDEN;
-extern const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl DECLSPEC_HIDDEN;
-extern const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl DECLSPEC_HIDDEN;
+HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device,
+ WINED3DQUERYTYPE type, IUnknown *parent) DECLSPEC_HIDDEN;
/* IWineD3DBuffer */
@@ -2495,6 +2611,7 @@ const char *debug_d3ddeclusage(BYTE usage) DECLSPEC_HIDDEN;
const char *debug_d3dprimitivetype(WINED3DPRIMITIVETYPE PrimitiveType) DECLSPEC_HIDDEN;
const char *debug_d3drenderstate(DWORD state) DECLSPEC_HIDDEN;
const char *debug_d3dsamplerstate(DWORD state) DECLSPEC_HIDDEN;
+const char *debug_d3dstate(DWORD state) DECLSPEC_HIDDEN;
const char *debug_d3dtexturefiltertype(WINED3DTEXTUREFILTERTYPE filter_type) DECLSPEC_HIDDEN;
const char *debug_d3dtexturestate(DWORD state) DECLSPEC_HIDDEN;
const char *debug_d3dtstype(WINED3DTRANSFORMSTATETYPE tstype) DECLSPEC_HIDDEN;
@@ -2552,12 +2669,6 @@ void multiply_matrix(WINED3DMATRIX *dest, const WINED3DMATRIX *src1, const WINED
UINT wined3d_log2i(UINT32 x) DECLSPEC_HIDDEN;
unsigned int count_bits(unsigned int mask) DECLSPEC_HIDDEN;
-const struct blit_shader *select_blit_implementation(struct wined3d_adapter *adapter,
- WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN;
-const struct fragment_pipeline *select_fragment_implementation(struct wined3d_adapter *adapter,
- WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN;
-const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter,
- WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN;
void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected, int *vs_selected) DECLSPEC_HIDDEN;
typedef struct local_constant {
@@ -2601,8 +2712,6 @@ int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *fmt, va_li
extern BOOL vshader_get_input(IWineD3DVertexShader *iface,
BYTE usage_req, BYTE usage_idx_req, unsigned int *regnum) DECLSPEC_HIDDEN;
-extern HRESULT allocate_shader_constants(IWineD3DStateBlockImpl* object) DECLSPEC_HIDDEN;
-
/*****************************************************************************
* IDirect3DBaseShader implementation structure
*/
@@ -2651,7 +2760,6 @@ typedef struct IWineD3DBaseShaderImpl {
void shader_buffer_clear(struct wined3d_shader_buffer *buffer) DECLSPEC_HIDDEN;
BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer) DECLSPEC_HIDDEN;
void shader_buffer_free(struct wined3d_shader_buffer *buffer) DECLSPEC_HIDDEN;
-void shader_cleanup(IWineD3DBaseShader *iface) DECLSPEC_HIDDEN;
void shader_dump_src_param(const struct wined3d_shader_src_param *param,
const struct wined3d_shader_version *shader_version) DECLSPEC_HIDDEN;
void shader_dump_dst_param(const struct wined3d_shader_dst_param *param,
@@ -2659,16 +2767,7 @@ void shader_dump_dst_param(const struct wined3d_shader_dst_param *param,
unsigned int shader_find_free_input_register(const struct shader_reg_maps *reg_maps, unsigned int max) DECLSPEC_HIDDEN;
void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffer *buffer,
const shader_reg_maps *reg_maps, const DWORD *pFunction, void *backend_ctx) DECLSPEC_HIDDEN;
-HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3d_shader_frontend *fe,
- struct shader_reg_maps *reg_maps, struct wined3d_shader_signature_element *input_signature,
- struct wined3d_shader_signature_element *output_signature,
- const DWORD *byte_code, DWORD constf_size) DECLSPEC_HIDDEN;
-void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device,
- IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
BOOL shader_match_semantic(const char *semantic_name, WINED3DDECLUSAGE usage) DECLSPEC_HIDDEN;
-const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token) DECLSPEC_HIDDEN;
-void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *pFunction) DECLSPEC_HIDDEN;
-WINED3DDECLUSAGE shader_usage_from_semantic_name(const char *semantic_name) DECLSPEC_HIDDEN;
static inline BOOL shader_is_pshader_version(enum wined3d_shader_type type)
{
diff --git a/dll/win32/actxprxy/actxprxy.rbuild b/dll/win32/actxprxy/actxprxy.rbuild
index 87a50a17c83..f5272b585cf 100644
--- a/dll/win32/actxprxy/actxprxy.rbuild
+++ b/dll/win32/actxprxy/actxprxy.rbuild
@@ -9,20 +9,29 @@
.
wine
- actxprxy_interface
actxprxy_proxy
ntdll
rpcrt4
+ ole32
+ oleaut32
+ uuid
pseh
usrmarshal.c
-
- actxprxy_servprov.idl
-
- "{ 0xb8da6310, 0xe19b, 0x11d0, { 0x93, 0x3c, 0x00, 0xa0, 0xc9, 0x0d, 0xca, 0xa9 } }"
+
+ actxprxy_activscp.idl
+ actxprxy_comcat.idl
+ actxprxy_docobj.idl
+ actxprxy_hlink.idl
+ actxprxy_htiframe.idl
+ actxprxy_objsafe.idl
+ actxprxy_ocmm.idl
actxprxy_servprov.idl
+
+ actxprxy_urlhist.idl
+
diff --git a/base/system/msiexec/version.rc b/dll/win32/actxprxy/actxprxy_activscp.idl
similarity index 64%
rename from base/system/msiexec/version.rc
rename to dll/win32/actxprxy/actxprxy_activscp.idl
index 077759431e2..c056a0ebd15 100644
--- a/base/system/msiexec/version.rc
+++ b/dll/win32/actxprxy/actxprxy_activscp.idl
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004 Mike McCormack
+ * Copyright 2009 Alexandre Julliard
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -16,13 +16,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#define WINE_FILEDESCRIPTION_STR "Wine Installer"
-#define WINE_FILENAME_STR "msiexec.exe"
-#define WINE_FILETYPE VFT_APP
-#define WINE_FILEVERSION 3,1,4000,1823
-#define WINE_FILEVERSION_STR "3.1.4000.1823"
-#define WINE_PRODUCTVERSION 3,1,4000,1823
-#define WINE_PRODUCTVERSION_STR "3.1.4000.1823"
-#define WINE_PRODUCTNAME_STR "Wine Installer"
+/* just a wrapper for activscp.idl */
-#include "wine/wine_common_ver.rc"
+#include "activscp.idl"
diff --git a/dll/win32/actxprxy/actxprxy_comcat.idl b/dll/win32/actxprxy/actxprxy_comcat.idl
new file mode 100644
index 00000000000..6c8155fe29f
--- /dev/null
+++ b/dll/win32/actxprxy/actxprxy_comcat.idl
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2009 Alexandre Julliard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* just a wrapper for comcat.idl */
+
+#include "comcat.idl"
diff --git a/dll/win32/actxprxy/actxprxy_docobj.idl b/dll/win32/actxprxy/actxprxy_docobj.idl
new file mode 100644
index 00000000000..711c3851e3d
--- /dev/null
+++ b/dll/win32/actxprxy/actxprxy_docobj.idl
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2009 Alexandre Julliard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* just a wrapper for docobj.idl */
+
+#include "docobj.idl"
diff --git a/dll/win32/actxprxy/actxprxy_hlink.idl b/dll/win32/actxprxy/actxprxy_hlink.idl
new file mode 100644
index 00000000000..820967d2de4
--- /dev/null
+++ b/dll/win32/actxprxy/actxprxy_hlink.idl
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2009 Alexandre Julliard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* just a wrapper for hlink.idl */
+
+#include "hlink.idl"
diff --git a/dll/win32/actxprxy/actxprxy_htiframe.idl b/dll/win32/actxprxy/actxprxy_htiframe.idl
new file mode 100644
index 00000000000..146b0a2e4c6
--- /dev/null
+++ b/dll/win32/actxprxy/actxprxy_htiframe.idl
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2009 Alexandre Julliard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* just a wrapper for htiframe.idl */
+
+#include "htiframe.idl"
diff --git a/dll/win32/actxprxy/actxprxy_objsafe.idl b/dll/win32/actxprxy/actxprxy_objsafe.idl
new file mode 100644
index 00000000000..67e878b69cd
--- /dev/null
+++ b/dll/win32/actxprxy/actxprxy_objsafe.idl
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2009 Alexandre Julliard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* just a wrapper for objsafe.idl */
+
+#include "objsafe.idl"
diff --git a/dll/win32/actxprxy/actxprxy_ocmm.idl b/dll/win32/actxprxy/actxprxy_ocmm.idl
new file mode 100644
index 00000000000..2df49ce8995
--- /dev/null
+++ b/dll/win32/actxprxy/actxprxy_ocmm.idl
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2009 Alexandre Julliard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* just a wrapper for ocmm.idl */
+
+#include "ocmm.idl"
diff --git a/dll/win32/actxprxy/actxprxy_shobjidl.idl b/dll/win32/actxprxy/actxprxy_shobjidl.idl
new file mode 100644
index 00000000000..71912fd0eb4
--- /dev/null
+++ b/dll/win32/actxprxy/actxprxy_shobjidl.idl
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2009 Alexandre Julliard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* just a wrapper for shobjidl.idl */
+
+#include "shobjidl.idl"
diff --git a/dll/win32/actxprxy/actxprxy_urlhist.idl b/dll/win32/actxprxy/actxprxy_urlhist.idl
new file mode 100644
index 00000000000..18861b3a713
--- /dev/null
+++ b/dll/win32/actxprxy/actxprxy_urlhist.idl
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2009 Alexandre Julliard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* just a wrapper for urlhist.idl */
+
+#include "urlhist.idl"
diff --git a/dll/win32/actxprxy/usrmarshal.c b/dll/win32/actxprxy/usrmarshal.c
index 9d5318fcec5..f2aacf85a30 100644
--- a/dll/win32/actxprxy/usrmarshal.c
+++ b/dll/win32/actxprxy/usrmarshal.c
@@ -32,6 +32,8 @@
#include "winerror.h"
#include "objbase.h"
#include "servprov.h"
+#include "comcat.h"
+#include "docobj.h"
#include "wine/debug.h"
@@ -62,3 +64,107 @@ HRESULT __RPC_STUB IServiceProvider_QueryService_Stub(
return IServiceProvider_QueryService(This, guidService, riid,
(void **)ppvObject);
}
+
+HRESULT CALLBACK ICatInformation_EnumClassesOfCategories_Proxy(
+ ICatInformation *This,
+ ULONG cImplemented,
+ CATID rgcatidImpl[],
+ ULONG cRequired,
+ CATID rgcatidReq[],
+ IEnumCLSID** ppenumClsid )
+{
+ TRACE("(%p)\n", This);
+ return ICatInformation_RemoteEnumClassesOfCategories_Proxy( This, cImplemented, rgcatidImpl,
+ cRequired, rgcatidReq, ppenumClsid );
+}
+
+HRESULT __RPC_STUB ICatInformation_EnumClassesOfCategories_Stub(
+ ICatInformation *This,
+ ULONG cImplemented,
+ CATID rgcatidImpl[],
+ ULONG cRequired,
+ CATID rgcatidReq[],
+ IEnumCLSID** ppenumClsid )
+{
+ TRACE("(%p)\n", This);
+ return ICatInformation_EnumClassesOfCategories( This, cImplemented, rgcatidImpl,
+ cRequired, rgcatidReq, ppenumClsid );
+}
+
+HRESULT CALLBACK ICatInformation_IsClassOfCategories_Proxy(
+ ICatInformation *This,
+ REFCLSID rclsid,
+ ULONG cImplemented,
+ CATID rgcatidImpl[],
+ ULONG cRequired,
+ CATID rgcatidReq[] )
+{
+ TRACE("(%p)\n", This);
+ return ICatInformation_RemoteIsClassOfCategories_Proxy( This, rclsid, cImplemented, rgcatidImpl,
+ cRequired, rgcatidReq );
+}
+
+HRESULT __RPC_STUB ICatInformation_IsClassOfCategories_Stub(
+ ICatInformation *This,
+ REFCLSID rclsid,
+ ULONG cImplemented,
+ CATID rgcatidImpl[],
+ ULONG cRequired,
+ CATID rgcatidReq[] )
+{
+ TRACE("(%p)\n", This);
+ return ICatInformation_IsClassOfCategories( This, rclsid, cImplemented, rgcatidImpl,
+ cRequired, rgcatidReq );
+}
+
+HRESULT CALLBACK IPrint_Print_Proxy(
+ IPrint *This,
+ DWORD grfFlags,
+ DVTARGETDEVICE **pptd,
+ PAGESET **ppPageSet,
+ STGMEDIUM *pstgmOptions,
+ IContinueCallback *pcallback,
+ LONG nFirstPage,
+ LONG *pcPagesPrinted,
+ LONG *pnLastPage )
+{
+ TRACE("(%p)\n", This);
+ return IPrint_RemotePrint_Proxy( This, grfFlags, pptd, ppPageSet, (RemSTGMEDIUM *)pstgmOptions,
+ pcallback, nFirstPage, pcPagesPrinted, pnLastPage );
+}
+
+HRESULT __RPC_STUB IPrint_Print_Stub(
+ IPrint *This,
+ DWORD grfFlags,
+ DVTARGETDEVICE **pptd,
+ PAGESET **ppPageSet,
+ RemSTGMEDIUM *pstgmOptions,
+ IContinueCallback *pcallback,
+ LONG nFirstPage,
+ LONG *pcPagesPrinted,
+ LONG *pnLastPage )
+{
+ TRACE("(%p)\n", This);
+ return IPrint_Print( This, grfFlags, pptd, ppPageSet, (STGMEDIUM *)pstgmOptions,
+ pcallback, nFirstPage, pcPagesPrinted, pnLastPage );
+}
+
+HRESULT CALLBACK IEnumOleDocumentViews_Next_Proxy(
+ IEnumOleDocumentViews *This,
+ ULONG cViews,
+ IOleDocumentView **rgpView,
+ ULONG *pcFetched )
+{
+ TRACE("(%p)\n", This);
+ return IEnumOleDocumentViews_RemoteNext_Proxy( This, cViews, rgpView, pcFetched );
+}
+
+HRESULT __RPC_STUB IEnumOleDocumentViews_Next_Stub(
+ IEnumOleDocumentViews *This,
+ ULONG cViews,
+ IOleDocumentView **rgpView,
+ ULONG *pcFetched )
+{
+ TRACE("(%p)\n", This);
+ return IEnumOleDocumentViews_Next( This, cViews, rgpView, pcFetched );
+}
diff --git a/dll/win32/advapi32/service/sctrl.c b/dll/win32/advapi32/service/sctrl.c
index 3094951b911..ca6f1648fe0 100644
--- a/dll/win32/advapi32/service/sctrl.c
+++ b/dll/win32/advapi32/service/sctrl.c
@@ -22,7 +22,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(advapi);
typedef struct _ACTIVE_SERVICE
{
- CLIENT_HANDLE hService;
+ SERVICE_STATUS_HANDLE hServiceStatus;
UNICODE_STRING ServiceName;
union
{
@@ -32,7 +32,6 @@ typedef struct _ACTIVE_SERVICE
LPHANDLER_FUNCTION HandlerFunction;
LPHANDLER_FUNCTION_EX HandlerFunctionEx;
LPVOID HandlerContext;
- SERVICE_STATUS ServiceStatus;
BOOL bUnicode;
LPWSTR Arguments;
} ACTIVE_SERVICE, *PACTIVE_SERVICE;
@@ -199,6 +198,7 @@ ScConnectControlPipe(HANDLE *hPipe)
NTSTATUS Status;
WCHAR NtControlPipeName[MAX_PATH + 1];
RTL_QUERY_REGISTRY_TABLE QueryTable[2];
+ DWORD dwProcessId;
/* Get the service number and create the named pipe */
RtlZeroMemory(&QueryTable,
@@ -249,37 +249,34 @@ ScConnectControlPipe(HANDLE *hPipe)
return ERROR_FAILED_SERVICE_CONTROLLER_CONNECT;
}
- /* Share the SERVICE_HANDLE handle with the SCM */
+ /* Pass the ProcessId to the SCM */
+ dwProcessId = GetCurrentProcessId();
WriteFile(*hPipe,
- (DWORD *)&lpActiveServices->hService,
- sizeof(CLIENT_HANDLE),
+ &dwProcessId,
+ sizeof(DWORD),
&dwBytesWritten,
NULL);
- TRACE("Sent SERVICE_HANDLE %lu\n", lpActiveServices->hService);
+ TRACE("Sent Process ID %lu\n", dwProcessId);
+
return ERROR_SUCCESS;
}
static DWORD
-ScStartService(PSCM_CONTROL_PACKET ControlPacket)
+ScStartService(PACTIVE_SERVICE lpService,
+ PSCM_CONTROL_PACKET ControlPacket)
{
- PACTIVE_SERVICE lpService;
HANDLE ThreadHandle;
DWORD ThreadId;
TRACE("ScStartService() called\n");
- TRACE("client handle: %lu\n", ControlPacket->hClient);
TRACE("Size: %lu\n", ControlPacket->dwSize);
TRACE("Service: %S\n", &ControlPacket->szArguments[0]);
- lpService = (PACTIVE_SERVICE)ControlPacket->hClient;
- if (lpService == NULL)
- {
- TRACE("Service not found\n");
- return ERROR_SERVICE_DOES_NOT_EXIST;
- }
+ /* Set the service status handle */
+ lpService->hServiceStatus = ControlPacket->hServiceStatus;
lpService->Arguments = HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY,
@@ -309,21 +306,13 @@ ScStartService(PSCM_CONTROL_PACKET ControlPacket)
static DWORD
-ScControlService(PSCM_CONTROL_PACKET ControlPacket)
+ScControlService(PACTIVE_SERVICE lpService,
+ PSCM_CONTROL_PACKET ControlPacket)
{
- PACTIVE_SERVICE lpService;
-
TRACE("ScControlService() called\n");
TRACE("Size: %lu\n", ControlPacket->dwSize);
TRACE("Service: %S\n", &ControlPacket->szArguments[0]);
- lpService = (PACTIVE_SERVICE)ControlPacket->hClient;
- if (lpService == NULL)
- {
- TRACE("Service not found\n");
- return ERROR_SERVICE_DOES_NOT_EXIST;
- }
-
if (lpService->HandlerFunction)
{
(lpService->HandlerFunction)(ControlPacket->dwControl);
@@ -356,6 +345,10 @@ ScServiceDispatcher(HANDLE hPipe,
DWORD Count;
BOOL bResult;
DWORD dwRunningServices = 0;
+ LPWSTR lpServiceName;
+ PACTIVE_SERVICE lpService;
+ SCM_REPLY_PACKET ReplyPacket;
+ DWORD dwError;
TRACE("ScDispatcherLoop() called\n");
@@ -379,25 +372,52 @@ ScServiceDispatcher(HANDLE hPipe,
return FALSE;
}
- /* Execute command */
- switch (ControlPacket->dwControl)
+ lpServiceName = &ControlPacket->szArguments[0];
+ TRACE("Service: %S\n", lpServiceName);
+
+ lpService = ScLookupServiceByServiceName(lpServiceName);
+ if (lpService != NULL)
{
- case SERVICE_CONTROL_START:
- TRACE("Start command - recieved SERVICE_CONTROL_START\n");
- if (ScStartService(ControlPacket) == ERROR_SUCCESS)
- dwRunningServices++;
- break;
+ /* Execute command */
+ switch (ControlPacket->dwControl)
+ {
+ case SERVICE_CONTROL_START:
+ TRACE("Start command - recieved SERVICE_CONTROL_START\n");
+ dwError = ScStartService(lpService, ControlPacket);
+ if (dwError == ERROR_SUCCESS)
+ dwRunningServices++;
+ break;
- case SERVICE_CONTROL_STOP:
- TRACE("Stop command - recieved SERVICE_CONTROL_STOP\n");
- if (ScControlService(ControlPacket) == ERROR_SUCCESS)
- dwRunningServices--;
- break;
+ case SERVICE_CONTROL_STOP:
+ TRACE("Stop command - recieved SERVICE_CONTROL_STOP\n");
+ dwError = ScControlService(lpService, ControlPacket);
+ if (dwError == ERROR_SUCCESS)
+ dwRunningServices--;
+ break;
- default:
- TRACE("Command %lu received", ControlPacket->dwControl);
- ScControlService(ControlPacket);
- continue;
+ default:
+ TRACE("Command %lu received", ControlPacket->dwControl);
+ dwError = ScControlService(lpService, ControlPacket);
+ break;
+ }
+ }
+ else
+ {
+ dwError = ERROR_NOT_FOUND;
+ }
+
+ ReplyPacket.dwError = dwError;
+
+ /* Send the reply packet */
+ bResult = WriteFile(hPipe,
+ &ReplyPacket,
+ sizeof(ReplyPacket),
+ &Count,
+ NULL);
+ if (bResult == FALSE)
+ {
+ ERR("Pipe write failed (Error: %lu)\n", GetLastError());
+ return FALSE;
}
if (dwRunningServices == 0)
@@ -461,9 +481,9 @@ RegisterServiceCtrlHandlerW(LPCWSTR lpServiceName,
Service->HandlerFunction = lpHandlerProc;
Service->HandlerFunctionEx = NULL;
- TRACE("RegisterServiceCtrlHandler returning %lu\n", Service->hService);
+ TRACE("RegisterServiceCtrlHandler returning %lu\n", Service->hServiceStatus);
- return (SERVICE_STATUS_HANDLE)Service->hService;
+ return Service->hServiceStatus;
}
@@ -520,9 +540,9 @@ RegisterServiceCtrlHandlerExW(LPCWSTR lpServiceName,
Service->HandlerFunctionEx = lpHandlerProc;
Service->HandlerContext = lpContext;
- TRACE("RegisterServiceCtrlHandlerEx returning %lu\n", Service->hService);
+ TRACE("RegisterServiceCtrlHandlerEx returning %lu\n", Service->hServiceStatus);
- return (SERVICE_STATUS_HANDLE)Service->hService;
+ return Service->hServiceStatus;
}
@@ -631,9 +651,18 @@ SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus,
TRACE("SetServiceStatus() called\n");
TRACE("hServiceStatus %lu\n", hServiceStatus);
- /* Call to services.exe using RPC */
- dwError = RSetServiceStatus((RPC_SERVICE_STATUS_HANDLE)hServiceStatus,
- lpServiceStatus);
+ RpcTryExcept
+ {
+ /* Call to services.exe using RPC */
+ dwError = RSetServiceStatus((RPC_SERVICE_STATUS_HANDLE)hServiceStatus,
+ lpServiceStatus);
+ }
+ RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+ {
+ dwError = ScmRpcStatusToWinError(RpcExceptionCode());
+ }
+ RpcEndExcept;
+
if (dwError != ERROR_SUCCESS)
{
ERR("ScmrSetServiceStatus() failed (Error %lu)\n", dwError);
@@ -683,7 +712,7 @@ StartServiceCtrlDispatcherA(const SERVICE_TABLE_ENTRYA * lpServiceStartTable)
RtlCreateUnicodeStringFromAsciiz(&lpActiveServices[i].ServiceName,
lpServiceStartTable[i].lpServiceName);
lpActiveServices[i].Main.lpFuncA = lpServiceStartTable[i].lpServiceProc;
- lpActiveServices[i].hService = (CLIENT_HANDLE)&lpActiveServices[i];
+ lpActiveServices[i].hServiceStatus = 0;
lpActiveServices[i].bUnicode = FALSE;
}
@@ -773,7 +802,7 @@ StartServiceCtrlDispatcherW(const SERVICE_TABLE_ENTRYW * lpServiceStartTable)
RtlCreateUnicodeString(&lpActiveServices[i].ServiceName,
lpServiceStartTable[i].lpServiceName);
lpActiveServices[i].Main.lpFuncW = lpServiceStartTable[i].lpServiceProc;
- lpActiveServices[i].hService = (CLIENT_HANDLE)&lpActiveServices[i];
+ lpActiveServices[i].hServiceStatus = 0;
lpActiveServices[i].bUnicode = TRUE;
}
diff --git a/dll/win32/atl/atl_ax.c b/dll/win32/atl/atl_ax.c
index da595a4e24b..2afc7460328 100644
--- a/dll/win32/atl/atl_ax.c
+++ b/dll/win32/atl/atl_ax.c
@@ -1208,7 +1208,7 @@ HWND WINAPI AtlAxCreateDialogA(HINSTANCE hInst, LPCSTR name, HWND owner, DLGPROC
int length;
WCHAR *nameW;
- if ( HIWORD(name) == 0 )
+ if (IS_INTRESOURCE(name))
return AtlAxCreateDialogW( hInst, (LPCWSTR) name, owner, dlgProc, param );
length = MultiByteToWideChar( CP_ACP, 0, name, -1, NULL, 0 );
diff --git a/dll/win32/atl/atl_main.c b/dll/win32/atl/atl_main.c
index 374b0d26f24..75f9a11116c 100644
--- a/dll/win32/atl/atl_main.c
+++ b/dll/win32/atl/atl_main.c
@@ -97,6 +97,19 @@ HRESULT WINAPI AtlModuleInit(_ATL_MODULEW* pM, _ATL_OBJMAP_ENTRYW* p, HINSTANCE
return S_OK;
}
+static _ATL_OBJMAP_ENTRYW_V1 *get_objmap_entry( _ATL_MODULEW *mod, unsigned int index )
+{
+ _ATL_OBJMAP_ENTRYW_V1 *ret;
+
+ if (mod->cbSize == ATLVer1Size)
+ ret = (_ATL_OBJMAP_ENTRYW_V1 *)mod->m_pObjMap + index;
+ else
+ ret = (_ATL_OBJMAP_ENTRYW_V1 *)(mod->m_pObjMap + index);
+
+ if (!ret->pclsid) ret = NULL;
+ return ret;
+}
+
HRESULT WINAPI AtlModuleLoadTypeLib(_ATL_MODULEW *pM, LPCOLESTR lpszIndex,
BSTR *pbstrPath, ITypeLib **ppTypeLib)
{
@@ -158,6 +171,7 @@ HRESULT WINAPI AtlModuleAddTermFunc(_ATL_MODULEW *pM, _ATL_TERMFUNC *pFunc, DWOR
HRESULT WINAPI AtlModuleRegisterClassObjects(_ATL_MODULEW *pM, DWORD dwClsContext,
DWORD dwFlags)
{
+ _ATL_OBJMAP_ENTRYW_V1 *obj;
HRESULT hRes = S_OK;
int i=0;
@@ -166,10 +180,9 @@ HRESULT WINAPI AtlModuleRegisterClassObjects(_ATL_MODULEW *pM, DWORD dwClsContex
if (pM == NULL)
return E_INVALIDARG;
- while(pM->m_pObjMap[i].pclsid != NULL)
+ while ((obj = get_objmap_entry( pM, i++ )))
{
IUnknown* pUnknown;
- _ATL_OBJMAP_ENTRYW *obj = &(pM->m_pObjMap[i]);
HRESULT rc;
TRACE("Registering object %i\n",i);
@@ -185,7 +198,6 @@ HRESULT WINAPI AtlModuleRegisterClassObjects(_ATL_MODULEW *pM, DWORD dwClsContex
IUnknown_Release(pUnknown);
}
}
- i++;
}
return hRes;
@@ -269,6 +281,7 @@ HRESULT WINAPI AtlInternalQueryInterface(void* this, const _ATL_INTMAP_ENTRY* pE
*/
HRESULT WINAPI AtlModuleRegisterServer(_ATL_MODULEW* pM, BOOL bRegTypeLib, const CLSID* clsid)
{
+ const _ATL_OBJMAP_ENTRYW_V1 *obj;
int i;
HRESULT hRes;
@@ -277,12 +290,10 @@ HRESULT WINAPI AtlModuleRegisterServer(_ATL_MODULEW* pM, BOOL bRegTypeLib, const
if (pM == NULL)
return E_INVALIDARG;
- for (i = 0; pM->m_pObjMap[i].pclsid != NULL; i++) /* register CLSIDs */
+ for (i = 0; (obj = get_objmap_entry( pM, i )) != NULL; i++) /* register CLSIDs */
{
- if (!clsid || IsEqualCLSID(pM->m_pObjMap[i].pclsid, clsid))
+ if (!clsid || IsEqualCLSID(obj->pclsid, clsid))
{
- const _ATL_OBJMAP_ENTRYW *obj = &pM->m_pObjMap[i];
-
TRACE("Registering clsid %s\n", debugstr_guid(obj->pclsid));
hRes = obj->pfnUpdateRegistry(TRUE); /* register */
if (FAILED(hRes))
@@ -351,6 +362,7 @@ HRESULT WINAPI AtlUnmarshalPtr(IStream *stm, const IID *iid, IUnknown **ppUnk)
HRESULT WINAPI AtlModuleGetClassObject(_ATL_MODULEW *pm, REFCLSID rclsid,
REFIID riid, LPVOID *ppv)
{
+ _ATL_OBJMAP_ENTRYW_V1 *obj;
int i;
HRESULT hres = CLASS_E_CLASSNOTAVAILABLE;
@@ -359,12 +371,10 @@ HRESULT WINAPI AtlModuleGetClassObject(_ATL_MODULEW *pm, REFCLSID rclsid,
if (pm == NULL)
return E_INVALIDARG;
- for (i = 0; pm->m_pObjMap[i].pclsid != NULL; i++)
+ for (i = 0; (obj = get_objmap_entry( pm, i )) != NULL; i++)
{
- if (IsEqualCLSID(pm->m_pObjMap[i].pclsid, rclsid))
+ if (IsEqualCLSID(obj->pclsid, rclsid))
{
- _ATL_OBJMAP_ENTRYW *obj = &pm->m_pObjMap[i];
-
TRACE("found object %i\n", i);
if (obj->pfnGetClassObject)
{
diff --git a/dll/win32/atl/atlbase.h b/dll/win32/atl/atlbase.h
index 49c13e439a3..59cdddf1b77 100644
--- a/dll/win32/atl/atlbase.h
+++ b/dll/win32/atl/atlbase.h
@@ -33,6 +33,28 @@ typedef LPCWSTR (WINAPI _ATL_DESCRIPTIONFUNCW)(void);
typedef const struct _ATL_CATMAP_ENTRY* (_ATL_CATMAPFUNC)(void);
typedef void (WINAPI _ATL_TERMFUNC)(DWORD dw);
+typedef struct _ATL_OBJMAP_ENTRYA_V1_TAG
+{
+ const CLSID* pclsid;
+ HRESULT (WINAPI *pfnUpdateRegistry)(BOOL bRegister);
+ _ATL_CREATORFUNC* pfnGetClassObject;
+ _ATL_CREATORFUNC* pfnCreateInstance;
+ IUnknown* pCF;
+ DWORD dwRegister;
+ _ATL_DESCRIPTIONFUNCA* pfnGetObjectDescription;
+}_ATL_OBJMAP_ENTRYA_V1;
+
+typedef struct _ATL_OBJMAP_ENTRYW_V1_TAG
+{
+ const CLSID* pclsid;
+ HRESULT (WINAPI *pfnUpdateRegistry)(BOOL bRegister);
+ _ATL_CREATORFUNC* pfnGetClassObject;
+ _ATL_CREATORFUNC* pfnCreateInstance;
+ IUnknown* pCF;
+ DWORD dwRegister;
+ _ATL_DESCRIPTIONFUNCW* pfnGetObjectDescription;
+} _ATL_OBJMAP_ENTRYW_V1;
+
typedef struct _ATL_OBJMAP_ENTRYA_TAG
{
const CLSID* pclsid;
diff --git a/dll/win32/atl/registrar.c b/dll/win32/atl/registrar.c
index b2efda989ad..70c1384ca9b 100644
--- a/dll/win32/atl/registrar.c
+++ b/dll/win32/atl/registrar.c
@@ -758,39 +758,44 @@ static HRESULT do_register_dll_server(IRegistrar *pRegistrar, LPCOLESTR wszDll,
LPCOLESTR wszId, BOOL do_register,
const struct _ATL_REGMAP_ENTRY* pMapEntries)
{
- WCHAR buf[MAX_PATH];
+ IRegistrar *registrar;
HRESULT hres;
const struct _ATL_REGMAP_ENTRY *pMapEntry;
static const WCHAR wszModule[] = {'M','O','D','U','L','E',0};
static const WCHAR wszRegistry[] = {'R','E','G','I','S','T','R','Y',0};
- static const WCHAR wszCLSID_ATLRegistrar[] =
- {'C','L','S','I','D','_','A','T','L','R','e','g','i','s','t','r','a','r',0};
- if (!pRegistrar)
- Registrar_create(NULL, &IID_IRegistrar, (void**)&pRegistrar);
+ if (pRegistrar)
+ registrar = pRegistrar;
+ else
+ Registrar_create(NULL, &IID_IRegistrar, (void**)®istrar);
- IRegistrar_AddReplacement(pRegistrar, wszModule, wszDll);
+ IRegistrar_AddReplacement(registrar, wszModule, wszDll);
for (pMapEntry = pMapEntries; pMapEntry && pMapEntry->szKey; pMapEntry++)
- IRegistrar_AddReplacement(pRegistrar, pMapEntry->szKey, pMapEntry->szData);
-
- StringFromGUID2(&CLSID_ATLRegistrar, buf, sizeof(buf)/sizeof(buf[0]));
- IRegistrar_AddReplacement(pRegistrar, wszCLSID_ATLRegistrar, buf);
+ IRegistrar_AddReplacement(registrar, pMapEntry->szKey, pMapEntry->szData);
if(do_register)
- hres = IRegistrar_ResourceRegisterSz(pRegistrar, wszDll, wszId, wszRegistry);
+ hres = IRegistrar_ResourceRegisterSz(registrar, wszDll, wszId, wszRegistry);
else
- hres = IRegistrar_ResourceUnregisterSz(pRegistrar, wszDll, wszId, wszRegistry);
+ hres = IRegistrar_ResourceUnregisterSz(registrar, wszDll, wszId, wszRegistry);
- IRegistrar_Release(pRegistrar);
+ if(registrar != pRegistrar)
+ IRegistrar_Release(registrar);
return hres;
}
static HRESULT do_register_server(BOOL do_register)
{
- static const WCHAR wszDll[] = {'a','t','l','.','d','l','l',0};
- return do_register_dll_server(NULL, wszDll, MAKEINTRESOURCEW(101), do_register, NULL);
+ static const WCHAR CLSID_ATLRegistrarW[] =
+ {'C','L','S','I','D','_','A','T','L','R','e','g','i','s','t','r','a','r',0};
+ static const WCHAR atl_dllW[] = {'a','t','l','.','d','l','l',0};
+
+ WCHAR clsid_str[40];
+ const struct _ATL_REGMAP_ENTRY reg_map[] = {{CLSID_ATLRegistrarW, clsid_str}, {NULL,NULL}};
+
+ StringFromGUID2(&CLSID_ATLRegistrar, clsid_str, sizeof(clsid_str)/sizeof(WCHAR));
+ return do_register_dll_server(NULL, atl_dllW, MAKEINTRESOURCEW(101), do_register, reg_map);
}
/***********************************************************************
diff --git a/dll/win32/clusapi/clusapi.c b/dll/win32/clusapi/clusapi.c
index fa90de31ef3..f782d43708b 100644
--- a/dll/win32/clusapi/clusapi.c
+++ b/dll/win32/clusapi/clusapi.c
@@ -40,7 +40,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(clusapi);
*/
DWORD WINAPI GetNodeClusterState(LPCWSTR lpszNodeName, LPDWORD pdwClusterState)
{
- FIXME("(%s,%p,%u) stub!\n",debugstr_w(lpszNodeName),pdwClusterState, *pdwClusterState);
+ FIXME("(%s,%p) stub!\n",debugstr_w(lpszNodeName),pdwClusterState);
*pdwClusterState = 0;
@@ -97,7 +97,7 @@ DWORD WINAPI ClusterCloseEnum(HCLUSENUM hEnum)
*/
DWORD WINAPI ClusterEnum(HCLUSENUM hEnum, DWORD dwIndex, LPDWORD lpdwType, LPWSTR lpszName, LPDWORD lpcchName)
{
- FIXME("(%p, %u, %u, %p, %u) stub!\n", hEnum, dwIndex, *lpdwType, lpszName, *lpcchName);
+ FIXME("(%p, %u, %p, %p, %u) stub!\n", hEnum, dwIndex, lpdwType, lpszName, *lpcchName);
return ERROR_NO_MORE_ITEMS;
}
diff --git a/dll/win32/credui/credui.rc b/dll/win32/credui/credui.rc
index f66a9428043..5f4762ebc1c 100644
--- a/dll/win32/credui/credui.rc
+++ b/dll/win32/credui/credui.rc
@@ -28,18 +28,22 @@
IDB_BANNER BITMAP LOADONCALL DISCARDABLE banner.bmp
#include "credui_Da.rc"
-#include "credui_De.rc"
#include "credui_En.rc"
-#include "credui_Es.rc"
-#include "credui_Fr.rc"
#include "credui_Ko.rc"
-#include "credui_Lt.rc"
#include "credui_Nl.rc"
#include "credui_No.rc"
#include "credui_Pl.rc"
#include "credui_Pt.rc"
+#include "credui_Sv.rc"
+#include "credui_Zh.rc"
+
+/* UTF-8 */
+#include "credui_De.rc"
+#include "credui_Es.rc"
+#include "credui_Fr.rc"
+#include "credui_It.rc"
+#include "credui_Lt.rc"
#include "credui_Ro.rc"
#include "credui_Ru.rc"
#include "credui_Si.rc"
-#include "credui_Sv.rc"
-#include "credui_Zh.rc"
+#include "credui_Uk.rc"
diff --git a/dll/win32/credui/credui_Fr.rc b/dll/win32/credui/credui_Fr.rc
index d2e63be4140..387a86d39a1 100644
--- a/dll/win32/credui/credui_Fr.rc
+++ b/dll/win32/credui/credui_Fr.rc
@@ -52,4 +52,3 @@ 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/dll/win32/credui/credui_It.rc b/dll/win32/credui/credui_It.rc
new file mode 100644
index 00000000000..f7708f4b5d1
--- /dev/null
+++ b/dll/win32/credui/credui_It.rc
@@ -0,0 +1,55 @@
+/*
+ * Italian language resource file for Credentials UI
+ *
+ * Copyright 2010 Luca Bennati
+ *
+ * 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 "credui_resources.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
+
+IDD_CREDDIALOG DIALOG DISCARDABLE 0, 0, 213, 149
+STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "IDS_TITLEFORMAT"
+FONT 8, "MS Shell Dlg"
+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 "&Nome Utente:",-1,8,62,72,12,SS_CENTERIMAGE
+ CONTROL "",IDC_USERNAME,"ComboBoxEx32",CBS_DROPDOWN |
+ CBS_NOINTEGRALHEIGHT | WS_TABSTOP,80,62,126,87
+ LTEXT "&Password:",-1,8,80,72,12,SS_CENTERIMAGE
+ EDITTEXT IDC_PASSWORD,80,80,126,12,ES_PASSWORD | ES_AUTOHSCROLL
+ CONTROL "&Ricorda la mia password",IDC_SAVE,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,80,98,126,12
+ DEFPUSHBUTTON "OK",IDOK,97,128,50,14
+ PUSHBUTTON "Annulla",IDCANCEL,156,128,50,14
+END
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_TITLEFORMAT "Connetti a %s"
+ IDS_MESSAGEFORMAT "Connettendo a %s"
+ IDS_INCORRECTPASSWORDTITLE "Accesso fallito"
+ IDS_INCORRECTPASSWORD "Assicurati che il tuo nome utente\ne password siano corrette."
+ IDS_CAPSLOCKONTITLE "Il Caps Lock è acceso"
+ IDS_CAPSLOCKON "Avere Caps Lock acceso può portarti a immettere la password incorrettamente.\n\nPremere il tasto Caps Lock sulla tua tastiera per spegnere Caps Lock prima\n di immettere la tua password."
+}
diff --git a/dll/win32/credui/credui_Lt.rc b/dll/win32/credui/credui_Lt.rc
index c98a861cc8a..4eb6ebaf9b4 100644
--- a/dll/win32/credui/credui_Lt.rc
+++ b/dll/win32/credui/credui_Lt.rc
@@ -53,4 +53,3 @@ 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/dll/win32/credui/credui_Si.rc b/dll/win32/credui/credui_Si.rc
index 068ec970338..34915e668b5 100644
--- a/dll/win32/credui/credui_Si.rc
+++ b/dll/win32/credui/credui_Si.rc
@@ -52,5 +52,3 @@ STRINGTABLE DISCARDABLE
IDS_CAPSLOCKONTITLE "Caps Lock je vključen"
IDS_CAPSLOCKON "Vključen Caps Lock je lahko vzrok nepravilnega vnosa gesla.\n\nPritisnite tipko Caps Lock, s čimer ga izklopite\nin ponovno vnesite geslo."
}
-
-#pragma code_page(default)
diff --git a/dll/win32/credui/credui_Uk.rc b/dll/win32/credui/credui_Uk.rc
new file mode 100644
index 00000000000..e7c04ab7af6
--- /dev/null
+++ b/dll/win32/credui/credui_Uk.rc
@@ -0,0 +1,56 @@
+/*
+ * Ukrainian language resource file for Credentials UI
+ *
+ * Copyright 2007 Robert Shearman (for CodeWeavers)
+ * Copyright 2010 Igor Paliychuk
+ *
+ * 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 "credui_resources.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+
+IDD_CREDDIALOG DIALOG DISCARDABLE 0, 0, 213, 149
+STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "IDS_TITLEFORMAT"
+FONT 8, "MS Shell Dlg"
+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
+ CONTROL "",IDC_USERNAME,"ComboBoxEx32",CBS_DROPDOWN |
+ CBS_NOINTEGRALHEIGHT | WS_TABSTOP,80,62,126,87
+ LTEXT "&Пароль:",-1,8,80,72,12,SS_CENTERIMAGE
+ EDITTEXT IDC_PASSWORD,80,80,126,12,ES_PASSWORD | ES_AUTOHSCROLL
+ CONTROL "&Запам'ятати мій пароль",IDC_SAVE,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,80,98,126,12
+ DEFPUSHBUTTON "OK",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 перед\nвведенням паролю."
+}
diff --git a/dll/win32/crypt32/chain.c b/dll/win32/crypt32/chain.c
index 28a22064440..6cdd103e666 100644
--- a/dll/win32/crypt32/chain.c
+++ b/dll/win32/crypt32/chain.c
@@ -686,8 +686,12 @@ static BOOL url_matches(LPCWSTR constraint, LPCWSTR name,
authority_end = strchrW(name, '?');
if (!authority_end)
authority_end = name + strlenW(name);
- /* Remove any port number from the authority */
- for (colon = authority_end; colon >= name && *colon != ':'; colon--)
+ /* Remove any port number from the authority. The userinfo portion
+ * of an authority may contain a colon, so stop if a userinfo portion
+ * is found (indicated by '@').
+ */
+ for (colon = authority_end; colon >= name && *colon != ':' &&
+ *colon != '@'; colon--)
;
if (*colon == ':')
authority_end = colon;
@@ -3376,7 +3380,7 @@ BOOL WINAPI CertVerifyCertificateChainPolicy(LPCSTR szPolicyOID,
TRACE("(%s, %p, %p, %p)\n", debugstr_a(szPolicyOID), pChainContext,
pPolicyPara, pPolicyStatus);
- if (!HIWORD(szPolicyOID))
+ if (IS_INTOID(szPolicyOID))
{
switch (LOWORD(szPolicyOID))
{
diff --git a/dll/win32/crypt32/crypt32.rc b/dll/win32/crypt32/crypt32.rc
index aae358df5a7..c656a8c551b 100644
--- a/dll/win32/crypt32/crypt32.rc
+++ b/dll/win32/crypt32/crypt32.rc
@@ -24,13 +24,16 @@
#include "version.rc"
-#include "crypt32_De.rc"
#include "crypt32_En.rc"
-#include "crypt32_Fr.rc"
#include "crypt32_Ko.rc"
+
+/* UTF-8 */
+#include "crypt32_De.rc"
+#include "crypt32_Fr.rc"
#include "crypt32_Lt.rc"
#include "crypt32_Nl.rc"
#include "crypt32_No.rc"
#include "crypt32_Pt.rc"
#include "crypt32_Ro.rc"
#include "crypt32_Sv.rc"
+#include "crypt32_Uk.rc"
diff --git a/dll/win32/crypt32/crypt32_Fr.rc b/dll/win32/crypt32/crypt32_Fr.rc
index 3438f2e4109..b98636dee82 100644
--- a/dll/win32/crypt32/crypt32_Fr.rc
+++ b/dll/win32/crypt32/crypt32_Fr.rc
@@ -242,4 +242,3 @@ STRINGTABLE DISCARDABLE
IDS_NETSCAPE_SMIME_CA "AC S/MIME"
IDS_NETSCAPE_SIGN_CA "Signature CA"
}
-#pragma code_page(default)
diff --git a/dll/win32/crypt32/crypt32_Uk.rc b/dll/win32/crypt32/crypt32_Uk.rc
new file mode 100644
index 00000000000..d26a456d44b
--- /dev/null
+++ b/dll/win32/crypt32/crypt32_Uk.rc
@@ -0,0 +1,247 @@
+/*
+ * crypt32 dll resources
+ *
+ * Copyright (C) 2006 Juan Lang
+ *
+ * Ukrainian language support
+ * Copyright (C) 2010 igor Paliychuk
+ *
+ * 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_UKRAINIAN, SUBLANG_DEFAULT
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_AUTHORITY_KEY_ID "Authority Key Identifier"
+ IDS_KEY_ATTRIBUTES "Властивості Ключа"
+ IDS_KEY_USAGE_RESTRICTION "Key Usage Restriction"
+ IDS_SUBJECT_ALT_NAME "Subject Alternative Name"
+ IDS_ISSUER_ALT_NAME "Issuer Alternative Name"
+ IDS_BASIC_CONSTRAINTS "Основні Обмеження"
+ IDS_KEY_USAGE "Використання Ключа"
+ IDS_CERT_POLICIES "Політика Сертифікатів"
+ IDS_SUBJECT_KEY_IDENTIFIER "Subject Key Identifier"
+ IDS_CRL_REASON_CODE "CRL Reason Code"
+ IDS_CRL_DIST_POINTS "CRL Distribution Points"
+ IDS_ENHANCED_KEY_USAGE "Розширене Використання Ключа"
+ IDS_AUTHORITY_INFO_ACCESS "Authority Information Access"
+ IDS_CERT_EXTENSIONS "Розширення Сертифікатів"
+ IDS_NEXT_UPDATE_LOCATION "Next Update Location"
+ IDS_YES_OR_NO_TRUST "Yes or No Trust"
+ IDS_EMAIL_ADDRESS "Адреса Ел. Пошти"
+ IDS_UNSTRUCTURED_NAME "Unstructured Name"
+ IDS_CONTENT_TYPE "Тип Вмісту"
+ IDS_MESSAGE_DIGEST "Message Digest"
+ IDS_SIGNING_TIME "Час Входу"
+ IDS_COUNTER_SIGN "Counter Sign"
+ IDS_CHALLENGE_PASSWORD "Challenge Password"
+ IDS_UNSTRUCTURED_ADDRESS "Unstructured Address"
+ IDS_SMIME_CAPABILITIES "SMIME Capabilities"
+ IDS_PREFER_SIGNED_DATA "Prefer Signed Data"
+ IDS_CPS "CPS"
+ IDS_USER_NOTICE "User Notice"
+ IDS_OCSP "On-line Certificate Status Protocol"
+ IDS_CA_ISSUER "Certification Authority Issuer"
+ IDS_CERT_TEMPLATE_NAME "Certification Template Name"
+ IDS_CERT_TYPE "Тип Сертифікату"
+ IDS_CERT_MANIFOLD "Certificate Manifold"
+ IDS_NETSCAPE_CERT_TYPE "Netscape Cert Type"
+ IDS_NETSCAPE_BASE_URL "Netscape Base URL"
+ IDS_NETSCAPE_REVOCATION_URL "Netscape Revocation URL"
+ IDS_NETSCAPE_CA_REVOCATION_URL "Netscape CA Revocation URL"
+ IDS_NETSCAPE_CERT_RENEWAL_URL "Netscape Cert Renewal URL"
+ IDS_NETSCAPE_CA_POLICY_URL "Netscape CA Policy URL"
+ IDS_NETSCAPE_SSL_SERVER_NAME "Netscape SSL ServerName"
+ IDS_NETSCAPE_COMMENT "Netscape Коментар"
+ IDS_SPC_SP_AGENCY_INFO "SpcSpAgencyInfo"
+ IDS_SPC_FINANCIAL_CRITERIA "SpcFinancialCriteria"
+ IDS_SPC_MINIMAL_CRITERIA "SpcMinimalCriteria"
+ IDS_COUNTRY "Країна/Регіон"
+ IDS_ORGANIZATION "Організація"
+ IDS_ORGANIZATIONAL_UNIT "Organizational Unit"
+ IDS_COMMON_NAME "Common Name"
+ IDS_LOCALITY "Locality"
+ IDS_STATE_OR_PROVINCE "State or Province"
+ IDS_TITLE "Title"
+ IDS_GIVEN_NAME "Given Name"
+ IDS_INITIALS "Ініціали"
+ IDS_SUR_NAME "Sur Name"
+ IDS_DOMAIN_COMPONENT "Domain Component"
+ IDS_STREET_ADDRESS "Street Address"
+ IDS_SERIAL_NUMBER "Серійний номер"
+ IDS_CA_VERSION "CA Version"
+ IDS_CROSS_CA_VERSION "Cross CA Version"
+ IDS_SERIALIZED_SIG_SERIAL_NUMBER "Serialized Signature Serial Number"
+ IDS_PRINCIPAL_NAME "Principal Name"
+ IDS_WINDOWS_PRODUCT_UPDATE "Windows Product Update"
+ IDS_ENROLLMENT_NAME_VALUE_PAIR "Enrollment Name Value Pair"
+ IDS_OS_VERSION "OS Version"
+ IDS_ENROLLMENT_CSP "Enrollment CSP"
+ IDS_CRL_NUMBER "CRL Number"
+ IDS_DELTA_CRL_INDICATOR "Delta CRL Indicator"
+ IDS_ISSUING_DIST_POINT "Issuing Distribution Point"
+ IDS_FRESHEST_CRL "Freshest CRL"
+ IDS_NAME_CONSTRAINTS "Name Constraints"
+ IDS_POLICY_MAPPINGS "Policy Mappings"
+ IDS_POLICY_CONSTRAINTS "Policy Constraints"
+ IDS_CROSS_CERT_DIST_POINTS "Cross-Certificate Distribution Points"
+ IDS_APPLICATION_POLICIES "Application Policies"
+ IDS_APPLICATION_POLICY_MAPPINGS "Application Policy Mappings"
+ IDS_APPLICATION_POLICY_CONSTRAINTS "Application Policy Constraints"
+ IDS_CMC_DATA "CMC Data"
+ IDS_CMC_RESPONSE "CMC Response"
+ IDS_UNSIGNED_CMC_REQUEST "Unsigned CMC Request"
+ IDS_CMC_STATUS_INFO "CMC Status Info"
+ IDS_CMC_EXTENSIONS "CMC Extensions"
+ IDS_CMC_ATTRIBUTES "CMC Attributes"
+ IDS_PKCS_7_DATA "PKCS 7 Data"
+ IDS_PKCS_7_SIGNED "PKCS 7 Signed"
+ IDS_PKCS_7_ENVELOPED "PKCS 7 Enveloped"
+ IDS_PKCS_7_SIGNED_ENVELOPED "PKCS 7 Signed Enveloped"
+ IDS_PKCS_7_DIGESTED "PKCS 7 Digested"
+ IDS_PKCS_7_ENCRYPTED "PKCS 7 Encrypted"
+ IDS_PREVIOUS_CA_CERT_HASH "Previous CA Certificate Hash"
+ IDS_CRL_VIRTUAL_BASE "Virtual Base CRL Number"
+ IDS_CRL_NEXT_PUBLISH "Next CRL Publish"
+ IDS_CA_EXCHANGE "CA Encryption Certificate"
+ IDS_KEY_RECOVERY_AGENT "Key Recovery Agent"
+ IDS_CERTIFICATE_TEMPLATE "Certificate Template Information"
+ IDS_ENTERPRISE_ROOT_OID "Enterprise Root OID"
+ IDS_RDN_DUMMY_SIGNER "Dummy Signer"
+ IDS_ARCHIVED_KEY_ATTR "Encrypted Private Key"
+ IDS_CRL_SELF_CDP "Published CRL Locations"
+ IDS_REQUIRE_CERT_CHAIN_POLICY "Enforce Certificate Chain Policy"
+ IDS_TRANSACTION_ID "Transaction Id"
+ IDS_SENDER_NONCE "Sender Nonce"
+ IDS_RECIPIENT_NONCE "Recipient Nonce"
+ IDS_REG_INFO "Reg Info"
+ IDS_GET_CERTIFICATE "Get Certificate"
+ IDS_GET_CRL "Get CRL"
+ IDS_REVOKE_REQUEST "Revoke Request"
+ IDS_QUERY_PENDING "Query Pending"
+ IDS_SORTED_CTL "Certificate Trust List"
+ IDS_ARCHIVED_KEY_CERT_HASH "Archived Key Certificate Hash"
+ IDS_PRIVATE_KEY_USAGE_PERIOD "Private Key Usage Period"
+ IDS_CLIENT_INFORMATION "Клієнські Дані"
+ IDS_SERVER_AUTHENTICATION "Server Authentication"
+ IDS_CLIENT_AUTHENTICATION "Client Authentication"
+ IDS_CODE_SIGNING "Code Signing"
+ IDS_SECURE_EMAIL "Secure Email"
+ IDS_TIME_STAMPING "Time Stamping"
+ IDS_MICROSOFT_TRUST_LIST_SIGNING "Microsoft Trust List Signing"
+ IDS_MICROSOFT_TIME_STAMPING "Microsoft Time Stamping"
+ IDS_IPSEC_END_SYSTEM "IP security end system"
+ IDS_IPSEC_TUNNEL "IP security tunnel termination"
+ IDS_IPSEC_USER "IP security user"
+ IDS_EFS "Encrypting File System"
+ IDS_WHQL_CRYPTO "Windows Hardware Driver Verification"
+ IDS_NT5_CRYPTO "Windows System Component Verification"
+ IDS_OEM_WHQL_CRYPTO "OEM Windows System Component Verification"
+ IDS_EMBEDDED_NT_CRYPTO "Embedded Windows System Component Verification"
+ IDS_KEY_PACK_LICENSES "Key Pack Licenses"
+ IDS_LICENSE_SERVER "License Server Verification"
+ IDS_SMART_CARD_LOGON "Smart Card Logon"
+ IDS_DIGITAL_RIGHTS "Digital Rights"
+ IDS_QUALIFIED_SUBORDINATION "Qualified Subordination"
+ IDS_KEY_RECOVERY "Key Recovery"
+ IDS_DOCUMENT_SIGNING "Document Signing"
+ IDS_IPSEC_IKE_INTERMEDIATE "IP security IKE intermediate"
+ IDS_FILE_RECOVERY "File Recovery"
+ IDS_ROOT_LIST_SIGNER "Root List Signer"
+ IDS_ANY_APPLICATION_POLICIES "All application policies"
+ IDS_DS_EMAIL_REPLICATION "Directory Service Email Replication"
+ IDS_ENROLLMENT_AGENT "Certificate Request Agent"
+ IDS_LIFETIME_SIGNING "Lifetime Signing"
+ IDS_ANY_CERT_POLICY "All issuance policies"
+}
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_LOCALIZEDNAME_ROOT "Trusted Root Certification Authorities"
+ IDS_LOCALIZEDNAME_MY "Personal"
+ IDS_LOCALIZEDNAME_CA "Intermediate Certification Authorities"
+ IDS_LOCALIZEDNAME_ADDRESSBOOK "Other People"
+ IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Trusted Publishers"
+ IDS_LOCALIZEDNAME_DISALLOWED "Untrusted Certificates"
+}
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_KEY_ID "KeyID="
+ IDS_CERT_ISSUER "Certificate Issuer"
+ IDS_CERT_SERIAL_NUMBER "Certificate Serial Number="
+ IDS_ALT_NAME_OTHER_NAME "Інше Ім'я="
+ IDS_ALT_NAME_RFC822_NAME "Адреса Ел. Пошти="
+ IDS_ALT_NAME_DNS_NAME "DNS Name="
+ IDS_ALT_NAME_DIRECTORY_NAME "Directory Address"
+ IDS_ALT_NAME_URL "URL="
+ IDS_ALT_NAME_IP_ADDRESS "IP Адреса="
+ IDS_ALT_NAME_MASK "Маска="
+ IDS_ALT_NAME_REGISTERED_ID "Registered ID="
+ IDS_USAGE_UNKNOWN "Unknown Key Usage"
+ IDS_SUBJECT_TYPE "Subject Type="
+ IDS_SUBJECT_TYPE_CA "CA"
+ IDS_SUBJECT_TYPE_END_CERT "End Entity"
+ IDS_PATH_LENGTH "Path Length Constraint="
+ IDS_PATH_LENGTH_NONE "None"
+ IDS_INFO_NOT_AVAILABLE "Information Not Available"
+ IDS_AIA "Authority Info Access"
+ IDS_ACCESS_METHOD "Access Method="
+ IDS_ACCESS_METHOD_OCSP "OCSP"
+ IDS_ACCESS_METHOD_CA_ISSUERS "CA Issuers"
+ IDS_ACCESS_METHOD_UNKNOWN "Unknown Access Method"
+ IDS_ACCESS_LOCATION "Alternative Name"
+ IDS_CRL_DIST_POINT "CRL Distribution Point"
+ IDS_CRL_DIST_POINT_NAME "Distribution Point Name"
+ IDS_CRL_DIST_POINT_FULL_NAME "Full Name"
+ IDS_CRL_DIST_POINT_RDN_NAME "RDN Name"
+ IDS_CRL_DIST_POINT_REASON "CRL Reason="
+ IDS_CRL_DIST_POINT_ISSUER "CRL Issuer"
+ IDS_REASON_KEY_COMPROMISE "Key Compromise"
+ IDS_REASON_CA_COMPROMISE "CA Compromise"
+ IDS_REASON_AFFILIATION_CHANGED "Affiliation Changed"
+ IDS_REASON_SUPERSEDED "Superseded"
+ IDS_REASON_CESSATION_OF_OPERATION "Operation Ceased"
+ IDS_REASON_CERTIFICATE_HOLD "Certificate Hold"
+ IDS_FINANCIAL_CRITERIA "Фінансові Дані="
+ IDS_FINANCIAL_CRITERIA_AVAILABLE "Available"
+ IDS_FINANCIAL_CRITERIA_NOT_AVAILABLE "Not Available"
+ IDS_FINANCIAL_CRITERIA_MEETS_CRITERIA "Meets Criteria="
+ IDS_YES "Yes"
+ IDS_NO "No"
+ IDS_DIGITAL_SIGNATURE "Цифровий Підпис"
+ IDS_NON_REPUDIATION "Non-Repudiation"
+ IDS_KEY_ENCIPHERMENT "Key Encipherment"
+ IDS_DATA_ENCIPHERMENT "Data Encipherment"
+ IDS_KEY_AGREEMENT "Key Agreement"
+ IDS_CERT_SIGN "Certificate Signing"
+ IDS_OFFLINE_CRL_SIGN "Off-line CRL Signing"
+ IDS_CRL_SIGN "CRL Signing"
+ IDS_ENCIPHER_ONLY "Encipher Only"
+ IDS_DECIPHER_ONLY "Decipher Only"
+ IDS_NETSCAPE_SSL_CLIENT "SSL Client Authentication"
+ IDS_NETSCAPE_SSL_SERVER "SSL Server Authentication"
+ IDS_NETSCAPE_SMIME "S/MIME"
+ IDS_NETSCAPE_SIGN "Signature"
+ IDS_NETSCAPE_SSL_CA "SSL CA"
+ IDS_NETSCAPE_SMIME_CA "S/MIME CA"
+ IDS_NETSCAPE_SIGN_CA "Signature CA"
+}
diff --git a/dll/win32/crypt32/crypt32_private.h b/dll/win32/crypt32/crypt32_private.h
index cbdf5116f9c..8385bf50713 100644
--- a/dll/win32/crypt32/crypt32_private.h
+++ b/dll/win32/crypt32/crypt32_private.h
@@ -405,4 +405,8 @@ void ContextList_Free(struct ContextList *list);
#define ALIGN_DWORD_PTR(x) (((x) + sizeof(DWORD_PTR) - 1) & ~(sizeof(DWORD_PTR) - 1))
#define POINTER_ALIGN_DWORD_PTR(p) ((LPVOID)ALIGN_DWORD_PTR((DWORD_PTR)(p)))
+/* Check if the OID is a small int
+ */
+#define IS_INTOID(x) (((ULONG_PTR)(x) >> 16) == 0)
+
#endif
diff --git a/dll/win32/crypt32/decode.c b/dll/win32/crypt32/decode.c
index 1fd23837395..fb3d36e8124 100644
--- a/dll/win32/crypt32/decode.c
+++ b/dll/win32/crypt32/decode.c
@@ -5578,7 +5578,7 @@ static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType,
SetLastError(ERROR_FILE_NOT_FOUND);
return NULL;
}
- if (!HIWORD(lpszStructType))
+ if (IS_INTOID(lpszStructType))
{
switch (LOWORD(lpszStructType))
{
diff --git a/dll/win32/crypt32/encode.c b/dll/win32/crypt32/encode.c
index b7bbc83600c..c58b0e638e9 100644
--- a/dll/win32/crypt32/encode.c
+++ b/dll/win32/crypt32/encode.c
@@ -4305,7 +4305,7 @@ static CryptEncodeObjectExFunc CRYPT_GetBuiltinEncoder(DWORD dwCertEncodingType,
return NULL;
}
- if (!HIWORD(lpszStructType))
+ if (IS_INTOID(lpszStructType))
{
switch (LOWORD(lpszStructType))
{
diff --git a/dll/win32/crypt32/main.c b/dll/win32/crypt32/main.c
index 1a5972fe843..5844b1841e5 100644
--- a/dll/win32/crypt32/main.c
+++ b/dll/win32/crypt32/main.c
@@ -161,8 +161,13 @@ BOOL WINAPI I_CryptSetTls(DWORD dwTlsIndex, LPVOID lpTlsValue)
BOOL WINAPI I_CryptFreeTls(DWORD dwTlsIndex, DWORD unknown)
{
+ BOOL ret;
+
TRACE("(%d, %d)\n", dwTlsIndex, unknown);
- return TlsFree(dwTlsIndex);
+
+ ret = TlsFree(dwTlsIndex);
+ if (!ret) SetLastError( E_INVALIDARG );
+ return ret;
}
BOOL WINAPI I_CryptGetOssGlobal(DWORD x)
diff --git a/dll/win32/crypt32/object.c b/dll/win32/crypt32/object.c
index 3d18c505fb4..b3f82936172 100644
--- a/dll/win32/crypt32/object.c
+++ b/dll/win32/crypt32/object.c
@@ -2525,7 +2525,7 @@ static CryptFormatObjectFunc CRYPT_GetBuiltinFormatFunction(DWORD encodingType,
SetLastError(ERROR_FILE_NOT_FOUND);
return NULL;
}
- if (!HIWORD(lpszStructType))
+ if (IS_INTOID(lpszStructType))
{
switch (LOWORD(lpszStructType))
{
diff --git a/dll/win32/crypt32/oid.c b/dll/win32/crypt32/oid.c
index 68a48520dac..ea30d9ccd45 100644
--- a/dll/win32/crypt32/oid.c
+++ b/dll/win32/crypt32/oid.c
@@ -170,7 +170,7 @@ static char *CRYPT_GetKeyName(DWORD dwEncodingType, LPCSTR pszFuncName,
* "EncodingType 2" would be expected if it were a mask. Instead native
* stores values in "EncodingType 3".
*/
- if (!HIWORD(pszOID))
+ if (IS_INTOID(pszOID))
{
snprintf(numericOID, sizeof(numericOID), "#%d", LOWORD(pszOID));
oid = numericOID;
@@ -255,7 +255,7 @@ BOOL WINAPI CryptInstallOIDFunctionAddress(HMODULE hModule,
{
struct OIDFunction *func;
- if (HIWORD(rgFuncEntry[i].pszOID))
+ if (!IS_INTOID(rgFuncEntry[i].pszOID))
func = CryptMemAlloc(sizeof(struct OIDFunction)
+ strlen(rgFuncEntry[i].pszOID) + 1);
else
@@ -263,7 +263,7 @@ BOOL WINAPI CryptInstallOIDFunctionAddress(HMODULE hModule,
if (func)
{
func->encoding = GET_CERT_ENCODING_TYPE(dwEncodingType);
- if (HIWORD(rgFuncEntry[i].pszOID))
+ if (!IS_INTOID(rgFuncEntry[i].pszOID))
{
LPSTR oid;
@@ -402,9 +402,9 @@ BOOL WINAPI CryptGetOIDFunctionAddress(HCRYPTOIDFUNCSET hFuncSet,
{
if (function->encoding == GET_CERT_ENCODING_TYPE(dwEncodingType))
{
- if (HIWORD(pszOID))
+ if (!IS_INTOID(pszOID))
{
- if (HIWORD(function->entry.pszOID) &&
+ if (!IS_INTOID(function->entry.pszOID) &&
!strcasecmp(function->entry.pszOID, pszOID))
{
*ppvFuncAddr = function->entry.pvFuncAddr;
@@ -1398,7 +1398,7 @@ static void init_oid_info(void)
for (i = 0; i < sizeof(oidInfoConstructors) /
sizeof(oidInfoConstructors[0]); i++)
{
- if (HIWORD(oidInfoConstructors[i].pwszName))
+ if (!IS_INTRESOURCE(oidInfoConstructors[i].pwszName))
{
struct OIDInfo *info;
diff --git a/dll/win32/crypt32/store.c b/dll/win32/crypt32/store.c
index 153d3aa71ea..a8923949974 100644
--- a/dll/win32/crypt32/store.c
+++ b/dll/win32/crypt32/store.c
@@ -745,7 +745,7 @@ HCERTSTORE WINAPI CertOpenStore(LPCSTR lpszStoreProvider,
TRACE("(%s, %08x, %08lx, %08x, %p)\n", debugstr_a(lpszStoreProvider),
dwMsgAndCertEncodingType, hCryptProv, dwFlags, pvPara);
- if (!HIWORD(lpszStoreProvider))
+ if (IS_INTOID(lpszStoreProvider))
{
switch (LOWORD(lpszStoreProvider))
{
diff --git a/dll/win32/cryptdlg/cryptdlg.rc b/dll/win32/cryptdlg/cryptdlg.rc
index dd9f97f4fde..7ea41c57407 100644
--- a/dll/win32/cryptdlg/cryptdlg.rc
+++ b/dll/win32/cryptdlg/cryptdlg.rc
@@ -22,11 +22,15 @@
#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"
+
+/* UTF-8 */
+#include "cryptdlg_De.rc"
+#include "cryptdlg_Fr.rc"
+#include "cryptdlg_Lt.rc"
+#include "cryptdlg_Uk.rc"
#include "cryptdlg_Pt.rc"
#include "cryptdlg_Ro.rc"
+
diff --git a/dll/win32/cryptdlg/cryptdlg_Fr.rc b/dll/win32/cryptdlg/cryptdlg_Fr.rc
index 1deeaa31587..25d8a644ecf 100644
--- a/dll/win32/cryptdlg/cryptdlg_Fr.rc
+++ b/dll/win32/cryptdlg/cryptdlg_Fr.rc
@@ -40,4 +40,3 @@ STRINGTABLE DISCARDABLE
IDS_NOTICE_NUM "Numéro de l'avis ="
IDS_NOTICE_TEXT "Texte de l'avis ="
}
-#pragma code_page(default)
diff --git a/dll/win32/cryptdlg/cryptdlg_Uk.rc b/dll/win32/cryptdlg/cryptdlg_Uk.rc
new file mode 100644
index 00000000000..d90226f9abc
--- /dev/null
+++ b/dll/win32/cryptdlg/cryptdlg_Uk.rc
@@ -0,0 +1,42 @@
+/*
+ * cryptdlg dll resources
+ *
+ * Copyright 2008 Juan Lang
+ * Copyright 2010 Igor Paliychuk
+ *
+ * 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_UKRAINIAN, SUBLANG_DEFAULT
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_CERT_POLICY "Certificate Policy"
+ IDS_POLICY_ID "Policy Identifier: "
+ IDS_POLICY_QUALIFIER_INFO "Policy Qualifier Info"
+ IDS_POLICY_QUALIFIER_ID "Policy Qualifier Id="
+ IDS_CPS "CPS" /* Certification Practice Statement */
+ IDS_USER_NOTICE "User Notice"
+ IDS_QUALIFIER "Qualifier"
+ IDS_NOTICE_REF "Notice Reference"
+ IDS_ORGANIZATION "Організація="
+ IDS_NOTICE_NUM "Notice Number="
+ IDS_NOTICE_TEXT "Notice Text="
+}
diff --git a/dll/win32/cryptdlg/main.c b/dll/win32/cryptdlg/main.c
index 1971578dbf5..f6653ec2c78 100644
--- a/dll/win32/cryptdlg/main.c
+++ b/dll/win32/cryptdlg/main.c
@@ -535,7 +535,7 @@ static BOOL CRYPT_FormatCPS(DWORD dwCertEncodingType,
pbEncoded, cbEncoded, CRYPT_DECODE_ALLOC_FLAG, NULL, &cpsValue, &size)))
{
LPCWSTR headingSep, sep;
- DWORD headingSepLen, sepLen;
+ DWORD sepLen;
if (dwFormatStrType & CRYPT_FORMAT_STR_MULTI_LINE)
{
@@ -547,8 +547,8 @@ static BOOL CRYPT_FormatCPS(DWORD dwCertEncodingType,
headingSep = colonSpace;
sep = commaSep;
}
+
sepLen = strlenW(sep);
- headingSepLen = strlenW(headingSep);
if (dwFormatStrType & CRYPT_FORMAT_STR_MULTI_LINE)
{
diff --git a/dll/win32/cryptnet/cryptnet_main.c b/dll/win32/cryptnet/cryptnet_main.c
index 9301a56733b..0b4e31dd9b7 100644
--- a/dll/win32/cryptnet/cryptnet_main.c
+++ b/dll/win32/cryptnet/cryptnet_main.c
@@ -40,6 +40,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(cryptnet);
+#define IS_INTOID(x) (((ULONG_PTR)(x) >> 16) == 0)
+
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
@@ -92,9 +94,7 @@ HRESULT WINAPI DllUnregisterServer(void)
static const char *url_oid_to_str(LPCSTR oid)
{
- if (HIWORD(oid))
- return oid;
- else
+ if (IS_INTOID(oid))
{
static char buf[10];
@@ -115,6 +115,8 @@ static const char *url_oid_to_str(LPCSTR oid)
return buf;
}
}
+ else
+ return oid;
}
typedef BOOL (WINAPI *UrlDllGetObjectUrlFunc)(LPCSTR, LPVOID, DWORD,
@@ -123,18 +125,6 @@ typedef BOOL (WINAPI *UrlDllGetObjectUrlFunc)(LPCSTR, LPVOID, DWORD,
static BOOL WINAPI CRYPT_GetUrlFromCertificateIssuer(LPCSTR pszUrlOid,
LPVOID pvPara, DWORD dwFlags, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray,
PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo, LPVOID pvReserved)
-{
- /* FIXME: This depends on the AIA (authority info access) extension being
- * supported in crypt32.
- */
- FIXME("\n");
- SetLastError(CRYPT_E_NOT_FOUND);
- return FALSE;
-}
-
-static BOOL WINAPI CRYPT_GetUrlFromCertificateCRLDistPoint(LPCSTR pszUrlOid,
- LPVOID pvPara, DWORD dwFlags, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray,
- PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo, LPVOID pvReserved)
{
PCCERT_CONTEXT cert = pvPara;
PCERT_EXTENSION ext;
@@ -146,39 +136,37 @@ static BOOL WINAPI CRYPT_GetUrlFromCertificateCRLDistPoint(LPCSTR pszUrlOid,
SetLastError(CRYPT_E_NOT_FOUND);
return FALSE;
}
- if ((ext = CertFindExtension(szOID_CRL_DIST_POINTS,
+ if ((ext = CertFindExtension(szOID_AUTHORITY_INFO_ACCESS,
cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
{
- CRL_DIST_POINTS_INFO *info;
+ CERT_AUTHORITY_INFO_ACCESS *aia;
DWORD size;
- ret = CryptDecodeObjectEx(X509_ASN_ENCODING, X509_CRL_DIST_POINTS,
+ ret = CryptDecodeObjectEx(X509_ASN_ENCODING, X509_AUTHORITY_INFO_ACCESS,
ext->Value.pbData, ext->Value.cbData, CRYPT_DECODE_ALLOC_FLAG, NULL,
- &info, &size);
+ &aia, &size);
if (ret)
{
DWORD i, cUrl, bytesNeeded = sizeof(CRYPT_URL_ARRAY);
- for (i = 0, cUrl = 0; i < info->cDistPoint; i++)
- if (info->rgDistPoint[i].DistPointName.dwDistPointNameChoice
- == CRL_DIST_POINT_FULL_NAME)
+ for (i = 0, cUrl = 0; i < aia->cAccDescr; i++)
+ if (!strcmp(aia->rgAccDescr[i].pszAccessMethod,
+ szOID_PKIX_CA_ISSUERS))
{
- DWORD j;
- CERT_ALT_NAME_INFO *name =
- &info->rgDistPoint[i].DistPointName.u.FullName;
-
- for (j = 0; j < name->cAltEntry; j++)
- if (name->rgAltEntry[j].dwAltNameChoice ==
- CERT_ALT_NAME_URL)
+ if (aia->rgAccDescr[i].AccessLocation.dwAltNameChoice ==
+ CERT_ALT_NAME_URL)
+ {
+ if (aia->rgAccDescr[i].AccessLocation.u.pwszURL)
{
- if (name->rgAltEntry[j].u.pwszURL)
- {
- cUrl++;
- bytesNeeded += sizeof(LPWSTR) +
- (lstrlenW(name->rgAltEntry[j].u.pwszURL) + 1)
- * sizeof(WCHAR);
- }
+ cUrl++;
+ bytesNeeded += sizeof(LPWSTR) +
+ (lstrlenW(aia->rgAccDescr[i].AccessLocation.u.
+ pwszURL) + 1) * sizeof(WCHAR);
}
+ }
+ else
+ FIXME("unsupported alt name type %d\n",
+ aia->rgAccDescr[i].AccessLocation.dwAltNameChoice);
}
if (!pcbUrlArray)
{
@@ -203,28 +191,22 @@ static BOOL WINAPI CRYPT_GetUrlFromCertificateCRLDistPoint(LPCSTR pszUrlOid,
(LPWSTR *)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY));
nextUrl = (LPWSTR)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY)
+ cUrl * sizeof(LPWSTR));
- for (i = 0; i < info->cDistPoint; i++)
- if (info->rgDistPoint[i].DistPointName.dwDistPointNameChoice
- == CRL_DIST_POINT_FULL_NAME)
+ for (i = 0; i < aia->cAccDescr; i++)
+ if (!strcmp(aia->rgAccDescr[i].pszAccessMethod,
+ szOID_PKIX_CA_ISSUERS))
{
- DWORD j;
- CERT_ALT_NAME_INFO *name =
- &info->rgDistPoint[i].DistPointName.u.FullName;
-
- for (j = 0; j < name->cAltEntry; j++)
- if (name->rgAltEntry[j].dwAltNameChoice ==
- CERT_ALT_NAME_URL)
+ if (aia->rgAccDescr[i].AccessLocation.dwAltNameChoice
+ == CERT_ALT_NAME_URL)
+ {
+ if (aia->rgAccDescr[i].AccessLocation.u.pwszURL)
{
- if (name->rgAltEntry[j].u.pwszURL)
- {
- lstrcpyW(nextUrl,
- name->rgAltEntry[j].u.pwszURL);
- pUrlArray->rgwszUrl[pUrlArray->cUrl++] =
- nextUrl;
- nextUrl +=
- (lstrlenW(name->rgAltEntry[j].u.pwszURL) + 1);
- }
+ lstrcpyW(nextUrl,
+ aia->rgAccDescr[i].AccessLocation.u.pwszURL);
+ pUrlArray->rgwszUrl[pUrlArray->cUrl++] =
+ nextUrl;
+ nextUrl += (lstrlenW(nextUrl) + 1);
}
+ }
}
}
if (ret)
@@ -247,7 +229,7 @@ static BOOL WINAPI CRYPT_GetUrlFromCertificateCRLDistPoint(LPCSTR pszUrlOid,
}
}
}
- LocalFree(info);
+ LocalFree(aia);
}
}
else
@@ -255,6 +237,136 @@ static BOOL WINAPI CRYPT_GetUrlFromCertificateCRLDistPoint(LPCSTR pszUrlOid,
return ret;
}
+static BOOL CRYPT_GetUrlFromCRLDistPointsExt(const CRYPT_DATA_BLOB *value,
+ PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray, PCRYPT_URL_INFO pUrlInfo,
+ DWORD *pcbUrlInfo)
+{
+ BOOL ret;
+ CRL_DIST_POINTS_INFO *info;
+ DWORD size;
+
+ ret = CryptDecodeObjectEx(X509_ASN_ENCODING, X509_CRL_DIST_POINTS,
+ value->pbData, value->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &size);
+ if (ret)
+ {
+ DWORD i, cUrl, bytesNeeded = sizeof(CRYPT_URL_ARRAY);
+
+ for (i = 0, cUrl = 0; i < info->cDistPoint; i++)
+ if (info->rgDistPoint[i].DistPointName.dwDistPointNameChoice
+ == CRL_DIST_POINT_FULL_NAME)
+ {
+ DWORD j;
+ CERT_ALT_NAME_INFO *name =
+ &info->rgDistPoint[i].DistPointName.u.FullName;
+
+ for (j = 0; j < name->cAltEntry; j++)
+ if (name->rgAltEntry[j].dwAltNameChoice ==
+ CERT_ALT_NAME_URL)
+ {
+ if (name->rgAltEntry[j].u.pwszURL)
+ {
+ cUrl++;
+ bytesNeeded += sizeof(LPWSTR) +
+ (lstrlenW(name->rgAltEntry[j].u.pwszURL) + 1)
+ * sizeof(WCHAR);
+ }
+ }
+ }
+ if (!pcbUrlArray)
+ {
+ SetLastError(E_INVALIDARG);
+ ret = FALSE;
+ }
+ else if (!pUrlArray)
+ *pcbUrlArray = bytesNeeded;
+ else if (*pcbUrlArray < bytesNeeded)
+ {
+ SetLastError(ERROR_MORE_DATA);
+ *pcbUrlArray = bytesNeeded;
+ ret = FALSE;
+ }
+ else
+ {
+ LPWSTR nextUrl;
+
+ *pcbUrlArray = bytesNeeded;
+ pUrlArray->cUrl = 0;
+ pUrlArray->rgwszUrl =
+ (LPWSTR *)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY));
+ nextUrl = (LPWSTR)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY)
+ + cUrl * sizeof(LPWSTR));
+ for (i = 0; i < info->cDistPoint; i++)
+ if (info->rgDistPoint[i].DistPointName.dwDistPointNameChoice
+ == CRL_DIST_POINT_FULL_NAME)
+ {
+ DWORD j;
+ CERT_ALT_NAME_INFO *name =
+ &info->rgDistPoint[i].DistPointName.u.FullName;
+
+ for (j = 0; j < name->cAltEntry; j++)
+ if (name->rgAltEntry[j].dwAltNameChoice ==
+ CERT_ALT_NAME_URL)
+ {
+ if (name->rgAltEntry[j].u.pwszURL)
+ {
+ lstrcpyW(nextUrl,
+ name->rgAltEntry[j].u.pwszURL);
+ pUrlArray->rgwszUrl[pUrlArray->cUrl++] =
+ nextUrl;
+ nextUrl +=
+ (lstrlenW(name->rgAltEntry[j].u.pwszURL) + 1);
+ }
+ }
+ }
+ }
+ if (ret)
+ {
+ if (pcbUrlInfo)
+ {
+ FIXME("url info: stub\n");
+ if (!pUrlInfo)
+ *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
+ else if (*pcbUrlInfo < sizeof(CRYPT_URL_INFO))
+ {
+ *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
+ SetLastError(ERROR_MORE_DATA);
+ ret = FALSE;
+ }
+ else
+ {
+ *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
+ memset(pUrlInfo, 0, sizeof(CRYPT_URL_INFO));
+ }
+ }
+ }
+ LocalFree(info);
+ }
+ return ret;
+}
+
+static BOOL WINAPI CRYPT_GetUrlFromCertificateCRLDistPoint(LPCSTR pszUrlOid,
+ LPVOID pvPara, DWORD dwFlags, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray,
+ PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo, LPVOID pvReserved)
+{
+ PCCERT_CONTEXT cert = pvPara;
+ PCERT_EXTENSION ext;
+ BOOL ret = FALSE;
+
+ /* The only applicable flag is CRYPT_GET_URL_FROM_EXTENSION */
+ if (dwFlags && !(dwFlags & CRYPT_GET_URL_FROM_EXTENSION))
+ {
+ SetLastError(CRYPT_E_NOT_FOUND);
+ return FALSE;
+ }
+ if ((ext = CertFindExtension(szOID_CRL_DIST_POINTS,
+ cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
+ ret = CRYPT_GetUrlFromCRLDistPointsExt(&ext->Value, pUrlArray,
+ pcbUrlArray, pUrlInfo, pcbUrlInfo);
+ else
+ SetLastError(CRYPT_E_NOT_FOUND);
+ return ret;
+}
+
/***********************************************************************
* CryptGetObjectUrl (CRYPTNET.@)
*/
@@ -269,7 +381,7 @@ BOOL WINAPI CryptGetObjectUrl(LPCSTR pszUrlOid, LPVOID pvPara, DWORD dwFlags,
TRACE("(%s, %p, %08x, %p, %p, %p, %p, %p)\n", debugstr_a(pszUrlOid),
pvPara, dwFlags, pUrlArray, pcbUrlArray, pUrlInfo, pcbUrlInfo, pvReserved);
- if (!HIWORD(pszUrlOid))
+ if (IS_INTOID(pszUrlOid))
{
switch (LOWORD(pszUrlOid))
{
@@ -566,7 +678,7 @@ static BOOL CRYPT_DownloadObject(DWORD dwRetrievalFlags, HINTERNET hHttp,
}
}
if (ret)
- object.cbData += bytesAvailable;
+ object.cbData += buffer.dwBufferLength;
}
else
{
@@ -1246,20 +1358,24 @@ static BOOL WINAPI CRYPT_CreateAny(LPCSTR pszObjectOid,
if (!CertAddCertificateContextToStore(store,
context, CERT_STORE_ADD_ALWAYS, NULL))
ret = FALSE;
+ CertFreeCertificateContext(context);
break;
case CERT_QUERY_CONTENT_CRL:
if (!CertAddCRLContextToStore(store,
context, CERT_STORE_ADD_ALWAYS, NULL))
ret = FALSE;
+ CertFreeCRLContext(context);
break;
case CERT_QUERY_CONTENT_CTL:
if (!CertAddCTLContextToStore(store,
context, CERT_STORE_ADD_ALWAYS, NULL))
ret = FALSE;
+ CertFreeCTLContext(context);
break;
default:
CertAddStoreToCollection(store, contextStore, 0, 0);
}
+ CertCloseStore(contextStore, 0);
}
else
ret = FALSE;
@@ -1284,7 +1400,7 @@ static BOOL CRYPT_GetCreateFunction(LPCSTR pszObjectOid,
*pFunc = NULL;
*phFunc = 0;
- if (!HIWORD(pszObjectOid))
+ if (IS_INTOID(pszObjectOid))
{
switch (LOWORD(pszObjectOid))
{
@@ -1354,7 +1470,7 @@ static BOOL CRYPT_GetExpirationFunction(LPCSTR pszObjectOid,
{
BOOL ret;
- if (!HIWORD(pszObjectOid))
+ if (IS_INTOID(pszObjectOid))
{
switch (LOWORD(pszObjectOid))
{
@@ -1437,6 +1553,238 @@ BOOL WINAPI CryptRetrieveObjectByUrlW(LPCWSTR pszURL, LPCSTR pszObjectOid,
return ret;
}
+static DWORD verify_cert_revocation_with_crl(PCCERT_CONTEXT cert,
+ PCCRL_CONTEXT crl, DWORD index, FILETIME *pTime,
+ PCERT_REVOCATION_STATUS pRevStatus)
+{
+ DWORD error;
+
+ if (CertVerifyCRLTimeValidity(pTime, crl->pCrlInfo))
+ {
+ /* The CRL isn't time valid */
+ error = CRYPT_E_NO_REVOCATION_CHECK;
+ }
+ else
+ {
+ PCRL_ENTRY entry = NULL;
+
+ CertFindCertificateInCRL(cert, crl, 0, NULL, &entry);
+ if (entry)
+ {
+ error = CRYPT_E_REVOKED;
+ pRevStatus->dwIndex = index;
+ }
+ else
+ error = ERROR_SUCCESS;
+ }
+ return error;
+}
+
+static DWORD verify_cert_revocation_from_dist_points_ext(
+ const CRYPT_DATA_BLOB *value, PCCERT_CONTEXT cert, DWORD index,
+ FILETIME *pTime, DWORD dwFlags, PCERT_REVOCATION_PARA pRevPara,
+ PCERT_REVOCATION_STATUS pRevStatus)
+{
+ DWORD error = ERROR_SUCCESS, cbUrlArray;
+
+ if (CRYPT_GetUrlFromCRLDistPointsExt(value, NULL, &cbUrlArray, NULL, NULL))
+ {
+ CRYPT_URL_ARRAY *urlArray = CryptMemAlloc(cbUrlArray);
+
+ if (urlArray)
+ {
+ DWORD j, retrievalFlags = 0, startTime, endTime, timeout;
+ BOOL ret;
+
+ ret = CRYPT_GetUrlFromCRLDistPointsExt(value, urlArray,
+ &cbUrlArray, NULL, NULL);
+ if (dwFlags & CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION)
+ retrievalFlags |= CRYPT_CACHE_ONLY_RETRIEVAL;
+ if (dwFlags & CERT_VERIFY_REV_ACCUMULATIVE_TIMEOUT_FLAG &&
+ pRevPara && pRevPara->cbSize >= offsetof(CERT_REVOCATION_PARA,
+ dwUrlRetrievalTimeout) + sizeof(DWORD))
+ {
+ startTime = GetTickCount();
+ endTime = startTime + pRevPara->dwUrlRetrievalTimeout;
+ timeout = pRevPara->dwUrlRetrievalTimeout;
+ }
+ else
+ endTime = timeout = 0;
+ if (!ret)
+ error = GetLastError();
+ for (j = 0; !error && j < urlArray->cUrl; j++)
+ {
+ PCCRL_CONTEXT crl;
+
+ ret = CryptRetrieveObjectByUrlW(urlArray->rgwszUrl[j],
+ CONTEXT_OID_CRL, retrievalFlags, timeout, (void **)&crl,
+ NULL, NULL, NULL, NULL);
+ if (ret)
+ {
+ error = verify_cert_revocation_with_crl(cert, crl, index,
+ pTime, pRevStatus);
+ if (!error && timeout)
+ {
+ DWORD time = GetTickCount();
+
+ if ((int)(endTime - time) <= 0)
+ {
+ error = ERROR_TIMEOUT;
+ pRevStatus->dwIndex = index;
+ }
+ else
+ timeout = endTime - time;
+ }
+ CertFreeCRLContext(crl);
+ }
+ else
+ error = CRYPT_E_REVOCATION_OFFLINE;
+ }
+ CryptMemFree(urlArray);
+ }
+ else
+ {
+ error = ERROR_OUTOFMEMORY;
+ pRevStatus->dwIndex = index;
+ }
+ }
+ else
+ {
+ error = GetLastError();
+ pRevStatus->dwIndex = index;
+ }
+ return error;
+}
+
+static DWORD verify_cert_revocation_from_aia_ext(
+ const CRYPT_DATA_BLOB *value, PCCERT_CONTEXT cert, DWORD index,
+ FILETIME *pTime, DWORD dwFlags, PCERT_REVOCATION_PARA pRevPara,
+ PCERT_REVOCATION_STATUS pRevStatus)
+{
+ BOOL ret;
+ DWORD error, size;
+ CERT_AUTHORITY_INFO_ACCESS *aia;
+
+ ret = CryptDecodeObjectEx(X509_ASN_ENCODING, X509_AUTHORITY_INFO_ACCESS,
+ value->pbData, value->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &aia, &size);
+ if (ret)
+ {
+ DWORD i;
+
+ for (i = 0; i < aia->cAccDescr; i++)
+ if (!strcmp(aia->rgAccDescr[i].pszAccessMethod,
+ szOID_PKIX_OCSP))
+ {
+ if (aia->rgAccDescr[i].AccessLocation.dwAltNameChoice ==
+ CERT_ALT_NAME_URL)
+ FIXME("OCSP URL = %s\n",
+ debugstr_w(aia->rgAccDescr[i].AccessLocation.u.pwszURL));
+ else
+ FIXME("unsupported AccessLocation type %d\n",
+ aia->rgAccDescr[i].AccessLocation.dwAltNameChoice);
+ }
+ LocalFree(aia);
+ /* FIXME: lie and pretend OCSP validated the cert */
+ error = ERROR_SUCCESS;
+ }
+ else
+ error = GetLastError();
+ return error;
+}
+
+static DWORD verify_cert_revocation(PCCERT_CONTEXT cert, DWORD index,
+ FILETIME *pTime, DWORD dwFlags, PCERT_REVOCATION_PARA pRevPara,
+ PCERT_REVOCATION_STATUS pRevStatus)
+{
+ DWORD error = ERROR_SUCCESS;
+ PCERT_EXTENSION ext;
+
+ if ((ext = CertFindExtension(szOID_CRL_DIST_POINTS,
+ cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
+ error = verify_cert_revocation_from_dist_points_ext(&ext->Value, cert,
+ index, pTime, dwFlags, pRevPara, pRevStatus);
+ else if ((ext = CertFindExtension(szOID_AUTHORITY_INFO_ACCESS,
+ cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
+ error = verify_cert_revocation_from_aia_ext(&ext->Value, cert,
+ index, pTime, dwFlags, pRevPara, pRevStatus);
+ else
+ {
+ if (pRevPara && pRevPara->hCrlStore && pRevPara->pIssuerCert)
+ {
+ PCCRL_CONTEXT crl = NULL;
+ BOOL canSignCRLs;
+
+ /* If the caller told us about the issuer, make sure the issuer
+ * can sign CRLs before looking for one.
+ */
+ if ((ext = CertFindExtension(szOID_KEY_USAGE,
+ pRevPara->pIssuerCert->pCertInfo->cExtension,
+ pRevPara->pIssuerCert->pCertInfo->rgExtension)))
+ {
+ CRYPT_BIT_BLOB usage;
+ DWORD size = sizeof(usage);
+
+ if (!CryptDecodeObjectEx(cert->dwCertEncodingType, X509_BITS,
+ ext->Value.pbData, ext->Value.cbData,
+ CRYPT_DECODE_NOCOPY_FLAG, NULL, &usage, &size))
+ canSignCRLs = FALSE;
+ else if (usage.cbData > 2)
+ {
+ /* The key usage extension only defines 9 bits => no more
+ * than 2 bytes are needed to encode all known usages.
+ */
+ canSignCRLs = FALSE;
+ }
+ else
+ {
+ BYTE usageBits = usage.pbData[usage.cbData - 1];
+
+ canSignCRLs = usageBits & CERT_CRL_SIGN_KEY_USAGE;
+ }
+ }
+ else
+ canSignCRLs = TRUE;
+ if (canSignCRLs)
+ {
+ /* If the caller was helpful enough to tell us where to find a
+ * CRL for the cert, look for one and check it.
+ */
+ crl = CertFindCRLInStore(pRevPara->hCrlStore,
+ cert->dwCertEncodingType,
+ CRL_FIND_ISSUED_BY_SIGNATURE_FLAG |
+ CRL_FIND_ISSUED_BY_AKI_FLAG,
+ CRL_FIND_ISSUED_BY, pRevPara->pIssuerCert, NULL);
+ }
+ if (crl)
+ {
+ error = verify_cert_revocation_with_crl(cert, crl, index,
+ pTime, pRevStatus);
+ CertFreeCRLContext(crl);
+ }
+ else
+ {
+ error = CRYPT_E_NO_REVOCATION_CHECK;
+ pRevStatus->dwIndex = index;
+ }
+ }
+ else
+ {
+ error = CRYPT_E_NO_REVOCATION_CHECK;
+ pRevStatus->dwIndex = index;
+ }
+ }
+ return error;
+}
+
+typedef struct _CERT_REVOCATION_PARA_NO_EXTRA_FIELDS {
+ DWORD cbSize;
+ PCCERT_CONTEXT pIssuerCert;
+ DWORD cCertStore;
+ HCERTSTORE *rgCertStore;
+ HCERTSTORE hCrlStore;
+ LPFILETIME pftTimeToUse;
+} CERT_REVOCATION_PARA_NO_EXTRA_FIELDS, *PCERT_REVOCATION_PARA_NO_EXTRA_FIELDS;
+
typedef struct _OLD_CERT_REVOCATION_STATUS {
DWORD cbSize;
DWORD dwIndex;
@@ -1452,7 +1800,8 @@ BOOL WINAPI CertDllVerifyRevocation(DWORD dwEncodingType, DWORD dwRevType,
PCERT_REVOCATION_PARA pRevPara, PCERT_REVOCATION_STATUS pRevStatus)
{
DWORD error = 0, i;
- BOOL ret;
+ FILETIME now;
+ LPFILETIME pTime = NULL;
TRACE("(%08x, %d, %d, %p, %08x, %p, %p)\n", dwEncodingType, dwRevType,
cContext, rgpvContext, dwFlags, pRevPara, pRevStatus);
@@ -1463,106 +1812,33 @@ BOOL WINAPI CertDllVerifyRevocation(DWORD dwEncodingType, DWORD dwRevType,
SetLastError(E_INVALIDARG);
return FALSE;
}
+ if (!cContext)
+ {
+ SetLastError(E_INVALIDARG);
+ return FALSE;
+ }
+ if (pRevPara && pRevPara->cbSize >=
+ sizeof(CERT_REVOCATION_PARA_NO_EXTRA_FIELDS))
+ pTime = pRevPara->pftTimeToUse;
+ if (!pTime)
+ {
+ GetSystemTimeAsFileTime(&now);
+ pTime = &now;
+ }
memset(&pRevStatus->dwIndex, 0, pRevStatus->cbSize - sizeof(DWORD));
if (dwRevType != CERT_CONTEXT_REVOCATION_TYPE)
- {
error = CRYPT_E_NO_REVOCATION_CHECK;
- ret = FALSE;
- }
else
{
- ret = TRUE;
- for (i = 0; ret && i < cContext; i++)
- {
- DWORD cbUrlArray;
-
- ret = CryptGetObjectUrl(URL_OID_CERTIFICATE_CRL_DIST_POINT,
- rgpvContext[i], 0, NULL, &cbUrlArray, NULL, NULL, NULL);
- if (!ret && GetLastError() == CRYPT_E_NOT_FOUND)
- {
- error = CRYPT_E_NO_REVOCATION_CHECK;
- pRevStatus->dwIndex = i;
- }
- else if (ret)
- {
- CRYPT_URL_ARRAY *urlArray = CryptMemAlloc(cbUrlArray);
-
- if (urlArray)
- {
- DWORD j, retrievalFlags = 0, startTime, endTime, timeout;
-
- ret = CryptGetObjectUrl(URL_OID_CERTIFICATE_CRL_DIST_POINT,
- rgpvContext[i], 0, urlArray, &cbUrlArray, NULL, NULL,
- NULL);
- if (dwFlags & CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION)
- retrievalFlags |= CRYPT_CACHE_ONLY_RETRIEVAL;
- if (dwFlags & CERT_VERIFY_REV_ACCUMULATIVE_TIMEOUT_FLAG &&
- pRevPara->cbSize >= offsetof(CERT_REVOCATION_PARA,
- dwUrlRetrievalTimeout) + sizeof(DWORD))
- {
- startTime = GetTickCount();
- endTime = startTime + pRevPara->dwUrlRetrievalTimeout;
- timeout = pRevPara->dwUrlRetrievalTimeout;
- }
- else
- endTime = timeout = 0;
- for (j = 0; ret && j < urlArray->cUrl; j++)
- {
- PCCRL_CONTEXT crl;
-
- ret = CryptRetrieveObjectByUrlW(urlArray->rgwszUrl[j],
- CONTEXT_OID_CRL, retrievalFlags, timeout,
- (void **)&crl, NULL, NULL, NULL, NULL);
- if (ret)
- {
- PCRL_ENTRY entry = NULL;
-
- CertFindCertificateInCRL(
- rgpvContext[i], crl, 0, NULL,
- &entry);
- if (entry)
- {
- error = CRYPT_E_REVOKED;
- pRevStatus->dwIndex = i;
- ret = FALSE;
- }
- else if (timeout)
- {
- DWORD time = GetTickCount();
-
- if ((int)(endTime - time) <= 0)
- {
- error = ERROR_TIMEOUT;
- pRevStatus->dwIndex = i;
- ret = FALSE;
- }
- else
- timeout = endTime - time;
- }
- CertFreeCRLContext(crl);
- }
- else
- error = CRYPT_E_REVOCATION_OFFLINE;
- }
- CryptMemFree(urlArray);
- }
- else
- {
- error = ERROR_OUTOFMEMORY;
- pRevStatus->dwIndex = i;
- ret = FALSE;
- }
- }
- else
- pRevStatus->dwIndex = i;
- }
+ for (i = 0; !error && i < cContext; i++)
+ error = verify_cert_revocation(rgpvContext[i], i, pTime, dwFlags,
+ pRevPara, pRevStatus);
}
-
- if (!ret)
+ if (error)
{
SetLastError(error);
pRevStatus->dwError = error;
}
- TRACE("returning %d (%08x)\n", ret, error);
- return ret;
+ TRACE("returning %d (%08x)\n", !error, error);
+ return !error;
}
diff --git a/dll/win32/cryptui/cryptui.rc b/dll/win32/cryptui/cryptui.rc
index 5460ca2dec7..6f2a5304dab 100644
--- a/dll/win32/cryptui/cryptui.rc
+++ b/dll/win32/cryptui/cryptui.rc
@@ -46,10 +46,13 @@ 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"
+
+/* UTF-8 */
+#include "cryptui_De.rc"
+#include "cryptui_Fr.rc"
#include "cryptui_Lt.rc"
#include "cryptui_Nl.rc"
#include "cryptui_Pt.rc"
+
diff --git a/dll/win32/cryptui/cryptui_De.rc b/dll/win32/cryptui/cryptui_De.rc
index d34d88332cc..71740157666 100644
--- a/dll/win32/cryptui/cryptui_De.rc
+++ b/dll/win32/cryptui/cryptui_De.rc
@@ -119,6 +119,7 @@ STRINGTABLE DISCARDABLE
IDS_WARN_REMOVE_DEFAULT "Sind Sie sicher, dass Sie dieses Zertifikat entfernen möchten?"
IDS_WARN_REMOVE_PLURAL_DEFAULT "Sind Sie sicher, dass Sie diese Zertifikate entfernen möchten?"
IDS_CERT_MGR "Zertifikate"
+ IDS_FRIENDLY_NAME_NONE ""
IDS_PURPOSE_SERVER_AUTH "Garantiert die Identität eines entfernten Computers"
IDS_PURPOSE_CLIENT_AUTH "Beweist Ihre Identität für einen entfernten Computers"
IDS_PURPOSE_CODE_SIGNING "Schützt Software vor Manipulation nach der Veröffentlichung"
diff --git a/dll/win32/cryptui/cryptui_En.rc b/dll/win32/cryptui/cryptui_En.rc
index 5aee197a5f0..527ffa584f7 100644
--- a/dll/win32/cryptui/cryptui_En.rc
+++ b/dll/win32/cryptui/cryptui_En.rc
@@ -31,7 +31,7 @@ STRINGTABLE DISCARDABLE
IDS_CERT_INFO_UNTRUSTED_ROOT "This certificate could not be validated to a trusted root certificate."
IDS_CERT_INFO_PARTIAL_CHAIN "This certificate's issuer could not be found."
IDS_CERT_INFO_BAD_PURPOSES "All the intended purposes of this certificate could not be verified."
- IDS_CERT_INFO_PURPOSES "This cerificate is intended for the following purposes:"
+ IDS_CERT_INFO_PURPOSES "This certificate is intended for the following purposes:"
IDS_SUBJECT_HEADING "Issued to: "
IDS_ISSUER_HEADING "Issued by: "
IDS_VALID_FROM "Valid from "
@@ -117,6 +117,7 @@ STRINGTABLE DISCARDABLE
IDS_WARN_REMOVE_DEFAULT "Are you sure you want to remove this certificate?"
IDS_WARN_REMOVE_PLURAL_DEFAULT "Are you sure you want to remove these certificates?"
IDS_CERT_MGR "Certificates"
+ IDS_FRIENDLY_NAME_NONE ""
IDS_PURPOSE_SERVER_AUTH "Ensures the identify of a remote computer"
IDS_PURPOSE_CLIENT_AUTH "Proves your identity to a remote computer"
IDS_PURPOSE_CODE_SIGNING "Ensures software came from software publisher\nProtects software from alteration after publication"
diff --git a/dll/win32/cryptui/cryptui_Fr.rc b/dll/win32/cryptui/cryptui_Fr.rc
index 16b847fc6e7..5c5ca6891db 100644
--- a/dll/win32/cryptui/cryptui_Fr.rc
+++ b/dll/win32/cryptui/cryptui_Fr.rc
@@ -120,6 +120,7 @@ STRINGTABLE DISCARDABLE
IDS_WARN_REMOVE_DEFAULT "Voulez-vous réellement supprimer ce certificat ?"
IDS_WARN_REMOVE_PLURAL_DEFAULT "Voulez-vous réellement supprimer ces certificats ?"
IDS_CERT_MGR "Certificats"
+ IDS_FRIENDLY_NAME_NONE ""
IDS_PURPOSE_SERVER_AUTH "Prouve l'identité d'un ordinateur distant"
IDS_PURPOSE_CLIENT_AUTH "Prouve votre identité à un ordinateur distant"
IDS_PURPOSE_CODE_SIGNING "Garantit que des logiciels proviennent bien d'un éditeur de logiciels donné\nProtège le logiciel contre toute altération après publication"
@@ -464,4 +465,3 @@ BEGIN
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/dll/win32/cryptui/cryptui_Ko.rc b/dll/win32/cryptui/cryptui_Ko.rc
index 66064114d7f..eaa6222f160 100644
--- a/dll/win32/cryptui/cryptui_Ko.rc
+++ b/dll/win32/cryptui/cryptui_Ko.rc
@@ -118,6 +118,7 @@ STRINGTABLE DISCARDABLE
IDS_WARN_REMOVE_DEFAULT " Ÿ ϱ⸦ մϱ?"
IDS_WARN_REMOVE_PLURAL_DEFAULT " 鸦 ϱ⸦ մϱ?"
IDS_CERT_MGR ""
+ IDS_FRIENDLY_NAME_NONE "<>"
IDS_PURPOSE_SERVER_AUTH " ǻ ϼ "
IDS_PURPOSE_CLIENT_AUTH " ſ ǻͷ "
IDS_PURPOSE_CODE_SIGNING "Ʈ ڷκ Ʈ \n Ʈ κ ȣ"
diff --git a/dll/win32/cryptui/cryptui_Lt.rc b/dll/win32/cryptui/cryptui_Lt.rc
index d4ba0eb2608..ee02eabf018 100644
--- a/dll/win32/cryptui/cryptui_Lt.rc
+++ b/dll/win32/cryptui/cryptui_Lt.rc
@@ -120,6 +120,7 @@ STRINGTABLE DISCARDABLE
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_FRIENDLY_NAME_NONE ""
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"
diff --git a/dll/win32/cryptui/cryptui_Nl.rc b/dll/win32/cryptui/cryptui_Nl.rc
index faa32108eeb..3a2d2edfb43 100644
--- a/dll/win32/cryptui/cryptui_Nl.rc
+++ b/dll/win32/cryptui/cryptui_Nl.rc
@@ -119,6 +119,7 @@ STRINGTABLE DISCARDABLE
IDS_WARN_REMOVE_DEFAULT "Weet u zeker dat u dit certificaat wilt verwijderen?"
IDS_WARN_REMOVE_PLURAL_DEFAULT "Weet u zeker dat u deze certificaten wilt verwijderen?"
IDS_CERT_MGR "Certificaten"
+ IDS_FRIENDLY_NAME_NONE ""
IDS_PURPOSE_SERVER_AUTH "Bewijst de identiteit van een remote computer"
IDS_PURPOSE_CLIENT_AUTH "Bewijst uw identiteit aan een remote computer"
IDS_PURPOSE_CODE_SIGNING "Bewijst dat de software kwam van de software uitgever\nBeschermt software tegen wijzigingen na publicatie"
diff --git a/dll/win32/cryptui/cryptui_Pt.rc b/dll/win32/cryptui/cryptui_Pt.rc
index f8795293d9f..4b528b5b1f9 100644
--- a/dll/win32/cryptui/cryptui_Pt.rc
+++ b/dll/win32/cryptui/cryptui_Pt.rc
@@ -119,6 +119,7 @@ STRINGTABLE DISCARDABLE
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_FRIENDLY_NAME_NONE ""
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"
diff --git a/dll/win32/cryptui/cryptuires.h b/dll/win32/cryptui/cryptuires.h
index 716dba5e3a6..df321df4632 100644
--- a/dll/win32/cryptui/cryptuires.h
+++ b/dll/win32/cryptui/cryptuires.h
@@ -116,6 +116,7 @@
#define IDS_WARN_REMOVE_DEFAULT 1092
#define IDS_WARN_REMOVE_PLURAL_DEFAULT 1093
#define IDS_CERT_MGR 1094
+#define IDS_FRIENDLY_NAME_NONE 1095
#define IDS_PURPOSE_SERVER_AUTH 1100
#define IDS_PURPOSE_CLIENT_AUTH 1101
diff --git a/dll/win32/cryptui/main.c b/dll/win32/cryptui/main.c
index 980706434a1..a95a7a487d3 100644
--- a/dll/win32/cryptui/main.c
+++ b/dll/win32/cryptui/main.c
@@ -104,6 +104,7 @@ static void add_cert_to_view(HWND lv, PCCERT_CONTEXT cert, DWORD *allocatedLen,
WCHAR dateFmt[80]; /* sufficient for LOCALE_SSHORTDATE */
WCHAR date[80];
SYSTEMTIME sysTime;
+ LPWSTR none;
item.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_TEXT;
item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
@@ -155,8 +156,9 @@ static void add_cert_to_view(HWND lv, PCCERT_CONTEXT cert, DWORD *allocatedLen,
item.iSubItem = 2;
SendMessageW(lv, LVM_SETITEMTEXTW, item.iItem, (LPARAM)&item);
- len = CertGetNameStringW(cert, CERT_NAME_FRIENDLY_DISPLAY_TYPE, 0, NULL,
- NULL, 0);
+ if (!CertGetCertificateContextProperty(cert, CERT_FRIENDLY_NAME_PROP_ID,
+ NULL, &len))
+ len = LoadStringW(hInstance, IDS_FRIENDLY_NAME_NONE, (LPWSTR)&none, 0);
if (len > *allocatedLen)
{
HeapFree(GetProcessHeap(), 0, *str);
@@ -166,9 +168,11 @@ static void add_cert_to_view(HWND lv, PCCERT_CONTEXT cert, DWORD *allocatedLen,
}
if (*str)
{
- CertGetNameStringW(cert, CERT_NAME_FRIENDLY_DISPLAY_TYPE, 0, NULL,
- *str, len);
- item.pszText = *str;
+ if (!CertGetCertificateContextProperty(cert, CERT_FRIENDLY_NAME_PROP_ID,
+ *str, &len))
+ item.pszText = none;
+ else
+ item.pszText = *str;
item.iSubItem = 3;
SendMessageW(lv, LVM_SETITEMTEXTW, item.iItem, (LPARAM)&item);
}
@@ -348,6 +352,8 @@ static CERT_ENHKEY_USAGE *create_advanced_filter(void)
return advancedUsage;
}
+static int CALLBACK cert_mgr_sort_by_subject(LPARAM lp1, LPARAM lp2, LPARAM lp);
+
static void show_store_certs(HWND hwnd, HCERTSTORE store)
{
HWND lv = GetDlgItem(hwnd, IDC_MGR_CERTS);
@@ -443,6 +449,8 @@ static void show_store_certs(HWND hwnd, HCERTSTORE store)
HeapFree(GetProcessHeap(), 0, advanced->rgpszUsageIdentifier);
HeapFree(GetProcessHeap(), 0, advanced);
}
+ SendMessageW(lv, LVM_SORTITEMSEX, (WPARAM)lv,
+ (LPARAM)cert_mgr_sort_by_subject);
}
static const WCHAR my[] = { 'M','y',0 };
@@ -1062,6 +1070,48 @@ static void cert_mgr_do_export(HWND hwnd)
}
}
+static int cert_mgr_sort_by_text(HWND lv, int col, int index1, int index2)
+{
+ LVITEMW item;
+ WCHAR buf1[MAX_STRING_LEN];
+ WCHAR buf2[MAX_STRING_LEN];
+
+ item.cchTextMax = sizeof(buf1) / sizeof(buf1[0]);
+ item.mask = LVIF_TEXT;
+ item.pszText = buf1;
+ item.iItem = index1;
+ item.iSubItem = col;
+ SendMessageW(lv, LVM_GETITEMW, 0, (LPARAM)&item);
+ item.pszText = buf2;
+ item.iItem = index2;
+ SendMessageW(lv, LVM_GETITEMW, 0, (LPARAM)&item);
+ return strcmpW(buf1, buf2);
+}
+
+static int CALLBACK cert_mgr_sort_by_subject(LPARAM lp1, LPARAM lp2, LPARAM lp)
+{
+ return cert_mgr_sort_by_text((HWND)lp, 0, lp1, lp2);
+}
+
+static int CALLBACK cert_mgr_sort_by_issuer(LPARAM lp1, LPARAM lp2, LPARAM lp)
+{
+ return cert_mgr_sort_by_text((HWND)lp, 1, lp1, lp2);
+}
+
+static int CALLBACK cert_mgr_sort_by_date(LPARAM lp1, LPARAM lp2, LPARAM lp)
+{
+ PCCERT_CONTEXT cert1 = (PCCERT_CONTEXT)lp1;
+ PCCERT_CONTEXT cert2 = (PCCERT_CONTEXT)lp2;
+ return CompareFileTime(&cert1->pCertInfo->NotAfter,
+ &cert2->pCertInfo->NotAfter);
+}
+
+static int CALLBACK cert_mgr_sort_by_friendly_name(LPARAM lp1, LPARAM lp2,
+ LPARAM lp)
+{
+ return cert_mgr_sort_by_text((HWND)lp, 3, lp1, lp2);
+}
+
static LRESULT CALLBACK cert_mgr_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
LPARAM lp)
{
@@ -1141,6 +1191,35 @@ static LRESULT CALLBACK cert_mgr_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
cert_mgr_do_remove(hwnd);
break;
}
+ case LVN_COLUMNCLICK:
+ {
+ NMLISTVIEW *nmlv = (NMLISTVIEW *)lp;
+ HWND lv = GetDlgItem(hwnd, IDC_MGR_CERTS);
+
+ /* FIXME: doesn't support swapping sort order between ascending
+ * and descending.
+ */
+ switch (nmlv->iSubItem)
+ {
+ case 0:
+ SendMessageW(lv, LVM_SORTITEMSEX, (WPARAM)lv,
+ (LPARAM)cert_mgr_sort_by_subject);
+ break;
+ case 1:
+ SendMessageW(lv, LVM_SORTITEMSEX, (WPARAM)lv,
+ (LPARAM)cert_mgr_sort_by_issuer);
+ break;
+ case 2:
+ SendMessageW(lv, LVM_SORTITEMS, 0,
+ (LPARAM)cert_mgr_sort_by_date);
+ break;
+ case 3:
+ SendMessageW(lv, LVM_SORTITEMSEX, (WPARAM)lv,
+ (LPARAM)cert_mgr_sort_by_friendly_name);
+ break;
+ }
+ break;
+ }
}
break;
}
@@ -1385,7 +1464,7 @@ static void enumerate_stores(HWND hwnd, CRYPTUI_ENUM_DATA *pEnumData)
static void free_store_info(HWND tree)
{
HTREEITEM next = (HTREEITEM)SendMessageW(tree, TVM_GETNEXTITEM, TVGN_CHILD,
- (LPARAM)NULL);
+ 0);
while (next)
{
@@ -1473,7 +1552,7 @@ static LRESULT CALLBACK select_store_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
{
HWND tree = GetDlgItem(hwnd, IDC_STORE_LIST);
HTREEITEM selection = (HTREEITEM)SendMessageW(tree,
- TVM_GETNEXTITEM, TVGN_CARET, (LPARAM)NULL);
+ TVM_GETNEXTITEM, TVGN_CARET, 0);
selectInfo = (struct SelectStoreInfo *)GetWindowLongPtrW(hwnd,
DWLP_USER);
@@ -4034,8 +4113,7 @@ static void show_dialog_for_selected_cert(HWND hwnd)
memset(&item, 0, sizeof(item));
item.mask = TVIF_HANDLE | TVIF_PARAM;
- item.hItem = (HTREEITEM)SendMessageW(tree, TVM_GETNEXTITEM, TVGN_CARET,
- (LPARAM)NULL);
+ item.hItem = (HTREEITEM)SendMessageW(tree, TVM_GETNEXTITEM, TVGN_CARET, 0);
SendMessageW(tree, TVM_GETITEMW, 0, (LPARAM)&item);
data = get_hierarchy_data_from_tree_item(tree, item.hItem);
selection = lparam_to_index(data, item.lParam);
@@ -4137,7 +4215,7 @@ static LRESULT CALLBACK hierarchy_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
memset(&item, 0, sizeof(item));
item.mask = TVIF_HANDLE | TVIF_PARAM;
item.hItem = (HTREEITEM)SendMessageW(tree, TVM_GETNEXTITEM, TVGN_ROOT,
- (LPARAM)NULL);
+ 0);
data = get_hierarchy_data_from_tree_item(tree, item.hItem);
/* Delete the contents of the tree */
SendMessageW(tree, TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT);
diff --git a/dll/win32/dwmapi/dwmapi_main.c b/dll/win32/dwmapi/dwmapi_main.c
index 60420282966..ee866912a35 100644
--- a/dll/win32/dwmapi/dwmapi_main.c
+++ b/dll/win32/dwmapi/dwmapi_main.c
@@ -54,7 +54,14 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
*/
HRESULT WINAPI DwmIsCompositionEnabled(BOOL *enabled)
{
- FIXME("%p\n", enabled);
+ static int once;
+ if (!once)
+ {
+ FIXME("%p\n", enabled);
+ once = 1;
+ }
+ else
+ TRACE("%p\n", enabled);
*enabled = FALSE;
return S_OK;
diff --git a/dll/win32/fusion/asmname.c b/dll/win32/fusion/asmname.c
index 913674aa80e..3c014ea3244 100644
--- a/dll/win32/fusion/asmname.c
+++ b/dll/win32/fusion/asmname.c
@@ -471,6 +471,11 @@ static HRESULT parse_display_name(IAssemblyNameImpl *name, LPCWSTR szAssemblyNam
done:
HeapFree(GetProcessHeap(), 0, save);
+ if (FAILED(hr))
+ {
+ HeapFree(GetProcessHeap(), 0, name->displayname);
+ HeapFree(GetProcessHeap(), 0, name->name);
+ }
return hr;
}
diff --git a/dll/win32/fusion/fusion_main.c b/dll/win32/fusion/fusion_main.c
index 8bc4b1e3349..5c9d77646e0 100644
--- a/dll/win32/fusion/fusion_main.c
+++ b/dll/win32/fusion/fusion_main.c
@@ -34,6 +34,8 @@ 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;
diff --git a/dll/win32/gdiplus/brush.c b/dll/win32/gdiplus/brush.c
index bfce7d85bb5..2f2143dba58 100644
--- a/dll/win32/gdiplus/brush.c
+++ b/dll/win32/gdiplus/brush.c
@@ -87,13 +87,11 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone)
break;
}
case BrushTypeHatchFill:
- *clone = GdipAlloc(sizeof(GpHatch));
- if (!*clone) return OutOfMemory;
+ {
+ GpHatch *hatch = (GpHatch*)brush;
- memcpy(*clone, brush, sizeof(GpHatch));
-
- (*clone)->gdibrush = CreateBrushIndirect(&(*clone)->lb);
- break;
+ return GdipCreateHatchBrush(hatch->hatchstyle, hatch->forecol, hatch->backcol, (GpHatch**)clone);
+ }
case BrushTypePathGradient:{
GpPathGradient *src, *dest;
INT count;
@@ -189,18 +187,29 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone)
break;
}
case BrushTypeTextureFill:
- *clone = GdipAlloc(sizeof(GpTexture));
- if(!*clone) return OutOfMemory;
+ {
+ GpStatus stat;
+ GpTexture *texture = (GpTexture*)brush;
+ GpTexture *new_texture;
- memcpy(*clone, brush, sizeof(GpTexture));
+ stat = GdipCreateTexture(texture->image, texture->wrap, &new_texture);
- (*clone)->gdibrush = CreateBrushIndirect(&(*clone)->lb);
- break;
+ if (stat == Ok)
+ {
+ memcpy(new_texture->transform, texture->transform, sizeof(GpMatrix));
+ *clone = (GpBrush*)new_texture;
+ }
+ else
+ *clone = NULL;
+
+ return stat;
+ }
default:
ERR("not implemented for brush type %d\n", brush->bt);
return NotImplemented;
}
+ TRACE("<-- %p\n", *clone);
return Ok;
}
@@ -317,6 +326,7 @@ GpStatus WINGDIPAPI GdipCreateHatchBrush(HatchStyle hatchstyle, ARGB forecol, AR
(*brush)->forecol = forecol;
(*brush)->backcol = backcol;
(*brush)->hatchstyle = hatchstyle;
+ TRACE("<-- %p\n", *brush);
}
else
{
@@ -336,8 +346,8 @@ GpStatus WINGDIPAPI GdipCreateLineBrush(GDIPCONST GpPointF* startpoint,
{
COLORREF col = ARGB2COLORREF(startcolor);
- TRACE("(%p, %p, %x, %x, %d, %p)\n", startpoint, endpoint,
- startcolor, endcolor, wrap, line);
+ TRACE("(%s, %s, %x, %x, %d, %p)\n", debugstr_pointf(startpoint),
+ debugstr_pointf(endpoint), startcolor, endcolor, wrap, line);
if(!line || !startpoint || !endpoint || wrap == WrapModeClamp)
return InvalidParameter;
@@ -397,6 +407,8 @@ GpStatus WINGDIPAPI GdipCreateLineBrush(GDIPCONST GpPointF* startpoint,
(*line)->pblendpos = NULL;
(*line)->pblendcount = 0;
+ TRACE("<-- %p\n", *line);
+
return Ok;
}
@@ -491,20 +503,74 @@ GpStatus WINGDIPAPI GdipCreateLineBrushFromRectI(GDIPCONST GpRect* rect,
/******************************************************************************
* GdipCreateLineBrushFromRectWithAngle [GDIPLUS.@]
- *
- * FIXME: angle value completely ignored. Don't know how to use it since native
- * always set Brush rectangle to rect (independetly of this angle).
- * Maybe it's used only on drawing.
*/
GpStatus WINGDIPAPI GdipCreateLineBrushFromRectWithAngle(GDIPCONST GpRectF* rect,
ARGB startcolor, ARGB endcolor, REAL angle, BOOL isAngleScalable, GpWrapMode wrap,
GpLineGradient **line)
{
+ GpStatus stat;
+ LinearGradientMode mode;
+ REAL width, height, exofs, eyofs;
+ REAL sin_angle, cos_angle, sin_cos_angle;
+
TRACE("(%p, %x, %x, %.2f, %d, %d, %p)\n", rect, startcolor, endcolor, angle, isAngleScalable,
wrap, line);
- return GdipCreateLineBrushFromRect(rect, startcolor, endcolor, LinearGradientModeForwardDiagonal,
- wrap, line);
+ sin_angle = sinf(deg2rad(angle));
+ cos_angle = cosf(deg2rad(angle));
+ sin_cos_angle = sin_angle * cos_angle;
+
+ if (isAngleScalable)
+ {
+ width = height = 1.0;
+ }
+ else
+ {
+ width = rect->Width;
+ height = rect->Height;
+ }
+
+ if (sin_cos_angle >= 0)
+ mode = LinearGradientModeForwardDiagonal;
+ else
+ mode = LinearGradientModeBackwardDiagonal;
+
+ stat = GdipCreateLineBrushFromRect(rect, startcolor, endcolor, mode, wrap, line);
+
+ if (stat == Ok)
+ {
+ if (sin_cos_angle >= 0)
+ {
+ exofs = width * sin_cos_angle + height * cos_angle * cos_angle;
+ eyofs = width * sin_angle * sin_angle + height * sin_cos_angle;
+ }
+ else
+ {
+ exofs = width * sin_angle * sin_angle + height * sin_cos_angle;
+ eyofs = -width * sin_cos_angle + height * sin_angle * sin_angle;
+ }
+
+ if (isAngleScalable)
+ {
+ exofs = exofs * rect->Width;
+ eyofs = eyofs * rect->Height;
+ }
+
+ if (sin_angle >= 0)
+ {
+ (*line)->endpoint.X = rect->X + exofs;
+ (*line)->endpoint.Y = rect->Y + eyofs;
+ }
+ else
+ {
+ (*line)->endpoint.X = (*line)->startpoint.X;
+ (*line)->endpoint.Y = (*line)->startpoint.Y;
+ (*line)->startpoint.X = rect->X + exofs;
+ (*line)->startpoint.Y = rect->Y + eyofs;
+ }
+ }
+
+ return stat;
}
GpStatus WINGDIPAPI GdipCreateLineBrushFromRectWithAngleI(GDIPCONST GpRect* rect,
@@ -571,6 +637,8 @@ GpStatus WINGDIPAPI GdipCreatePathGradient(GDIPCONST GpPointF* points,
(*grad)->focus.X = 0.0;
(*grad)->focus.Y = 0.0;
+ TRACE("<-- %p\n", *grad);
+
return Ok;
}
@@ -661,6 +729,8 @@ GpStatus WINGDIPAPI GdipCreatePathGradientFromPath(GDIPCONST GpPath* path,
(*grad)->focus.X = 0.0;
(*grad)->focus.Y = 0.0;
+ TRACE("<-- %p\n", *grad);
+
return Ok;
}
@@ -687,6 +757,8 @@ GpStatus WINGDIPAPI GdipCreateSolidFill(ARGB color, GpSolidFill **sf)
(*sf)->color = color;
(*sf)->bmp = ARGB2BMP(color);
+ TRACE("<-- %p\n", *sf);
+
return Ok;
}
@@ -749,14 +821,9 @@ GpStatus WINGDIPAPI GdipCreateTextureIA(GpImage *image,
GDIPCONST GpImageAttributes *imageattr, REAL x, REAL y, REAL width,
REAL height, GpTexture **texture)
{
- HDC hdc;
- HBITMAP hbm, old = NULL;
- BITMAPINFO *pbmi;
- BITMAPINFOHEADER *bmih;
- INT n_x, n_y, n_width, n_height, abs_height, stride, image_stride, i, bytespp;
- BOOL bm_is_selected;
- BYTE *dibits, *buff, *textbits;
+ HBITMAP hbm;
GpStatus status;
+ GpImage *new_image=NULL;
TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f, %p)\n", image, imageattr, x, y, width, height,
texture);
@@ -764,124 +831,61 @@ GpStatus WINGDIPAPI GdipCreateTextureIA(GpImage *image,
if(!image || !texture || x < 0.0 || y < 0.0 || width < 0.0 || height < 0.0)
return InvalidParameter;
+ *texture = NULL;
+
if(image->type != ImageTypeBitmap){
FIXME("not implemented for image type %d\n", image->type);
return NotImplemented;
}
- n_x = roundr(x);
- n_y = roundr(y);
- n_width = roundr(width);
- n_height = roundr(height);
+ status = GdipCloneBitmapArea(x, y, width, height, PixelFormatDontCare, (GpBitmap*)image, (GpBitmap**)&new_image);
+ if (status != Ok)
+ return status;
- if(n_x + n_width > ((GpBitmap*)image)->width ||
- n_y + n_height > ((GpBitmap*)image)->height)
- return InvalidParameter;
-
- hbm = ((GpBitmap*)image)->hbitmap;
- if(!hbm) return GenericError;
- hdc = ((GpBitmap*)image)->hdc;
- bm_is_selected = (hdc != 0);
-
- pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
- if (!pbmi)
- return OutOfMemory;
- pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- pbmi->bmiHeader.biBitCount = 0;
-
- if(!bm_is_selected){
- hdc = CreateCompatibleDC(0);
- old = SelectObject(hdc, hbm);
+ hbm = ((GpBitmap*)new_image)->hbitmap;
+ if(!hbm)
+ {
+ status = GenericError;
+ goto exit;
}
- /* fill out bmi */
- GetDIBits(hdc, hbm, 0, 0, NULL, pbmi, DIB_RGB_COLORS);
-
- bytespp = pbmi->bmiHeader.biBitCount / 8;
- abs_height = abs(pbmi->bmiHeader.biHeight);
-
- if(n_x > pbmi->bmiHeader.biWidth || n_x + n_width > pbmi->bmiHeader.biWidth ||
- n_y > abs_height || n_y + n_height > abs_height){
- GdipFree(pbmi);
- return InvalidParameter;
- }
-
- dibits = GdipAlloc(pbmi->bmiHeader.biSizeImage);
-
- if(dibits) /* this is not a good place to error out */
- GetDIBits(hdc, hbm, 0, abs_height, dibits, pbmi, DIB_RGB_COLORS);
-
- if(!bm_is_selected){
- SelectObject(hdc, old);
- DeleteDC(hdc);
- }
-
- if(!dibits){
- GdipFree(pbmi);
- return OutOfMemory;
- }
-
- image_stride = (pbmi->bmiHeader.biWidth * bytespp + 3) & ~3;
- stride = (n_width * bytespp + 3) & ~3;
- buff = GdipAlloc(sizeof(BITMAPINFOHEADER) + stride * n_height);
- if(!buff){
- GdipFree(pbmi);
- GdipFree(dibits);
- return OutOfMemory;
- }
-
- bmih = (BITMAPINFOHEADER*)buff;
- textbits = (BYTE*) (bmih + 1);
- bmih->biSize = sizeof(BITMAPINFOHEADER);
- bmih->biWidth = n_width;
- bmih->biHeight = n_height;
- bmih->biCompression = BI_RGB;
- bmih->biSizeImage = stride * n_height;
- bmih->biBitCount = pbmi->bmiHeader.biBitCount;
- bmih->biClrUsed = 0;
- bmih->biPlanes = 1;
-
- /* image is flipped */
- if(pbmi->bmiHeader.biHeight > 0){
- dibits += image_stride * (pbmi->bmiHeader.biHeight - 1);
- image_stride *= -1;
- textbits += stride * (n_height - 1);
- stride *= -1;
- }
-
- GdipFree(pbmi);
-
- for(i = 0; i < n_height; i++)
- memcpy(&textbits[i * stride],
- &dibits[n_x * bytespp + (n_y + i) * image_stride],
- abs(stride));
-
*texture = GdipAlloc(sizeof(GpTexture));
if (!*texture){
- GdipFree(dibits);
- GdipFree(buff);
- return OutOfMemory;
+ status = OutOfMemory;
+ goto exit;
}
if((status = GdipCreateMatrix(&(*texture)->transform)) != Ok){
- GdipFree(*texture);
- GdipFree(dibits);
- GdipFree(buff);
- return status;
+ goto exit;
}
- (*texture)->brush.lb.lbStyle = BS_DIBPATTERNPT;
- (*texture)->brush.lb.lbColor = DIB_RGB_COLORS;
- (*texture)->brush.lb.lbHatch = (ULONG_PTR)buff;
+ (*texture)->brush.lb.lbStyle = BS_PATTERN;
+ (*texture)->brush.lb.lbColor = 0;
+ (*texture)->brush.lb.lbHatch = (ULONG_PTR)hbm;
(*texture)->brush.gdibrush = CreateBrushIndirect(&(*texture)->brush.lb);
(*texture)->brush.bt = BrushTypeTextureFill;
(*texture)->wrap = imageattr->wrap;
+ (*texture)->image = new_image;
- GdipFree(dibits);
- GdipFree(buff);
+exit:
+ if (status == Ok)
+ {
+ TRACE("<-- %p\n", *texture);
+ }
+ else
+ {
+ if (*texture)
+ {
+ GdipDeleteMatrix((*texture)->transform);
+ GdipFree(*texture);
+ *texture = NULL;
+ }
+ GdipDisposeImage(new_image);
+ TRACE("<-- error %u\n", status);
+ }
- return Ok;
+ return status;
}
/******************************************************************************
@@ -979,6 +983,7 @@ GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush *brush)
break;
case BrushTypeTextureFill:
GdipDeleteMatrix(((GpTexture*)brush)->transform);
+ GdipDisposeImage(((GpTexture*)brush)->image);
break;
default:
break;
@@ -1175,6 +1180,8 @@ GpStatus WINGDIPAPI GdipGetPathGradientSurroundColorsWithCount(GpPathGradient
{
static int calls;
+ TRACE("(%p,%p,%p)\n", grad, argb, count);
+
if(!grad || !argb || !count || (*count < grad->pathdata.Count))
return InvalidParameter;
@@ -1209,6 +1216,19 @@ GpStatus WINGDIPAPI GdipGetSolidFillColor(GpSolidFill *sf, ARGB *argb)
return Ok;
}
+/******************************************************************************
+ * GdipGetTextureImage [GDIPLUS.@]
+ */
+GpStatus WINGDIPAPI GdipGetTextureImage(GpTexture *brush, GpImage **image)
+{
+ TRACE("(%p, %p)\n", brush, image);
+
+ if(!brush || !image)
+ return InvalidParameter;
+
+ return GdipCloneImage(brush->image, image);
+}
+
/******************************************************************************
* GdipGetTextureTransform [GDIPLUS.@]
*/
@@ -1430,6 +1450,8 @@ GpStatus WINGDIPAPI GdipSetPathGradientBlend(GpPathGradient *brush, GDIPCONST RE
{
static int calls;
+ TRACE("(%p,%p,%p,%i)\n", brush, blend, pos, count);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -1463,7 +1485,7 @@ GpStatus WINGDIPAPI GdipSetPathGradientCenterColor(GpPathGradient *grad,
GpStatus WINGDIPAPI GdipSetPathGradientCenterPoint(GpPathGradient *grad,
GpPointF *point)
{
- TRACE("(%p, %p)\n", grad, point);
+ TRACE("(%p, %s)\n", grad, debugstr_pointf(point));
if(!grad || !point)
return InvalidParameter;
@@ -1522,6 +1544,8 @@ GpStatus WINGDIPAPI GdipSetPathGradientSigmaBlend(GpPathGradient *grad,
{
static int calls;
+ TRACE("(%p,%0.2f,%0.2f)\n", grad, focus, scale);
+
if(!grad || focus < 0.0 || focus > 1.0 || scale < 0.0 || scale > 1.0)
return InvalidParameter;
@@ -1536,6 +1560,8 @@ GpStatus WINGDIPAPI GdipSetPathGradientSurroundColorsWithCount(GpPathGradient
{
static int calls;
+ TRACE("(%p,%p,%p)\n", grad, argb, count);
+
if(!grad || !argb || !count || (*count <= 0) ||
(*count > grad->pathdata.Count))
return InvalidParameter;
@@ -1749,6 +1775,8 @@ GpStatus WINGDIPAPI GdipResetLineTransform(GpLineGradient *brush)
{
static int calls;
+ TRACE("(%p)\n", brush);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -1760,6 +1788,8 @@ GpStatus WINGDIPAPI GdipSetLineTransform(GpLineGradient *brush,
{
static int calls;
+ TRACE("(%p,%p)\n", brush, matrix);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -1771,6 +1801,8 @@ GpStatus WINGDIPAPI GdipScaleLineTransform(GpLineGradient *brush, REAL sx, REAL
{
static int calls;
+ TRACE("(%p,%0.2f,%0.2f,%u)\n", brush, sx, sy, order);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -1838,6 +1870,8 @@ GpStatus WINGDIPAPI GdipRotateLineTransform(GpLineGradient* brush,
{
static int calls;
+ TRACE("(%p,%0.2f,%u)\n", brush, angle, order);
+
if(!brush)
return InvalidParameter;
diff --git a/dll/win32/gdiplus/customlinecap.c b/dll/win32/gdiplus/customlinecap.c
index 5658e69c00d..00c228bf3cf 100644
--- a/dll/win32/gdiplus/customlinecap.c
+++ b/dll/win32/gdiplus/customlinecap.c
@@ -57,6 +57,8 @@ GpStatus WINGDIPAPI GdipCloneCustomLineCap(GpCustomLineCap* from,
* sizeof(PointF));
memcpy((*to)->pathdata.Types, from->pathdata.Types, from->pathdata.Count);
+ TRACE("<-- %p\n", *to);
+
return Ok;
}
@@ -105,6 +107,8 @@ GpStatus WINGDIPAPI GdipCreateCustomLineCap(GpPath* fillPath, GpPath* strokePath
(*customCap)->join = LineJoinMiter;
(*customCap)->scale = 1.0;
+ TRACE("<-- %p\n", *customCap);
+
return Ok;
}
@@ -153,6 +157,8 @@ GpStatus WINGDIPAPI GdipSetCustomLineCapStrokeCaps(GpCustomLineCap* custom,
{
static int calls;
+ TRACE("(%p,%u,%u)\n", custom, start, end);
+
if(!custom)
return InvalidParameter;
@@ -167,6 +173,8 @@ GpStatus WINGDIPAPI GdipSetCustomLineCapBaseCap(GpCustomLineCap* custom,
{
static int calls;
+ TRACE("(%p,%u)\n", custom, base);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -191,6 +199,8 @@ GpStatus WINGDIPAPI GdipSetCustomLineCapBaseInset(GpCustomLineCap* custom,
{
static int calls;
+ TRACE("(%p,%0.2f)\n", custom, inset);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -216,6 +226,8 @@ GpStatus WINGDIPAPI GdipSetCustomLineCapWidthScale(GpCustomLineCap* custom,
{
static int calls;
+ TRACE("(%p,%0.2f)\n", custom, width);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -239,6 +251,8 @@ GpStatus WINGDIPAPI GdipCreateAdjustableArrowCap(REAL height, REAL width, BOOL f
{
static int calls;
+ TRACE("(%0.2f,%0.2f,%i,%p)\n", height, width, fill, cap);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -249,6 +263,8 @@ GpStatus WINGDIPAPI GdipGetAdjustableArrowCapFillState(GpAdjustableArrowCap* cap
{
static int calls;
+ TRACE("(%p,%p)\n", cap, fill);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -259,6 +275,8 @@ GpStatus WINGDIPAPI GdipGetAdjustableArrowCapHeight(GpAdjustableArrowCap* cap, R
{
static int calls;
+ TRACE("(%p,%p)\n", cap, height);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -269,6 +287,8 @@ GpStatus WINGDIPAPI GdipGetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap* c
{
static int calls;
+ TRACE("(%p,%p)\n", cap, middle);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -279,6 +299,8 @@ GpStatus WINGDIPAPI GdipGetAdjustableArrowCapWidth(GpAdjustableArrowCap* cap, RE
{
static int calls;
+ TRACE("(%p,%p)\n", cap, width);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -289,6 +311,8 @@ GpStatus WINGDIPAPI GdipSetAdjustableArrowCapFillState(GpAdjustableArrowCap* cap
{
static int calls;
+ TRACE("(%p,%i)\n", cap, fill);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -299,6 +323,8 @@ GpStatus WINGDIPAPI GdipSetAdjustableArrowCapHeight(GpAdjustableArrowCap* cap, R
{
static int calls;
+ TRACE("(%p,%0.2f)\n", cap, height);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -309,6 +335,8 @@ GpStatus WINGDIPAPI GdipSetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap* c
{
static int calls;
+ TRACE("(%p,%0.2f)\n", cap, middle);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -319,6 +347,8 @@ GpStatus WINGDIPAPI GdipSetAdjustableArrowCapWidth(GpAdjustableArrowCap* cap, RE
{
static int calls;
+ TRACE("(%p,%0.2f)\n", cap, width);
+
if(!(calls++))
FIXME("not implemented\n");
diff --git a/dll/win32/gdiplus/font.c b/dll/win32/gdiplus/font.c
index 89498bce0d0..fda5428a7dd 100644
--- a/dll/win32/gdiplus/font.c
+++ b/dll/win32/gdiplus/font.c
@@ -158,6 +158,8 @@ GpStatus WINGDIPAPI GdipCreateFont(GDIPCONST GpFontFamily *fontFamily,
(*font)->height = tmw->ntmSizeEM;
(*font)->line_spacing = tmw->tmAscent + tmw->tmDescent + tmw->tmExternalLeading;
+ TRACE("<-- %p\n", *font);
+
return Ok;
}
@@ -205,6 +207,8 @@ GpStatus WINGDIPAPI GdipCreateFontFromLogfontW(HDC hdc,
SelectObject(hdc, oldfont);
DeleteObject(hfont);
+ TRACE("<-- %p\n", *font);
+
return Ok;
}
@@ -583,6 +587,8 @@ GpStatus WINGDIPAPI GdipCreateFontFamilyFromName(GDIPCONST WCHAR *name,
*FontFamily = ffamily;
+ TRACE("<-- %p\n", ffamily);
+
return Ok;
}
@@ -611,6 +617,8 @@ GpStatus WINGDIPAPI GdipCloneFontFamily(GpFontFamily* FontFamily, GpFontFamily**
(*clonedFontFamily)->tmw = FontFamily->tmw;
lstrcpyW((*clonedFontFamily)->FamilyName, FontFamily->FamilyName);
+ TRACE("<-- %p\n", *clonedFontFamily);
+
return Ok;
}
@@ -845,6 +853,9 @@ GpStatus WINGDIPAPI GdipNewPrivateFontCollection(GpFontCollection** fontCollecti
(*fontCollection)->FontFamilies = NULL;
(*fontCollection)->count = 0;
(*fontCollection)->allocated = 0;
+
+ TRACE("<-- %p\n", *fontCollection);
+
return Ok;
}
diff --git a/dll/win32/gdiplus/gdiplus.c b/dll/win32/gdiplus/gdiplus.c
index 9fe933280ab..383f53621fb 100644
--- a/dll/win32/gdiplus/gdiplus.c
+++ b/dll/win32/gdiplus/gdiplus.c
@@ -58,9 +58,6 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved)
switch(reason)
{
- case DLL_WINE_PREATTACH:
- return FALSE; /* prefer native version */
-
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls( hinst );
break;
@@ -444,3 +441,9 @@ const char *debugstr_rectf(CONST RectF* rc)
if (!rc) return "(null)";
return wine_dbg_sprintf("(%0.2f,%0.2f,%0.2f,%0.2f)", rc->X, rc->Y, rc->Width, rc->Height);
}
+
+const char *debugstr_pointf(CONST PointF* pt)
+{
+ if (!pt) return "(null)";
+ return wine_dbg_sprintf("(%0.2f,%0.2f)", pt->X, pt->Y);
+}
diff --git a/dll/win32/gdiplus/gdiplus.spec b/dll/win32/gdiplus/gdiplus.spec
index aa64a3cb311..e6cea5ad443 100644
--- a/dll/win32/gdiplus/gdiplus.spec
+++ b/dll/win32/gdiplus/gdiplus.spec
@@ -290,7 +290,7 @@
@ stdcall GdipGetImageGraphicsContext(ptr ptr)
@ stdcall GdipGetImageHeight(ptr ptr)
@ stdcall GdipGetImageHorizontalResolution(ptr ptr)
-@ stub GdipGetImageItemData
+@ stdcall GdipGetImageItemData(ptr ptr)
@ stdcall GdipGetImagePalette(ptr ptr long)
@ stdcall GdipGetImagePaletteSize(ptr ptr)
@ stdcall GdipGetImagePixelFormat(ptr ptr)
@@ -381,7 +381,7 @@
@ stdcall GdipGetRegionDataSize(ptr ptr)
@ stdcall GdipGetRegionHRgn(ptr ptr ptr)
@ stub GdipGetRegionScans
-@ stub GdipGetRegionScansCount
+@ stdcall GdipGetRegionScansCount(ptr ptr ptr)
@ stub GdipGetRegionScansI
@ stub GdipGetRenderingOrigin
@ stdcall GdipGetSmoothingMode(ptr ptr)
@@ -397,7 +397,7 @@
@ stdcall GdipGetStringFormatTrimming(ptr ptr)
@ stdcall GdipGetTextContrast(ptr ptr)
@ stdcall GdipGetTextRenderingHint(ptr ptr)
-@ stub GdipGetTextureImage
+@ stdcall GdipGetTextureImage(ptr ptr)
@ stdcall GdipGetTextureTransform(ptr ptr)
@ stdcall GdipGetTextureWrapMode(ptr ptr)
@ stdcall GdipGetVisibleClipBounds(ptr ptr)
@@ -424,7 +424,7 @@
@ stdcall GdipIsOutlineVisiblePathPoint(ptr long long ptr ptr ptr)
@ stdcall GdipIsOutlineVisiblePathPointI(ptr long long ptr ptr ptr)
@ stdcall GdipIsStyleAvailable(ptr long ptr)
-@ stub GdipIsVisibleClipEmpty
+@ stdcall GdipIsVisibleClipEmpty(ptr ptr)
@ stdcall GdipIsVisiblePathPoint(ptr long long ptr ptr)
@ stdcall GdipIsVisiblePathPointI(ptr long long ptr ptr)
@ stdcall GdipIsVisiblePoint(ptr long long ptr)
diff --git a/dll/win32/gdiplus/gdiplus_private.h b/dll/win32/gdiplus/gdiplus_private.h
index 0ceeb6e0e8b..ca1cba6175c 100644
--- a/dll/win32/gdiplus/gdiplus_private.h
+++ b/dll/win32/gdiplus/gdiplus_private.h
@@ -80,9 +80,15 @@ static inline REAL deg2rad(REAL degrees)
extern const char *debugstr_rectf(CONST RectF* rc);
+extern const char *debugstr_pointf(CONST PointF* pt);
+
extern void convert_32bppARGB_to_32bppPARGB(UINT width, UINT height,
BYTE *dst_bits, INT dst_stride, const BYTE *src_bits, INT src_stride);
+extern GpStatus convert_pixels(UINT width, UINT height,
+ INT dst_stride, BYTE *dst_bits, PixelFormat dst_format,
+ INT src_stride, const BYTE *src_bits, PixelFormat src_format, ARGB *src_palette);
+
struct GpPen{
UINT style;
GpUnit unit;
@@ -174,6 +180,7 @@ struct GpLineGradient{
struct GpTexture{
GpBrush brush;
GpMatrix *transform;
+ GpImage *image;
WrapMode wrap; /* not used yet */
};
@@ -217,6 +224,7 @@ struct GpImage{
UINT palette_count;
UINT palette_size;
ARGB *palette_entries;
+ REAL xres, yres;
};
struct GpMetafile{
@@ -249,9 +257,26 @@ struct color_key{
ARGB high;
};
+struct color_matrix{
+ BOOL enabled;
+ ColorMatrixFlags flags;
+ ColorMatrix colormatrix;
+ ColorMatrix graymatrix;
+};
+
+struct color_remap_table{
+ BOOL enabled;
+ INT mapsize;
+ GDIPCONST ColorMap *colormap;
+};
+
struct GpImageAttributes{
WrapMode wrap;
struct color_key colorkeys[ColorAdjustTypeCount];
+ struct color_matrix colormatrices[ColorAdjustTypeCount];
+ struct color_remap_table colorremaptables[ColorAdjustTypeCount];
+ BOOL gamma_enabled[ColorAdjustTypeCount];
+ REAL gamma[ColorAdjustTypeCount];
};
struct GpFont{
@@ -274,6 +299,8 @@ struct GpStringFormat{
INT tabcount;
REAL firsttab;
REAL *tabs;
+ CharacterRange *character_ranges;
+ INT range_count;
};
struct GpFontCollection{
diff --git a/dll/win32/gdiplus/graphics.c b/dll/win32/gdiplus/graphics.c
index b1092b77621..1fd870e3d42 100644
--- a/dll/win32/gdiplus/graphics.c
+++ b/dll/win32/gdiplus/graphics.c
@@ -1162,6 +1162,8 @@ GpStatus WINGDIPAPI GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **gra
list_init(&(*graphics)->containers);
(*graphics)->contid = 0;
+ TRACE("<-- %p\n", *graphics);
+
return Ok;
}
@@ -1199,6 +1201,8 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromEmf(HENHMETAFILE hemf, BOOL delete,
{
static int calls;
+ TRACE("(%p,%i,%p)\n", hemf, delete, metafile);
+
if(!hemf || !metafile)
return InvalidParameter;
@@ -1215,7 +1219,7 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE hwmf, BOOL delete,
UINT read;
BYTE* copy;
HENHMETAFILE hemf;
- GpStatus retval = GenericError;
+ GpStatus retval = Ok;
TRACE("(%p, %d, %p, %p)\n", hwmf, delete, placeable, metafile);
@@ -1240,6 +1244,7 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE hwmf, BOOL delete,
if(CreateStreamOnHGlobal(copy, TRUE, &stream) != S_OK){
ERR("could not make stream\n");
GdipFree(copy);
+ retval = GenericError;
goto err;
}
@@ -1251,7 +1256,10 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE hwmf, BOOL delete,
if(OleLoadPicture(stream, 0, FALSE, &IID_IPicture,
(LPVOID*) &((*metafile)->image.picture)) != S_OK)
+ {
+ retval = GenericError;
goto err;
+ }
(*metafile)->image.type = ImageTypeMetafile;
@@ -1260,8 +1268,10 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE hwmf, BOOL delete,
(*metafile)->image.palette_count = 0;
(*metafile)->image.palette_size = 0;
(*metafile)->image.palette_entries = NULL;
+ (*metafile)->image.xres = (REAL)placeable->Inch;
+ (*metafile)->image.yres = (REAL)placeable->Inch;
(*metafile)->bounds.X = ((REAL) placeable->BoundingBox.Left) / ((REAL) placeable->Inch);
- (*metafile)->bounds.Y = ((REAL) placeable->BoundingBox.Right) / ((REAL) placeable->Inch);
+ (*metafile)->bounds.Y = ((REAL) placeable->BoundingBox.Top) / ((REAL) placeable->Inch);
(*metafile)->bounds.Width = ((REAL) (placeable->BoundingBox.Right
- placeable->BoundingBox.Left)) / ((REAL) placeable->Inch);
(*metafile)->bounds.Height = ((REAL) (placeable->BoundingBox.Bottom
@@ -1271,10 +1281,11 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE hwmf, BOOL delete,
if(delete)
DeleteMetaFile(hwmf);
- return Ok;
+ TRACE("<-- %p\n", *metafile);
err:
- GdipFree(*metafile);
+ if (retval != Ok)
+ GdipFree(*metafile);
IStream_Release(stream);
return retval;
}
@@ -1872,6 +1883,9 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
if(!graphics || !image || !points || count != 3)
return InvalidParameter;
+ TRACE("%s %s %s\n", debugstr_pointf(&points[0]), debugstr_pointf(&points[1]),
+ debugstr_pointf(&points[2]));
+
memcpy(ptf, points, 3 * sizeof(GpPointF));
transform_and_round_points(graphics, pti, ptf, 3);
@@ -1912,12 +1926,16 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
else
return NotImplemented;
- if (bitmap->format == PixelFormat32bppARGB)
+ if (!(bitmap->format == PixelFormat16bppRGB555 ||
+ bitmap->format == PixelFormat24bppRGB ||
+ bitmap->format == PixelFormat32bppRGB ||
+ bitmap->format == PixelFormat32bppPARGB))
{
BITMAPINFOHEADER bih;
BYTE *temp_bits;
+ PixelFormat dst_format;
- /* we need a bitmap with premultiplied alpha */
+ /* we can't draw a bitmap of this format directly */
hdc = CreateCompatibleDC(0);
temp_hdc = 1;
temp_bitmap = 1;
@@ -1937,8 +1955,14 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
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);
+ if (bitmap->format & (PixelFormatAlpha|PixelFormatPAlpha))
+ dst_format = PixelFormat32bppPARGB;
+ else
+ dst_format = PixelFormat32bppRGB;
+
+ convert_pixels(bitmap->width, bitmap->height,
+ bitmap->width*4, temp_bits, dst_format,
+ bitmap->stride, bitmap->bits, bitmap->format, bitmap->image.palette_entries);
}
else
{
@@ -1953,7 +1977,7 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
old_hbm = SelectObject(hdc, hbitmap);
}
- if (bitmap->format == PixelFormat32bppARGB || bitmap->format == PixelFormat32bppPARGB)
+ if (bitmap->format & (PixelFormatAlpha|PixelFormatPAlpha))
{
BLENDFUNCTION bf;
@@ -3052,6 +3076,8 @@ GpStatus WINGDIPAPI GdipFlush(GpGraphics *graphics, GpFlushIntention intention)
{
static int calls;
+ TRACE("(%p,%u)\n", graphics, intention);
+
if(!graphics)
return InvalidParameter;
@@ -3147,17 +3173,18 @@ GpStatus WINGDIPAPI GdipGetInterpolationMode(GpGraphics *graphics,
return Ok;
}
+/* FIXME: Need to handle color depths less than 24bpp */
GpStatus WINGDIPAPI GdipGetNearestColor(GpGraphics *graphics, ARGB* argb)
{
+ FIXME("(%p, %p): Passing color unmodified\n", graphics, argb);
+
if(!graphics || !argb)
return InvalidParameter;
if(graphics->busy)
return ObjectBusy;
- FIXME("(%p, %p): stub\n", graphics, argb);
-
- return NotImplemented;
+ return Ok;
}
GpStatus WINGDIPAPI GdipGetPageScale(GpGraphics *graphics, REAL *scale)
@@ -3443,12 +3470,12 @@ GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics,
GDIPCONST RectF* layoutRect, GDIPCONST GpStringFormat *stringFormat,
INT regionCount, GpRegion** regions)
{
- if (!(graphics && string && font && layoutRect && stringFormat && regions))
- return InvalidParameter;
-
FIXME("stub: %p %s %d %p %p %p %d %p\n", graphics, debugstr_w(string),
length, font, layoutRect, stringFormat, regionCount, regions);
+ if (!(graphics && string && font && layoutRect && stringFormat && regions))
+ return InvalidParameter;
+
return NotImplemented;
}
@@ -4001,6 +4028,8 @@ GpStatus WINGDIPAPI GdipSetMetafileDownLevelRasterizationLimit(GpMetafile *metaf
{
static int calls;
+ TRACE("(%p,%u)\n", metafile, limitDpi);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -4341,3 +4370,26 @@ GpStatus WINGDIPAPI GdipRecordMetafileI(HDC hdc, EmfType type, GDIPCONST GpRect
FIXME("(%p %d %p %d %p %p): stub\n", hdc, type, frameRect, frameUnit, desc, metafile);
return NotImplemented;
}
+
+/*****************************************************************************
+ * GdipIsVisibleClipEmpty [GDIPLUS.@]
+ */
+GpStatus WINGDIPAPI GdipIsVisibleClipEmpty(GpGraphics *graphics, BOOL *res)
+{
+ GpStatus stat;
+ GpRegion* rgn;
+
+ TRACE("(%p, %p)\n", graphics, res);
+
+ if((stat = GdipCreateRegion(&rgn)) != Ok)
+ return stat;
+
+ if((stat = get_visible_clip_region(graphics, rgn)) != Ok)
+ goto cleanup;
+
+ stat = GdipIsEmptyRegion(rgn, graphics, res);
+
+cleanup:
+ GdipDeleteRegion(rgn);
+ return stat;
+}
diff --git a/dll/win32/gdiplus/graphicspath.c b/dll/win32/gdiplus/graphicspath.c
index 94e17dda39c..60ddda1d7b5 100644
--- a/dll/win32/gdiplus/graphicspath.c
+++ b/dll/win32/gdiplus/graphicspath.c
@@ -1380,6 +1380,8 @@ GpStatus WINGDIPAPI GdipIsOutlineVisiblePathPoint(GpPath* path, REAL x, REAL y,
{
static int calls;
+ TRACE("(%p,%0.2f,%0.2f,%p,%p,%p)\n", path, x, y, pen, graphics, result);
+
if(!path || !pen)
return InvalidParameter;
diff --git a/dll/win32/gdiplus/image.c b/dll/win32/gdiplus/image.c
index 3dbe4daf8be..d72d4cfbb8a 100644
--- a/dll/win32/gdiplus/image.c
+++ b/dll/win32/gdiplus/image.c
@@ -94,6 +94,24 @@ GpStatus WINGDIPAPI GdipBitmapCreateApplyEffect(GpBitmap** inputBitmaps,
return NotImplemented;
}
+static inline void getpixel_1bppIndexed(BYTE *index, const BYTE *row, UINT x)
+{
+ *index = (row[x/8]>>(7-x%8)) & 1;
+}
+
+static inline void getpixel_4bppIndexed(BYTE *index, const BYTE *row, UINT x)
+{
+ if (x & 1)
+ *index = row[x/2]&0xf;
+ else
+ *index = row[x/2]>>4;
+}
+
+static inline void getpixel_8bppIndexed(BYTE *index, const BYTE *row, UINT x)
+{
+ *index = row[x];
+}
+
static inline void getpixel_16bppGrayScale(BYTE *r, BYTE *g, BYTE *b, BYTE *a,
const BYTE *row, UINT x)
{
@@ -211,6 +229,7 @@ GpStatus WINGDIPAPI GdipBitmapGetPixel(GpBitmap* bitmap, INT x, INT y,
ARGB *color)
{
BYTE r, g, b, a;
+ BYTE index;
BYTE *row;
TRACE("%p %d %d %p\n", bitmap, x, y, color);
@@ -222,6 +241,15 @@ GpStatus WINGDIPAPI GdipBitmapGetPixel(GpBitmap* bitmap, INT x, INT y,
switch (bitmap->format)
{
+ case PixelFormat1bppIndexed:
+ getpixel_1bppIndexed(&index,row,x);
+ break;
+ case PixelFormat4bppIndexed:
+ getpixel_4bppIndexed(&index,row,x);
+ break;
+ case PixelFormat8bppIndexed:
+ getpixel_8bppIndexed(&index,row,x);
+ break;
case PixelFormat16bppGrayScale:
getpixel_16bppGrayScale(&r,&g,&b,&a,row,x);
break;
@@ -260,7 +288,10 @@ GpStatus WINGDIPAPI GdipBitmapGetPixel(GpBitmap* bitmap, INT x, INT y,
return NotImplemented;
}
- *color = a<<24|r<<16|g<<8|b;
+ if (bitmap->format & PixelFormatIndexed)
+ *color = bitmap->image.palette_entries[index];
+ else
+ *color = a<<24|r<<16|g<<8|b;
return Ok;
}
@@ -411,6 +442,412 @@ GpStatus WINGDIPAPI GdipBitmapSetPixel(GpBitmap* bitmap, INT x, INT y,
return Ok;
}
+GpStatus convert_pixels(UINT width, UINT height,
+ INT dst_stride, BYTE *dst_bits, PixelFormat dst_format,
+ INT src_stride, const BYTE *src_bits, PixelFormat src_format, ARGB *src_palette)
+{
+ UINT x, y;
+
+ if (src_format == dst_format ||
+ (dst_format == PixelFormat32bppRGB && PIXELFORMATBPP(src_format) == 32))
+ {
+ UINT widthbytes = PIXELFORMATBPP(src_format) * width / 8;
+ for (y=0; ylockmode)
+ {
+ WARN("bitmap is already locked and cannot be locked again\n");
return WrongState;
+ }
if (bitmap->bits && bitmap->format == format)
{
@@ -470,83 +911,77 @@ GpStatus WINGDIPAPI GdipBitmapLockBits(GpBitmap* bitmap, GDIPCONST GpRect* rect,
return Ok;
}
- hbm = bitmap->hbitmap;
- hdc = bitmap->hdc;
- bm_is_selected = (hdc != 0);
-
- pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
- if (!pbmi)
- return OutOfMemory;
- pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- pbmi->bmiHeader.biBitCount = 0;
-
- if(!bm_is_selected){
- hdc = CreateCompatibleDC(0);
- old = SelectObject(hdc, hbm);
+ /* Make sure we can convert to the requested format. */
+ stat = convert_pixels(0, 0, 0, NULL, format, 0, NULL, bitmap->format, NULL);
+ if (stat == NotImplemented)
+ {
+ FIXME("cannot read bitmap from %x to %x\n", bitmap->format, format);
+ return NotImplemented;
}
- /* fill out bmi */
- GetDIBits(hdc, hbm, 0, 0, NULL, pbmi, DIB_RGB_COLORS);
+ /* If we're opening for writing, make sure we'll be able to write back in
+ * the original format. */
+ if (flags & ImageLockModeWrite)
+ {
+ stat = convert_pixels(0, 0, 0, NULL, bitmap->format, 0, NULL, format, NULL);
+ if (stat == NotImplemented)
+ {
+ FIXME("cannot write bitmap from %x to %x\n", format, bitmap->format);
+ return NotImplemented;
+ }
+ }
- abs_height = abs(pbmi->bmiHeader.biHeight);
- stride = pbmi->bmiHeader.biWidth * bitspp / 8;
+ abs_height = bitmap->height;
+ stride = (bitmap->width * bitspp + 7) / 8;
stride = (stride + 3) & ~3;
buff = GdipAlloc(stride * abs_height);
- pbmi->bmiHeader.biBitCount = bitspp;
+ if (!buff) return OutOfMemory;
- if(buff)
- GetDIBits(hdc, hbm, 0, abs_height, buff, pbmi, DIB_RGB_COLORS);
+ stat = convert_pixels(bitmap->width, bitmap->height,
+ stride, buff, format,
+ bitmap->stride, bitmap->bits, bitmap->format, bitmap->image.palette_entries);
- if(!bm_is_selected){
- SelectObject(hdc, old);
- DeleteDC(hdc);
- }
-
- if(!buff){
- GdipFree(pbmi);
- return OutOfMemory;
+ if (stat != Ok)
+ {
+ GdipFree(buff);
+ return stat;
}
lockeddata->Width = act_rect.Width;
lockeddata->Height = act_rect.Height;
lockeddata->PixelFormat = format;
lockeddata->Reserved = flags;
-
- if(pbmi->bmiHeader.biHeight > 0){
- lockeddata->Stride = -stride;
- lockeddata->Scan0 = buff + (bitspp / 8) * act_rect.X +
- stride * (abs_height - 1 - act_rect.Y);
- }
- else{
- lockeddata->Stride = stride;
- lockeddata->Scan0 = buff + (bitspp / 8) * act_rect.X + stride * act_rect.Y;
- }
+ lockeddata->Stride = stride;
+ lockeddata->Scan0 = buff + (bitspp / 8) * act_rect.X + stride * act_rect.Y;
bitmap->lockmode = flags;
bitmap->numlocks++;
-
bitmap->bitmapbits = buff;
- GdipFree(pbmi);
return Ok;
}
GpStatus WINGDIPAPI GdipBitmapSetResolution(GpBitmap* bitmap, REAL xdpi, REAL ydpi)
{
- FIXME("(%p, %.2f, %.2f)\n", bitmap, xdpi, ydpi);
+ TRACE("(%p, %.2f, %.2f)\n", bitmap, xdpi, ydpi);
- return NotImplemented;
+ if (!bitmap || xdpi == 0.0 || ydpi == 0.0)
+ return InvalidParameter;
+
+ bitmap->image.xres = xdpi;
+ bitmap->image.yres = ydpi;
+
+ return Ok;
}
GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap,
BitmapData* lockeddata)
{
- HDC hdc;
- HBITMAP hbm, old = NULL;
- BOOL bm_is_selected;
- BITMAPINFO *pbmi;
+ GpStatus stat;
+
+ TRACE("(%p,%p)\n", bitmap, lockeddata);
if(!bitmap || !lockeddata)
return InvalidParameter;
@@ -570,38 +1005,25 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap,
{
/* we passed a direct reference; no need to do anything */
bitmap->lockmode = 0;
+ bitmap->numlocks = 0;
return Ok;
}
- hbm = bitmap->hbitmap;
- hdc = bitmap->hdc;
- bm_is_selected = (hdc != 0);
+ stat = convert_pixels(bitmap->width, bitmap->height,
+ bitmap->stride, bitmap->bits, bitmap->format,
+ lockeddata->Stride, bitmap->bitmapbits, lockeddata->PixelFormat, NULL);
- pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
- pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- pbmi->bmiHeader.biBitCount = 0;
-
- if(!bm_is_selected){
- hdc = CreateCompatibleDC(0);
- old = SelectObject(hdc, hbm);
+ if (stat != Ok)
+ {
+ ERR("failed to convert pixels; this should never happen\n");
}
- GetDIBits(hdc, hbm, 0, 0, NULL, pbmi, DIB_RGB_COLORS);
- pbmi->bmiHeader.biBitCount = PIXELFORMATBPP(lockeddata->PixelFormat);
- SetDIBits(hdc, hbm, 0, abs(pbmi->bmiHeader.biHeight),
- bitmap->bitmapbits, pbmi, DIB_RGB_COLORS);
-
- if(!bm_is_selected){
- SelectObject(hdc, old);
- DeleteDC(hdc);
- }
-
- GdipFree(pbmi);
GdipFree(bitmap->bitmapbits);
bitmap->bitmapbits = NULL;
bitmap->lockmode = 0;
+ bitmap->numlocks = 0;
- return Ok;
+ return stat;
}
GpStatus WINGDIPAPI GdipCloneBitmapArea(REAL x, REAL y, REAL width, REAL height,
@@ -613,7 +1035,7 @@ GpStatus WINGDIPAPI GdipCloneBitmapArea(REAL x, REAL y, REAL width, REAL height,
Rect area;
GpStatus stat;
- TRACE("(%f,%f,%f,%f,%i,%p,%p)\n", x, y, width, height, format, srcBitmap, dstBitmap);
+ TRACE("(%f,%f,%f,%f,0x%x,%p,%p)\n", x, y, width, height, format, srcBitmap, dstBitmap);
if (!srcBitmap || !dstBitmap || srcBitmap->image.type != ImageTypeBitmap ||
x < 0 || y < 0 ||
@@ -671,7 +1093,7 @@ GpStatus WINGDIPAPI GdipCloneBitmapArea(REAL x, REAL y, REAL width, REAL height,
GpStatus WINGDIPAPI GdipCloneBitmapAreaI(INT x, INT y, INT width, INT height,
PixelFormat format, GpBitmap* srcBitmap, GpBitmap** dstBitmap)
{
- TRACE("(%i,%i,%i,%i,%i,%p,%p)\n", x, y, width, height, format, srcBitmap, dstBitmap);
+ TRACE("(%i,%i,%i,%i,0x%x,%p,%p)\n", x, y, width, height, format, srcBitmap, dstBitmap);
return GdipCloneBitmapArea(x, y, width, height, format, srcBitmap, dstBitmap);
}
@@ -937,6 +1359,9 @@ GpStatus WINGDIPAPI GdipConvertToEmfPlus(const GpGraphics* ref,
{
static int calls;
+ TRACE("(%p,%p,%p,%u,%s,%p)\n", ref, metafile, succ, emfType,
+ debugstr_w(description), out_metafile);
+
if(!ref || !metafile || !out_metafile)
return InvalidParameter;
@@ -1172,17 +1597,33 @@ static void generate_halftone_palette(ARGB *entries, UINT count)
}
}
+static GpStatus get_screen_resolution(REAL *xres, REAL *yres)
+{
+ HDC screendc = GetDC(0);
+
+ if (!screendc) return GenericError;
+
+ *xres = (REAL)GetDeviceCaps(screendc, LOGPIXELSX);
+ *yres = (REAL)GetDeviceCaps(screendc, LOGPIXELSY);
+
+ ReleaseDC(0, screendc);
+
+ return Ok;
+}
+
GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
PixelFormat format, BYTE* scan0, GpBitmap** bitmap)
{
- BITMAPINFOHEADER bmih;
+ BITMAPINFO* pbmi;
HBITMAP hbitmap;
INT row_size, dib_stride;
HDC hdc;
BYTE *bits;
int i;
+ REAL xres, yres;
+ GpStatus stat;
- TRACE("%d %d %d %d %p %p\n", width, height, stride, format, scan0, bitmap);
+ TRACE("%d %d %d 0x%x %p %p\n", width, height, stride, format, scan0, bitmap);
if (!bitmap) return InvalidParameter;
@@ -1194,32 +1635,42 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
if(scan0 && !stride)
return InvalidParameter;
+ stat = get_screen_resolution(&xres, &yres);
+ if (stat != Ok) return stat;
+
row_size = (width * PIXELFORMATBPP(format)+7) / 8;
dib_stride = (row_size + 3) & ~3;
if(stride == 0)
stride = dib_stride;
- bmih.biSize = sizeof(BITMAPINFOHEADER);
- bmih.biWidth = width;
- bmih.biHeight = -height;
- bmih.biPlanes = 1;
+ pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
+ if (!pbmi)
+ return OutOfMemory;
+
+ pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ pbmi->bmiHeader.biWidth = width;
+ pbmi->bmiHeader.biHeight = -height;
+ pbmi->bmiHeader.biPlanes = 1;
/* FIXME: use the rest of the data from format */
- bmih.biBitCount = PIXELFORMATBPP(format);
- bmih.biCompression = BI_RGB;
- bmih.biSizeImage = 0;
- bmih.biXPelsPerMeter = 0;
- bmih.biYPelsPerMeter = 0;
- bmih.biClrUsed = 0;
- bmih.biClrImportant = 0;
+ pbmi->bmiHeader.biBitCount = PIXELFORMATBPP(format);
+ pbmi->bmiHeader.biCompression = BI_RGB;
+ pbmi->bmiHeader.biSizeImage = 0;
+ pbmi->bmiHeader.biXPelsPerMeter = 0;
+ pbmi->bmiHeader.biYPelsPerMeter = 0;
+ pbmi->bmiHeader.biClrUsed = 0;
+ pbmi->bmiHeader.biClrImportant = 0;
hdc = CreateCompatibleDC(NULL);
- if (!hdc) return GenericError;
+ if (!hdc) {
+ GdipFree(pbmi);
+ return GenericError;
+ }
- hbitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (void**)&bits,
- NULL, 0);
+ hbitmap = CreateDIBSection(hdc, pbmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
DeleteDC(hdc);
+ GdipFree(pbmi);
if (!hbitmap) return GenericError;
@@ -1243,6 +1694,8 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
(*bitmap)->image.palette_count = 0;
(*bitmap)->image.palette_size = 0;
(*bitmap)->image.palette_entries = NULL;
+ (*bitmap)->image.xres = xres;
+ (*bitmap)->image.yres = yres;
(*bitmap)->width = width;
(*bitmap)->height = height;
(*bitmap)->format = format;
@@ -1282,6 +1735,8 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
}
}
+ TRACE("<-- %p\n", *bitmap);
+
return Ok;
}
@@ -1389,6 +1844,7 @@ GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image)
{
GdipFree(((GpBitmap*)image)->bitmapbits);
DeleteDC(((GpBitmap*)image)->hdc);
+ DeleteObject(((GpBitmap*)image)->hbitmap);
}
GdipFree(image->palette_entries);
GdipFree(image);
@@ -1398,9 +1854,28 @@ GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image)
GpStatus WINGDIPAPI GdipFindFirstImageItem(GpImage *image, ImageItemData* item)
{
+ static int calls;
+
+ TRACE("(%p,%p)\n", image, item);
+
if(!image || !item)
return InvalidParameter;
+ if (!(calls++))
+ FIXME("not implemented\n");
+
+ return NotImplemented;
+}
+
+GpStatus WINGDIPAPI GdipGetImageItemData(GpImage *image, ImageItemData *item)
+{
+ static int calls;
+
+ TRACE("(%p,%p)\n", image, item);
+
+ if (!(calls++))
+ FIXME("not implemented\n");
+
return NotImplemented;
}
@@ -1520,15 +1995,14 @@ GpStatus WINGDIPAPI GdipGetImageHeight(GpImage *image, UINT *height)
GpStatus WINGDIPAPI GdipGetImageHorizontalResolution(GpImage *image, REAL *res)
{
- static int calls;
-
if(!image || !res)
return InvalidParameter;
- if(!(calls++))
- FIXME("not implemented\n");
+ *res = image->xres;
- return NotImplemented;
+ TRACE("(%p) <-- %0.2f\n", image, *res);
+
+ return Ok;
}
GpStatus WINGDIPAPI GdipGetImagePaletteSize(GpImage *image, INT *size)
@@ -1588,15 +2062,14 @@ GpStatus WINGDIPAPI GdipGetImageType(GpImage *image, ImageType *type)
GpStatus WINGDIPAPI GdipGetImageVerticalResolution(GpImage *image, REAL *res)
{
- static int calls;
-
if(!image || !res)
return InvalidParameter;
- if(!(calls++))
- FIXME("not implemented\n");
+ *res = image->yres;
- return NotImplemented;
+ TRACE("(%p) <-- %0.2f\n", image, *res);
+
+ return Ok;
}
GpStatus WINGDIPAPI GdipGetImageWidth(GpImage *image, UINT *width)
@@ -1700,17 +2173,34 @@ GpStatus WINGDIPAPI GdipGetPropertySize(GpImage *image, UINT* size, UINT* num)
{
static int calls;
+ TRACE("(%p,%p,%p)\n", image, size, num);
+
if(!(calls++))
FIXME("not implemented\n");
return InvalidParameter;
}
+struct image_format_dimension
+{
+ const GUID *format;
+ const GUID *dimension;
+};
+
+struct image_format_dimension image_format_dimensions[] =
+{
+ {&ImageFormatGIF, &FrameDimensionTime},
+ {&ImageFormatIcon, &FrameDimensionResolution},
+ {NULL}
+};
+
GpStatus WINGDIPAPI GdipImageGetFrameCount(GpImage *image,
GDIPCONST GUID* dimensionID, UINT* count)
{
static int calls;
+ TRACE("(%p,%s,%p)\n", image, debugstr_guid(dimensionID), count);
+
if(!image || !dimensionID || !count)
return InvalidParameter;
@@ -1723,26 +2213,40 @@ GpStatus WINGDIPAPI GdipImageGetFrameCount(GpImage *image,
GpStatus WINGDIPAPI GdipImageGetFrameDimensionsCount(GpImage *image,
UINT* count)
{
+ /* Native gdiplus 1.1 does not yet support multiple frame dimensions. */
+
if(!image || !count)
return InvalidParameter;
*count = 1;
- FIXME("stub\n");
-
return Ok;
}
GpStatus WINGDIPAPI GdipImageGetFrameDimensionsList(GpImage* image,
GUID* dimensionIDs, UINT count)
{
- static int calls;
+ int i;
+ const GUID *result=NULL;
- if(!image || !dimensionIDs)
+ TRACE("(%p,%p,%u)\n", image, dimensionIDs, count);
+
+ if(!image || !dimensionIDs || count != 1)
return InvalidParameter;
- if(!(calls++))
- FIXME("not implemented\n");
+ for (i=0; image_format_dimensions[i].format; i++)
+ {
+ if (IsEqualGUID(&image->format, image_format_dimensions[i].format))
+ {
+ result = image_format_dimensions[i].dimension;
+ break;
+ }
+ }
+
+ if (!result)
+ result = &FrameDimensionPage;
+
+ memcpy(dimensionIDs, result, sizeof(GUID));
return Ok;
}
@@ -1976,6 +2480,8 @@ static GpStatus decode_image_olepicture_metafile(IStream* stream, REFCLSID clsid
(*image)->palette_size = 0;
(*image)->palette_entries = NULL;
+ TRACE("<-- %p\n", *image);
+
return Ok;
}
@@ -2084,6 +2590,8 @@ GpStatus WINGDIPAPI GdipRemovePropertyItem(GpImage *image, PROPID propId)
{
static int calls;
+ TRACE("(%p,%u)\n", image, propId);
+
if(!image)
return InvalidParameter;
@@ -2097,6 +2605,8 @@ GpStatus WINGDIPAPI GdipSetPropertyItem(GpImage *image, GDIPCONST PropertyItem*
{
static int calls;
+ TRACE("(%p,%p)\n", image, item);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -2790,6 +3300,8 @@ GpStatus WINGDIPAPI GdipSetEffectParameters(CGpEffect *effect,
{
static int calls;
+ TRACE("(%p,%p,%u)\n", effect, params, size);
+
if(!(calls++))
FIXME("not implemented\n");
diff --git a/dll/win32/gdiplus/imageattributes.c b/dll/win32/gdiplus/imageattributes.c
index 8f49c67bd44..1a7118df773 100644
--- a/dll/win32/gdiplus/imageattributes.c
+++ b/dll/win32/gdiplus/imageattributes.c
@@ -30,26 +30,31 @@ WINE_DEFAULT_DEBUG_CHANNEL(gdiplus);
GpStatus WINGDIPAPI GdipCloneImageAttributes(GDIPCONST GpImageAttributes *imageattr,
GpImageAttributes **cloneImageattr)
{
+ GpStatus stat;
+
TRACE("(%p, %p)\n", imageattr, cloneImageattr);
if(!imageattr || !cloneImageattr)
return InvalidParameter;
- **cloneImageattr = *imageattr;
+ stat = GdipCreateImageAttributes(cloneImageattr);
- return Ok;
+ if (stat == Ok)
+ **cloneImageattr = *imageattr;
+
+ return stat;
}
GpStatus WINGDIPAPI GdipCreateImageAttributes(GpImageAttributes **imageattr)
{
- TRACE("(%p)\n", imageattr);
-
if(!imageattr)
return InvalidParameter;
*imageattr = GdipAlloc(sizeof(GpImageAttributes));
if(!*imageattr) return OutOfMemory;
+ TRACE("<-- %p\n", *imageattr);
+
return Ok;
}
@@ -84,15 +89,32 @@ GpStatus WINGDIPAPI GdipSetImageAttributesColorMatrix(GpImageAttributes *imageat
ColorAdjustType type, BOOL enableFlag, GDIPCONST ColorMatrix* colorMatrix,
GDIPCONST ColorMatrix* grayMatrix, ColorMatrixFlags flags)
{
- static int calls;
+ TRACE("(%p,%u,%i,%p,%p,%u)\n", imageattr, type, enableFlag, colorMatrix,
+ grayMatrix, flags);
- if(!imageattr || !colorMatrix || !grayMatrix)
+ if(!imageattr || type >= ColorAdjustTypeCount || flags > ColorMatrixFlagsAltGray)
return InvalidParameter;
- if(!(calls++))
- FIXME("not implemented\n");
+ if (enableFlag)
+ {
+ if (!colorMatrix)
+ return InvalidParameter;
- return NotImplemented;
+ if (flags == ColorMatrixFlagsAltGray)
+ {
+ if (!grayMatrix)
+ return InvalidParameter;
+
+ imageattr->colormatrices[type].graymatrix = *grayMatrix;
+ }
+
+ imageattr->colormatrices[type].colormatrix = *colorMatrix;
+ imageattr->colormatrices[type].flags = flags;
+ }
+
+ imageattr->colormatrices[type].enabled = enableFlag;
+
+ return Ok;
}
GpStatus WINGDIPAPI GdipSetImageAttributesWrapMode(GpImageAttributes *imageAttr,
@@ -100,6 +122,8 @@ GpStatus WINGDIPAPI GdipSetImageAttributesWrapMode(GpImageAttributes *imageAttr,
{
static int calls;
+ TRACE("(%p,%u,%08x,%i)\n", imageAttr, wrap, argb, clamp);
+
if(!imageAttr)
return InvalidParameter;
@@ -114,6 +138,8 @@ GpStatus WINGDIPAPI GdipSetImageAttributesCachedBackground(GpImageAttributes *im
{
static int calls;
+ TRACE("(%p,%i)\n", imageAttr, enableFlag);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -123,12 +149,15 @@ GpStatus WINGDIPAPI GdipSetImageAttributesCachedBackground(GpImageAttributes *im
GpStatus WINGDIPAPI GdipSetImageAttributesGamma(GpImageAttributes *imageAttr,
ColorAdjustType type, BOOL enableFlag, REAL gamma)
{
- static int calls;
+ TRACE("(%p,%u,%i,%0.2f)\n", imageAttr, type, enableFlag, gamma);
- if(!(calls++))
- FIXME("not implemented\n");
+ if (!imageAttr || (enableFlag && gamma <= 0.0) || type >= ColorAdjustTypeCount)
+ return InvalidParameter;
- return NotImplemented;
+ imageAttr->gamma_enabled[type] = enableFlag;
+ imageAttr->gamma[type] = gamma;
+
+ return Ok;
}
GpStatus WINGDIPAPI GdipSetImageAttributesNoOp(GpImageAttributes *imageAttr,
@@ -136,6 +165,8 @@ GpStatus WINGDIPAPI GdipSetImageAttributesNoOp(GpImageAttributes *imageAttr,
{
static int calls;
+ TRACE("(%p,%u,%i)\n", imageAttr, type, enableFlag);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -147,6 +178,8 @@ GpStatus WINGDIPAPI GdipSetImageAttributesOutputChannel(GpImageAttributes *image
{
static int calls;
+ TRACE("(%p,%u,%i,%x)\n", imageAttr, type, enableFlag, channelFlags);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -159,6 +192,8 @@ GpStatus WINGDIPAPI GdipSetImageAttributesOutputChannelColorProfile(GpImageAttri
{
static int calls;
+ TRACE("(%p,%u,%i,%s)\n", imageAttr, type, enableFlag, debugstr_w(colorProfileFilename));
+
if(!(calls++))
FIXME("not implemented\n");
@@ -169,12 +204,23 @@ GpStatus WINGDIPAPI GdipSetImageAttributesRemapTable(GpImageAttributes *imageAtt
ColorAdjustType type, BOOL enableFlag, UINT mapSize,
GDIPCONST ColorMap *map)
{
- static int calls;
+ TRACE("(%p,%u,%i,%u,%p)\n", imageAttr, type, enableFlag, mapSize, map);
- if(!(calls++))
- FIXME("not implemented\n");
+ if(!imageAttr || type >= ColorAdjustTypeCount)
+ return InvalidParameter;
- return NotImplemented;
+ if (enableFlag)
+ {
+ if(!map || !mapSize)
+ return InvalidParameter;
+
+ imageAttr->colorremaptables[type].mapsize = mapSize;
+ imageAttr->colorremaptables[type].colormap = map;
+ }
+
+ imageAttr->colorremaptables[type].enabled = enableFlag;
+
+ return Ok;
}
GpStatus WINGDIPAPI GdipSetImageAttributesThreshold(GpImageAttributes *imageAttr,
@@ -182,6 +228,8 @@ GpStatus WINGDIPAPI GdipSetImageAttributesThreshold(GpImageAttributes *imageAttr
{
static int calls;
+ TRACE("(%p,%u,%i,%0.2f)\n", imageAttr, type, enableFlag, threshold);
+
if(!(calls++))
FIXME("not implemented\n");
@@ -193,6 +241,8 @@ GpStatus WINGDIPAPI GdipSetImageAttributesToIdentity(GpImageAttributes *imageAtt
{
static int calls;
+ TRACE("(%p,%u)\n", imageAttr, type);
+
if(!(calls++))
FIXME("not implemented\n");
diff --git a/dll/win32/gdiplus/pen.c b/dll/win32/gdiplus/pen.c
index 4a68a27c541..930317cc826 100644
--- a/dll/win32/gdiplus/pen.c
+++ b/dll/win32/gdiplus/pen.c
@@ -101,6 +101,8 @@ GpStatus WINGDIPAPI GdipClonePen(GpPen *pen, GpPen **clonepen)
GdipCloneCustomLineCap(pen->customend, &(*clonepen)->customend);
GdipCloneBrush(pen->brush, &(*clonepen)->brush);
+ TRACE("<-- %p\n", *clonepen);
+
return Ok;
}
@@ -154,6 +156,8 @@ GpStatus WINGDIPAPI GdipCreatePen2(GpBrush *brush, REAL width, GpUnit unit,
*pen = gp_pen;
+ TRACE("<-- %p\n", *pen);
+
return Ok;
}
@@ -389,6 +393,8 @@ GpStatus WINGDIPAPI GdipResetPenTransform(GpPen *pen)
{
static int calls;
+ TRACE("(%p)\n", pen);
+
if(!pen)
return InvalidParameter;
@@ -402,6 +408,8 @@ GpStatus WINGDIPAPI GdipScalePenTransform(GpPen *pen, REAL sx, REAL sy, GpMatrix
{
static int calls;
+ TRACE("(%p,%0.2f,%0.2f,%u)\n", pen, sx, sy, order);
+
if(!pen)
return InvalidParameter;
diff --git a/dll/win32/gdiplus/region.c b/dll/win32/gdiplus/region.c
index eab9b8fa5db..decaaf9e837 100644
--- a/dll/win32/gdiplus/region.c
+++ b/dll/win32/gdiplus/region.c
@@ -1306,3 +1306,15 @@ GpStatus WINGDIPAPI GdipTranslateRegionI(GpRegion *region, INT dx, INT dy)
return GdipTranslateRegion(region, (REAL)dx, (REAL)dy);
}
+
+GpStatus WINGDIPAPI GdipGetRegionScansCount(GpRegion *region, UINT *count, GpMatrix *matrix)
+{
+ static int calls;
+
+ TRACE("(%p, %p, %p)\n", region, count, matrix);
+
+ if (!(calls++))
+ FIXME("not implemented\n");
+
+ return NotImplemented;
+}
diff --git a/dll/win32/gdiplus/stringformat.c b/dll/win32/gdiplus/stringformat.c
index bfe7d34e05e..cf6ea1f392a 100644
--- a/dll/win32/gdiplus/stringformat.c
+++ b/dll/win32/gdiplus/stringformat.c
@@ -48,11 +48,15 @@ GpStatus WINGDIPAPI GdipCreateStringFormat(INT attr, LANGID lang,
(*format)->digitlang = LANG_NEUTRAL;
(*format)->trimming = StringTrimmingCharacter;
(*format)->digitsub = StringDigitSubstituteUser;
+ (*format)->character_ranges = NULL;
+ (*format)->range_count = 0;
/* tabstops */
(*format)->tabcount = 0;
(*format)->firsttab = 0.0;
(*format)->tabs = NULL;
+ TRACE("<-- %p\n", *format);
+
return Ok;
}
@@ -61,6 +65,7 @@ GpStatus WINGDIPAPI GdipDeleteStringFormat(GpStringFormat *format)
if(!format)
return InvalidParameter;
+ GdipFree(format->character_ranges);
GdipFree(format->tabs);
GdipFree(format);
@@ -141,14 +146,16 @@ GpStatus WINGDIPAPI GdipGetStringFormatLineAlign(GpStringFormat *format,
}
GpStatus WINGDIPAPI GdipGetStringFormatMeasurableCharacterRangeCount(
- GDIPCONST GpStringFormat* format, INT* count)
+ GDIPCONST GpStringFormat *format, INT *count)
{
if (!(format && count))
return InvalidParameter;
- FIXME("stub: %p %p\n", format, count);
+ TRACE("%p %p\n", format, count);
- return NotImplemented;
+ *count = format->range_count;
+
+ return Ok;
}
GpStatus WINGDIPAPI GdipGetStringFormatTabStopCount(GDIPCONST GpStringFormat *format,
@@ -242,15 +249,26 @@ GpStatus WINGDIPAPI GdipSetStringFormatLineAlign(GpStringFormat *format,
return Ok;
}
-GpStatus WINGDIPAPI GdipSetStringFormatMeasurableCharacterRanges(GpStringFormat*
- format, INT rangeCount, GDIPCONST CharacterRange* ranges)
+GpStatus WINGDIPAPI GdipSetStringFormatMeasurableCharacterRanges(
+ GpStringFormat *format, INT rangeCount, GDIPCONST CharacterRange *ranges)
{
- if (!(format && rangeCount && ranges))
+ CharacterRange *new_ranges;
+
+ if (!(format && ranges))
return InvalidParameter;
- FIXME("stub: %p, %d, %p\n", format, rangeCount, ranges);
+ TRACE("%p, %d, %p\n", format, rangeCount, ranges);
- return NotImplemented;
+ new_ranges = GdipAlloc(rangeCount * sizeof(CharacterRange));
+ if (!new_ranges)
+ return OutOfMemory;
+
+ GdipFree(format->character_ranges);
+ format->character_ranges = new_ranges;
+ memcpy(format->character_ranges, ranges, sizeof(CharacterRange) * rangeCount);
+ format->range_count = rangeCount;
+
+ return Ok;
}
GpStatus WINGDIPAPI GdipSetStringFormatTabStops(GpStringFormat *format, REAL firsttab,
@@ -331,6 +349,19 @@ GpStatus WINGDIPAPI GdipCloneStringFormat(GDIPCONST GpStringFormat *format, GpSt
else
(*newFormat)->tabs = NULL;
+ if(format->range_count > 0){
+ (*newFormat)->character_ranges = GdipAlloc(sizeof(CharacterRange) * format->range_count);
+ if(!(*newFormat)->character_ranges){
+ GdipFree((*newFormat)->tabs);
+ GdipFree(*newFormat);
+ return OutOfMemory;
+ }
+ memcpy((*newFormat)->character_ranges, format->character_ranges,
+ sizeof(CharacterRange) * format->range_count);
+ }
+ else
+ (*newFormat)->character_ranges = NULL;
+
TRACE("%p %p\n",format,newFormat);
return Ok;
diff --git a/dll/win32/hhctrl.ocx/Cs.rc b/dll/win32/hhctrl.ocx/Cs.rc
index ec564d830d1..b9147627278 100644
--- a/dll/win32/hhctrl.ocx/Cs.rc
+++ b/dll/win32/hhctrl.ocx/Cs.rc
@@ -21,6 +21,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/dll/win32/hhctrl.ocx/Da.rc b/dll/win32/hhctrl.ocx/Da.rc
index e425ef0e567..1832d71c334 100644
--- a/dll/win32/hhctrl.ocx/Da.rc
+++ b/dll/win32/hhctrl.ocx/Da.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
STRINGTABLE
diff --git a/dll/win32/hhctrl.ocx/De.rc b/dll/win32/hhctrl.ocx/De.rc
index ef6e6997bd5..20b20f8c468 100644
--- a/dll/win32/hhctrl.ocx/De.rc
+++ b/dll/win32/hhctrl.ocx/De.rc
@@ -19,6 +19,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
STRINGTABLE
@@ -33,14 +37,14 @@ STRINGTABLE
BEGIN
IDTB_EXPAND "Anzeigen"
IDTB_CONTRACT "Verstecken"
- IDTB_STOP "Stop"
+ IDTB_STOP "Stopp"
IDTB_REFRESH "Aktualisieren"
- IDTB_BACK "Zurck"
+ IDTB_BACK "Zurück"
IDTB_HOME "Startseite"
IDTB_SYNC "Synchronisieren"
IDTB_PRINT "Drucken"
IDTB_OPTIONS "Einstellungen"
- IDTB_FORWARD "Vorwrts"
+ IDTB_FORWARD "Vorwärts"
IDTB_NOTES "IDTB_NOTES"
IDTB_BROWSE_FWD "IDTB_BROWSE_FWD"
IDTB_BROWSE_BACK "IDT_BROWSE_BACK"
@@ -52,7 +56,7 @@ BEGIN
IDTB_JUMP1 "Sprung1"
IDTB_JUMP2 "Sprung2"
IDTB_CUSTOMIZE "Anpassen"
- IDTB_ZOOM "Vergrern"
+ IDTB_ZOOM "Vergrößern"
IDTB_TOC_NEXT "IDTB_TOC_NEXT"
IDTB_TOC_PREV "IDTB_TOC_PREV"
END
diff --git a/dll/win32/hhctrl.ocx/El.rc b/dll/win32/hhctrl.ocx/El.rc
index dd81eb68da2..4fa79a2dcd8 100644
--- a/dll/win32/hhctrl.ocx/El.rc
+++ b/dll/win32/hhctrl.ocx/El.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_GREEK, SUBLANG_DEFAULT
STRINGTABLE
diff --git a/dll/win32/hhctrl.ocx/En.rc b/dll/win32/hhctrl.ocx/En.rc
index 83917f6e3d6..b69383e1898 100644
--- a/dll/win32/hhctrl.ocx/En.rc
+++ b/dll/win32/hhctrl.ocx/En.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STRINGTABLE
@@ -56,3 +58,13 @@ BEGIN
IDTB_TOC_NEXT "IDTB_TOC_NEXT"
IDTB_TOC_PREV "IDTB_TOC_PREV"
END
+
+LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
+
+STRINGTABLE
+BEGIN
+ IDS_CONTENTS "&Contents"
+ IDS_INDEX "I&ndex"
+ IDS_SEARCH "&Search"
+ IDS_FAVORITES "Favour&ites"
+END
diff --git a/dll/win32/hhctrl.ocx/Es.rc b/dll/win32/hhctrl.ocx/Es.rc
new file mode 100644
index 00000000000..d7681aa8ca4
--- /dev/null
+++ b/dll/win32/hhctrl.ocx/Es.rc
@@ -0,0 +1,63 @@
+/*
+ * HTML Help resources
+ * Spanish Language Support
+ *
+ * Copyright 2010 José Manuel Ferrer Ortiz
+ *
+ * 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_SPANISH, SUBLANG_NEUTRAL
+
+STRINGTABLE
+BEGIN
+ IDS_CONTENTS "&Contenido"
+ IDS_INDEX "Í&ndice"
+ IDS_SEARCH "&Buscar"
+ IDS_FAVORITES "Favor&itos"
+END
+
+STRINGTABLE
+BEGIN
+ IDTB_EXPAND "Mostrar"
+ IDTB_CONTRACT "Ocultar"
+ IDTB_STOP "Parar"
+ IDTB_REFRESH "Recargar"
+ IDTB_BACK "Atrás"
+ IDTB_HOME "Inicio"
+ IDTB_SYNC "Sincronizar"
+ IDTB_PRINT "Imprimir"
+ IDTB_OPTIONS "Opciones"
+ IDTB_FORWARD "Adelante"
+ IDTB_NOTES "IDTB_NOTES"
+ IDTB_BROWSE_FWD "IDTB_BROWSE_FWD"
+ IDTB_BROWSE_BACK "IDT_BROWSE_BACK"
+ IDTB_CONTENTS "IDTB_CONTENTS"
+ IDTB_INDEX "IDTB_INDEX"
+ IDTB_SEARCH "IDTB_SEARCH"
+ IDTB_HISTORY "IDTB_HISTORY"
+ IDTB_FAVORITES "IDTB_FAVORITES"
+ IDTB_JUMP1 "Jump1"
+ IDTB_JUMP2 "Jump2"
+ IDTB_CUSTOMIZE "Personalizar"
+ IDTB_ZOOM "Zoom"
+ IDTB_TOC_NEXT "IDTB_TOC_NEXT"
+ IDTB_TOC_PREV "IDTB_TOC_PREV"
+END
diff --git a/dll/win32/hhctrl.ocx/Fi.rc b/dll/win32/hhctrl.ocx/Fi.rc
index 975ce1f49aa..825422e57d6 100644
--- a/dll/win32/hhctrl.ocx/Fi.rc
+++ b/dll/win32/hhctrl.ocx/Fi.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
STRINGTABLE
diff --git a/dll/win32/hhctrl.ocx/Fr.rc b/dll/win32/hhctrl.ocx/Fr.rc
index 0e5dd4f9591..2146a3c7ae1 100644
--- a/dll/win32/hhctrl.ocx/Fr.rc
+++ b/dll/win32/hhctrl.ocx/Fr.rc
@@ -19,6 +19,11 @@
* 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
@@ -33,9 +38,9 @@ STRINGTABLE
BEGIN
IDTB_EXPAND "Afficher"
IDTB_CONTRACT "Cacher"
- IDTB_STOP "Arrter"
+ IDTB_STOP "Arrêter"
IDTB_REFRESH "A&ctualiser"
- IDTB_BACK "Prcdent"
+ IDTB_BACK "Précédent"
IDTB_HOME "Sommaire"
IDTB_SYNC "Synchroniser"
IDTB_PRINT "Imprimer"
@@ -49,8 +54,8 @@ BEGIN
IDTB_SEARCH "IDTB_SEARCH"
IDTB_HISTORY "IDTB_HISTORY"
IDTB_FAVORITES "IDTB_FAVORITES"
- IDTB_JUMP1 "Jump1"
- IDTB_JUMP2 "Jump2"
+ IDTB_JUMP1 "Saut1"
+ IDTB_JUMP2 "Saut2"
IDTB_CUSTOMIZE "Personnaliser"
IDTB_ZOOM "Zoom"
IDTB_TOC_NEXT "IDTB_TOC_NEXT"
diff --git a/dll/win32/hhctrl.ocx/Hu.rc b/dll/win32/hhctrl.ocx/Hu.rc
index 225c04a82d7..0cab8cdae81 100644
--- a/dll/win32/hhctrl.ocx/Hu.rc
+++ b/dll/win32/hhctrl.ocx/Hu.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
STRINGTABLE
diff --git a/dll/win32/hhctrl.ocx/Ko.rc b/dll/win32/hhctrl.ocx/Ko.rc
index 169eb70e472..37831dfcb7c 100644
--- a/dll/win32/hhctrl.ocx/Ko.rc
+++ b/dll/win32/hhctrl.ocx/Ko.rc
@@ -20,6 +20,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
STRINGTABLE
diff --git a/dll/win32/hhctrl.ocx/Lt.rc b/dll/win32/hhctrl.ocx/Lt.rc
index fed6b40e400..8c813ba1ef1 100644
--- a/dll/win32/hhctrl.ocx/Lt.rc
+++ b/dll/win32/hhctrl.ocx/Lt.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
/* UTF-8 */
#pragma code_page(65001)
@@ -59,5 +61,3 @@ BEGIN
IDTB_TOC_NEXT "IDTB_TOC_NEXT"
IDTB_TOC_PREV "IDTB_TOC_PREV"
END
-
-#pragma code_page(default)
diff --git a/dll/win32/hhctrl.ocx/Nl.rc b/dll/win32/hhctrl.ocx/Nl.rc
index 929ac39f6da..99c12faf10d 100644
--- a/dll/win32/hhctrl.ocx/Nl.rc
+++ b/dll/win32/hhctrl.ocx/Nl.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
STRINGTABLE
diff --git a/dll/win32/hhctrl.ocx/No.rc b/dll/win32/hhctrl.ocx/No.rc
index 5ff634d02df..a76ad3147a7 100644
--- a/dll/win32/hhctrl.ocx/No.rc
+++ b/dll/win32/hhctrl.ocx/No.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
STRINGTABLE
diff --git a/dll/win32/hhctrl.ocx/Pl.rc b/dll/win32/hhctrl.ocx/Pl.rc
index 40d3089af84..f3ce6f2c76c 100644
--- a/dll/win32/hhctrl.ocx/Pl.rc
+++ b/dll/win32/hhctrl.ocx/Pl.rc
@@ -20,6 +20,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
STRINGTABLE
diff --git a/dll/win32/hhctrl.ocx/Pt.rc b/dll/win32/hhctrl.ocx/Pt.rc
index d196ff499b9..13476ce843f 100644
--- a/dll/win32/hhctrl.ocx/Pt.rc
+++ b/dll/win32/hhctrl.ocx/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_NEUTRAL
STRINGTABLE
diff --git a/dll/win32/hhctrl.ocx/Ru.rc b/dll/win32/hhctrl.ocx/Ru.rc
index a530f80b637..0634c39da21 100644
--- a/dll/win32/hhctrl.ocx/Ru.rc
+++ b/dll/win32/hhctrl.ocx/Ru.rc
@@ -19,40 +19,45 @@
* 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
BEGIN
- IDS_CONTENTS "&"
- IDS_INDEX "&"
- IDS_SEARCH "&"
- IDS_FAVORITES "&"
+ IDS_CONTENTS "&Содержание"
+ IDS_INDEX "&Оглавление"
+ IDS_SEARCH "&Поиск"
+ IDS_FAVORITES "&Избранное"
END
STRINGTABLE
BEGIN
- IDTB_EXPAND ""
- IDTB_CONTRACT ""
- IDTB_STOP ""
- IDTB_REFRESH ""
- IDTB_BACK ""
- IDTB_HOME " "
- IDTB_SYNC ""
- IDTB_PRINT ""
- IDTB_OPTIONS ""
- IDTB_FORWARD ""
- IDTB_NOTES ""
- IDTB_BROWSE_FWD " "
- IDTB_BROWSE_BACK " "
- IDTB_CONTENTS ""
- IDTB_INDEX ""
- IDTB_SEARCH ""
- IDTB_HISTORY ""
- IDTB_FAVORITES ""
- IDTB_JUMP1 " 1"
- IDTB_JUMP2 " 2"
- IDTB_CUSTOMIZE ""
- IDTB_ZOOM ""
- IDTB_TOC_NEXT " "
- IDTB_TOC_PREV " "
+ IDTB_EXPAND "Показать"
+ IDTB_CONTRACT "Спрятать"
+ IDTB_STOP "Остановить"
+ IDTB_REFRESH "Обновить"
+ IDTB_BACK "Назад"
+ IDTB_HOME "В начало"
+ IDTB_SYNC "Синхронизировать"
+ IDTB_PRINT "Печать"
+ IDTB_OPTIONS "Настройки"
+ IDTB_FORWARD "Вперёд"
+ IDTB_NOTES "Записки"
+ IDTB_BROWSE_FWD "Просмотр вперёд"
+ IDTB_BROWSE_BACK "Просмотр назад"
+ IDTB_CONTENTS "Содержание"
+ IDTB_INDEX "Оглавление"
+ IDTB_SEARCH "Поиск"
+ IDTB_HISTORY "История"
+ IDTB_FAVORITES "Избранное"
+ IDTB_JUMP1 "Переход 1"
+ IDTB_JUMP2 "Переход 2"
+ IDTB_CUSTOMIZE "Персонализовать"
+ IDTB_ZOOM "Масштаб"
+ IDTB_TOC_NEXT "Следующая глава"
+ IDTB_TOC_PREV "Предыдущая глава"
END
diff --git a/dll/win32/hhctrl.ocx/Si.rc b/dll/win32/hhctrl.ocx/Si.rc
index c8ea447f5ed..bc8ca1d3705 100644
--- a/dll/win32/hhctrl.ocx/Si.rc
+++ b/dll/win32/hhctrl.ocx/Si.rc
@@ -19,6 +19,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
@@ -58,5 +60,3 @@ BEGIN
IDTB_TOC_NEXT "IDTB_TOC_NEXT"
IDTB_TOC_PREV "IDTB_TOC_PREV"
END
-
-#pragma code_page(default)
diff --git a/dll/win32/hhctrl.ocx/Sv.rc b/dll/win32/hhctrl.ocx/Sv.rc
index cb3e4e26a5d..b92c63c2bbd 100644
--- a/dll/win32/hhctrl.ocx/Sv.rc
+++ b/dll/win32/hhctrl.ocx/Sv.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
STRINGTABLE
diff --git a/dll/win32/hhctrl.ocx/Tr.rc b/dll/win32/hhctrl.ocx/Tr.rc
index 748899908f7..f1011b1dc48 100644
--- a/dll/win32/hhctrl.ocx/Tr.rc
+++ b/dll/win32/hhctrl.ocx/Tr.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT
STRINGTABLE
diff --git a/dll/win32/hhctrl.ocx/Uk.rc b/dll/win32/hhctrl.ocx/Uk.rc
new file mode 100644
index 00000000000..40d96b86a28
--- /dev/null
+++ b/dll/win32/hhctrl.ocx/Uk.rc
@@ -0,0 +1,75 @@
+/*
+ * HTML Help resources
+ * Ukrainian Language Support
+ *
+ * Copyright 2005 James Hawkins
+ * Copyright 2007 Artem Reznikov
+ * Copyright 2010 Igor Paliychuk
+ *
+ * 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_UKRAINIAN, SUBLANG_DEFAULT
+
+STRINGTABLE
+BEGIN
+ IDS_CONTENTS "&Зміст"
+ IDS_INDEX "&Вказівник"
+ IDS_SEARCH "&Пошук"
+ IDS_FAVORITES "&Обране"
+END
+
+STRINGTABLE
+BEGIN
+ IDTB_EXPAND "Показувати"
+ IDTB_CONTRACT "Приховати"
+ IDTB_STOP "Зупинити"
+ IDTB_REFRESH "Оновити"
+ IDTB_BACK "Назад"
+ IDTB_HOME "Додому"
+ IDTB_SYNC "Синхронізувати"
+ IDTB_PRINT "Друк"
+ IDTB_OPTIONS "Параметри"
+ IDTB_FORWARD "Вперед"
+ IDTB_NOTES "IDTB_NOTES"
+ IDTB_BROWSE_FWD "IDTB_BROWSE_FWD"
+ IDTB_BROWSE_BACK "IDT_BROWSE_BACK"
+ IDTB_CONTENTS "IDTB_CONTENTS"
+ IDTB_INDEX "IDTB_INDEX"
+ IDTB_SEARCH "IDTB_SEARCH"
+ IDTB_HISTORY "IDTB_HISTORY"
+ IDTB_FAVORITES "IDTB_FAVORITES"
+ IDTB_JUMP1 "Jump1"
+ IDTB_JUMP2 "Jump2"
+ IDTB_CUSTOMIZE "Налаштування"
+ IDTB_ZOOM "Збільшення"
+ IDTB_TOC_NEXT "IDTB_TOC_NEXT"
+ IDTB_TOC_PREV "IDTB_TOC_PREV"
+END
+
+LANGUAGE LANG_UKRAINIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE
+BEGIN
+ IDS_CONTENTS "&Зміст"
+ IDS_INDEX "&Вказівник"
+ IDS_SEARCH "&Пошук"
+ IDS_FAVORITES "&Обране"
+END
diff --git a/dll/win32/hhctrl.ocx/Zh.rc b/dll/win32/hhctrl.ocx/Zh.rc
index a7ccab0da74..d6295a96d20 100644
--- a/dll/win32/hhctrl.ocx/Zh.rc
+++ b/dll/win32/hhctrl.ocx/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)
@@ -96,5 +98,3 @@ BEGIN
IDTB_TOC_NEXT "後一項"
IDTB_TOC_PREV "前一項"
END
-
-#pragma code_page(default)
diff --git a/dll/win32/hhctrl.ocx/chm.c b/dll/win32/hhctrl.ocx/chm.c
index b7df8e72c7d..cf5b8bf2e90 100644
--- a/dll/win32/hhctrl.ocx/chm.c
+++ b/dll/win32/hhctrl.ocx/chm.c
@@ -38,12 +38,13 @@ static LPCSTR GetChmString(CHMInfo *chm, DWORD offset)
return NULL;
if(chm->strings_size <= (offset >> BLOCK_BITS)) {
+ chm->strings_size = (offset >> BLOCK_BITS)+1;
if(chm->strings)
chm->strings = heap_realloc_zero(chm->strings,
- chm->strings_size = ((offset >> BLOCK_BITS)+1)*sizeof(char*));
+ chm->strings_size*sizeof(char*));
else
chm->strings = heap_alloc_zero(
- chm->strings_size = ((offset >> BLOCK_BITS)+1)*sizeof(char*));
+ chm->strings_size*sizeof(char*));
}
@@ -388,7 +389,6 @@ CHMInfo *OpenCHM(LPCWSTR szFile)
WARN("Could not open storage: %08x\n", hres);
return CloseCHM(ret);
}
-
hres = IStorage_OpenStream(ret->pStorage, wszSTRINGS, NULL, STGM_READ, 0,
&ret->strings_stream);
if(FAILED(hres)) {
diff --git a/dll/win32/hhctrl.ocx/content.c b/dll/win32/hhctrl.ocx/content.c
index 4fc017656c5..bfe25cf9453 100644
--- a/dll/win32/hhctrl.ocx/content.c
+++ b/dll/win32/hhctrl.ocx/content.c
@@ -20,13 +20,12 @@
#define NONAMELESSSTRUCT
#include "hhctrl.h"
+#include "stream.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(htmlhelp);
-#define BLOCK_SIZE 0x1000
-
typedef enum {
INSERT_NEXT,
INSERT_CHILD
@@ -50,134 +49,6 @@ static void free_content_item(ContentItem *item)
}
}
-typedef struct {
- char *buf;
- int size;
- int len;
-} strbuf_t;
-
-static void strbuf_init(strbuf_t *buf)
-{
- buf->size = 8;
- buf->len = 0;
- buf->buf = heap_alloc(buf->size);
-}
-
-static void strbuf_zero(strbuf_t *buf)
-{
- buf->len = 0;
-}
-
-static void strbuf_free(strbuf_t *buf)
-{
- heap_free(buf->buf);
-}
-
-static void strbuf_append(strbuf_t *buf, const char *data, int len)
-{
- if(buf->len+len > buf->size) {
- buf->size = buf->len+len;
- buf->buf = heap_realloc(buf->buf, buf->size);
- }
-
- memcpy(buf->buf+buf->len, data, len);
- buf->len += len;
-}
-
-typedef struct {
- IStream *str;
- char buf[BLOCK_SIZE];
- ULONG size;
- ULONG p;
-} stream_t;
-
-static void stream_init(stream_t *stream, IStream *str)
-{
- memset(stream, 0, sizeof(stream_t));
- stream->str = str;
-}
-
-static BOOL stream_chr(stream_t *stream, strbuf_t *buf, char c)
-{
- BOOL b = TRUE;
- ULONG i;
-
- while(b) {
- for(i=stream->p; isize; i++) {
- if(stream->buf[i] == c) {
- b = FALSE;
- break;
- }
- }
-
- if(buf && i > stream->p)
- strbuf_append(buf, stream->buf+stream->p, i-stream->p);
- stream->p = i;
-
- if(stream->p == stream->size) {
- stream->p = 0;
- IStream_Read(stream->str, stream->buf, sizeof(stream->buf), &stream->size);
- if(!stream->size)
- break;
- }
- }
-
- return stream->size != 0;
-}
-
-static void get_node_name(strbuf_t *node, strbuf_t *name)
-{
- const char *ptr = node->buf+1;
-
- strbuf_zero(name);
-
- while(*ptr != '>' && !isspace(*ptr))
- ptr++;
-
- strbuf_append(name, node->buf+1, ptr-node->buf-1);
- strbuf_append(name, "", 1);
-}
-
-static BOOL next_node(stream_t *stream, strbuf_t *buf)
-{
- if(!stream_chr(stream, NULL, '<'))
- return FALSE;
-
- if(!stream_chr(stream, buf, '>'))
- return FALSE;
-
- strbuf_append(buf, ">", 2);
-
- return TRUE;
-}
-
-static const char *get_attr(const char *node, const char *name, int *len)
-{
- const char *ptr, *ptr2;
- char name_buf[32];
- int nlen;
-
- nlen = strlen(name);
- memcpy(name_buf, name, nlen);
- name_buf[nlen++] = '=';
- name_buf[nlen++] = '\"';
- name_buf[nlen] = 0;
-
- ptr = strstr(node, name_buf);
- if(!ptr) {
- WARN("name not found\n");
- return NULL;
- }
-
- ptr += nlen;
- ptr2 = strchr(ptr, '\"');
- if(!ptr2)
- return NULL;
-
- *len = ptr2-ptr;
- return ptr;
-}
-
static void parse_obj_node_param(ContentItem *item, ContentItem *hhc_root, const char *text)
{
const char *ptr;
diff --git a/dll/win32/hhctrl.ocx/help.c b/dll/win32/hhctrl.ocx/help.c
index 092e97e8784..30cb008bd27 100644
--- a/dll/win32/hhctrl.ocx/help.c
+++ b/dll/win32/hhctrl.ocx/help.c
@@ -44,6 +44,7 @@ static LRESULT Help_OnSize(HWND hWnd);
#define TAB_TOP_PADDING 8
#define TAB_RIGHT_PADDING 4
#define TAB_MARGIN 8
+#define EDIT_HEIGHT 20
static const WCHAR szEmpty[] = {0};
@@ -320,8 +321,10 @@ static LRESULT Child_OnPaint(HWND hWnd)
return 0;
}
-static void ResizeTabChild(HHInfo *info, HWND hwnd)
+static void ResizeTabChild(HHInfo *info, int tab)
{
+ HWND hwnd = info->tabs[tab].hwnd;
+ INT width, height;
RECT rect, tabrc;
DWORD cnt;
@@ -333,9 +336,47 @@ static void ResizeTabChild(HHInfo *info, HWND hwnd)
rect.top = TAB_TOP_PADDING + cnt*(tabrc.bottom-tabrc.top) + TAB_MARGIN;
rect.right -= TAB_RIGHT_PADDING + TAB_MARGIN;
rect.bottom -= TAB_MARGIN;
+ width = rect.right-rect.left;
+ height = rect.bottom-rect.top;
- SetWindowPos(hwnd, NULL, rect.left, rect.top, rect.right-rect.left,
- rect.bottom-rect.top, SWP_NOZORDER | SWP_NOACTIVATE);
+ SetWindowPos(hwnd, NULL, rect.left, rect.top, width, height,
+ SWP_NOZORDER | SWP_NOACTIVATE);
+
+ switch (tab)
+ {
+ case TAB_INDEX: {
+ int scroll_width = GetSystemMetrics(SM_CXVSCROLL);
+ int border_width = GetSystemMetrics(SM_CXBORDER);
+ int edge_width = GetSystemMetrics(SM_CXEDGE);
+
+ /* Resize the tab widget column to perfectly fit the tab window and
+ * leave sufficient space for the scroll widget.
+ */
+ SendMessageW(info->tabs[TAB_INDEX].hwnd, LVM_SETCOLUMNWIDTH, 0,
+ width-scroll_width-2*border_width-2*edge_width);
+
+ break;
+ }
+ case TAB_SEARCH: {
+ int scroll_width = GetSystemMetrics(SM_CXVSCROLL);
+ int border_width = GetSystemMetrics(SM_CXBORDER);
+ int edge_width = GetSystemMetrics(SM_CXEDGE);
+ int top_pos = 0;
+
+ SetWindowPos(info->search.hwndEdit, NULL, 0, top_pos, width,
+ EDIT_HEIGHT, SWP_NOZORDER | SWP_NOACTIVATE);
+ top_pos += EDIT_HEIGHT + TAB_MARGIN;
+ SetWindowPos(info->search.hwndList, NULL, 0, top_pos, width,
+ height-top_pos, SWP_NOZORDER | SWP_NOACTIVATE);
+ /* Resize the tab widget column to perfectly fit the tab window and
+ * leave sufficient space for the scroll widget.
+ */
+ SendMessageW(info->search.hwndList, LVM_SETCOLUMNWIDTH, 0,
+ width-scroll_width-2*border_width-2*edge_width);
+
+ break;
+ }
+ }
}
static LRESULT Child_OnSize(HWND hwnd)
@@ -351,7 +392,8 @@ static LRESULT Child_OnSize(HWND hwnd)
rect.right - TAB_RIGHT_PADDING,
rect.bottom - TAB_TOP_PADDING, SWP_NOMOVE);
- ResizeTabChild(info, info->tabs[TAB_CONTENTS].hwnd);
+ ResizeTabChild(info, TAB_CONTENTS);
+ ResizeTabChild(info, TAB_INDEX);
return 0;
}
@@ -375,29 +417,101 @@ static LRESULT OnTabChange(HWND hwnd)
return 0;
}
-static LRESULT OnTopicChange(HWND hwnd, ContentItem *item)
+static LRESULT OnTopicChange(HHInfo *info, void *user_data)
{
- HHInfo *info = (HHInfo*)GetWindowLongPtrW(hwnd, GWLP_USERDATA);
- LPCWSTR chmfile = NULL;
- ContentItem *iter = item;
+ LPCWSTR chmfile = NULL, name = NULL, local = NULL;
+ ContentItem *citer;
+ SearchItem *siter;
+ IndexItem *iiter;
- if(!item || !info)
+ if(!user_data || !info)
return 0;
- TRACE("name %s loal %s\n", debugstr_w(item->name), debugstr_w(item->local));
-
- while(iter) {
- if(iter->merge.chm_file) {
- chmfile = iter->merge.chm_file;
- break;
+ switch (info->current_tab)
+ {
+ case TAB_CONTENTS:
+ citer = (ContentItem *) user_data;
+ name = citer->name;
+ local = citer->local;
+ while(citer) {
+ if(citer->merge.chm_file) {
+ chmfile = citer->merge.chm_file;
+ break;
+ }
+ citer = citer->parent;
}
- iter = iter->parent;
+ break;
+ case TAB_INDEX:
+ iiter = (IndexItem *) user_data;
+ if(iiter->nItems == 0) {
+ FIXME("No entries for this item!\n");
+ return 0;
+ }
+ if(iiter->nItems > 1) {
+ int i = 0;
+ LVITEMW lvi;
+
+ SendMessageW(info->popup.hwndList, LVM_DELETEALLITEMS, 0, 0);
+ for(i=0;inItems;i++) {
+ IndexSubItem *item = &iiter->items[i];
+ WCHAR *name = iiter->keyword;
+
+ if(item->name)
+ name = item->name;
+ memset(&lvi, 0, sizeof(lvi));
+ lvi.iItem = i;
+ lvi.mask = LVIF_TEXT|LVIF_PARAM;
+ lvi.cchTextMax = strlenW(name)+1;
+ lvi.pszText = name;
+ lvi.lParam = (LPARAM) item;
+ SendMessageW(info->popup.hwndList, LVM_INSERTITEMW, 0, (LPARAM)&lvi);
+ }
+ ShowWindow(info->popup.hwndPopup, SW_SHOW);
+ return 0;
+ }
+ name = iiter->items[0].name;
+ local = iiter->items[0].local;
+ chmfile = iiter->merge.chm_file;
+ break;
+ case TAB_SEARCH:
+ siter = (SearchItem *) user_data;
+ name = siter->filename;
+ local = siter->filename;
+ chmfile = info->pCHMInfo->szFile;
+ break;
+ default:
+ FIXME("Unhandled operation for this tab!\n");
+ return 0;
}
- NavigateToChm(info, chmfile, item->local);
+ if(!chmfile)
+ {
+ FIXME("No help file found for this item!\n");
+ return 0;
+ }
+
+ TRACE("name %s loal %s\n", debugstr_w(name), debugstr_w(local));
+
+ NavigateToChm(info, chmfile, local);
return 0;
}
+/* Capture the Enter/Return key and send it up to Child_WndProc as an NM_RETURN message */
+static LRESULT CALLBACK EditChild_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ WNDPROC editWndProc = (WNDPROC)GetWindowLongPtrW(hWnd, GWLP_USERDATA);
+
+ if(message == WM_KEYUP && wParam == VK_RETURN)
+ {
+ NMHDR nmhdr;
+
+ nmhdr.hwndFrom = hWnd;
+ nmhdr.code = NM_RETURN;
+ SendMessageW(GetParent(GetParent(hWnd)), WM_NOTIFY, wParam, (LPARAM)&nmhdr);
+ }
+ return editWndProc(hWnd, message, wParam, lParam);
+}
+
static LRESULT CALLBACK Child_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
@@ -407,12 +521,71 @@ static LRESULT CALLBACK Child_WndProc(HWND hWnd, UINT message, WPARAM wParam, LP
case WM_SIZE:
return Child_OnSize(hWnd);
case WM_NOTIFY: {
+ HHInfo *info = (HHInfo*)GetWindowLongPtrW(hWnd, GWLP_USERDATA);
NMHDR *nmhdr = (NMHDR*)lParam;
+
switch(nmhdr->code) {
case TCN_SELCHANGE:
return OnTabChange(hWnd);
case TVN_SELCHANGEDW:
- return OnTopicChange(hWnd, (ContentItem*)((NMTREEVIEWW *)lParam)->itemNew.lParam);
+ return OnTopicChange(info, (void*)((NMTREEVIEWW *)lParam)->itemNew.lParam);
+ case NM_DBLCLK:
+ if(!info)
+ return 0;
+ switch(info->current_tab)
+ {
+ case TAB_INDEX:
+ return OnTopicChange(info, (void*)((NMITEMACTIVATE *)lParam)->lParam);
+ case TAB_SEARCH:
+ return OnTopicChange(info, (void*)((NMITEMACTIVATE *)lParam)->lParam);
+ }
+ break;
+ case NM_RETURN:
+ if(!info)
+ return 0;
+ switch(info->current_tab) {
+ case TAB_INDEX: {
+ HWND hwndList = info->tabs[TAB_INDEX].hwnd;
+ LVITEMW lvItem;
+
+ lvItem.iItem = (int) SendMessageW(hwndList, LVM_GETSELECTIONMARK, 0, 0);
+ lvItem.mask = TVIF_PARAM;
+ SendMessageW(hwndList, LVM_GETITEMW, 0, (LPARAM)&lvItem);
+ OnTopicChange(info, (void*) lvItem.lParam);
+ return 0;
+ }
+ case TAB_SEARCH: {
+ if(nmhdr->hwndFrom == info->search.hwndEdit) {
+ char needle[100];
+ DWORD i, len;
+
+ len = GetWindowTextA(info->search.hwndEdit, needle, sizeof(needle));
+ if(!len)
+ {
+ FIXME("Unable to get search text.\n");
+ return 0;
+ }
+ /* Convert the requested text for comparison later against the
+ * lower case version of HTML file contents.
+ */
+ for(i=0;ihwndFrom == info->search.hwndList) {
+ HWND hwndList = info->search.hwndList;
+ LVITEMW lvItem;
+
+ lvItem.iItem = (int) SendMessageW(hwndList, LVM_GETSELECTIONMARK, 0, 0);
+ lvItem.mask = TVIF_PARAM;
+ SendMessageW(hwndList, LVM_GETITEMW, 0, (LPARAM)&lvItem);
+ OnTopicChange(info, (void*) lvItem.lParam);
+ return 0;
+ }
+ break;
+ }
+ }
+ break;
}
break;
}
@@ -729,6 +902,8 @@ static BOOL HH_AddHTMLPane(HHInfo *pHHInfo)
static BOOL AddContentTab(HHInfo *info)
{
+ if(info->tabs[TAB_CONTENTS].id == -1)
+ return TRUE; /* No "Contents" tab */
info->tabs[TAB_CONTENTS].hwnd = CreateWindowExW(WS_EX_CLIENTEDGE, WC_TREEVIEWW,
szEmpty, WS_CHILD | WS_BORDER | 0x25, 50, 50, 100, 100,
info->WinType.hwndNavigation, NULL, hhctrl_hinstance, NULL);
@@ -737,12 +912,293 @@ static BOOL AddContentTab(HHInfo *info)
return FALSE;
}
- ResizeTabChild(info, info->tabs[TAB_CONTENTS].hwnd);
+ ResizeTabChild(info, TAB_CONTENTS);
ShowWindow(info->tabs[TAB_CONTENTS].hwnd, SW_SHOW);
return TRUE;
}
+static BOOL AddIndexTab(HHInfo *info)
+{
+ char hidden_column[] = "Column";
+ LVCOLUMNA lvc;
+
+ if(info->tabs[TAB_INDEX].id == -1)
+ return TRUE; /* No "Index" tab */
+ info->tabs[TAB_INDEX].hwnd = CreateWindowExW(WS_EX_CLIENTEDGE, WC_LISTVIEWW,
+ szEmpty, WS_CHILD | WS_BORDER | LVS_SINGLESEL | LVS_REPORT | LVS_NOCOLUMNHEADER, 50, 50, 100, 100,
+ info->WinType.hwndNavigation, NULL, hhctrl_hinstance, NULL);
+ if(!info->tabs[TAB_INDEX].hwnd) {
+ ERR("Could not create ListView control\n");
+ return FALSE;
+ }
+ memset(&lvc, 0, sizeof(lvc));
+ lvc.mask = LVCF_TEXT;
+ lvc.pszText = hidden_column;
+ if(SendMessageW(info->tabs[TAB_INDEX].hwnd, LVM_INSERTCOLUMNA, 0, (LPARAM) &lvc) == -1)
+ {
+ ERR("Could not create ListView column\n");
+ return FALSE;
+ }
+
+ ResizeTabChild(info, TAB_INDEX);
+ ShowWindow(info->tabs[TAB_INDEX].hwnd, SW_HIDE);
+
+ return TRUE;
+}
+
+static BOOL AddSearchTab(HHInfo *info)
+{
+ HWND hwndList, hwndEdit, hwndContainer;
+ char hidden_column[] = "Column";
+ WNDPROC editWndProc;
+ LVCOLUMNA lvc;
+
+ if(info->tabs[TAB_SEARCH].id == -1)
+ return TRUE; /* No "Search" tab */
+ hwndContainer = CreateWindowExW(WS_EX_CONTROLPARENT, szChildClass, szEmpty,
+ WS_CHILD, 0, 0, 0, 0, info->WinType.hwndNavigation,
+ NULL, hhctrl_hinstance, NULL);
+ if(!hwndContainer) {
+ ERR("Could not create search window container control.\n");
+ return FALSE;
+ }
+ hwndEdit = CreateWindowExW(WS_EX_CLIENTEDGE, WC_EDITW, szEmpty, WS_CHILD
+ | WS_VISIBLE | ES_LEFT | SS_NOTIFY, 0, 0, 0, 0,
+ hwndContainer, NULL, hhctrl_hinstance, NULL);
+ if(!hwndEdit) {
+ ERR("Could not create search ListView control.\n");
+ return FALSE;
+ }
+ if(SendMessageW(hwndEdit, WM_SETFONT, (WPARAM) info->hFont, (LPARAM) FALSE) == -1)
+ {
+ ERR("Could not set font for edit control.\n");
+ return FALSE;
+ }
+ editWndProc = (WNDPROC) SetWindowLongPtrW(hwndEdit, GWLP_WNDPROC, (LONG_PTR)EditChild_WndProc);
+ if(!editWndProc) {
+ ERR("Could not redirect messages for edit control.\n");
+ return FALSE;
+ }
+ SetWindowLongPtrW(hwndEdit, GWLP_USERDATA, (LONG_PTR)editWndProc);
+ hwndList = CreateWindowExW(WS_EX_CLIENTEDGE, WC_LISTVIEWW, szEmpty,
+ WS_CHILD | WS_VISIBLE | WS_BORDER | LVS_SINGLESEL
+ | LVS_REPORT | LVS_NOCOLUMNHEADER, 0, 0, 0, 0,
+ hwndContainer, NULL, hhctrl_hinstance, NULL);
+ if(!hwndList) {
+ ERR("Could not create search ListView control.\n");
+ return FALSE;
+ }
+ memset(&lvc, 0, sizeof(lvc));
+ lvc.mask = LVCF_TEXT;
+ lvc.pszText = hidden_column;
+ if(SendMessageW(hwndList, LVM_INSERTCOLUMNA, 0, (LPARAM) &lvc) == -1)
+ {
+ ERR("Could not create ListView column\n");
+ return FALSE;
+ }
+
+ info->search.hwndEdit = hwndEdit;
+ info->search.hwndList = hwndList;
+ info->search.hwndContainer = hwndContainer;
+ info->tabs[TAB_SEARCH].hwnd = hwndContainer;
+
+ SetWindowLongPtrW(hwndContainer, GWLP_USERDATA, (LONG_PTR)info);
+
+ ResizeTabChild(info, TAB_SEARCH);
+
+ return TRUE;
+}
+
+/* The Index tab's sub-topic popup */
+
+static void ResizePopupChild(HHInfo *info)
+{
+ int scroll_width = GetSystemMetrics(SM_CXVSCROLL);
+ int border_width = GetSystemMetrics(SM_CXBORDER);
+ int edge_width = GetSystemMetrics(SM_CXEDGE);
+ INT width, height;
+ RECT rect;
+
+ if(!info)
+ return;
+
+ GetClientRect(info->popup.hwndPopup, &rect);
+ SetWindowPos(info->popup.hwndCallback, HWND_TOP, 0, 0,
+ rect.right, rect.bottom, SWP_NOMOVE);
+
+ rect.left = TAB_MARGIN;
+ rect.top = TAB_TOP_PADDING + TAB_MARGIN;
+ rect.right -= TAB_RIGHT_PADDING + TAB_MARGIN;
+ rect.bottom -= TAB_MARGIN;
+ width = rect.right-rect.left;
+ height = rect.bottom-rect.top;
+
+ SetWindowPos(info->popup.hwndList, NULL, rect.left, rect.top, width, height,
+ SWP_NOZORDER | SWP_NOACTIVATE);
+
+ SendMessageW(info->popup.hwndList, LVM_SETCOLUMNWIDTH, 0,
+ width-scroll_width-2*border_width-2*edge_width);
+}
+
+static LRESULT CALLBACK HelpPopup_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ HHInfo *info = (HHInfo *)GetWindowLongPtrW(hWnd, GWLP_USERDATA);
+
+ switch (message)
+ {
+ case WM_SIZE:
+ ResizePopupChild(info);
+ return 0;
+ case WM_DESTROY:
+ DestroyWindow(hWnd);
+ return 0;
+ case WM_CLOSE:
+ ShowWindow(hWnd, SW_HIDE);
+ return 0;
+
+ default:
+ return DefWindowProcW(hWnd, message, wParam, lParam);
+ }
+
+ return 0;
+}
+
+static LRESULT CALLBACK PopupChild_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch (message)
+ {
+ case WM_NOTIFY: {
+ NMHDR *nmhdr = (NMHDR*)lParam;
+ switch(nmhdr->code)
+ {
+ case NM_DBLCLK: {
+ HHInfo *info = (HHInfo*)GetWindowLongPtrW(hWnd, GWLP_USERDATA);
+ IndexSubItem *iter;
+
+ if(info == 0 || lParam == 0)
+ return 0;
+ iter = (IndexSubItem*) ((NMITEMACTIVATE *)lParam)->lParam;
+ if(iter == 0)
+ return 0;
+ NavigateToChm(info, info->index->merge.chm_file, iter->local);
+ ShowWindow(info->popup.hwndPopup, SW_HIDE);
+ return 0;
+ }
+ case NM_RETURN: {
+ HHInfo *info = (HHInfo*)GetWindowLongPtrW(hWnd, GWLP_USERDATA);
+ IndexSubItem *iter;
+ LVITEMW lvItem;
+
+ if(info == 0)
+ return 0;
+
+ lvItem.iItem = (int) SendMessageW(info->popup.hwndList, LVM_GETSELECTIONMARK, 0, 0);
+ lvItem.mask = TVIF_PARAM;
+ SendMessageW(info->popup.hwndList, LVM_GETITEMW, 0, (LPARAM)&lvItem);
+ iter = (IndexSubItem*) lvItem.lParam;
+ NavigateToChm(info, info->index->merge.chm_file, iter->local);
+ ShowWindow(info->popup.hwndPopup, SW_HIDE);
+ return 0;
+ }
+ }
+ break;
+ }
+ default:
+ return DefWindowProcW(hWnd, message, wParam, lParam);
+ }
+
+ return 0;
+}
+
+static BOOL AddIndexPopup(HHInfo *info)
+{
+ static const WCHAR szPopupChildClass[] = {'H','H',' ','P','o','p','u','p',' ','C','h','i','l','d',0};
+ static const WCHAR windowCaptionW[] = {'S','e','l','e','c','t',' ','T','o','p','i','c',':',0};
+ static const WCHAR windowClassW[] = {'H','H',' ','P','o','p','u','p',0};
+ HWND hwndList, hwndPopup, hwndCallback;
+ char hidden_column[] = "Column";
+ WNDCLASSEXW wcex;
+ LVCOLUMNA lvc;
+
+ if(info->tabs[TAB_INDEX].id == -1)
+ return TRUE; /* No "Index" tab */
+
+ wcex.cbSize = sizeof(WNDCLASSEXW);
+ wcex.style = CS_HREDRAW | CS_VREDRAW;
+ wcex.lpfnWndProc = HelpPopup_WndProc;
+ wcex.cbClsExtra = 0;
+ wcex.cbWndExtra = 0;
+ wcex.hInstance = hhctrl_hinstance;
+ wcex.hIcon = LoadIconW(NULL, (LPCWSTR)IDI_APPLICATION);
+ wcex.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_ARROW);
+ wcex.hbrBackground = (HBRUSH)(COLOR_MENU + 1);
+ wcex.lpszMenuName = NULL;
+ wcex.lpszClassName = windowClassW;
+ wcex.hIconSm = LoadIconW(NULL, (LPCWSTR)IDI_APPLICATION);
+ RegisterClassExW(&wcex);
+
+ wcex.cbSize = sizeof(WNDCLASSEXW);
+ wcex.style = 0;
+ wcex.lpfnWndProc = PopupChild_WndProc;
+ wcex.cbClsExtra = 0;
+ wcex.cbWndExtra = 0;
+ wcex.hInstance = hhctrl_hinstance;
+ wcex.hIcon = LoadIconW(NULL, (LPCWSTR)IDI_APPLICATION);
+ wcex.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_ARROW);
+ wcex.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
+ wcex.lpszMenuName = NULL;
+ wcex.lpszClassName = szPopupChildClass;
+ wcex.hIconSm = LoadIconW(NULL, (LPCWSTR)IDI_APPLICATION);
+ RegisterClassExW(&wcex);
+
+ hwndPopup = CreateWindowExW(WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_APPWINDOW
+ | WS_EX_WINDOWEDGE | WS_EX_RIGHTSCROLLBAR,
+ windowClassW, windowCaptionW, WS_POPUPWINDOW
+ | WS_OVERLAPPEDWINDOW | WS_VISIBLE
+ | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, CW_USEDEFAULT,
+ CW_USEDEFAULT, 300, 200, info->WinType.hwndHelp,
+ NULL, hhctrl_hinstance, NULL);
+ if (!hwndPopup)
+ return FALSE;
+
+ hwndCallback = CreateWindowExW(WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR,
+ szPopupChildClass, szEmpty, WS_CHILDWINDOW | WS_VISIBLE,
+ 0, 0, 0, 0,
+ hwndPopup, NULL, hhctrl_hinstance, NULL);
+ if (!hwndCallback)
+ return FALSE;
+
+ ShowWindow(hwndPopup, SW_HIDE);
+ hwndList = CreateWindowExW(WS_EX_CLIENTEDGE, WC_LISTVIEWW, szEmpty,
+ WS_CHILD | WS_BORDER | LVS_SINGLESEL | LVS_REPORT
+ | LVS_NOCOLUMNHEADER, 50, 50, 100, 100,
+ hwndCallback, NULL, hhctrl_hinstance, NULL);
+ if(!hwndList) {
+ ERR("Could not create popup ListView control\n");
+ return FALSE;
+ }
+ memset(&lvc, 0, sizeof(lvc));
+ lvc.mask = LVCF_TEXT;
+ lvc.pszText = hidden_column;
+ if(SendMessageW(hwndList, LVM_INSERTCOLUMNA, 0, (LPARAM) &lvc) == -1)
+ {
+ ERR("Could not create popup ListView column\n");
+ return FALSE;
+ }
+
+ info->popup.hwndCallback = hwndCallback;
+ info->popup.hwndPopup = hwndPopup;
+ info->popup.hwndList = hwndList;
+ SetWindowLongPtrW(hwndPopup, GWLP_USERDATA, (LONG_PTR)info);
+ SetWindowLongPtrW(hwndCallback, GWLP_USERDATA, (LONG_PTR)info);
+
+ ResizePopupChild(info);
+ ShowWindow(hwndList, SW_SHOW);
+
+ return TRUE;
+}
+
/* Viewer Window */
static LRESULT Help_OnSize(HWND hWnd)
@@ -918,7 +1374,17 @@ static BOOL CreateViewer(HHInfo *pHHInfo)
if (!AddContentTab(pHHInfo))
return FALSE;
+ if (!AddIndexTab(pHHInfo))
+ return FALSE;
+
+ if (!AddIndexPopup(pHHInfo))
+ return FALSE;
+
+ if (!AddSearchTab(pHHInfo))
+ return FALSE;
+
InitContent(pHHInfo);
+ InitIndex(pHHInfo);
return TRUE;
}
@@ -947,6 +1413,8 @@ void ReleaseHelpViewer(HHInfo *info)
ReleaseWebBrowser(info);
ReleaseContent(info);
+ ReleaseIndex(info);
+ ReleaseSearch(info);
if(info->WinType.hwndHelp)
DestroyWindow(info->WinType.hwndHelp);
@@ -958,6 +1426,13 @@ void ReleaseHelpViewer(HHInfo *info)
HHInfo *CreateHelpViewer(LPCWSTR filename)
{
HHInfo *info = heap_alloc_zero(sizeof(HHInfo));
+ int i;
+
+ /* Set the invalid tab ID (-1) as the default value for all
+ * of the tabs, this matches a failed TCM_INSERTITEM call.
+ */
+ for(i=0;itabs)/sizeof(HHTab);i++)
+ info->tabs[i].id = -1;
OleInitialize(NULL);
diff --git a/dll/win32/hhctrl.ocx/hhctrl.c b/dll/win32/hhctrl.ocx/hhctrl.c
index 8268a21f34b..99f713059e3 100644
--- a/dll/win32/hhctrl.ocx/hhctrl.c
+++ b/dll/win32/hhctrl.ocx/hhctrl.c
@@ -272,12 +272,41 @@ HWND WINAPI HtmlHelpA(HWND caller, LPCSTR filename, UINT command, DWORD_PTR data
int WINAPI doWinMain(HINSTANCE hInstance, LPSTR szCmdLine)
{
MSG msg;
- int len, buflen;
+ int len, buflen, mapid = -1;
WCHAR *filename;
char *endq = NULL;
hh_process = TRUE;
+ /* Parse command line option of the HTML Help command.
+ *
+ * Note: The only currently handled action is "mapid",
+ * which corresponds to opening a specific page.
+ */
+ while(*szCmdLine == '-')
+ {
+ LPSTR space, ptr;
+
+ ptr = szCmdLine + 1;
+ space = strchr(ptr, ' ');
+ if(!strncmp(ptr, "mapid", space-ptr))
+ {
+ char idtxt[10];
+
+ ptr += strlen("mapid")+1;
+ space = strchr(ptr, ' ');
+ memcpy(idtxt, ptr, space-ptr);
+ idtxt[space-ptr] = '\0';
+ mapid = atoi(idtxt);
+ szCmdLine = space+1;
+ }
+ else
+ {
+ FIXME("Unhandled HTML Help command line parameter! (%.*s)\n", space-szCmdLine, szCmdLine);
+ return 0;
+ }
+ }
+
/* FIXME: Check szCmdLine for bad arguments */
if (*szCmdLine == '\"')
endq = strchr(++szCmdLine, '\"');
@@ -291,7 +320,11 @@ int WINAPI doWinMain(HINSTANCE hInstance, LPSTR szCmdLine)
MultiByteToWideChar(CP_ACP, 0, szCmdLine, len, filename, buflen);
filename[buflen-1] = 0;
- HtmlHelpW(GetDesktopWindow(), filename, HH_DISPLAY_TOPIC, 0);
+ /* Open a specific help topic */
+ if(mapid != -1)
+ HtmlHelpW(GetDesktopWindow(), filename, HH_HELP_CONTEXT, mapid);
+ else
+ HtmlHelpW(GetDesktopWindow(), filename, HH_DISPLAY_TOPIC, 0);
heap_free(filename);
diff --git a/dll/win32/hhctrl.ocx/hhctrl.h b/dll/win32/hhctrl.ocx/hhctrl.h
index 795bea4d13e..91d3a775ace 100644
--- a/dll/win32/hhctrl.ocx/hhctrl.h
+++ b/dll/win32/hhctrl.ocx/hhctrl.h
@@ -65,11 +65,37 @@ typedef struct ContentItem {
ChmPath merge;
} ContentItem;
+typedef struct IndexSubItem {
+ LPWSTR name;
+ LPWSTR local;
+} IndexSubItem;
+
+typedef struct IndexItem {
+ struct IndexItem *next;
+
+ HTREEITEM id;
+ LPWSTR keyword;
+ ChmPath merge;
+
+ int nItems;
+ int itemFlags;
+ int indentLevel;
+ IndexSubItem *items;
+} IndexItem;
+
+typedef struct SearchItem {
+ struct SearchItem *next;
+
+ HTREEITEM id;
+ LPWSTR title;
+ LPWSTR filename;
+} SearchItem;
+
typedef struct CHMInfo
{
IITStorage *pITStorage;
IStorage *pStorage;
- LPCWSTR szFile;
+ WCHAR *szFile;
IStream *strings_stream;
char **strings;
@@ -90,6 +116,19 @@ typedef struct {
DWORD id;
} HHTab;
+typedef struct {
+ HWND hwndList;
+ HWND hwndPopup;
+ HWND hwndCallback;
+} IndexPopup;
+
+typedef struct {
+ SearchItem *root;
+ HWND hwndEdit;
+ HWND hwndList;
+ HWND hwndContainer;
+} SearchTab;
+
typedef struct {
IOleClientSite *client_site;
IWebBrowser2 *web_browser;
@@ -111,6 +150,9 @@ typedef struct {
CHMInfo *pCHMInfo;
ContentItem *content;
+ IndexItem *index;
+ IndexPopup popup;
+ SearchTab search;
HWND hwndTabCtrl;
HWND hwndSizeBar;
HFONT hFont;
@@ -127,6 +169,9 @@ void DoPageAction(HHInfo*,DWORD);
void InitContent(HHInfo*);
void ReleaseContent(HHInfo*);
+void InitIndex(HHInfo*);
+void ReleaseIndex(HHInfo*);
+
CHMInfo *OpenCHM(LPCWSTR szFile);
BOOL LoadWinTypeFromCHM(HHInfo *info);
CHMInfo *CloseCHM(CHMInfo *pCHMInfo);
@@ -139,6 +184,9 @@ void ReleaseHelpViewer(HHInfo*);
BOOL NavigateToUrl(HHInfo*,LPCWSTR);
BOOL NavigateToChm(HHInfo*,LPCWSTR,LPCWSTR);
+void InitSearch(HHInfo *info, const char *needle);
+void ReleaseSearch(HHInfo *info);
+
/* memory allocation functions */
static inline void * __WINE_ALLOC_SIZE(1) heap_alloc(size_t len)
diff --git a/dll/win32/hhctrl.ocx/hhctrl.ocx.rbuild b/dll/win32/hhctrl.ocx/hhctrl.ocx.rbuild
index cf043e00031..9cd7d4cfdfd 100644
--- a/dll/win32/hhctrl.ocx/hhctrl.ocx.rbuild
+++ b/dll/win32/hhctrl.ocx/hhctrl.ocx.rbuild
@@ -14,7 +14,10 @@
content.c
help.c
hhctrl.c
+ index.c
regsvr.c
+ search.c
+ stream.c
webbrowser.c
hhctrl.rc
wine
diff --git a/dll/win32/hhctrl.ocx/hhctrl.rc b/dll/win32/hhctrl.ocx/hhctrl.rc
index 8618819ed12..8e76454218e 100644
--- a/dll/win32/hhctrl.ocx/hhctrl.rc
+++ b/dll/win32/hhctrl.ocx/hhctrl.rc
@@ -31,20 +31,25 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
#include "Cs.rc"
#include "Da.rc"
-#include "De.rc"
#include "El.rc"
#include "En.rc"
-#include "Fr.rc"
#include "Fi.rc"
#include "Hu.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"
+
+/* UTF-8 */
+#include "De.rc"
+#include "Es.rc"
+#include "Fr.rc"
+#include "Lt.rc"
+#include "Ru.rc"
+#include "Si.rc"
+#include "Uk.rc"
#include "Zh.rc"
+
diff --git a/dll/win32/hhctrl.ocx/index.c b/dll/win32/hhctrl.ocx/index.c
new file mode 100644
index 00000000000..e9385c35429
--- /dev/null
+++ b/dll/win32/hhctrl.ocx/index.c
@@ -0,0 +1,295 @@
+/*
+ * Copyright 2007 Jacek Caban for CodeWeavers
+ * Copyright 2010 Erich Hoover
+ *
+ * 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
+
+#include "hhctrl.h"
+#include "stream.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(htmlhelp);
+
+/* Fill the TreeView object corresponding to the Index items */
+static void fill_index_tree(HWND hwnd, IndexItem *item)
+{
+ int index = 0;
+ LVITEMW lvi;
+
+ while(item) {
+ TRACE("tree debug: %s\n", debugstr_w(item->keyword));
+
+ if(!item->keyword)
+ {
+ FIXME("HTML Help index item has no keyword.\n");
+ item = item->next;
+ continue;
+ }
+ memset(&lvi, 0, sizeof(lvi));
+ lvi.iItem = index++;
+ lvi.mask = LVIF_TEXT|LVIF_PARAM|LVIF_INDENT;
+ lvi.iIndent = item->indentLevel;
+ lvi.cchTextMax = strlenW(item->keyword)+1;
+ lvi.pszText = item->keyword;
+ lvi.lParam = (LPARAM)item;
+ item->id = (HTREEITEM)SendMessageW(hwnd, LVM_INSERTITEMW, 0, (LPARAM)&lvi);
+ item = item->next;
+ }
+}
+
+/* Parse the attributes correspond to a list item, including sub-topics.
+ *
+ * Each list item has, at minimum, a param of type "keyword" and two
+ * parameters corresponding to a "sub-topic." For each sub-topic there
+ * must be a "name" param and a "local" param, if there is only one
+ * sub-topic then there isn't really a sub-topic, the index will jump
+ * directly to the requested item.
+ */
+static void parse_index_obj_node_param(IndexItem *item, const char *text)
+{
+ const char *ptr;
+ LPWSTR *param;
+ int len, wlen;
+
+ ptr = get_attr(text, "name", &len);
+ if(!ptr) {
+ WARN("name attr not found\n");
+ return;
+ }
+
+ /* Allocate a new sub-item, either on the first run or whenever a
+ * sub-topic has filled out both the "name" and "local" params.
+ */
+ if(item->itemFlags == 0x11 && (!strncasecmp("name", ptr, len) || !strncasecmp("local", ptr, len))) {
+ item->nItems++;
+ item->items = heap_realloc(item->items, sizeof(IndexSubItem)*item->nItems);
+ item->items[item->nItems-1].name = NULL;
+ item->items[item->nItems-1].local = NULL;
+ item->itemFlags = 0x00;
+ }
+ if(!strncasecmp("keyword", ptr, len)) {
+ param = &item->keyword;
+ }else if(!item->keyword && !strncasecmp("name", ptr, len)) {
+ /* Some HTML Help index files use an additional "name" parameter
+ * rather than the "keyword" parameter. In this case, the first
+ * occurance of the "name" parameter is the keyword.
+ */
+ param = &item->keyword;
+ }else if(!strncasecmp("name", ptr, len)) {
+ item->itemFlags |= 0x01;
+ param = &item->items[item->nItems-1].name;
+ }else if(!strncasecmp("local", ptr, len)) {
+ item->itemFlags |= 0x10;
+ param = &item->items[item->nItems-1].local;
+ }else {
+ WARN("unhandled param %s\n", debugstr_an(ptr, len));
+ return;
+ }
+
+ ptr = get_attr(text, "value", &len);
+ if(!ptr) {
+ WARN("value attr not found\n");
+ return;
+ }
+
+ wlen = MultiByteToWideChar(CP_ACP, 0, ptr, len, NULL, 0);
+ *param = heap_alloc((wlen+1)*sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, ptr, len, *param, wlen);
+ (*param)[wlen] = 0;
+}
+
+/* Parse the object tag corresponding to a list item.
+ *
+ * At this step we look for all of the "param" child tags, using this information
+ * to build up the information about the list item. When we reach the
+ * tag we know that we've finished parsing this list item.
+ */
+static IndexItem *parse_index_sitemap_object(HHInfo *info, stream_t *stream)
+{
+ strbuf_t node, node_name;
+ IndexItem *item;
+
+ strbuf_init(&node);
+ strbuf_init(&node_name);
+
+ item = heap_alloc_zero(sizeof(IndexItem));
+ item->nItems = 0;
+ item->items = heap_alloc_zero(0);
+ item->itemFlags = 0x11;
+
+ while(next_node(stream, &node)) {
+ get_node_name(&node, &node_name);
+
+ TRACE("%s\n", node.buf);
+
+ if(!strcasecmp(node_name.buf, "param")) {
+ parse_index_obj_node_param(item, node.buf);
+ }else if(!strcasecmp(node_name.buf, "/object")) {
+ break;
+ }else {
+ WARN("Unhandled tag! %s\n", node_name.buf);
+ }
+
+ strbuf_zero(&node);
+ }
+
+ strbuf_free(&node);
+ strbuf_free(&node_name);
+
+ return item;
+}
+
+/* Parse the HTML list item node corresponding to a specific help entry.
+ *
+ * At this stage we look for the only child tag we expect to find under
+ * the list item: the