diff --git a/base/applications/calc/convert.c b/base/applications/calc/convert.c
index c1de5558a94..26383080328 100644
--- a/base/applications/calc/convert.c
+++ b/base/applications/calc/convert.c
@@ -56,35 +56,35 @@ static const conv_t conv_ANGLE[] = {
/*
1 acre ................ = 4840 square yd = 4046,8564224 mq
- 1 acre brazil ......... =
- 1 acre france ......... =
+ 1 acre brazil ......... =
+ 1 acre france ......... =
1 acre scots .......... = 5000 mq
1 acre us ............. = 4840*(36/39.37)^2 m = 6272640/1549.9969 m
1 are ................. = 100 mq
1 chou ................ = 108000*(10/33)^2 mq
- 1 danbo ............... =
+ 1 danbo ............... =
1 ha .................. = 10000 mq
- 1 jeongbo ............. =
- 1 morgen hungary ...... =
- 1 mu .................. =
- 1 ping ................ =
- 1 pyeong .............. =
- 1 pyeongbangja ........ =
- 1 rai ................. =
+ 1 jeongbo ............. =
+ 1 morgen hungary ...... =
+ 1 mu .................. = 2000/3 mq
+ 1 ping ................ =
+ 1 pyeong .............. =
+ 1 pyeongbangja ........ =
+ 1 rai ................. = 1600 mq
1 se .................. = 1080*(10/33)^2 mq
1 square cm ........... = 0.0001 mq
- 1 square chr .......... =
+ 1 square chr .......... =
1 square fathom ....... = 1.8288^2 = 3.34450944 mq
1 square fathom hungary = 1.8964838^2 = 3.59665080366244 mq
1 square ft ........... = 0,09290304 mq
1 square in ........... = 0,00064516 mq
1 square km ........... = 1000000 mq
- 1 square lar .......... =
+ 1 square lar .......... =
1 square mile ......... = 1609.344^2 = 2589988.110336 mq
1 square mm ........... = 0,000001 mq
1 square shaku ........ = (10/33)^2 mq
- 1 square tsuen ........ =
- 1 square va ........... =
+ 1 square tsuen ........ =
+ 1 square va ........... =
1 square yard ......... = 0,83612736 mq
1 tan ................. = 10800*(10/33)^2 mq
1 tsubo ............... = 36*(10/33)^2 mq
@@ -101,11 +101,11 @@ static const conv_t conv_AREA[] = {
DECLARE_CONV_UNIT(AREA, HECTARES, "$*10000", "$/10000")
// DECLARE_CONV_UNIT(AREA, JEONGBO, "$", "$")
// DECLARE_CONV_UNIT(AREA, MORGEN_HUNGARY, "$", "$")
-// DECLARE_CONV_UNIT(AREA, MU, "$", "$")
+ DECLARE_CONV_UNIT(AREA, MU, "$*(2000/3)", "$/(2000/3)")
// DECLARE_CONV_UNIT(AREA, PING, "$", "$")
// DECLARE_CONV_UNIT(AREA, PYEONG, "$", "$")
// DECLARE_CONV_UNIT(AREA, PYEONGBANGJA, "$", "$")
-// DECLARE_CONV_UNIT(AREA, RAI, "$", "$")
+ DECLARE_CONV_UNIT(AREA, RAI, "$*1600", "$/1600")
DECLARE_CONV_UNIT(AREA, SE, "$*108000/1089", "$*1089/108000")
DECLARE_CONV_UNIT(AREA, SQUARE_CENTIMETERS, "$*0,0001", "$/0,0001")
// DECLARE_CONV_UNIT(AREA, SQUARE_CHR, "$", "$")
@@ -197,46 +197,47 @@ static const conv_t conv_ENERGY[] = {
1 barleycorn ..... = 1/3 inch = 0.9144/108 m
1 cm ............. = 1/100 m
1 chain uk ....... = 22 yards = 22*0.9144 m
- 1 chi ............ =
+ 1 chi ............ = 1/3 m
1 chou ........... = 3600/33 m
- 1 chr ............ =
+ 1 chr ............ =
+ 1 cun ............ = 1/10 chi = 1/30 m
1 fathom ......... = 2 yard = 2*0.9144 m
1 fathom ungary .. = 1.8964838 m (fixed)
1 feet ........... = 12 inch = 0.9144/3 m
1 furlong ........ = 10 chains = 220*0.9144 m
- 1 gan ............ =
+ 1 gan ............ =
1 hand ........... = 4 inches = 0.9144/9 m
- 1 hunh ........... =
+ 1 hunh ........... =
1 inch ........... = yard/36 = 0.9144/36 m
- 1 ja ............. =
- 1 jeong .......... =
- 1 kabiet ......... =
+ 1 ja ............. =
+ 1 jeong .......... =
+ 1 kabiet ......... =
1 ken ............ = 60/33 m
- 1 keub ........... =
+ 1 keub ........... =
1 km ............. = 1000 m
- 1 lar ............ =
+ 1 lar ............ =
1 light year ..... = 9460730472580800 m
1 link uk ........ = 0.01 chains = 0.22*0.9144 m
1 micron ......... = 0.000001 m
1 mile ........... = 1760 yards = 1609.344 m
1 millimeter ..... = 1/1000 m
1 nautical mile .. = 1852 m
- 1 nieu ........... =
+ 1 nieu ........... =
1 parsec ......... = 30856800000000000 m
1 pica ........... = yard/216 = 0.9144/216 m
- 1 ri japan ....... =
- 1 ri korea ....... =
+ 1 ri japan ....... =
+ 1 ri korea ....... =
1 rod ............ = 5.0292 m
- 1 sawk ........... =
- 1 sen ............ =
+ 1 sawk ........... =
+ 1 sen ............ =
1 shaku .......... = 10/33 m
1 span ........... = 9 inches = 0.9144/4 m
- 1 sun ............ = 10/330 m
- 1 tsuen .......... =
- 1 va ............. =
+ 1 sun ............ = 1/33 m
+ 1 tsuen .......... =
+ 1 va ............. =
1 yard ........... = 0.9144 m
- 1 yote ........... =
- 1 zhang .......... =
+ 1 yote ........... =
+ 1 zhang .......... =
*/
static const conv_t conv_LENGTH[] = {
DECLARE_CONV_UNIT(LENGTH, ANGSTROMS, "$*0.0000000001", "$/0.0000000001")
@@ -244,10 +245,10 @@ static const conv_t conv_LENGTH[] = {
DECLARE_CONV_UNIT(LENGTH, BARLEYCORNS, "$*0.9144/108", "$/0.9144*108")
DECLARE_CONV_UNIT(LENGTH, CENTIMETERS, "$/100", "$*100")
DECLARE_CONV_UNIT(LENGTH, CHAINS_UK, "$*20.1168", "$/20.1168")
-// DECLARE_CONV_UNIT(LENGTH, CHI, "$", "$")
+ DECLARE_CONV_UNIT(LENGTH, CHI, "$/3", "$*3")
DECLARE_CONV_UNIT(LENGTH, CHOU, "$*3600/33", "$*33/3600")
// DECLARE_CONV_UNIT(LENGTH, CHR, "$", "$")
-// DECLARE_CONV_UNIT(LENGTH, CUN, "$", "$")
+ DECLARE_CONV_UNIT(LENGTH, CUN, "$/30", "$*30")
DECLARE_CONV_UNIT(LENGTH, FATHOMS, "$*1.8288", "$/1.8288")
DECLARE_CONV_UNIT(LENGTH, FATHOMS_HUNGARY, "$*1.8964838", "$/1.8964838")
DECLARE_CONV_UNIT(LENGTH, FEET, "$*0.3048", "$/0.3048")
@@ -280,7 +281,7 @@ static const conv_t conv_LENGTH[] = {
// DECLARE_CONV_UNIT(LENGTH, SEN, "$", "$")
DECLARE_CONV_UNIT(LENGTH, SHAKU, "$*10/33", "$*33/10")
DECLARE_CONV_UNIT(LENGTH, SPAN, "$*0.9144/4", "$*4/0.9144")
- DECLARE_CONV_UNIT(LENGTH, SUN, "$*10/330", "$*330/10")
+ DECLARE_CONV_UNIT(LENGTH, SUN, "$*1/33", "$*33")
// DECLARE_CONV_UNIT(LENGTH, TSUEN, "$", "$")
// DECLARE_CONV_UNIT(LENGTH, VA, "$", "$")
DECLARE_CONV_UNIT(LENGTH, YARDS, "$*0.9144", "$/0.9144")
@@ -312,7 +313,7 @@ static const conv_t conv_POWER[] = {
1 hPa = 100 Pa
1 kPa = 1000 Pa
1 mm HG = 133.322 Pa
- 1 psi = 6894.757 Pa
+ 1 psi = 6894.757 Pa
*/
static const conv_t conv_PRESSURE[] = {
DECLARE_CONV_UNIT(PRESSURE, ATMOSPHERES, "$*101325", "$/101325")
@@ -330,18 +331,20 @@ static const conv_t conv_PRESSURE[] = {
1 hour ...... = 3600 s
1 microsecond = 0.000001 s
1 millisecond = 0.001 s
+ 1 nanosecond. = 0.000000001 s
1 minute .... = 60 s
1 week ...... = 669600 s
*/
static const conv_t conv_TIME[] = {
- DECLARE_CONV_UNIT(TIME, MINUTES, "$*60", "$/60")
- DECLARE_CONV_UNIT(TIME, DAYS, "$*86400", "$/86400")
- DECLARE_CONV_UNIT(TIME, HOURS, "$*3600", "$/3600")
- DECLARE_CONV_UNIT(TIME, MILLISECONDS, "$*0.001", "$/0.001")
- DECLARE_CONV_UNIT(TIME, MICROSECONDS, "$*0.000001", "$/0.000001")
- DECLARE_CONV_UNIT(TIME, SECONDS, "$", "$")
- DECLARE_CONV_UNIT(TIME, WEEKS, "$*604800", "$/604800")
- DECLARE_CONV_UNIT(TIME, YEARS, "$*31556952", "$/31556952")
+ DECLARE_CONV_UNIT(TIME, MINUTES, "$*60", "$/60")
+ DECLARE_CONV_UNIT(TIME, DAYS, "$*86400", "$/86400")
+ DECLARE_CONV_UNIT(TIME, HOURS, "$*3600", "$/3600")
+ DECLARE_CONV_UNIT(TIME, MILLISECONDS, "$*0.001", "$/0.001")
+ DECLARE_CONV_UNIT(TIME, MICROSECONDS, "$*0.000001", "$/0.000001")
+ DECLARE_CONV_UNIT(TIME, NANOSECONDS, "$*0.000000001", "$/0.000000001")
+ DECLARE_CONV_UNIT(TIME, SECONDS, "$", "$")
+ DECLARE_CONV_UNIT(TIME, WEEKS, "$*604800", "$/604800")
+ DECLARE_CONV_UNIT(TIME, YEARS, "$*31556952", "$/31556952")
DECLARE_CONV_END
};
@@ -382,7 +385,7 @@ static const conv_t conv_VELOCITY[] = {
/*
1 barrel uk ...... = 163.65924 l
1 barrel oil ..... = 158.987295 l
- 1 bun ............ =
+ 1 bun ............ =
1 bushel uk ...... = 36.36872 l
1 bushel us ...... = 35.23907017 l
1 cubic cm ...... = 0.001 l
@@ -390,17 +393,17 @@ static const conv_t conv_VELOCITY[] = {
1 cubic inch ..... = 0.016387064 l
1 cubic meter .... = 1000 l
1 cubic yard ..... = 764.554857 l
- 1 doe ............ =
+ 1 doe ............ =
1 fluid ounce uk = 0.0284130625 l
1 fluid ounce us = 0.0295735295625 l
1 gallon uk ...... = 4.54609 l
1 gallon dry us .. = 4.40488377086 l
1 gallon liquid us = 3.785411784 l
1 gou ............ = 0.1809 l
- 1 hop ............ =
- 1 icce ........... =
- 1 kwian .......... =
- 1 mal ............ =
+ 1 hop ............ =
+ 1 icce ........... =
+ 1 kwian .......... =
+ 1 mal ............ =
1 milliliter ..... = 0.001 l
1 pint uk ........ = 0.56826125 l
1 pint dry us .... = 0.5506104713575 l
@@ -408,10 +411,10 @@ static const conv_t conv_VELOCITY[] = {
1 quart uk ....... = 1.1365225 l
1 quart dry us ... = 1.101220942715 l
1 quart liquid us = 0.946352946 l
- 1 seki ........... =
- 1 syou ........... =
- 1 tananloung ..... =
- 1 tang ........... =
+ 1 seki ........... =
+ 1 syou ........... =
+ 1 tananloung ..... =
+ 1 tang ........... =
1 to ............. = 18040 l
*/
static const conv_t conv_VOLUME[] = {
@@ -455,16 +458,16 @@ static const conv_t conv_VOLUME[] = {
/*
1 baht ............ = 12.244 g
1 carat ........... = 0.2 g
- 1 chung ........... =
- 1 don ............. =
- 1 geun ............ =
- 1 gwan ............ =
- 1 harb ............ =
- 1 jin china ....... =
- 1 jin taiwan ...... =
- 1 Kan ............. =
+ 1 chung ........... =
+ 1 don ............. =
+ 1 geun ............ =
+ 1 gwan ............ =
+ 1 harb ............ =
+ 1 jin china ....... =
+ 1 jin taiwan ...... =
+ 1 Kan ............. = 3750 g
1 Kilograms ....... = 1000 g
- 1 Kin ............. =
+ 1 Kin ............. = 600 g
1 Liang China ..... =
1 Liang Taiwan .... =
1 monme ........... = 3.75 g
@@ -472,9 +475,9 @@ static const conv_t conv_VOLUME[] = {
1 ounce troy ...... = 31.1034768 g
1 pound ........... = 453.59237 g
1 quintal metric .. = 100000 g
- 1 saloung ......... =
+ 1 saloung ......... =
1 stone ........... = 6350.29318 g
- 1 tamlung ......... =
+ 1 tamlung ......... =
1 ton ............. = 1000000 g
1 ton uk .......... = 1016046.9088 g // long ton
1 ton us .......... = 907184.74 g // short ton
@@ -490,9 +493,9 @@ static const conv_t conv_WEIGHT[] = {
// DECLARE_CONV_UNIT(WEIGHT, HARB, "$", "$")
// DECLARE_CONV_UNIT(WEIGHT, JIN_CHINA, "$", "$")
// DECLARE_CONV_UNIT(WEIGHT, JIN_TAIWAN, "$", "$")
-// DECLARE_CONV_UNIT(WEIGHT, KAN, "$", "$")
+ DECLARE_CONV_UNIT(WEIGHT, KAN, "$*3750", "$/3750")
DECLARE_CONV_UNIT(WEIGHT, KILOGRAMS, "$*1000", "$/1000")
-// DECLARE_CONV_UNIT(WEIGHT, KIN, "$", "$")
+ DECLARE_CONV_UNIT(WEIGHT, KIN, "$*600", "$/600")
// DECLARE_CONV_UNIT(WEIGHT, LIANG_CHINA, "$", "$")
// DECLARE_CONV_UNIT(WEIGHT, LIANG_TAIWAN, "$", "$")
DECLARE_CONV_UNIT(WEIGHT, MONME, "$*3.75", "$/3.75")
@@ -548,7 +551,7 @@ void ConvExecute(HWND hWnd)
break;
}
}
-
+
/* The units can be sorted, so I must search the exact match */
item = items;
SendDlgItemMessage(hWnd, IDC_COMBO_FROM, CB_GETLBTEXT, from, (LPARAM)txt_cb);
diff --git a/base/applications/calc/lang/bg-BG.rc b/base/applications/calc/lang/bg-BG.rc
index dc9faab1628..19f411df033 100644
--- a/base/applications/calc/lang/bg-BG.rc
+++ b/base/applications/calc/lang/bg-BG.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Äíč"
IDS_TIME_HOURS "×ŕńč"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Ěčęđîńĺęóíäč"
IDS_TIME_MILLISECONDS "Ěčëčńĺęóíäč"
IDS_TIME_MINUTES "Ěčíóňč"
diff --git a/base/applications/calc/lang/cs-CZ.rc b/base/applications/calc/lang/cs-CZ.rc
index 278cc562783..c1f842282de 100644
--- a/base/applications/calc/lang/cs-CZ.rc
+++ b/base/applications/calc/lang/cs-CZ.rc
@@ -644,6 +644,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Dny"
IDS_TIME_HOURS "Hodiny"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Mikrosekundy"
IDS_TIME_MILLISECONDS "Milisekundy"
IDS_TIME_MINUTES "Minuty"
diff --git a/base/applications/calc/lang/de-DE.rc b/base/applications/calc/lang/de-DE.rc
index f6513aa6dfe..d3aa5436a8f 100644
--- a/base/applications/calc/lang/de-DE.rc
+++ b/base/applications/calc/lang/de-DE.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Tagen"
IDS_TIME_HOURS "Stunden"
+ IDS_TIME_NANOSECONDS "Nanosekunden"
IDS_TIME_MICROSECONDS "Mikrosekunden"
IDS_TIME_MILLISECONDS "Millisekunden"
IDS_TIME_MINUTES "Minuten"
diff --git a/base/applications/calc/lang/el-GR.rc b/base/applications/calc/lang/el-GR.rc
index 89ce2d13c64..5f88a9465e1 100644
--- a/base/applications/calc/lang/el-GR.rc
+++ b/base/applications/calc/lang/el-GR.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "ĚÝńĺň"
IDS_TIME_HOURS "żńĺň"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Ěéęńďäĺőôĺńüëĺđôá"
IDS_TIME_MILLISECONDS "Ěéëéäĺőôĺńüëĺđôá"
IDS_TIME_MINUTES "ËĺđôÜ"
diff --git a/base/applications/calc/lang/en-US.rc b/base/applications/calc/lang/en-US.rc
index 756244ef64b..402991ab06d 100644
--- a/base/applications/calc/lang/en-US.rc
+++ b/base/applications/calc/lang/en-US.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Days"
IDS_TIME_HOURS "Hours"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Microseconds"
IDS_TIME_MILLISECONDS "Milliseconds"
IDS_TIME_MINUTES "Minutes"
diff --git a/base/applications/calc/lang/es-ES.rc b/base/applications/calc/lang/es-ES.rc
index faba06c0b03..88e89a384fe 100644
--- a/base/applications/calc/lang/es-ES.rc
+++ b/base/applications/calc/lang/es-ES.rc
@@ -644,6 +644,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Días"
IDS_TIME_HOURS "Horas"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Microsegundos"
IDS_TIME_MILLISECONDS "Milisegundos"
IDS_TIME_MINUTES "Minutos"
diff --git a/base/applications/calc/lang/fr-FR.rc b/base/applications/calc/lang/fr-FR.rc
index 4cd589992cb..8536cdb8d9d 100644
--- a/base/applications/calc/lang/fr-FR.rc
+++ b/base/applications/calc/lang/fr-FR.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Jours"
IDS_TIME_HOURS "Heures"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Microsecondes"
IDS_TIME_MILLISECONDS "Millisecondes"
IDS_TIME_MINUTES "Minutes"
diff --git a/base/applications/calc/lang/it-IT.rc b/base/applications/calc/lang/it-IT.rc
index 0294303512a..2e96c209fb5 100644
--- a/base/applications/calc/lang/it-IT.rc
+++ b/base/applications/calc/lang/it-IT.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Giorni"
IDS_TIME_HOURS "Ore"
+ IDS_TIME_NANOSECONDS "Nanosecondi"
IDS_TIME_MICROSECONDS "Microsecondi"
IDS_TIME_MILLISECONDS "Millisecondi"
IDS_TIME_MINUTES "Minuti"
diff --git a/base/applications/calc/lang/ko-KR.rc b/base/applications/calc/lang/ko-KR.rc
index 51d70687527..8ab51ed6496 100644
--- a/base/applications/calc/lang/ko-KR.rc
+++ b/base/applications/calc/lang/ko-KR.rc
@@ -643,6 +643,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Days"
IDS_TIME_HOURS "Hours"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Microseconds"
IDS_TIME_MILLISECONDS "Milliseconds"
IDS_TIME_MINUTES "Minutes"
diff --git a/base/applications/calc/lang/nl-NL.rc b/base/applications/calc/lang/nl-NL.rc
index 510352f6ee2..bad67ab7a32 100644
--- a/base/applications/calc/lang/nl-NL.rc
+++ b/base/applications/calc/lang/nl-NL.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Dagen"
IDS_TIME_HOURS "Uren"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Microseconden"
IDS_TIME_MILLISECONDS "Milliseconden"
IDS_TIME_MINUTES "Minuten"
diff --git a/base/applications/calc/lang/no-NO.rc b/base/applications/calc/lang/no-NO.rc
index 3bb0857dc8e..8e590be8ac3 100644
--- a/base/applications/calc/lang/no-NO.rc
+++ b/base/applications/calc/lang/no-NO.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "**"
IDS_TIME_HOURS "**"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "**"
IDS_TIME_MILLISECONDS "**"
IDS_TIME_MINUTES "**"
diff --git a/base/applications/calc/lang/pl-PL.rc b/base/applications/calc/lang/pl-PL.rc
index 8fdfa4bdad9..59cf444ef50 100644
--- a/base/applications/calc/lang/pl-PL.rc
+++ b/base/applications/calc/lang/pl-PL.rc
@@ -464,9 +464,9 @@ END
// TYPES OF ANGLES
STRINGTABLE DISCARDABLE
BEGIN
- IDS_ANGLE_DEGREES "Stopni"
- IDS_ANGLE_GRADIANS "Gradianów"
- IDS_ANGLE_RADIANS "Radianów"
+ IDS_ANGLE_DEGREES "Stopnie"
+ IDS_ANGLE_GRADIANS "Gradiany"
+ IDS_ANGLE_RADIANS "Radiany"
END
// TYPES OF AREAS
@@ -489,21 +489,21 @@ BEGIN
IDS_AREA_PYEONGBANGJA "Pyeongbangja"
IDS_AREA_RAI "Rai"
IDS_AREA_SE "Se"
- IDS_AREA_SQUARE_CENTIMETERS "Centymetrów kwadratowych"
- IDS_AREA_SQUARE_CHR "Chr kwadratowych"
- IDS_AREA_SQUARE_FATHOMS "Sążni kwadratowych"
- IDS_AREA_SQUARE_FATHOMS_HUNGARY "Sążni kwadratowych (Węgry)"
- IDS_AREA_SQUARE_FEET "Stóp kwadratowych"
- IDS_AREA_SQUARE_INCHES "Cali kwadratowych"
- IDS_AREA_SQUARE_KILOMETERS "Kilometrów kwadratowych"
- IDS_AREA_SQUARE_LAR "Lar kwadratowych"
- IDS_AREA_SQUARE_METER "Metrów kwadratowych"
- IDS_AREA_SQUARE_MILES "Mil kwadratowych"
- IDS_AREA_SQUARE_MILLIMETERS "Milimetrów kwadratowych"
- IDS_AREA_SQUARE_SHAKU "Shaku kwadratowych"
- IDS_AREA_SQUARE_TSUEN "Tsuen kwadratowych"
- IDS_AREA_SQUARE_VA "Va kwadratowych"
- IDS_AREA_SQUARE_YARD "Jardów kwadratowych"
+ IDS_AREA_SQUARE_CENTIMETERS "Centymetry kwadratowe"
+ IDS_AREA_SQUARE_CHR "Chr kwadratowe"
+ IDS_AREA_SQUARE_FATHOMS "Sążnie kwadratowe"
+ IDS_AREA_SQUARE_FATHOMS_HUNGARY "Sążnie kwadratowe (Węgry)"
+ IDS_AREA_SQUARE_FEET "Stopy kwadratowe"
+ IDS_AREA_SQUARE_INCHES "Cale kwadratowe"
+ IDS_AREA_SQUARE_KILOMETERS "Kilometry kwadratowe"
+ IDS_AREA_SQUARE_LAR "Lar kwadratowe"
+ IDS_AREA_SQUARE_METER "Metry kwadratowe"
+ IDS_AREA_SQUARE_MILES "Mile kwadratowe"
+ IDS_AREA_SQUARE_MILLIMETERS "Milimetry kwadratowe"
+ IDS_AREA_SQUARE_SHAKU "Shaku kwadratowe"
+ IDS_AREA_SQUARE_TSUEN "Tsuen kwadratowe"
+ IDS_AREA_SQUARE_VA "Va kwadratowe"
+ IDS_AREA_SQUARE_YARD "Jardy kwadratowe"
IDS_AREA_TAN "Tan"
IDS_AREA_TSUBO "Tsubo"
END
@@ -511,10 +511,10 @@ END
// TYPES OF COMSUMPTIONS
STRINGTABLE DISCARDABLE
BEGIN
- IDS_CONSUMPTION_KM_PER_L "Kilometrów/litr"
- IDS_CONSUMPTION_L_PER_100_KM "Litrów/100 kilometróws"
- IDS_CONSUMPTION_MILES_GALLON_UK "Mil/galon (UK)"
- IDS_CONSUMPTION_MILES_GALLON_US "Mil/galon (USA)"
+ IDS_CONSUMPTION_KM_PER_L "Kilometry/litr"
+ IDS_CONSUMPTION_L_PER_100_KM "Litry/100 kilometrów"
+ IDS_CONSUMPTION_MILES_GALLON_UK "Mile/galon (UK)"
+ IDS_CONSUMPTION_MILES_GALLON_US "Mile/galon (USA)"
END
// TYPES OF CURRENCIES
@@ -543,56 +543,56 @@ END
// TYPES OF ENERGIES
STRINGTABLE DISCARDABLE
BEGIN
- IDS_ENERGY_15_C_CALORIES "15 °C kalorii"
+ IDS_ENERGY_15_C_CALORIES "15 °C kalorie"
IDS_ENERGY_BTUS "British Thermal Unit"
- IDS_ENERGY_ERGS "Ergów"
- IDS_ENERGY_EVS "Elektronowolt"
- IDS_ENERGY_FOOT_POUNDS "Foot-pound"
+ IDS_ENERGY_ERGS "Ergi"
+ IDS_ENERGY_EVS "Elektronowolty"
+ IDS_ENERGY_FOOT_POUNDS "Stopo-funty"
IDS_ENERGY_IT_CALORIES "Międzynarodowa Tablica kalorii"
IDS_ENERGY_IT_KILOCALORIES "Międzynarodowa Tablica kilokalorii"
- IDS_ENERGY_JOULES "Dżuli"
- IDS_ENERGY_KILOJOULES "Kilodżuli"
- IDS_ENERGY_KILOWATT_HOURS "Kilowatogodzin"
- IDS_ENERGY_NUTRITION_CALORIES "Kalorii spożywczych"
- IDS_ENERGY_TH_CALORIES "Kalorii termochemicznych"
+ IDS_ENERGY_JOULES "Dżule"
+ IDS_ENERGY_KILOJOULES "Kilodżule"
+ IDS_ENERGY_KILOWATT_HOURS "Kilowatogodziny"
+ IDS_ENERGY_NUTRITION_CALORIES "Kalorie spożywcze"
+ IDS_ENERGY_TH_CALORIES "Kalorie termochemiczne"
END
// TYPES OF LENGTHS
STRINGTABLE DISCARDABLE
BEGIN
- IDS_LENGTH_ANGSTROMS "Angsztremów"
- IDS_LENGTH_ASTRONOMICAL_UNITS "Jednostek Astronomicznych"
- IDS_LENGTH_BARLEYCORNS "Palców"
- IDS_LENGTH_CENTIMETERS "Centimetrów"
+ IDS_LENGTH_ANGSTROMS "Angsztremy"
+ IDS_LENGTH_ASTRONOMICAL_UNITS "Jednostki Astronomiczne"
+ IDS_LENGTH_BARLEYCORNS "Palce"
+ IDS_LENGTH_CENTIMETERS "Centymetry"
IDS_LENGTH_CHAINS_UK "Chains (UK)"
IDS_LENGTH_CHI "Chi"
IDS_LENGTH_CHOU "Chou"
IDS_LENGTH_CHR "Chr"
IDS_LENGTH_CUN "Cun"
- IDS_LENGTH_FATHOMS "Sążni"
- IDS_LENGTH_FATHOMS_HUNGARY "Sążni (Węgry)"
- IDS_LENGTH_FEET "Stóp"
+ IDS_LENGTH_FATHOMS "Sążnie"
+ IDS_LENGTH_FATHOMS_HUNGARY "Sążnie (Węgry)"
+ IDS_LENGTH_FEET "Stopy"
IDS_LENGTH_FURLONGS "Furlongs"
IDS_LENGTH_GAN "Gan"
- IDS_LENGTH_HANDS "Dłoni"
+ IDS_LENGTH_HANDS "Dłonie"
IDS_LENGTH_HUNH "Hunh"
- IDS_LENGTH_INCHES "Cali"
+ IDS_LENGTH_INCHES "Cale"
IDS_LENGTH_JA "Ja"
IDS_LENGTH_JEONG "Jeong"
IDS_LENGTH_KABIET "Kabiet"
IDS_LENGTH_KEN "Ken"
IDS_LENGTH_KEUB "Keub"
- IDS_LENGTH_KILOMETERS "Kilometerów"
+ IDS_LENGTH_KILOMETERS "Kilometry"
IDS_LENGTH_LAR "Lar"
- IDS_LENGTH_LIGHT_YEARS "Lat świetlnych"
+ IDS_LENGTH_LIGHT_YEARS "Lata świetlne"
IDS_LENGTH_LINKS_UK "Links (UK)"
- IDS_LENGTH_METERS "Metrów"
- IDS_LENGTH_MICRONS "Mikrometrów"
- IDS_LENGTH_MILES "Mil"
- IDS_LENGTH_MILLIMETERS "Millimetrów"
- IDS_LENGTH_NAUTICAL_MILES "Mil morskich"
+ IDS_LENGTH_METERS "Metry"
+ IDS_LENGTH_MICRONS "Mikrometry"
+ IDS_LENGTH_MILES "Mile"
+ IDS_LENGTH_MILLIMETERS "Milimetry"
+ IDS_LENGTH_NAUTICAL_MILES "Mile morskie"
IDS_LENGTH_NIEU "Nieu"
- IDS_LENGTH_PARSECS "Parseków"
+ IDS_LENGTH_PARSECS "Parseki"
IDS_LENGTH_PICAS "Picas"
IDS_LENGTH_RI_JAPAN "Ri (Japan)"
IDS_LENGTH_RI_KOREA "Ri (Korea)"
@@ -604,7 +604,7 @@ BEGIN
IDS_LENGTH_SUN "Sun"
IDS_LENGTH_TSUEN "Tsuen"
IDS_LENGTH_VA "Va"
- IDS_LENGTH_YARDS "Jardów"
+ IDS_LENGTH_YARDS "Jardy"
IDS_LENGTH_YOTE "Yote"
IDS_LENGTH_ZHANG "Zhang"
END
@@ -613,23 +613,23 @@ END
STRINGTABLE DISCARDABLE
BEGIN
IDS_POWER_BTUS_PER_MINUTE "BTU na minutę"
- IDS_POWER_FPS_PER_MINUTE "Foot-pound na minutę"
- IDS_POWER_HORSEPOWER "Koni mechanicznych"
- IDS_POWER_KILOWATTS "Kilowatów"
- IDS_POWER_MEGAWATTS "Megawatów"
- IDS_POWER_WATTS "Watów"
+ IDS_POWER_FPS_PER_MINUTE "Stopo-funty na minutę"
+ IDS_POWER_HORSEPOWER "Konie mechaniczne"
+ IDS_POWER_KILOWATTS "Kilowaty"
+ IDS_POWER_MEGAWATTS "Megawaty"
+ IDS_POWER_WATTS "Waty"
END
// TYPE OF PRESSURES
STRINGTABLE DISCARDABLE
BEGIN
- IDS_PRESSURE_ATMOSPHERES "Atmosfer"
- IDS_PRESSURE_BARS "Barów"
- IDS_PRESSURE_HECTOPASCALS "Hektopaskali"
- IDS_PRESSURE_KILOPASCALS "Kilopaskali"
- IDS_PRESSURE_MM_OF_MERCURY "Millimetrów słupka rtęci"
- IDS_PRESSURE_PASCALS "Paskali"
- IDS_PRESSURE_PSI "Funtów na cal kwadratowy"
+ IDS_PRESSURE_ATMOSPHERES "Atmosfery"
+ IDS_PRESSURE_BARS "Bary"
+ IDS_PRESSURE_HECTOPASCALS "Hektopaskale"
+ IDS_PRESSURE_KILOPASCALS "Kilopaskale"
+ IDS_PRESSURE_MM_OF_MERCURY "Milimetry słupka rtęci"
+ IDS_PRESSURE_PASCALS "Paskale"
+ IDS_PRESSURE_PSI "Funty na cal kwadratowy"
END
// TYPES OF TEMPERATURES
@@ -645,60 +645,61 @@ END
STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Dni"
- IDS_TIME_HOURS "Godzin"
- IDS_TIME_MICROSECONDS "Mikrosekund"
- IDS_TIME_MILLISECONDS "Milisekund"
- IDS_TIME_MINUTES "Minut"
- IDS_TIME_SECONDS "Sekund"
- IDS_TIME_WEEKS "Tygodni"
- IDS_TIME_YEARS "Lat"
+ IDS_TIME_HOURS "Godziny"
+ IDS_TIME_NANOSECONDS "Nanosekundy"
+ IDS_TIME_MICROSECONDS "Mikrosekundy"
+ IDS_TIME_MILLISECONDS "Milisekundy"
+ IDS_TIME_MINUTES "Minuty"
+ IDS_TIME_SECONDS "Sekundy"
+ IDS_TIME_WEEKS "Tygodnie"
+ IDS_TIME_YEARS "Lata"
END
// TYPES OF VELOCITIES
STRINGTABLE DISCARDABLE
BEGIN
- IDS_VELOCITY_CMS_SECOND "Centimetrów/sekundę"
- IDS_VELOCITY_FEET_HOUR "Stóp/godzinę"
- IDS_VELOCITY_FEET_SECOND "Stóp/sekundę"
- IDS_VELOCITY_KILOMETERS_HOUR "Kilometrów/godzinę"
- IDS_VELOCITY_KNOTS "Węzłów"
- IDS_VELOCITY_MACH "Machów"
- IDS_VELOCITY_METERS_SECOND "Metrów/sekundę"
- IDS_VELOCITY_MILES_HOUR "Mil/godzinę"
+ IDS_VELOCITY_CMS_SECOND "Centymetry/sekundę"
+ IDS_VELOCITY_FEET_HOUR "Stopy/godzinę"
+ IDS_VELOCITY_FEET_SECOND "Stopy/sekundę"
+ IDS_VELOCITY_KILOMETERS_HOUR "Kilometry/godzinę"
+ IDS_VELOCITY_KNOTS "Węzły"
+ IDS_VELOCITY_MACH "Machy"
+ IDS_VELOCITY_METERS_SECOND "Metry/sekundę"
+ IDS_VELOCITY_MILES_HOUR "Mile/godzinę"
END
// TYPES OF VOLUMES
STRINGTABLE DISCARDABLE
BEGIN
- IDS_VOLUME_BARRELS_UK "Baryłek (UK)"
- IDS_VOLUME_BARRELS_OIL "Baryłek"
+ IDS_VOLUME_BARRELS_UK "Baryłki (UK)"
+ IDS_VOLUME_BARRELS_OIL "Baryłki"
IDS_VOLUME_BUN "Bun"
- IDS_VOLUME_BUSHELS_UK "Buszli (UK)"
- IDS_VOLUME_BUSHELS_US "Buszli (US)"
- IDS_VOLUME_CUBIC_CENTIMETERS "Centymetrów sześciennych"
- IDS_VOLUME_CUBIC_FEET "Stóp sześciennych"
- IDS_VOLUME_CUBIC_INCHES "Cali sześciennych"
- IDS_VOLUME_CUBIC_METERS "Metrów sześciennych"
- IDS_VOLUME_CUBIC_YARDS "Jardów sześciennych"
+ IDS_VOLUME_BUSHELS_UK "Buszle (UK)"
+ IDS_VOLUME_BUSHELS_US "Buszle (US)"
+ IDS_VOLUME_CUBIC_CENTIMETERS "Centymetry sześcienne"
+ IDS_VOLUME_CUBIC_FEET "Stopy sześcienne"
+ IDS_VOLUME_CUBIC_INCHES "Cale sześcienne"
+ IDS_VOLUME_CUBIC_METERS "Metry sześcienne"
+ IDS_VOLUME_CUBIC_YARDS "Jardy sześcienne"
IDS_VOLUME_DOE "Doe"
- IDS_VOLUME_FLUID_OUNCES_UK "Uncji, płyn (UK)"
- IDS_VOLUME_FLUID_OUNCES_US "Uncji, płyn (US)"
- IDS_VOLUME_GALLONS_UK "Galonów (UK)"
- IDS_VOLUME_GALLONS_DRY_US "Galonów, sypkie (US)"
- IDS_VOLUME_GALLONS_LIQUID_US "Gallons, płyn (US)"
+ IDS_VOLUME_FLUID_OUNCES_UK "Uncje, płyn (UK)"
+ IDS_VOLUME_FLUID_OUNCES_US "Uncje, płyn (US)"
+ IDS_VOLUME_GALLONS_UK "Galony (UK)"
+ IDS_VOLUME_GALLONS_DRY_US "Galony, sypkie (US)"
+ IDS_VOLUME_GALLONS_LIQUID_US "Galony, płyn (US)"
IDS_VOLUME_GOU "Gou"
IDS_VOLUME_HOP "Hop"
IDS_VOLUME_ICCE "Icce"
IDS_VOLUME_KWIAN "Kwian"
- IDS_VOLUME_LITERS "Litrów"
+ IDS_VOLUME_LITERS "Litry"
IDS_VOLUME_MAL "Mal"
- IDS_VOLUME_MILLILITERS "Milliliters"
- IDS_VOLUME_PINTS_UK "Pint (UK)"
- IDS_VOLUME_PINTS_DRY_US "Pint, sypkie (US)"
- IDS_VOLUME_PINTS_LIQUID_US "Pint, płyn (US)"
- IDS_VOLUME_QUARTS_UK "Kwart (UK)"
- IDS_VOLUME_QUARTS_DRY_US "Kwart, sypkie (US)"
- IDS_VOLUME_QUARTS_LIQUID_US "Kwart, płyn (US)"
+ IDS_VOLUME_MILLILITERS "Mililitry"
+ IDS_VOLUME_PINTS_UK "Pinty (UK)"
+ IDS_VOLUME_PINTS_DRY_US "Pinty, sypkie (US)"
+ IDS_VOLUME_PINTS_LIQUID_US "Pinty, płyn (US)"
+ IDS_VOLUME_QUARTS_UK "Kwarty (UK)"
+ IDS_VOLUME_QUARTS_DRY_US "Kwarty, sypkie (US)"
+ IDS_VOLUME_QUARTS_LIQUID_US "Kwarty, płyn (US)"
IDS_VOLUME_SEKI "Seki"
IDS_VOLUME_SYOU "Syou"
IDS_VOLUME_TANANLOUNG "Tananloung"
@@ -709,26 +710,26 @@ END
// TYPES OF WEIGHTS
STRINGTABLE DISCARDABLE
BEGIN
- IDS_WEIGHT_BAHT "Bahtów"
- IDS_WEIGHT_CARATS "Karatów"
+ IDS_WEIGHT_BAHT "Bahty"
+ IDS_WEIGHT_CARATS "Karaty"
IDS_WEIGHT_CHUNG "Chung"
IDS_WEIGHT_DON "Don"
IDS_WEIGHT_GEUN "Geun"
- IDS_WEIGHT_GRAMS "Gramów"
+ IDS_WEIGHT_GRAMS "Gramy"
IDS_WEIGHT_GWAN "Gwan"
IDS_WEIGHT_HARB "Harb"
IDS_WEIGHT_JIN_CHINA "Jin (China)"
IDS_WEIGHT_JIN_TAIWAN "Jin (Taiwan)"
IDS_WEIGHT_KAN "Kan"
- IDS_WEIGHT_KILOGRAMS "Kilogramów"
+ IDS_WEIGHT_KILOGRAMS "Kilogramy"
IDS_WEIGHT_KIN "Kin"
IDS_WEIGHT_LIANG_CHINA "Liang (China)"
IDS_WEIGHT_LIANG_TAIWAN "Liang (Taiwan)"
IDS_WEIGHT_MONME "Monme"
- IDS_WEIGHT_OUNCES_AVOIRDUPOIS "Uncji, avoirdupois"
- IDS_WEIGHT_OUNCES_TROY "Uncji, aptekarskie"
- IDS_WEIGHT_POUNDS "Funtów"
- IDS_WEIGHT_QUINTAL_METRIC "Kwintali"
+ IDS_WEIGHT_OUNCES_AVOIRDUPOIS "Uncje, avoirdupois"
+ IDS_WEIGHT_OUNCES_TROY "Uncje, aptekarskie"
+ IDS_WEIGHT_POUNDS "Funty"
+ IDS_WEIGHT_QUINTAL_METRIC "Kwintale"
IDS_WEIGHT_SALOUNG "Saloung"
IDS_WEIGHT_STONES "Kamieni"
IDS_WEIGHT_TAMLUNG "Tamlung"
diff --git a/base/applications/calc/lang/ro-RO.rc b/base/applications/calc/lang/ro-RO.rc
index 1680780befb..4c353ea9c0f 100644
--- a/base/applications/calc/lang/ro-RO.rc
+++ b/base/applications/calc/lang/ro-RO.rc
@@ -641,6 +641,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Zile"
IDS_TIME_HOURS "Ore"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Microsecunde"
IDS_TIME_MILLISECONDS "Milisecunde"
IDS_TIME_MINUTES "Minute"
diff --git a/base/applications/calc/lang/ru-RU.rc b/base/applications/calc/lang/ru-RU.rc
index 63b478b2f33..6d2d41c3612 100644
--- a/base/applications/calc/lang/ru-RU.rc
+++ b/base/applications/calc/lang/ru-RU.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "äĺíü"
IDS_TIME_HOURS "÷ŕń"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "ěčęđîńĺęóíäŕ"
IDS_TIME_MILLISECONDS "ěčëëčńĺęóíäŕ"
IDS_TIME_MINUTES "ěčíóňŕ"
diff --git a/base/applications/calc/lang/sk-SK.rc b/base/applications/calc/lang/sk-SK.rc
index 3f93b953ef0..4951a860320 100644
--- a/base/applications/calc/lang/sk-SK.rc
+++ b/base/applications/calc/lang/sk-SK.rc
@@ -647,6 +647,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Dni"
IDS_TIME_HOURS "Hodiny"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Mikrosekundy"
IDS_TIME_MILLISECONDS "Milisekundy"
IDS_TIME_MINUTES "Minúty"
diff --git a/base/applications/calc/lang/th-TH.rc b/base/applications/calc/lang/th-TH.rc
index 214bd80b185..ade4a12b17e 100644
--- a/base/applications/calc/lang/th-TH.rc
+++ b/base/applications/calc/lang/th-TH.rc
@@ -644,6 +644,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Days"
IDS_TIME_HOURS "Hours"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Microseconds"
IDS_TIME_MILLISECONDS "Milliseconds"
IDS_TIME_MINUTES "Minutes"
diff --git a/base/applications/calc/lang/uk-UA.rc b/base/applications/calc/lang/uk-UA.rc
index b4c7f19c933..9d73142142a 100644
--- a/base/applications/calc/lang/uk-UA.rc
+++ b/base/applications/calc/lang/uk-UA.rc
@@ -647,6 +647,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Äîáŕ"
IDS_TIME_HOURS "Ăîäčíŕ"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Ěłęđîńĺęóíäŕ"
IDS_TIME_MILLISECONDS "Ěłëłńĺęóíäŕ"
IDS_TIME_MINUTES "Őâčëčíŕ"
diff --git a/base/applications/calc/resource.h b/base/applications/calc/resource.h
index 1886cc74109..8039671361e 100644
--- a/base/applications/calc/resource.h
+++ b/base/applications/calc/resource.h
@@ -276,10 +276,11 @@
#define IDS_TIME_HOURS 3002
#define IDS_TIME_MICROSECONDS 3003
#define IDS_TIME_MILLISECONDS 3004
-#define IDS_TIME_MINUTES 3005
-#define IDS_TIME_SECONDS 3006
-#define IDS_TIME_WEEKS 3007
-#define IDS_TIME_YEARS 3008
+#define IDS_TIME_NANOSECONDS 3005
+#define IDS_TIME_MINUTES 3006
+#define IDS_TIME_SECONDS 3007
+#define IDS_TIME_WEEKS 3008
+#define IDS_TIME_YEARS 3009
/* TYPES OF VELOCITIES */
#define IDS_VELOCITY_CMS_SECOND 3100
diff --git a/base/applications/calc/utl.c b/base/applications/calc/utl.c
index 599115e9883..9ec8bebcc8f 100644
--- a/base/applications/calc/utl.c
+++ b/base/applications/calc/utl.c
@@ -2,7 +2,6 @@
void prepare_rpn_result_2(calc_number_t *rpn, TCHAR *buffer, int size, int base)
{
- TCHAR *ptr, *dst;
calc_number_t tmp;
int width;
@@ -21,9 +20,12 @@ void prepare_rpn_result_2(calc_number_t *rpn, TCHAR *buffer, int size, int base)
/* calculate the width of integer number */
width = (rpn->f==0) ? 1 : (int)log10(fabs(rpn->f))+1;
if (calc.sci_out == TRUE || width > MAX_LD_WIDTH || width < -MAX_LD_WIDTH)
- ptr = buffer + _stprintf(buffer, TEXT("%#e"), rpn->f);
+ _stprintf(buffer, TEXT("%#e"), rpn->f);
else {
+ TCHAR *ptr, *dst;
+
ptr = buffer + _stprintf(buffer, TEXT("%#*.*f"), width, ((MAX_LD_WIDTH-width-1)>=0) ? MAX_LD_WIDTH-width-1 : 0, rpn->f);
+ /* format sring ensures there is a '.': */
dst = _tcschr(buffer, TEXT('.'));
while (--ptr > dst)
if (*ptr != TEXT('0'))
diff --git a/base/applications/calc/winmain.c b/base/applications/calc/winmain.c
index 40a34682b62..6279d3d5091 100644
--- a/base/applications/calc/winmain.c
+++ b/base/applications/calc/winmain.c
@@ -861,18 +861,18 @@ static INT_PTR CALLBACK DlgStatProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
n = SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_GETCURSEL, 0, 0);
if (n == (DWORD)-1)
return TRUE;
- PostMessage(GetParent(hWnd), WM_LOAD_STAT, (WPARAM)n, 0);
+ PostMessage(GetParent(hWnd), WM_LOAD_STAT, (WPARAM)n, 0);
return TRUE;
case IDC_BUTTON_CD:
n = SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_GETCURSEL, 0, 0);
if (n == (DWORD)-1)
return TRUE;
- SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_DELETESTRING, (WPARAM)n, 0);
+ SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_DELETESTRING, (WPARAM)n, 0);
update_n_stats_items(hWnd, buffer);
delete_stat_item(n);
return TRUE;
case IDC_BUTTON_CAD:
- SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_RESETCONTENT, 0, 0);
+ SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_RESETCONTENT, 0, 0);
clean_stat_list();
update_n_stats_items(hWnd, buffer);
return TRUE;
@@ -910,20 +910,20 @@ static WPARAM idm_2_idc(int idm)
static void CopyMemToClipboard(void *ptr)
{
if(OpenClipboard(NULL)) {
- HGLOBAL clipbuffer;
- TCHAR *buffer;
+ HGLOBAL clipbuffer;
+ TCHAR *buffer;
- EmptyClipboard();
- clipbuffer = GlobalAlloc(GMEM_DDESHARE, (_tcslen(ptr)+1)*sizeof(TCHAR));
- buffer = (TCHAR *)GlobalLock(clipbuffer);
- _tcscpy(buffer, ptr);
- GlobalUnlock(clipbuffer);
+ EmptyClipboard();
+ clipbuffer = GlobalAlloc(GMEM_DDESHARE, (_tcslen(ptr)+1)*sizeof(TCHAR));
+ buffer = (TCHAR *)GlobalLock(clipbuffer);
+ _tcscpy(buffer, ptr);
+ GlobalUnlock(clipbuffer);
#ifdef UNICODE
- SetClipboardData(CF_UNICODETEXT,clipbuffer);
+ SetClipboardData(CF_UNICODETEXT,clipbuffer);
#else
- SetClipboardData(CF_TEXT,clipbuffer);
+ SetClipboardData(CF_TEXT,clipbuffer);
#endif
- CloseClipboard();
+ CloseClipboard();
}
}
@@ -942,16 +942,16 @@ static char *ReadClipboard(void)
char *buffer = NULL;
if (OpenClipboard(NULL)) {
- HANDLE hData = GetClipboardData(CF_TEXT);
+ HANDLE hData = GetClipboardData(CF_TEXT);
char *fromClipboard;
if (hData != NULL) {
fromClipboard = (char *)GlobalLock(hData);
if (strlen(fromClipboard))
- buffer = _strupr(_strdup(fromClipboard));
- GlobalUnlock( hData );
+ buffer = _strupr(_strdup(fromClipboard));
+ GlobalUnlock( hData );
}
- CloseClipboard();
+ CloseClipboard();
}
return buffer;
}
@@ -1110,20 +1110,20 @@ static void handle_context_menu(HWND hWnd, WPARAM wp, LPARAM lp)
{
TCHAR text[64];
HMENU hMenu = CreatePopupMenu();
- DWORD idm;
+ BOOL idm;
LoadString(calc.hInstance, IDS_QUICKHELP, text, SIZEOF(text));
AppendMenu(hMenu, MF_STRING | MF_ENABLED, IDM_HELP_HELP, text);
- idm = (DWORD)TrackPopupMenu(hMenu,
- TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON,
- LOWORD(lp),
- HIWORD(lp),
- 0,
- hWnd,
- NULL);
+ idm = TrackPopupMenu( hMenu,
+ TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON,
+ LOWORD(lp),
+ HIWORD(lp),
+ 0,
+ hWnd,
+ NULL);
DestroyMenu(hMenu);
#ifndef DISABLE_HTMLHELP_SUPPORT
- if (idm != 0) {
+ if (idm) {
HH_POPUP popup;
memset(&popup, 0, sizeof(popup));
@@ -1139,6 +1139,8 @@ static void handle_context_menu(HWND hWnd, WPARAM wp, LPARAM lp)
popup.idString = GetWindowLongPtr((HWND)wp, GWL_ID);
HtmlHelp((HWND)wp, HTMLHELP_PATH("/popups.txt"), HH_DISPLAY_TEXT_POPUP, (DWORD_PTR)&popup);
}
+#else
+ (void)idm;
#endif
}
diff --git a/base/applications/dxdiag/ddtest.c b/base/applications/dxdiag/ddtest.c
index 47f41a54ec0..734f166d9e5 100644
--- a/base/applications/dxdiag/ddtest.c
+++ b/base/applications/dxdiag/ddtest.c
@@ -151,7 +151,7 @@ BOOL DDPrimarySurfaceTest(HWND hWnd){
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
- if (msg.message == WM_TIMER && TimerID == msg.wParam)
+ if (msg.message == WM_TIMER && TimerID == msg.wParam)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
@@ -200,7 +200,7 @@ VOID DDRedrawFrame(LPDIRECTDRAWSURFACE lpDDSurface)
BOOL DDOffscreenBufferTest(HWND hWnd, BOOL Fullscreen){
- UINT TimerID, TimerIDUpdate;
+ UINT_PTR TimerID, TimerIDUpdate;
LPDIRECTDRAW lpDD;
LPDIRECTDRAWSURFACE lpDDPrimarySurface;
LPDIRECTDRAWSURFACE lpDDBackBuffer;
@@ -288,6 +288,7 @@ BOOL DDOffscreenBufferTest(HWND hWnd, BOOL Fullscreen){
/* set our timers, TimerID - for test timeout, TimerIDUpdate - for frame updating */
TimerID = SetTimer(hWnd, -1, (UINT)TEST_DURATION, NULL);
TimerIDUpdate = SetTimer(hWnd, 2, (UINT)10, NULL);
+ (void)TimerIDUpdate;
while (TRUE)
{
diff --git a/base/applications/dxdiag/input.c b/base/applications/dxdiag/input.c
index 08bb2b718b8..03d238a57ce 100644
--- a/base/applications/dxdiag/input.c
+++ b/base/applications/dxdiag/input.c
@@ -129,13 +129,13 @@ BOOL CALLBACK DirectInputEnumDevCb(
ZeroMemory(&GuidPath, sizeof(DIPROPGUIDANDPATH));
GuidPath.diph.dwSize = sizeof(DIPROPGUIDANDPATH);
GuidPath.diph.dwHeaderSize = sizeof(DIPROPHEADER);
- GuidPath.diph.dwHow = DIPH_DEVICE;
+ GuidPath.diph.dwHow = DIPH_DEVICE;
hResult = pDev->lpVtbl->GetProperty(pDev, DIPROP_GUIDANDPATH, (LPDIPROPHEADER)&GuidPath);
ZeroMemory(&TypeName, sizeof(TypeName));
TypeName.diph.dwSize = sizeof(TypeName);
TypeName.diph.dwHeaderSize = sizeof(DIPROPHEADER);
- TypeName.diph.dwHow = DIPH_DEVICE;
+ TypeName.diph.dwHow = DIPH_DEVICE;
hResult = pDev->lpVtbl->GetProperty(pDev, DIPROP_GETPORTDISPLAYNAME, (LPDIPROPHEADER)&TypeName);
@@ -191,7 +191,7 @@ InitializeDirectInputDialog(HWND hwndDlg)
Context.pObj = pObj;
Context.hwndDlg = hwndDlg;
InitListViewColumns(&Context);
- hResult = pObj->lpVtbl->EnumDevices(pObj, DI8DEVCLASS_ALL, DirectInputEnumDevCb, (PVOID)&Context, DIEDFL_ALLDEVICES);
+ pObj->lpVtbl->EnumDevices(pObj, DI8DEVCLASS_ALL, DirectInputEnumDevCb, (PVOID)&Context, DIEDFL_ALLDEVICES);
pObj->lpVtbl->Release(pObj);
}
diff --git a/base/applications/dxdiag/network.c b/base/applications/dxdiag/network.c
index 5154c4eef87..3a4b7c666f2 100644
--- a/base/applications/dxdiag/network.c
+++ b/base/applications/dxdiag/network.c
@@ -178,10 +178,10 @@ EnumerateServiceProviders(HKEY hKey, HWND hDlgCtrl, DIRECTPLAY_GUID * PreDefProv
{
DWORD dwIndex = 0;
LONG result;
- WCHAR szName[50];
+ WCHAR szName[50];
WCHAR szGUID[40];
WCHAR szTemp[63];
- WCHAR szResult[MAX_PATH+20] = {0};
+ WCHAR szResult[MAX_PATH+20] = {0};
DWORD RegProviders = 0;
DWORD ProviderIndex;
DWORD dwName;
@@ -203,13 +203,12 @@ EnumerateServiceProviders(HKEY hKey, HWND hDlgCtrl, DIRECTPLAY_GUID * PreDefProv
szResult[0] = L'\0';
LoadStringW(hInst, PreDefProviders[dwIndex].ResourceID, szResult, sizeof(szResult)/sizeof(WCHAR));
szResult[(sizeof(szResult)/sizeof(WCHAR))-1] = L'\0';
- lResult = SendMessageW(hDlgCtrl, LVM_INSERTITEM, 0, (LPARAM)&Item);
+ Item.iItem = SendMessageW(hDlgCtrl, LVM_INSERTITEM, 0, (LPARAM)&Item);
+ Item.iSubItem = 1;
szResult[0] = L'\0';
LoadStringW(hInst, IDS_REG_FAIL, szResult, sizeof(szResult)/sizeof(WCHAR));
szResult[(sizeof(szResult)/sizeof(WCHAR))-1] = L'\0';
- Item.iItem = lResult;
- Item.iSubItem = 1;
- lResult = SendMessageW(hDlgCtrl, LVM_SETITEM, 0, (LPARAM)&Item);
+ SendMessageW(hDlgCtrl, LVM_SETITEM, 0, (LPARAM)&Item);
}
dwIndex = 0;
@@ -228,8 +227,7 @@ EnumerateServiceProviders(HKEY hKey, HWND hDlgCtrl, DIRECTPLAY_GUID * PreDefProv
if (ProviderIndex == UINT_MAX)
{
/* a custom service provider was found */
- lResult = ListView_GetItemCount(hDlgCtrl);
- Item.iItem = lResult;
+ Item.iItem = ListView_GetItemCount(hDlgCtrl);
/* FIXME
* on Windows Vista we need to use RegLoadMUIString which is not available for older systems
@@ -291,7 +289,7 @@ EnumerateServiceProviders(HKEY hKey, HWND hDlgCtrl, DIRECTPLAY_GUID * PreDefProv
}
}
dwIndex++;
- }while(result != ERROR_NO_MORE_ITEMS);
+ }while(result != ERROR_NO_MORE_ITEMS);
/* check if all providers have been registered */
// if (RegProviders == 15)
@@ -330,7 +328,7 @@ InitializeDirectPlayDialog(HWND hwndDlg)
return;
/* enumerate providers */
- result = EnumerateServiceProviders(hKey, hDlgCtrl, DirectPlaySP);
+ EnumerateServiceProviders(hKey, hDlgCtrl, DirectPlaySP);
RegCloseKey(hKey);
}
diff --git a/base/applications/dxdiag/sound.c b/base/applications/dxdiag/sound.c
index 6db11c66540..4a84c9c6342 100644
--- a/base/applications/dxdiag/sound.c
+++ b/base/applications/dxdiag/sound.c
@@ -275,6 +275,7 @@ void InitializeDirectSoundPage(PDXDIAG_CONTEXT pContext)
/* release the DSound object */
// pObj->lpVtbl->Release(pObj);
+ (void)hResult;
}
diff --git a/base/applications/fontview/display.c b/base/applications/fontview/display.c
index 1362e4a822a..55272eec754 100644
--- a/base/applications/fontview/display.c
+++ b/base/applications/fontview/display.c
@@ -103,7 +103,7 @@ Display_DrawText(HDC hDC, DISPLAYDATA* pData, int nYPos)
/* TODO: Output font info */
/* Output Character set */
- hOldFont = SelectObject(hDC, pData->hCharSetFont);
+ SelectObject(hDC, pData->hCharSetFont);
GetTextMetrics(hDC, &tm);
swprintf(szCaption, L"abcdefghijklmnopqrstuvwxyz");
TextOutW(hDC, 0, y, szCaption, wcslen(szCaption));
diff --git a/base/applications/fontview/fontview.c b/base/applications/fontview/fontview.c
index 82fa44aff6a..72b183212ba 100644
--- a/base/applications/fontview/fontview.c
+++ b/base/applications/fontview/fontview.c
@@ -60,13 +60,10 @@ FormatString(
static void
ErrorMsgBox(HWND hParent, DWORD dwCaptionID, DWORD dwMessageId, ...)
{
- HMODULE hModule;
HLOCAL hMemCaption = NULL;
HLOCAL hMemText = NULL;
va_list args;
- hModule = GetModuleHandle(NULL);
-
va_start(args, dwMessageId);
FormatString(FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, dwMessageId, 0, (LPWSTR)&hMemText, 0, &args);
diff --git a/base/applications/games/winemine/lang/cs-CZ.rc b/base/applications/games/winemine/lang/cs-CZ.rc
index 3f281c7b317..bd776bafc40 100644
--- a/base/applications/games/winemine/lang/cs-CZ.rc
+++ b/base/applications/games/winemine/lang/cs-CZ.rc
@@ -1,8 +1,8 @@
/* FILE: applications/games/winemine/lang/cs-CZ.rc
* PURPOSE: Czech Language File
- * TRANSLATOR: Stepan Gabriel - SGABA (sgaba@centrum.cz)
+ * TRANSLATORS: Stepan Gabriel - SGABA (sgaba@centrum.cz); Radek Liska aka Black_Fox (radekliska at gmail dot com)
* TRANSLATED FROM: Slovak translation by Kario (kario@szm.sk)
- * UPDATED: 2008-07-06
+ * UPDATED: 2010-05-25
*
* Czech translation
* Copyleft 2007 Kario (kario@szm.sk),2008 SGABA (sgaba@centrum.cz)
@@ -15,7 +15,7 @@ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
STRINGTABLE
BEGIN
IDS_SECONDS, "sek."
- IDS_NOBODY, "Nikdo" //windows = Anonym
+ IDS_NOBODY, "Bezejmenný" //windows = Anonym
IDS_ABOUT, "od Joshua Thielena a vývojářů systému ReactOS"
END
@@ -36,15 +36,15 @@ BEGIN
MENUITEM SEPARATOR
MENUITEM "&Konec", IDM_EXIT
END
- POPUP "&Info" //windows = &Pomocník
+ POPUP "&Nápověda" //windows = &Pomocník
BEGIN
- MENUITEM "C&o je hra Miny...", IDM_ABOUT
+ MENUITEM "&O programu...", IDM_ABOUT
END
END
IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75
STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT
-CAPTION "Nejrychlejší htedači min"
+CAPTION "Nejrychlejší hledači min"
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Nejlepší časy", IDNONE, 10, 10, 182, 45
@@ -66,7 +66,7 @@ STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHEL
CAPTION "Blahopřeji!"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Zadejte prosím svoje jméno.", IDIGNORE, 25, 10, 150, 10
+ LTEXT "Zadejte prosím svoje jméno", IDIGNORE, 25, 10, 150, 10
EDITTEXT IDC_EDITNAME, 25, 20, 110, 12
DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15
END
@@ -83,5 +83,5 @@ BEGIN
EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER
EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER
DEFPUSHBUTTON "OK", IDOK, 86, 32, 45, 15
- PUSHBUTTON "Zrušit", IDCANCEL, 86, 52, 45, 15
+ PUSHBUTTON "Storno", IDCANCEL, 86, 52, 45, 15
END
diff --git a/base/applications/kbswitch/kbswitch.c b/base/applications/kbswitch/kbswitch.c
index 5c94c25f79a..03f196f7771 100644
--- a/base/applications/kbswitch/kbswitch.c
+++ b/base/applications/kbswitch/kbswitch.c
@@ -33,7 +33,6 @@ CreateTrayIcon(LPTSTR szLCID)
HDC hdc, hdcsrc;
HBITMAP hBitmap, hBmpNew, hBmpOld;
RECT rect;
- DWORD bkColor, bkText;
HFONT hFontOld, hFont = NULL;
ICONINFO IconInfo;
HICON hIcon = NULL;
@@ -63,8 +62,8 @@ CreateTrayIcon(LPTSTR szLCID)
rect.bottom = 16;
rect.top = 0;
- bkColor = SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
- bkText = SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
+ SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
+ SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
ExtTextOut(hdc, rect.left, rect.top, ETO_OPAQUE, &rect, _T(""), 0, NULL);
diff --git a/base/applications/magnify/magnifier.c b/base/applications/magnify/magnifier.c
index 43816d6b5aa..4c2b4f623e9 100644
--- a/base/applications/magnify/magnifier.c
+++ b/base/applications/magnify/magnifier.c
@@ -295,7 +295,7 @@ void Draw(HDC aDc)
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
- int wmId, wmEvent;
+ int wmId;
switch (message)
{
@@ -354,7 +354,6 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
diff --git a/base/applications/mplay32/mplay32.c b/base/applications/mplay32/mplay32.c
index 9b1b564908a..f4bd117a65f 100644
--- a/base/applications/mplay32/mplay32.c
+++ b/base/applications/mplay32/mplay32.c
@@ -407,7 +407,7 @@ PlayFile(HWND hwnd, LPTSTR lpFileName)
MCI_PLAY_PARMS mciPlay;
TCHAR szLocalFileName[MAX_PATH];
UINT FileType;
- DWORD dwError;
+ MCIERROR mciError;
if (lpFileName == NULL)
{
@@ -449,14 +449,14 @@ PlayFile(HWND hwnd, LPTSTR lpFileName)
SetTimer(hwnd, IDT_PLAYTIMER, 100, (TIMERPROC) PlayTimerProc);
- dwError = mciSendCommand(wDeviceId, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START, 0);
+ mciSendCommand(wDeviceId, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START, 0);
mciPlay.dwCallback = (DWORD_PTR)hwnd;
mciPlay.dwFrom = 0;
mciPlay.dwTo = MaxFilePos;
- dwError = mciSendCommand(wDeviceId, MCI_PLAY, MCI_NOTIFY | MCI_FROM | MCI_TO, (DWORD_PTR)&mciPlay);
- if (dwError != 0)
+ mciError = mciSendCommand(wDeviceId, MCI_PLAY, MCI_NOTIFY | MCI_FROM | MCI_TO, (DWORD_PTR)&mciPlay);
+ if (mciError != 0)
{
MessageBox(hwnd, _T("Can't play!"), NULL, MB_OK);
}
@@ -641,12 +641,12 @@ MainWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
break;
case IDM_ABOUT:
- {
+ {
HICON mplayIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN));
ShellAbout(hwnd, szAppTitle, 0, mplayIcon);
- DeleteObject(mplayIcon);
+ DeleteObject(mplayIcon);
break;
- }
+ }
case IDM_EXIT:
PostMessage(hwnd, WM_CLOSE, 0, 0);
return 0;
diff --git a/base/applications/msconfig/freeldrpage.h b/base/applications/msconfig/freeldrpage.h
index 6e0331b2a4f..23b046b1849 100644
--- a/base/applications/msconfig/freeldrpage.h
+++ b/base/applications/msconfig/freeldrpage.h
@@ -1,3 +1,8 @@
+#ifndef _FREELDRPAGE_H_
+#define _FREELDRPAGE_H_
+
extern HWND hFreeLdrPage;
INT_PTR CALLBACK FreeLdrPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+
+#endif
diff --git a/base/applications/msconfig/generalpage.h b/base/applications/msconfig/generalpage.h
index 408c4049dc1..19551866bc4 100644
--- a/base/applications/msconfig/generalpage.h
+++ b/base/applications/msconfig/generalpage.h
@@ -1,3 +1,8 @@
+#ifndef _GENERALPAGE_H_
+#define _GENERALPAGE_H_
+
extern HWND hGeneralPage;
INT_PTR CALLBACK GeneralPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+
+#endif
diff --git a/base/applications/msconfig/srvpage.h b/base/applications/msconfig/srvpage.h
index 89c8f3e6112..db51a1b2258 100644
--- a/base/applications/msconfig/srvpage.h
+++ b/base/applications/msconfig/srvpage.h
@@ -1,4 +1,9 @@
+#ifndef _SVRPAGE_H_
+#define _SVRPAGE_H_
+
extern HWND hServicesPage;
extern HWND hServicesListCtrl;
INT_PTR CALLBACK ServicesPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+
+#endif
diff --git a/base/applications/msconfig/startuppage.h b/base/applications/msconfig/startuppage.h
index 9ac644081f0..a016fb320fb 100644
--- a/base/applications/msconfig/startuppage.h
+++ b/base/applications/msconfig/startuppage.h
@@ -1,4 +1,9 @@
+#ifndef _STARTUPPAGE_H_
+#define _STARTUPPAGE_H_
+
extern HWND hStartupPage;
extern HWND hStartupPageListCtrl;
INT_PTR CALLBACK StartupPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+
+#endif
diff --git a/base/applications/msconfig/systempage.h b/base/applications/msconfig/systempage.h
index d928c77389c..1aa9dcafe8b 100644
--- a/base/applications/msconfig/systempage.h
+++ b/base/applications/msconfig/systempage.h
@@ -1,3 +1,8 @@
+#ifndef _SYSTEMPAGE_H_
+#define _SYSTEMPAGE_H_
+
extern HWND hSystemPage;
INT_PTR CALLBACK SystemPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+
+#endif
diff --git a/base/applications/msconfig/toolspage.h b/base/applications/msconfig/toolspage.h
index daa938fec80..4ec159358bf 100644
--- a/base/applications/msconfig/toolspage.h
+++ b/base/applications/msconfig/toolspage.h
@@ -1,5 +1,9 @@
+#ifndef _TOOLSPAGE_H_
+#define _TOOLSPAGE_H_
+
extern HWND hToolsPage;
extern HWND hToolsListCtrl;
INT_PTR CALLBACK ToolsPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+#endif
diff --git a/base/applications/mscutils/eventvwr/eventvwr.c b/base/applications/mscutils/eventvwr/eventvwr.c
index dbe44a8b913..011c0ec5da6 100644
--- a/base/applications/mscutils/eventvwr/eventvwr.c
+++ b/base/applications/mscutils/eventvwr/eventvwr.c
@@ -506,7 +506,6 @@ QueryEventMessages(LPWSTR lpMachineName,
DWORD dwRead, dwNeeded, dwThisRecord, dwTotalRecords = 0, dwCurrentRecord = 1, dwRecordsToRead = 0, dwFlags;
LPWSTR lpSourceName;
LPWSTR lpComputerName;
- LPWSTR lpEventStr;
LPWSTR lpData;
BOOL bResult = TRUE; /* Read succeeded. */
@@ -609,9 +608,6 @@ QueryEventMessages(LPWSTR lpMachineName,
// This ist the data section of the current event
lpData = (LPWSTR)((LPBYTE)pevlr + pevlr->DataOffset);
- // This is the text of the current event
- lpEventStr = (LPWSTR)((LPBYTE)pevlr + pevlr->StringOffset);
-
// Compute the event type
EventTimeToSystemTime(pevlr->TimeWritten, &time);
diff --git a/base/applications/network/arp/arp.c b/base/applications/network/arp/arp.c
index 539d6cf98d7..3014b5823e0 100644
--- a/base/applications/network/arp/arp.c
+++ b/base/applications/network/arp/arp.c
@@ -170,9 +170,7 @@ INT DisplayArpEntries(PTCHAR pszInetAddr, PTCHAR pszIfAddr)
ZeroMemory(pIpNetTable, sizeof(*pIpNetTable));
- iRet = GetIpNetTable(pIpNetTable, &Size, TRUE);
-
- if (iRet != NO_ERROR)
+ if (GetIpNetTable(pIpNetTable, &Size, TRUE) != NO_ERROR)
{
_tprintf(_T("failed to allocate memory for GetIpNetTable\n"));
DoFormatMessage();
@@ -201,9 +199,7 @@ INT DisplayArpEntries(PTCHAR pszInetAddr, PTCHAR pszIfAddr)
ZeroMemory(pIpAddrTable, sizeof(*pIpAddrTable));
- iRet = GetIpAddrTable(pIpAddrTable, &Size, TRUE);
-
- if (iRet != NO_ERROR)
+ if ((iRet = GetIpAddrTable(pIpAddrTable, &Size, TRUE)) != NO_ERROR)
{
_tprintf(_T("GetIpAddrTable failed: %d\n"), iRet);
DoFormatMessage();
@@ -272,7 +268,7 @@ INT Addhost(PTCHAR pszInetAddr, PTCHAR pszEthAddr, PTCHAR pszIfAddr)
PMIB_IPNETTABLE pIpNetTable = NULL;
DWORD dwIpAddr = 0;
ULONG Size = 0;
- INT iRet, i, val, c;
+ INT i, val, c;
/* error checking */
@@ -320,9 +316,7 @@ INT Addhost(PTCHAR pszInetAddr, PTCHAR pszEthAddr, PTCHAR pszIfAddr)
ZeroMemory(pIpNetTable, sizeof(*pIpNetTable));
- iRet = GetIpNetTable(pIpNetTable, &Size, TRUE);
-
- if (iRet != NO_ERROR)
+ if (GetIpNetTable(pIpNetTable, &Size, TRUE) != NO_ERROR)
{
_tprintf(_T("failed to allocate memory for GetIpNetTable\n"));
DoFormatMessage();
@@ -382,7 +376,7 @@ INT Addhost(PTCHAR pszInetAddr, PTCHAR pszEthAddr, PTCHAR pszIfAddr)
/* Add the ARP entry */
- if ((iRet = SetIpNetEntry(pAddHost)) != NO_ERROR)
+ if (SetIpNetEntry(pAddHost) != NO_ERROR)
{
DoFormatMessage();
goto cleanup;
@@ -415,7 +409,6 @@ INT Deletehost(PTCHAR pszInetAddr, PTCHAR pszIfAddr)
PMIB_IPNETTABLE pIpNetTable = NULL;
ULONG Size = 0;
DWORD dwIpAddr = 0;
- INT iRet;
BOOL bFlushTable = FALSE;
/* error checking */
@@ -449,9 +442,7 @@ INT Deletehost(PTCHAR pszInetAddr, PTCHAR pszIfAddr)
ZeroMemory(pIpNetTable, sizeof(*pIpNetTable));
- iRet = GetIpNetTable(pIpNetTable, &Size, TRUE);
-
- if (iRet != NO_ERROR)
+ if (GetIpNetTable(pIpNetTable, &Size, TRUE) != NO_ERROR)
{
_tprintf(_T("failed to allocate memory for GetIpNetTable\n"));
DoFormatMessage();
@@ -485,7 +476,7 @@ INT Deletehost(PTCHAR pszInetAddr, PTCHAR pszIfAddr)
if (bFlushTable == TRUE)
{
/* delete arp cache */
- if ((iRet = FlushIpNetTable(pDelHost->dwIndex)) != NO_ERROR)
+ if (FlushIpNetTable(pDelHost->dwIndex) != NO_ERROR)
{
DoFormatMessage();
goto cleanup;
@@ -501,7 +492,7 @@ INT Deletehost(PTCHAR pszInetAddr, PTCHAR pszIfAddr)
pDelHost->dwAddr = dwIpAddr;
/* Add the ARP entry */
- if ((iRet = DeleteIpNetEntry(pDelHost)) != NO_ERROR)
+ if (DeleteIpNetEntry(pDelHost) != NO_ERROR)
{
DoFormatMessage();
goto cleanup;
diff --git a/base/applications/network/ftp/fake.c b/base/applications/network/ftp/fake.c
index f8d0c8cdadf..a00f30560be 100644
--- a/base/applications/network/ftp/fake.c
+++ b/base/applications/network/ftp/fake.c
@@ -29,10 +29,10 @@ int checkRecv(SOCKET s)
void blkfree(char **av0)
{
- register char **av = av0;
+ register char **av = av0;
- while (*av)
- free(*av++);
+ while (*av)
+ free(*av++);
}
char **glob(register char *v)
@@ -52,16 +52,16 @@ int herror(char *string)
#if 0
int gettimeofday(struct timeval *timenow,
- struct timezone *zone)
+ struct timezone *zone)
{
- time_t t;
+ time_t t;
- t = clock();
+ t = clock();
- timenow->tv_usec = t;
- timenow->tv_sec = t / CLK_TCK;
+ timenow->tv_usec = t;
+ timenow->tv_sec = t / CLK_TCK;
- return 0;
+ return 0;
}
int fgetcSocket(int s)
@@ -100,13 +100,13 @@ int fgetcSocket(int s)
total = recv(s, buffer, sizeof(buffer), 0);
if (total == SOCKET_ERROR)
- {
- total = 0;
- return ERROR;
- }
+ {
+ total = 0;
+ return ERROR;
+ }
if (total == 0)
- return EOF;
+ return EOF;
}
return buffer[index++];
}
@@ -142,29 +142,29 @@ int fputcSocket(int s, char putChar)
buffer[1] = '\0';
if(SOCKET_ERROR==send(s, buffer, 1, 0)) {
- int iret=WSAGetLastError ();
- fprintf(stdout,"fputcSocket: %d\n",iret);
- return 0;
+ int iret=WSAGetLastError ();
+ fprintf(stdout,"fputcSocket: %d\n",iret);
+ return 0;
}
else {
- return putChar;
+ return putChar;
}
}
int fputSocket(int s, char *buffer, int len)
{
- int iret;
- while(len) {
- if(SOCKET_ERROR==(iret=send(s, buffer, len, 0)))
- {
- iret=WSAGetLastError ();
- fprintf(stdout,"fputcSocket: %d\n",iret);
- return 0;
- }
- else {
- return len-=iret;
- }
- }
- return 0;
+ int iret;
+ while(len) {
+ if(SOCKET_ERROR==(iret=send(s, buffer, len, 0)))
+ {
+ iret=WSAGetLastError ();
+ fprintf(stdout,"fputcSocket: %d\n",iret);
+ return 0;
+ }
+ else {
+ return len-=iret;
+ }
+ }
+ return 0;
}
char *fgetsSocket(int s, char *string)
@@ -180,31 +180,31 @@ char *fgetsSocket(int s, char *string)
if (count == SOCKET_ERROR)
{
- printf("Error in fgetssocket");
- return NULL;
+ printf("Error in fgetssocket");
+ return NULL;
}
if (count == 1)
{
- string[i] = buffer[0];
+ string[i] = buffer[0];
- if (i == MAX_ASCII - 3)
- {
- count = 0;
- string[++i] = '\n';
- string[++i] = '\0';
- }
+ if (i == MAX_ASCII - 3)
+ {
+ count = 0;
+ string[++i] = '\n';
+ string[++i] = '\0';
+ }
}
else
{
- if (i == 0)
- return NULL;
- else
- {
- string[i] = '\n';
- string[i + 1] = '\0'; // This is risky
- return string;
- }
+ if (i == 0)
+ return NULL;
+ else
+ {
+ string[i] = '\n';
+ string[i + 1] = '\0'; // This is risky
+ return string;
+ }
}
@@ -250,44 +250,44 @@ char *getpass (const char * prompt)
int rc;
if (istty)
- {
- if (GetConsoleMode (in, &old_flags))
- SetConsoleMode (in, ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT);
- else
- istty = 0;
- }
+ {
+ if (GetConsoleMode (in, &old_flags))
+ SetConsoleMode (in, ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT);
+ else
+ istty = 0;
+ }
/* Need to read line one byte at time to avoid blocking, if not a
tty, so always do it this way. */
count = 0;
while (1)
- {
- DWORD dummy;
- char one_char;
+ {
+ DWORD dummy;
+ char one_char;
- rc = ReadFile (in, &one_char, 1, &dummy, NULL);
- if (rc == 0)
- break;
- if (one_char == '\r')
- {
- /* CR is always followed by LF if reading from tty. */
- if (istty)
- continue;
- else
- break;
- }
- if (one_char == '\n')
- break;
- /* Silently truncate password string if overly long. */
- if (count < sizeof (input) - 1)
- input[count++] = one_char;
- }
+ rc = ReadFile (in, &one_char, 1, &dummy, NULL);
+ if (rc == 0)
+ break;
+ if (one_char == '\r')
+ {
+ /* CR is always followed by LF if reading from tty. */
+ if (istty)
+ continue;
+ else
+ break;
+ }
+ if (one_char == '\n')
+ break;
+ /* Silently truncate password string if overly long. */
+ if (count < sizeof (input) - 1)
+ input[count++] = one_char;
+ }
input[count] = '\0';
WriteFile (err, "\r\n", 2, &count, NULL);
if (istty)
- SetConsoleMode (in, old_flags);
+ SetConsoleMode (in, old_flags);
if (rc)
- return input;
+ return input;
}
return NULL;
diff --git a/base/applications/network/ftp/ftp.c b/base/applications/network/ftp/ftp.c
index 2b09522fb51..5fdc81ce9fa 100644
--- a/base/applications/network/ftp/ftp.c
+++ b/base/applications/network/ftp/ftp.c
@@ -345,7 +345,7 @@ getreply(expecteof)
cp = reply_string;
while ((c = fgetcSocket(cin)) != '\n') {
if (c == IAC) { /* handle telnet commands */
- switch (c = fgetcSocket(cin)) {
+ switch (fgetcSocket(cin)) {
case WILL:
case WONT:
c = fgetcSocket(cin);
@@ -745,7 +745,7 @@ void recvrequest(const char *cmd, const char *local, const char *remote, const c
long bytes = 0, hashbytes = HASHBYTES;
// struct
fd_set mask;
- register int c, d;
+ register int c;
struct timeval start, stop;
// struct stat st;
@@ -781,6 +781,7 @@ null();// (void) signal(SIGINT, oldintr);
null();// oldintr = signal(SIGINT, abortrecv);
if (strcmp(local, "-") && *local != '|') {
#ifndef _WIN32
+ register int d;
// This whole thing is a problem... access Won't work on non-existent files
if (access(local, 2) < 0) {
char *dir = rindex(local, '/');
@@ -919,7 +920,7 @@ null();// oldintp = signal(SIGPIPE, SIG_IGN);
(*closefunc)(fout);
return;
}
- errno = d = 0;
+ errno = 0;
// while ((c = recv(din, buf, bufsize, 1)) > 0) {
// if ((d = write(fileno(fout), buf, c)) != c)
// if ((d = write(fileno(fout), buf, c)) != c)
@@ -1106,10 +1107,10 @@ null();// (void) signal(SIGINT,oldintr);
lostpeer();
}
if (din && FD_ISSET(din, &mask)) {
- while ((c = recv(din, buf, bufsize, 0)) > 0)
+ while (recv(din, buf, bufsize, 0) > 0)
;
}
- if ((c = getreply(0)) == ERROR && code == 552) { /* needed for nic style abort */
+ if (getreply(0) == ERROR && code == 552) { /* needed for nic style abort */
if (data >= 0) {
(void) close(data);
data = -1;
diff --git a/base/applications/network/ftp/ftp.rbuild b/base/applications/network/ftp/ftp.rbuild
index fce05853523..60f7ea5c659 100644
--- a/base/applications/network/ftp/ftp.rbuild
+++ b/base/applications/network/ftp/ftp.rbuild
@@ -4,6 +4,17 @@
.
+
+ _chdir
+ _getcwd
+ _mktemp
+ _unlink
+ _close
+ _fileno
+ _read
+ _write
+ _lseek
+
ws2_32
iphlpapi
oldnames
diff --git a/base/applications/network/nslookup/nslookup.c b/base/applications/network/nslookup/nslookup.c
index 993ab04a650..3e7ce484fd9 100644
--- a/base/applications/network/nslookup/nslookup.c
+++ b/base/applications/network/nslookup/nslookup.c
@@ -90,11 +90,7 @@ BOOL PerformInternalLookup( PCHAR pAddr, PCHAR pResult )
BOOL bOk = FALSE;
/* Makes things easier when parsing the response packet. */
- UCHAR Header1, Header2;
USHORT NumQuestions;
- USHORT NumAnswers;
- USHORT NumAuthority;
- USHORT NumAdditional;
USHORT Type;
if( (strlen( pAddr ) + 1) > 255 ) return FALSE;
@@ -198,12 +194,7 @@ BOOL PerformInternalLookup( PCHAR pAddr, PCHAR pResult )
if( !bOk ) goto cleanup;
/* Start parsing the received packet. */
- Header1 = RecBuffer[2];
- Header2 = RecBuffer[3];
NumQuestions = ntohs( ((PSHORT)&RecBuffer[4])[0] );
- NumAnswers = ntohs( ((PSHORT)&RecBuffer[6])[0] );
- NumAuthority = ntohs( ((PUSHORT)&RecBuffer[8])[0] );
- NumAdditional = ntohs( ((PUSHORT)&RecBuffer[10])[0] );
k = 12;
@@ -257,11 +248,10 @@ void PerformLookup( PCHAR pAddr )
BOOL bOk = FALSE;
/* Makes things easier when parsing the response packet. */
- UCHAR Header1, Header2;
+ UCHAR Header2;
USHORT NumQuestions;
USHORT NumAnswers;
USHORT NumAuthority;
- USHORT NumAdditional;
USHORT Type;
if( (strlen( pAddr ) + 1) > 255 ) return;
@@ -368,19 +358,17 @@ void PerformLookup( PCHAR pAddr )
((PSHORT)&Buffer[i])[0] = htons( ClassNametoClassID( State.Class ) );
/* Ship off the request to the DNS server. */
- bOk = SendRequest( Buffer,
+ bOk = SendRequest( Buffer,
BufferLength,
RecBuffer,
&RecBufferLength );
if( !bOk ) goto cleanup;
/* Start parsing the received packet. */
- Header1 = RecBuffer[2];
Header2 = RecBuffer[3];
NumQuestions = ntohs( ((PSHORT)&RecBuffer[4])[0] );
NumAnswers = ntohs( ((PSHORT)&RecBuffer[6])[0] );
NumAuthority = ntohs( ((PUSHORT)&RecBuffer[8])[0] );
- NumAdditional = ntohs( ((PUSHORT)&RecBuffer[10])[0] );
Type = 0;
/* Check the RCODE for failure. */
diff --git a/base/applications/notepad/dialog.c b/base/applications/notepad/dialog.c
index 937dd5807de..d8c6adc04e6 100644
--- a/base/applications/notepad/dialog.c
+++ b/base/applications/notepad/dialog.c
@@ -400,7 +400,6 @@ static UINT_PTR CALLBACK DIALOG_FileSaveAs_Hook(HWND hDlg, UINT msg, WPARAM wPar
{
TCHAR szText[128];
HWND hCombo;
- OFNOTIFY *pNotify;
UNREFERENCED_PARAMETER(wParam);
@@ -440,15 +439,13 @@ static UINT_PTR CALLBACK DIALOG_FileSaveAs_Hook(HWND hDlg, UINT msg, WPARAM wPar
case WM_NOTIFY:
if (((NMHDR *) lParam)->code == CDN_FILEOK)
{
- pNotify = (OFNOTIFY *) lParam;
-
hCombo = GetDlgItem(hDlg, ID_ENCODING);
- if (hCombo)
- Globals.iEncoding = (int) SendMessage(hCombo, CB_GETCURSEL, 0, 0);
+ if (hCombo)
+ Globals.iEncoding = (int) SendMessage(hCombo, CB_GETCURSEL, 0, 0);
hCombo = GetDlgItem(hDlg, ID_EOLN);
- if (hCombo)
- Globals.iEoln = (int) SendMessage(hCombo, CB_GETCURSEL, 0, 0);
+ if (hCombo)
+ Globals.iEoln = (int) SendMessage(hCombo, CB_GETCURSEL, 0, 0);
}
break;
}
@@ -808,11 +805,11 @@ static INT_PTR CALLBACK DIALOG_GoTo_DialogProc(HWND hwndDialog, UINT uMsg, WPARA
TCHAR szText[32];
switch(uMsg) {
- case WM_INITDIALOG:
+ case WM_INITDIALOG:
hTextBox = GetDlgItem(hwndDialog, ID_LINENUMBER);
- _sntprintf(szText, SIZEOF(szText), _T("%d"), lParam);
+ _sntprintf(szText, SIZEOF(szText), _T("%d"), lParam);
SetWindowText(hTextBox, szText);
- break;
+ break;
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED)
{
@@ -823,11 +820,11 @@ static INT_PTR CALLBACK DIALOG_GoTo_DialogProc(HWND hwndDialog, UINT uMsg, WPARA
EndDialog(hwndDialog, _ttoi(szText));
bResult = TRUE;
}
- else if (LOWORD(wParam) == IDCANCEL)
- {
+ else if (LOWORD(wParam) == IDCANCEL)
+ {
EndDialog(hwndDialog, 0);
bResult = TRUE;
- }
+ }
}
break;
}
@@ -862,7 +859,7 @@ VOID DIALOG_GoTo(VOID)
Globals.hMainWnd, DIALOG_GoTo_DialogProc, nLine);
if (nLine >= 1)
- {
+ {
for (i = 0; pszText[i] && (nLine > 1) && (i < nLength - 1); i++)
{
if (pszText[i] == '\n')
@@ -870,8 +867,8 @@ VOID DIALOG_GoTo(VOID)
}
SendMessage(Globals.hEdit, EM_SETSEL, i, i);
SendMessage(Globals.hEdit, EM_SCROLLCARET, 0, 0);
- }
- HeapFree(GetProcessHeap(), 0, pszText);
+ }
+ HeapFree(GetProcessHeap(), 0, pszText);
}
VOID DIALOG_StatusBarUpdateCaretPos(VOID)
diff --git a/base/applications/notepad/lang/cs-CZ.rc b/base/applications/notepad/lang/cs-CZ.rc
index e0be8ba66bb..d6dfcd25859 100644
--- a/base/applications/notepad/lang/cs-CZ.rc
+++ b/base/applications/notepad/lang/cs-CZ.rc
@@ -85,12 +85,12 @@ BEGIN
END
POPUP "&Nápověda"
BEGIN
- MENUITEM "&Obsah", CMD_HELP_CONTENTS
+ MENUITEM "O&bsah", CMD_HELP_CONTENTS
MENUITEM "&Najít...", CMD_HELP_SEARCH
- MENUITEM "&Pomoc k nápovědě", CMD_HELP_ON_HELP
+ MENUITEM "Pomoc k ná&povědě", CMD_HELP_ON_HELP
MENUITEM SEPARATOR
- MENUITEM "&O programu" CMD_ABOUT
- MENUITEM "Inf&o...", CMD_ABOUT_WINE
+ MENUITEM "&O programu..." CMD_ABOUT
+ MENUITEM "In&fo...", CMD_ABOUT_WINE
END
END
diff --git a/base/applications/paint/definitions.h b/base/applications/paint/definitions.h
index 5fb041e7a4c..71ec94bf263 100644
--- a/base/applications/paint/definitions.h
+++ b/base/applications/paint/definitions.h
@@ -98,6 +98,24 @@
#define ID_ELLIPSE 614
#define ID_RRECT 615
+//the following 16 numbers need to be in order, increasing by 1
+#define TOOL_FREESEL 1
+#define TOOL_RECTSEL 2
+#define TOOL_RUBBER 3
+#define TOOL_FILL 4
+#define TOOL_COLOR 5
+#define TOOL_ZOOM 6
+#define TOOL_PEN 7
+#define TOOL_BRUSH 8
+#define TOOL_AIRBRUSH 9
+#define TOOL_TEXT 10
+#define TOOL_LINE 11
+#define TOOL_BEZIER 12
+#define TOOL_RECT 13
+#define TOOL_SHAPE 14
+#define TOOL_ELLIPSE 15
+#define TOOL_RRECT 16
+
#define ID_ACCELERATORS 800
#define IDD_MIRRORROTATE 700
diff --git a/base/applications/paint/lang/cs-CZ.rc b/base/applications/paint/lang/cs-CZ.rc
index f3a8f3d2501..da0e84b5de3 100644
--- a/base/applications/paint/lang/cs-CZ.rc
+++ b/base/applications/paint/lang/cs-CZ.rc
@@ -49,7 +49,7 @@ BEGIN
MENUITEM SEPARATOR
POPUP "Lupa"
BEGIN
- POPUP "User defined"
+ POPUP "Vlastní nastavení"
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 "Zobrazit mřížku", IDM_VIEWSHOWGRID
+ MENUITEM "Zobrazit miniaturu", IDM_VIEWSHOWMINIATURE
END
MENUITEM "Celá obrazovka\tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -86,7 +86,7 @@ BEGIN
BEGIN
MENUITEM "Témata nápovědy", IDM_HELPHELPTOPICS
MENUITEM SEPARATOR
- MENUITEM "O programu...", IDM_HELPINFO
+ MENUITEM "&O programu...", IDM_HELPINFO
END
END
@@ -104,6 +104,7 @@ BEGIN
"^A", IDM_EDITSELECTALL
"^T", IDM_VIEWTOOLBOX
"^L", IDM_VIEWCOLORPALETTE
+ "^G", IDM_VIEWSHOWGRID
"^F", IDM_VIEWFULLSCREEN
"^R", IDM_IMAGEROTATEMIRROR
"^W", IDM_IMAGECHANGESIZE
@@ -140,9 +141,9 @@ BEGIN
LTEXT "Datum změny:", IDD_ATTRIBUTESTEXT3, 10, 5, 60, 10
LTEXT "Velikost souboru:", IDD_ATTRIBUTESTEXT4, 10, 15, 60, 10
LTEXT "Rozlišení:", IDD_ATTRIBUTESTEXT5, 10, 25, 60, 10
- LTEXT "Not available", IDD_ATTRIBUTESTEXT6, 60, 5, 90, 10
- LTEXT "Not available", IDD_ATTRIBUTESTEXT7, 60, 15, 90, 10
- LTEXT "Not available", IDD_ATTRIBUTESTEXT8, 60, 25, 90, 10
+ LTEXT "Nedostupné", IDD_ATTRIBUTESTEXT6, 60, 5, 90, 10
+ LTEXT "Nedostupné", IDD_ATTRIBUTESTEXT7, 60, 15, 90, 10
+ LTEXT "Nedostupné", IDD_ATTRIBUTESTEXT8, 60, 25, 90, 10
GROUPBOX "Jednotka", IDD_ATTRIBUTESGROUP1, 6, 57, 139, 27
AUTORADIOBUTTON "Palce", IDD_ATTRIBUTESRB1, 12, 69, 35, 10, WS_GROUP
AUTORADIOBUTTON "Centimetry", IDD_ATTRIBUTESRB2, 52, 69, 35, 10
@@ -181,7 +182,7 @@ BEGIN
IDS_INFOTEXT, "ReactOS Malování je dostupné pod licencí GNU Lesser General Public License (LGPL) verze 3 (viz. www.gnu.org)"
IDS_SAVEPROMPTTEXT, "Chcete uložit provedené změny v %s?"
IDS_DEFAULTFILENAME, "Bez názvu.bmp"
- IDS_MINIATURETITLE, "Miniature"
+ IDS_MINIATURETITLE, "Miniatura"
IDS_TOOLTIP1, "Volný výběr"
IDS_TOOLTIP2, "Výběr"
IDS_TOOLTIP3, "Guma"
@@ -200,6 +201,6 @@ BEGIN
IDS_TOOLTIP16, "Zaoblený obdélník"
IDS_OPENFILTER, "Soubory bitmap (*.bmp;*.dib)\1*.bmp;*.dib\1Všechny soubory (*.*)\1*.*\1"
IDS_SAVEFILTER, "24bitová bitmapa (*.bmp;*.dib)\1*.bmp;*.dib\1"
- IDS_FILESIZE, "%d bytes"
- IDS_PRINTRES, "%d x %d pixels per meter"
+ IDS_FILESIZE, "%d bajtů"
+ IDS_PRINTRES, "%d x %d pixelů na metr"
END
diff --git a/base/applications/paint/main.c b/base/applications/paint/main.c
index 904220567d1..3c77cb23999 100644
--- a/base/applications/paint/main.c
+++ b/base/applications/paint/main.c
@@ -50,7 +50,7 @@ short lastY;
int lineWidth = 1;
int shapeStyle = 0;
int brushStyle = 0;
-int activeTool = 7;
+int activeTool = TOOL_PEN;
int airBrushWidth = 5;
int rubberRadius = 4;
int transpBg = 0;
diff --git a/base/applications/paint/mouse.c b/base/applications/paint/mouse.c
index 9165291594e..d46bbe35eaf 100644
--- a/base/applications/paint/mouse.c
+++ b/base/applications/paint/mouse.c
@@ -67,7 +67,7 @@ startPaintingL(HDC hdc, short x, short y, int fg, int bg)
lastY = y;
switch (activeTool)
{
- case 1:
+ case TOOL_FREESEL:
ShowWindow(hSelection, SW_HIDE);
if (ptStack != NULL)
HeapFree(GetProcessHeap(), 0, ptStack);
@@ -76,39 +76,39 @@ startPaintingL(HDC hdc, short x, short y, int fg, int bg)
ptStack[0].x = x;
ptStack[0].y = y;
break;
- case 10:
- case 11:
- case 13:
- case 15:
- case 16:
+ case TOOL_TEXT:
+ case TOOL_LINE:
+ case TOOL_RECT:
+ case TOOL_ELLIPSE:
+ case TOOL_RRECT:
newReversible();
break;
- case 2:
+ case TOOL_RECTSEL:
newReversible();
ShowWindow(hSelection, SW_HIDE);
rectSel_src[2] = rectSel_src[3] = 0;
break;
- case 3:
+ case TOOL_RUBBER:
newReversible();
Erase(hdc, x, y, x, y, bg, rubberRadius);
break;
- case 4:
+ case TOOL_FILL:
newReversible();
Fill(hdc, x, y, fg);
break;
- case 7:
+ case TOOL_PEN:
newReversible();
SetPixel(hdc, x, y, fg);
break;
- case 8:
+ case TOOL_BRUSH:
newReversible();
Brush(hdc, x, y, x, y, fg, brushStyle);
break;
- case 9:
+ case TOOL_AIRBRUSH:
newReversible();
Airbrush(hdc, x, y, fg, airBrushWidth);
break;
- case 12:
+ case TOOL_BEZIER:
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
if (pointSP == 0)
@@ -117,7 +117,7 @@ startPaintingL(HDC hdc, short x, short y, int fg, int bg)
pointSP++;
}
break;
- case 14:
+ case TOOL_SHAPE:
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
if (pointSP + 1 >= 2)
@@ -136,7 +136,7 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg)
{
switch (activeTool)
{
- case 1:
+ case TOOL_FREESEL:
if (ptSP == 0)
newReversible();
ptSP++;
@@ -147,7 +147,7 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg)
resetToU1();
Poly(hdc, ptStack, ptSP + 1, 0, 0, 2, 0, FALSE);
break;
- case 2:
+ case TOOL_RECTSEL:
{
short tempX;
short tempY;
@@ -161,25 +161,25 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg)
RectSel(hdc, startX, startY, tempX, tempY);
break;
}
- case 3:
+ case TOOL_RUBBER:
Erase(hdc, lastX, lastY, x, y, bg, rubberRadius);
break;
- case 7:
+ case TOOL_PEN:
Line(hdc, lastX, lastY, x, y, fg, 1);
break;
- case 8:
+ case TOOL_BRUSH:
Brush(hdc, lastX, lastY, x, y, fg, brushStyle);
break;
- case 9:
+ case TOOL_AIRBRUSH:
Airbrush(hdc, x, y, fg, airBrushWidth);
break;
- case 11:
+ case TOOL_LINE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
roundTo8Directions(startX, startY, &x, &y);
Line(hdc, startX, startY, x, y, fg, lineWidth);
break;
- case 12:
+ case TOOL_BEZIER:
resetToU1();
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
@@ -197,13 +197,13 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg)
break;
}
break;
- case 13:
+ case TOOL_RECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
break;
- case 14:
+ case TOOL_SHAPE:
resetToU1();
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
@@ -213,13 +213,13 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg)
if (pointSP + 1 >= 2)
Poly(hdc, pointStack, pointSP + 1, fg, bg, lineWidth, shapeStyle, FALSE);
break;
- case 15:
+ case TOOL_ELLIPSE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
break;
- case 16:
+ case TOOL_RRECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
@@ -236,7 +236,7 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
{
switch (activeTool)
{
- case 1:
+ case TOOL_FREESEL:
{
POINT *ptStackCopy;
int i;
@@ -279,6 +279,9 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
Poly(hdc, ptStack, ptSP + 1, bg, bg, 1, 2, TRUE);
newReversible();
+ MaskBlt(hDrawingDC, rectSel_src[0], rectSel_src[1], rectSel_src[2], rectSel_src[3], hSelDC, 0,
+ 0, hSelMask, 0, 0, MAKEROP4(SRCCOPY, SRCAND));
+
placeSelWin();
ShowWindow(hSelection, SW_SHOW);
}
@@ -286,7 +289,7 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
ptStack = NULL;
break;
}
- case 2:
+ case TOOL_RECTSEL:
resetToU1();
if ((rectSel_src[2] != 0) && (rectSel_src[3] != 0))
{
@@ -302,35 +305,38 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
rectSel_src[1] + rectSel_src[3], bgColor, bgColor, 0, TRUE);
newReversible();
+ BitBlt(hDrawingDC, rectSel_src[0], rectSel_src[1], rectSel_src[2], rectSel_src[3], hSelDC, 0,
+ 0, SRCCOPY);
+
placeSelWin();
ShowWindow(hSelection, SW_SHOW);
}
break;
- case 3:
+ case TOOL_RUBBER:
Erase(hdc, lastX, lastY, x, y, bg, rubberRadius);
break;
- case 7:
+ case TOOL_PEN:
Line(hdc, lastX, lastY, x, y, fg, 1);
SetPixel(hdc, x, y, fg);
break;
- case 11:
+ case TOOL_LINE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
roundTo8Directions(startX, startY, &x, &y);
Line(hdc, startX, startY, x, y, fg, lineWidth);
break;
- case 12:
+ case TOOL_BEZIER:
pointSP++;
if (pointSP == 4)
pointSP = 0;
break;
- case 13:
+ case TOOL_RECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
break;
- case 14:
+ case TOOL_SHAPE:
resetToU1();
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
@@ -354,13 +360,13 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
if (pointSP == 255)
pointSP--;
break;
- case 15:
+ case TOOL_ELLIPSE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
break;
- case 16:
+ case TOOL_RRECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
@@ -378,35 +384,35 @@ startPaintingR(HDC hdc, short x, short y, int fg, int bg)
lastY = y;
switch (activeTool)
{
- case 1:
- case 10:
- case 11:
- case 13:
- case 15:
- case 16:
+ case TOOL_FREESEL:
+ case TOOL_TEXT:
+ case TOOL_LINE:
+ case TOOL_RECT:
+ case TOOL_ELLIPSE:
+ case TOOL_RRECT:
newReversible();
break;
- case 3:
+ case TOOL_RUBBER:
newReversible();
Replace(hdc, x, y, x, y, fg, bg, rubberRadius);
break;
- case 4:
+ case TOOL_FILL:
newReversible();
Fill(hdc, x, y, bg);
break;
- case 7:
+ case TOOL_PEN:
newReversible();
SetPixel(hdc, x, y, bg);
break;
- case 8:
+ case TOOL_BRUSH:
newReversible();
Brush(hdc, x, y, x, y, bg, brushStyle);
break;
- case 9:
+ case TOOL_AIRBRUSH:
newReversible();
Airbrush(hdc, x, y, bg, airBrushWidth);
break;
- case 12:
+ case TOOL_BEZIER:
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
if (pointSP == 0)
@@ -415,7 +421,7 @@ startPaintingR(HDC hdc, short x, short y, int fg, int bg)
pointSP++;
}
break;
- case 14:
+ case TOOL_SHAPE:
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
if (pointSP + 1 >= 2)
@@ -434,25 +440,25 @@ whilePaintingR(HDC hdc, short x, short y, int fg, int bg)
{
switch (activeTool)
{
- case 3:
+ case TOOL_RUBBER:
Replace(hdc, lastX, lastY, x, y, fg, bg, rubberRadius);
break;
- case 7:
+ case TOOL_PEN:
Line(hdc, lastX, lastY, x, y, bg, 1);
break;
- case 8:
+ case TOOL_BRUSH:
Brush(hdc, lastX, lastY, x, y, bg, brushStyle);
break;
- case 9:
+ case TOOL_AIRBRUSH:
Airbrush(hdc, x, y, bg, airBrushWidth);
break;
- case 11:
+ case TOOL_LINE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
roundTo8Directions(startX, startY, &x, &y);
Line(hdc, startX, startY, x, y, bg, lineWidth);
break;
- case 12:
+ case TOOL_BEZIER:
resetToU1();
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
@@ -470,13 +476,13 @@ whilePaintingR(HDC hdc, short x, short y, int fg, int bg)
break;
}
break;
- case 13:
+ case TOOL_RECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
break;
- case 14:
+ case TOOL_SHAPE:
resetToU1();
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
@@ -486,13 +492,13 @@ whilePaintingR(HDC hdc, short x, short y, int fg, int bg)
if (pointSP + 1 >= 2)
Poly(hdc, pointStack, pointSP + 1, bg, fg, lineWidth, shapeStyle, FALSE);
break;
- case 15:
+ case TOOL_ELLIPSE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
break;
- case 16:
+ case TOOL_RRECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
@@ -509,31 +515,31 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg)
{
switch (activeTool)
{
- case 3:
+ case TOOL_RUBBER:
Replace(hdc, lastX, lastY, x, y, fg, bg, rubberRadius);
break;
- case 7:
+ case TOOL_PEN:
Line(hdc, lastX, lastY, x, y, bg, 1);
SetPixel(hdc, x, y, bg);
break;
- case 11:
+ case TOOL_LINE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
roundTo8Directions(startX, startY, &x, &y);
Line(hdc, startX, startY, x, y, bg, lineWidth);
break;
- case 12:
+ case TOOL_BEZIER:
pointSP++;
if (pointSP == 4)
pointSP = 0;
break;
- case 13:
+ case TOOL_RECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
break;
- case 14:
+ case TOOL_SHAPE:
resetToU1();
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
@@ -557,13 +563,13 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg)
if (pointSP == 255)
pointSP--;
break;
- case 15:
+ case TOOL_ELLIPSE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
break;
- case 16:
+ case TOOL_RRECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
diff --git a/base/applications/paint/toolsettings.c b/base/applications/paint/toolsettings.c
index bfb2172f0bf..2e5cd67661d 100644
--- a/base/applications/paint/toolsettings.c
+++ b/base/applications/paint/toolsettings.c
@@ -34,13 +34,13 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
DefWindowProc(hwnd, message, wParam, lParam);
- DrawEdge(hdc, &rect1, BDR_SUNKENOUTER, (activeTool == 6) ? BF_RECT : BF_RECT | BF_MIDDLE);
- DrawEdge(hdc, &rect2, (activeTool >= 13) ? BDR_SUNKENOUTER : 0, BF_RECT | BF_MIDDLE);
+ DrawEdge(hdc, &rect1, BDR_SUNKENOUTER, (activeTool == TOOL_ZOOM) ? BF_RECT : BF_RECT | BF_MIDDLE);
+ DrawEdge(hdc, &rect2, (activeTool >= TOOL_RECT) ? BDR_SUNKENOUTER : 0, BF_RECT | BF_MIDDLE);
switch (activeTool)
{
- case 1:
- case 2:
- case 10:
+ case TOOL_FREESEL:
+ case TOOL_RECTSEL:
+ case TOOL_TEXT:
{
HPEN oldPen = SelectObject(hdc, CreatePen(PS_NULL, 0, 0));
SelectObject(hdc, GetSysColorBrush(COLOR_HIGHLIGHT));
@@ -50,7 +50,7 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
DrawIconEx(hdc, 1, 33, hTranspIcon, 40, 30, 0, NULL, DI_NORMAL);
break;
}
- case 3:
+ case TOOL_RUBBER:
{
int i;
HPEN oldPen = SelectObject(hdc, CreatePen(PS_NULL, 0, 0));
@@ -69,7 +69,7 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
DeleteObject(SelectObject(hdc, oldPen));
break;
}
- case 8:
+ case TOOL_BRUSH:
{
int i;
HPEN oldPen = SelectObject(hdc, CreatePen(PS_NULL, 0, 0));
@@ -82,7 +82,7 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
GetSysColor((i == brushStyle) ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT), i);
break;
}
- case 9:
+ case TOOL_AIRBRUSH:
{
HPEN oldPen = SelectObject(hdc, CreatePen(PS_NULL, 0, 0));
SelectObject(hdc, GetSysColorBrush(COLOR_HIGHLIGHT));
@@ -112,8 +112,8 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
DeleteObject(SelectObject(hdc, oldPen));
break;
}
- case 11:
- case 12:
+ case TOOL_LINE:
+ case TOOL_BEZIER:
{
int i;
HPEN oldPen = SelectObject(hdc, CreatePen(PS_NULL, 0, 0));
@@ -132,10 +132,10 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
DeleteObject(SelectObject(hdc, oldPen));
break;
}
- case 13:
- case 14:
- case 15:
- case 16:
+ case TOOL_RECT:
+ case TOOL_SHAPE:
+ case TOOL_ELLIPSE:
+ case TOOL_RRECT:
{
int i;
HPEN oldPen = SelectObject(hdc, CreatePen(PS_NULL, 0, 0));
@@ -178,23 +178,23 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (activeTool)
{
- case 1:
- case 2:
- case 10:
+ case TOOL_FREESEL:
+ case TOOL_RECTSEL:
+ case TOOL_TEXT:
if ((HIWORD(lParam) > 1) && (HIWORD(lParam) < 64))
{
transpBg = (HIWORD(lParam) - 2) / 31;
SendMessage(hwnd, WM_PAINT, 0, 0);
}
break;
- case 3:
+ case TOOL_RUBBER:
if ((HIWORD(lParam) > 1) && (HIWORD(lParam) < 62))
{
rubberRadius = (HIWORD(lParam) - 2) / 15 + 2;
SendMessage(hwnd, WM_PAINT, 0, 0);
}
break;
- case 8:
+ case TOOL_BRUSH:
if ((LOWORD(lParam) > 1) && (LOWORD(lParam) < 40) && (HIWORD(lParam) > 1)
&& (HIWORD(lParam) < 62))
{
@@ -202,7 +202,7 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
SendMessage(hwnd, WM_PAINT, 0, 0);
}
break;
- case 9:
+ case TOOL_AIRBRUSH:
if (HIWORD(lParam) < 62)
{
if (HIWORD(lParam) < 30)
@@ -222,18 +222,18 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
SendMessage(hwnd, WM_PAINT, 0, 0);
}
break;
- case 11:
- case 12:
+ case TOOL_LINE:
+ case TOOL_BEZIER:
if (HIWORD(lParam) <= 62)
{
lineWidth = (HIWORD(lParam) - 2) / 12 + 1;
SendMessage(hwnd, WM_PAINT, 0, 0);
}
break;
- case 13:
- case 14:
- case 15:
- case 16:
+ case TOOL_RECT:
+ case TOOL_SHAPE:
+ case TOOL_ELLIPSE:
+ case TOOL_RRECT:
if (HIWORD(lParam) <= 60)
{
shapeStyle = (HIWORD(lParam) - 2) / 20;
diff --git a/base/applications/paint/winproc.c b/base/applications/paint/winproc.c
index 464b62c9842..18bbaa61a67 100644
--- a/base/applications/paint/winproc.c
+++ b/base/applications/paint/winproc.c
@@ -460,19 +460,19 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (activeTool)
{
- case 4:
+ case TOOL_FILL:
SetCursor(hCurFill);
break;
- case 5:
+ case TOOL_COLOR:
SetCursor(hCurColor);
break;
- case 6:
+ case TOOL_ZOOM:
SetCursor(hCurZoom);
break;
- case 7:
+ case TOOL_PEN:
SetCursor(hCurPen);
break;
- case 9:
+ case TOOL_AIRBRUSH:
SetCursor(hCurAirbrush);
break;
default:
@@ -486,7 +486,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_LBUTTONDOWN:
if (hwnd == hImageArea)
{
- if ((!drawing) || (activeTool == 5))
+ if ((!drawing) || (activeTool == TOOL_COLOR))
{
SetCapture(hImageArea);
drawing = TRUE;
@@ -499,7 +499,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
undo();
}
SendMessage(hImageArea, WM_PAINT, 0, 0);
- if ((activeTool == 6) && (zoom < 8000))
+ if ((activeTool == TOOL_ZOOM) && (zoom < 8000))
zoomTo(zoom * 2, (short)LOWORD(lParam), (short)HIWORD(lParam));
}
break;
@@ -507,7 +507,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_RBUTTONDOWN:
if (hwnd == hImageArea)
{
- if ((!drawing) || (activeTool == 5))
+ if ((!drawing) || (activeTool == TOOL_COLOR))
{
SetCapture(hImageArea);
drawing = TRUE;
@@ -520,7 +520,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
undo();
}
SendMessage(hImageArea, WM_PAINT, 0, 0);
- if ((activeTool == 6) && (zoom > 125))
+ if ((activeTool == TOOL_ZOOM) && (zoom > 125))
zoomTo(zoom / 2, (short)LOWORD(lParam), (short)HIWORD(lParam));
}
break;
@@ -533,7 +533,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
endPaintingL(hDrawingDC, LOWORD(lParam) * 1000 / zoom, HIWORD(lParam) * 1000 / zoom, fgColor,
bgColor);
SendMessage(hImageArea, WM_PAINT, 0, 0);
- if (activeTool == 5)
+ if (activeTool == TOOL_COLOR)
{
int tempColor =
GetPixel(hDrawingDC, LOWORD(lParam) * 1000 / zoom, HIWORD(lParam) * 1000 / zoom);
@@ -553,7 +553,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
endPaintingR(hDrawingDC, LOWORD(lParam) * 1000 / zoom, HIWORD(lParam) * 1000 / zoom, fgColor,
bgColor);
SendMessage(hImageArea, WM_PAINT, 0, 0);
- if (activeTool == 5)
+ if (activeTool == TOOL_COLOR)
{
int tempColor =
GetPixel(hDrawingDC, LOWORD(lParam) * 1000 / zoom, HIWORD(lParam) * 1000 / zoom);
@@ -568,16 +568,13 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_MOUSEMOVE:
if (hwnd == hImageArea)
{
- if ((!drawing) || (activeTool <= 9))
+ short xNow = (short)LOWORD(lParam) * 1000 / zoom;
+ short yNow = (short)HIWORD(lParam) * 1000 / zoom;
+ if ((!drawing) || (activeTool <= TOOL_AIRBRUSH))
{
TRACKMOUSEEVENT tme;
- TCHAR coordStr[100];
- _stprintf(coordStr, _T("%d, %d"), (short)LOWORD(lParam) * 1000 / zoom,
- (short)HIWORD(lParam) * 1000 / zoom);
- SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM) coordStr);
-
- if (activeTool == 6)
+ if (activeTool == TOOL_ZOOM)
{
SendMessage(hImageArea, WM_PAINT, 0, 0);
drawZoomFrame((short)LOWORD(lParam), (short)HIWORD(lParam));
@@ -588,32 +585,73 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
tme.hwndTrack = hImageArea;
tme.dwHoverTime = 0;
TrackMouseEvent(&tme);
+
+ if (!drawing)
+ {
+ TCHAR coordStr[100];
+ _stprintf(coordStr, _T("%d, %d"), xNow, yNow);
+ SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM) coordStr);
+ }
}
if (drawing)
{
+ /* values displayed in statusbar */
+ short xRel = xNow - startX;
+ short yRel = yNow - startY;
+ /* freesel, rectsel and text tools always show numbers limited to fit into image area */
+ if ((activeTool == TOOL_FREESEL) || (activeTool == TOOL_RECTSEL) || (activeTool == TOOL_TEXT))
+ {
+ if (xRel < 0)
+ xRel = (xNow < 0) ? -startX : xRel;
+ else if (xNow > imgXRes)
+ xRel = imgXRes-startX;
+ if (yRel < 0)
+ yRel = (yNow < 0) ? -startY : yRel;
+ else if (yNow > imgYRes)
+ yRel = imgYRes-startY;
+ }
+ /* rectsel and shape tools always show non-negative numbers when drawing */
+ if ((activeTool == TOOL_RECTSEL) || (activeTool == TOOL_SHAPE))
+ {
+ if (xRel < 0)
+ xRel = -xRel;
+ if (yRel < 0)
+ yRel = -yRel;
+ }
+ /* while drawing, update cursor coordinates only for tools 3, 7, 8, 9, 14 */
+ switch(activeTool)
+ {
+ case TOOL_RUBBER:
+ case TOOL_PEN:
+ case TOOL_BRUSH:
+ case TOOL_AIRBRUSH:
+ case TOOL_SHAPE:
+ {
+ TCHAR coordStr[100];
+ _stprintf(coordStr, _T("%d, %d"), xNow, yNow);
+ SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM) coordStr);
+ break;
+ }
+ }
if ((wParam & MK_LBUTTON) != 0)
{
- whilePaintingL(hDrawingDC, (short)LOWORD(lParam) * 1000 / zoom,
- (short)HIWORD(lParam) * 1000 / zoom, fgColor, bgColor);
+ whilePaintingL(hDrawingDC, xNow, yNow, fgColor, bgColor);
SendMessage(hImageArea, WM_PAINT, 0, 0);
- if ((activeTool >= 10) || (activeTool == 2))
+ if ((activeTool >= TOOL_TEXT) || (activeTool == TOOL_RECTSEL) || (activeTool == TOOL_FREESEL))
{
TCHAR sizeStr[100];
- _stprintf(sizeStr, _T("%d x %d"), (short)LOWORD(lParam) * 1000 / zoom - startX,
- (short)HIWORD(lParam) * 1000 / zoom - startY);
+ _stprintf(sizeStr, _T("%d x %d"), xRel, yRel);
SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr);
}
}
if ((wParam & MK_RBUTTON) != 0)
{
- whilePaintingR(hDrawingDC, (short)LOWORD(lParam) * 1000 / zoom,
- (short)HIWORD(lParam) * 1000 / zoom, fgColor, bgColor);
+ whilePaintingR(hDrawingDC, xNow, yNow, fgColor, bgColor);
SendMessage(hImageArea, WM_PAINT, 0, 0);
- if (activeTool >= 10)
+ if (activeTool >= TOOL_TEXT)
{
TCHAR sizeStr[100];
- _stprintf(sizeStr, _T("%d x %d"), (short)LOWORD(lParam) * 1000 / zoom - startX,
- (short)HIWORD(lParam) * 1000 / zoom - startY);
+ _stprintf(sizeStr, _T("%d x %d"), xRel, yRel);
SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr);
}
}
@@ -623,7 +661,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_MOUSELEAVE:
SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM) _T(""));
- if (activeTool == 6)
+ if (activeTool == TOOL_ZOOM)
SendMessage(hImageArea, WM_PAINT, 0, 0);
break;
@@ -747,7 +785,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
/* remove selection window and already painted content using undo(),
paint Rect for rectangular selections and nothing for freeform selections */
undo();
- if (activeTool == 2)
+ if (activeTool == TOOL_RECTSEL)
{
newReversible();
Rect(hDrawingDC, rectSel_dest[0], rectSel_dest[1], rectSel_dest[2] + rectSel_dest[0],
@@ -756,7 +794,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
break;
}
case IDM_EDITSELECTALL:
- if (activeTool == 2)
+ if (activeTool == TOOL_RECTSEL)
{
startPaintingL(hDrawingDC, 0, 0, fgColor, bgColor);
whilePaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor);
diff --git a/base/applications/rapps/lang/de-DE.rc b/base/applications/rapps/lang/de-DE.rc
index b48f0ea2229..ea4dbc80de6 100644
--- a/base/applications/rapps/lang/de-DE.rc
+++ b/base/applications/rapps/lang/de-DE.rc
@@ -185,7 +185,7 @@ BEGIN
IDS_UPDATES "Aktualisierungen"
IDS_APPLICATIONS "Anwendungen"
IDS_CHOOSE_FOLDER_TEXT "Wählen Sie ein Verzeichnis aus, das zum Herunterladen verwendet werden soll:"
- IDS_CHOOSE_FOLDER_ERROR "Sie haben ein nicht existentes Verzeichnis angegeben!"
+ IDS_CHOOSE_FOLDER_ERROR "Sie haben ein nicht existierendes Verzeichnis angegeben! Neu anlegen?"
IDS_USER_NOT_ADMIN "Sie müssen als Administrator angemeldet sein, um den Anwendungsmanager zu starten!"
IDS_APP_REG_REMOVE "Sind Sie sich sicher, dass Sie die Daten dieses Programms aus der Registry entfernen möchten?"
IDS_INFORMATION "Informationen"
diff --git a/base/applications/rapps/lang/en-US.rc b/base/applications/rapps/lang/en-US.rc
index f8d018923dc..677ca86c13b 100644
--- a/base/applications/rapps/lang/en-US.rc
+++ b/base/applications/rapps/lang/en-US.rc
@@ -185,7 +185,7 @@ BEGIN
IDS_UPDATES "Updates"
IDS_APPLICATIONS "Applications"
IDS_CHOOSE_FOLDER_TEXT "Choose a folder which will store Downloads:"
- IDS_CHOOSE_FOLDER_ERROR "The folder you have specified does not exist."
+ IDS_CHOOSE_FOLDER_ERROR "The folder you have specified does not exist. Create it?"
IDS_USER_NOT_ADMIN "You must be an administrator to 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"
diff --git a/base/applications/rapps/lang/it-IT.rc b/base/applications/rapps/lang/it-IT.rc
index 44fcfab4a8a..35366716d7d 100644
--- a/base/applications/rapps/lang/it-IT.rc
+++ b/base/applications/rapps/lang/it-IT.rc
@@ -156,7 +156,7 @@ BEGIN
IDS_CAT_DEVEL "Sviluppo"
IDS_CAT_DRIVERS "Drivers"
IDS_CAT_EDU "Edutainment"
- IDS_CAT_ENGINEER "Engineering"
+ IDS_CAT_ENGINEER "Scienze"
IDS_CAT_FINANCE "Finanza"
IDS_CAT_GAMES "Giochi e divertimento"
IDS_CAT_GRAPHICS "Graphica"
@@ -174,18 +174,18 @@ BEGIN
IDS_APPTITLE "ReactOS Applications Manager"
IDS_SEARCH_TEXT "Cerca..."
IDS_INSTALL "Installa"
- IDS_UNINSTALL "Disinstall"
+ IDS_UNINSTALL "Disinstalla"
IDS_MODIFY "Modifica"
IDS_APPS_COUNT "Numero applicazioni: %d"
IDS_WELCOME_TITLE "Benvenuto!\n\n"
IDS_WELCOME_TEXT "Scegliere una categoria a sinistra, poi scegliere una applicazione da installare o disinstallare.\nReactOS Web Site: "
IDS_WELCOME_URL "http://www.reactos.org"
IDS_INSTALLED "Installato"
- IDS_AVAILABLEFORINST "Disponibile"
+ IDS_AVAILABLEFORINST "Disponibile per l'installazione"
IDS_UPDATES "Aggiornamenti"
IDS_APPLICATIONS "Applicazioni"
IDS_CHOOSE_FOLDER_TEXT "Scegliere una cartella dove scaricare le applicazioni:"
- IDS_CHOOSE_FOLDER_ERROR "La cartella indicata non esiste."
+ IDS_CHOOSE_FOLDER_ERROR "La cartella indicata non esiste. Vuoi crearla?"
IDS_USER_NOT_ADMIN "Dovete essere Amministratore per avviare ""ReactOS Applications Manager""!"
IDS_APP_REG_REMOVE "Sicuro di voler cancellare dal registry i dati sui programmi installati?"
IDS_INFORMATION "Informazioni"
diff --git a/base/applications/rapps/lang/pl-PL.rc b/base/applications/rapps/lang/pl-PL.rc
index 60fd20b7530..5b68948a7e7 100644
--- a/base/applications/rapps/lang/pl-PL.rc
+++ b/base/applications/rapps/lang/pl-PL.rc
@@ -187,7 +187,7 @@ BEGIN
IDS_UPDATES "Uaktualnienia"
IDS_APPLICATIONS "Aplikacje"
IDS_CHOOSE_FOLDER_TEXT "Wybierz katalog w którym będa zapisywane pobrane programy:"
- IDS_CHOOSE_FOLDER_ERROR "Wybrałeś nieistniejący katalog!"
+ IDS_CHOOSE_FOLDER_ERROR "Wybrałeś nieistniejący katalog! Czy chcesz utworzyć nowy?"
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"
diff --git a/base/applications/rapps/rapps/abiword28x.txt b/base/applications/rapps/rapps/abiword28x.txt
new file mode 100644
index 00000000000..0e4001cd493
--- /dev/null
+++ b/base/applications/rapps/rapps/abiword28x.txt
@@ -0,0 +1,21 @@
+; UTF-8
+
+[Section]
+Name = AbiWord
+Version = 2.8.5
+Licence = GPL
+Description = Word processor.
+Size = 7.9MB
+Category = 6
+URLSite = http://www.abisource.com/
+URLDownload = http://www.abisource.com/downloads/abiword/2.8.5/Windows/abiword-setup-2.8.5.exe
+CDPath = none
+
+[Section.0407]
+Description = Textverarbeitung.
+
+[Section.040a]
+Description = Procesador de textos.
+
+[Section.0415]
+Description = Edytor tekstu.
diff --git a/base/applications/rapps/rapps/firefox2.txt b/base/applications/rapps/rapps/firefox2.txt
index 3cf7dc27921..e0b62661193 100644
--- a/base/applications/rapps/rapps/firefox2.txt
+++ b/base/applications/rapps/rapps/firefox2.txt
@@ -8,35 +8,20 @@ Description = The most popular and one of the best free Web Browsers out there.
Size = 5.8M
Category = 5
URLSite = http://www.mozilla.com/en-US/
-URLDownload = http://194.71.11.70/pub/www/clients/mozilla.org/firefox/releases/2.0.0.20/win32/en-US/Firefox%20Setup%202.0.0.20.exe
+URLDownload = http://svn.reactos.org/packages/Firefox%20Setup%202.0.0.20.exe
CDPath = none
[Section.0407]
Description = Der populärste und einer der besten freien Webbrowser.
-Size = 5.5M
-URLSite = http://www.mozilla-europe.org/de/
-URLDownload = http://194.71.11.70/pub/www/clients/mozilla.org/firefox/releases/2.0.0.20/win32/de/Firefox%20Setup%202.0.0.20.exe
[Section.040a]
Description = El más popular y uno de los mejores navegadores web gratuitos que hay.
-Size = 5.6M
-URLSite = http://www.mozilla-europe.org/es/
-URLDownload = http://194.71.11.70/pub/www/clients/mozilla.org/firefox/releases/2.0.0.20/win32/es-ES/Firefox%20Setup%202.0.0.20.exe
[Section.0414]
Description = Mest populære og best også gratis nettleserene der ute.
-Size = 5.6M
-URLSite = http://www.mozilla-europe.org/no/
-URLDownload = http://194.71.11.70/pub/www/clients/mozilla.org/firefox/releases/2.0.0.20/win32/nb-NO/Firefox%20Setup%202.0.0.20.exe
[Section.0415]
Description = Najpopularniejsza i jedna z najlepszych darmowych przeglÄ…darek internetowych.
-Size = 6.3M
-URLSite = http://www.mozilla-europe.org/pl/
-URLDownload = http://194.71.11.70/pub/www/clients/mozilla.org/firefox/releases/2.0.0.20/win32/pl/Firefox%20Setup%202.0.0.20.exe
[Section.0419]
Description = Один из Ńамых попŃлярных и Đ»ŃчŃих беŃплатных браŃзеров.
-Size = 6.4M
-URLSite = http://www.mozilla-europe.org/ru/
-URLDownload = http://194.71.11.70/pub/www/clients/mozilla.org/firefox/releases/2.0.0.20/win32/ru/Firefox%20Setup%202.0.0.20.exe
diff --git a/base/applications/rapps/rapps/firefox36.txt b/base/applications/rapps/rapps/firefox36.txt
new file mode 100644
index 00000000000..f605dc063be
--- /dev/null
+++ b/base/applications/rapps/rapps/firefox36.txt
@@ -0,0 +1,42 @@
+; UTF-8
+
+[Section]
+Name = Mozilla Firefox 3.6
+Version = 3.6.3
+Licence = MPL/GPL/LGPL
+Description = The most popular and one of the best free Web Browsers out there.
+Size = 8.0M
+Category = 5
+URLSite = http://www.mozilla.com/en-US/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.3/win32/en-US/Firefox%20Setup%203.6.3.exe
+CDPath = none
+
+[Section.0407]
+Description = Der populärste und einer der besten freien Webbrowser.
+Size = 7.8M
+URLSite = http://www.mozilla-europe.org/de/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.3/win32/de/Firefox%20Setup%203.6.3.exe
+
+[Section.040a]
+Description = El más popular y uno de los mejores navegadores web gratuitos que hay.
+Size = 7.8M
+URLSite = http://www.mozilla-europe.org/es/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.3/win32/es-ES/Firefox%20Setup%203.6.3.exe
+
+[Section.0414]
+Description = Mest populære og best også gratis nettleserene der ute.
+Size = 7.8M
+URLSite = http://www.mozilla-europe.org/no/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.3/win32/nb-NO/Firefox%20Setup%203.6.3.exe
+
+[Section.0415]
+Description = Najpopularniejsza i jedna z najlepszych darmowych przeglÄ…darek internetowych.
+Size = 8.6M
+URLSite = http://www.mozilla-europe.org/pl/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.3/win32/pl/Firefox%20Setup%203.6.3.exe
+
+[Section.0419]
+Description = Один из Ńамых попŃлярных и Đ»ŃчŃих беŃплатных браŃзеров.
+Size = 8.2M
+URLSite = http://www.mozilla-europe.org/ru/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.3/win32/ru/Firefox%20Setup%203.6.3.exe
diff --git a/base/applications/rapps/rapps/mirandaim.txt b/base/applications/rapps/rapps/mirandaim.txt
index aadc724e326..5845bf7eb97 100644
--- a/base/applications/rapps/rapps/mirandaim.txt
+++ b/base/applications/rapps/rapps/mirandaim.txt
@@ -2,13 +2,13 @@
[Section]
Name = Miranda IM
-Version = 0.8.22
+Version = 0.8.24
Licence = GPL
Description = Open source multiprotocol instant messaging application - May not work completely.
-Size = 1.6MB
+Size = 1.7MB
Category = 5
URLSite = http://www.miranda-im.org/
-URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.22-unicode.exe
+URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.24-unicode.exe
CDPath = none
[Section.0407]
diff --git a/base/applications/rapps/rapps/openoffice3.0.txt b/base/applications/rapps/rapps/openoffice3.0.txt
index b9ee71bd025..9ae02ef5d4e 100644
--- a/base/applications/rapps/rapps/openoffice3.0.txt
+++ b/base/applications/rapps/rapps/openoffice3.0.txt
@@ -2,30 +2,29 @@
[Section]
Name = OpenOffice 3.0
-Version = 3.2.0
+Version = 3.2.1
Licence = LGPL
Description = THE Open Source Office Suite.
-Size = 135.4MB
+Size = 134.0MB
Category = 6
URLSite = http://www.openoffice.org/
-URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/stable/3.2.0/OOo_3.2.0_Win32Intel_install_en-US.exe
+URLDownload = http://ftp3.gwdg.de/pub/openoffice/stable/3.2.1/OOo_3.2.1_Win_x86_install_en-US.exe
CDPath = none
[Section.0407]
Description = DIE Open Source Office Suite.
URLSite = http://de.openoffice.org/
-Size = 145.8MB
-URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/de/3.2.0/OOo_3.2.0_Win32Intel_install_de.exe
+Size = 144.0MB
+URLDownload = http://ftp3.gwdg.de/pub/openoffice/localized/de/3.2.1/OOo_3.2.1_Win_x86_install_de.exe
[Section.040a]
Description = La suite de ofimática de código abierto.
URLSite = http://es.openoffice.org/
-Version = 3.1.0
-Size = 119.4MB
-URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/es/3.2.0/OOo_3.2.0_Win32Intel_install_es.exe
+Size = 144.0MB
+URLDownload = http://ftp3.gwdg.de/pub/openoffice/localized/es/3.2.1/OOo_3.2.1_Win_x86_install-wJRE_es.exe
[Section.0415]
Description = Otwarty pakiet biurowy.
URLSite = http://pl.openoffice.org/
-Size = 133.2MB
-URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/pl/3.2.0/OOo_3.2.0_Win32Intel_install_pl.exe
+Size = 130.0MB
+URLDownload = http://ftp3.gwdg.de/pub/openoffice/localized/pl/3.2.1/OOo_3.2.1_Win_x86_install_pl.exe
diff --git a/base/applications/rapps/rapps/opera9.txt b/base/applications/rapps/rapps/opera9.txt
new file mode 100644
index 00000000000..e951d00bc2a
--- /dev/null
+++ b/base/applications/rapps/rapps/opera9.txt
@@ -0,0 +1,24 @@
+; UTF-8
+
+[Section]
+Name = Opera
+Version = 9.64
+Licence = Freeware
+Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client.
+Size = 7.2M
+Category = 5
+URLSite = http://www.opera.com/
+URLDownload = http://get4.opera.com/pub/opera/win/964/int/Opera_964_int_Setup.exe
+CDPath = none
+
+[Section.0407]
+Description = Der populäre Opera Browser mit vielen fortschrittlichen Eigenschaften, enthält einen Mail und BitTorrent Client.
+
+[Section.040a]
+Description = Popular navegador web con muchas caracterĂsticas avanzadas e incluye un cliente de correo y BitTorrent.
+
+[Section.0415]
+Description = Popularna przeglÄ…darka internetowa z wieloma zaawansowanymi funkcjami, zawierajÄ…ca klientĂłw: poczty oraz BitTorrent.
+
+[Section.0419]
+Description = ПопŃлярный браŃзер ŃĐľ многими дополнительными возможноŃтями, включающий клиентов почты и BitTorrent.
diff --git a/base/applications/rapps/rapps/rosbe.txt b/base/applications/rapps/rapps/rosbe.txt
index 384df84563a..a019299b9d1 100644
--- a/base/applications/rapps/rapps/rosbe.txt
+++ b/base/applications/rapps/rapps/rosbe.txt
@@ -2,13 +2,13 @@
[Section]
Name = ReactOS Build Environment
-Version = 1.5.1
+Version = 1.5.1.1
Licence = GPL
Description = Allows you to build the ReactOS Source. For more instructions see ReactOS wiki.
-Size = 13.5MB
+Size = 13.8MB
Category = 7
-URLSite = http://reactos.org/wiki/Build_Environment/
-URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-1.5.1.exe
+URLSite = http://reactos.org/wiki/Build_Environment
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-1.5.1.1.exe
CDPath = none
[Section.0407]
diff --git a/base/applications/rapps/rapps/scite.txt b/base/applications/rapps/rapps/scite.txt
index c32df9cd195..2da34b49e95 100644
--- a/base/applications/rapps/rapps/scite.txt
+++ b/base/applications/rapps/rapps/scite.txt
@@ -2,13 +2,13 @@
[Section]
Name = SciTE
-Version = 2.11
+Version = 2.12
Licence = Freeware
Description = SciTE is a SCIntilla based Text Editor. Originally built to demonstrate Scintilla, it has grown to be a generally useful editor with facilities for building and running programs.
Size = 0.6M
Category = 7
URLSite = http://www.scintilla.org/
-URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc211.exe
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc212.exe
CDPath = none
[Section.0407]
diff --git a/base/applications/rapps/settingsdlg.c b/base/applications/rapps/settingsdlg.c
index 3764f0140bb..77034c51f5a 100644
--- a/base/applications/rapps/settingsdlg.c
+++ b/base/applications/rapps/settingsdlg.c
@@ -115,7 +115,14 @@ SettingsDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
IDS_CHOOSE_FOLDER_ERROR,
szMsgText, sizeof(szMsgText) / sizeof(WCHAR));
- MessageBoxW(hDlg, szMsgText, NULL, MB_OK | MB_ICONERROR);
+ if (MessageBoxW(hDlg, szMsgText, NULL, MB_YESNO) == IDYES)
+ {
+ if (CreateDirectoryW(szDir, NULL))
+ {
+ EndDialog(hDlg, LOWORD(wParam));
+ }
+ }
+
SetFocus(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT));
break;
}
diff --git a/base/applications/regedit/edit.c b/base/applications/regedit/edit.c
index ca4d5b3ac8f..6ed32b974bb 100644
--- a/base/applications/regedit/edit.c
+++ b/base/applications/regedit/edit.c
@@ -276,7 +276,6 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
{
WNDPROC oldproc;
HWND hwndValue;
- int len;
TCHAR ValueString[32];
LPTSTR Remainder;
DWORD Base;
@@ -319,7 +318,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
dwordEditMode = EDIT_MODE_HEX;
if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA)))
{
- if ((len = GetWindowTextLength(hwndValue)))
+ if (GetWindowTextLength(hwndValue))
{
if (GetWindowText(hwndValue, ValueString, 32))
{
@@ -339,7 +338,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
dwordEditMode = EDIT_MODE_DEC;
if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA)))
{
- if ((len = GetWindowTextLength(hwndValue)))
+ if (GetWindowTextLength(hwndValue))
{
if (GetWindowText(hwndValue, ValueString, 32))
{
@@ -356,7 +355,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
case IDOK:
if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA)))
{
- if ((len = GetWindowTextLength(hwndValue)))
+ if (GetWindowTextLength(hwndValue))
{
if (!GetWindowText(hwndValue, ValueString, 32))
{
diff --git a/base/applications/regedit/find.c b/base/applications/regedit/find.c
index e20d01684f8..e3bb26ee404 100644
--- a/base/applications/regedit/find.c
+++ b/base/applications/regedit/find.c
@@ -684,7 +684,7 @@ BOOL FindNext(HWND hWnd)
free(pszFoundValueName);
SetFocus(g_pChildWnd->hListWnd);
}
- return fSuccess;
+ return fSuccess || s_bAbort;
}
static INT_PTR CALLBACK FindDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
@@ -807,7 +807,7 @@ void FindDialog(HWND hWnd)
if (DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_FIND),
hWnd, FindDialogProc, 0) != 0)
{
- if (FindNext(hWnd) == FALSE)
+ if (!FindNext(hWnd))
{
TCHAR msg[128], caption[128];
diff --git a/base/applications/regedit/lang/cs-CZ.rc b/base/applications/regedit/lang/cs-CZ.rc
index 8f36dadaf0d..b412af4c186 100644
--- a/base/applications/regedit/lang/cs-CZ.rc
+++ b/base/applications/regedit/lang/cs-CZ.rc
@@ -54,8 +54,8 @@ BEGIN
MENUITEM "&Exportovat do souboru registru...", ID_REGISTRY_EXPORTREGISTRYFILE
MENUITEM SEPARATOR
- MENUITEM "Load Hive...", ID_REGISTRY_LOADHIVE, GRAYED
- MENUITEM "Unload Hive...", ID_REGISTRY_UNLOADHIVE, GRAYED
+ MENUITEM "Načíst strom registru...", ID_REGISTRY_LOADHIVE, GRAYED
+ MENUITEM "Uvolnit strom registru...", ID_REGISTRY_UNLOADHIVE, GRAYED
MENUITEM SEPARATOR
MENUITEM "&Připojit síťový registr...",
ID_REGISTRY_CONNECTNETWORKREGISTRY
@@ -79,19 +79,19 @@ BEGIN
MENUITEM "&Řetězec", ID_EDIT_NEW_STRINGVALUE
MENUITEM "&Binární hodnota", ID_EDIT_NEW_BINARYVALUE
MENUITEM "&Hodnota DWORD", ID_EDIT_NEW_DWORDVALUE
- MENUITEM "&Multi-String Value", ID_EDIT_NEW_MULTISTRINGVALUE
- MENUITEM "&Expandable String Value", ID_EDIT_NEW_EXPANDABLESTRINGVALUE
+ MENUITEM "&Víceřetězcová hodnota", ID_EDIT_NEW_MULTISTRINGVALUE
+ MENUITEM "&Rozšiřitelná řetězcová hodnota", ID_EDIT_NEW_EXPANDABLESTRINGVALUE
END
MENUITEM SEPARATOR
- MENUITEM "&Oprávnění...", ID_EDIT_PERMISSIONS
+ MENUITEM "Oprá&vnění...", ID_EDIT_PERMISSIONS
MENUITEM SEPARATOR
MENUITEM "&Odstranit\tDel", ID_EDIT_DELETE
MENUITEM "&Přejmenovat", ID_EDIT_RENAME
MENUITEM SEPARATOR
MENUITEM "Z&kopírovat název klíče", ID_EDIT_COPYKEYNAME
MENUITEM SEPARATOR
- MENUITEM "&Hledat\tCtrl+F", ID_EDIT_FIND
- MENUITEM "Hledat &další\tF3", ID_EDIT_FINDNEXT
+ MENUITEM "&Najít\tCtrl+F", ID_EDIT_FIND
+ MENUITEM "Najít &další\tF3", ID_EDIT_FINDNEXT
END
POPUP "&Zobrazit"
BEGIN
@@ -103,10 +103,8 @@ BEGIN
END
POPUP "&Oblíbené"
BEGIN
- MENUITEM "&Přidat k oblíbeným", ID_FAVOURITES_ADDTOFAVOURITES
- , GRAYED
- MENUITEM "&Odebrat z oblíbených", ID_FAVOURITES_REMOVEFAVOURITE
- , GRAYED
+ MENUITEM "&Přidat k oblíbeným", ID_FAVOURITES_ADDTOFAVOURITES, GRAYED
+ MENUITEM "&Odebrat z oblíbených", ID_FAVOURITES_REMOVEFAVOURITE, GRAYED
END
POPUP "&Nápověda"
BEGIN
@@ -135,32 +133,32 @@ BEGIN
MENUITEM "&Řetězec", ID_EDIT_NEW_STRINGVALUE
MENUITEM "&Binární hodnota", ID_EDIT_NEW_BINARYVALUE
MENUITEM "&Hodnota DWORD", ID_EDIT_NEW_DWORDVALUE
- MENUITEM "&Multi-String Value", ID_EDIT_NEW_MULTISTRINGVALUE
- MENUITEM "&Expandable String Value", ID_EDIT_NEW_EXPANDABLESTRINGVALUE
+ MENUITEM "&Víceřetězcová hodnota", ID_EDIT_NEW_MULTISTRINGVALUE
+ MENUITEM "&Rozšiřitelná řetězcová hodnota", ID_EDIT_NEW_EXPANDABLESTRINGVALUE
END
END
POPUP ""
BEGIN
- MENUITEM "Expand/Collapse", ID_TREE_EXPANDBRANCH
- POPUP "&New"
+ MENUITEM "Rozbalit/Sbalit", ID_TREE_EXPANDBRANCH
+ POPUP "&Nový"
BEGIN
- MENUITEM "&Key", ID_EDIT_NEW_KEY
+ MENUITEM "&Klíč", ID_EDIT_NEW_KEY
MENUITEM SEPARATOR
- MENUITEM "&String Value", ID_EDIT_NEW_STRINGVALUE
- MENUITEM "&Binary Value", ID_EDIT_NEW_BINARYVALUE
- MENUITEM "&DWORD Value", ID_EDIT_NEW_DWORDVALUE
- MENUITEM "&Multi-String Value", ID_EDIT_NEW_MULTISTRINGVALUE
- MENUITEM "&Expandable String Value", ID_EDIT_NEW_EXPANDABLESTRINGVALUE
+ MENUITEM "&Řetězec", ID_EDIT_NEW_STRINGVALUE
+ MENUITEM "&Binární hodnota", ID_EDIT_NEW_BINARYVALUE
+ MENUITEM "&Hodnota DWORD", ID_EDIT_NEW_DWORDVALUE
+ MENUITEM "&Víceřetězcová hodnota", ID_EDIT_NEW_MULTISTRINGVALUE
+ MENUITEM "&Rozšiřitelná řetězcová hodnota", ID_EDIT_NEW_EXPANDABLESTRINGVALUE
END
- MENUITEM "&Find", ID_EDIT_FIND
+ MENUITEM "&Najít", ID_EDIT_FIND
MENUITEM SEPARATOR
- MENUITEM "&Delete", ID_TREE_DELETE
- MENUITEM "&Rename", ID_TREE_RENAME
+ MENUITEM "&Odstranit", ID_TREE_DELETE
+ MENUITEM "&Přejmenovat", ID_TREE_RENAME
MENUITEM SEPARATOR
- MENUITEM "&Export", ID_TREE_EXPORT
- MENUITEM "&Permissions...", ID_TREE_PERMISSIONS, GRAYED
+ MENUITEM "&Exportovat", ID_TREE_EXPORT
+ MENUITEM "Oprá&vnění...", ID_TREE_PERMISSIONS, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME
+ MENUITEM "Z&kopírovat název klíče", ID_EDIT_COPYKEYNAME
END
END
@@ -287,22 +285,22 @@ BEGIN
ID_EDIT_DELETE "Smaže výběr"
ID_EDIT_RENAME "Přejmenuje výběr"
ID_EDIT_COPYKEYNAME "Zkopíruje název klíče do schránky"
- ID_EDIT_FIND "Hledá textový řetězec v klíči, položkách, nebo datech"
- ID_EDIT_FINDNEXT "Hledá další výskyt textu zadaného v předchozím hledání"
+ ID_EDIT_FIND "Vyhledá textový řetězec v klíči, položkách, nebo datech"
+ ID_EDIT_FINDNEXT "Vyhledá další výskyt textu zadaného v předchozím hledání"
END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_ERROR "Chyba"
- IDS_WARNING "Upozornění"
- IDS_BAD_KEY "Can't query key '%s'"
+ IDS_ERROR "Chyba"
+ IDS_WARNING "Upozornění"
+ IDS_BAD_KEY "Nelze se dotázat klíče '%s'"
IDS_BAD_VALUE "Nelze se dotázat položky '%s'"
IDS_UNSUPPORTED_TYPE "Nelze upravovat klíče tohoto typu (%ld)"
IDS_TOO_BIG_VALUE "Položka je příliš velká (%ld)"
IDS_MULTI_SZ_EMPTY_STRING "Položky typu REG_MULTI_SZ nemohou obsahovat prázdné řetezce.\nPrázdné řetězce byly odebrány ze seznamu."
- IDS_QUERY_DELETE_KEY_ONE "Are you sure you want to delete this key?"
- IDS_QUERY_DELETE_KEY_MORE "Are you sure you want to delete these keys?"
- IDS_QUERY_DELETE_KEY_CONFIRM "Confirm Key Delete"
+ IDS_QUERY_DELETE_KEY_ONE "Opravdu chcete odstranit tento klíč?"
+ IDS_QUERY_DELETE_KEY_MORE "Opravdu chcete odstranit tyto klíče?"
+ IDS_QUERY_DELETE_KEY_CONFIRM "Potvrzení smazání klíče"
IDS_QUERY_DELETE_ONE "Opravdu chcete odstranit tuto položku?"
IDS_QUERY_DELETE_MORE "Opravdu chcete odstranit tyto položky?"
IDS_QUERY_DELETE_CONFIRM "Potvrzení odstranění položky"
@@ -310,8 +308,8 @@ BEGIN
IDS_ERR_DELETEVALUE "Nelze odstranit všechny vybrané položky!"
IDS_ERR_RENVAL_CAPTION "Chyba při přejmenování položky"
IDS_ERR_RENVAL_TOEMPTY "Nelze přejmenovat %s. Vybraná položka je prázdná. Vyzkoušejte jiný název."
- IDS_NEW_KEY "New Key #%d"
- IDS_NEW_VALUE "New Value #%d"
+ IDS_NEW_KEY "Nový klíč #%d"
+ IDS_NEW_VALUE "Nová hodnota #%d"
END
STRINGTABLE DISCARDABLE
@@ -328,7 +326,7 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_FLT_REGFILE "Registration File"
+ IDS_FLT_REGFILE "Soubor registru"
IDS_FLT_REGFILES "Soubory registru"
IDS_FLT_REGFILES_FLT "*.reg"
IDS_FLT_REGEDIT4 "Soubory registru Win9x/NT4 (REGEDIT4)"
@@ -362,10 +360,10 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_EXPAND "&Expand"
- IDS_COLLAPSE "&Collapse"
- IDS_GOTO_SUGGESTED_KEY "&Go to '%s'"
- IDS_FINISHEDFIND "Finished searching through the registry."
+ IDS_EXPAND "&Rozbalit"
+ IDS_COLLAPSE "&Sbalit"
+ IDS_GOTO_SUGGESTED_KEY "&Jít na '%s'"
+ IDS_FINISHEDFIND "Prohledávání registru bylo dokončeno."
END
/*****************************************************************/
@@ -376,70 +374,69 @@ END
*/
IDD_EXPORTRANGE DIALOGEX DISCARDABLE 50, 50, 370, 50
-STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
- WS_BORDER
+STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER
FONT 8, "MS Shell Dlg"
BEGIN
- GROUPBOX "Export Range",IDC_STATIC,2,0,366,48
- CONTROL "&All",IDC_EXPORT_ALL,"Button",BS_AUTORADIOBUTTON,10,10, 29,11
- CONTROL "S&elected Branch",IDC_EXPORT_BRANCH,"Button",BS_AUTORADIOBUTTON,10,22, 100,11
+ GROUPBOX "Rozsah exportu",IDC_STATIC,2,0,366,48
+ CONTROL "&Vše",IDC_EXPORT_ALL,"Button",BS_AUTORADIOBUTTON,10,10, 29,11
+ CONTROL "V&ybraná větev",IDC_EXPORT_BRANCH,"Button",BS_AUTORADIOBUTTON,10,22, 100,11
EDITTEXT IDC_EXPORT_BRANCH_TEXT,30,34,335,12
END
IDD_ADDFAVORITES DIALOGEX DISCARDABLE 0, 0, 186, 46
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Add to Favorites"
+CAPTION "Přidat do Oblíbených"
FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "OK",IDOK,129,7,50,14
- PUSHBUTTON "Cancel",IDCANCEL,129,24,50,14
- LTEXT "&Favorite Name:",IDC_STATIC,7,7,70,10
+ PUSHBUTTON "Storno",IDCANCEL,129,24,50,14
+ LTEXT "&Název oblíbené položky:",IDC_STATIC,7,7,70,10
EDITTEXT IDC_FAVORITENAME,7,26,110,13,ES_AUTOHSCROLL
END
IDD_REMOVEFAVORITES DIALOGEX DISCARDABLE 0, 0, 164, 135
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Remove Favorites"
+CAPTION "Odebrat z Oblíbených"
FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "OK",IDOK,107,114,50,14
- PUSHBUTTON "Cancel",IDCANCEL,7,114,50,14
+ PUSHBUTTON "Storno",IDCANCEL,7,114,50,14
CONTROL "List1",IDC_FAVORITESLIST,"SysListView32",LVS_LIST |
WS_BORDER | WS_TABSTOP,7,20,150,90
- LTEXT "Select Favorite(s):",IDC_STATIC,7,7,99,12
+ LTEXT "Vyberte Oblíbené:",IDC_STATIC,7,7,99,12
END
IDD_FIND DIALOGEX DISCARDABLE 0, 0, 254, 82
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Find"
+CAPTION "Najít"
FONT 8, "MS Shell Dlg"
BEGIN
- DEFPUSHBUTTON "&Find Next",IDOK,197,7,50,14
- PUSHBUTTON "Cancel",IDCANCEL,197,24,50,14
+ DEFPUSHBUTTON "Najít &další",IDOK,197,7,50,14
+ PUSHBUTTON "Storno",IDCANCEL,197,24,50,14
GROUPBOX "Look at",IDC_STATIC,7,25,63,51
- LTEXT "Fi&nd what:",IDC_STATIC,7,8,37,10
+ LTEXT "&Najít:",IDC_STATIC,7,8,37,10
EDITTEXT IDC_FINDWHAT,47,7,142,13,ES_AUTOHSCROLL
- CONTROL "&Keys",IDC_LOOKAT_KEYS,"Button",BS_AUTOCHECKBOX |
+ CONTROL "&Klíče",IDC_LOOKAT_KEYS,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,14,36,35,8
- CONTROL "&Values",IDC_LOOKAT_VALUES,"Button",BS_AUTOCHECKBOX |
+ CONTROL "&Hodnoty",IDC_LOOKAT_VALUES,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,14,48,36,8
CONTROL "&Data",IDC_LOOKAT_DATA,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,14,60,42,8
- CONTROL "Match &whole string only",IDC_MATCHSTRING,"Button",
+ CONTROL "Hledat pouze &celý řetězec",IDC_MATCHSTRING,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,83,32,94,13
- CONTROL "Match &case",IDC_MATCHCASE,"Button",BS_AUTOCHECKBOX |
+ CONTROL "Rozlišovat &velikost písmen",IDC_MATCHCASE,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,83,48,90,12
END
IDD_FINDING DIALOGEX 0, 0, 145, 50
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP |
WS_CAPTION | WS_SYSMENU
-CAPTION "Find"
+CAPTION "Najít"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
ICON IDI_REGEDIT,IDC_STATIC,7,7,20,20
- DEFPUSHBUTTON "&Cancel",IDCANCEL,93,29,45,14
- LTEXT "Searching the registry...",IDC_STATIC,33,12,83,8
+ DEFPUSHBUTTON "Storno",IDCANCEL,93,29,45,14
+ LTEXT "Probíhá prohledávání registru...",IDC_STATIC,33,12,83,8
END
/*
diff --git a/base/applications/regedit/lang/it-IT.rc b/base/applications/regedit/lang/it-IT.rc
index 47960b8da5b..f5a2fc96540 100644
--- a/base/applications/regedit/lang/it-IT.rc
+++ b/base/applications/regedit/lang/it-IT.rc
@@ -192,7 +192,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP |
CAPTION "Modifica Multi-Stringa"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "&Name:",IDC_STATIC,6,6,134,8
+ LTEXT "&Nome:",IDC_STATIC,6,6,134,8
EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY
LTEXT "&Dati:",IDC_STATIC,6,35,161,8
EDITTEXT IDC_VALUE_DATA,6,46,240,102,ES_MULTILINE |
diff --git a/base/applications/regedit/listview.c b/base/applications/regedit/listview.c
index 6e95a863ff9..12cfa894db6 100644
--- a/base/applications/regedit/listview.c
+++ b/base/applications/regedit/listview.c
@@ -380,7 +380,7 @@ static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSor
if (g_columnToSort == 2) {
/* FIXME: Sort on value */
}
- return g_invertSort ? _tcscmp(r->name, l->name) : _tcscmp(l->name, r->name);
+ return g_invertSort ? _tcsicmp(r->name, l->name) : _tcsicmp(l->name, r->name);
}
BOOL ListWndNotifyProc(HWND hWnd, WPARAM wParam, LPARAM lParam, BOOL *Result)
diff --git a/base/applications/sndvol32/lang/cs-CZ.rc b/base/applications/sndvol32/lang/cs-CZ.rc
index 9f89248021a..abeec0eb9db 100644
--- a/base/applications/sndvol32/lang/cs-CZ.rc
+++ b/base/applications/sndvol32/lang/cs-CZ.rc
@@ -1,3 +1,9 @@
+/* FILE: applications/sndvol32/lang/cs-CZ.rc
+ * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com)
+ * THANKS TO: Denzil, who translated major part of this file
+ * UPDATED: 2010-05-25
+ */
+
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
IDM_MAINMENU MENU DISCARDABLE
@@ -5,7 +11,7 @@ BEGIN
POPUP "&Nastavení"
BEGIN
MENUITEM "&Možnosti", IDC_PROPERTIES
- MENUITEM "&Rozšířené nastevení", IDC_ADVANCED_CONTROLS
+ MENUITEM "&Rozšířené nastavení", IDC_ADVANCED_CONTROLS
MENUITEM SEPARATOR
MENUITEM "&Konec", IDC_EXIT
END
@@ -35,9 +41,9 @@ BEGIN
PUSHBUTTON "&Záznam", IDC_RECORDING, 13,61,47,8, BS_AUTORADIOBUTTON
PUSHBUTTON "&Jiné:", IDC_OTHER, 13,80,42,8, BS_AUTORADIOBUTTON | WS_DISABLED
COMBOBOX IDC_LINE, 55,80,155,50, CBS_DROPDOWNLIST | WS_TABSTOP | WS_DISABLED
- LTEXT "Show the following volume controls:", IDC_LABELCONTROLS, 7, 109, 162, 8
+ LTEXT "Zobrazit tyto ovladače hlasitosti:", IDC_LABELCONTROLS, 7, 109, 162, 8
CONTROL "", IDC_CONTROLS, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | WS_TABSTOP | WS_BORDER, 7, 122, 211, 96
PUSHBUTTON "OK", IDOK, 114,226,50,14
- PUSHBUTTON "Zrušit", IDCANCEL, 168,226,50,14
+ PUSHBUTTON "Storno", IDCANCEL, 168,226,50,14
END
diff --git a/base/setup/usetup/errorcode.h b/base/setup/usetup/errorcode.h
index 4ecc11d35d2..79461a7e39c 100644
--- a/base/setup/usetup/errorcode.h
+++ b/base/setup/usetup/errorcode.h
@@ -65,6 +65,7 @@ typedef enum
ERROR_UPDATE_LOCALESETTINGS,
ERROR_ADDING_KBLAYOUTS,
ERROR_UPDATE_GEOID,
+ ERROR_INSUFFICIENT_DISKSPACE,
ERROR_LAST_ERROR_CODE
}ERROR_NUMBER;
diff --git a/base/setup/usetup/interface/usetup.c b/base/setup/usetup/interface/usetup.c
index 7a97b492c27..57b4efca6bd 100644
--- a/base/setup/usetup/interface/usetup.c
+++ b/base/setup/usetup/interface/usetup.c
@@ -31,6 +31,7 @@
#define NDEBUG
#include
+
/* GLOBALS ******************************************************************/
HANDLE ProcessHeap;
@@ -81,6 +82,8 @@ static PGENERIC_LIST LanguageList = NULL;
static LANGID LanguageId = 0;
+static ULONG RequiredPartitionDiskSpace = ~0;
+
/* FUNCTIONS ****************************************************************/
static VOID
@@ -720,6 +723,7 @@ SetupStartPage(PINPUT_RECORD Ir)
UINT ErrorLine;
ULONG ReturnSize;
PGENERIC_LIST_ENTRY ListEntry;
+ INT IntValue;
CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
@@ -800,6 +804,22 @@ SetupStartPage(PINPUT_RECORD Ir)
return QUIT_PAGE;
}
+ /* Open 'DiskSpaceRequirements' section */
+ if (!SetupFindFirstLineW(SetupInf, L"DiskSpaceRequirements", L"FreeSysPartDiskSpace", &Context))
+ {
+ MUIDisplayError(ERROR_CORRUPT_TXTSETUPSIF, Ir, POPUP_WAIT_ENTER);
+ return QUIT_PAGE;
+ }
+
+ /* Get the 'FreeSysPartDiskSpace' value */
+ if (!SetupGetIntField(&Context, 1, &IntValue))
+ {
+ MUIDisplayError(ERROR_CORRUPT_TXTSETUPSIF, Ir, POPUP_WAIT_ENTER);
+ return QUIT_PAGE;
+ }
+
+ RequiredPartitionDiskSpace = (ULONG)IntValue;
+
/* Start PnP thread */
if (hPnpThread != INVALID_HANDLE_VALUE)
{
@@ -829,7 +849,7 @@ SetupStartPage(PINPUT_RECORD Ir)
while (ListEntry != NULL)
{
- if (!wcscmp(LocaleID, GetListEntryUserData(ListEntry)))
+ if (!wcsicmp(LocaleID, GetListEntryUserData(ListEntry)))
{
DPRINT("found %S in LanguageList\n",GetListEntryUserData(ListEntry));
SetCurrentListEntry(LanguageList, ListEntry);
@@ -843,7 +863,7 @@ SetupStartPage(PINPUT_RECORD Ir)
while (ListEntry != NULL)
{
- if (!wcscmp(LocaleID, GetListEntryUserData(ListEntry)))
+ if (!wcsicmp(LocaleID, GetListEntryUserData(ListEntry)))
{
DPRINT("found %S in LayoutList\n",GetListEntryUserData(ListEntry));
SetCurrentListEntry(LayoutList, ListEntry);
@@ -1381,6 +1401,31 @@ LayoutSettingsPage(PINPUT_RECORD Ir)
return DISPLAY_SETTINGS_PAGE;
}
+static BOOL IsDiskSizeValid(PPARTENTRY PartEntry)
+{
+ ULONGLONG m;
+ /* check for unpartitioned space */
+ m = PartEntry->UnpartitionedLength;
+ m = (m + (1 << 19)) >> 20; /* in MBytes (rounded) */
+ if( m > RequiredPartitionDiskSpace)
+ {
+ return TRUE;
+ }
+
+ // check for partitioned space
+ m = PartEntry->PartInfo[0].PartitionLength.QuadPart;
+ m = (m + (1 << 19)) >> 20; /* in MBytes (rounded) */
+ if( m < RequiredPartitionDiskSpace)
+ {
+ /* partition is too small so ask for another partion */
+ DPRINT1("Partition is too small, required disk space is %lu MB\n", RequiredPartitionDiskSpace);
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
static PAGE_NUMBER
SelectPartitionPage(PINPUT_RECORD Ir)
@@ -1434,9 +1479,13 @@ SelectPartitionPage(PINPUT_RECORD Ir)
{
if (AutoPartition)
{
- PPARTENTRY PartEntry = PartEntry = PartitionList->CurrentPartition;
+ PPARTENTRY PartEntry = PartitionList->CurrentPartition;
ULONG MaxSize = (PartEntry->UnpartitionedLength + (1 << 19)) >> 20; /* in MBytes (rounded) */
-
+ if(!IsDiskSizeValid(PartitionList->CurrentPartition))
+ {
+ MUIDisplayError(ERROR_INSUFFICIENT_DISKSPACE, Ir, POPUP_WAIT_ANY_KEY);
+ return SELECT_PARTITION_PAGE; /* let the user select another partition */
+ }
CreateNewPartition(PartitionList,
MaxSize,
TRUE);
@@ -1446,6 +1495,11 @@ SelectPartitionPage(PINPUT_RECORD Ir)
}
else
{
+ if(!IsDiskSizeValid(PartitionList->CurrentPartition))
+ {
+ MUIDisplayError(ERROR_INSUFFICIENT_DISKSPACE, Ir, POPUP_WAIT_ANY_KEY);
+ return SELECT_PARTITION_PAGE; /* let the user select another partition */
+ }
return(SELECT_FILE_SYSTEM_PAGE);
}
}
@@ -1489,6 +1543,11 @@ SelectPartitionPage(PINPUT_RECORD Ir)
}
else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_RETURN) /* ENTER */
{
+ if(!IsDiskSizeValid(PartitionList->CurrentPartition))
+ {
+ MUIDisplayError(ERROR_INSUFFICIENT_DISKSPACE, Ir, POPUP_WAIT_ANY_KEY);
+ return SELECT_PARTITION_PAGE; /* let the user select another partition */
+ }
if (PartitionList->CurrentPartition == NULL ||
PartitionList->CurrentPartition->Unpartitioned == TRUE)
{
@@ -3121,7 +3180,7 @@ FileCopyCallback(PVOID Context,
case SPFILENOTIFY_STARTCOPY:
/* Display copy message */
- CONSOLE_SetStatusTextAutoFitX (45 , MUIGetString(STRING_COPYING), (PWSTR)Param1);
+ CONSOLE_SetStatusText(MUIGetString(STRING_COPYING), (PWSTR)Param1);
SetupUpdateMemoryInfo(CopyContext, FALSE);
break;
diff --git a/base/setup/usetup/lang/bg-BG.h b/base/setup/usetup/lang/bg-BG.h
index 23bd1f4ebf3..b6b22fdbf13 100644
--- a/base/setup/usetup/lang/bg-BG.h
+++ b/base/setup/usetup/lang/bg-BG.h
@@ -1488,6 +1488,12 @@ MUI_ERROR bgBGErrorEntries[] =
"Ť áâŕ®©Ş â Ą ¬®¦ ¤ ăáâ ®˘¨ ®§ ç¨âĄ«ď ŁĄ®Łŕ äáŞ®â® Ż®«®¦Ą¨Ą.\n"
"ENTER = ŹŕĄ§ Żă᪠Ą Ş®¬Żîâęŕ "
},
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "Not enough free space in the selected partition.\n"
+ " * Ť â¨áĄâĄ Ş« ˘¨č, § ¤ Żŕ®¤ę«¦¨âĄ.",
+ NULL
+ },
{
NULL,
NULL
@@ -1626,7 +1632,7 @@ MUI_STRING bgBGStrings[] =
{STRING_TXTSETUPFAILED,
"ŤĄ ˇĄ ¬ĄŕĄ ŕ §¤Ą« '%S'\n˘ TXTSETUP.SIF.\n"},
{STRING_COPYING,
- "\xB3 ‡ ݍá ä ©«: %S"},
+ " ‡ ݍá ä ©«: %S"},
{STRING_SETUPCOPYINGFILES,
"’ĄçĄ § Ż¨á˘ Ą ä ©«®˘ĄâĄ..."},
{STRING_REGHIVEUPDATE,
diff --git a/base/setup/usetup/lang/cs-CZ.h b/base/setup/usetup/lang/cs-CZ.h
index b3397e14751..428b0f55fea 100644
--- a/base/setup/usetup/lang/cs-CZ.h
+++ b/base/setup/usetup/lang/cs-CZ.h
@@ -1,7 +1,7 @@
/* FILE: setup/usetup/lang/cs-CZ.rc
* TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com)
* THANKS TO: preston
- * UPDATED: 2008-06-05
+ * UPDATED: 2010-05-25
*/
#pragma once
@@ -1481,8 +1481,14 @@ MUI_ERROR csCZErrorEntries[] =
},
{
//ERROR_UPDATE_GEOID,
- "Setup could not set the geo id.\n"
- "ENTER = Reboot computer"
+ "Nepodaýilo se nastavit geo id.\n"
+ "ENTER = Restartovat poźˇtaź"
+ },
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "Na zvolen‚m oddˇlu nenˇ dost voln‚ho mˇsta.\n"
+ " * Pokraźujte stisknutˇm libovoln‚ kl vesy.",
+ NULL
},
{
NULL,
@@ -1622,7 +1628,7 @@ MUI_STRING csCZStrings[] =
{STRING_TXTSETUPFAILED,
"Nepodaýilo se najˇt sekci '%S' v souboru\n TXTSETUP.SIF.\n"},
{STRING_COPYING,
- "\xB3 Kopˇruji soubor: %S"},
+ " Kopˇruji soubor: %S"},
{STRING_SETUPCOPYINGFILES,
"Instalace kopˇruje soubory..."},
{STRING_REGHIVEUPDATE,
@@ -1662,7 +1668,7 @@ MUI_STRING csCZStrings[] =
{STRING_HDDINFOUNK1,
"%I64u %s Harddisk %lu (Port=%hu, Bus=%hu, Id=%hu)."},
{STRING_HDDINFOUNK2,
- " %c%c Type %lu %I64u %s"},
+ " %c%c Typ %lu %I64u %s"},
{STRING_HDINFOPARTDELETE,
"na %I64u %s Harddisk %lu (Port=%hu, Bus=%hu, Id=%hu) na %wZ."},
{STRING_HDDINFOUNK3,
diff --git a/base/setup/usetup/lang/de-DE.h b/base/setup/usetup/lang/de-DE.h
index e21b2ffc001..4686873427a 100644
--- a/base/setup/usetup/lang/de-DE.h
+++ b/base/setup/usetup/lang/de-DE.h
@@ -1477,7 +1477,13 @@ MUI_ERROR deDEErrorEntries[] =
"Setup konnte den geografischen Standort nicht einstellen.\n"
"ENTER = Computer neu starten"
},
-{
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "Nicht genug Speicherplatz auf der gew„hlten Partition vorhanden.\n"
+ " * Eine beliebige Taste zum Fortsetzen drcken.",
+ NULL
+ },
+ {
NULL,
NULL
}
@@ -1615,7 +1621,7 @@ MUI_STRING deDEStrings[] =
{STRING_TXTSETUPFAILED,
"Setup konnte die '%S'-Sektion\nin TXTSETUP.SIF nicht finden.\n"},
{STRING_COPYING,
- "\xB3 Kopiere Datei: %S"},
+ " Kopiere Datei: %S"},
{STRING_SETUPCOPYINGFILES,
"Setup kopiert Dateien..."},
{STRING_REGHIVEUPDATE,
diff --git a/base/setup/usetup/lang/el-GR.h b/base/setup/usetup/lang/el-GR.h
index e04f530f674..66de19aa71a 100644
--- a/base/setup/usetup/lang/el-GR.h
+++ b/base/setup/usetup/lang/el-GR.h
@@ -1644,7 +1644,7 @@ MUI_STRING elGRStrings[] =
{STRING_TXTSETUPFAILED,
"Setup failed to find the '%S' section\nin TXTSETUP.SIF.\n"},
{STRING_COPYING,
- "\xB3 €¤« š¨áś« «¦ ¨®śĺ¦: %S"},
+ " €¤« š¨áś« «¦ ¨®śĺ¦: %S"},
{STRING_SETUPCOPYINGFILES,
"† śšˇ«á©«©ž ¤« š¨áś ¨®śĺ..."},
{STRING_REGHIVEUPDATE,
diff --git a/base/setup/usetup/lang/en-US.h b/base/setup/usetup/lang/en-US.h
index ac694c98c54..9038002050d 100644
--- a/base/setup/usetup/lang/en-US.h
+++ b/base/setup/usetup/lang/en-US.h
@@ -93,7 +93,7 @@ static MUI_ENTRY enUSWelcomePageEntries[] =
{
8,
19,
- "\x07 Press L to view the ReactOS Licensing Terms and Conditions",
+ "\x07 Press L to view the ReactOS Licensing Terms and Conditions.",
TEXT_STYLE_NORMAL
},
{
@@ -1476,6 +1476,12 @@ MUI_ERROR enUSErrorEntries[] =
"Setup could not set the geo id.\n"
"ENTER = Reboot computer"
},
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "Not enough free space in the selected partition.\n"
+ " * Press any key to continue.",
+ NULL
+ },
{
NULL,
NULL
@@ -1613,7 +1619,7 @@ MUI_STRING enUSStrings[] =
{STRING_TXTSETUPFAILED,
"Setup failed to find the '%S' section\nin TXTSETUP.SIF.\n"},
{STRING_COPYING,
- "\xB3 Copying file: %S"},
+ " Copying file: %S"},
{STRING_SETUPCOPYINGFILES,
"Setup is copying files..."},
{STRING_REGHIVEUPDATE,
diff --git a/base/setup/usetup/lang/es-ES.h b/base/setup/usetup/lang/es-ES.h
index d951d6b564f..bc2fe1340af 100644
--- a/base/setup/usetup/lang/es-ES.h
+++ b/base/setup/usetup/lang/es-ES.h
@@ -18,7 +18,7 @@ static MUI_ENTRY esESLanguagePageEntries[] =
{
6,
8,
- "Selecci˘n de idioma",
+ "Selecci˘n del idioma",
TEXT_STYLE_NORMAL
},
{
@@ -94,7 +94,7 @@ static MUI_ENTRY esESWelcomePageEntries[] =
{
8,
19,
- "\x07 Presione L para ver las condiciones y t‚rminos de licencia",
+ "\x07 Presione L para ver las condiciones y t‚rminos de licencia.",
TEXT_STYLE_NORMAL
},
{
@@ -194,18 +194,24 @@ static MUI_ENTRY esESIntroPageEntries[] =
{
8,
19,
- "- El comprobador de integridad del sistema de archivos no est aŁn implementado.",
+ "- El comprobador de integridad del sistema de archivos no est aŁn",
TEXT_STYLE_NORMAL
},
{
8,
- 23,
- "\x07 Presione ENTER para instalar ReactOS.",
+ 20,
+ " implementado.",
TEXT_STYLE_NORMAL
},
{
8,
25,
+ "\x07 Presione ENTER para instalar ReactOS.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 27,
"\x07 Presione F3 para salir sin instalar ReactOS.",
TEXT_STYLE_NORMAL
},
@@ -358,7 +364,7 @@ static MUI_ENTRY esESDevicePageEntries[] =
{
6,
8,
- "La lista inferior muestra la configuraci˘n del dispositivo actual.",
+ "La lista inferior muestra la configuraci˘n actual de dispositivos.",
TEXT_STYLE_NORMAL
},
{
@@ -1469,15 +1475,21 @@ MUI_ERROR esESErrorEntries[] =
},
{
//ERROR_ADDING_KBLAYOUTS,
- "Setup failed to add keyboard layouts to registry.\n"
- "ENTER = Reboot computer"
+ "El instalador no ha podido agregar los layouts de teclado al registro.\n"
+ "ENTER = Reiniciar el equipo"
},
{
//ERROR_UPDATE_GEOID,
- "Setup could not set the geo id.\n"
- "ENTER = Reboot computer"
+ "El instalador no ha podido configurar el ID geogr fico.\n"
+ "ENTER = Reiniciar el equipo"
},
-{
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "No hay suficiente espacio disponible en la partici˘n seleccionada.\n"
+ " * Presione una tecla para continuar.",
+ NULL
+ },
+ {
NULL,
NULL
}
@@ -1592,7 +1604,7 @@ MUI_STRING esESStrings[] =
{STRING_INSTALLDELETEPARTITION,
" ENTER = Instalar D = Borrar Partici˘n F3 = Salir"},
{STRING_PARTITIONSIZE,
- "Tamańo de la nueva partici˘n:"},
+ "Tama¤o de la nueva partici˘n:"},
{STRING_CHOOSENEWPARTITION,
"Ha elegido crear una nueva partici˘n en"},
{STRING_HDDSIZE,
@@ -1614,7 +1626,7 @@ MUI_STRING esESStrings[] =
{STRING_TXTSETUPFAILED,
"El instalador fall˘ al buscar la secci˘n\nin TXTSETUP.SIF.\n"},
{STRING_COPYING,
- "\xB3 Copiando archivo: %S"},
+ " Copiando archivo: %S"},
{STRING_SETUPCOPYINGFILES,
"El instalador est copiando archivos..."},
{STRING_REGHIVEUPDATE,
@@ -1690,6 +1702,6 @@ MUI_STRING esESStrings[] =
{STRING_GB,
"GB"},
{STRING_ADDKBLAYOUTS,
- "Adding keyboard layouts"},
+ "A¤adiendo disposici˘n de teclado"},
{0, 0}
};
diff --git a/base/setup/usetup/lang/et-EE.h b/base/setup/usetup/lang/et-EE.h
index 4a1f7bda62b..f0b7e8bd328 100644
--- a/base/setup/usetup/lang/et-EE.h
+++ b/base/setup/usetup/lang/et-EE.h
@@ -1473,6 +1473,12 @@ MUI_ERROR etEEErrorEntries[] =
"Geograafilist asukohta ei ännestunud seadistada.\n"
"ENTER = Taask„ivita arvuti"
},
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "Valitud partitsioonil pole piisavalt ruumi.\n"
+ " * Vajuta suvalist klahvi, et j„tkata.",
+ NULL
+ },
{
NULL,
NULL
@@ -1609,9 +1615,9 @@ MUI_STRING etEEStrings[] =
{STRING_REBOOTCOMPUTER,
"ENTER = Taask„ivita arvuti"},
{STRING_TXTSETUPFAILED,
- "TXTSETUP.SIF failist ei leitud '%S' sektsiooni\n"},
+ "TXTSETUP.SIF failist ei leitud '%S' sektsiooni\n"},
{STRING_COPYING,
- "\xB3 Kopeerimine: %S"},
+ " Kopeerimine: %S"},
{STRING_SETUPCOPYINGFILES,
"Failide kopeerimine..."},
{STRING_REGHIVEUPDATE,
diff --git a/base/setup/usetup/lang/fr-FR.h b/base/setup/usetup/lang/fr-FR.h
index ae037aba25f..aa3b3df809a 100644
--- a/base/setup/usetup/lang/fr-FR.h
+++ b/base/setup/usetup/lang/fr-FR.h
@@ -1489,6 +1489,12 @@ MUI_ERROR frFRErrorEntries[] =
"Setup could not set the geo id.\n"
"ENTER = Reboot computer"
},
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "Not enough free space in the selected partition.\n"
+ " * Press any key to continue.",
+ NULL
+ },
{
NULL,
NULL
@@ -1627,7 +1633,7 @@ MUI_STRING frFRStrings[] =
{STRING_TXTSETUPFAILED,
"Setup n'a pu trouver la section '%S'\ndans TXTSETUP.SIF.\n"},
{STRING_COPYING,
- "\xB3 Copie du fichier: %S"},
+ " Copie du fichier: %S"},
{STRING_SETUPCOPYINGFILES,
"Setup copie les fichiers..."},
{STRING_REGHIVEUPDATE,
diff --git a/base/setup/usetup/lang/it-IT.h b/base/setup/usetup/lang/it-IT.h
index bb220000c84..3b4ac5670cd 100644
--- a/base/setup/usetup/lang/it-IT.h
+++ b/base/setup/usetup/lang/it-IT.h
@@ -94,7 +94,7 @@ static MUI_ENTRY itITWelcomePageEntries[] =
{
8,
19,
- "\x07 Premere L per vedere i termini e condizioni della licenza",
+ "\x07 Premere L per vedere i termini e condizioni della licenza.",
TEXT_STYLE_NORMAL
},
{
@@ -158,7 +158,7 @@ static MUI_ENTRY itITIntroPageEntries[] =
{
6,
12,
- "Ci sono delle limitazioni:",
+ "Si applicano le seguenti limitazioni:",
TEXT_STYLE_NORMAL
},
{
@@ -358,7 +358,7 @@ static MUI_ENTRY itITDevicePageEntries[] =
{
6,
8,
- "La lista inferiore mostra la configurazione della periferica corrente.",
+ "L'elenco che segue mostra le impostazioni correnti delle periferiche.",
TEXT_STYLE_NORMAL
},
{
@@ -382,7 +382,7 @@ static MUI_ENTRY itITDevicePageEntries[] =
{
3,
14,
- "Nazionalit… tastiera:",
+ "Layout di tastiera:",
TEXT_STYLE_NORMAL
},
{
@@ -393,7 +393,7 @@ static MUI_ENTRY itITDevicePageEntries[] =
},
{
25,
- 16, "Procedere con questa configurazione",
+ 16, "Accettare queste impostazioni",
TEXT_STYLE_NORMAL
},
{
@@ -423,7 +423,7 @@ static MUI_ENTRY itITDevicePageEntries[] =
{
6,
24,
- "\"Procedere con questa configurazione\" e premere INVIO.",
+ "\"Accettare queste impostazioni\" e premere INVIO.",
TEXT_STYLE_NORMAL
},
{
@@ -1474,8 +1474,14 @@ MUI_ERROR itITErrorEntries[] =
},
{
//ERROR_UPDATE_GEOID,
- "Setup could not set the geo id.\n"
- "ENTER = Reboot computer"
+ "Setup non ha potuto impostare l'id geografico.\n"
+ "INVIO = Riavviare il computer"
+ },
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "Lo spazio disponibile nella partizione selezionata Š insufficiente.\n"
+ " * Premere un tasto qualsiasi per continuare.",
+ NULL
},
{
NULL,
@@ -1615,7 +1621,7 @@ MUI_STRING itITStrings[] =
{STRING_TXTSETUPFAILED,
"Setup non ha trovato la sezione '%S' \nin TXTSETUP.SIF.\n"},
{STRING_COPYING,
- "\xB3 Copia di: %S"},
+ " Copia di: %S"},
{STRING_SETUPCOPYINGFILES,
"Copia dei file in corso..."},
{STRING_REGHIVEUPDATE,
diff --git a/base/setup/usetup/lang/ja-JP.h b/base/setup/usetup/lang/ja-JP.h
index af7ccdf2a7e..03b6ec1841d 100644
--- a/base/setup/usetup/lang/ja-JP.h
+++ b/base/setup/usetup/lang/ja-JP.h
@@ -1477,6 +1477,12 @@ MUI_ERROR jaJPErrorEntries[] =
"ľŻÄ±ŻĚßĘ geo id ¦ ľŻĂ˛ ĂŢ·ĎľÝ ĂŢĽŔˇ\n"
"ENTER = şÝËß°ŔÉ »˛·ÄŢł"
},
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "Not enough free space in the selected partition.\n"
+ " * Press any key to continue.",
+ NULL
+ },
{
NULL,
NULL
@@ -1614,7 +1620,7 @@ MUI_STRING jaJPStrings[] =
{STRING_TXTSETUPFAILED,
"ľŻÄ±ŻĚßĘ TXTSETUP.SIF É '%S' ľ¸Ľ®ÝÉ ąÝĽÂĆ\nĽŻĘ߲ ĽĎĽŔˇ\n"},
{STRING_COPYING,
- "\xB3 şËß° ÁłÉ ̧˛Ů: %S"},
+ " şËß° ÁłÉ ̧˛Ů: %S"},
{STRING_SETUPCOPYINGFILES,
"ľŻÄ±ŻĚßĘ Ě§˛Ů¦ şËß° ĽĂ ˛Ď˝..."},
{STRING_REGHIVEUPDATE,
diff --git a/base/setup/usetup/lang/lt-LT.h b/base/setup/usetup/lang/lt-LT.h
index a0a9eb485bf..7020ebbaba1 100644
--- a/base/setup/usetup/lang/lt-LT.h
+++ b/base/setup/usetup/lang/lt-LT.h
@@ -1486,6 +1486,12 @@ MUI_ERROR ltLTErrorEntries[] =
"Setup could not set the geo id.\n"
"ENTER = Reboot computer"
},
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "Not enough free space in the selected partition.\n"
+ " * Press any key to continue.",
+ NULL
+ },
{
NULL,
NULL
@@ -1624,7 +1630,7 @@ MUI_STRING ltLTStrings[] =
{STRING_TXTSETUPFAILED,
"Setup failed to find the '%S' section\nin TXTSETUP.SIF.\n"},
{STRING_COPYING,
- "\xB3 Copying file: %S"},
+ " Copying file: %S"},
{STRING_SETUPCOPYINGFILES,
"Setup is copying files..."},
{STRING_REGHIVEUPDATE,
diff --git a/base/setup/usetup/lang/nl-NL.h b/base/setup/usetup/lang/nl-NL.h
index eba2d93ad5c..0141359d290 100644
--- a/base/setup/usetup/lang/nl-NL.h
+++ b/base/setup/usetup/lang/nl-NL.h
@@ -1504,6 +1504,12 @@ MUI_ERROR nlNLErrorEntries[] =
"Setup kan de geografische positie niet instellen.\n"
"ENTER = Reboot computer"
},
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "Not enough free space in the selected partition.\n"
+ " * Press any key to continue.",
+ NULL
+ },
{
NULL,
NULL
@@ -1642,7 +1648,7 @@ MUI_STRING nlNLStrings[] =
{STRING_TXTSETUPFAILED,
"Setup kan de '%S' sectie niet vinden\nin TXTSETUP.SIF.\n"},
{STRING_COPYING,
- "\xB3 Kopieeren bestand: %S"},
+ " Kopieeren bestand: %S"},
{STRING_SETUPCOPYINGFILES,
"Setup is bestand aan het kopieeren..."},
{STRING_REGHIVEUPDATE,
diff --git a/base/setup/usetup/lang/pl-PL.h b/base/setup/usetup/lang/pl-PL.h
index 8d4262d58cd..de0a55fcd5c 100644
--- a/base/setup/usetup/lang/pl-PL.h
+++ b/base/setup/usetup/lang/pl-PL.h
@@ -1485,6 +1485,12 @@ MUI_ERROR plPLErrorEntries[] =
"Instalator nie m˘g ustawi† lokalizacji geograficznej.\n"
"ENTER = Restart komputera"
},
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "Brak wystarczajĄcej wolnej przestrzeni w wybranej partycji.\n"
+ " * Nacinij dowolny klawisz aby kontynuowa†.",
+ NULL
+ },
{
NULL,
NULL
@@ -1623,7 +1629,7 @@ MUI_STRING plPLStrings[] =
{STRING_TXTSETUPFAILED,
"Instalator nie by w stanie odnaleǠ sekji '%S'\nw pliku TXTSETUP.SIF.\n"},
{STRING_COPYING,
- "\xB3 Kopiowanie plik˘w: %S"},
+ " Kopiowanie plik˘w: %S"},
{STRING_SETUPCOPYINGFILES,
"Instalator kopiuje pliki..."},
{STRING_REGHIVEUPDATE,
diff --git a/base/setup/usetup/lang/ru-RU.h b/base/setup/usetup/lang/ru-RU.h
index 7e55b9700bb..b74d17b8e1a 100644
--- a/base/setup/usetup/lang/ru-RU.h
+++ b/base/setup/usetup/lang/ru-RU.h
@@ -1477,6 +1477,12 @@ MUI_ERROR ruRUErrorEntries[] =
"Setup could not set the geo id.\n"
"ENTER = Reboot computer"
},
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "Not enough free space in the selected partition.\n"
+ " * Press any key to continue.",
+ NULL
+ },
{
NULL,
NULL
@@ -1615,7 +1621,7 @@ MUI_STRING ruRUStrings[] =
{STRING_TXTSETUPFAILED,
"Źŕ®Łŕ ¬¬ ăáâ ®˘Ş¨ Ą á¬®Ł« ©â¨ ᥪć¨î '%S'\n˘ ä ©«Ą TXTSETUP.SIF.\n"},
{STRING_COPYING,
- "\xB3 Š®Ż¨ŕ®˘ ¨Ą: %S"},
+ " Š®Ż¨ŕ®˘ ¨Ą: %S"},
{STRING_SETUPCOPYINGFILES,
"Źŕ®Łŕ ¬¬ ăáâ ®˘Ş¨ Ş®Ż¨ŕăĄâ ä ©«ë..."},
{STRING_REGHIVEUPDATE,
diff --git a/base/setup/usetup/lang/sk-SK.h b/base/setup/usetup/lang/sk-SK.h
index 5078f08139f..5bb0d60fb53 100644
--- a/base/setup/usetup/lang/sk-SK.h
+++ b/base/setup/usetup/lang/sk-SK.h
@@ -1487,6 +1487,12 @@ MUI_ERROR skSKErrorEntries[] =
"Inçtal tor nemohol nastaviś geo id.\n"
"ENTER = Reçtart poźˇtaźa"
},
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "Not enough free space in the selected partition.\n"
+ " * Press any key to continue.",
+ NULL
+ },
{
NULL,
NULL
@@ -1625,7 +1631,7 @@ MUI_STRING skSKStrings[] =
{STRING_TXTSETUPFAILED,
"Inçtal tor zlyhal pri h–adanˇ sekcie '%S'\nv sŁbore TXTSETUP.SIF.\n"},
{STRING_COPYING,
- "\xB3 Kopˇruje sa sŁbor: %S"},
+ " Kopˇruje sa sŁbor: %S"},
{STRING_SETUPCOPYINGFILES,
"Inçtal tor kopˇruje sŁbory..."},
{STRING_REGHIVEUPDATE,
diff --git a/base/setup/usetup/lang/sv-SE.h b/base/setup/usetup/lang/sv-SE.h
index 0dbffdc453c..17b0fa5ddad 100644
--- a/base/setup/usetup/lang/sv-SE.h
+++ b/base/setup/usetup/lang/sv-SE.h
@@ -1477,6 +1477,12 @@ MUI_ERROR svSEErrorEntries[] =
"Setup could not set the geo id.\n"
"ENTER = Reboot computer"
},
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "Not enough free space in the selected partition.\n"
+ " * Press any key to continue.",
+ NULL
+ },
{
NULL,
NULL
@@ -1614,7 +1620,7 @@ MUI_STRING svSEStrings[] =
{STRING_TXTSETUPFAILED,
"Setup failed to find the '%S' section\nin TXTSETUP.SIF.\n"},
{STRING_COPYING,
- "\xB3 Copying file: %S"},
+ " Copying file: %S"},
{STRING_SETUPCOPYINGFILES,
"Setup is copying files..."},
{STRING_REGHIVEUPDATE,
diff --git a/base/setup/usetup/lang/uk-UA.h b/base/setup/usetup/lang/uk-UA.h
index ba3fd009623..7f7a7a7b7e1 100644
--- a/base/setup/usetup/lang/uk-UA.h
+++ b/base/setup/usetup/lang/uk-UA.h
@@ -1483,6 +1483,12 @@ MUI_ERROR ukUAErrorEntries[] =
"ŤĄ ˘¤ «®áě ˘áâ ®˘¨â¨ geo id.\n"
"ENTER = ŹĄŕĄ§ ˘ â ¦¨â¨ Ş®¬Ż'îâĄŕ"
},
+ {
+ //ERROR_INSUFFICIENT_DISKSPACE,
+ "Not enough free space in the selected partition.\n"
+ " * Press any key to continue.",
+ NULL
+ },
{
NULL,
NULL
@@ -1620,7 +1626,7 @@ MUI_STRING ukUAStrings[] =
{STRING_TXTSETUPFAILED,
"‚áâ ®˘«î˘ ç Ą §¬iŁ § ©â¨ ᥪćiî '%S' \n˘ ä ©«i TXTSETUP.SIF.\n"},
{STRING_COPYING,
- "\xB3 Š®Żiî˘ ď: %S"},
+ " Š®Żiî˘ ď: %S"},
{STRING_SETUPCOPYINGFILES,
"‚áâ ®˘«î˘ ç Ş®Żiîó ä ©«¨..."},
{STRING_REGHIVEUPDATE,
diff --git a/base/setup/welcome/lang/es-ES.rc b/base/setup/welcome/lang/es-ES.rc
index 8d95d5cc1a5..3d44ee308d0 100644
--- a/base/setup/welcome/lang/es-ES.rc
+++ b/base/setup/welcome/lang/es-ES.rc
@@ -9,7 +9,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_APPTITLE "ReactOS - Bienvenido"
IDS_DEFAULTTOPICTITLE "ReactOS"
- IDS_DEFAULTTOPICDESC "Bienvenido al Sistema Operativo React.\n\nHaz Click en una opcion a la izquierda."
+ IDS_DEFAULTTOPICDESC "Bienvenido al Sistema Operativo React.\n\nHaz Click en una opción a la izquierda."
// IDS_CHECKTEXT "Mostrar este dialogo otra vez"
// IDS_CLOSETEXT "Salir"
END
diff --git a/base/shell/cmd/cmd.c b/base/shell/cmd/cmd.c
index 59f00eada0a..54ff9b23edc 100644
--- a/base/shell/cmd/cmd.c
+++ b/base/shell/cmd/cmd.c
@@ -156,7 +156,7 @@ BOOL bCanExit = TRUE; /* indicates if this shell is exitable */
BOOL bCtrlBreak = FALSE; /* Ctrl-Break or Ctrl-C hit */
BOOL bIgnoreEcho = FALSE; /* Set this to TRUE to prevent a newline, when executing a command */
INT nErrorLevel = 0; /* Errorlevel of last launched external program */
-BOOL bChildProcessRunning = FALSE;
+CRITICAL_SECTION ChildProcessRunningLock;
BOOL bUnicodeOutput = FALSE;
BOOL bDisableBatchEcho = FALSE;
BOOL bDelayedExpansion = FALSE;
@@ -436,14 +436,12 @@ Execute (LPTSTR Full, LPTSTR First, LPTSTR Rest, PARSED_COMMAND *Cmd)
{
if (IsConsoleProcess(prci.hProcess))
{
- /* FIXME: Protect this with critical section */
- bChildProcessRunning = TRUE;
+ EnterCriticalSection(&ChildProcessRunningLock);
dwChildProcessId = prci.dwProcessId;
WaitForSingleObject (prci.hProcess, INFINITE);
- /* FIXME: Protect this with critical section */
- bChildProcessRunning = FALSE;
+ LeaveCriticalSection(&ChildProcessRunningLock);
GetExitCodeProcess (prci.hProcess, &dwExitCode);
nErrorLevel = (INT)dwExitCode;
@@ -665,9 +663,9 @@ ExecutePipeline(PARSED_COMMAND *Cmd)
SetStdHandle(STD_INPUT_HANDLE, hOldConIn);
/* Wait for all processes to complete */
- bChildProcessRunning = TRUE;
+ EnterCriticalSection(&ChildProcessRunningLock);
WaitForMultipleObjects(nProcesses, hProcess, TRUE, INFINITE);
- bChildProcessRunning = FALSE;
+ LeaveCriticalSection(&ChildProcessRunningLock);
/* Use the exit code of the last process in the pipeline */
GetExitCodeProcess(hProcess[nProcesses - 1], &dwExitCode);
@@ -1439,13 +1437,16 @@ BOOL WINAPI BreakHandler (DWORD dwCtrlType)
}
}
- if (bChildProcessRunning == TRUE)
+ if (!TryEnterCriticalSection(&ChildProcessRunningLock))
{
SelfGenerated = TRUE;
GenerateConsoleCtrlEvent (dwCtrlType, 0);
return TRUE;
}
-
+ else
+ {
+ LeaveCriticalSection(&ChildProcessRunningLock);
+ }
rec.EventType = KEY_EVENT;
rec.Event.KeyEvent.bKeyDown = TRUE;
@@ -1797,6 +1798,7 @@ static VOID Cleanup()
RemoveBreakHandler ();
SetConsoleMode( GetStdHandle( STD_INPUT_HANDLE ),
ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT );
+ DeleteCriticalSection(&ChildProcessRunningLock);
}
/*
@@ -1808,6 +1810,7 @@ int cmd_main (int argc, const TCHAR *argv[])
TCHAR startPath[MAX_PATH];
CONSOLE_SCREEN_BUFFER_INFO Info;
+ InitializeCriticalSection(&ChildProcessRunningLock);
lpOriginalEnvironment = DuplicateEnvironment();
GetCurrentDirectory(MAX_PATH,startPath);
diff --git a/base/shell/cmd/copy.c b/base/shell/cmd/copy.c
index d451fea09e8..a5bf33eefcb 100644
--- a/base/shell/cmd/copy.c
+++ b/base/shell/cmd/copy.c
@@ -604,28 +604,30 @@ INT cmd_copy (LPTSTR param)
bTouch = TRUE;
bDone = TRUE;
}
-
- if(_tcslen(tmpName) == 2)
- {
- if(tmpName[1] == _T(':'))
- {
- GetRootPath(tmpName,szSrcPath,MAX_PATH);
- }
- }
- else
- /* Get the full path to first file in the string of file names */
- GetFullPathName (tmpName, MAX_PATH, szSrcPath, NULL);
}
else
{
bDone = TRUE;
- if(_tcslen(arg[nSrc]) == 2 && arg[nSrc][1] == _T(':'))
+ _tcscpy(tmpName, arg[nSrc]);
+ }
+
+ /* Get full path or root names */
+ if(_tcslen(tmpName) == 2 && tmpName[1] == _T(':'))
+ {
+ GetRootPath(tmpName,szSrcPath,MAX_PATH);
+ }
+ else
+ {
+ /* Get the full path to first file in the string of file names */
+ GetFullPathName (tmpName, MAX_PATH, szSrcPath, NULL);
+
+ /* We got a device path of form \\.\x */
+ /* FindFirstFile cannot handle this, therefore use the short path */
+ if (szSrcPath[0] == _T('\\') && szSrcPath[1] == _T('\\') &&
+ szSrcPath[2] == _T('.') && szSrcPath[3] == _T('\\'))
{
- GetRootPath(arg[nSrc],szSrcPath,MAX_PATH);
+ _tcscpy(szSrcPath, tmpName);
}
- else
- /* Get the full path of the source file */
- GetFullPathName (arg[nSrc], MAX_PATH, szSrcPath, NULL);
}
/* From this point on, we can assume that the shortest path is 3 letters long
diff --git a/base/shell/cmd/filecomp.c b/base/shell/cmd/filecomp.c
index 7cb99a72f12..d2127fde250 100644
--- a/base/shell/cmd/filecomp.c
+++ b/base/shell/cmd/filecomp.c
@@ -590,10 +590,20 @@ VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor)
/* Start the search for all the files */
GetFullPathName(szBaseWord, MAX_PATH, szSearchPath, NULL);
+
+ /* Got a device path? Fallback to the the current dir plus the short path */
+ if (szSearchPath[0] == _T('\\') && szSearchPath[1] == _T('\\') &&
+ szSearchPath[2] == _T('.') && szSearchPath[3] == _T('\\'))
+ {
+ GetCurrentDirectory(MAX_PATH, szSearchPath);
+ _tcscat(szSearchPath, _T("\\"));
+ _tcscat(szSearchPath, szBaseWord);
+ }
+
if(StartLength > 0)
- {
+ {
_tcscat(szSearchPath,_T("*"));
- }
+ }
_tcscpy(LastSearch,szSearchPath);
_tcscpy(LastPrefix,szPrefix);
}
diff --git a/base/shell/explorer-new/explorer.c b/base/shell/explorer-new/explorer.c
index 9c31f33a0fe..8716edc021f 100644
--- a/base/shell/explorer-new/explorer.c
+++ b/base/shell/explorer-new/explorer.c
@@ -284,7 +284,9 @@ _tWinMain(IN HINSTANCE hInstance,
TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"),
&hkExplorer) != ERROR_SUCCESS)
{
- /* FIXME - display error */
+ TCHAR Message[256];
+ LoadString(hInstance, IDS_STARTUP_ERROR, Message, 256);
+ MessageBox(NULL, Message, NULL, MB_ICONERROR);
return 1;
}
diff --git a/base/shell/explorer-new/lang/bg-BG.rc b/base/shell/explorer-new/lang/bg-BG.rc
index 482ae13cede..f4c08db2f04 100644
--- a/base/shell/explorer-new/lang/bg-BG.rc
+++ b/base/shell/explorer-new/lang/bg-BG.rc
@@ -121,6 +121,7 @@ BEGIN
IDS_PROPERTIES "&Ńâîéńňâŕ"
IDS_OPEN_ALL_USERS "&Îňâŕđ˙íĺ íŕ âńč÷ęč ďîňđĺáčňĺëč"
IDS_EXPLORE_ALL_USERS "&Đŕçëčńňâŕíĺ íŕ âńč÷ęč ďîňđĺáčňĺëč"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/cs-CZ.rc b/base/shell/explorer-new/lang/cs-CZ.rc
index c82c31a89a0..5273c548ff1 100644
--- a/base/shell/explorer-new/lang/cs-CZ.rc
+++ b/base/shell/explorer-new/lang/cs-CZ.rc
@@ -126,6 +126,7 @@ BEGIN
IDS_PROPERTIES "Vl&astnosti"
IDS_OPEN_ALL_USERS "Ote&vřít složku All Users"
IDS_EXPLORE_ALL_USERS "Pro&cházet složku All Users"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/de-DE.rc b/base/shell/explorer-new/lang/de-DE.rc
index 80aefc0c32a..1173c3ffd90 100644
--- a/base/shell/explorer-new/lang/de-DE.rc
+++ b/base/shell/explorer-new/lang/de-DE.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "E&igenschaften"
IDS_OPEN_ALL_USERS "Öffnen (&Alle Benutzer)"
IDS_EXPLORE_ALL_USERS "Explorer (A&lle Benutzer)"
+ IDS_STARTUP_ERROR "Das System kann den Explorer nicht starten, weil die Registrierung nicht verfügbar bzw. fehlerhaft ist."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/en-US.rc b/base/shell/explorer-new/lang/en-US.rc
index 9e1d6876fde..c98a1face25 100644
--- a/base/shell/explorer-new/lang/en-US.rc
+++ b/base/shell/explorer-new/lang/en-US.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "P&roperties"
IDS_OPEN_ALL_USERS "O&pen All Users"
IDS_EXPLORE_ALL_USERS "E&xplore All Users"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/es-ES.rc b/base/shell/explorer-new/lang/es-ES.rc
index b0dcd7ef349..86e83e4ebf1 100644
--- a/base/shell/explorer-new/lang/es-ES.rc
+++ b/base/shell/explorer-new/lang/es-ES.rc
@@ -129,6 +129,7 @@ BEGIN
IDS_PROPERTIES "P&ropiedades"
IDS_OPEN_ALL_USERS "A&brir todos los usuarios"
IDS_EXPLORE_ALL_USERS "E&xplorar todos los usuarios"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/fr-FR.rc b/base/shell/explorer-new/lang/fr-FR.rc
index 57587e9882d..35227391c08 100644
--- a/base/shell/explorer-new/lang/fr-FR.rc
+++ b/base/shell/explorer-new/lang/fr-FR.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "P&ropriétés"
IDS_OPEN_ALL_USERS "Ouvrir tous les utilisateurs"
IDS_EXPLORE_ALL_USERS "E&xplorer tous les utilisateurs"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/it-IT.rc b/base/shell/explorer-new/lang/it-IT.rc
index 443c32d624e..eaf2c0b9328 100644
--- a/base/shell/explorer-new/lang/it-IT.rc
+++ b/base/shell/explorer-new/lang/it-IT.rc
@@ -78,11 +78,11 @@ BEGIN
LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
PUSHBUTTON "&Personalizzare...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
AUTORADIOBUTTON "Menů avvio &classico", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
- LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
- PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ LTEXT "Questo stile di menů ha funzionalitŕ e aspetto classici",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Personalizza...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
- AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
- AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+ AUTOCHECKBOX "Memorizza e mostra un elenco di &file aperti di recente", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Memorizza e mostra un elenco di &programmi aperti di recente",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
END
IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "&Proprietŕ"
IDS_OPEN_ALL_USERS "&Apri tutti gli utenti"
IDS_EXPLORE_ALL_USERS "&Esplora tutti gli utenti"
+ IDS_STARTUP_ERROR "Impossibile avviare explorer perché il registro č danneggiato o non disponibile."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/ja-JP.rc b/base/shell/explorer-new/lang/ja-JP.rc
index 5084e2c79b2..66b55a294a9 100644
--- a/base/shell/explorer-new/lang/ja-JP.rc
+++ b/base/shell/explorer-new/lang/ja-JP.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "vŤpeB(&R)"
IDS_OPEN_ALL_USERS "ŠJ‚ - All Users(&P)"
IDS_EXPLORE_ALL_USERS "GNXvŤ[‰ - All Users(&E)"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/ko-KR.rc b/base/shell/explorer-new/lang/ko-KR.rc
index 0232ae1d59b..adbafd39641 100644
--- a/base/shell/explorer-new/lang/ko-KR.rc
+++ b/base/shell/explorer-new/lang/ko-KR.rc
@@ -125,6 +125,7 @@ BEGIN
IDS_PROPERTIES "ĽÓĽş(&R)"
IDS_OPEN_ALL_USERS "ż±â - All Users(&P)"
IDS_EXPLORE_ALL_USERS "Ĺ˝»ö - All Users(&X)"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/lt-LT.rc b/base/shell/explorer-new/lang/lt-LT.rc
index 5c3c0c69efe..b0dd8e57f62 100644
--- a/base/shell/explorer-new/lang/lt-LT.rc
+++ b/base/shell/explorer-new/lang/lt-LT.rc
@@ -124,6 +124,7 @@ BEGIN
IDS_PROPERTIES "&Parametrai"
IDS_OPEN_ALL_USERS "&Atverti visus vartotojus"
IDS_EXPLORE_ALL_USERS "&Narđyti visus vartotojus"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/nl-NL.rc b/base/shell/explorer-new/lang/nl-NL.rc
index 3dcf5183a7e..135956e86c2 100644
--- a/base/shell/explorer-new/lang/nl-NL.rc
+++ b/base/shell/explorer-new/lang/nl-NL.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "&Eigenschappen"
IDS_OPEN_ALL_USERS "&Alle Gebruikers weergeven"
IDS_EXPLORE_ALL_USERS "Alle Gebruikers V&erkennen"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/no-NO.rc b/base/shell/explorer-new/lang/no-NO.rc
index 583fa140de8..d06d1aaf3f2 100644
--- a/base/shell/explorer-new/lang/no-NO.rc
+++ b/base/shell/explorer-new/lang/no-NO.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "E&genskaper"
IDS_OPEN_ALL_USERS "Ĺ&pne alle brukere"
IDS_EXPLORE_ALL_USERS "U&tforsk alle brukere"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/pl-PL.rc b/base/shell/explorer-new/lang/pl-PL.rc
index 22a67438dfa..7b8e9de9cb6 100644
--- a/base/shell/explorer-new/lang/pl-PL.rc
+++ b/base/shell/explorer-new/lang/pl-PL.rc
@@ -123,6 +123,7 @@ BEGIN
IDS_PROPERTIES "Właś&ciwości"
IDS_OPEN_ALL_USERS "&Otwórz - wszyscy użytkownicy"
IDS_EXPLORE_ALL_USERS "&Eksploruj - wszyscy użytkownicy"
+ IDS_STARTUP_ERROR "System nie może uruchomić eksploratora ponieważ rejestr jest niedostępny lub uszkodzony."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/ro-RO.rc b/base/shell/explorer-new/lang/ro-RO.rc
index f18c0a8f57e..f583672499c 100644
--- a/base/shell/explorer-new/lang/ro-RO.rc
+++ b/base/shell/explorer-new/lang/ro-RO.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "P&roprietăţi"
IDS_OPEN_ALL_USERS "Deschidere& Toţi Utilizatorii"
IDS_EXPLORE_ALL_USERS "E&xplorare Toţi Utilizatorii"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/ru-RU.rc b/base/shell/explorer-new/lang/ru-RU.rc
index c5d54139dc4..7a21b150a74 100644
--- a/base/shell/explorer-new/lang/ru-RU.rc
+++ b/base/shell/explorer-new/lang/ru-RU.rc
@@ -122,6 +122,7 @@ BEGIN
IDS_PROPERTIES "&Ńâîéńňâŕ"
IDS_OPEN_ALL_USERS "&Âńĺ ďîëüçîâŕňĺëč"
IDS_EXPLORE_ALL_USERS "&Îáçîđ Âńĺő ďîëüçîâŕňĺëĺé"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/sk-SK.rc b/base/shell/explorer-new/lang/sk-SK.rc
index 8cd7c5b9aca..c6329c7e695 100644
--- a/base/shell/explorer-new/lang/sk-SK.rc
+++ b/base/shell/explorer-new/lang/sk-SK.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "Vl&astnosti"
IDS_OPEN_ALL_USERS "&Otvoriť profil All Users"
IDS_EXPLORE_ALL_USERS "&Preskúmať profil All Users"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/uk-UA.rc b/base/shell/explorer-new/lang/uk-UA.rc
index d02ee30f9e2..65462be70a4 100644
--- a/base/shell/explorer-new/lang/uk-UA.rc
+++ b/base/shell/explorer-new/lang/uk-UA.rc
@@ -128,6 +128,7 @@ BEGIN
IDS_PROPERTIES "Â&ëŕńňčâîńňł"
IDS_OPEN_ALL_USERS "&Âńł ęîđčńňóâŕ÷ł"
IDS_EXPLORE_ALL_USERS "&Îăë˙ä âńłő ęîđčńňóâŕ÷łâ"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/resource.h b/base/shell/explorer-new/resource.h
index 0ab9222f778..dbdf9c1bef9 100644
--- a/base/shell/explorer-new/resource.h
+++ b/base/shell/explorer-new/resource.h
@@ -8,6 +8,7 @@
#define IDS_PROPERTIES 102
#define IDS_OPEN_ALL_USERS 103
#define IDS_EXPLORE_ALL_USERS 104
+#define IDS_STARTUP_ERROR 105
#define IDC_STARTBTN 304
diff --git a/base/system/format/format.c b/base/system/format/format.c
index ba9f42b3a05..4eae18bb614 100755
--- a/base/system/format/format.c
+++ b/base/system/format/format.c
@@ -185,7 +185,7 @@ FormatExCallback (
if( *status == FALSE ) {
LoadString( GetModuleHandle(NULL), STRING_FORMAT_FAIL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
Error = TRUE;
}
break;
@@ -204,7 +204,7 @@ FormatExCallback (
case STRUCTUREPROGRESS:
case CLUSTERSIZETOOSMALL:
LoadString( GetModuleHandle(NULL), STRING_NO_SUPPORT, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
return FALSE;
}
return TRUE;
@@ -320,7 +320,7 @@ _tmain(int argc, TCHAR *argv[])
//
if( !LoadFMIFSEntryPoints()) {
LoadString( GetModuleHandle(NULL), STRING_FMIFS_FAIL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
return -1;
}
@@ -422,7 +422,7 @@ _tmain(int argc, TCHAR *argv[])
break;
}
LoadString( GetModuleHandle(NULL), STRING_ERROR_LABEL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
}
}
@@ -471,7 +471,7 @@ _tmain(int argc, TCHAR *argv[])
((float)(LONGLONG)totalNumberOfBytes.QuadPart)/(float)(1024.0*1024.0));
}
LoadString( GetModuleHandle(NULL), STRING_CREATE_FSYS, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
}
//
@@ -489,7 +489,7 @@ _tmain(int argc, TCHAR *argv[])
#endif
if( Error ) return -1;
LoadString( GetModuleHandle(NULL), STRING_FMT_COMPLETE, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
//
// Enable compression if desired
@@ -504,7 +504,7 @@ _tmain(int argc, TCHAR *argv[])
#endif
LoadString( GetModuleHandle(NULL), STRING_VOL_COMPRESS, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
}
}
@@ -514,7 +514,7 @@ _tmain(int argc, TCHAR *argv[])
if( !GotALabel ) {
LoadString( GetModuleHandle(NULL), STRING_ENTER_LABEL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
_fgetts( input, sizeof(LabelString)/2, stdin );
input[ _tcslen(input)-1] = 0;
diff --git a/base/system/smss/initenv.c b/base/system/smss/initenv.c
index 66a0f49ec7f..24ccc3bb5c4 100644
--- a/base/system/smss/initenv.c
+++ b/base/system/smss/initenv.c
@@ -29,7 +29,7 @@ SmCreateEnvironment(VOID)
static NTSTATUS
SmpSetEnvironmentVariable(IN PVOID Context,
IN PWSTR ValueName,
- IN PVOID ValueData)
+ IN PWSTR ValueData)
{
UNICODE_STRING EnvVariable;
UNICODE_STRING EnvValue;
@@ -37,7 +37,7 @@ SmpSetEnvironmentVariable(IN PVOID Context,
RtlInitUnicodeString(&EnvVariable,
ValueName);
RtlInitUnicodeString(&EnvValue,
- (PWSTR)ValueData);
+ ValueData);
return RtlSetEnvironmentVariable(Context,
&EnvVariable,
&EnvValue);
@@ -58,12 +58,226 @@ SmpEnvironmentQueryRoutine(IN PWSTR ValueName,
return STATUS_SUCCESS;
DPRINT("ValueData '%S'\n", (PWSTR)ValueData);
- return SmpSetEnvironmentVariable(Context,ValueName,ValueData);
+ return SmpSetEnvironmentVariable(Context,ValueName,(PWSTR)ValueData);
}
NTSTATUS
SmSetEnvironmentVariables(VOID)
+{
+ SYSTEM_BASIC_INFORMATION BasicInformation;
+ SYSTEM_PROCESSOR_INFORMATION ProcessorInformation;
+ RTL_QUERY_REGISTRY_TABLE QueryTable[3];
+ UNICODE_STRING Identifier;
+ UNICODE_STRING VendorIdentifier;
+ WCHAR Buffer[256];
+ UNICODE_STRING EnvironmentKeyName;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ HANDLE EnvironmentKey;
+ UNICODE_STRING VariableName;
+ PWSTR VariableData;
+ NTSTATUS Status;
+
+ Status = NtQuerySystemInformation(SystemProcessorInformation,
+ &ProcessorInformation,
+ sizeof(SYSTEM_PROCESSOR_INFORMATION),
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: Failed to retrieve system processor information (Status %08lx)", Status);
+ return Status;
+ }
+
+ Status = NtQuerySystemInformation(SystemBasicInformation,
+ &BasicInformation,
+ sizeof(SYSTEM_BASIC_INFORMATION),
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: Failed to retrieve system basic information (Status %08lx)", Status);
+ return Status;
+ }
+
+ RtlInitUnicodeString(&EnvironmentKeyName,
+ L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Session Manager\\Environment");
+ InitializeObjectAttributes(&ObjectAttributes,
+ &EnvironmentKeyName,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+
+ /* Open the system environment key */
+ Status = NtOpenKey(&EnvironmentKey,
+ GENERIC_WRITE,
+ &ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: Failed to open the environment key (Status %08lx)", Status);
+ return Status;
+ }
+
+ /* Set the 'NUMBER_OF_PROCESSORS' system environment variable */
+ RtlInitUnicodeString(&VariableName,
+ L"NUMBER_OF_PROCESSORS");
+
+ swprintf(Buffer, L"%lu", BasicInformation.NumberOfProcessors);
+
+ Status = NtSetValueKey(EnvironmentKey,
+ &VariableName,
+ 0,
+ REG_SZ,
+ Buffer,
+ (wcslen(Buffer) + 1) * sizeof(WCHAR));
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: Failed to set the NUMBER_OF_PROCESSORS environment variable (Status %08lx)", Status);
+ goto done;
+ }
+
+ /* Set the 'OS' system environment variable */
+ RtlInitUnicodeString(&VariableName,
+ L"OS");
+
+ VariableData = L"ReactOS";
+
+ Status = NtSetValueKey(EnvironmentKey,
+ &VariableName,
+ 0,
+ REG_SZ,
+ VariableData,
+ (wcslen(VariableData) + 1) * sizeof(WCHAR));
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: Failed to set the OS environment variable (Status %08lx)", Status);
+ goto done;
+ }
+
+ /* Set the 'PROCESSOR_ARCHITECTURE' system environment variable */
+ RtlInitUnicodeString(&VariableName,
+ L"PROCESSOR_ARCHITECTURE");
+
+ switch (ProcessorInformation.ProcessorArchitecture)
+ {
+ case PROCESSOR_ARCHITECTURE_INTEL:
+ VariableData = L"x86";
+ break;
+
+ case PROCESSOR_ARCHITECTURE_PPC:
+ VariableData = L"PPC";
+ break;
+
+ case PROCESSOR_ARCHITECTURE_ARM:
+ VariableData = L"ARM";
+ break;
+
+ case PROCESSOR_ARCHITECTURE_AMD64:
+ VariableData = L"AMD64";
+ break;
+
+ default:
+ VariableData = L"Unknown";
+ break;
+ }
+
+ Status = NtSetValueKey(EnvironmentKey,
+ &VariableName,
+ 0,
+ REG_SZ,
+ VariableData,
+ (wcslen(VariableData) + 1) * sizeof(WCHAR));
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: Failed to set the PROCESSOR_ARCHITECTURE environment variable (Status %08lx)", Status);
+ goto done;
+ }
+
+ /* Set the 'PROCESSOR_LEVEL' system environment variable */
+ RtlInitUnicodeString(&VariableName,
+ L"PROCESSOR_LEVEL");
+
+ swprintf(Buffer, L"%lu", ProcessorInformation.ProcessorLevel);
+
+ Status = NtSetValueKey(EnvironmentKey,
+ &VariableName,
+ 0,
+ REG_SZ,
+ Buffer,
+ (wcslen(Buffer) + 1) * sizeof(WCHAR));
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: Failed to set the PROCESSOR_LEVEL environment variable (Status %08lx)", Status);
+ goto done;
+ }
+
+ /* Set the 'PROCESSOR_REVISION' system environment variable */
+ RtlInitUnicodeString(&VariableName,
+ L"PROCESSOR_REVISION");
+
+ swprintf(Buffer, L"%04x", ProcessorInformation.ProcessorRevision);
+
+ Status = NtSetValueKey(EnvironmentKey,
+ &VariableName,
+ 0,
+ REG_SZ,
+ Buffer,
+ (wcslen(Buffer) + 1) * sizeof(WCHAR));
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: Failed to set the PROCESSOR_REVISION environment variable (Status %08lx)", Status);
+ goto done;
+ }
+
+done:
+ NtClose(EnvironmentKey);
+
+
+ /* Set the 'PROCESSOR_IDENTIFIER' system environment variable */
+ RtlInitUnicodeString(&Identifier, NULL);
+ RtlInitUnicodeString(&VendorIdentifier, NULL);
+
+ RtlZeroMemory(&QueryTable,
+ sizeof(QueryTable));
+
+ QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
+ QueryTable[0].Name = L"Identifier";
+ QueryTable[0].EntryContext = &Identifier;
+
+ QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT;
+ QueryTable[1].Name = L"VendorIdentifier";
+ QueryTable[1].EntryContext = &VendorIdentifier;
+
+ Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE,
+ L"\\Registry\\Machine\\Hardware\\Description\\System\\CentralProcessor\\0",
+ QueryTable,
+ NULL,
+ NULL);
+ if (NT_SUCCESS(Status))
+ {
+ DPRINT("SM: szIdentifier: %wZ\n", &Identifier);
+ DPRINT("SM: szVendorIdentifier: %wZ\n", &VendorIdentifier);
+
+ swprintf(Buffer, L"%wZ, %wZ", &Identifier, &VendorIdentifier);
+
+ RtlWriteRegistryValue(RTL_REGISTRY_CONTROL,
+ L"Session Manager\\Environment",
+ L"PROCESSOR_IDENTIFIER",
+ REG_SZ,
+ Buffer,
+ (wcslen(Buffer) + 1) * sizeof(WCHAR));
+ }
+
+ RtlFreeUnicodeString(&Identifier);
+ RtlFreeUnicodeString(&VendorIdentifier);
+
+ return STATUS_SUCCESS;
+}
+
+
+/**********************************************************************
+ * Set environment variables from registry
+ */
+NTSTATUS
+SmUpdateEnvironment(VOID)
{
RTL_QUERY_REGISTRY_TABLE QueryTable[2];
WCHAR ValueBuffer[MAX_PATH];
@@ -106,14 +320,4 @@ SmSetEnvironmentVariables(VOID)
return Status;
}
-/**********************************************************************
- * Set environment variables from registry
- */
-NTSTATUS
-SmUpdateEnvironment(VOID)
-{
- /* TODO */
- return STATUS_SUCCESS;
-}
-
/* EOF */
diff --git a/base/system/smss/initpage.c b/base/system/smss/initpage.c
index 9b889377de6..7ec19985463 100644
--- a/base/system/smss/initpage.c
+++ b/base/system/smss/initpage.c
@@ -225,34 +225,288 @@ Cleanup:
}
+static NTSTATUS
+SmpGetFreeDiskSpace(IN PWSTR PageFileName,
+ OUT PLARGE_INTEGER FreeDiskSpaceInMB)
+{
+ FILE_FS_SIZE_INFORMATION FileFsSize;
+ IO_STATUS_BLOCK IoStatusBlock;
+ HANDLE hFile;
+ UNICODE_STRING NtPathU;
+ LARGE_INTEGER FreeBytes;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ WCHAR RootPath[5];
+ NTSTATUS Status;
+
+ /*
+ * copy the drive letter, the colon and the slash,
+ * tack a null on the end
+ */
+ RootPath[0] = PageFileName[0];
+ RootPath[1] = L':';
+ RootPath[2] = L'\\';
+ RootPath[3] = L'\0';
+
+ DPRINT("Root drive X:\\...\"%S\"\n",RootPath);
+
+ if (!RtlDosPathNameToNtPathName_U(RootPath,
+ &NtPathU,
+ NULL,
+ NULL))
+ {
+ DPRINT1("Invalid path to root of drive\n");
+ return STATUS_OBJECT_PATH_INVALID;
+ }
+
+ InitializeObjectAttributes(&ObjectAttributes,
+ &NtPathU,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+
+ /* Get a handle to the root to find the free space on the drive */
+ Status = NtCreateFile(&hFile,
+ 0,
+ &ObjectAttributes,
+ &IoStatusBlock,
+ NULL,
+ 0,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ FILE_OPEN,
+ 0,
+ NULL,
+ 0);
+
+ RtlFreeHeap(RtlGetProcessHeap(),
+ 0,
+ NtPathU.Buffer);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Could not open a handle to the volume.\n");
+ return Status;
+ }
+
+ Status = NtQueryVolumeInformationFile(hFile,
+ &IoStatusBlock,
+ &FileFsSize,
+ sizeof(FILE_FS_SIZE_INFORMATION),
+ FileFsSizeInformation);
+
+ NtClose(hFile);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Querying the volume free space failed!\n");
+ return Status;
+ }
+
+ FreeBytes.QuadPart = FileFsSize.BytesPerSector *
+ FileFsSize.SectorsPerAllocationUnit *
+ FileFsSize.AvailableAllocationUnits.QuadPart;
+
+ FreeDiskSpaceInMB->QuadPart = FreeBytes.QuadPart >> 20;
+
+ return STATUS_SUCCESS;
+}
+
+
+static NTSTATUS
+SmpSetDefaultPageFileData(IN PWSTR PageFileName,
+ IN PLARGE_INTEGER InitialSizeInMB,
+ IN PLARGE_INTEGER MaximumSizeInMB)
+{
+ WCHAR ValueString[MAX_PATH * 2];
+ ULONG ValueLength;
+
+ /* Format the value string */
+ swprintf(ValueString,
+ L"%s %I64u %I64u",
+ PageFileName,
+ InitialSizeInMB->QuadPart,
+ MaximumSizeInMB->QuadPart);
+
+ /*
+ * Append another zero character because it is a multi string value
+ * (REG_MULTI_SZ) and calculate the total string length.
+ */
+ ValueLength = wcslen(ValueString) + 1;
+ ValueString[ValueLength] = 0;
+ ValueLength++;
+
+ /* Write the page file data */
+ return RtlWriteRegistryValue(RTL_REGISTRY_CONTROL,
+ L"\\Session Manager\\Memory Management",
+ L"PagingFiles",
+ REG_MULTI_SZ,
+ ValueString,
+ ValueLength * sizeof(WCHAR));
+}
+
+
+static NTSTATUS
+SmpCreatePageFile(IN PWSTR PageFileName,
+ IN PLARGE_INTEGER InitialSizeInMB,
+ IN PLARGE_INTEGER MaximumSizeInMB)
+{
+ LARGE_INTEGER InitialSize;
+ LARGE_INTEGER MaximumSize;
+ UNICODE_STRING FileName;
+ NTSTATUS Status;
+
+ /* Get the NT path name of the page file */
+ if (!RtlDosPathNameToNtPathName_U(PageFileName,
+ &FileName,
+ NULL,
+ NULL))
+ {
+ return STATUS_OBJECT_PATH_INVALID;
+ }
+
+ /* Convert sizes in megabytes to sizes in bytes */
+ InitialSize.QuadPart = InitialSizeInMB->QuadPart << 20;
+ MaximumSize.QuadPart = MaximumSizeInMB->QuadPart << 20;
+
+ /* Create the pageing file */
+ Status = NtCreatePagingFile(&FileName,
+ &InitialSize,
+ &MaximumSize,
+ 0);
+ if (! NT_SUCCESS(Status))
+ {
+ DPRINT("Creation of paging file %wZ with size %I64d MB failed (status 0x%x)\n",
+ &FileName, InitialSizeInMB->QuadPart, Status);
+ }
+
+ /* Release the file name */
+ RtlFreeHeap(RtlGetProcessHeap(),
+ 0,
+ FileName.Buffer);
+
+ return Status;
+}
+
+
+static NTSTATUS
+SmpCreateDefaultPagingFile(VOID)
+{
+ SYSTEM_BASIC_INFORMATION SysBasicInfo;
+ LARGE_INTEGER MemorySizeInMB;
+ LARGE_INTEGER FreeDiskSpaceInMB;
+ LARGE_INTEGER InitialSizeInMB;
+ LARGE_INTEGER MaximumSizeInMB;
+ NTSTATUS Status = STATUS_SUCCESS;
+ WCHAR PageFileName[MAX_PATH];
+
+ DPRINT("Creating a default paging file\n");
+
+ Status = NtQuerySystemInformation(SystemBasicInformation,
+ &SysBasicInfo,
+ sizeof(SysBasicInfo),
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Could not query for physical memory size.\n");
+ return Status;
+ }
+
+ DPRINT("PageSize: %d, PhysicalPages: %d, TotalMem: %d\n",
+ SysBasicInfo.PageSize,
+ SysBasicInfo.NumberOfPhysicalPages,
+ (SysBasicInfo.NumberOfPhysicalPages * SysBasicInfo.PageSize) / 1024);
+
+ MemorySizeInMB.QuadPart = (SysBasicInfo.NumberOfPhysicalPages * SysBasicInfo.PageSize) >> 20;
+
+ DPRINT("MemorySize %I64u MB\n",
+ MemorySizeInMB.QuadPart);
+
+ /* Build the default page file name */
+ PageFileName[0] = SharedUserData->NtSystemRoot[0];
+ PageFileName[1] = 0;
+ wcscat(PageFileName, L":\\pagefile.sys");
+
+ Status = SmpGetFreeDiskSpace(PageFileName,
+ &FreeDiskSpaceInMB);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ DPRINT("FreeDiskSpace %I64u MB\n",
+ FreeDiskSpaceInMB.QuadPart);
+
+ InitialSizeInMB.QuadPart = MemorySizeInMB.QuadPart + (MemorySizeInMB.QuadPart / 2);
+ MaximumSizeInMB.QuadPart = InitialSizeInMB.QuadPart * 2;
+
+ if (InitialSizeInMB.QuadPart > (FreeDiskSpaceInMB.QuadPart / 4))
+ {
+ DPRINT("Inital Size took more then 25%% of free disk space\n");
+
+ /*
+ * Set by percentage of free space
+ * intial is 20%, and max is 25%
+ */
+ InitialSizeInMB.QuadPart = FreeDiskSpaceInMB.QuadPart / 5;
+ MaximumSizeInMB.QuadPart = FreeDiskSpaceInMB.QuadPart / 4;
+
+ /* The page file is more then a gig, size it down */
+ if (InitialSizeInMB.QuadPart > 1024)
+ {
+ InitialSizeInMB.QuadPart = 1024; /* 1GB */
+ MaximumSizeInMB.QuadPart = 1536; /* 1.5GB */
+ }
+ }
+
+ DPRINT("InitialSize %I64u MB MaximumSize %I64u MB\n",
+ InitialSizeInMB.QuadPart,
+ MaximumSizeInMB.QuadPart);
+
+ Status = SmpSetDefaultPageFileData(PageFileName,
+ &InitialSizeInMB,
+ &MaximumSizeInMB);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ return SmpCreatePageFile(PageFileName,
+ &InitialSizeInMB,
+ &MaximumSizeInMB);
+}
+
+
NTSTATUS
SmCreatePagingFiles(VOID)
{
- RTL_QUERY_REGISTRY_TABLE QueryTable[2];
- NTSTATUS Status;
+ RTL_QUERY_REGISTRY_TABLE QueryTable[2];
+ NTSTATUS Status;
- DPRINT("creating system paging files\n");
- /*
- * Disable paging file on MiniNT/Live CD.
- */
- if (RtlCheckRegistryKey(RTL_REGISTRY_CONTROL, L"MiniNT") == STATUS_SUCCESS)
+ DPRINT("creating system paging files\n");
+
+ /* Disable paging file on MiniNT/Live CD. */
+ if (RtlCheckRegistryKey(RTL_REGISTRY_CONTROL, L"MiniNT") == STATUS_SUCCESS)
{
- return STATUS_SUCCESS;
+ return STATUS_SUCCESS;
}
- RtlZeroMemory(&QueryTable,
- sizeof(QueryTable));
+ RtlZeroMemory(&QueryTable,
+ sizeof(QueryTable));
- QueryTable[0].Name = L"PagingFiles";
- QueryTable[0].QueryRoutine = SmpPagingFilesQueryRoutine;
+ QueryTable[0].Name = L"PagingFiles";
+ QueryTable[0].QueryRoutine = SmpPagingFilesQueryRoutine;
+ QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED;
- Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL,
- L"\\Session Manager\\Memory Management",
- QueryTable,
- NULL,
- NULL);
+ Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL,
+ L"\\Session Manager\\Memory Management",
+ QueryTable,
+ NULL,
+ NULL);
+ if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
+ {
+ Status = SmpCreateDefaultPagingFile();
+ }
- return(Status);
+ return Status;
}
diff --git a/base/system/winlogon/environment.c b/base/system/winlogon/environment.c
index 7a22e494d27..972d09c43bc 100644
--- a/base/system/winlogon/environment.c
+++ b/base/system/winlogon/environment.c
@@ -19,25 +19,42 @@ WINE_DEFAULT_DEBUG_CHANNEL(winlogon);
/* GLOBALS ******************************************************************/
-typedef HRESULT (WINAPI *PFSHGETFOLDERPATHW)(HWND, int, HANDLE, DWORD, LPWSTR);
-
/* FUNCTIONS ****************************************************************/
static VOID
BuildVolatileEnvironment(IN PWLSESSION Session,
- IN HKEY hKey)
+ IN HKEY hKeyCurrentUser)
{
- HINSTANCE hShell32 = NULL;
- PFSHGETFOLDERPATHW pfSHGetFolderPathW = NULL;
WCHAR szPath[MAX_PATH + 1];
- WCHAR szExpandedPath[MAX_PATH + 1];
LPCWSTR wstr;
SIZE_T size;
WCHAR szEnvKey[MAX_PATH];
WCHAR szEnvValue[1024];
SIZE_T length;
LPWSTR eqptr, endptr;
+ DWORD dwDisp;
+ LONG lError;
+ HKEY hKeyVolatileEnv;
+ HKEY hKeyShellFolders;
+ DWORD dwType;
+ DWORD dwSize;
+
+ /* Create the 'Volatile Environment' key */
+ lError = RegCreateKeyExW(hKeyCurrentUser,
+ L"Volatile Environment",
+ 0,
+ NULL,
+ REG_OPTION_VOLATILE,
+ KEY_WRITE,
+ NULL,
+ &hKeyVolatileEnv,
+ &dwDisp);
+ if (lError != ERROR_SUCCESS)
+ {
+ WARN("WL: RegCreateKeyExW() failed to create the volatile environment key (Error: %ld)\n", lError);
+ return;
+ }
/* Parse the environment variables and add them to the volatile environment key */
if (Session->Profile->dwType == WLX_PROFILE_TYPE_V2_0 &&
@@ -68,7 +85,7 @@ BuildVolatileEnvironment(IN PWLSESSION Session,
eqptr++;
wcscpy(szEnvValue, eqptr);
- RegSetValueExW(hKey,
+ RegSetValueExW(hKeyVolatileEnv,
szEnvKey,
0,
REG_SZ,
@@ -80,50 +97,44 @@ BuildVolatileEnvironment(IN PWLSESSION Session,
}
}
- /* Load shell32.dll and call SHGetFolderPathW to get the users appdata folder path */
- hShell32 = LoadLibraryW(L"shell32.dll");
- if (hShell32 != NULL)
+ /* Set the 'APPDATA' environment variable */
+ lError = RegOpenKeyExW(hKeyCurrentUser,
+ L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",
+ 0,
+ KEY_READ,
+ &hKeyShellFolders);
+ if (lError == ERROR_SUCCESS)
{
- pfSHGetFolderPathW = (PFSHGETFOLDERPATHW)GetProcAddress(hShell32,
- "SHGetFolderPathW");
- if (pfSHGetFolderPathW != NULL)
+ dwSize = (MAX_PATH + 1) * sizeof(WCHAR);
+ lError = RegQueryValueExW(hKeyShellFolders,
+ L"AppData",
+ NULL,
+ &dwType,
+ (LPBYTE)szPath,
+ &dwSize);
+ if (lError == ERROR_SUCCESS)
{
- if (pfSHGetFolderPathW(NULL,
- CSIDL_APPDATA | CSIDL_FLAG_DONT_VERIFY,
- Session->UserToken,
- 0,
- szPath) == S_OK)
- {
- /* FIXME: Expand %USERPROFILE% here. SHGetFolderPathW should do it for us. See Bug #5372.*/
- TRACE("APPDATA path: %S\n", szPath);
- ExpandEnvironmentStringsForUserW(Session->UserToken,
- szPath,
- szExpandedPath,
- MAX_PATH);
-
- /* Add the appdata folder path to the users volatile environment key */
- TRACE("APPDATA expanded path: %S\n", szExpandedPath);
- RegSetValueExW(hKey,
- L"APPDATA",
- 0,
- REG_SZ,
- (LPBYTE)szExpandedPath,
- (wcslen(szExpandedPath) + 1) * sizeof(WCHAR));
- }
+ TRACE("APPDATA path: %S\n", szPath);
+ RegSetValueExW(hKeyVolatileEnv,
+ L"APPDATA",
+ 0,
+ REG_SZ,
+ (LPBYTE)szPath,
+ (wcslen(szPath) + 1) * sizeof(WCHAR));
}
- FreeLibrary(hShell32);
+ RegCloseKey(hKeyShellFolders);
}
+
+ RegCloseKey(hKeyVolatileEnv);
}
BOOL
CreateUserEnvironment(IN PWLSESSION Session)
{
- HKEY hKey;
- DWORD dwDisp;
- LONG lError;
HKEY hKeyCurrentUser;
+ LONG lError;
TRACE("WL: CreateUserEnvironment called\n");
@@ -135,28 +146,8 @@ CreateUserEnvironment(IN PWLSESSION Session)
&hKeyCurrentUser);
if (lError == ERROR_SUCCESS)
{
- /* Create the 'Volatile Environment' key */
- lError = RegCreateKeyExW(hKeyCurrentUser,
- L"Volatile Environment",
- 0,
- NULL,
- REG_OPTION_VOLATILE,
- KEY_WRITE,
- NULL,
- &hKey,
- &dwDisp);
- if (lError == ERROR_SUCCESS)
- {
- BuildVolatileEnvironment(Session,
- hKey);
-
- RegCloseKey(hKey);
- }
- else
- {
- WARN("WL: RegCreateKeyExW() failed (Error: %ld)\n", lError);
- }
-
+ BuildVolatileEnvironment(Session,
+ hKeyCurrentUser);
RegCloseKey(hKeyCurrentUser);
}
diff --git a/boot/bootdata/hivedef_arm.inf b/boot/bootdata/hivedef_arm.inf
index 086ee67f4fa..8d8c48935d1 100644
--- a/boot/bootdata/hivedef_arm.inf
+++ b/boot/bootdata/hivedef_arm.inf
@@ -1530,8 +1530,7 @@ HKCU,"Control Panel\Accessibility\Keyboard Preference","On",2,"0"
; Internet Explorer
HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php"
-;HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\"
-HKCU,Software\Wine\MSHTML,"GeckoCabDir",,"C:\ReactOS\"
+HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\"
; Sound Schemes
HKCU,"AppEvents",,0x00000012
diff --git a/boot/bootdata/hivedef_i386.inf b/boot/bootdata/hivedef_i386.inf
index 905f5ef3daf..8fdc4bb0828 100644
Binary files a/boot/bootdata/hivedef_i386.inf and b/boot/bootdata/hivedef_i386.inf differ
diff --git a/boot/bootdata/hivesys_arm.inf b/boot/bootdata/hivesys_arm.inf
index 277600b23a6..51f2dc8dd63 100644
--- a/boot/bootdata/hivesys_arm.inf
+++ b/boot/bootdata/hivesys_arm.inf
@@ -754,13 +754,11 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices","UNC",0x0000
; System environment settings
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","ComSpec",0x00020000,"%SystemRoot%\system32\cmd.exe"
-HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","OS",0x00020000,"ReactOS"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","Path",0x00020000,"%SystemRoot%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\system32\wbem"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","windir",0x00020000,"%SystemRoot%"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","TEMP",0x00020000,"%SystemDrive%\TEMP"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","TMP",0x00020000,"%SystemDrive%\TEMP"
-HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PATHEXT",0x00020000,".COM;.EXE;.BAT;.CMD"
-HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PROCESSOR_ARCHITECTURE",0x00020000,"x86"
+HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PATHEXT",0x00000000,".COM;.EXE;.BAT;.CMD"
; Known DLLs
@@ -785,9 +783,8 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","version",0x00
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","wininet",0x00000000,"wininet.dll"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","wldap32",0x00000000,"wldap32.dll"
-; Pagefile settings
-HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management","PagingFiles",0x00010000, \
- "C:\pagefile.sys"
+; Memory Management
+HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management",,0x00000012
; Subsystems
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Debug",0x00020000,""
diff --git a/boot/bootdata/hivesys_i386.inf b/boot/bootdata/hivesys_i386.inf
index 3ca06176457..544f51059f3 100644
--- a/boot/bootdata/hivesys_i386.inf
+++ b/boot/bootdata/hivesys_i386.inf
@@ -901,13 +901,11 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices","UNC",0x0000
; System environment settings
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","ComSpec",0x00020000,"%SystemRoot%\system32\cmd.exe"
-HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","OS",0x00020000,"ReactOS"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","Path",0x00020000,"%SystemRoot%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\system32\wbem"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","windir",0x00020000,"%SystemRoot%"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","TEMP",0x00020000,"%SystemDrive%\TEMP"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","TMP",0x00020000,"%SystemDrive%\TEMP"
-HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PATHEXT",0x00020000,".COM;.EXE;.BAT;.CMD"
-HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PROCESSOR_ARCHITECTURE",0x00020000,"x86"
+HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PATHEXT",0x00000000,".COM;.EXE;.BAT;.CMD"
; Known DLLs
@@ -932,9 +930,8 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","version",0x00
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","wininet",0x00000000,"wininet.dll"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","wldap32",0x00000000,"wldap32.dll"
-; Pagefile settings
-HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management","PagingFiles",0x00010000, \
- "C:\pagefile.sys"
+; Memory Management
+HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management",,0x00000012
; Subsystems
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Debug",0x00020000,""
diff --git a/boot/bootdata/packages/reactos.dff b/boot/bootdata/packages/reactos.dff
index c76e469d7f2..12db9f8d330 100644
--- a/boot/bootdata/packages/reactos.dff
+++ b/boot/bootdata/packages/reactos.dff
@@ -756,6 +756,8 @@ modules\rosapps\drivers\green\green.sys 2 o
; Rostests
modules\rostests\rosautotest\rosautotest.exe 1 optional
+modules\rostests\drivers\kmtest\kmtest.sys 2 optional
+modules\rostests\drivers\kmtest\kmtestassist.sys 2 optional
modules\rostests\tests\pseh2\pseh2_test.exe 7 optional
modules\rostests\winetests\advapi32\advapi32_winetest.exe 7 optional
modules\rostests\winetests\advpack\advpack_winetest.exe 7 optional
diff --git a/boot/bootdata/txtsetup.sif b/boot/bootdata/txtsetup.sif
index 35f1c761937..c822c2fbc3e 100644
--- a/boot/bootdata/txtsetup.sif
+++ b/boot/bootdata/txtsetup.sif
@@ -11,6 +11,10 @@ Signature = "$ReactOS$"
6 = Fonts
7 = bin
+[DiskSpaceRequirements]
+; Required free system partition disk space in MB
+FreeSysPartDiskSpace=350
+
[SourceDisksFiles]
acpi.sys=,,,,,,,,,,,,4
uniata.sys=,,,,,,x,,,,,,4
@@ -54,7 +58,7 @@ Cabinet=reactos.cab
[SetupData]
DefaultPath = \ReactOS
OsLoadOptions = "/NOGUIBOOT /NODEBUG"
-DbgOsLoadOptions = "/NOGUIBOOT /DEBUGPORT=COM1"
+DbgOsLoadOptions = "/NOGUIBOOT /DEBUGPORT=COM1 /FIRSTCHANCE /KDSERIAL"
;OsLoadOptions = "/NOGUIBOOT /DEBUGPORT=SCREEN"
;OsLoadOptions = "/NOGUIBOOT /DEBUGPORT=BOCHS"
diff --git a/boot/freeldr/freeldr/arch/i386/hardware.c b/boot/freeldr/freeldr/arch/i386/hardware.c
index 97577aa020c..f99e26780d6 100644
--- a/boot/freeldr/freeldr/arch/i386/hardware.c
+++ b/boot/freeldr/freeldr/arch/i386/hardware.c
@@ -433,41 +433,22 @@ static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
ULONGLONG SectorOffset = 0;
ULONGLONG SectorCount = 0;
PARTITION_TABLE_ENTRY PartitionTableEntry;
- GEOMETRY Geometry;
- EXTENDED_GEOMETRY ExtGeometry;
CHAR FileName[1];
if (!DissectArcPath(Path, FileName, &DriveNumber, &DrivePartition))
return EINVAL;
- ExtGeometry.Size = sizeof(EXTENDED_GEOMETRY);
- if (DiskGetExtendedDriveParameters(DriveNumber, &ExtGeometry, ExtGeometry.Size))
+ if (DrivePartition == 0xff)
{
- SectorSize = ExtGeometry.BytesPerSector;
- SectorCount = ExtGeometry.Sectors;
- }
- else if (MachDiskGetDriveGeometry(DriveNumber, &Geometry))
- {
- SectorSize = Geometry.BytesPerSector;
- SectorCount = Geometry.Sectors;
+ /* This is a CD-ROM device */
+ SectorSize = 2048;
}
else
{
- DPRINTM(DPRINT_HWDETECT, "Using legacy sector size detection\n");
-
- /* Fall back to legacy detection */
- if (DrivePartition == 0xff)
- {
- /* This is a CD-ROM device */
- SectorSize = 2048;
- }
- else
- {
- /* This is either a floppy disk device (DrivePartition == 0) or
- * a hard disk device (DrivePartition != 0 && DrivePartition != 0xFF) but
- * it doesn't matter which one because they both have 512 bytes per sector */
- SectorSize = 512;
- }
+ /* This is either a floppy disk device (DrivePartition == 0) or
+ * a hard disk device (DrivePartition != 0 && DrivePartition != 0xFF) but
+ * it doesn't matter which one because they both have 512 bytes per sector */
+ SectorSize = 512;
}
if (DrivePartition != 0xff && DrivePartition != 0)
diff --git a/boot/freeldr/freeldr/arch/i386/i386disk.c b/boot/freeldr/freeldr/arch/i386/i386disk.c
index a1e9877e50e..bcee4538a07 100644
--- a/boot/freeldr/freeldr/arch/i386/i386disk.c
+++ b/boot/freeldr/freeldr/arch/i386/i386disk.c
@@ -51,10 +51,32 @@ BOOLEAN DiskResetController(ULONG DriveNumber)
BOOLEAN DiskInt13ExtensionsSupported(ULONG DriveNumber)
{
+ static ULONG LastDriveNumber = 0xffffffff;
+ static BOOLEAN LastSupported;
REGS RegsIn;
REGS RegsOut;
- DPRINTM(DPRINT_DISK, "DiskInt13ExtensionsSupported()\n");
+ DPRINTM(DPRINT_DISK, "PcDiskInt13ExtensionsSupported()\n");
+
+ if (DriveNumber == LastDriveNumber)
+ {
+ DPRINTM(DPRINT_DISK, "Using cached value %s for drive 0x%x\n", LastSupported ? "TRUE" : "FALSE", DriveNumber);
+ return LastSupported;
+ }
+
+ // Some BIOSes report that extended disk access functions are not supported
+ // when booting from a CD (e.g. Phoenix BIOS v6.00PG and Insyde BIOS shipping
+ // with Intel Macs). Therefore we just return TRUE if we're booting from a CD -
+ // we can assume that all El Torito capable BIOSes support INT 13 extensions.
+ // We simply detect whether we're booting from CD by checking whether the drive
+ // number is >= 0x8A. It's 0x90 on the Insyde BIOS, and 0x9F on most other BIOSes.
+ if (DriveNumber >= 0x8A)
+ {
+ LastSupported = TRUE;
+ return TRUE;
+ }
+
+ LastDriveNumber = DriveNumber;
// IBM/MS INT 13 Extensions - INSTALLATION CHECK
// AH = 41h
@@ -90,35 +112,27 @@ BOOLEAN DiskInt13ExtensionsSupported(ULONG DriveNumber)
if (!INT386_SUCCESS(RegsOut))
{
// CF set on error (extensions not supported)
+ LastSupported = FALSE;
return FALSE;
}
if (RegsOut.w.bx != 0xAA55)
{
// BX = AA55h if installed
+ LastSupported = FALSE;
return FALSE;
}
- // Note:
- // The original check is too strict because some BIOSes report that
- // extended disk access functions are not suported when booting
- // from a CD (e.g. Phoenix BIOS v6.00PG). Argh!
-#if 0
if (!(RegsOut.w.cx & 0x0001))
{
// CX = API subset support bitmap
// Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported
- return FALSE;
- }
-#endif
-
- // Use this relaxed check instead
- if (RegsOut.w.cx == 0x0000)
- {
- // CX = API subset support bitmap
+ DbgPrint("Suspicious API subset support bitmap 0x%x on device 0x%lx\n", RegsOut.w.cx, DriveNumber);
+ LastSupported = FALSE;
return FALSE;
}
+ LastSupported = TRUE;
return TRUE;
}
@@ -135,6 +149,9 @@ BOOLEAN DiskGetExtendedDriveParameters(ULONG DriveNumber, PVOID Buffer, USHORT B
DPRINTM(DPRINT_DISK, "DiskGetExtendedDriveParameters()\n");
+ if (!DiskInt13ExtensionsSupported(DriveNumber))
+ return FALSE;
+
// Initialize transfer buffer
*Ptr = BufferSize;
diff --git a/boot/freeldr/freeldr/arch/i386/pcdisk.c b/boot/freeldr/freeldr/arch/i386/pcdisk.c
index c0eeb0b7d41..304a8670107 100644
--- a/boot/freeldr/freeldr/arch/i386/pcdisk.c
+++ b/boot/freeldr/freeldr/arch/i386/pcdisk.c
@@ -264,93 +264,6 @@ static BOOLEAN PcDiskReadLogicalSectorsCHS(ULONG DriveNumber, ULONGLONG SectorNu
return TRUE;
}
-static BOOLEAN PcDiskInt13ExtensionsSupported(ULONG DriveNumber)
-{
- static ULONG LastDriveNumber = 0xffffffff;
- static BOOLEAN LastSupported;
- REGS RegsIn;
- REGS RegsOut;
-
- DPRINTM(DPRINT_DISK, "PcDiskInt13ExtensionsSupported()\n");
-
- if (DriveNumber == LastDriveNumber)
- {
- DPRINTM(DPRINT_DISK, "Using cached value %s for drive 0x%x\n", LastSupported ? "TRUE" : "FALSE", DriveNumber);
- return LastSupported;
- }
-
- // Some BIOSes report that extended disk access functions are not supported
- // when booting from a CD (e.g. Phoenix BIOS v6.00PG and Insyde BIOS shipping
- // with Intel Macs). Therefore we just return TRUE if we're booting from a CD -
- // we can assume that all El Torito capable BIOSes support INT 13 extensions.
- // We simply detect whether we're booting from CD by checking whether the drive
- // number is >= 0x90. It's 0x90 on the Insyde BIOS, and 0x9F on most other BIOSes.
- if (DriveNumber >= 0x90)
- {
- LastSupported = TRUE;
- return TRUE;
- }
-
- LastDriveNumber = DriveNumber;
-
- // IBM/MS INT 13 Extensions - INSTALLATION CHECK
- // AH = 41h
- // BX = 55AAh
- // DL = drive (80h-FFh)
- // Return:
- // CF set on error (extensions not supported)
- // AH = 01h (invalid function)
- // CF clear if successful
- // BX = AA55h if installed
- // AH = major version of extensions
- // 01h = 1.x
- // 20h = 2.0 / EDD-1.0
- // 21h = 2.1 / EDD-1.1
- // 30h = EDD-3.0
- // AL = internal use
- // CX = API subset support bitmap
- // DH = extension version (v2.0+ ??? -- not present in 1.x)
- //
- // Bitfields for IBM/MS INT 13 Extensions API support bitmap
- // Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported
- // Bit 1, removable drive controller functions (AH=45h,46h,48h,49h,INT 15/AH=52h) supported
- // Bit 2, enhanced disk drive (EDD) functions (AH=48h,AH=4Eh) supported
- // extended drive parameter table is valid
- // Bits 3-15 reserved
- RegsIn.b.ah = 0x41;
- RegsIn.w.bx = 0x55AA;
- RegsIn.b.dl = DriveNumber;
-
- // Reset the disk controller
- Int386(0x13, &RegsIn, &RegsOut);
-
- if (!INT386_SUCCESS(RegsOut))
- {
- // CF set on error (extensions not supported)
- LastSupported = FALSE;
- return FALSE;
- }
-
- if (RegsOut.w.bx != 0xAA55)
- {
- // BX = AA55h if installed
- LastSupported = FALSE;
- return FALSE;
- }
-
- if (!(RegsOut.w.cx & 0x0001))
- {
- // CX = API subset support bitmap
- // Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported
- printf("Suspicious API subset support bitmap 0x%x on device 0x%lx\n", RegsOut.w.cx, DriveNumber);
- LastSupported = FALSE;
- return FALSE;
- }
-
- LastSupported = TRUE;
- return TRUE;
-}
-
BOOLEAN PcDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer)
{
@@ -361,9 +274,9 @@ BOOLEAN PcDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG SectorNumber, ULON
// If so then check to see if Int13 extensions work
// If they do then use them, otherwise default back to BIOS calls
//
- if ((DriveNumber >= 0x80) && PcDiskInt13ExtensionsSupported(DriveNumber))
+ if ((DriveNumber >= 0x80) && DiskInt13ExtensionsSupported(DriveNumber))
{
- DPRINTM(DPRINT_DISK, "Using Int 13 Extensions for read. PcDiskInt13ExtensionsSupported(%d) = %s\n", DriveNumber, PcDiskInt13ExtensionsSupported(DriveNumber) ? "TRUE" : "FALSE");
+ DPRINTM(DPRINT_DISK, "Using Int 13 Extensions for read. DiskInt13ExtensionsSupported(%d) = %s\n", DriveNumber, DiskInt13ExtensionsSupported(DriveNumber) ? "TRUE" : "FALSE");
//
// LBA is easy, nothing to calculate
diff --git a/boot/freeldr/freeldr/fs/ntfs.c b/boot/freeldr/freeldr/fs/ntfs.c
index 830e3ade042..aff3bfaa339 100644
--- a/boot/freeldr/freeldr/fs/ntfs.c
+++ b/boot/freeldr/freeldr/fs/ntfs.c
@@ -1,6 +1,7 @@
/*
* FreeLoader NTFS support
* Copyright (C) 2004 Filip Navara
+ * Copyright (C) 2009-2010 Hervé Poussineau
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -37,6 +38,7 @@ typedef struct _NTFS_VOLUME_INFO
/* FIXME: MFTContext is never freed. */
PNTFS_ATTR_CONTEXT MFTContext;
ULONG DeviceId;
+ PUCHAR TemporarySector;
} NTFS_VOLUME_INFO;
PNTFS_VOLUME_INFO NtfsVolumes[MAX_FDS];
@@ -147,10 +149,17 @@ static BOOLEAN NtfsDiskRead(PNTFS_VOLUME_INFO Volume, ULONGLONG Offset, ULONGLON
ret = ArcSeek(Volume->DeviceId, &Position, SeekAbsolute);
if (ret != ESUCCESS)
return FALSE;
- ReadLength = min(Length, Volume->BootSector.BytesPerSector - (Offset % Volume->BootSector.BytesPerSector));
- ret = ArcRead(Volume->DeviceId, Buffer, ReadLength, &Count);
- if (ret != ESUCCESS || Count != ReadLength)
+ ret = ArcRead(Volume->DeviceId, Volume->TemporarySector, Volume->BootSector.BytesPerSector, &Count);
+ if (ret != ESUCCESS || Count != Volume->BootSector.BytesPerSector)
return FALSE;
+ ReadLength = min(Length, Volume->BootSector.BytesPerSector - (Offset % Volume->BootSector.BytesPerSector));
+
+ //
+ // Copy interesting data
+ //
+ RtlCopyMemory(Buffer,
+ &Volume->TemporarySector[Offset % Volume->BootSector.BytesPerSector],
+ ReadLength);
//
// Move to unfilled buffer part
@@ -232,7 +241,9 @@ static ULONGLONG NtfsReadAttribute(PNTFS_VOLUME_INFO Volume, PNTFS_ATTR_CONTEXT
AlreadyRead = 0;
- if(Context->CacheRunOffset <= Offset && Offset < Context->CacheRunOffset + Context->CacheRunLength * Volume->ClusterSize)
+ // FIXME: Cache seems to be non-working. Disable it for now
+ //if(Context->CacheRunOffset <= Offset && Offset < Context->CacheRunOffset + Context->CacheRunLength * Volume->ClusterSize)
+ if (0)
{
DataRun = Context->CacheRun;
LastLCN = Context->CacheRunLastLCN;
@@ -790,6 +801,7 @@ LONG NtfsOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
return ENOENT;
}
+ FsSetDeviceSpecific(*FileId, FileHandle);
return ESUCCESS;
}
@@ -930,6 +942,18 @@ const DEVVTBL* NtfsMount(ULONG DeviceId)
return NULL;
}
+ //
+ // Keep room to read partial sectors
+ //
+ Volume->TemporarySector = MmHeapAlloc(Volume->BootSector.BytesPerSector);
+ if (!Volume->TemporarySector)
+ {
+ FileSystemError("Failed to allocate memory.");
+ MmHeapFree(Volume->MasterFileTable);
+ MmHeapFree(Volume);
+ return NULL;
+ }
+
//
// Keep device id
//
diff --git a/boot/freeldr/freeldr/include/options.h b/boot/freeldr/freeldr/include/options.h
index 124b64e2326..b00d9f58daf 100644
--- a/boot/freeldr/freeldr/include/options.h
+++ b/boot/freeldr/freeldr/include/options.h
@@ -20,3 +20,4 @@
#pragma once
VOID DoOptionsMenu(VOID);
+VOID AppendBootTimeOptions(PCHAR BootOptions);
diff --git a/boot/freeldr/freeldr/options.c b/boot/freeldr/freeldr/options.c
index 4dabc89c6f4..5b64b46a077 100644
--- a/boot/freeldr/freeldr/options.c
+++ b/boot/freeldr/freeldr/options.c
@@ -69,6 +69,15 @@ enum OptionMenuItems
ULONG OptionsMenuItemCount = sizeof(OptionsMenuList) / sizeof(OptionsMenuList[0]);
+BOOLEAN SafeMode = FALSE;
+BOOLEAN SafeModeWithNetworking = FALSE;
+BOOLEAN SafeModeWithCommandPrompt = FALSE;
+BOOLEAN BootLogging = FALSE;
+BOOLEAN VgaMode = FALSE;
+BOOLEAN LastKnownGoodConfiguration = FALSE;
+BOOLEAN DirectoryServicesRepairMode = FALSE;
+BOOLEAN DebuggingMode = FALSE;
+
VOID DoOptionsMenu(VOID)
{
ULONG SelectedMenuItem;
@@ -85,22 +94,33 @@ VOID DoOptionsMenu(VOID)
switch (SelectedMenuItem)
{
case SAFE_MODE:
+ SafeMode = TRUE;
+ BootLogging = TRUE;
break;
case SAFE_MODE_WITH_NETWORKING:
+ SafeModeWithNetworking = TRUE;
+ BootLogging = TRUE;
break;
case SAFE_MODE_WITH_COMMAND_PROMPT:
+ SafeModeWithCommandPrompt = TRUE;
+ BootLogging = TRUE;
break;
//case SEPARATOR1:
// break;
case ENABLE_BOOT_LOGGING:
+ BootLogging = TRUE;
break;
case ENABLE_VGA_MODE:
+ VgaMode = TRUE;
break;
case LAST_KNOWN_GOOD_CONFIGURATION:
+ LastKnownGoodConfiguration = TRUE;
break;
case DIRECTORY_SERVICES_RESTORE_MODE:
+ DirectoryServicesRepairMode = TRUE;
break;
case DEBUGGING_MODE:
+ DebuggingMode = TRUE;
break;
//case SEPARATOR2:
// break;
@@ -117,3 +137,29 @@ VOID DoOptionsMenu(VOID)
}
}
+VOID AppendBootTimeOptions(PCHAR BootOptions)
+{
+ if (SafeMode)
+ strcat(BootOptions, " /SAFEBOOT:MINIMAL /SOS"); //FIXME: NOGUIBOOT should also be specified
+
+ if (SafeModeWithNetworking)
+ strcat(BootOptions, " /SAFEBOOT:NETWORK /SOS"); //FIXME: NOGUIBOOT should also be specified
+
+ if (SafeModeWithCommandPrompt)
+ strcat(BootOptions, " /SAFEBOOT:MINIMAL(ALTERNATESHELL) /SOS"); //FIXME: NOGUIBOOT should also be specified
+
+ if (BootLogging)
+ strcat(BootOptions, " /BOOTLOG");
+
+ if (VgaMode)
+ strcat(BootOptions, " /BASEVIDEO");
+
+ if (LastKnownGoodConfiguration)
+ DbgPrint("Last known good configuration is not supported yet!\n");
+
+ if (DirectoryServicesRepairMode)
+ strcat(BootOptions, " /SAFEBOOT:DSREPAIR /SOS");
+
+ if (DebuggingMode)
+ strcat(BootOptions, " /DEBUG");
+}
diff --git a/boot/freeldr/freeldr/reactos/reactos.c b/boot/freeldr/freeldr/reactos/reactos.c
index 81b654b84b9..22f3771b28b 100644
--- a/boot/freeldr/freeldr/reactos/reactos.c
+++ b/boot/freeldr/freeldr/reactos/reactos.c
@@ -606,6 +606,11 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
//
if (IniReadSettingByName(SectionId, "Options", value, sizeof(value)))
{
+ //
+ // Append boot-time options
+ //
+ AppendBootTimeOptions(value);
+
//
// Check if a ramdisk file was given
//
diff --git a/boot/freeldr/freeldr/windows/winldr.c b/boot/freeldr/freeldr/windows/winldr.c
index d130472ebae..c068517dd2b 100644
--- a/boot/freeldr/freeldr/windows/winldr.c
+++ b/boot/freeldr/freeldr/windows/winldr.c
@@ -475,6 +475,9 @@ LoadAndBootWindows(PCSTR OperatingSystemName,
DPRINTM(DPRINT_WINDOWS,"BootOptions: '%s'\n", BootOptions);
}
+ /* Append boot-time options */
+ AppendBootTimeOptions(BootOptions);
+
//
// Check if a ramdisk file was given
//
diff --git a/dll/3rdparty/libjpeg/libjpeg.rbuild b/dll/3rdparty/libjpeg/libjpeg.rbuild
index 990e595377f..9749f7ab35e 100644
--- a/dll/3rdparty/libjpeg/libjpeg.rbuild
+++ b/dll/3rdparty/libjpeg/libjpeg.rbuild
@@ -1,11 +1,11 @@
- -Wno-main
+ mainptr
.
jcapimin.c
jcapistd.c
diff --git a/dll/cpl/desk/screensaver.c b/dll/cpl/desk/screensaver.c
index c24cf78620c..00ce09568b2 100644
--- a/dll/cpl/desk/screensaver.c
+++ b/dll/cpl/desk/screensaver.c
@@ -147,33 +147,32 @@ static BOOL
WaitForSettingsDialog(HWND hwndDlg,
HANDLE hProcess)
{
+ DWORD dwResult;
+ MSG msg;
+
while (TRUE)
{
- DWORD Ret;
- MSG msg;
-
- while (PeekMessage(&msg,
- NULL,
- 0,
- 0,
- PM_REMOVE))
+ dwResult = MsgWaitForMultipleObjects(1,
+ &hProcess,
+ FALSE,
+ INFINITE,
+ QS_ALLINPUT);
+ if (dwResult == WAIT_OBJECT_0 + 1)
{
- if (msg.message == WM_QUIT)
- return FALSE;
-
- if (IsDialogMessage(hwndDlg, &msg))
+ if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
- TranslateMessage(&msg);
- DispatchMessage(&msg);
+ if (msg.message == WM_QUIT)
+ {
+ return FALSE;
+ }
+ if (IsDialogMessage(hwndDlg, &msg))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
}
}
-
- Ret = MsgWaitForMultipleObjects(1,
- &hProcess,
- FALSE,
- INFINITE,
- QS_ALLINPUT);
- if (Ret == (WAIT_OBJECT_0))
+ else
{
return TRUE;
}
diff --git a/dll/cpl/intl/lang/cs-CZ.rc b/dll/cpl/intl/lang/cs-CZ.rc
index c72579df513..6685326e741 100644
--- a/dll/cpl/intl/lang/cs-CZ.rc
+++ b/dll/cpl/intl/lang/cs-CZ.rc
@@ -1,6 +1,6 @@
/* FILE: dll/cpl/intl/lang/cs-CZ.rc
* TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com)
- * UPDATED: 2009-07-16
+ * UPDATED: 2010-05-22
*/
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
@@ -193,8 +193,8 @@ STRINGTABLE
BEGIN
IDS_CUSTOMIZE_TITLE "Přizpůsobit místní nastavení"
IDS_SPAIN "Španělština (Španělsko)"
- IDS_METRIC "Metric"
- IDS_IMPERIAL "Imperial"
+ IDS_METRIC "Metrický"
+ IDS_IMPERIAL "Imperiální"
END
STRINGTABLE
diff --git a/dll/cpl/intl/lang/it-IT.rc b/dll/cpl/intl/lang/it-IT.rc
index ee1513a685c..eaaf6683f05 100644
--- a/dll/cpl/intl/lang/it-IT.rc
+++ b/dll/cpl/intl/lang/it-IT.rc
@@ -181,7 +181,7 @@ FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Ordinamento", -1, 7, 7, 230, 74
LTEXT "Il metodo di ordinamento definisce come considerare l'ordine di caratteri, parole, file e cartelle.", -1, 14, 17, 220, 25
- LTEXT "Scegliere il metodo di orinamento per il vostro linguaggio:", -1, 14, 37, 220, 22
+ LTEXT "Scegliere il metodo di ordinamento per il vostro linguaggio:", -1, 14, 37, 220, 22
COMBOBOX IDC_SORTLIST_COMBO, 14, 56, 217, 83, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
END
diff --git a/dll/cpl/intl/lang/pl-PL.rc b/dll/cpl/intl/lang/pl-PL.rc
index a80e5dba5da..3b566acdc75 100644
--- a/dll/cpl/intl/lang/pl-PL.rc
+++ b/dll/cpl/intl/lang/pl-PL.rc
@@ -1,5 +1,5 @@
/*
- * translated by Caemyr - Olaf Siejka (Jan, 2008)
+ * translated by Caemyr - Olaf Siejka (Jan, 2008; May 2010)
* Use ReactOS forum PM or IRC to contact me
* http://www.reactos.org
* IRC: irc.freenode.net #reactos-pl;
@@ -195,8 +195,8 @@ STRINGTABLE
BEGIN
IDS_CUSTOMIZE_TITLE "Dostosuj Ustawienia regionalne"
IDS_SPAIN "Hiszpański (Hiszpania)"
- IDS_METRIC "Metric"
- IDS_IMPERIAL "Imperial"
+ IDS_METRIC "Metryczne"
+ IDS_IMPERIAL "Imperialne"
END
STRINGTABLE
diff --git a/dll/cpl/mmsys/lang/de-DE.rc b/dll/cpl/mmsys/lang/de-DE.rc
index 81e3d437828..6ddf8ae5a35 100644
--- a/dll/cpl/mmsys/lang/de-DE.rc
+++ b/dll/cpl/mmsys/lang/de-DE.rc
@@ -36,9 +36,9 @@ BEGIN
LTEXT "&Programmereignisse:",-1,8,118,150,17
CONTROL "", IDC_SCHEME_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, 8, 130, 230, 60, WS_EX_CLIENTEDGE
LTEXT "&Klänge:", IDC_TEXT_SOUND,8,194,80,17, WS_DISABLED
- COMBOBOX IDC_SOUND_LIST, 8, 205, 155, 146, CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_DISABLED
- PUSHBUTTON "", IDC_PLAY_SOUND, 168,205,15,15, WS_DISABLED | BS_ICON
- PUSHBUTTON "&Durchsuchen...", IDC_BROWSE_SOUND, 188,205,81,15, WS_DISABLED
+ COMBOBOX IDC_SOUND_LIST, 8, 205, 135, 146, CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_DISABLED
+ PUSHBUTTON "", IDC_PLAY_SOUND, 148,205,15,15, WS_DISABLED | BS_ICON
+ PUSHBUTTON "&Durchsuchen...", IDC_BROWSE_SOUND, 168,205,70,15, WS_DISABLED
END
IDD_AUDIO DIALOGEX 0, 0, 246, 228
diff --git a/dll/cpl/mmsys/sounds.c b/dll/cpl/mmsys/sounds.c
index be314e181e0..c7ff17187a5 100644
--- a/dll/cpl/mmsys/sounds.c
+++ b/dll/cpl/mmsys/sounds.c
@@ -718,6 +718,14 @@ LoadSoundFiles(HWND hwndDlg)
LRESULT lResult;
UINT length;
+ /* Add no sound listview item */
+ if (LoadString(hApplet, IDS_NO_SOUND, szPath, MAX_PATH))
+ {
+ szPath[(sizeof(szPath)/sizeof(WCHAR))-1] = L'\0';
+ SendDlgItemMessageW(hwndDlg, IDC_SOUND_LIST, CB_ADDSTRING, (WPARAM)0, (LPARAM)szPath);
+ }
+
+ /* Load sound files */
length = GetWindowsDirectoryW(szPath, MAX_PATH);
if (length == 0 || length >= MAX_PATH - 9)
{
@@ -736,11 +744,6 @@ LoadSoundFiles(HWND hwndDlg)
{
return FALSE;
}
- if (LoadString(hApplet, IDS_NO_SOUND, szPath, MAX_PATH))
- {
- szPath[(sizeof(szPath)/sizeof(WCHAR))-1] = L'\0';
- SendDlgItemMessageW(hwndDlg, IDC_SOUND_LIST, CB_ADDSTRING, (WPARAM)0, (LPARAM)szPath);
- }
do
{
@@ -1054,6 +1057,7 @@ SoundsDlgProc(HWND hwndDlg,
ZeroMemory(&item, sizeof(LVITEM));
item.mask = LVIF_PARAM;
item.iItem = nm->iItem;
+
if (ListView_GetItem(GetDlgItem(hwndDlg, IDC_SCHEME_LIST), &item))
{
LRESULT lCount, lIndex, lResult;
diff --git a/dll/cpl/sysdm/lang/bg-BG.rc b/dll/cpl/sysdm/lang/bg-BG.rc
index cd0cca37d03..c358cf4e3e1 100644
--- a/dll/cpl/sysdm/lang/bg-BG.rc
+++ b/dll/cpl/sysdm/lang/bg-BG.rc
@@ -284,4 +284,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Âčä"
IDS_USERPROFILE_STATUS "Ńúńňî˙íčĺ"
IDS_USERPROFILE_MODIFIED "Čçěĺíĺí"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/cs-CZ.rc b/dll/cpl/sysdm/lang/cs-CZ.rc
index 5be033c26d3..2e11444dea1 100644
--- a/dll/cpl/sysdm/lang/cs-CZ.rc
+++ b/dll/cpl/sysdm/lang/cs-CZ.rc
@@ -289,4 +289,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Typ"
IDS_USERPROFILE_STATUS "Status"
IDS_USERPROFILE_MODIFIED "Upraveno"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/da-DK.rc b/dll/cpl/sysdm/lang/da-DK.rc
index 4e680cba885..136a1dec301 100644
--- a/dll/cpl/sysdm/lang/da-DK.rc
+++ b/dll/cpl/sysdm/lang/da-DK.rc
@@ -123,4 +123,9 @@ BEGIN
IDS_MINI_DUMP "Minidump(64KB)"
IDS_KERNEL_DUMP "Kernel dump"
IDS_FULL_DUMP "Complete dump"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/de-DE.rc b/dll/cpl/sysdm/lang/de-DE.rc
index 92282242d97..eec7d1eff51 100644
--- a/dll/cpl/sysdm/lang/de-DE.rc
+++ b/dll/cpl/sysdm/lang/de-DE.rc
@@ -202,7 +202,7 @@ BEGIN
LTEXT "", IDC_SPACEAVAIL, 105, 92, 104, 9
LTEXT "&Anfangsgröße (MB):", -1, 22, 118, 70, 9
LTEXT "Ma&ximale Größe (MB):", -1, 22, 131, 75, 9
- AUTORADIOBUTTON "&Benutzerdefinierte Größe", IDC_CUSTOM, 20, 105, 90, 9, WS_GROUP
+ AUTORADIOBUTTON "&Benutzerdefinierte Größe", IDC_CUSTOM, 20, 105, 95, 9, WS_GROUP
AUTORADIOBUTTON "Größe wird vom &System verwaltet", IDC_SYSMANSIZE, 20, 145, 120, 9
AUTORADIOBUTTON "&Keine Auslagerungsdatei", IDC_NOPAGEFILE, 20, 158, 90, 9
EDITTEXT IDC_INITIALSIZE, 100, 114, 44, 13, NOT WS_BORDER, WS_EX_CLIENTEDGE
@@ -289,5 +289,10 @@ BEGIN
IDS_USERPROFILE_TYPE "Typ"
IDS_USERPROFILE_STATUS "Status"
IDS_USERPROFILE_MODIFIED "Geändert"
+ IDS_MESSAGEBOXTITLE "Systemsteuerungsoption ""System"""
+ IDS_WARNINITIALSIZE "Geben Sie einen numerischen Wert für die Anfangsgröße der Auslagerungsdatei an."
+ IDS_WARNMAXIMUMSIZE "Geben Sie einen numerischen Wert für die Maximalgröße der Auslagerungsdatei an."
+ IDS_WARNINITIALRANGE "Die Anfangsgröße der Auslagerungsdatei darf nicht kleiner als 2 MB sein und darf den verfügbaren Speicherplatz auf dem gewählten Laufwerk nicht überschreiten."
+ IDS_WARNMAXIMUMRANGE "Die Maximalgröße der Auslagerungsdatei darf nicht kleiner als die Anfangsgröße sein und darf den verfügbaren Speicherplatz auf dem gewählten Laufwerk nicht überschreiten."
IDS_DEVS "\nReactOS Team\n\nProjektkoordinator\n\nAleksey Bragin\n\nEntwicklerteam\n\nAleksey Bragin\nAndrew Greenwood\nAndrey Korotaev\nArt Yerkes\nChristoph von Wittich\nColin Finck\nDaniel Reimer\nDmitry Chapyshev\nEric Kohl\nGed Murphy\nGregor Brunmar\nHervé Poussineau\nJames Tabor\nJeffrey Morlan\nJohannes Anderwald\nKJK::Hyperion\nMaarten Bosma\nMagnus Olsen\nMarc Piulachs\nMatthias Kupfer\nMike Nordell\nPeter Ward\nPierre Schweitzer\nSaveliy Tretiakov\nStefan Ginsberg\nSylvain Petreolle\nThomas Blümel\nTimo Kreuzer \n\nAlex Ionescu\nFilip Navara\nGunnar Dalsnes\nMartin Fuchs\nRoyce Mitchell III\nBrandon Turner\nBrian Palmer\nCasper Hornstrup\nDavid Welch\nEmanuele Aliberti\nGé van Geldorp\nGregor Anich\nJason Filby\nJens Collin\nMichael Wirth\nNathan Woods\nRobert Dickenson\nRex Jolliff\nVizzini \n\nRelease Verantwortliche\n\nColin Finck\nZ98\n\nWebseitenteam\n\nColin Finck\nJaix Bly\nKlemens Friedl\nZ98\n\nMedienteam\n\nMindflyer\nWierd_W\n\nweiterer Dank geht an\n\nalle Mitwirkenden\nWine Team\n\n"
END
diff --git a/dll/cpl/sysdm/lang/el-GR.rc b/dll/cpl/sysdm/lang/el-GR.rc
index 98ff6946bd1..426438a5853 100644
--- a/dll/cpl/sysdm/lang/el-GR.rc
+++ b/dll/cpl/sysdm/lang/el-GR.rc
@@ -285,4 +285,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Ôýđďň"
IDS_USERPROFILE_STATUS "ĘáôÜóôáóç"
IDS_USERPROFILE_MODIFIED "ÔńďđďđďéŢčçęĺ"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/en-US.rc b/dll/cpl/sysdm/lang/en-US.rc
index 73b8a17d3aa..c1d7fa93eeb 100644
--- a/dll/cpl/sysdm/lang/en-US.rc
+++ b/dll/cpl/sysdm/lang/en-US.rc
@@ -284,5 +284,10 @@ BEGIN
IDS_USERPROFILE_TYPE "Type"
IDS_USERPROFILE_STATUS "Status"
IDS_USERPROFILE_MODIFIED "Modified"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
IDS_DEVS "\nReactOS Team\n\nProject Coordinator\n\nAleksey Bragin\n\nDevelopment Team\n\nAleksey Bragin\nAndrew Greenwood\nAndrey Korotaev\nArt Yerkes\nChristoph von Wittich\nColin Finck\nDaniel Reimer\nDmitry Chapyshev\nEric Kohl\nGed Murphy\nGregor Brunmar\nHervé Poussineau\nJames Tabor\nJeffrey Morlan\nJohannes Anderwald\nKJK::Hyperion\nMaarten Bosma\nMagnus Olsen\nMarc Piulachs\nMatthias Kupfer\nMike Nordell\nPeter Ward\nPierre Schweitzer\nSaveliy Tretiakov\nStefan Ginsberg\nSylvain Petreolle\nThomas Blümel\nTimo Kreuzer \n\nAlex Ionescu\nFilip Navara\nGunnar Dalsnes\nMartin Fuchs\nRoyce Mitchell III\nBrandon Turner\nBrian Palmer\nCasper Hornstrup\nDavid Welch\nEmanuele Aliberti\nGé van Geldorp\nGregor Anich\nJason Filby\nJens Collin\nMichael Wirth\nNathan Woods\nRobert Dickenson\nRex Jolliff\nVizzini \n\nRelease Engineers\n\nColin Finck\nZ98\n\nWebsite Team\n\nColin Finck\nJaix Bly\nKlemens Friedl\nZ98\n\nMedia Team\n\nMindflyer\nWierd_W\n\nfurther thanks go to\n\nall Contributers\nWine Team\n\n"
END
diff --git a/dll/cpl/sysdm/lang/es-ES.rc b/dll/cpl/sysdm/lang/es-ES.rc
index 69e46cfc606..7383919a99b 100644
--- a/dll/cpl/sysdm/lang/es-ES.rc
+++ b/dll/cpl/sysdm/lang/es-ES.rc
@@ -287,4 +287,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Tipo"
IDS_USERPROFILE_STATUS "Estado"
IDS_USERPROFILE_MODIFIED "Modificado"
+ IDS_MESSAGEBOXTITLE "Applet de sistema del panel de control"
+ IDS_WARNINITIALSIZE "Ingresar el tamańo inicial del archivo de paginación."
+ IDS_WARNMAXIMUMSIZE "Ingresar el tamańo máximo del archivo de paginación."
+ IDS_WARNINITIALRANGE "El tamańo inicial del archivo de paginación no puede ser inferior a 2 MB y no puede exceder el espacio disponible en la unidad seleccionada."
+ IDS_WARNMAXIMUMRANGE "El tamańo máximo del archivo de paginación no puede ser inferior al tamańo inicial y no puede exceder el espacio disponible en la unidad seleccionada."
END
diff --git a/dll/cpl/sysdm/lang/fr-FR.rc b/dll/cpl/sysdm/lang/fr-FR.rc
index e649b59beff..17fe2e15d6b 100644
--- a/dll/cpl/sysdm/lang/fr-FR.rc
+++ b/dll/cpl/sysdm/lang/fr-FR.rc
@@ -287,4 +287,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Type"
IDS_USERPROFILE_STATUS "Statut"
IDS_USERPROFILE_MODIFIED "Modifié"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/hu-HU.rc b/dll/cpl/sysdm/lang/hu-HU.rc
index 9b3a4624d62..1324096ab32 100644
--- a/dll/cpl/sysdm/lang/hu-HU.rc
+++ b/dll/cpl/sysdm/lang/hu-HU.rc
@@ -126,4 +126,9 @@ BEGIN
IDS_MINI_DUMP "Minidump(64KB)"
IDS_KERNEL_DUMP "Kernel dump"
IDS_FULL_DUMP "Complete dump"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/id-ID.rc b/dll/cpl/sysdm/lang/id-ID.rc
index 1025b1f5b6d..6bd09c9f406 100644
--- a/dll/cpl/sysdm/lang/id-ID.rc
+++ b/dll/cpl/sysdm/lang/id-ID.rc
@@ -281,4 +281,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Type"
IDS_USERPROFILE_STATUS "Status"
IDS_USERPROFILE_MODIFIED "Modified"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/it-IT.rc b/dll/cpl/sysdm/lang/it-IT.rc
index 253a4bd1084..0175497f2a9 100644
--- a/dll/cpl/sysdm/lang/it-IT.rc
+++ b/dll/cpl/sysdm/lang/it-IT.rc
@@ -284,5 +284,10 @@ BEGIN
IDS_USERPROFILE_TYPE "Tipo"
IDS_USERPROFILE_STATUS "Stato"
IDS_USERPROFILE_MODIFIED "Modificato"
+ IDS_MESSAGEBOXTITLE "Applet di sistema del pannello di controllo"
+ IDS_WARNINITIALSIZE "Immettere la dimensione iniziale del file di paging."
+ IDS_WARNMAXIMUMSIZE "Immettere la dimensione massima del file di paging."
+ IDS_WARNINITIALRANGE "La dimensione iniziale del file di paging non puň essere inferiore a 2 MB e non puň superare lo spazio disponibile nell'unitŕ selezionata."
+ IDS_WARNMAXIMUMRANGE "La dimensione massima del file di paging non puň essere inferiore a quella iniziale e non puň superare lo spazio disponibile nell'unitŕ selezionata."
IDS_DEVS "\nReactOS Team\n\nCoordinatore\n\nAleksey Bragin\n\nGruppo di sviluppo\n\nAleksey Bragin\nAndrew Greenwood\nAndrey Korotaev\nArt Yerkes\nChristoph von Wittich\nColin Finck\nDaniel Reimer\nDmitry Chapyshev\nEric Kohl\nGed Murphy\nGregor Brunmar\nHervé Poussineau\nJames Tabor\nJeffrey Morlan\nJohannes Anderwald\nKJK::Hyperion\nMaarten Bosma\nMagnus Olsen\nMarc Piulachs\nMatthias Kupfer\nMike Nordell\nPeter Ward\nPierre Schweitzer\nSaveliy Tretiakov\nStefan Ginsberg\nSylvain Petreolle\nThomas Blümel\nTimo Kreuzer \n\nAlex Ionescu\nFilip Navara\nGunnar Dalsnes\nMartin Fuchs\nRoyce Mitchell III\nBrandon Turner\nBrian Palmer\nCasper Hornstrup\nDavid Welch\nEmanuele Aliberti\nGé van Geldorp\nGregor Anich\nJason Filby\nJens Collin\nMichael Wirth\nNathan Woods\nRobert Dickenson\nRex Jolliff\nVizzini \n\nRelease Engineers\n\nColin Finck\nZ98\n\nWebsite Team\n\nColin Finck\nJaix Bly\nKlemens Friedl\nZ98\n\nMedia Team\n\nMindflyer\nWierd_W\n\nUlteriori ringraziamenti\n\na tutti i Contributers\nWine Team\n\n"
END
diff --git a/dll/cpl/sysdm/lang/ja-JP.rc b/dll/cpl/sysdm/lang/ja-JP.rc
index 2ce3b7c5f41..7b86e4e0f92 100644
--- a/dll/cpl/sysdm/lang/ja-JP.rc
+++ b/dll/cpl/sysdm/lang/ja-JP.rc
@@ -284,4 +284,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Ží—Ţ"
IDS_USERPROFILE_STATUS "Źó‘Ô"
IDS_USERPROFILE_MODIFIED "•ĎŤX“ú"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/nl-NL.rc b/dll/cpl/sysdm/lang/nl-NL.rc
index 888857b6205..94eca7ef70b 100644
--- a/dll/cpl/sysdm/lang/nl-NL.rc
+++ b/dll/cpl/sysdm/lang/nl-NL.rc
@@ -125,5 +125,9 @@ BEGIN
IDS_MINI_DUMP "Minidump(64KB)"
IDS_KERNEL_DUMP "Kernel dump"
IDS_FULL_DUMP "Complete dump"
-
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/no-NO.rc b/dll/cpl/sysdm/lang/no-NO.rc
index 98beebe5b50..4c6d9997b75 100644
--- a/dll/cpl/sysdm/lang/no-NO.rc
+++ b/dll/cpl/sysdm/lang/no-NO.rc
@@ -283,4 +283,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Type"
IDS_USERPROFILE_STATUS "Status"
IDS_USERPROFILE_MODIFIED "Modifisert"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/pl-PL.rc b/dll/cpl/sysdm/lang/pl-PL.rc
index b138c0afd90..91f7db5ed4c 100644
--- a/dll/cpl/sysdm/lang/pl-PL.rc
+++ b/dll/cpl/sysdm/lang/pl-PL.rc
@@ -288,4 +288,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Typ"
IDS_USERPROFILE_STATUS "Stan"
IDS_USERPROFILE_MODIFIED "Zmodyfikowano"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/ro-RO.rc b/dll/cpl/sysdm/lang/ro-RO.rc
index 7e5de71be46..ea9ea85bf1c 100644
--- a/dll/cpl/sysdm/lang/ro-RO.rc
+++ b/dll/cpl/sysdm/lang/ro-RO.rc
@@ -1,4 +1,4 @@
-LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
#pragma code_page(65001)
@@ -284,6 +284,11 @@ BEGIN
IDS_USERPROFILE_TYPE "Tip"
IDS_USERPROFILE_STATUS "Stare"
IDS_USERPROFILE_MODIFIED "Modificat"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
#pragma code_page(default)
diff --git a/dll/cpl/sysdm/lang/ru-RU.rc b/dll/cpl/sysdm/lang/ru-RU.rc
index caaef697bf2..72ecb3cc417 100644
--- a/dll/cpl/sysdm/lang/ru-RU.rc
+++ b/dll/cpl/sysdm/lang/ru-RU.rc
@@ -282,4 +282,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Ňčď"
IDS_USERPROFILE_STATUS "Ńîńňî˙íčĺ"
IDS_USERPROFILE_MODIFIED "Čçěĺíĺí"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/sk-SK.rc b/dll/cpl/sysdm/lang/sk-SK.rc
index 82fbc6035e9..497720ce90d 100644
--- a/dll/cpl/sysdm/lang/sk-SK.rc
+++ b/dll/cpl/sysdm/lang/sk-SK.rc
@@ -290,4 +290,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Typ"
IDS_USERPROFILE_STATUS "Stav"
IDS_USERPROFILE_MODIFIED "Modifikovaný"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/sv-SE.rc b/dll/cpl/sysdm/lang/sv-SE.rc
index c72592cdb89..124bbe935e9 100644
--- a/dll/cpl/sysdm/lang/sv-SE.rc
+++ b/dll/cpl/sysdm/lang/sv-SE.rc
@@ -284,4 +284,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Typ"
IDS_USERPROFILE_STATUS "Status"
IDS_USERPROFILE_MODIFIED "Ändrad"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/uk-UA.rc b/dll/cpl/sysdm/lang/uk-UA.rc
index 651a167d1ea..a92a15d4c0c 100644
--- a/dll/cpl/sysdm/lang/uk-UA.rc
+++ b/dll/cpl/sysdm/lang/uk-UA.rc
@@ -290,4 +290,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Ňčď"
IDS_USERPROFILE_STATUS "Ńňŕí"
IDS_USERPROFILE_MODIFIED "Çěłíĺíî"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/zh-CN.rc b/dll/cpl/sysdm/lang/zh-CN.rc
index 1abbce7477f..0ce9e187dd9 100644
--- a/dll/cpl/sysdm/lang/zh-CN.rc
+++ b/dll/cpl/sysdm/lang/zh-CN.rc
@@ -287,4 +287,9 @@ BEGIN
IDS_USERPROFILE_TYPE "ŔŕĐÍ"
IDS_USERPROFILE_STATUS "״̬"
IDS_USERPROFILE_MODIFIED "Đ޸Ä"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/precomp.h b/dll/cpl/sysdm/precomp.h
index 3ef2ee0d259..cf3afd6f62a 100644
--- a/dll/cpl/sysdm/precomp.h
+++ b/dll/cpl/sysdm/precomp.h
@@ -50,8 +50,9 @@ INT_PTR CALLBACK LicenceDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM l
typedef struct _PAGEFILE
{
TCHAR szDrive[3];
- INT InitialValue;
- INT MaxValue;
+ INT InitialSize;
+ INT MaximumSize;
+ INT FreeSize;
BOOL bUsed;
} PAGEFILE, *PPAGEFILE;
diff --git a/dll/cpl/sysdm/resource.h b/dll/cpl/sysdm/resource.h
index f0918a35d9f..885aae6c003 100644
--- a/dll/cpl/sysdm/resource.h
+++ b/dll/cpl/sysdm/resource.h
@@ -32,6 +32,11 @@
#define IDS_USERPROFILE_STATUS 75
#define IDS_USERPROFILE_MODIFIED 76
+#define IDS_MESSAGEBOXTITLE 77
+#define IDS_WARNINITIALSIZE 78
+#define IDS_WARNMAXIMUMSIZE 79
+#define IDS_WARNINITIALRANGE 80
+#define IDS_WARNMAXIMUMRANGE 81
/* propsheet - general */
#define IDD_PROPPAGEGENERAL 100
diff --git a/dll/cpl/sysdm/virtmem.c b/dll/cpl/sysdm/virtmem.c
index 6dcd9ad6457..c09b6e40dcf 100644
--- a/dll/cpl/sysdm/virtmem.c
+++ b/dll/cpl/sysdm/virtmem.c
@@ -110,7 +110,7 @@ ParseMemSettings(PVIRTMEM pVirtMem)
TCHAR szVolume[MAX_PATH];
TCHAR *szDisplayString;
INT InitialSize = 0;
- INT MaxSize = 0;
+ INT MaximumSize = 0;
INT DriveLen;
INT PgCnt = 0;
@@ -141,17 +141,17 @@ ParseMemSettings(PVIRTMEM pVirtMem)
/* FIXME: we only check the first available pagefile in the reg */
GetPageFileSizes(pVirtMem->szPagingFiles,
&InitialSize,
- &MaxSize);
+ &MaximumSize);
- pVirtMem->Pagefile[PgCnt].InitialValue = InitialSize;
- pVirtMem->Pagefile[PgCnt].MaxValue = MaxSize;
+ pVirtMem->Pagefile[PgCnt].InitialSize = InitialSize;
+ pVirtMem->Pagefile[PgCnt].MaximumSize = MaximumSize;
pVirtMem->Pagefile[PgCnt].bUsed = TRUE;
lstrcpy(pVirtMem->Pagefile[PgCnt].szDrive, szDrive);
}
else
{
- pVirtMem->Pagefile[PgCnt].InitialValue = 0;
- pVirtMem->Pagefile[PgCnt].MaxValue = 0;
+ pVirtMem->Pagefile[PgCnt].InitialSize = 0;
+ pVirtMem->Pagefile[PgCnt].MaximumSize = 0;
pVirtMem->Pagefile[PgCnt].bUsed = FALSE;
lstrcpy(pVirtMem->Pagefile[PgCnt].szDrive, szDrive);
}
@@ -177,11 +177,11 @@ ParseMemSettings(PVIRTMEM pVirtMem)
}
}
- if ((InitialSize != 0) || (MaxSize != 0))
+ if ((InitialSize != 0) || (MaximumSize != 0))
{
TCHAR szSize[64];
- _stprintf(szSize, _T("%i - %i"), InitialSize, MaxSize);
+ _stprintf(szSize, _T("%i - %i"), InitialSize, MaximumSize);
_tcscat(szDisplayString, _T("\t"));
_tcscat(szDisplayString, szSize);
}
@@ -216,11 +216,11 @@ WritePageFileSettings(PVIRTMEM pVirtMem)
{
_stprintf(szText, _T("%s\\pagefile.sys %i %i"),
pVirtMem->Pagefile[i].szDrive,
- pVirtMem->Pagefile[i].InitialValue,
- pVirtMem->Pagefile[i].MaxValue);
+ pVirtMem->Pagefile[i].InitialSize,
+ pVirtMem->Pagefile[i].MaximumSize);
/* Add it to our overall registry string */
- lstrcat(szPagingFiles + nPos, szText);
+ lstrcpy(szPagingFiles + nPos, szText);
/* Record the position where the next string will start */
nPos += (INT)lstrlen(szText) + 1;
@@ -299,8 +299,11 @@ static VOID
OnSet(PVIRTMEM pVirtMem)
{
INT Index;
- UINT Value;
+ UINT InitialSize;
+ UINT MaximumSize;
BOOL bTranslated;
+ TCHAR szTitle[64];
+ TCHAR szMessage[256];
pVirtMem->bSave = TRUE;
@@ -315,46 +318,109 @@ OnSet(PVIRTMEM pVirtMem)
if (IsDlgButtonChecked(pVirtMem->hSelf,
IDC_CUSTOM) == BST_CHECKED)
{
- Value = GetDlgItemInt(pVirtMem->hSelf,
- IDC_INITIALSIZE,
- &bTranslated,
- FALSE);
+ InitialSize = GetDlgItemInt(pVirtMem->hSelf,
+ IDC_INITIALSIZE,
+ &bTranslated,
+ FALSE);
if (!bTranslated)
{
- /* FIXME: Show error message instead of setting the edit
- field to the previous value */
- SetDlgItemInt(pVirtMem->hSelf,
- IDC_INITIALSIZE,
- pVirtMem->Pagefile[Index].InitialValue,
- FALSE);
- }
- else
- {
- pVirtMem->Pagefile[Index].InitialValue = Value;
+ if (LoadString(hApplet,
+ IDS_MESSAGEBOXTITLE,
+ szTitle,
+ sizeof(szTitle) / sizeof(szTitle[0])) == 0)
+ _tcscpy(szTitle, _T("System control panel applet"));
+
+ if (LoadString(hApplet,
+ IDS_WARNINITIALSIZE,
+ szMessage,
+ sizeof(szMessage) / sizeof(szMessage[0])) == 0)
+ _tcscpy(szMessage, _T("Enter a numeric value for the initial size of the paging file."));
+
+ MessageBox(NULL,
+ szMessage,
+ szTitle,
+ MB_ICONWARNING | MB_OK);
+ return;
}
- Value = GetDlgItemInt(pVirtMem->hSelf,
- IDC_MAXSIZE,
- &bTranslated,
- FALSE);
+ MaximumSize = GetDlgItemInt(pVirtMem->hSelf,
+ IDC_MAXSIZE,
+ &bTranslated,
+ FALSE);
if (!bTranslated)
{
- /* FIXME: Show error message instead of setting the edit
- field to the previous value */
- SetDlgItemInt(pVirtMem->hSelf,
- IDC_MAXSIZE,
- pVirtMem->Pagefile[Index].MaxValue,
- FALSE);
+ if (LoadString(hApplet,
+ IDS_MESSAGEBOXTITLE,
+ szTitle,
+ sizeof(szTitle) / sizeof(szTitle[0])) == 0)
+ _tcscpy(szTitle, _T("System control panel applet"));
+
+ if (LoadString(hApplet,
+ IDS_WARNMAXIMUMSIZE,
+ szMessage,
+ sizeof(szMessage) / sizeof(szMessage[0])) == 0)
+ _tcscpy(szMessage, _T("Enter a numeric value for the maximum size of the paging file."));
+
+ MessageBox(NULL,
+ szMessage,
+ szTitle,
+ MB_ICONWARNING | MB_OK);
+ return;
}
- else
+
+ /* Check the valid range of the inial size */
+ if (InitialSize < 2 ||
+ InitialSize > pVirtMem->Pagefile[Index].FreeSize)
{
- pVirtMem->Pagefile[Index].MaxValue = Value;
+ if (LoadString(hApplet,
+ IDS_MESSAGEBOXTITLE,
+ szTitle,
+ sizeof(szTitle) / sizeof(szTitle[0])) == 0)
+ _tcscpy(szTitle, _T("System control panel applet"));
+
+ LoadString(hApplet,
+ IDS_WARNINITIALRANGE,
+ szMessage,
+ sizeof(szMessage) / sizeof(szMessage[0]));
+
+ MessageBox(NULL,
+ szMessage,
+ szTitle,
+ MB_ICONWARNING | MB_OK);
+ return;
}
+
+ /* Check the valid range of the maximum size */
+ if (MaximumSize < InitialSize ||
+ MaximumSize > pVirtMem->Pagefile[Index].FreeSize)
+ {
+ if (LoadString(hApplet,
+ IDS_MESSAGEBOXTITLE,
+ szTitle,
+ sizeof(szTitle) / sizeof(szTitle[0])) == 0)
+ _tcscpy(szTitle, _T("System control panel applet"));
+
+ LoadString(hApplet,
+ IDS_WARNMAXIMUMRANGE,
+ szMessage,
+ sizeof(szMessage) / sizeof(szMessage[0]));
+
+ MessageBox(NULL,
+ szMessage,
+ szTitle,
+ MB_ICONWARNING | MB_OK);
+ return;
+ }
+
+ pVirtMem->Pagefile[Index].InitialSize = InitialSize;
+ pVirtMem->Pagefile[Index].MaximumSize = MaximumSize;
+ pVirtMem->Pagefile[Index].bUsed = TRUE;
}
else
{
/* set sizes to 0 */
- pVirtMem->Pagefile[Index].InitialValue = pVirtMem->Pagefile[Index].MaxValue = 0;
+ pVirtMem->Pagefile[Index].InitialSize = 0;
+ pVirtMem->Pagefile[Index].MaximumSize = 0;
// check to see if this drive is used for a paging file
if (IsDlgButtonChecked(pVirtMem->hSelf,
@@ -397,12 +463,13 @@ OnSelChange(HWND hwndDlg, PVIRTMEM pVirtMem)
if (GetDiskFreeSpaceEx(pVirtMem->Pagefile[Index].szDrive,
NULL, NULL, &FreeBytes))
{
+ pVirtMem->Pagefile[Index].FreeSize = FreeBytes.QuadPart >> 20;
_stprintf(szBuffer, _T("%I64u MB"), FreeBytes.QuadPart / (1024 * 1024));
SetDlgItemText(hwndDlg, IDC_SPACEAVAIL, szBuffer);
}
- if (pVirtMem->Pagefile[Index].InitialValue != 0 &&
- pVirtMem->Pagefile[Index].MaxValue != 0)
+ if (pVirtMem->Pagefile[Index].InitialSize != 0 &&
+ pVirtMem->Pagefile[Index].MaximumSize != 0)
{
/* enable and fill the custom values */
EnableWindow(GetDlgItem(pVirtMem->hSelf, IDC_MAXSIZE), TRUE);
@@ -410,12 +477,12 @@ OnSelChange(HWND hwndDlg, PVIRTMEM pVirtMem)
SetDlgItemInt(pVirtMem->hSelf,
IDC_INITIALSIZE,
- pVirtMem->Pagefile[Index].InitialValue,
+ pVirtMem->Pagefile[Index].InitialSize,
FALSE);
SetDlgItemInt(pVirtMem->hSelf,
IDC_MAXSIZE,
- pVirtMem->Pagefile[Index].MaxValue,
+ pVirtMem->Pagefile[Index].MaximumSize,
FALSE);
CheckDlgButton(pVirtMem->hSelf,
@@ -459,7 +526,7 @@ OnSelChange(HWND hwndDlg, PVIRTMEM pVirtMem)
FileSize = 0;
for (i = 0; i < 26; i++)
{
- FileSize += pVirtMem->Pagefile[i].InitialValue;
+ FileSize += pVirtMem->Pagefile[i].InitialSize;
}
_stprintf(szBuffer, _T("%u MB"), FileSize);
SetDlgItemText(hwndDlg, IDC_CURRENT, szBuffer);
diff --git a/dll/cpl/usrmgr/lang/es-ES.rc b/dll/cpl/usrmgr/lang/es-ES.rc
new file mode 100644
index 00000000000..e2afc79cbb8
--- /dev/null
+++ b/dll/cpl/usrmgr/lang/es-ES.rc
@@ -0,0 +1,219 @@
+LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
+
+
+/* Dialogs */
+
+IDD_USERS DIALOGEX DISCARDABLE 0, 0, 252, 223
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Usuarios"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "", IDC_USERS_LIST, "SysListView32", LVS_REPORT | LVS_EDITLABELS | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
+ 7, 7, 238, 85, WS_EX_CLIENTEDGE
+END
+
+
+IDD_GROUPS DIALOGEX DISCARDABLE 0, 0, 252, 223
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Grupos"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "", IDC_GROUPS_LIST, "SysListView32", LVS_REPORT | LVS_EDITLABELS | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
+ 7, 7, 238, 85, WS_EX_CLIENTEDGE
+END
+
+
+IDD_EXTRA DIALOGEX DISCARDABLE 0, 0, 252, 223
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Extra"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "This space is intentionally left blank", IDC_STATIC, 66, 90, 112, 8
+END
+
+
+IDD_USER_GENERAL DIALOGEX DISCARDABLE 0, 0, 252, 223
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "General"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "", IDC_USER_GENERAL_NAME, 7, 12, 112, 8
+ LTEXT "Nombre completo:", -1, 7, 46, 63, 8
+ EDITTEXT IDC_USER_GENERAL_FULL_NAME,77,43,168,13,ES_AUTOHSCROLL
+ LTEXT "Descripción:", -1, 7, 64, 63, 8
+ EDITTEXT IDC_USER_GENERAL_DESCRIPTION,77,61,168,13,ES_AUTOHSCROLL
+ AUTOCHECKBOX "El usuario debe cambiar la contraseńa en el siguiente inicio de sesión",IDC_USER_GENERAL_FORCE_CHANGE,7,82,210,10
+ AUTOCHECKBOX "El usuario no puede cambiar la contraseńa",IDC_USER_GENERAL_CANNOT_CHANGE,7,95,210,10
+ AUTOCHECKBOX "La contraseńa nunca caduca",IDC_USER_GENERAL_NEVER_EXPIRES,7,108,210,10
+ AUTOCHECKBOX "Cuenta deshabilitada",IDC_USER_GENERAL_DISABLED,7,121,210,10
+ AUTOCHECKBOX "La cuenta está bloqueada",IDC_USER_GENERAL_LOCKED,7,134,210,10
+END
+
+
+IDD_USER_MEMBERSHIP DIALOGEX DISCARDABLE 0, 0, 252, 223
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Miembro de"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Miembro de:", -1, 7, 7, 56, 8
+ CONTROL "", IDC_USER_MEMBERSHIP_LIST, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
+ 7, 18, 238, 173, WS_EX_CLIENTEDGE
+ PUSHBUTTON "Agregar...", IDC_USER_MEMBERSHIP_ADD, 7, 197, 50, 14
+ PUSHBUTTON "Quitar", IDC_USER_MEMBERSHIP_REMOVE, 61, 197, 50, 14, WS_DISABLED
+END
+
+
+IDD_USER_PROFILE DIALOGEX DISCARDABLE 0, 0, 252, 223
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Perfil"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "Perfil de usuario ", -1, 7, 7, 238, 54
+ LTEXT "Ruta de acceso al perfil:", -1, 16, 22, 55, 8
+ EDITTEXT IDC_USER_PROFILE_PATH, 78, 19, 160, 13, ES_AUTOHSCROLL
+ LTEXT "Archivo de comandos de inicio de sesión:", -1, 16, 40, 55, 8
+ EDITTEXT IDC_USER_PROFILE_SCRIPT, 78, 37, 160, 13, ES_AUTOHSCROLL
+
+ GROUPBOX "Carpeta particular ", -1, 7, 68, 238, 54
+ AUTORADIOBUTTON "Ruta de acceso local:", IDC_USER_PROFILE_LOCAL, 16, 83, 60, 10
+ AUTORADIOBUTTON "Conectar:", IDC_USER_PROFILE_REMOTE, 16, 100, 60, 10
+ EDITTEXT IDC_USER_PROFILE_LOCAL_PATH, 78, 81, 160, 13, ES_AUTOHSCROLL
+ COMBOBOX IDC_USER_PROFILE_DRIVE, 78, 99, 26, 160, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
+ LTEXT "A:", -1, 112, 101, 12, 8
+ EDITTEXT IDC_USER_PROFILE_REMOTE_PATH, 130, 99, 108, 13, ES_AUTOHSCROLL
+END
+
+
+IDD_GROUP_GENERAL DIALOGEX DISCARDABLE 0, 0, 252, 223
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "General"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "", IDC_GROUP_GENERAL_NAME, 7, 12, 112, 8
+ LTEXT "Descripción:", -1, 7, 45, 46, 8
+ EDITTEXT IDC_GROUP_GENERAL_DESCRIPTION,65,42,180,13,ES_AUTOHSCROLL
+ LTEXT "Miembros:", -1, 7, 63, 45, 8
+ CONTROL "", IDC_GROUP_GENERAL_MEMBERS, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
+ 7, 74, 238, 117, WS_EX_CLIENTEDGE
+ PUSHBUTTON "Ańadir...", IDC_GROUP_GENERAL_ADD, 7, 197, 50, 14
+ PUSHBUTTON "Quitar", IDC_GROUP_GENERAL_REMOVE, 61, 197, 50, 14, WS_DISABLED
+END
+
+
+IDD_CHANGE_PASSWORD DIALOGEX DISCARDABLE 0, 0, 267, 74
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
+CAPTION "Cambiar contraseńa"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ EDITTEXT IDC_EDIT_PASSWORD1,107,7,153,14,ES_AUTOHSCROLL | ES_PASSWORD
+ RTEXT "Nueva contraseńa:", -1,7,10,96,8
+ EDITTEXT IDC_EDIT_PASSWORD2,107,25,153,14,ES_AUTOHSCROLL | ES_PASSWORD
+ RTEXT "Confirmar la contraseńa:", -1,7,28,96,8
+ DEFPUSHBUTTON "Aceptar",IDOK,156,53,50,14
+ PUSHBUTTON "Cancelar",IDCANCEL,210,53,50,14
+END
+
+
+IDD_USER_NEW DIALOGEX DISCARDABLE 0, 0, 267, 200
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
+CAPTION "Nuevo usuario"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ EDITTEXT IDC_USER_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL
+ RTEXT "Nombre de usuario:", -1,7,10,96,8
+ EDITTEXT IDC_USER_NEW_FULL_NAME,107,25,153,14,ES_AUTOHSCROLL
+ RTEXT "Nombre completo:", -1,7,28,96,8
+ EDITTEXT IDC_USER_NEW_DESCRIPTION,107,43,153,14,ES_AUTOHSCROLL
+ RTEXT "Descripción:", -1,7,46,96,8
+ EDITTEXT IDC_USER_NEW_PASSWORD1,107,67,153,14,ES_AUTOHSCROLL | ES_PASSWORD
+ RTEXT "Contraseńa:", -1,7,70,96,8
+ EDITTEXT IDC_USER_NEW_PASSWORD2,107,85,153,14,ES_AUTOHSCROLL | ES_PASSWORD
+ RTEXT "Confirmar la contraseńa:", -1,7,88,96,8
+ AUTOCHECKBOX "El usuario debe cambiar la contraseńa en el siguiente inicio de sesión",IDC_USER_NEW_FORCE_CHANGE,7,109,200,10
+ AUTOCHECKBOX "El usuario no puede cambiar la contraseńa",IDC_USER_NEW_CANNOT_CHANGE,7,123,200,10,WS_DISABLED
+ AUTOCHECKBOX "La contraseńa nunca caduca",IDC_USER_NEW_NEVER_EXPIRES,7,137,200,10,WS_DISABLED
+ AUTOCHECKBOX "Cuenta deshabilitada",IDC_USER_NEW_DISABLED,7,151,200,10
+ DEFPUSHBUTTON "Aceptar",IDOK,156,179,50,14,WS_DISABLED
+ PUSHBUTTON "Cancelar",IDCANCEL,210,179,50,14
+END
+
+
+IDD_GROUP_NEW DIALOGEX DISCARDABLE 0, 0, 267, 74
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
+CAPTION "Nuevo grupo"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ EDITTEXT IDC_GROUP_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL
+ RTEXT "Nombre del grupo:", -1,7,10,96,8
+ EDITTEXT IDC_GROUP_NEW_DESCRIPTION,107,25,153,14,ES_AUTOHSCROLL
+ RTEXT "Descripción:", -1,7,28,96,8
+ DEFPUSHBUTTON "Aceptar",IDOK,156,53,50,14,WS_DISABLED
+ PUSHBUTTON "Cancelar",IDCANCEL,210,53,50,14
+END
+
+
+IDD_USER_ADD_MEMBERSHIP DIALOGEX DISCARDABLE 0, 0, 252, 223
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
+CAPTION "Pertenencia a grupos"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Miembro de:", -1, 7, 7, 56, 8
+ CONTROL "", IDC_USER_ADD_MEMBERSHIP_LIST, "SysListView32", LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
+ 7, 18, 238, 173, WS_EX_CLIENTEDGE
+ DEFPUSHBUTTON "Aceptar",IDOK,141,197,50,14
+ PUSHBUTTON "Cancelar",IDCANCEL,195,197,50,14
+END
+
+
+/* Menus */
+
+IDM_POPUP_GROUP MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Nuevo grupo...", IDM_GROUP_NEW
+ END
+ POPUP ""
+ BEGIN
+ MENUITEM "Ańadir miembro", IDM_GROUP_ADD_MEMBER, GRAYED
+ MENUITEM SEPARATOR
+ MENUITEM "Borrar", IDM_GROUP_DELETE
+ MENUITEM "Renombrar", IDM_GROUP_RENAME
+ MENUITEM SEPARATOR
+ MENUITEM "Propiedades", IDM_GROUP_PROPERTIES
+ END
+END
+
+
+IDM_POPUP_USER MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Nuevo usuario...", IDM_USER_NEW
+ END
+ POPUP ""
+ BEGIN
+ MENUITEM "Cambiar contraseńa", IDM_USER_CHANGE_PASSWORD
+ MENUITEM SEPARATOR
+ MENUITEM "Borrar", IDM_USER_DELETE
+ MENUITEM "Renombrar", IDM_USER_RENAME
+ MENUITEM SEPARATOR
+ MENUITEM "Propiedades", IDM_USER_PROPERTIES
+ END
+END
+
+
+/* Strings */
+
+STRINGTABLE
+BEGIN
+ IDS_CPLNAME "Cuentas de usuario"
+ IDS_CPLDESCRIPTION "Gestiona Usuarios y Grupos."
+END
+
+STRINGTABLE
+BEGIN
+ IDS_NAME "Nombre"
+ IDS_FULLNAME "Nombre completo"
+ IDS_DESCRIPTION "Descripción"
+END
diff --git a/dll/cpl/usrmgr/rsrc.rc b/dll/cpl/usrmgr/rsrc.rc
index 5e400c134c0..3c5ab7370fe 100644
--- a/dll/cpl/usrmgr/rsrc.rc
+++ b/dll/cpl/usrmgr/rsrc.rc
@@ -3,5 +3,6 @@
#include "lang/de-DE.rc"
#include "lang/en-US.rc"
+#include "lang/es-ES.rc"
#include "lang/pl-PL.rc"
#include "lang/ru-RU.rc"
diff --git a/dll/directx/qedit/mediadet.c b/dll/directx/qedit/mediadet.c
index 3a13f717bf6..9aeb9c017cc 100644
--- a/dll/directx/qedit/mediadet.c
+++ b/dll/directx/qedit/mediadet.c
@@ -38,8 +38,8 @@ typedef struct MediaDetImpl {
IGraphBuilder *graph;
IBaseFilter *source;
IBaseFilter *splitter;
- long num_streams;
- long cur_stream;
+ LONG num_streams;
+ LONG cur_stream;
IPin *cur_pin;
} MediaDetImpl;
@@ -168,7 +168,7 @@ static HRESULT WINAPI MediaDet_get_CurrentStream(IMediaDet* iface, LONG *pVal)
return S_OK;
}
-static HRESULT SetCurPin(MediaDetImpl *This, long strm)
+static HRESULT SetCurPin(MediaDetImpl *This, LONG strm)
{
IEnumPins *pins;
IPin *pin;
diff --git a/dll/directx/qedit/qedit.rbuild b/dll/directx/qedit/qedit.rbuild
index f3285f4ef48..0fd54bf8ea3 100644
--- a/dll/directx/qedit/qedit.rbuild
+++ b/dll/directx/qedit/qedit.rbuild
@@ -1,4 +1,4 @@
-
+
.
diff --git a/dll/directx/qedit/regsvr.c b/dll/directx/qedit/regsvr.c
index d70c8222ee8..d007311840a 100644
--- a/dll/directx/qedit/regsvr.c
+++ b/dll/directx/qedit/regsvr.c
@@ -326,5 +326,5 @@ HRESULT WINAPI DllUnregisterServer(void)
TRACE("\n");
hr = unregister_coclasses(coclass_list);
- return S_OK;
+ return hr;
}
diff --git a/dll/directx/qedit/samplegrabber.c b/dll/directx/qedit/samplegrabber.c
index 78a7306e10e..78979fecf28 100644
--- a/dll/directx/qedit/samplegrabber.c
+++ b/dll/directx/qedit/samplegrabber.c
@@ -489,7 +489,7 @@ static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample)
REFERENCE_TIME tStart, tEnd;
if (This->bufferLen >= 0) {
BYTE *data = 0;
- long size = IMediaSample_GetActualDataLength(sample);
+ LONG size = IMediaSample_GetActualDataLength(sample);
if (size >= 0 && SUCCEEDED(IMediaSample_GetPointer(sample, &data))) {
if (!data)
size = 0;
@@ -527,7 +527,7 @@ static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample)
case 1:
{
BYTE *data = 0;
- long size = IMediaSample_GetActualDataLength(sample);
+ LONG size = IMediaSample_GetActualDataLength(sample);
if (size && SUCCEEDED(IMediaSample_GetPointer(sample, &data)) && data)
ISampleGrabberCB_BufferCB(This->grabberIface, time, data, size);
}
@@ -535,7 +535,7 @@ static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample)
case -1:
break;
default:
- FIXME("unsupported method %ld\n", (long int)This->grabberMethod);
+ FIXME("unsupported method %d\n", This->grabberMethod);
/* do not bother us again */
This->grabberMethod = -1;
}
diff --git a/dll/directx/quartz/acmwrapper.c b/dll/directx/quartz/acmwrapper.c
index c275d833979..a0323911707 100644
--- a/dll/directx/quartz/acmwrapper.c
+++ b/dll/directx/quartz/acmwrapper.c
@@ -105,7 +105,7 @@ static HRESULT ACMWrapper_ProcessSampleData(InputPin *pin, IMediaSample *pSample
tMed = tStart;
- TRACE("Sample data ptr = %p, size = %ld\n", pbSrcStream, (long)cbSrcStream);
+ TRACE("Sample data ptr = %p, size = %d\n", pbSrcStream, cbSrcStream);
hr = IPin_ConnectionMediaType(This->tf.ppPins[0], &amt);
if (FAILED(hr))
diff --git a/dll/directx/quartz/avidec.c b/dll/directx/quartz/avidec.c
index 8469bbc9f29..b7d45e93890 100644
--- a/dll/directx/quartz/avidec.c
+++ b/dll/directx/quartz/avidec.c
@@ -101,7 +101,7 @@ static HRESULT AVIDec_ProcessSampleData(InputPin *pin, IMediaSample *pSample)
cbSrcStream = IMediaSample_GetActualDataLength(pSample);
- TRACE("Sample data ptr = %p, size = %ld\n", pbSrcStream, (long)cbSrcStream);
+ TRACE("Sample data ptr = %p, size = %d\n", pbSrcStream, cbSrcStream);
hr = IPin_ConnectionMediaType(This->tf.ppPins[0], &amt);
if (FAILED(hr)) {
diff --git a/dll/directx/quartz/avisplit.c b/dll/directx/quartz/avisplit.c
index 42ec2ae2b34..61078805903 100644
--- a/dll/directx/quartz/avisplit.c
+++ b/dll/directx/quartz/avisplit.c
@@ -178,7 +178,6 @@ static HRESULT AVISplitter_next_request(AVISplitterImpl *This, DWORD streamnumbe
{
AVISTDINDEX *index = stream->stdindex[stream->index];
AVISTDINDEX_ENTRY *entry = &index->aIndex[stream->pos];
- BOOL keyframe;
/* End of file */
if (stream->index >= stream->entries)
@@ -189,7 +188,6 @@ static HRESULT AVISplitter_next_request(AVISplitterImpl *This, DWORD streamnumbe
}
rtSampleStart = index->qwBaseOffset;
- keyframe = !(entry->dwSize >> 31);
rtSampleStart += entry->dwOffset;
rtSampleStart = MEDIATIME_FROM_BYTES(rtSampleStart);
@@ -208,7 +206,6 @@ static HRESULT AVISplitter_next_request(AVISplitterImpl *This, DWORD streamnumbe
{
DWORD flags = This->oldindex->aIndex[stream->pos].dwFlags;
DWORD size = This->oldindex->aIndex[stream->pos].dwSize;
- BOOL keyframe;
/* End of file */
if (stream->index)
@@ -218,8 +215,6 @@ static HRESULT AVISplitter_next_request(AVISplitterImpl *This, DWORD streamnumbe
return S_FALSE;
}
- keyframe = !!(flags & AVIIF_KEYFRAME);
-
rtSampleStart = MEDIATIME_FROM_BYTES(This->offset);
rtSampleStart += MEDIATIME_FROM_BYTES(This->oldindex->aIndex[stream->pos].dwOffset);
rtSampleStop = rtSampleStart + MEDIATIME_FROM_BYTES(size);
@@ -775,7 +770,7 @@ static HRESULT AVISplitter_ProcessStreamList(AVISplitterImpl * This, const BYTE
{
const AVISUPERINDEX *pIndex = (const AVISUPERINDEX *)pChunk;
DWORD x;
- long rest = pIndex->cb - sizeof(AVISUPERINDEX) + sizeof(RIFFCHUNK) + sizeof(pIndex->aIndex[0]) * ANYSIZE_ARRAY;
+ UINT rest = pIndex->cb - sizeof(AVISUPERINDEX) + sizeof(RIFFCHUNK) + sizeof(pIndex->aIndex[0]) * ANYSIZE_ARRAY;
if (pIndex->cb < sizeof(AVISUPERINDEX) - sizeof(RIFFCHUNK))
{
diff --git a/dll/directx/quartz/dsoundrender.c b/dll/directx/quartz/dsoundrender.c
index 1d87a7f0047..b327c00da9b 100644
--- a/dll/directx/quartz/dsoundrender.c
+++ b/dll/directx/quartz/dsoundrender.c
@@ -78,8 +78,8 @@ typedef struct DSoundRenderImpl
HANDLE state_change, blocked;
- long volume;
- long pan;
+ LONG volume;
+ LONG pan;
} DSoundRenderImpl;
/* Seeking is not needed for a renderer, rely on newsegment for the appropriate changes */
@@ -238,7 +238,7 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample)
{
DSoundRenderImpl *This = iface;
LPBYTE pbSrcStream = NULL;
- long cbSrcStream = 0;
+ LONG cbSrcStream = 0;
REFERENCE_TIME tStart, tStop;
HRESULT hr;
AM_MEDIA_TYPE *amt;
@@ -344,7 +344,7 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample)
}
cbSrcStream = IMediaSample_GetActualDataLength(pSample);
- TRACE("Sample data ptr = %p, size = %ld\n", pbSrcStream, cbSrcStream);
+ TRACE("Sample data ptr = %p, size = %d\n", pbSrcStream, cbSrcStream);
#if 0 /* For debugging purpose */
{
@@ -677,7 +677,7 @@ static HRESULT WINAPI DSoundRender_GetState(IBaseFilter * iface, DWORD dwMilliSe
}
LeaveCriticalSection(&This->csFilter);
- return S_OK;
+ return hr;
}
static HRESULT WINAPI DSoundRender_SetSyncSource(IBaseFilter * iface, IReferenceClock *pClock)
@@ -877,11 +877,11 @@ static HRESULT WINAPI DSoundRender_InputPin_ReceiveConnection(IPin * iface, IPin
{
hr = IDirectSoundBuffer_SetVolume(DSImpl->dsbuffer, DSImpl->volume);
if (FAILED(hr))
- ERR("Can't set volume to %ld (%x)\n", DSImpl->volume, hr);
+ ERR("Can't set volume to %d (%x)\n", DSImpl->volume, hr);
hr = IDirectSoundBuffer_SetPan(DSImpl->dsbuffer, DSImpl->pan);
if (FAILED(hr))
- ERR("Can't set pan to %ld (%x)\n", DSImpl->pan, hr);
+ ERR("Can't set pan to %d (%x)\n", DSImpl->pan, hr);
DSImpl->write_pos = 0;
hr = S_OK;
diff --git a/dll/directx/quartz/enumfilters.c b/dll/directx/quartz/enumfilters.c
index ca6a98941bc..ab1f6ec6a72 100644
--- a/dll/directx/quartz/enumfilters.c
+++ b/dll/directx/quartz/enumfilters.c
@@ -126,6 +126,9 @@ static HRESULT WINAPI IEnumFiltersImpl_Next(IEnumFilters * iface, ULONG cFilters
TRACE("(%p)->(%u, %p, %p)\n", iface, cFilters, ppFilters, pcFetched);
+ if (!ppFilters)
+ return E_POINTER;
+
for (i = 0; i < cFetched; i++)
{
ppFilters[i] = This->ppFilters[This->uIndex + i];
diff --git a/dll/directx/quartz/filtergraph.c b/dll/directx/quartz/filtergraph.c
index 3e9a1da1b82..18bf97c392b 100644
--- a/dll/directx/quartz/filtergraph.c
+++ b/dll/directx/quartz/filtergraph.c
@@ -45,14 +45,14 @@
WINE_DEFAULT_DEBUG_CHANNEL(quartz);
typedef struct {
- HWND hWnd; /* Target window */
- long msg; /* User window message */
- long instance; /* User data */
- int disabled; /* Disabled messages posting */
+ HWND hWnd; /* Target window */
+ UINT msg; /* User window message */
+ LONG_PTR instance; /* User data */
+ int disabled; /* Disabled messages posting */
} WndNotify;
typedef struct {
- long lEventCode; /* Event code */
+ LONG lEventCode; /* Event code */
LONG_PTR lParam1; /* Param1 */
LONG_PTR lParam2; /* Param2 */
} Event;
@@ -120,7 +120,7 @@ static int EventsQueue_PutEvent(EventsQueue* omr, const Event* evt)
return TRUE;
}
-static int EventsQueue_GetEvent(EventsQueue* omr, Event* evt, long msTimeOut)
+static int EventsQueue_GetEvent(EventsQueue* omr, Event* evt, LONG msTimeOut)
{
if (WaitForSingleObject(omr->msg_event, msTimeOut) != WAIT_OBJECT_0)
return FALSE;
@@ -182,7 +182,7 @@ typedef struct _IFilterGraphImpl {
LPWSTR * pFilterNames;
int nFilters;
int filterCapacity;
- long nameIndex;
+ LONG nameIndex;
IReferenceClock *refClock;
EventsQueue evqueue;
HANDLE hEventCompletion;
@@ -4970,7 +4970,7 @@ static HRESULT WINAPI MediaEvent_SetNotifyWindow(IMediaEventEx *iface,
This->notif.hWnd = (HWND)hwnd;
This->notif.msg = lMsg;
- This->notif.instance = (long) lInstanceData;
+ This->notif.instance = lInstanceData;
return S_OK;
}
@@ -5055,30 +5055,26 @@ static HRESULT WINAPI MediaFilter_GetClassID(IMediaFilter *iface, CLSID * pClass
static HRESULT WINAPI MediaFilter_Stop(IMediaFilter *iface)
{
- FIXME("(): stub\n");
-
- return E_NOTIMPL;
+ ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface);
+ return MediaControl_Stop((IMediaControl*)&This->IMediaControl_vtbl);
}
static HRESULT WINAPI MediaFilter_Pause(IMediaFilter *iface)
{
- FIXME("(): stub\n");
-
- return E_NOTIMPL;
+ ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface);
+ return MediaControl_Pause((IMediaControl*)&This->IMediaControl_vtbl);
}
static HRESULT WINAPI MediaFilter_Run(IMediaFilter *iface, REFERENCE_TIME tStart)
{
- FIXME("(0x%s): stub\n", wine_dbgstr_longlong(tStart));
-
- return E_NOTIMPL;
+ ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface);
+ return MediaControl_Run((IMediaControl*)&This->IMediaControl_vtbl);
}
static HRESULT WINAPI MediaFilter_GetState(IMediaFilter *iface, DWORD dwMsTimeout, FILTER_STATE * pState)
{
- FIXME("(%d, %p): stub\n", dwMsTimeout, pState);
-
- return E_NOTIMPL;
+ ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface);
+ return MediaControl_GetState((IMediaControl*)&This->IMediaControl_vtbl, dwMsTimeout, (OAFilterState*)pState);
}
static HRESULT WINAPI MediaFilter_SetSyncSource(IMediaFilter *iface, IReferenceClock *pClock)
diff --git a/dll/directx/quartz/filtermapper.c b/dll/directx/quartz/filtermapper.c
index bacb72950d6..aeacfac386e 100644
--- a/dll/directx/quartz/filtermapper.c
+++ b/dll/directx/quartz/filtermapper.c
@@ -1778,7 +1778,7 @@ static HRESULT WINAPI AMFilterData_ParseFilterData(IAMFilterData* iface,
prf2 = CoTaskMemAlloc(sizeof(*prf2));
if (!prf2)
return E_OUTOFMEMORY;
- *ppRegFilter2 = (BYTE *)&prf2;
+ *ppRegFilter2 = (BYTE *)prf2;
hr = FM2_ReadFilterData(pData, prf2);
if (FAILED(hr))
diff --git a/dll/directx/quartz/memallocator.c b/dll/directx/quartz/memallocator.c
index 7f799c93b7d..a1c4473238f 100644
--- a/dll/directx/quartz/memallocator.c
+++ b/dll/directx/quartz/memallocator.c
@@ -534,7 +534,7 @@ static HRESULT WINAPI StdMediaSample2_GetTime(IMediaSample2 * iface, REFERENCE_T
hr = S_OK;
}
- return S_OK;
+ return hr;
}
static HRESULT WINAPI StdMediaSample2_SetTime(IMediaSample2 * iface, REFERENCE_TIME * pStart, REFERENCE_TIME * pEnd)
@@ -785,7 +785,7 @@ static HRESULT StdMemAllocator_Alloc(IMemAllocator * iface)
StdMemAllocator *This = (StdMemAllocator *)iface;
StdMediaSample2 * pSample = NULL;
SYSTEM_INFO si;
- long i;
+ LONG i;
assert(list_empty(&This->base.free_list));
diff --git a/dll/directx/quartz/mpegsplit.c b/dll/directx/quartz/mpegsplit.c
index e44a10fcca1..7eb2d2c213f 100644
--- a/dll/directx/quartz/mpegsplit.c
+++ b/dll/directx/quartz/mpegsplit.c
@@ -246,11 +246,8 @@ static HRESULT MPEGSplitter_process_sample(LPVOID iface, IMediaSample * pSample,
BYTE *pbSrcStream;
DWORD cbSrcStream = 0;
REFERENCE_TIME tStart, tStop, tAviStart = This->position;
- Parser_OutputPin * pOutputPin;
HRESULT hr;
- pOutputPin = (Parser_OutputPin*)This->Parser.ppPins[1];
-
hr = IMediaSample_GetTime(pSample, &tStart, &tStop);
if (SUCCEEDED(hr))
{
diff --git a/dll/directx/quartz/pin.c b/dll/directx/quartz/pin.c
index ca34d9331c5..fd0d5a2e522 100644
--- a/dll/directx/quartz/pin.c
+++ b/dll/directx/quartz/pin.c
@@ -1834,7 +1834,7 @@ HRESULT InputPin_Construct(const IPinVtbl *InputPin_Vtbl, const PIN_INFO * pPinI
return E_FAIL;
}
-HRESULT OutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, long outputpin_size, const PIN_INFO * pPinInfo, ALLOCATOR_PROPERTIES *props, LPVOID pUserData, QUERYACCEPTPROC pQueryAccept, LPCRITICAL_SECTION pCritSec, IPin ** ppPin)
+HRESULT OutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, LONG outputpin_size, const PIN_INFO * pPinInfo, ALLOCATOR_PROPERTIES *props, LPVOID pUserData, QUERYACCEPTPROC pQueryAccept, LPCRITICAL_SECTION pCritSec, IPin ** ppPin)
{
OutputPin * pPinImpl;
diff --git a/dll/directx/quartz/pin.h b/dll/directx/quartz/pin.h
index 2cbaddba0f9..e356ef32f53 100644
--- a/dll/directx/quartz/pin.h
+++ b/dll/directx/quartz/pin.h
@@ -143,7 +143,7 @@ typedef struct PullPin
/*** Constructors ***/
HRESULT InputPin_Construct(const IPinVtbl *InputPin_Vtbl, const PIN_INFO * pPinInfo, SAMPLEPROC_PUSH pSampleProc, LPVOID pUserData, QUERYACCEPTPROC pQueryAccept, CLEANUPPROC pCleanUp, LPCRITICAL_SECTION pCritSec, IMemAllocator *, IPin ** ppPin);
-HRESULT OutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, long outputpin_size, const PIN_INFO * pPinInfo, ALLOCATOR_PROPERTIES *props, LPVOID pUserData, QUERYACCEPTPROC pQueryAccept, LPCRITICAL_SECTION pCritSec, IPin ** ppPin);
+HRESULT OutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, LONG outputpin_size, const PIN_INFO * pPinInfo, ALLOCATOR_PROPERTIES *props, LPVOID pUserData, QUERYACCEPTPROC pQueryAccept, LPCRITICAL_SECTION pCritSec, IPin ** ppPin);
HRESULT PullPin_Construct(const IPinVtbl *PullPin_Vtbl, const PIN_INFO * pPinInfo, SAMPLEPROC_PULL pSampleProc, LPVOID pUserData, QUERYACCEPTPROC pQueryAccept, CLEANUPPROC pCleanUp, STOPPROCESSPROC, REQUESTPROC pCustomRequest, LPCRITICAL_SECTION pCritSec, IPin ** ppPin);
/**************************/
diff --git a/dll/directx/quartz/quartz.rbuild b/dll/directx/quartz/quartz.rbuild
index b7097f6ff1f..4a86c54b112 100644
--- a/dll/directx/quartz/quartz.rbuild
+++ b/dll/directx/quartz/quartz.rbuild
@@ -1,7 +1,7 @@
-
+
.
diff --git a/dll/directx/quartz/videorenderer.c b/dll/directx/quartz/videorenderer.c
index b31959eed21..268373f1888 100644
--- a/dll/directx/quartz/videorenderer.c
+++ b/dll/directx/quartz/videorenderer.c
@@ -82,8 +82,8 @@ typedef struct VideoRendererImpl
RECT SourceRect;
RECT DestRect;
RECT WindowPos;
- long VideoWidth;
- long VideoHeight;
+ LONG VideoWidth;
+ LONG VideoHeight;
IUnknown * pUnkOuter;
BOOL bUnkOuterValid;
BOOL bAggregatable;
@@ -287,7 +287,6 @@ static DWORD VideoRenderer_SendSampleData(VideoRendererImpl* This, LPBYTE data,
return VFW_E_RUNTIME_ERROR;
}
-
TRACE("biSize = %d\n", bmiHeader->biSize);
TRACE("biWidth = %d\n", bmiHeader->biWidth);
TRACE("biHeight = %d\n", bmiHeader->biHeight);
@@ -344,7 +343,7 @@ static HRESULT VideoRenderer_Sample(LPVOID iface, IMediaSample * pSample)
{
VideoRendererImpl *This = iface;
LPBYTE pbSrcStream = NULL;
- long cbSrcStream = 0;
+ LONG cbSrcStream = 0;
REFERENCE_TIME tStart, tStop;
HRESULT hr;
@@ -396,7 +395,7 @@ static HRESULT VideoRenderer_Sample(LPVOID iface, IMediaSample * pSample)
cbSrcStream = IMediaSample_GetActualDataLength(pSample);
- TRACE("val %p %ld\n", pbSrcStream, cbSrcStream);
+ TRACE("val %p %d\n", pbSrcStream, cbSrcStream);
#if 0 /* For debugging purpose */
{
@@ -483,6 +482,7 @@ static HRESULT VideoRenderer_QueryAccept(LPVOID iface, const AM_MEDIA_TYPE * pmt
IsEqualIID(&pmt->subtype, &MEDIASUBTYPE_RGB8))
{
VideoRendererImpl* This = iface;
+ LONG height;
if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo))
{
@@ -490,7 +490,11 @@ static HRESULT VideoRenderer_QueryAccept(LPVOID iface, const AM_MEDIA_TYPE * pmt
This->SourceRect.left = 0;
This->SourceRect.top = 0;
This->SourceRect.right = This->VideoWidth = format->bmiHeader.biWidth;
- This->SourceRect.bottom = This->VideoHeight = format->bmiHeader.biHeight;
+ height = format->bmiHeader.biHeight;
+ if (height < 0)
+ This->SourceRect.bottom = This->VideoHeight = -height;
+ else
+ This->SourceRect.bottom = This->VideoHeight = height;
}
else if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo2))
{
@@ -499,7 +503,11 @@ static HRESULT VideoRenderer_QueryAccept(LPVOID iface, const AM_MEDIA_TYPE * pmt
This->SourceRect.left = 0;
This->SourceRect.top = 0;
This->SourceRect.right = This->VideoWidth = format2->bmiHeader.biWidth;
- This->SourceRect.bottom = This->VideoHeight = format2->bmiHeader.biHeight;
+ height = format2->bmiHeader.biHeight;
+ if (height < 0)
+ This->SourceRect.bottom = This->VideoHeight = -height;
+ else
+ This->SourceRect.bottom = This->VideoHeight = height;
}
else
{
@@ -1176,10 +1184,25 @@ static HRESULT WINAPI Basicvideo_Invoke(IBasicVideo *iface,
/*** IBasicVideo methods ***/
static HRESULT WINAPI Basicvideo_get_AvgTimePerFrame(IBasicVideo *iface,
REFTIME *pAvgTimePerFrame) {
+ AM_MEDIA_TYPE *pmt;
ICOM_THIS_MULTI(VideoRendererImpl, IBasicVideo_vtbl, iface);
- FIXME("(%p/%p)->(%p): stub !!!\n", This, iface, pAvgTimePerFrame);
+ if (!This->pInputPin->pin.pConnectedTo)
+ return VFW_E_NOT_CONNECTED;
+ TRACE("(%p/%p)->(%p)\n", This, iface, pAvgTimePerFrame);
+
+ pmt = &This->pInputPin->pin.mtCurrent;
+ if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo)) {
+ VIDEOINFOHEADER *vih = (VIDEOINFOHEADER*)pmt->pbFormat;
+ *pAvgTimePerFrame = vih->AvgTimePerFrame;
+ } else if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo2)) {
+ VIDEOINFOHEADER2 *vih = (VIDEOINFOHEADER2*)pmt->pbFormat;
+ *pAvgTimePerFrame = vih->AvgTimePerFrame;
+ } else {
+ ERR("Unknown format type %s\n", qzdebugstr_guid(&pmt->formattype));
+ *pAvgTimePerFrame = 0;
+ }
return S_OK;
}
@@ -1779,9 +1802,6 @@ static HRESULT WINAPI Videowindow_put_WindowStyleEx(IVideoWindow *iface,
TRACE("(%p/%p)->(%d)\n", This, iface, WindowStyleEx);
- if (WindowStyleEx & (WS_DISABLED|WS_HSCROLL|WS_ICONIC|WS_MAXIMIZE|WS_MINIMIZE|WS_VSCROLL))
- return E_INVALIDARG;
-
if (!SetWindowLongA(This->hWnd, GWL_EXSTYLE, WindowStyleEx))
return E_FAIL;
@@ -1805,7 +1825,7 @@ static HRESULT WINAPI Videowindow_put_AutoShow(IVideoWindow *iface,
TRACE("(%p/%p)->(%d)\n", This, iface, AutoShow);
- This->AutoShow = 1; /* FIXME: Should be AutoShow */;
+ This->AutoShow = AutoShow;
return S_OK;
}
@@ -1825,16 +1845,20 @@ static HRESULT WINAPI Videowindow_put_WindowState(IVideoWindow *iface,
LONG WindowState) {
ICOM_THIS_MULTI(VideoRendererImpl, IVideoWindow_vtbl, iface);
- FIXME("(%p/%p)->(%d): stub !!!\n", This, iface, WindowState);
-
+ TRACE("(%p/%p)->(%d)\n", This, iface, WindowState);
+ ShowWindow(This->hWnd, WindowState);
return S_OK;
}
static HRESULT WINAPI Videowindow_get_WindowState(IVideoWindow *iface,
LONG *WindowState) {
+ WINDOWPLACEMENT place;
ICOM_THIS_MULTI(VideoRendererImpl, IVideoWindow_vtbl, iface);
- FIXME("(%p/%p)->(%p): stub !!!\n", This, iface, WindowState);
+ place.length = sizeof(place);
+ GetWindowPlacement(This->hWnd, &place);
+ TRACE("(%p/%p)->(%p)\n", This, iface, WindowState);
+ *WindowState = place.showCmd;
return S_OK;
}
diff --git a/dll/directx/wine/d3d8/device.c b/dll/directx/wine/d3d8/device.c
index 11697b2ff26..12ed0fbfd38 100644
--- a/dll/directx/wine/d3d8/device.c
+++ b/dll/directx/wine/d3d8/device.c
@@ -171,18 +171,19 @@ static DWORD d3d8_allocate_handle(struct d3d8_handle_table *t, void *object, enu
if (t->free_entries)
{
+ DWORD index = t->free_entries - t->entries;
/* Use a free handle */
entry = t->free_entries;
if (entry->type != D3D8_HANDLE_FREE)
{
- ERR("Handle %u(%p) is in the free list, but has type %#x.\n", (entry - t->entries), entry, entry->type);
+ ERR("Handle %u(%p) is in the free list, but has type %#x.\n", index, entry, entry->type);
return D3D8_INVALID_HANDLE;
}
t->free_entries = entry->object;
entry->object = object;
entry->type = type;
- return entry - t->entries;
+ return index;
}
if (!(t->entry_count < t->table_size))
@@ -324,6 +325,7 @@ static ULONG WINAPI IDirect3DDevice8Impl_Release(LPDIRECT3DDEVICE8 iface) {
HeapFree(GetProcessHeap(), 0, This->decls);
IWineD3DDevice_Uninit3D(This->WineD3DDevice, D3D8CB_DestroySwapChain);
+ IWineD3DDevice_ReleaseFocusWindow(This->WineD3DDevice);
IWineD3DDevice_Release(This->WineD3DDevice);
HeapFree(GetProcessHeap(), 0, This->handle_table.entries);
HeapFree(GetProcessHeap(), 0, This);
@@ -2762,6 +2764,19 @@ static const IWineD3DDeviceParentVtbl d3d8_wined3d_device_parent_vtbl =
device_parent_CreateSwapChain,
};
+static void setup_fpu(void)
+{
+ WORD cw;
+
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+ __asm__ volatile ("fnstcw %0" : "=m" (cw));
+ cw = (cw & ~0xf3f) | 0x3f;
+ __asm__ volatile ("fldcw %0" : : "m" (cw));
+#else
+ FIXME("FPU setup not implemented for this platform.\n");
+#endif
+}
+
HRESULT device_init(IDirect3DDevice8Impl *device, IWineD3D *wined3d, UINT adapter,
D3DDEVTYPE device_type, HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters)
{
@@ -2780,6 +2795,8 @@ HRESULT device_init(IDirect3DDevice8Impl *device, IWineD3D *wined3d, UINT adapte
}
device->handle_table.table_size = D3D8_INITIAL_HANDLE_TABLE_SIZE;
+ if (!(flags & D3DCREATE_FPU_PRESERVE)) setup_fpu();
+
wined3d_mutex_lock();
hr = IWineD3D_CreateDevice(wined3d, adapter, device_type, focus_window, flags, (IUnknown *)device,
(IWineD3DDeviceParent *)&device->device_parent_vtbl, &device->WineD3DDevice);
@@ -2791,6 +2808,19 @@ HRESULT device_init(IDirect3DDevice8Impl *device, IWineD3D *wined3d, UINT adapte
return hr;
}
+ if (!parameters->Windowed)
+ {
+ if (!focus_window) focus_window = parameters->hDeviceWindow;
+ if (FAILED(hr = IWineD3DDevice_AcquireFocusWindow(device->WineD3DDevice, focus_window)))
+ {
+ ERR("Failed to acquire focus window, hr %#x.\n", hr);
+ IWineD3DDevice_Release(device->WineD3DDevice);
+ wined3d_mutex_unlock();
+ HeapFree(GetProcessHeap(), 0, device->handle_table.entries);
+ return hr;
+ }
+ }
+
if (flags & D3DCREATE_MULTITHREADED) IWineD3DDevice_SetMultithreaded(device->WineD3DDevice);
wined3d_parameters.BackBufferWidth = parameters->BackBufferWidth;
@@ -2813,6 +2843,7 @@ HRESULT device_init(IDirect3DDevice8Impl *device, IWineD3D *wined3d, UINT adapte
if (FAILED(hr))
{
WARN("Failed to initialize 3D, hr %#x.\n", hr);
+ IWineD3DDevice_ReleaseFocusWindow(device->WineD3DDevice);
IWineD3DDevice_Release(device->WineD3DDevice);
wined3d_mutex_unlock();
HeapFree(GetProcessHeap(), 0, device->handle_table.entries);
@@ -2855,6 +2886,7 @@ HRESULT device_init(IDirect3DDevice8Impl *device, IWineD3D *wined3d, UINT adapte
err:
wined3d_mutex_lock();
IWineD3DDevice_Uninit3D(device->WineD3DDevice, D3D8CB_DestroySwapChain);
+ IWineD3DDevice_ReleaseFocusWindow(device->WineD3DDevice);
IWineD3DDevice_Release(device->WineD3DDevice);
wined3d_mutex_unlock();
HeapFree(GetProcessHeap(), 0, device->handle_table.entries);
diff --git a/dll/directx/wine/d3d9/device.c b/dll/directx/wine/d3d9/device.c
index 79a9ba01834..b9f539e0b28 100644
--- a/dll/directx/wine/d3d9/device.c
+++ b/dll/directx/wine/d3d9/device.c
@@ -271,6 +271,7 @@ static ULONG WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Release(LPDIRECT3DDEV
HeapFree(GetProcessHeap(), 0, This->convertedDecls);
IWineD3DDevice_Uninit3D(This->WineD3DDevice, D3D9CB_DestroySwapChain);
+ IWineD3DDevice_ReleaseFocusWindow(This->WineD3DDevice);
IWineD3DDevice_Release(This->WineD3DDevice);
wined3d_mutex_unlock();
@@ -2821,6 +2822,19 @@ static const IWineD3DDeviceParentVtbl d3d9_wined3d_device_parent_vtbl =
device_parent_CreateSwapChain,
};
+static void setup_fpu(void)
+{
+ WORD cw;
+
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+ __asm__ volatile ("fnstcw %0" : "=m" (cw));
+ cw = (cw & ~0xf3f) | 0x3f;
+ __asm__ volatile ("fldcw %0" : : "m" (cw));
+#else
+ FIXME("FPU setup not implemented for this platform.\n");
+#endif
+}
+
HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapter, D3DDEVTYPE device_type,
HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters)
{
@@ -2832,6 +2846,8 @@ HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapte
device->device_parent_vtbl = &d3d9_wined3d_device_parent_vtbl;
device->ref = 1;
+ if (!(flags & D3DCREATE_FPU_PRESERVE)) setup_fpu();
+
wined3d_mutex_lock();
hr = IWineD3D_CreateDevice(wined3d, adapter, device_type, focus_window, flags, (IUnknown *)device,
(IWineD3DDeviceParent *)&device->device_parent_vtbl, &device->WineD3DDevice);
@@ -2842,6 +2858,18 @@ HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapte
return hr;
}
+ if (!parameters->Windowed)
+ {
+ if (!focus_window) focus_window = parameters->hDeviceWindow;
+ if (FAILED(hr = IWineD3DDevice_AcquireFocusWindow(device->WineD3DDevice, focus_window)))
+ {
+ ERR("Failed to acquire focus window, hr %#x.\n", hr);
+ IWineD3DDevice_Release(device->WineD3DDevice);
+ wined3d_mutex_unlock();
+ return hr;
+ }
+ }
+
if (flags & D3DCREATE_ADAPTERGROUP_DEVICE)
{
WINED3DCAPS caps;
@@ -2885,6 +2913,7 @@ HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapte
if (FAILED(hr))
{
WARN("Failed to initialize 3D, hr %#x.\n", hr);
+ IWineD3DDevice_ReleaseFocusWindow(device->WineD3DDevice);
HeapFree(GetProcessHeap(), 0, wined3d_parameters);
IWineD3DDevice_Release(device->WineD3DDevice);
wined3d_mutex_unlock();
@@ -2921,6 +2950,7 @@ HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapte
ERR("Failed to allocate FVF vertex declaration map memory.\n");
wined3d_mutex_lock();
IWineD3DDevice_Uninit3D(device->WineD3DDevice, D3D9CB_DestroySwapChain);
+ IWineD3DDevice_ReleaseFocusWindow(device->WineD3DDevice);
IWineD3DDevice_Release(device->WineD3DDevice);
wined3d_mutex_unlock();
return E_OUTOFMEMORY;
diff --git a/dll/directx/wine/ddraw/ddraw.c b/dll/directx/wine/ddraw/ddraw.c
index 122c31b8cb8..a7522f91789 100644
--- a/dll/directx/wine/ddraw/ddraw.c
+++ b/dll/directx/wine/ddraw/ddraw.c
@@ -264,8 +264,8 @@ IDirectDrawImpl_AddRef(IDirectDraw7 *iface)
void
IDirectDrawImpl_Destroy(IDirectDrawImpl *This)
{
- /* Clear the cooplevel to restore window and display mode */
IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)This, NULL, DDSCL_NORMAL);
+ IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)This);
/* Destroy the device window if we created one */
if(This->devicewindow != 0)
@@ -441,12 +441,11 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 *iface,
/* Switching from fullscreen? */
if(This->cooperative_level & DDSCL_FULLSCREEN)
{
- /* Restore the display mode */
- IDirectDraw7_RestoreDisplayMode(iface);
-
This->cooperative_level &= ~DDSCL_FULLSCREEN;
This->cooperative_level &= ~DDSCL_EXCLUSIVE;
This->cooperative_level &= ~DDSCL_ALLOWMODEX;
+
+ IWineD3DDevice_ReleaseFocusWindow(This->wineD3DDevice);
}
/* Don't override focus windows or private device windows */
@@ -483,6 +482,13 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 *iface,
!(This->devicewindow) &&
(hwnd != window) )
{
+ HRESULT hr = IWineD3DDevice_AcquireFocusWindow(This->wineD3DDevice, hwnd);
+ if (FAILED(hr))
+ {
+ ERR("Failed to acquire focus window, hr %#x.\n", hr);
+ LeaveCriticalSection(&ddraw_cs);
+ return hr;
+ }
This->dest_window = hwnd;
}
}
@@ -1514,11 +1520,24 @@ IDirectDrawImpl_GetSurfaceFromDC(IDirectDraw7 *iface,
IDirectDrawSurface7 **Surface)
{
IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
- FIXME("(%p)->(%p,%p): Stub!\n", This, hdc, Surface);
+ IWineD3DSurface *wined3d_surface;
+ HRESULT hr;
- /* Implementation idea if needed: Loop through all surfaces and compare
- * their hdc with hdc. Implement it in WineD3D! */
- return DDERR_NOTFOUND;
+ TRACE("iface %p, dc %p, surface %p.\n", iface, hdc, Surface);
+
+ if (!Surface) return E_INVALIDARG;
+
+ hr = IWineD3DDevice_GetSurfaceFromDC(This->wineD3DDevice, hdc, &wined3d_surface);
+ if (FAILED(hr))
+ {
+ TRACE("No surface found for dc %p.\n", hdc);
+ *Surface = NULL;
+ return DDERR_NOTFOUND;
+ }
+
+ IWineD3DSurface_GetParent(wined3d_surface, (IUnknown **)Surface);
+ TRACE("Returning surface %p.\n", Surface);
+ return DD_OK;
}
/*****************************************************************************
diff --git a/dll/directx/wine/ddraw/ddraw.rbuild b/dll/directx/wine/ddraw/ddraw.rbuild
index f8d9c92c279..962cd7a96ad 100644
--- a/dll/directx/wine/ddraw/ddraw.rbuild
+++ b/dll/directx/wine/ddraw/ddraw.rbuild
@@ -1,6 +1,6 @@
-
+
.
diff --git a/dll/directx/wine/ddraw/ddraw_thunks.c b/dll/directx/wine/ddraw/ddraw_thunks.c
index dc71bf55a9c..9d606245272 100644
--- a/dll/directx/wine/ddraw/ddraw_thunks.c
+++ b/dll/directx/wine/ddraw/ddraw_thunks.c
@@ -290,6 +290,7 @@ IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc,
set_surf_version(impl, 1);
IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw1(This));
impl->ifaceToRelease = NULL;
+
return hr;
}
@@ -309,11 +310,13 @@ IDirectDraw2Impl_CreateSurface(LPDIRECTDRAW2 This, LPDDSURFACEDESC pSDesc,
*ppSurface = NULL;
return hr;
}
+
impl = (IDirectDrawSurfaceImpl *)pSurface7;
*ppSurface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl;
set_surf_version(impl, 2);
IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw2(This));
impl->ifaceToRelease = NULL;
+
return hr;
}
diff --git a/dll/directx/wine/ddraw/device.c b/dll/directx/wine/ddraw/device.c
index 13ecfa133ac..9a4e5c73204 100644
--- a/dll/directx/wine/ddraw/device.c
+++ b/dll/directx/wine/ddraw/device.c
@@ -2409,22 +2409,60 @@ IDirect3DDeviceImpl_7_GetRenderState(IDirect3DDevice7 *iface,
case D3DRENDERSTATE_TEXTUREMIN:
{
WINED3DTEXTUREFILTERTYPE tex_min;
+ WINED3DTEXTUREFILTERTYPE tex_mip;
hr = IWineD3DDevice_GetSamplerState(This->wineD3DDevice,
- 0, WINED3DSAMP_MINFILTER,
- &tex_min);
+ 0, WINED3DSAMP_MINFILTER, &tex_min);
+ if (FAILED(hr))
+ {
+ LeaveCriticalSection(&ddraw_cs);
+ return hr;
+ }
+ hr = IWineD3DDevice_GetSamplerState(This->wineD3DDevice,
+ 0, WINED3DSAMP_MIPFILTER, &tex_mip);
switch (tex_min)
{
case WINED3DTEXF_POINT:
- *Value = D3DFILTER_NEAREST;
+ switch (tex_mip)
+ {
+ case WINED3DTEXF_NONE:
+ *Value = D3DFILTER_NEAREST;
+ break;
+ case WINED3DTEXF_POINT:
+ *Value = D3DFILTER_MIPNEAREST;
+ break;
+ case WINED3DTEXF_LINEAR:
+ *Value = D3DFILTER_LINEARMIPNEAREST;
+ break;
+ default:
+ ERR("Unhandled mip filter %#x.\n", tex_mip);
+ *Value = D3DFILTER_NEAREST;
+ break;
+ }
break;
case WINED3DTEXF_LINEAR:
- *Value = D3DFILTER_LINEAR;
+ switch (tex_mip)
+ {
+ case WINED3DTEXF_NONE:
+ *Value = D3DFILTER_LINEAR;
+ break;
+ case WINED3DTEXF_POINT:
+ *Value = D3DFILTER_MIPLINEAR;
+ break;
+ case WINED3DTEXF_LINEAR:
+ *Value = D3DFILTER_LINEARMIPLINEAR;
+ break;
+ default:
+ ERR("Unhandled mip filter %#x.\n", tex_mip);
+ *Value = D3DFILTER_LINEAR;
+ break;
+ }
break;
default:
- ERR("Unhandled texture mag %d !\n",tex_min);
- *Value = 0;
+ ERR("Unhandled texture min filter %#x.\n",tex_min);
+ *Value = D3DFILTER_NEAREST;
+ break;
}
break;
}
@@ -2441,8 +2479,20 @@ IDirect3DDeviceImpl_7_GetRenderState(IDirect3DDevice7 *iface,
Value);
break;
+ case D3DRENDERSTATE_BORDERCOLOR:
+ FIXME("Unhandled render state D3DRENDERSTATE_BORDERCOLOR.\n");
+ hr = E_NOTIMPL;
+ break;
+
default:
- /* FIXME: Unhandled: D3DRENDERSTATE_STIPPLEPATTERN00 - 31 */
+ if (RenderStateType >= D3DRENDERSTATE_STIPPLEPATTERN00
+ && RenderStateType <= D3DRENDERSTATE_STIPPLEPATTERN31)
+ {
+ FIXME("Unhandled stipple pattern render state (%#x).\n",
+ RenderStateType);
+ hr = E_NOTIMPL;
+ break;
+ }
hr = IWineD3DDevice_GetRenderState(This->wineD3DDevice,
RenderStateType,
Value);
@@ -2640,22 +2690,39 @@ IDirect3DDeviceImpl_7_SetRenderState(IDirect3DDevice7 *iface,
/* Some render states need special care */
switch(RenderStateType)
{
+ /*
+ * The ddraw texture filter mapping works like this:
+ * D3DFILTER_NEAREST Point min/mag, no mip
+ * D3DFILTER_MIPNEAREST Point min/mag, point mip
+ * D3DFILTER_LINEARMIPNEAREST: Point min/mag, linear mip
+ *
+ * D3DFILTER_LINEAR Linear min/mag, no mip
+ * D3DFILTER_MIPLINEAR Linear min/mag, point mip
+ * D3DFILTER_LINEARMIPLINEAR Linear min/mag, linear mip
+ *
+ * This is the opposite of the GL naming convention,
+ * D3DFILTER_LINEARMIPNEAREST corresponds to GL_NEAREST_MIPMAP_LINEAR.
+ */
case D3DRENDERSTATE_TEXTUREMAG:
{
- WINED3DTEXTUREFILTERTYPE tex_mag = WINED3DTEXF_POINT;
+ WINED3DTEXTUREFILTERTYPE tex_mag;
- switch ((D3DTEXTUREFILTER) Value)
+ switch (Value)
{
case D3DFILTER_NEAREST:
+ case D3DFILTER_MIPNEAREST:
case D3DFILTER_LINEARMIPNEAREST:
tex_mag = WINED3DTEXF_POINT;
break;
case D3DFILTER_LINEAR:
+ case D3DFILTER_MIPLINEAR:
case D3DFILTER_LINEARMIPLINEAR:
tex_mag = WINED3DTEXF_LINEAR;
break;
default:
+ tex_mag = WINED3DTEXF_POINT;
ERR("Unhandled texture mag %d !\n",Value);
+ break;
}
hr = IWineD3DDevice_SetSamplerState(This->wineD3DDevice,
@@ -2666,24 +2733,26 @@ IDirect3DDeviceImpl_7_SetRenderState(IDirect3DDevice7 *iface,
case D3DRENDERSTATE_TEXTUREMIN:
{
- WINED3DTEXTUREFILTERTYPE tex_min = WINED3DTEXF_POINT;
- WINED3DTEXTUREFILTERTYPE tex_mip = WINED3DTEXF_NONE;
+ WINED3DTEXTUREFILTERTYPE tex_min;
+ WINED3DTEXTUREFILTERTYPE tex_mip;
switch ((D3DTEXTUREFILTER) Value)
{
case D3DFILTER_NEAREST:
tex_min = WINED3DTEXF_POINT;
+ tex_mip = WINED3DTEXF_NONE;
break;
case D3DFILTER_LINEAR:
tex_min = WINED3DTEXF_LINEAR;
+ tex_mip = WINED3DTEXF_NONE;
break;
case D3DFILTER_MIPNEAREST:
tex_min = WINED3DTEXF_POINT;
tex_mip = WINED3DTEXF_POINT;
break;
case D3DFILTER_MIPLINEAR:
- tex_min = WINED3DTEXF_POINT;
- tex_mip = WINED3DTEXF_LINEAR;
+ tex_min = WINED3DTEXF_LINEAR;
+ tex_mip = WINED3DTEXF_POINT;
break;
case D3DFILTER_LINEARMIPNEAREST:
tex_min = WINED3DTEXF_POINT;
@@ -2696,11 +2765,13 @@ IDirect3DDeviceImpl_7_SetRenderState(IDirect3DDevice7 *iface,
default:
ERR("Unhandled texture min %d !\n",Value);
+ tex_min = WINED3DTEXF_POINT;
+ tex_mip = WINED3DTEXF_NONE;
+ break;
}
- IWineD3DDevice_SetSamplerState(This->wineD3DDevice,
- 0, WINED3DSAMP_MIPFILTER,
- tex_mip);
+ IWineD3DDevice_SetSamplerState(This->wineD3DDevice,
+ 0, WINED3DSAMP_MIPFILTER, tex_mip);
hr = IWineD3DDevice_SetSamplerState(This->wineD3DDevice,
0, WINED3DSAMP_MINFILTER,
tex_min);
@@ -2723,9 +2794,22 @@ IDirect3DDeviceImpl_7_SetRenderState(IDirect3DDevice7 *iface,
Value);
break;
- default:
+ case D3DRENDERSTATE_BORDERCOLOR:
+ /* This should probably just forward to the corresponding sampler
+ * state. Needs tests. */
+ FIXME("Unhandled render state D3DRENDERSTATE_BORDERCOLOR.\n");
+ hr = E_NOTIMPL;
+ break;
- /* FIXME: Unhandled: D3DRENDERSTATE_STIPPLEPATTERN00 - 31 */
+ default:
+ if (RenderStateType >= D3DRENDERSTATE_STIPPLEPATTERN00
+ && RenderStateType <= D3DRENDERSTATE_STIPPLEPATTERN31)
+ {
+ FIXME("Unhandled stipple pattern render state (%#x).\n",
+ RenderStateType);
+ hr = E_NOTIMPL;
+ break;
+ }
hr = IWineD3DDevice_SetRenderState(This->wineD3DDevice,
RenderStateType,
diff --git a/dll/directx/wine/ddraw/direct3d.c b/dll/directx/wine/ddraw/direct3d.c
index 80052adb83f..3f2410fe8a7 100644
--- a/dll/directx/wine/ddraw/direct3d.c
+++ b/dll/directx/wine/ddraw/direct3d.c
@@ -1273,6 +1273,7 @@ IDirect3DImpl_GetCaps(IWineD3D *WineD3D,
/* Copy the results into the d3d7 and d3d3 structures */
Desc7->dwDevCaps = WCaps.DevCaps;
+ Desc7->dpcLineCaps.dwMiscCaps = WCaps.PrimitiveMiscCaps;
Desc7->dpcLineCaps.dwRasterCaps = WCaps.RasterCaps;
Desc7->dpcLineCaps.dwZCmpCaps = WCaps.ZCmpCaps;
Desc7->dpcLineCaps.dwSrcBlendCaps = WCaps.SrcBlendCaps;
diff --git a/dll/directx/wine/ddraw/executebuffer.c b/dll/directx/wine/ddraw/executebuffer.c
index 2f426881cba..29fd65e25a9 100644
--- a/dll/directx/wine/ddraw/executebuffer.c
+++ b/dll/directx/wine/ddraw/executebuffer.c
@@ -489,7 +489,7 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
memcpy(dst, src, ci->dwCount * sizeof(D3DTLVERTEX));
} else {
- ERR("Unhandled vertex processing !\n");
+ ERR("Unhandled vertex processing flag %#x.\n", ci->dwFlags);
}
instr += size;
@@ -703,7 +703,6 @@ IDirect3DExecuteBufferImpl_Lock(IDirect3DExecuteBuffer *iface,
TRACE("(%p)->(%p)\n", This, lpDesc);
dwSize = lpDesc->dwSize;
- memset(lpDesc, 0, dwSize);
memcpy(lpDesc, &This->desc, dwSize);
if (TRACE_ON(d3d7)) {
@@ -789,7 +788,6 @@ IDirect3DExecuteBufferImpl_GetExecuteData(IDirect3DExecuteBuffer *iface,
TRACE("(%p)->(%p): stub!\n", This, lpData);
dwSize = lpData->dwSize;
- memset(lpData, 0, dwSize);
memcpy(lpData, &This->data, dwSize);
if (TRACE_ON(d3d7)) {
diff --git a/dll/directx/wine/ddraw/main.c b/dll/directx/wine/ddraw/main.c
index bc23987ed81..72426cdf26c 100644
--- a/dll/directx/wine/ddraw/main.c
+++ b/dll/directx/wine/ddraw/main.c
@@ -288,7 +288,7 @@ err_out:
/* Let's hope we never need this ;) */
if(wineD3DDevice) IWineD3DDevice_Release(wineD3DDevice);
if(wineD3D) IWineD3D_Release(wineD3D);
- if(This) HeapFree(GetProcessHeap(), 0, This->decls);
+ HeapFree(GetProcessHeap(), 0, This->decls);
HeapFree(GetProcessHeap(), 0, This);
return hr;
}
diff --git a/dll/directx/wine/ddraw/material.c b/dll/directx/wine/ddraw/material.c
index 6f162f7c828..d75501ecd95 100644
--- a/dll/directx/wine/ddraw/material.c
+++ b/dll/directx/wine/ddraw/material.c
@@ -294,7 +294,6 @@ IDirect3DMaterialImpl_GetMaterial(IDirect3DMaterial3 *iface,
/* Copies the material structure */
EnterCriticalSection(&ddraw_cs);
dwSize = lpMat->dwSize;
- memset(lpMat, 0, dwSize);
memcpy(lpMat, &This->mat, dwSize);
LeaveCriticalSection(&ddraw_cs);
diff --git a/dll/directx/wine/ddraw/utils.c b/dll/directx/wine/ddraw/utils.c
index cfb04049770..5166b167b4a 100644
--- a/dll/directx/wine/ddraw/utils.c
+++ b/dll/directx/wine/ddraw/utils.c
@@ -171,7 +171,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat,
DDPixelFormat->u2.dwRBitMask = 0x00E0;
DDPixelFormat->u3.dwGBitMask = 0x001C;
DDPixelFormat->u4.dwBBitMask = 0x0003;
- DDPixelFormat->u5.dwRGBAlphaBitMask = 0xF000;
+ DDPixelFormat->u5.dwRGBAlphaBitMask = 0xFF00;
break;
case WINED3DFMT_B4G4R4X4_UNORM:
@@ -182,7 +182,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat,
DDPixelFormat->u3.dwGBitMask = 0x00F0;
DDPixelFormat->u4.dwBBitMask = 0x000F;
DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0;
- return;
+ break;
/* How are Z buffer bit depth and Stencil buffer bit depth related?
*/
@@ -236,8 +236,8 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat,
DDPixelFormat->u3.dwZBitMask = 0x00FFFFFFFF;
DDPixelFormat->u4.dwStencilBitMask = 0x00000000;
DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0;
-
break;
+
case WINED3DFMT_S1_UINT_D15_UNORM:
DDPixelFormat->dwFlags = DDPF_ZBUFFER | DDPF_STENCILBUFFER;
DDPixelFormat->dwFourCC = 0;
diff --git a/dll/directx/wine/wined3d/arb_program_shader.c b/dll/directx/wine/wined3d/arb_program_shader.c
index cf7638605eb..0824fedb571 100644
--- a/dll/directx/wine/wined3d/arb_program_shader.c
+++ b/dll/directx/wine/wined3d/arb_program_shader.c
@@ -39,8 +39,6 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_constants);
WINE_DECLARE_DEBUG_CHANNEL(d3d_caps);
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)
{
@@ -61,14 +59,14 @@ static char *get_line(char **ptr)
static void shader_arb_dump_program_source(const char *source)
{
- unsigned long source_size;
+ ULONG 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);
+ ERR("Failed to allocate %u bytes for shader source.\n", source_size);
return;
}
memcpy(tmp, source, source_size);
@@ -81,10 +79,13 @@ static void shader_arb_dump_program_source(const char *source)
}
/* GL locking for state handlers is done by the caller. */
-static BOOL need_mova_const(IWineD3DBaseShader *shader, const struct wined3d_gl_info *gl_info)
+static BOOL need_rel_addr_const(IWineD3DBaseShaderImpl *shader, const struct wined3d_gl_info *gl_info)
{
- IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *) shader;
- if(!This->baseShader.reg_maps.usesmova) return FALSE;
+ if (shader->baseShader.reg_maps.shader_version.type == WINED3D_SHADER_TYPE_VERTEX)
+ {
+ if (((IWineD3DVertexShaderImpl *)shader)->rel_offset) return TRUE;
+ }
+ if (!shader->baseShader.reg_maps.usesmova) return FALSE;
return !gl_info->supported[NV_VERTEX_PROGRAM2_OPTION];
}
@@ -95,29 +96,85 @@ static inline BOOL use_nv_clip(const struct wined3d_gl_info *gl_info)
&& !(gl_info->quirks & WINED3D_QUIRK_NV_CLIP_BROKEN);
}
-static BOOL need_helper_const(const struct wined3d_gl_info *gl_info)
+static BOOL need_helper_const(IWineD3DBaseShaderImpl *shader, const struct wined3d_gl_info *gl_info)
{
- if (!gl_info->supported[NV_VERTEX_PROGRAM] /* Need to init colors. */
- || gl_info->quirks & WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT /* Load the immval offset. */
- || gl_info->quirks & WINED3D_QUIRK_SET_TEXCOORD_W /* Have to init texcoords. */
- || (!use_nv_clip(gl_info)) /* Init the clip texcoord */)
- {
- return TRUE;
- }
+ if (need_rel_addr_const(shader, gl_info)) return TRUE;
+ if (!gl_info->supported[NV_VERTEX_PROGRAM]) return TRUE; /* Need to init colors. */
+ if (gl_info->quirks & WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT) return TRUE; /* Load the immval offset. */
+ if (gl_info->quirks & WINED3D_QUIRK_SET_TEXCOORD_W) return TRUE; /* Have to init texcoords. */
+ if (!use_nv_clip(gl_info)) return TRUE; /* Init the clip texcoord */
+ if (shader->baseShader.reg_maps.usesnrm) return TRUE; /* 0.0 */
+ if (shader->baseShader.reg_maps.usesrcp) return TRUE; /* EPS */
return FALSE;
}
-static unsigned int reserved_vs_const(IWineD3DBaseShader *shader, const struct wined3d_gl_info *gl_info)
+static unsigned int reserved_vs_const(IWineD3DBaseShaderImpl *shader, const struct wined3d_gl_info *gl_info)
{
unsigned int ret = 1;
/* We use one PARAM for the pos fixup, and in some cases one to load
* some immediate values into the shader
*/
- if(need_helper_const(gl_info)) ret++;
- if(need_mova_const(shader, gl_info)) ret++;
+ if(need_helper_const(shader, gl_info)) ret++;
+ if(need_rel_addr_const(shader, gl_info)) ret++;
return ret;
}
+enum arb_helper_value
+{
+ ARB_ZERO,
+ ARB_ONE,
+ ARB_TWO,
+ ARB_0001,
+ ARB_EPS,
+
+ ARB_VS_REL_OFFSET
+};
+
+static const char *arb_get_helper_value(enum wined3d_shader_type shader, enum arb_helper_value value)
+{
+ if (shader == WINED3D_SHADER_TYPE_GEOMETRY)
+ {
+ ERR("Geometry shaders are unsupported\n");
+ return "bad";
+ }
+
+ if (shader == WINED3D_SHADER_TYPE_PIXEL)
+ {
+ switch (value)
+ {
+ case ARB_ZERO: return "ps_helper_const.x";
+ case ARB_ONE: return "ps_helper_const.y";
+ case ARB_TWO: return "coefmul.x";
+ case ARB_0001: return "helper_const.xxxy";
+ case ARB_EPS: return "ps_helper_const.z";
+ default: break;
+ }
+ }
+ else
+ {
+ switch (value)
+ {
+ case ARB_ZERO: return "helper_const.x";
+ case ARB_ONE: return "helper_const.y";
+ case ARB_TWO: return "helper_const.z";
+ case ARB_EPS: return "helper_const.w";
+ case ARB_0001: return "helper_const.xxxy";
+ case ARB_VS_REL_OFFSET: return "rel_addr_const.y";
+ }
+ }
+ FIXME("Unmanaged %s shader helper constant requested: %u\n",
+ shader == WINED3D_SHADER_TYPE_PIXEL ? "pixel" : "vertex", value);
+ switch (value)
+ {
+ case ARB_ZERO: return "0.0";
+ case ARB_ONE: return "1.0";
+ case ARB_TWO: return "2.0";
+ case ARB_0001: return "{0.0, 0.0, 0.0, 1.0}";
+ case ARB_EPS: return "1e-8";
+ default: return "bad";
+ }
+}
+
static inline BOOL ffp_clip_emul(IWineD3DStateBlockImpl *stateblock)
{
return stateblock->lowest_disabled_stage < 7;
@@ -287,7 +344,8 @@ struct shader_arb_priv
const struct arb_ps_compiled_shader *compiled_fprog;
const struct arb_vs_compiled_shader *compiled_vprog;
GLuint depth_blt_vprogram_id;
- GLuint depth_blt_fprogram_id[tex_type_count];
+ GLuint depth_blt_fprogram_id_full[tex_type_count];
+ GLuint depth_blt_fprogram_id_masked[tex_type_count];
BOOL use_arbfp_fixed_func;
struct wine_rb_tree fragment_shaders;
BOOL last_ps_const_clamped;
@@ -509,7 +567,7 @@ static inline void shader_arb_ps_local_constants(IWineD3DDeviceImpl* deviceImpl)
*/
float val[4];
val[0] = context->render_offscreen ? 0.0f
- : ((IWineD3DSurfaceImpl *) deviceImpl->render_targets[0])->currentDesc.Height;
+ : deviceImpl->render_targets[0]->currentDesc.Height;
val[1] = context->render_offscreen ? 1.0f : -1.0f;
val[2] = 1.0f;
val[3] = 0.0f;
@@ -576,7 +634,7 @@ static inline void shader_arb_vs_local_constants(IWineD3DDeviceImpl* deviceImpl)
/* GL locking is done by the caller (state handler) */
static void shader_arb_load_constants(const struct wined3d_context *context, char usePixelShader, char useVertexShader)
{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
+ IWineD3DDeviceImpl *device = context->swapchain->device;
IWineD3DStateBlockImpl* stateBlock = device->stateBlock;
const struct wined3d_gl_info *gl_info = context->gl_info;
@@ -606,7 +664,7 @@ static void shader_arb_update_float_vertex_constants(IWineD3DDevice *iface, UINT
/* We don't want shader constant dirtification to be an O(contexts), so just dirtify the active
* context. On a context switch the old context will be fully dirtified */
- if (!context || ((IWineD3DSurfaceImpl *)context->surface)->resource.device != This) return;
+ if (!context || context->swapchain->device != This) return;
memset(context->vshader_const_dirty + start, 1, sizeof(*context->vshader_const_dirty) * count);
This->highest_dirty_vs_const = max(This->highest_dirty_vs_const, start + count);
@@ -619,7 +677,7 @@ static void shader_arb_update_float_pixel_constants(IWineD3DDevice *iface, UINT
/* We don't want shader constant dirtification to be an O(contexts), so just dirtify the active
* context. On a context switch the old context will be fully dirtified */
- if (!context || ((IWineD3DSurfaceImpl *)context->surface)->resource.device != This) return;
+ if (!context || context->swapchain->device != This) return;
memset(context->pshader_const_dirty + start, 1, sizeof(*context->pshader_const_dirty) * count);
This->highest_dirty_ps_const = max(This->highest_dirty_ps_const, start + count);
@@ -670,12 +728,23 @@ static DWORD shader_generate_arb_declarations(IWineD3DBaseShader *iface, const s
if (pshader)
{
max_constantsF = gl_info->limits.arb_ps_native_constants;
+ /* 24 is the minimum MAX_PROGRAM_ENV_PARAMETERS_ARB value. */
+ if (max_constantsF < 24)
+ max_constantsF = gl_info->limits.arb_ps_float_constants;
}
else
{
+ max_constantsF = gl_info->limits.arb_vs_native_constants;
+ /* 96 is the minimum MAX_PROGRAM_ENV_PARAMETERS_ARB value.
+ * Also prevents max_constantsF from becoming less than 0 and
+ * wrapping . */
+ if (max_constantsF < 96)
+ max_constantsF = gl_info->limits.arb_vs_float_constants;
+
if(This->baseShader.reg_maps.usesrelconstF) {
DWORD highest_constf = 0, clip_limit;
- max_constantsF = gl_info->limits.arb_vs_native_constants - reserved_vs_const(iface, gl_info);
+
+ max_constantsF -= reserved_vs_const(This, gl_info);
max_constantsF -= count_bits(This->baseShader.reg_maps.integer_constants);
for(i = 0; i < This->baseShader.limits.constant_float; i++)
@@ -708,7 +777,6 @@ static DWORD shader_generate_arb_declarations(IWineD3DBaseShader *iface, const s
{
if (ctx->target_version >= NV2) *num_clipplanes = gl_info->limits.clipplanes;
else *num_clipplanes = min(gl_info->limits.clipplanes, 4);
- max_constantsF = gl_info->limits.arb_vs_native_constants;
}
}
@@ -1355,7 +1423,9 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD
if (pshader)
{
gen_color_correction(buffer, dst_str, ins->dst[0].write_mask,
- "one", "coefmul.x", priv->cur_ps_args->super.color_fixup[sampler_idx]);
+ arb_get_helper_value(WINED3D_SHADER_TYPE_PIXEL, ARB_ONE),
+ arb_get_helper_value(WINED3D_SHADER_TYPE_PIXEL, ARB_TWO),
+ priv->cur_ps_args->super.color_fixup[sampler_idx]);
}
}
@@ -1369,6 +1439,8 @@ static void shader_arb_get_src_param(const struct wined3d_shader_instruction *in
int insert_line;
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
struct shader_arb_ctx_priv *ctx = ins->ctx->backend_data;
+ const char *one = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ONE);
+ const char *two = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_TWO);
/* Assume a new line will be added */
insert_line = 1;
@@ -1394,13 +1466,13 @@ static void shader_arb_get_src_param(const struct wined3d_shader_instruction *in
shader_addline(buffer, "ADD T%c, -%s, coefdiv.x;\n", 'A' + tmpreg, regstr);
break;
case WINED3DSPSM_SIGN:
- shader_addline(buffer, "MAD T%c, %s, coefmul.x, -one.x;\n", 'A' + tmpreg, regstr);
+ shader_addline(buffer, "MAD T%c, %s, %s, -%s;\n", 'A' + tmpreg, regstr, two, one);
break;
case WINED3DSPSM_SIGNNEG:
- shader_addline(buffer, "MAD T%c, %s, -coefmul.x, one.x;\n", 'A' + tmpreg, regstr);
+ shader_addline(buffer, "MAD T%c, %s, %s, %s;\n", 'A' + tmpreg, regstr, two, one);
break;
case WINED3DSPSM_COMP:
- shader_addline(buffer, "SUB T%c, one.x, %s;\n", 'A' + tmpreg, regstr);
+ shader_addline(buffer, "SUB T%c, %s, %s;\n", 'A' + tmpreg, one, regstr);
break;
case WINED3DSPSM_X2:
shader_addline(buffer, "ADD T%c, %s, %s;\n", 'A' + tmpreg, regstr, regstr);
@@ -1671,12 +1743,16 @@ static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
BOOL pshader = shader_is_pshader_version(shader->baseShader.reg_maps.shader_version.type);
struct shader_arb_ctx_priv *ctx = ins->ctx->backend_data;
+ const char *zero = arb_get_helper_value(shader->baseShader.reg_maps.shader_version.type, ARB_ZERO);
+ const char *one = arb_get_helper_value(shader->baseShader.reg_maps.shader_version.type, ARB_ONE);
+ const char *two = arb_get_helper_value(shader->baseShader.reg_maps.shader_version.type, ARB_TWO);
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
char src0_param[256];
if(ins->handler_idx == WINED3DSIH_MOVA) {
char write_mask[6];
+ const char *offset = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_VS_REL_OFFSET);
if(ctx->target_version >= NV2) {
shader_hw_map2gl(ins);
@@ -1695,15 +1771,15 @@ static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
* The ARL is performed when A0 is used - the requested component is read from A0_SHADOW into
* A0.x. We can use the overwritten component of A0_shadow as temporary storage for the sign.
*/
- shader_addline(buffer, "SGE A0_SHADOW%s, %s, mova_const.y;\n", write_mask, src0_param);
- shader_addline(buffer, "MAD A0_SHADOW%s, A0_SHADOW, mova_const.z, -mova_const.w;\n", write_mask);
+ shader_addline(buffer, "SGE A0_SHADOW%s, %s, %s;\n", write_mask, src0_param, zero);
+ shader_addline(buffer, "MAD A0_SHADOW%s, A0_SHADOW, %s, -%s;\n", write_mask, two, one);
shader_addline(buffer, "ABS TA%s, %s;\n", write_mask, src0_param);
- shader_addline(buffer, "ADD TA%s, TA, mova_const.x;\n", write_mask);
+ shader_addline(buffer, "ADD TA%s, TA, rel_addr_const.x;\n", write_mask);
shader_addline(buffer, "FLR TA%s, TA;\n", write_mask);
if (((IWineD3DVertexShaderImpl *)shader)->rel_offset)
{
- shader_addline(buffer, "ADD TA%s, TA, helper_const.z;\n", write_mask);
+ shader_addline(buffer, "ADD TA%s, TA, %s;\n", write_mask, offset);
}
shader_addline(buffer, "MUL A0_SHADOW%s, TA, A0_SHADOW;\n", write_mask);
@@ -1715,8 +1791,9 @@ static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
src0_param[0] = '\0';
if (((IWineD3DVertexShaderImpl *)shader)->rel_offset)
{
+ const char *offset = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_VS_REL_OFFSET);
shader_arb_get_src_param(ins, &ins->src[0], 0, src0_param);
- shader_addline(buffer, "ADD TA.x, %s, helper_const.z;\n", src0_param);
+ shader_addline(buffer, "ADD TA.x, %s, %s;\n", src0_param, offset);
shader_addline(buffer, "ARL A0.x, TA.x;\n");
}
else
@@ -2170,6 +2247,8 @@ static void pshader_hw_texdepth(const struct wined3d_shader_instruction *ins)
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
char dst_name[50];
+ const char *zero = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ZERO);
+ const char *one = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ONE);
/* texdepth has an implicit destination, the fragment depth value. It's only parameter,
* which is essentially an input, is the destination register because it is the first
@@ -2181,7 +2260,7 @@ static void pshader_hw_texdepth(const struct wined3d_shader_instruction *ins)
/* According to the msdn, the source register(must be r5) is unusable after
* the texdepth instruction, so we're free to modify it
*/
- shader_addline(buffer, "MIN %s.y, %s.y, one.y;\n", dst_name, dst_name);
+ shader_addline(buffer, "MIN %s.y, %s.y, %s;\n", dst_name, dst_name, one);
/* How to deal with the special case dst_name.g == 0? if r != 0, then
* the r * (1 / 0) will give infinity, which is clamped to 1.0, the correct
@@ -2189,8 +2268,8 @@ static void pshader_hw_texdepth(const struct wined3d_shader_instruction *ins)
*/
shader_addline(buffer, "RCP %s.y, %s.y;\n", dst_name, dst_name);
shader_addline(buffer, "MUL TA.x, %s.x, %s.y;\n", dst_name, dst_name);
- shader_addline(buffer, "MIN TA.x, TA.x, one.x;\n");
- shader_addline(buffer, "MAX result.depth, TA.x, 0.0;\n");
+ shader_addline(buffer, "MIN TA.x, TA.x, %s;\n", one);
+ shader_addline(buffer, "MAX result.depth, TA.x, %s;\n", zero);
}
/** Process the WINED3DSIO_TEXDP3TEX instruction in ARB:
@@ -2254,6 +2333,8 @@ static void pshader_hw_texm3x2depth(const struct wined3d_shader_instruction *ins
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
char src0[50], dst_name[50];
BOOL is_color;
+ const char *zero = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ZERO);
+ const char *one = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ONE);
shader_arb_get_src_param(ins, &ins->src[0], 0, src0);
shader_arb_get_register_name(ins, &ins->dst[0].reg, dst_name, &is_color);
@@ -2265,8 +2346,8 @@ static void pshader_hw_texm3x2depth(const struct wined3d_shader_instruction *ins
*/
shader_addline(buffer, "RCP %s.y, %s.y;\n", dst_name, dst_name);
shader_addline(buffer, "MUL %s.x, %s.x, %s.y;\n", dst_name, dst_name, dst_name);
- shader_addline(buffer, "MIN %s.x, %s.x, one.x;\n", dst_name, dst_name);
- shader_addline(buffer, "MAX result.depth, %s.x, 0.0;\n", dst_name);
+ shader_addline(buffer, "MIN %s.x, %s.x, %s;\n", dst_name, dst_name, one);
+ shader_addline(buffer, "MAX result.depth, %s.x, %s;\n", dst_name, zero);
}
/** Handles transforming all WINED3DSIO_M?x? opcodes for
@@ -2325,6 +2406,44 @@ static void shader_hw_mnxn(const struct wined3d_shader_instruction *ins)
}
}
+static void shader_hw_rcp(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+ const char *flt_eps = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_EPS);
+
+ char dst[50];
+ char src[50];
+
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst); /* Destination */
+ shader_arb_get_src_param(ins, &ins->src[0], 0, src);
+ if (ins->src[0].swizzle == WINED3DSP_NOSWIZZLE)
+ {
+ /* Dx sdk says .x is used if no swizzle is given, but our test shows that
+ * .w is used
+ */
+ strcat(src, ".w");
+ }
+
+ /* TODO: If the destination is readable, and not the same as the source, the destination
+ * can be used instead of TA
+ */
+ if (priv->target_version >= NV2)
+ {
+ shader_addline(buffer, "MOVC TA.x, %s;\n", src);
+ shader_addline(buffer, "MOV TA.x (EQ.x), %s;\n", flt_eps);
+ shader_addline(buffer, "RCP%s %s, TA.x;\n", shader_arb_get_modifier(ins), dst);
+ }
+ else
+ {
+ const char *zero = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ZERO);
+ shader_addline(buffer, "ABS TA.x, %s;\n", src);
+ shader_addline(buffer, "SGE TA.y, -TA.x, %s;\n", zero);
+ shader_addline(buffer, "MAD TA.x, TA.y, %s, %s;\n", flt_eps, src);
+ shader_addline(buffer, "RCP%s %s, TA.x;\n", shader_arb_get_modifier(ins), dst);
+ }
+}
+
static void shader_hw_scalar_op(const struct wined3d_shader_instruction *ins)
{
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
@@ -2364,20 +2483,44 @@ static void shader_hw_nrm(const struct wined3d_shader_instruction *ins)
char src_name[50];
struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
BOOL pshader = shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type);
+ const char *zero = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ZERO);
shader_arb_get_dst_param(ins, &ins->dst[0], dst_name);
shader_arb_get_src_param(ins, &ins->src[0], 1 /* Use TB */, src_name);
+ /* In D3D, NRM of a vector with length zero returns zero. Catch this situation, as
+ * otherwise NRM or RSQ would return NaN */
if(pshader && priv->target_version >= NV3)
{
+ /* GL_NV_fragment_program2's NRM needs protection against length zero vectors too
+ *
+ * TODO: Find out if DP3+NRM+MOV is really faster than DP3+RSQ+MUL
+ */
+ shader_addline(buffer, "DP3C TA, %s, %s;\n", src_name, src_name);
shader_addline(buffer, "NRM%s %s, %s;\n", shader_arb_get_modifier(ins), dst_name, src_name);
+ shader_addline(buffer, "MOV %s (EQ), %s;\n", dst_name, zero);
+ }
+ else if(priv->target_version >= NV2)
+ {
+ shader_addline(buffer, "DP3C TA.x, %s, %s;\n", src_name, src_name);
+ shader_addline(buffer, "RSQ TA.x (NE), TA.x;\n");
+ shader_addline(buffer, "MUL%s %s, %s, TA.x;\n", shader_arb_get_modifier(ins), dst_name,
+ src_name);
}
else
{
- shader_addline(buffer, "DP3 TA, %s, %s;\n", src_name, src_name);
- shader_addline(buffer, "RSQ TA, TA.x;\n");
+ const char *one = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ONE);
+
+ shader_addline(buffer, "DP3 TA.x, %s, %s;\n", src_name, src_name);
+ /* Pass any non-zero value to RSQ if the input vector has a length of zero. The
+ * RSQ result doesn't matter, as long as multiplying it by 0 returns 0.
+ */
+ shader_addline(buffer, "SGE TA.y, -TA.x, %s;\n", zero);
+ shader_addline(buffer, "MAD TA.x, %s, TA.y, TA.x;\n", one);
+
+ shader_addline(buffer, "RSQ TA.x, TA.x;\n");
/* dst.w = src[0].w * 1 / (src.x^2 + src.y^2 + src.z^2)^(1/2) according to msdn*/
- shader_addline(buffer, "MUL%s %s, %s, TA;\n", shader_arb_get_modifier(ins), dst_name,
+ shader_addline(buffer, "MUL%s %s, %s, TA.x;\n", shader_arb_get_modifier(ins), dst_name,
src_name);
}
}
@@ -2997,6 +3140,7 @@ static void vshader_add_footer(IWineD3DVertexShaderImpl *This, struct wined3d_sh
{
unsigned int cur_clip = 0;
char component[4] = {'x', 'y', 'z', 'w'};
+ const char *zero = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_ZERO);
for (i = 0; i < gl_info->limits.clipplanes; ++i)
{
@@ -3009,16 +3153,16 @@ static void vshader_add_footer(IWineD3DVertexShaderImpl *This, struct wined3d_sh
switch(cur_clip)
{
case 0:
- shader_addline(buffer, "MOV TA, -helper_const.w;\n");
+ shader_addline(buffer, "MOV TA, %s;\n", zero);
break;
case 1:
- shader_addline(buffer, "MOV TA.yzw, -helper_const.w;\n");
+ shader_addline(buffer, "MOV TA.yzw, %s;\n", zero);
break;
case 2:
- shader_addline(buffer, "MOV TA.zw, -helper_const.w;\n");
+ shader_addline(buffer, "MOV TA.zw, %s;\n", zero);
break;
case 3:
- shader_addline(buffer, "MOV TA.w, -helper_const.w;\n");
+ shader_addline(buffer, "MOV TA.w, %s;\n", zero);
break;
}
shader_addline(buffer, "MOV result.texcoord[%u], TA;\n",
@@ -3028,8 +3172,9 @@ static void vshader_add_footer(IWineD3DVertexShaderImpl *This, struct wined3d_sh
/* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c
* and the glsl equivalent
*/
- if(need_helper_const(gl_info)) {
- shader_addline(buffer, "MAD TMP_OUT.z, TMP_OUT.z, helper_const.x, -TMP_OUT.w;\n");
+ if(need_helper_const((IWineD3DBaseShaderImpl *) This, gl_info)) {
+ const char *two = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_TWO);
+ shader_addline(buffer, "MAD TMP_OUT.z, TMP_OUT.z, %s, -TMP_OUT.w;\n", two);
} else {
shader_addline(buffer, "ADD TMP_OUT.z, TMP_OUT.z, TMP_OUT.z;\n");
shader_addline(buffer, "ADD TMP_OUT.z, TMP_OUT.z, -TMP_OUT.w;\n");
@@ -3103,12 +3248,14 @@ static GLuint create_arb_blt_vertex_program(const struct wined3d_gl_info *gl_inf
}
/* GL locking is done by the caller */
-static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_info, enum tex_types tex_type)
+static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_info,
+ enum tex_types tex_type, BOOL masked)
{
GLuint program_id = 0;
+ const char *fprogram;
GLint pos;
- static const char * const blt_fprograms[tex_type_count] =
+ static const char * const blt_fprograms_full[tex_type_count] =
{
/* tex_1d */
NULL,
@@ -3134,16 +3281,55 @@ static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_i
"END\n",
};
- if (!blt_fprograms[tex_type])
+ static const char * const blt_fprograms_masked[tex_type_count] =
{
- FIXME("tex_type %#x not supported\n", tex_type);
+ /* tex_1d */
+ NULL,
+ /* tex_2d */
+ "!!ARBfp1.0\n"
+ "PARAM mask = program.local[0];\n"
+ "TEMP R0;\n"
+ "SLT R0.xy, fragment.position, mask.zwzw;\n"
+ "MUL R0.x, R0.x, R0.y;\n"
+ "KIL -R0.x;\n"
+ "TEX R0.x, fragment.texcoord[0], texture[0], 2D;\n"
+ "MOV result.depth.z, R0.x;\n"
+ "END\n",
+ /* tex_3d */
+ NULL,
+ /* tex_cube */
+ "!!ARBfp1.0\n"
+ "PARAM mask = program.local[0];\n"
+ "TEMP R0;\n"
+ "SLT R0.xy, fragment.position, mask.zwzw;\n"
+ "MUL R0.x, R0.x, R0.y;\n"
+ "KIL -R0.x;\n"
+ "TEX R0.x, fragment.texcoord[0], texture[0], CUBE;\n"
+ "MOV result.depth.z, R0.x;\n"
+ "END\n",
+ /* tex_rect */
+ "!!ARBfp1.0\n"
+ "PARAM mask = program.local[0];\n"
+ "TEMP R0;\n"
+ "SLT R0.xy, fragment.position, mask.zwzw;\n"
+ "MUL R0.x, R0.x, R0.y;\n"
+ "KIL -R0.x;\n"
+ "TEX R0.x, fragment.texcoord[0], texture[0], RECT;\n"
+ "MOV result.depth.z, R0.x;\n"
+ "END\n",
+ };
+
+ fprogram = masked ? blt_fprograms_masked[tex_type] : blt_fprograms_full[tex_type];
+ if (!fprogram)
+ {
+ FIXME("tex_type %#x not supported, falling back to tex_2d\n", tex_type);
tex_type = tex_2d;
+ fprogram = masked ? blt_fprograms_masked[tex_type] : blt_fprograms_full[tex_type];
}
GL_EXTCALL(glGenProgramsARB(1, &program_id));
GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, program_id));
- GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
- strlen(blt_fprograms[tex_type]), blt_fprograms[tex_type]));
+ GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(fprogram), fprogram));
checkGLcall("glProgramStringARB()");
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
@@ -3151,7 +3337,7 @@ static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_i
{
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]);
+ shader_arb_dump_program_source(fprogram);
}
else
{
@@ -3309,7 +3495,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct
char fragcolor[16];
DWORD *lconst_map = local_const_mapping((IWineD3DBaseShaderImpl *) This), next_local, cur;
struct shader_arb_ctx_priv priv_ctx;
- BOOL dcl_tmp = args->super.srgb_correction, dcl_td = FALSE;
+ BOOL dcl_td = FALSE;
BOOL want_nv_prog = FALSE;
struct arb_pshader_private *shader_priv = This->baseShader.backend_data;
GLint errPos;
@@ -3331,7 +3517,6 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct
}
switch(found) {
- case 4: dcl_tmp = FALSE; break;
case 0:
sprintf(srgbtmp[0], "TA");
sprintf(srgbtmp[1], "TB");
@@ -3351,6 +3536,8 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct
case 3:
sprintf(srgbtmp[3], "TA");
break;
+ case 4:
+ break;
}
/* Create the hw ARB shader */
@@ -3432,7 +3619,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct
if(dcl_td) shader_addline(buffer, "TEMP TD;\n"); /* Used for sRGB writing */
shader_addline(buffer, "PARAM coefdiv = { 0.5, 0.25, 0.125, 0.0625 };\n");
shader_addline(buffer, "PARAM coefmul = { 2, 4, 8, 16 };\n");
- shader_addline(buffer, "PARAM one = { 1.0, 1.0, 1.0, 1.0 };\n");
+ shader_addline(buffer, "PARAM ps_helper_const = { 0.0, 1.0, %1.10f, 0.0 };\n", eps);
if (reg_maps->shader_version.major < 2)
{
@@ -3927,11 +4114,11 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct
}
shader_addline(buffer, "TEMP TMP_OUT;\n");
- if(need_helper_const(gl_info)) {
- shader_addline(buffer, "PARAM helper_const = { 2.0, -1.0, %d.0, 0.0 };\n", This->rel_offset);
+ if(need_helper_const((IWineD3DBaseShaderImpl *) This, gl_info)) {
+ shader_addline(buffer, "PARAM helper_const = { 0.0, 1.0, 2.0, %1.10f};\n", eps);
}
- if(need_mova_const((IWineD3DBaseShader *) This, gl_info)) {
- shader_addline(buffer, "PARAM mova_const = { 0.5, 0.0, 2.0, 1.0 };\n");
+ if(need_rel_addr_const((IWineD3DBaseShaderImpl *) This, gl_info)) {
+ shader_addline(buffer, "PARAM rel_addr_const = { 0.5, %d.0, 0.0, 0.0 };\n", This->rel_offset);
shader_addline(buffer, "TEMP A0_SHADOW;\n");
}
@@ -3979,15 +4166,18 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct
*/
if (!gl_info->supported[NV_VERTEX_PROGRAM])
{
- shader_addline(buffer, "MOV result.color.secondary, -helper_const.wwwy;\n");
+ const char *color_init = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_0001);
+ shader_addline(buffer, "MOV result.color.secondary, %s;\n", color_init);
if (gl_info->quirks & WINED3D_QUIRK_SET_TEXCOORD_W && !device->frag_pipe->ffp_proj_control)
{
int i;
- for(i = 0; i < min(8, MAX_REG_TEXCRD); i++) {
- if(This->baseShader.reg_maps.texcoord_mask[i] != 0 &&
+ const char *one = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_ONE);
+ for(i = 0; i < min(8, MAX_REG_TEXCRD); i++)
+ {
+ if (This->baseShader.reg_maps.texcoord_mask[i] != 0 &&
This->baseShader.reg_maps.texcoord_mask[i] != WINED3DSP_WRITEMASK_ALL) {
- shader_addline(buffer, "MOV result.texcoord[%u].w, -helper_const.y;\n", i);
+ shader_addline(buffer, "MOV result.texcoord[%u].w, %s\n", i, one);
}
}
}
@@ -4339,7 +4529,7 @@ static inline void find_arb_vs_compile_args(IWineD3DVertexShaderImpl *shader, IW
/* GL locking is done by the caller */
static void shader_arb_select(const struct wined3d_context *context, BOOL usePS, BOOL useVS)
{
- IWineD3DDeviceImpl *This = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
+ IWineD3DDeviceImpl *This = context->swapchain->device;
struct shader_arb_priv *priv = This->shader_priv;
const struct wined3d_gl_info *gl_info = context->gl_info;
int i;
@@ -4443,18 +4633,23 @@ static void shader_arb_select(const struct wined3d_context *context, BOOL usePS,
}
/* GL locking is done by the caller */
-static void shader_arb_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) {
+static void shader_arb_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type, const SIZE *ds_mask_size)
+{
+ const float mask[] = {0.0f, 0.0f, (float)ds_mask_size->cx, (float)ds_mask_size->cy};
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ BOOL masked = ds_mask_size->cx && ds_mask_size->cy;
struct shader_arb_priv *priv = This->shader_priv;
- GLuint *blt_fprogram = &priv->depth_blt_fprogram_id[tex_type];
const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
+ GLuint *blt_fprogram;
if (!priv->depth_blt_vprogram_id) priv->depth_blt_vprogram_id = create_arb_blt_vertex_program(gl_info);
GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->depth_blt_vprogram_id));
glEnable(GL_VERTEX_PROGRAM_ARB);
- if (!*blt_fprogram) *blt_fprogram = create_arb_blt_fragment_program(gl_info, tex_type);
+ blt_fprogram = masked ? &priv->depth_blt_fprogram_id_masked[tex_type] : &priv->depth_blt_fprogram_id_full[tex_type];
+ if (!*blt_fprogram) *blt_fprogram = create_arb_blt_fragment_program(gl_info, tex_type, masked);
GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, *blt_fprogram));
+ if (masked) GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, 0, mask));
glEnable(GL_FRAGMENT_PROGRAM_ARB);
}
@@ -4499,7 +4694,7 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) {
if (shader_data->num_gl_shaders)
{
- struct wined3d_context *context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ struct wined3d_context *context = context_acquire(device, NULL);
ENTER_GL();
for (i = 0; i < shader_data->num_gl_shaders; ++i)
@@ -4525,7 +4720,7 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) {
if (shader_data->num_gl_shaders)
{
- struct wined3d_context *context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ struct wined3d_context *context = context_acquire(device, NULL);
ENTER_GL();
for (i = 0; i < shader_data->num_gl_shaders; ++i)
@@ -4594,9 +4789,15 @@ static void shader_arb_free(IWineD3DDevice *iface) {
if(priv->depth_blt_vprogram_id) {
GL_EXTCALL(glDeleteProgramsARB(1, &priv->depth_blt_vprogram_id));
}
- for (i = 0; i < tex_type_count; ++i) {
- if (priv->depth_blt_fprogram_id[i]) {
- GL_EXTCALL(glDeleteProgramsARB(1, &priv->depth_blt_fprogram_id[i]));
+ for (i = 0; i < tex_type_count; ++i)
+ {
+ if (priv->depth_blt_fprogram_id_full[i])
+ {
+ GL_EXTCALL(glDeleteProgramsARB(1, &priv->depth_blt_fprogram_id_full[i]));
+ }
+ if (priv->depth_blt_fprogram_id_masked[i])
+ {
+ GL_EXTCALL(glDeleteProgramsARB(1, &priv->depth_blt_fprogram_id_masked[i]));
}
}
LEAVE_GL();
@@ -4611,16 +4812,19 @@ static BOOL shader_arb_dirty_const(IWineD3DDevice *iface) {
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);
-
- /* 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(gl_info, pCaps);
-
if (gl_info->supported[ARB_VERTEX_PROGRAM])
{
+ DWORD vs_consts;
+
+ /* 96 is the minimum allowed value of MAX_PROGRAM_ENV_PARAMETERS_ARB
+ * for vertex programs. If the native limit is less than that it's
+ * not very useful, and e.g. Mesa swrast returns 0, probably to
+ * indicate it's a software implementation. */
+ if (gl_info->limits.arb_vs_native_constants < 96)
+ vs_consts = gl_info->limits.arb_vs_float_constants;
+ else
+ vs_consts = min(gl_info->limits.arb_vs_float_constants, gl_info->limits.arb_vs_native_constants);
+
if (gl_info->supported[NV_VERTEX_PROGRAM3])
{
pCaps->VertexShaderVersion = WINED3DVS_VERSION(3,0);
@@ -4639,9 +4843,23 @@ static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct sh
}
pCaps->MaxVertexShaderConst = vs_consts;
}
+ else
+ {
+ pCaps->VertexShaderVersion = 0;
+ pCaps->MaxVertexShaderConst = 0;
+ }
if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
{
+ DWORD ps_consts;
+
+ /* Similar as above for vertex programs, but the minimum for fragment
+ * programs is 24. */
+ if (gl_info->limits.arb_ps_native_constants < 24)
+ ps_consts = gl_info->limits.arb_ps_float_constants;
+ else
+ ps_consts = min(gl_info->limits.arb_ps_float_constants, gl_info->limits.arb_ps_native_constants);
+
if (gl_info->supported[NV_FRAGMENT_PROGRAM2])
{
pCaps->PixelShaderVersion = WINED3DPS_VERSION(3,0);
@@ -4661,6 +4879,12 @@ static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct sh
pCaps->PixelShader1xMaxValue = 8.0f;
pCaps->MaxPixelShaderConst = ps_consts;
}
+ else
+ {
+ pCaps->PixelShaderVersion = 0;
+ pCaps->PixelShader1xMaxValue = 0.0f;
+ pCaps->MaxPixelShaderConst = 0;
+ }
pCaps->VSClipping = use_nv_clip(gl_info);
}
@@ -4766,7 +4990,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
/* WINED3DSIH_NRM */ shader_hw_nrm,
/* WINED3DSIH_PHASE */ NULL,
/* WINED3DSIH_POW */ shader_hw_log_pow,
- /* WINED3DSIH_RCP */ shader_hw_scalar_op,
+ /* WINED3DSIH_RCP */ shader_hw_rcp,
/* WINED3DSIH_REP */ shader_hw_rep,
/* WINED3DSIH_RET */ shader_hw_ret,
/* WINED3DSIH_RSQ */ shader_hw_scalar_op,
@@ -5279,6 +5503,7 @@ static void arbfp_free(IWineD3DDevice *iface) {
static void arbfp_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
{
+ caps->PrimitiveMiscCaps = WINED3DPMISCCAPS_TSSARGTEMP;
caps->TextureOpCaps = WINED3DTEXOPCAPS_DISABLE |
WINED3DTEXOPCAPS_SELECTARG1 |
WINED3DTEXOPCAPS_SELECTARG2 |
@@ -5309,14 +5534,11 @@ static void arbfp_get_caps(const struct wined3d_gl_info *gl_info, struct fragmen
caps->MaxTextureBlendStages = 8;
caps->MaxSimultaneousTextures = min(gl_info->limits.fragment_samplers, 8);
-
- caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_TSSARGTEMP;
}
-#undef GLINFO_LOCATION
-#define GLINFO_LOCATION stateblock->device->adapter->gl_info
static void state_texfactor_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
IWineD3DDeviceImpl *device = stateblock->device;
float col[4];
@@ -5338,6 +5560,7 @@ static void state_texfactor_arbfp(DWORD state, IWineD3DStateBlockImpl *statebloc
static void state_arb_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
IWineD3DDeviceImpl *device = stateblock->device;
float col[4];
@@ -5366,6 +5589,7 @@ static void state_arb_specularenable(DWORD state, IWineD3DStateBlockImpl *stateb
static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
+ const struct wined3d_gl_info *gl_info = context->gl_info;
IWineD3DDeviceImpl *device = stateblock->device;
float mat[2][2];
@@ -5377,9 +5601,8 @@ static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, s
/* The pixel shader has to know the bump env matrix. Do a constants update if it isn't scheduled
* anyway
*/
- if(!isStateDirty(context, STATE_PIXELSHADERCONSTANT)) {
- device->StateTable[STATE_PIXELSHADERCONSTANT].apply(STATE_PIXELSHADERCONSTANT, stateblock, context);
- }
+ if (!isStateDirty(context, STATE_PIXELSHADERCONSTANT))
+ stateblock_apply_state(STATE_PIXELSHADERCONSTANT, stateblock, context);
}
if(device->shader_backend == &arb_program_shader_backend) {
@@ -5403,6 +5626,7 @@ static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, s
static void tex_bumpenvlum_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
+ const struct wined3d_gl_info *gl_info = context->gl_info;
IWineD3DDeviceImpl *device = stateblock->device;
float param[4];
@@ -5414,9 +5638,8 @@ static void tex_bumpenvlum_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock
/* The pixel shader has to know the luminance offset. Do a constants update if it
* isn't scheduled anyway
*/
- if(!isStateDirty(context, STATE_PIXELSHADERCONSTANT)) {
- device->StateTable[STATE_PIXELSHADERCONSTANT].apply(STATE_PIXELSHADERCONSTANT, stateblock, context);
- }
+ if (!isStateDirty(context, STATE_PIXELSHADERCONSTANT))
+ stateblock_apply_state(STATE_PIXELSHADERCONSTANT, stateblock, context);
}
if(device->shader_backend == &arb_program_shader_backend) {
@@ -5648,9 +5871,9 @@ static void gen_ffp_instr(struct wined3d_shader_buffer *buffer, unsigned int sta
}
}
-/* The stateblock is passed for GLINFO_LOCATION */
static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWineD3DStateBlockImpl *stateblock)
{
+ const struct wined3d_gl_info *gl_info = &stateblock->device->adapter->gl_info;
unsigned int stage;
struct wined3d_shader_buffer buffer;
BOOL tex_read[MAX_TEXTURES] = {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE};
@@ -5925,6 +6148,7 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi
static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
IWineD3DDeviceImpl *device = stateblock->device;
struct shader_arb_priv *priv = device->fragment_priv;
BOOL use_pshader = use_ps(stateblock);
@@ -5961,7 +6185,7 @@ static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock,
return;
}
new_desc->num_textures_used = 0;
- for (i = 0; i < context->gl_info->limits.texture_stages; ++i)
+ for (i = 0; i < gl_info->limits.texture_stages; ++i)
{
if(settings.op[i].cop == WINED3DTOP_DISABLE) break;
new_desc->num_textures_used = i;
@@ -6007,13 +6231,10 @@ static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock,
if(!isStateDirty(context, device->StateTable[STATE_VSHADER].representative)) {
device->shader_backend->shader_select(context, use_pshader, use_vshader);
- if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && (use_vshader || use_pshader)) {
- device->StateTable[STATE_VERTEXSHADERCONSTANT].apply(STATE_VERTEXSHADERCONSTANT, stateblock, context);
- }
- }
- if(use_pshader) {
- device->StateTable[STATE_PIXELSHADERCONSTANT].apply(STATE_PIXELSHADERCONSTANT, stateblock, context);
+ if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && (use_vshader || use_pshader))
+ stateblock_apply_state(STATE_VERTEXSHADERCONSTANT, stateblock, context);
}
+ if (use_pshader) stateblock_apply_state(STATE_PIXELSHADERCONSTANT, stateblock, context);
}
/* We can't link the fog states to the fragment state directly since the vertex pipeline links them
@@ -6060,130 +6281,128 @@ static void textransform(DWORD state, IWineD3DStateBlockImpl *stateblock, struct
}
}
-#undef GLINFO_LOCATION
-
static const struct StateEntryTemplate arbfp_fragmentstate_template[] = {
{STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, WINED3D_GL_EXT_NONE },
{STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texdim }, WINED3D_GL_EXT_NONE },
{STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texdim }, WINED3D_GL_EXT_NONE },
@@ -6194,11 +6413,11 @@ static const struct StateEntryTemplate arbfp_fragmentstate_template[] = {
{STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texdim }, WINED3D_GL_EXT_NONE },
{STATE_PIXELSHADER, { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_arbfp_fog }, WINED3D_GL_EXT_NONE },
- {STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_arbfp_fog }, WINED3D_GL_EXT_NONE },
- {STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_arbfp_fog }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
- {STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
- {STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGDENSITY), { STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(0, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
@@ -6223,13 +6442,12 @@ const struct fragment_pipeline arbfp_fragment_pipeline = {
TRUE /* We can disable projected textures */
};
-#define GLINFO_LOCATION device->adapter->gl_info
-
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;
+ GLuint palette_texture;
};
static HRESULT arbfp_blit_alloc(IWineD3DDevice *iface) {
@@ -6245,6 +6463,7 @@ static HRESULT arbfp_blit_alloc(IWineD3DDevice *iface) {
/* Context activation is done by the caller. */
static void arbfp_blit_free(IWineD3DDevice *iface) {
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface;
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
struct arbfp_blit_priv *priv = device->blit_priv;
ENTER_GL();
@@ -6257,6 +6476,8 @@ static void arbfp_blit_free(IWineD3DDevice *iface) {
GL_EXTCALL(glDeleteProgramsARB(1, &priv->p8_rect_shader));
GL_EXTCALL(glDeleteProgramsARB(1, &priv->p8_2d_shader));
checkGLcall("Delete yuv and p8 programs");
+
+ if(priv->palette_texture) glDeleteTextures(1, &priv->palette_texture);
LEAVE_GL();
HeapFree(GetProcessHeap(), 0, device->blit_priv);
@@ -6499,6 +6720,7 @@ static BOOL gen_yv12_read(struct wined3d_shader_buffer *buffer, GLenum textype,
static GLuint gen_p8_shader(IWineD3DDeviceImpl *device, GLenum textype)
{
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
GLenum shader;
struct wined3d_shader_buffer buffer;
struct arbfp_blit_priv *priv = device->blit_priv;
@@ -6563,9 +6785,43 @@ static GLuint gen_p8_shader(IWineD3DDeviceImpl *device, GLenum textype)
return shader;
}
+/* Context activation is done by the caller. */
+static void upload_palette(IWineD3DSurfaceImpl *surface)
+{
+ BYTE table[256][4];
+ IWineD3DDeviceImpl *device = surface->resource.device;
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ struct arbfp_blit_priv *priv = device->blit_priv;
+ BOOL colorkey = (surface->CKeyFlags & WINEDDSD_CKSRCBLT) ? TRUE : FALSE;
+
+ d3dfmt_p8_init_palette(surface, table, colorkey);
+
+ ENTER_GL();
+ if (!priv->palette_texture)
+ glGenTextures(1, &priv->palette_texture);
+
+ GL_EXTCALL(glActiveTextureARB(GL_TEXTURE1));
+ glBindTexture(GL_TEXTURE_1D, priv->palette_texture);
+
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ /* Make sure we have discrete color levels. */
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ /* Upload the palette */
+ /* TODO: avoid unneeed uploads in the future by adding some SFLAG_PALETTE_DIRTY mechanism */
+ glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, table);
+
+ /* Switch back to unit 0 in which the 2D texture will be stored. */
+ GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0));
+ LEAVE_GL();
+}
+
/* Context activation is done by the caller. */
static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum complex_fixup yuv_fixup, GLenum textype)
{
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
GLenum shader;
struct wined3d_shader_buffer buffer;
char luminance_component;
@@ -6720,19 +6976,20 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum complex_fixup yuv_
}
/* Context activation is done by the caller. */
-static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatDesc *format_desc,
- GLenum textype, UINT width, UINT height)
+static HRESULT arbfp_blit_set(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface)
{
GLenum shader;
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface;
- float size[4] = {width, height, 1, 1};
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ float size[4] = {surface->pow2Width, surface->pow2Height, 1, 1};
struct arbfp_blit_priv *priv = device->blit_priv;
enum complex_fixup fixup;
+ GLenum textype = surface->texture_target;
- if (!is_complex_fixup(format_desc->color_fixup))
+ if (!is_complex_fixup(surface->resource.format_desc->color_fixup))
{
TRACE("Fixup:\n");
- dump_color_fixup_desc(format_desc->color_fixup);
+ dump_color_fixup_desc(surface->resource.format_desc->color_fixup);
/* Don't bother setting up a shader for unconverted formats */
ENTER_GL();
glEnable(textype);
@@ -6741,7 +6998,7 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD
return WINED3D_OK;
}
- fixup = get_complex_fixup(format_desc->color_fixup);
+ fixup = get_complex_fixup(surface->resource.format_desc->color_fixup);
switch(fixup)
{
@@ -6760,6 +7017,8 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD
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);
+
+ upload_palette(surface);
break;
default:
@@ -6808,31 +7067,47 @@ static void arbfp_blit_unset(IWineD3DDevice *iface) {
LEAVE_GL();
}
-static BOOL arbfp_blit_color_fixup_supported(struct color_fixup_desc fixup)
+static BOOL arbfp_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op,
+ const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool,
+ const struct wined3d_format_desc *src_format_desc,
+ const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool,
+ const struct wined3d_format_desc *dst_format_desc)
{
- enum complex_fixup complex_fixup;
+ enum complex_fixup src_fixup;
+ if (blit_op != BLIT_OP_BLIT)
+ {
+ TRACE("Unsupported blit_op=%d\n", blit_op);
+ return FALSE;
+ }
+
+ src_fixup = get_complex_fixup(src_format_desc->color_fixup);
if (TRACE_ON(d3d_shader) && TRACE_ON(d3d))
{
TRACE("Checking support for fixup:\n");
- dump_color_fixup_desc(fixup);
+ dump_color_fixup_desc(src_format_desc->color_fixup);
}
- if (is_identity_fixup(fixup))
+ if (!is_identity_fixup(dst_format_desc->color_fixup))
+ {
+ TRACE("Destination fixups are not supported\n");
+ return FALSE;
+ }
+
+ if (is_identity_fixup(src_format_desc->color_fixup))
{
TRACE("[OK]\n");
return TRUE;
}
- /* We only support YUV conversions. */
- if (!is_complex_fixup(fixup))
+ /* We only support YUV conversions. */
+ if (!is_complex_fixup(src_format_desc->color_fixup))
{
TRACE("[FAILED]\n");
return FALSE;
}
- complex_fixup = get_complex_fixup(fixup);
- switch(complex_fixup)
+ switch(src_fixup)
{
case COMPLEX_FIXUP_YUY2:
case COMPLEX_FIXUP_UYVY:
@@ -6842,18 +7117,70 @@ static BOOL arbfp_blit_color_fixup_supported(struct color_fixup_desc fixup)
return TRUE;
default:
- FIXME("Unsupported YUV fixup %#x\n", complex_fixup);
+ FIXME("Unsupported YUV fixup %#x\n", src_fixup);
TRACE("[FAILED]\n");
return FALSE;
}
}
+HRESULT arbfp_blit_surface(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *src_surface, const RECT *src_rect,
+ IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect_in, enum blit_operation blit_op,
+ DWORD Filter)
+{
+ IWineD3DSwapChainImpl *dst_swapchain;
+ struct wined3d_context *context;
+ RECT dst_rect = *dst_rect_in;
+
+ /* Now load the surface */
+ surface_internal_preload(src_surface, SRGB_RGB);
+
+ /* Activate the destination context, set it up for blitting */
+ context = context_acquire(device, dst_surface);
+ context_apply_blit_state(context, device);
+
+ /* The coordinates of the ddraw front buffer are always fullscreen ('screen coordinates',
+ * while OpenGL coordinates are window relative.
+ * Also beware of the origin difference(top left vs bottom left).
+ * Also beware that the front buffer's surface size is screen width x screen height,
+ * whereas the real gl drawable size is the size of the window. */
+ dst_swapchain = (dst_surface->Flags & SFLAG_SWAPCHAIN) ? (IWineD3DSwapChainImpl *)dst_surface->container : NULL;
+ if (dst_swapchain && dst_surface == dst_swapchain->front_buffer)
+ surface_translate_frontbuffer_coords(dst_surface, context->win_handle, &dst_rect);
+
+ arbfp_blit_set((IWineD3DDevice *)device, src_surface);
+
+ ENTER_GL();
+
+ /* Draw a textured quad */
+ draw_textured_quad(src_surface, src_rect, &dst_rect, Filter);
+
+ LEAVE_GL();
+
+ /* Leave the opengl state valid for blitting */
+ arbfp_blit_unset((IWineD3DDevice *)device);
+
+ if (wined3d_settings.strict_draw_ordering || (dst_swapchain
+ && (dst_surface == dst_swapchain->front_buffer
+ || dst_swapchain->num_contexts > 1)))
+ wglFlush(); /* Flush to ensure ordering across contexts. */
+
+ context_release(context);
+
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)dst_surface, SFLAG_INDRAWABLE, TRUE);
+ return WINED3D_OK;
+}
+
+static HRESULT arbfp_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD fill_color)
+{
+ FIXME("Color filling not implemented by arbfp_blit\n");
+ return WINED3DERR_INVALIDCALL;
+}
+
const struct blit_shader arbfp_blit = {
arbfp_blit_alloc,
arbfp_blit_free,
arbfp_blit_set,
arbfp_blit_unset,
- arbfp_blit_color_fixup_supported,
+ arbfp_blit_supported,
+ arbfp_blit_color_fill
};
-
-#undef GLINFO_LOCATION
diff --git a/dll/directx/wine/wined3d/ati_fragment_shader.c b/dll/directx/wine/wined3d/ati_fragment_shader.c
index 0f911e9dc15..993ece0be8d 100644
--- a/dll/directx/wine/wined3d/ati_fragment_shader.c
+++ b/dll/directx/wine/wined3d/ati_fragment_shader.c
@@ -190,7 +190,6 @@ static const char *debug_mask(GLuint mask) {
default: return "Unexpected writemask";
}
}
-#define GLINFO_LOCATION (*gl_info)
static void wrap_op1(const struct wined3d_gl_info *gl_info, GLuint op, GLuint dst, GLuint dstMask, GLuint dstMod,
GLuint arg1, GLuint arg1Rep, GLuint arg1Mod)
@@ -796,11 +795,10 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
checkGLcall("GL_EXTCALL(glEndFragmentShaderATI())");
return ret;
}
-#undef GLINFO_LOCATION
-#define GLINFO_LOCATION stateblock->device->adapter->gl_info
static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
IWineD3DDeviceImpl *This = stateblock->device;
const struct atifs_ffp_desc *desc;
struct ffp_frag_settings settings;
@@ -818,14 +816,14 @@ static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, st
return;
}
new_desc->num_textures_used = 0;
- for (i = 0; i < context->gl_info->limits.texture_stages; ++i)
+ for (i = 0; i < gl_info->limits.texture_stages; ++i)
{
if(settings.op[i].cop == WINED3DTOP_DISABLE) break;
new_desc->num_textures_used = i;
}
memcpy(&new_desc->parent.settings, &settings, sizeof(settings));
- new_desc->shader = gen_ati_shader(settings.op, context->gl_info);
+ new_desc->shader = gen_ati_shader(settings.op, gl_info);
add_ffp_frag_shader(&priv->fragment_shaders, &new_desc->parent);
TRACE("Allocated fixed function replacement shader descriptor %p\n", new_desc);
desc = new_desc;
@@ -849,6 +847,7 @@ static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, st
static void state_texfactor_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
float col[4];
D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], col);
@@ -859,6 +858,7 @@ static void state_texfactor_atifs(DWORD state, IWineD3DStateBlockImpl *statebloc
static void set_bumpmat(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
+ const struct wined3d_gl_info *gl_info = context->gl_info;
float mat[2][2];
mat[0][0] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT00]);
@@ -907,127 +907,124 @@ static void atifs_apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *statebl
if(!isStateDirty(context, device->StateTable[STATE_VSHADER].representative)) {
device->shader_backend->shader_select(context, FALSE, use_vshader);
- if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && use_vshader) {
- device->StateTable[STATE_VERTEXSHADERCONSTANT].apply(STATE_VERTEXSHADERCONSTANT, stateblock, context);
- }
+ if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && use_vshader)
+ stateblock_apply_state(STATE_VERTEXSHADERCONSTANT, stateblock, context);
}
}
-#undef GLINFO_LOCATION
-
static const struct StateEntryTemplate atifs_fragmentstate_template[] = {
{STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor_atifs }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGDENSITY), { STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
- {STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
- {STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
- {STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texdim }, WINED3D_GL_EXT_NONE },
@@ -1063,6 +1060,7 @@ static void atifs_enable(IWineD3DDevice *iface, BOOL enable) {
static void atifs_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
{
+ caps->PrimitiveMiscCaps = WINED3DPMISCCAPS_TSSARGTEMP;
caps->TextureOpCaps = WINED3DTEXOPCAPS_DISABLE |
WINED3DTEXOPCAPS_SELECTARG1 |
WINED3DTEXOPCAPS_SELECTARG2 |
@@ -1105,8 +1103,6 @@ static void atifs_get_caps(const struct wined3d_gl_info *gl_info, struct fragmen
*/
caps->MaxTextureBlendStages = 8;
caps->MaxSimultaneousTextures = 6;
-
- caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_TSSARGTEMP;
}
static HRESULT atifs_alloc(IWineD3DDevice *iface) {
@@ -1128,11 +1124,11 @@ static HRESULT atifs_alloc(IWineD3DDevice *iface) {
return WINED3D_OK;
}
-#define GLINFO_LOCATION This->adapter->gl_info
/* Context activation is done by the caller. */
static void atifs_free_ffpshader(struct wine_rb_entry *entry, void *context)
{
IWineD3DDeviceImpl *This = context;
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
struct atifs_ffp_desc *entry_ati = WINE_RB_ENTRY_VALUE(entry, struct atifs_ffp_desc, parent.entry);
ENTER_GL();
@@ -1152,7 +1148,6 @@ static void atifs_free(IWineD3DDevice *iface) {
HeapFree(GetProcessHeap(), 0, priv);
This->fragment_priv = NULL;
}
-#undef GLINFO_LOCATION
static BOOL atifs_color_fixup_supported(struct color_fixup_desc fixup)
{
diff --git a/dll/directx/wine/wined3d/basetexture.c b/dll/directx/wine/wined3d/basetexture.c
index f3c3fe74e1b..deab4fb2362 100644
--- a/dll/directx/wine/wined3d/basetexture.c
+++ b/dll/directx/wine/wined3d/basetexture.c
@@ -27,9 +27,10 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture);
-HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT levels, WINED3DRESOURCETYPE resource_type,
- IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc,
- WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
+HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT layer_count, UINT level_count,
+ WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, UINT size, DWORD usage,
+ const struct wined3d_format_desc *format_desc, WINED3DPOOL pool, IUnknown *parent,
+ const struct wined3d_parent_ops *parent_ops)
{
HRESULT hr;
@@ -41,7 +42,17 @@ HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT levels, WINED3DR
return hr;
}
- texture->baseTexture.levels = levels;
+ texture->baseTexture.sub_resources = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ level_count * layer_count * sizeof(*texture->baseTexture.sub_resources));
+ if (!texture->baseTexture.sub_resources)
+ {
+ ERR("Failed to allocate sub-resource array.\n");
+ resource_cleanup((IWineD3DResource *)texture);
+ return E_OUTOFMEMORY;
+ }
+
+ texture->baseTexture.layer_count = layer_count;
+ texture->baseTexture.level_count = level_count;
texture->baseTexture.filterType = (usage & WINED3DUSAGE_AUTOGENMIPMAP) ? WINED3DTEXF_LINEAR : WINED3DTEXF_NONE;
texture->baseTexture.LOD = 0;
texture->baseTexture.texture_rgb.dirty = TRUE;
@@ -66,9 +77,27 @@ HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT levels, WINED3DR
void basetexture_cleanup(IWineD3DBaseTexture *iface)
{
basetexture_unload(iface);
+ HeapFree(GetProcessHeap(), 0, ((IWineD3DBaseTextureImpl *)iface)->baseTexture.sub_resources);
resource_cleanup((IWineD3DResource *)iface);
}
+IWineD3DResourceImpl *basetexture_get_sub_resource(IWineD3DBaseTextureImpl *texture, UINT layer, UINT level)
+{
+ if (layer >= texture->baseTexture.layer_count)
+ {
+ WARN("layer %u >= layer_count %u.\n", layer, texture->baseTexture.layer_count);
+ return NULL;
+ }
+
+ if (level >= texture->baseTexture.level_count)
+ {
+ WARN("level %u >= level_count %u.\n", level, texture->baseTexture.level_count);
+ return NULL;
+ }
+
+ return texture->baseTexture.sub_resources[layer * texture->baseTexture.level_count + level];
+}
+
/* A GL context is provided by the caller */
static void gltexture_delete(struct gl_texture *tex)
{
@@ -86,7 +115,7 @@ void basetexture_unload(IWineD3DBaseTexture *iface)
if (This->baseTexture.texture_rgb.name || This->baseTexture.texture_srgb.name)
{
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
}
if(This->baseTexture.texture_rgb.name) {
@@ -115,8 +144,8 @@ DWORD basetexture_set_lod(IWineD3DBaseTexture *iface, DWORD LODNew)
return 0;
}
- if(LODNew >= This->baseTexture.levels)
- LODNew = This->baseTexture.levels - 1;
+ if (LODNew >= This->baseTexture.level_count)
+ LODNew = This->baseTexture.level_count - 1;
if(This->baseTexture.LOD != LODNew) {
This->baseTexture.LOD = LODNew;
@@ -145,8 +174,8 @@ DWORD basetexture_get_lod(IWineD3DBaseTexture *iface)
DWORD basetexture_get_level_count(IWineD3DBaseTexture *iface)
{
IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface;
- TRACE("(%p) : returning %d\n", This, This->baseTexture.levels);
- return This->baseTexture.levels;
+ TRACE("iface %p, returning %u.\n", iface, This->baseTexture.level_count);
+ return This->baseTexture.level_count;
}
HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTexture *iface, WINED3DTEXTUREFILTERTYPE FilterType)
@@ -164,7 +193,7 @@ HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTexture *iface, WINED3DT
* Or should we delay the applying until the texture is used for drawing? For now, apply
* immediately.
*/
- struct wined3d_context *context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ struct wined3d_context *context = context_acquire(device, NULL);
ENTER_GL();
glBindTexture(textureDimensions, This->baseTexture.texture_rgb.name);
@@ -270,9 +299,7 @@ HRESULT basetexture_bind(IWineD3DBaseTexture *iface, BOOL srgb, BOOL *set_surfac
gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] = 0;
gl_tex->states[WINED3DTEXSTA_MAXANISOTROPY] = 1;
gl_tex->states[WINED3DTEXSTA_SRGBTEXTURE] = 0;
- gl_tex->states[WINED3DTEXSTA_ELEMENTINDEX] = 0;
- gl_tex->states[WINED3DTEXSTA_DMAPOFFSET] = 0;
- gl_tex->states[WINED3DTEXSTA_TSSADDRESSW] = WINED3DTADDRESS_WRAP;
+ gl_tex->states[WINED3DTEXSTA_SHADOW] = FALSE;
IWineD3DBaseTexture_SetDirty(iface, TRUE);
isNewTexture = TRUE;
@@ -301,10 +328,11 @@ HRESULT basetexture_bind(IWineD3DBaseTexture *iface, BOOL srgb, BOOL *set_surfac
* relying on the partial GL_ARB_texture_non_power_of_two emulation with texture rectangles
* (ie, do not care for cond_np2 here, just look for GL_TEXTURE_RECTANGLE_ARB)
*/
- if(textureDimensions != GL_TEXTURE_RECTANGLE_ARB) {
- TRACE("Setting GL_TEXTURE_MAX_LEVEL to %d\n", This->baseTexture.levels - 1);
- glTexParameteri(textureDimensions, GL_TEXTURE_MAX_LEVEL, This->baseTexture.levels - 1);
- checkGLcall("glTexParameteri(textureDimensions, GL_TEXTURE_MAX_LEVEL, This->baseTexture.levels)");
+ if (textureDimensions != GL_TEXTURE_RECTANGLE_ARB)
+ {
+ TRACE("Setting GL_TEXTURE_MAX_LEVEL to %u.\n", This->baseTexture.level_count - 1);
+ glTexParameteri(textureDimensions, GL_TEXTURE_MAX_LEVEL, This->baseTexture.level_count - 1);
+ checkGLcall("glTexParameteri(textureDimensions, GL_TEXTURE_MAX_LEVEL, This->baseTexture.level_count)");
}
if(textureDimensions==GL_TEXTURE_CUBE_MAP_ARB) {
/* Cubemaps are always set to clamp, regardless of the sampler state. */
@@ -444,17 +472,18 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface,
glTexParameteri(textureDimensions, GL_TEXTURE_MIN_FILTER, glValue);
checkGLcall("glTexParameter GL_TEXTURE_MIN_FILTER, ...");
- if(!cond_np2) {
- if(gl_tex->states[WINED3DTEXSTA_MIPFILTER] == WINED3DTEXF_NONE) {
+ if (!cond_np2)
+ {
+ if (gl_tex->states[WINED3DTEXSTA_MIPFILTER] == WINED3DTEXF_NONE)
glValue = This->baseTexture.LOD;
- } else if(gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] >= This->baseTexture.levels) {
- glValue = This->baseTexture.levels - 1;
- } else if(gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] < This->baseTexture.LOD) {
+ else if (gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] >= This->baseTexture.level_count)
+ glValue = This->baseTexture.level_count - 1;
+ else if (gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] < This->baseTexture.LOD)
/* baseTexture.LOD is already clamped in the setter */
glValue = This->baseTexture.LOD;
- } else {
+ else
glValue = gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL];
- }
+
/* Note that D3DSAMP_MAXMIPLEVEL specifies the biggest mipmap(default 0), while
* GL_TEXTURE_MAX_LEVEL specifies the smallest mimap used(default 1000).
* So D3DSAMP_MAXMIPLEVEL is the same as GL_TEXTURE_BASE_LEVEL.
@@ -488,4 +517,22 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface,
}
gl_tex->states[WINED3DTEXSTA_MAXANISOTROPY] = aniso;
}
+
+ if (!(This->resource.format_desc->Flags & WINED3DFMT_FLAG_SHADOW)
+ != !gl_tex->states[WINED3DTEXSTA_SHADOW])
+ {
+ if (This->resource.format_desc->Flags & WINED3DFMT_FLAG_SHADOW)
+ {
+ glTexParameteri(textureDimensions, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE);
+ glTexParameteri(textureDimensions, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
+ checkGLcall("glTexParameteri(textureDimensions, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB)");
+ gl_tex->states[WINED3DTEXSTA_SHADOW] = TRUE;
+ }
+ else
+ {
+ glTexParameteri(textureDimensions, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
+ checkGLcall("glTexParameteri(textureDimensions, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE)");
+ gl_tex->states[WINED3DTEXSTA_SHADOW] = FALSE;
+ }
+ }
}
diff --git a/dll/directx/wine/wined3d/buffer.c b/dll/directx/wine/wined3d/buffer.c
index e22d311beb9..daece20c33d 100644
--- a/dll/directx/wine/wined3d/buffer.c
+++ b/dll/directx/wine/wined3d/buffer.c
@@ -29,8 +29,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION This->resource.device->adapter->gl_info
-
#define VB_MAXDECLCHANGES 100 /* After that number of decl changes we stop converting */
#define VB_RESETDECLCHANGE 1000 /* Reset the decl changecount after that number of draws */
#define VB_MAXFULLCONVERSIONS 5 /* Number of full conversions before we stop converting */
@@ -97,11 +95,29 @@ static inline BOOL buffer_is_fully_dirty(struct wined3d_buffer *This)
return FALSE;
}
+/* Context activation is done by the caller */
+static void delete_gl_buffer(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info)
+{
+ if(!This->buffer_object) return;
+
+ ENTER_GL();
+ GL_EXTCALL(glDeleteBuffersARB(1, &This->buffer_object));
+ checkGLcall("glDeleteBuffersARB");
+ LEAVE_GL();
+ This->buffer_object = 0;
+
+ if(This->query)
+ {
+ wined3d_event_query_destroy(This->query);
+ This->query = NULL;
+ }
+ This->flags &= ~WINED3D_BUFFER_APPLESYNC;
+}
+
/* Context activation is done by the caller. */
-static void buffer_create_buffer_object(struct wined3d_buffer *This)
+static void buffer_create_buffer_object(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info)
{
GLenum error, gl_usage;
- const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info;
TRACE("Creating an OpenGL vertex buffer object for IWineD3DVertexBuffer %p Usage(%s)\n",
This, debug_d3dusage(This->resource.usage));
@@ -157,6 +173,10 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This)
GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE));
checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE)");
This->flags |= WINED3D_BUFFER_FLUSH;
+
+ GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE));
+ checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE)");
+ This->flags |= WINED3D_BUFFER_APPLESYNC;
}
/* No setup is needed here for GL_ARB_map_buffer_range */
}
@@ -203,13 +223,7 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This)
fail:
/* Clean up all vbo init, but continue because we can work without a vbo :-) */
ERR("Failed to create a vertex buffer object. Continuing, but performance issues may occur\n");
- if (This->buffer_object)
- {
- ENTER_GL();
- GL_EXTCALL(glDeleteBuffersARB(1, &This->buffer_object));
- LEAVE_GL();
- }
- This->buffer_object = 0;
+ delete_gl_buffer(This, gl_info);
buffer_clear_dirty_areas(This);
}
@@ -258,12 +272,13 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This,
attrib_size = attrib->format_desc->component_count * attrib->format_desc->component_size;
for (i = 0; i < attrib_size; ++i)
{
- if (This->conversion_map[data + i] != conversion_type)
+ DWORD_PTR idx = (data + i) % This->stride;
+ if (This->conversion_map[idx] != conversion_type)
{
- TRACE("Byte %ld in vertex changed\n", i + data);
- TRACE("It was type %d, is %d now\n", This->conversion_map[data + i], conversion_type);
+ TRACE("Byte %ld in vertex changed\n", idx);
+ TRACE("It was type %d, is %d now\n", This->conversion_map[idx], conversion_type);
ret = TRUE;
- This->conversion_map[data + i] = conversion_type;
+ This->conversion_map[idx] = conversion_type;
}
}
@@ -534,7 +549,7 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This)
}
/* Context activation is done by the caller. */
-static void buffer_check_buffer_object_size(struct wined3d_buffer *This)
+static void buffer_check_buffer_object_size(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info)
{
UINT size = This->conversion_stride ?
This->conversion_stride * (This->resource.size / This->stride) : This->resource.size;
@@ -550,7 +565,7 @@ static void buffer_check_buffer_object_size(struct wined3d_buffer *This)
/* Rescue the data before resizing the buffer object if we do not have our backup copy */
if(!(This->flags & WINED3D_BUFFER_DOUBLEBUFFER))
{
- buffer_get_sysmem(This);
+ buffer_get_sysmem(This, gl_info);
}
ENTER_GL();
@@ -595,7 +610,7 @@ static inline void fixup_transformed_pos(float *p)
}
/* Context activation is done by the caller. */
-const BYTE *buffer_get_memory(IWineD3DBuffer *iface, UINT offset, GLuint *buffer_object)
+const BYTE *buffer_get_memory(IWineD3DBuffer *iface, const struct wined3d_gl_info *gl_info, GLuint *buffer_object)
{
struct wined3d_buffer *This = (struct wined3d_buffer *)iface;
@@ -604,19 +619,19 @@ const BYTE *buffer_get_memory(IWineD3DBuffer *iface, UINT offset, GLuint *buffer
{
if (This->flags & WINED3D_BUFFER_CREATEBO)
{
- buffer_create_buffer_object(This);
+ buffer_create_buffer_object(This, gl_info);
This->flags &= ~WINED3D_BUFFER_CREATEBO;
if (This->buffer_object)
{
*buffer_object = This->buffer_object;
- return (const BYTE *)offset;
+ return NULL;
}
}
- return This->resource.allocatedMemory + offset;
+ return This->resource.allocatedMemory;
}
else
{
- return (const BYTE *)offset;
+ return NULL;
}
}
@@ -655,7 +670,7 @@ static ULONG STDMETHODCALLTYPE buffer_AddRef(IWineD3DBuffer *iface)
}
/* Context activation is done by the caller. */
-BYTE *buffer_get_sysmem(struct wined3d_buffer *This)
+BYTE *buffer_get_sysmem(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info)
{
/* AllocatedMemory exists if the buffer is double buffered or has no buffer object at all */
if(This->resource.allocatedMemory) return This->resource.allocatedMemory;
@@ -682,20 +697,16 @@ static void STDMETHODCALLTYPE buffer_UnLoad(IWineD3DBuffer *iface)
IWineD3DDeviceImpl *device = This->resource.device;
struct wined3d_context *context;
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
/* Download the buffer, but don't permanently enable double buffering */
if(!(This->flags & WINED3D_BUFFER_DOUBLEBUFFER))
{
- buffer_get_sysmem(This);
+ buffer_get_sysmem(This, context->gl_info);
This->flags &= ~WINED3D_BUFFER_DOUBLEBUFFER;
}
- ENTER_GL();
- GL_EXTCALL(glDeleteBuffersARB(1, &This->buffer_object));
- checkGLcall("glDeleteBuffersARB");
- LEAVE_GL();
- This->buffer_object = 0;
+ delete_gl_buffer(This, context->gl_info);
This->flags |= WINED3D_BUFFER_CREATEBO; /* Recreate the buffer object next load */
buffer_clear_dirty_areas(This);
@@ -766,26 +777,171 @@ static DWORD STDMETHODCALLTYPE buffer_GetPriority(IWineD3DBuffer *iface)
return resource_get_priority((IWineD3DResource *)iface);
}
+/* The caller provides a context and binds the buffer */
+static void buffer_sync_apple(struct wined3d_buffer *This, DWORD flags, const struct wined3d_gl_info *gl_info)
+{
+ enum wined3d_event_query_result ret;
+
+ /* No fencing needs to be done if the app promises not to overwrite
+ * existing data */
+ if(flags & WINED3DLOCK_NOOVERWRITE) return;
+ if(flags & WINED3DLOCK_DISCARD)
+ {
+ ENTER_GL();
+ GL_EXTCALL(glBufferDataARB(This->buffer_type_hint, This->resource.size, NULL, This->buffer_object_usage));
+ checkGLcall("glBufferDataARB\n");
+ LEAVE_GL();
+ return;
+ }
+
+ if(!This->query)
+ {
+ TRACE("Creating event query for buffer %p\n", This);
+
+ if (!wined3d_event_query_supported(gl_info))
+ {
+ FIXME("Event queries not supported, dropping async buffer locks.\n");
+ goto drop_query;
+ }
+
+ This->query = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This->query));
+ if (!This->query)
+ {
+ ERR("Failed to allocate event query memory, dropping async buffer locks.\n");
+ goto drop_query;
+ }
+
+ /* Since we don't know about old draws a glFinish is needed once */
+ wglFinish();
+ return;
+ }
+ TRACE("Synchronizing buffer %p\n", This);
+ ret = wined3d_event_query_finish(This->query, This->resource.device);
+ switch(ret)
+ {
+ case WINED3D_EVENT_QUERY_NOT_STARTED:
+ case WINED3D_EVENT_QUERY_OK:
+ /* All done */
+ return;
+
+ case WINED3D_EVENT_QUERY_WRONG_THREAD:
+ WARN("Cannot synchronize buffer lock due to a thread conflict\n");
+ goto drop_query;
+
+ default:
+ ERR("wined3d_event_query_finish returned %u, dropping async buffer locks\n", ret);
+ goto drop_query;
+ }
+
+drop_query:
+ if(This->query)
+ {
+ wined3d_event_query_destroy(This->query);
+ This->query = NULL;
+ }
+
+ wglFinish();
+ ENTER_GL();
+ GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE));
+ checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE)");
+ LEAVE_GL();
+ This->flags &= ~WINED3D_BUFFER_APPLESYNC;
+}
+
+/* The caller provides a GL context */
+static void buffer_direct_upload(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info, DWORD flags)
+{
+ BYTE *map;
+ UINT start = 0, len = 0;
+
+ ENTER_GL();
+ GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
+ checkGLcall("glBindBufferARB");
+ if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+ {
+ GLbitfield mapflags;
+ mapflags = GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT;
+ if (flags & WINED3D_BUFFER_DISCARD)
+ {
+ mapflags |= GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT;
+ }
+ else if (flags & WINED3D_BUFFER_NOSYNC)
+ {
+ mapflags |= GL_MAP_UNSYNCHRONIZED_BIT;
+ }
+ map = GL_EXTCALL(glMapBufferRange(This->buffer_type_hint, 0,
+ This->resource.size, mapflags));
+ checkGLcall("glMapBufferRange");
+ }
+ else
+ {
+ if (This->flags & WINED3D_BUFFER_APPLESYNC)
+ {
+ DWORD syncflags = 0;
+ if (flags & WINED3D_BUFFER_DISCARD) syncflags |= WINED3DLOCK_DISCARD;
+ if (flags & WINED3D_BUFFER_NOSYNC) syncflags |= WINED3DLOCK_NOOVERWRITE;
+ LEAVE_GL();
+ buffer_sync_apple(This, syncflags, gl_info);
+ ENTER_GL();
+ }
+ map = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_WRITE_ONLY_ARB));
+ checkGLcall("glMapBufferARB");
+ }
+ if (!map)
+ {
+ LEAVE_GL();
+ ERR("Failed to map opengl buffer\n");
+ return;
+ }
+
+ while(This->modified_areas)
+ {
+ This->modified_areas--;
+ start = This->maps[This->modified_areas].offset;
+ len = This->maps[This->modified_areas].size;
+
+ memcpy(map + start, This->resource.allocatedMemory + start, len);
+
+ if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+ {
+ GL_EXTCALL(glFlushMappedBufferRange(This->buffer_type_hint, start, len));
+ checkGLcall("glFlushMappedBufferRange");
+ }
+ else if (This->flags & WINED3D_BUFFER_FLUSH)
+ {
+ GL_EXTCALL(glFlushMappedBufferRangeAPPLE(This->buffer_type_hint, start, len));
+ checkGLcall("glFlushMappedBufferRangeAPPLE");
+ }
+ }
+ GL_EXTCALL(glUnmapBufferARB(This->buffer_type_hint));
+ checkGLcall("glUnmapBufferARB");
+ LEAVE_GL();
+}
+
static void STDMETHODCALLTYPE buffer_PreLoad(IWineD3DBuffer *iface)
{
struct wined3d_buffer *This = (struct wined3d_buffer *)iface;
IWineD3DDeviceImpl *device = This->resource.device;
UINT start = 0, end = 0, len = 0, vertices;
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
BOOL decl_changed = FALSE;
unsigned int i, j;
BYTE *data;
+ DWORD flags = This->flags & (WINED3D_BUFFER_NOSYNC | WINED3D_BUFFER_DISCARD);
TRACE("iface %p\n", iface);
+ This->flags &= ~(WINED3D_BUFFER_NOSYNC | WINED3D_BUFFER_DISCARD);
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
+ gl_info = context->gl_info;
if (!This->buffer_object)
{
/* TODO: Make converting independent from VBOs */
if (This->flags & WINED3D_BUFFER_CREATEBO)
{
- buffer_create_buffer_object(This);
+ buffer_create_buffer_object(This, gl_info);
This->flags &= ~WINED3D_BUFFER_CREATEBO;
}
else
@@ -836,7 +992,20 @@ static void STDMETHODCALLTYPE buffer_PreLoad(IWineD3DBuffer *iface)
IWineD3DDeviceImpl_MarkStateDirty(device, STATE_STREAMSRC);
goto end;
}
- buffer_check_buffer_object_size(This);
+ buffer_check_buffer_object_size(This, gl_info);
+
+ /* The declaration changed, reload the whole buffer */
+ WARN("Reloading buffer because of decl change\n");
+ buffer_clear_dirty_areas(This);
+ if(!buffer_add_dirty_area(This, 0, 0))
+ {
+ ERR("buffer_add_dirty_area failed, this is not expected\n");
+ return;
+ }
+ /* Avoid unfenced updates, we might overwrite more areas of the buffer than the application
+ * cleared for unsynchronized updates
+ */
+ flags = 0;
}
else
{
@@ -864,18 +1033,6 @@ static void STDMETHODCALLTYPE buffer_PreLoad(IWineD3DBuffer *iface)
}
}
- if (decl_changed)
- {
- /* The declaration changed, reload the whole buffer */
- WARN("Reloading buffer because of decl change\n");
- buffer_clear_dirty_areas(This);
- if(!buffer_add_dirty_area(This, 0, 0))
- {
- ERR("buffer_add_dirty_area failed, this is not expected\n");
- return;
- }
- }
-
if(This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
{
IWineD3DDeviceImpl_MarkStateDirty(This->resource.device, STATE_INDEXBUFFER);
@@ -896,18 +1053,7 @@ static void STDMETHODCALLTYPE buffer_PreLoad(IWineD3DBuffer *iface)
return;
}
- ENTER_GL();
- GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
- checkGLcall("glBindBufferARB");
- while(This->modified_areas)
- {
- This->modified_areas--;
- start = This->maps[This->modified_areas].offset;
- len = This->maps[This->modified_areas].size;
- GL_EXTCALL(glBufferSubDataARB(This->buffer_type_hint, start, len, This->resource.allocatedMemory + start));
- checkGLcall("glBufferSubDataARB");
- }
- LEAVE_GL();
+ buffer_direct_upload(This, context->gl_info, flags);
context_release(context);
return;
@@ -915,7 +1061,7 @@ static void STDMETHODCALLTYPE buffer_PreLoad(IWineD3DBuffer *iface)
if(!(This->flags & WINED3D_BUFFER_DOUBLEBUFFER))
{
- buffer_get_sysmem(This);
+ buffer_get_sysmem(This, gl_info);
}
/* Now for each vertex in the buffer that needs conversion */
@@ -1033,7 +1179,7 @@ static WINED3DRESOURCETYPE STDMETHODCALLTYPE buffer_GetType(IWineD3DBuffer *ifac
/* IWineD3DBuffer methods */
-static DWORD buffer_sanitize_flags(DWORD flags)
+static DWORD buffer_sanitize_flags(struct wined3d_buffer *buffer, DWORD flags)
{
/* Not all flags make sense together, but Windows never returns an error. Catch the
* cases that could cause issues */
@@ -1055,6 +1201,11 @@ static DWORD buffer_sanitize_flags(DWORD flags)
WARN("WINED3DLOCK_DISCARD and WINED3DLOCK_NOOVERWRITE used together, ignoring\n");
return 0;
}
+ else if (flags & (WINED3DLOCK_DISCARD | WINED3DLOCK_NOOVERWRITE) && !(buffer->resource.usage & WINED3DUSAGE_DYNAMIC))
+ {
+ WARN("DISCARD or NOOVERWRITE lock on non-dynamic buffer, ignoring\n");
+ return 0;
+ }
return flags;
}
@@ -1082,10 +1233,11 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset,
{
struct wined3d_buffer *This = (struct wined3d_buffer *)iface;
LONG count;
+ BOOL dirty = buffer_is_dirty(This);
TRACE("iface %p, offset %u, size %u, data %p, flags %#x\n", iface, offset, size, data, flags);
- flags = buffer_sanitize_flags(flags);
+ flags = buffer_sanitize_flags(This, flags);
if (!(flags & WINED3DLOCK_READONLY))
{
if (!buffer_add_dirty_area(This, offset, size)) return E_OUTOFMEMORY;
@@ -1093,36 +1245,81 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset,
count = InterlockedIncrement(&This->lock_count);
- if(!(This->flags & WINED3D_BUFFER_DOUBLEBUFFER) && This->buffer_object)
+ if (This->buffer_object)
{
- if(count == 1)
+ if(!(This->flags & WINED3D_BUFFER_DOUBLEBUFFER))
{
- 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)
+ if(count == 1)
{
- IWineD3DDeviceImpl_MarkStateDirty(This->resource.device, STATE_INDEXBUFFER);
+ 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)
+ {
+ IWineD3DDeviceImpl_MarkStateDirty(This->resource.device, STATE_INDEXBUFFER);
+ }
+
+ context = context_acquire(device, NULL);
+ gl_info = context->gl_info;
+ ENTER_GL();
+ GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
+
+ 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));
+ checkGLcall("glMapBufferRange");
+ }
+ else
+ {
+ if(This->flags & WINED3D_BUFFER_APPLESYNC)
+ {
+ LEAVE_GL();
+ buffer_sync_apple(This, flags, gl_info);
+ ENTER_GL();
+ }
+ This->resource.allocatedMemory = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_READ_WRITE_ARB));
+ checkGLcall("glMapBufferARB");
+ }
+ LEAVE_GL();
+
+ if (((DWORD_PTR) This->resource.allocatedMemory) & (RESOURCE_ALIGNMENT - 1))
+ {
+ WARN("Pointer %p is not %u byte aligned, falling back to double buffered operation\n",
+ This->resource.allocatedMemory, RESOURCE_ALIGNMENT);
+
+ ENTER_GL();
+ GL_EXTCALL(glUnmapBufferARB(This->buffer_type_hint));
+ checkGLcall("glUnmapBufferARB");
+ LEAVE_GL();
+ This->resource.allocatedMemory = NULL;
+
+ buffer_get_sysmem(This, gl_info);
+ TRACE("New pointer is %p\n", This->resource.allocatedMemory);
+ }
+ context_release(context);
+ }
+ }
+ else
+ {
+ if (dirty)
+ {
+ if (This->flags & WINED3D_BUFFER_NOSYNC && !(flags & WINED3DLOCK_NOOVERWRITE))
+ {
+ This->flags &= ~WINED3D_BUFFER_NOSYNC;
+ }
+ }
+ else if(flags & WINED3DLOCK_NOOVERWRITE)
+ {
+ This->flags |= WINED3D_BUFFER_NOSYNC;
}
- 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 (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+ if (flags & WINED3DLOCK_DISCARD)
{
- GLbitfield mapflags = buffer_gl_map_flags(flags);
- This->resource.allocatedMemory = GL_EXTCALL(glMapBufferRange(This->buffer_type_hint, 0,
- This->resource.size, mapflags));
+ This->flags |= WINED3D_BUFFER_DISCARD;
}
- else
- {
- This->resource.allocatedMemory = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_READ_WRITE_ARB));
- }
- LEAVE_GL();
- context_release(context);
}
}
@@ -1169,7 +1366,7 @@ static HRESULT STDMETHODCALLTYPE buffer_Unmap(IWineD3DBuffer *iface)
IWineD3DDeviceImpl_MarkStateDirty(This->resource.device, STATE_INDEXBUFFER);
}
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
gl_info = context->gl_info;
ENTER_GL();
GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
@@ -1251,7 +1448,7 @@ HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device,
UINT size, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, GLenum bind_hint,
const char *data, IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
{
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, &device->adapter->gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, &device->adapter->gl_info);
HRESULT hr;
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
BOOL dynamic_buffer_ok;
@@ -1276,7 +1473,8 @@ 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);
- dynamic_buffer_ok = gl_info->supported[APPLE_FLUSH_BUFFER_RANGE] || gl_info->supported[ARB_MAP_BUFFER_RANGE];
+ /* GL_ARB_map_buffer_range is disabled for now due to numerous bugs and no gains */
+ dynamic_buffer_ok = gl_info->supported[APPLE_FLUSH_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 08789855812..5304af2f408 100644
--- a/dll/directx/wine/wined3d/context.c
+++ b/dll/directx/wine/wined3d/context.c
@@ -28,8 +28,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION (*gl_info)
-
static DWORD wined3d_context_tls_idx;
/* FBO helper functions */
@@ -84,19 +82,19 @@ void context_bind_fbo(struct wined3d_context *context, GLenum target, GLuint *fb
}
/* GL locking is done by the caller */
-static void context_clean_fbo_attachments(const struct wined3d_gl_info *gl_info)
+static void context_clean_fbo_attachments(const struct wined3d_gl_info *gl_info, GLenum target)
{
unsigned int i;
for (i = 0; i < gl_info->limits.buffers; ++i)
{
- gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, 0, 0);
+ gl_info->fbo_ops.glFramebufferTexture2D(target, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, 0, 0);
checkGLcall("glFramebufferTexture2D()");
}
- gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
+ gl_info->fbo_ops.glFramebufferTexture2D(target, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
checkGLcall("glFramebufferTexture2D()");
- gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
+ gl_info->fbo_ops.glFramebufferTexture2D(target, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
checkGLcall("glFramebufferTexture2D()");
}
@@ -106,7 +104,7 @@ static void context_destroy_fbo(struct wined3d_context *context, GLuint *fbo)
const struct wined3d_gl_info *gl_info = context->gl_info;
context_bind_fbo(context, GL_FRAMEBUFFER, fbo);
- context_clean_fbo_attachments(gl_info);
+ context_clean_fbo_attachments(gl_info, GL_FRAMEBUFFER);
context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
gl_info->fbo_ops.glDeleteFramebuffers(1, fbo);
@@ -114,17 +112,18 @@ 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)
+static void context_apply_attachment_filter_states(IWineD3DSurfaceImpl *surface)
{
- const IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
- IWineD3DDeviceImpl *device = surface_impl->resource.device;
IWineD3DBaseTextureImpl *texture_impl;
- BOOL update_minfilter = FALSE;
- BOOL update_magfilter = FALSE;
/* Update base texture states array */
- if (SUCCEEDED(IWineD3DSurface_GetContainer(surface, &IID_IWineD3DBaseTexture, (void **)&texture_impl)))
+ if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface,
+ &IID_IWineD3DBaseTexture, (void **)&texture_impl)))
{
+ IWineD3DDeviceImpl *device = surface->resource.device;
+ BOOL update_minfilter = FALSE;
+ BOOL update_magfilter = FALSE;
+
if (texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] != WINED3DTEXF_POINT
|| texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] != WINED3DTEXF_NONE)
{
@@ -146,82 +145,85 @@ static void context_apply_attachment_filter_states(IWineD3DSurface *surface)
}
IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture_impl);
- }
- if (update_minfilter || update_magfilter)
- {
- GLenum target, bind_target;
- GLint old_binding;
-
- target = surface_impl->texture_target;
- if (target == GL_TEXTURE_2D)
+ if (update_minfilter || update_magfilter)
{
- bind_target = GL_TEXTURE_2D;
- glGetIntegerv(GL_TEXTURE_BINDING_2D, &old_binding);
- } else if (target == GL_TEXTURE_RECTANGLE_ARB) {
- bind_target = GL_TEXTURE_RECTANGLE_ARB;
- glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding);
- } else {
- bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARB, &old_binding);
+ GLenum target, bind_target;
+ GLint old_binding;
+
+ target = surface->texture_target;
+ if (target == GL_TEXTURE_2D)
+ {
+ bind_target = GL_TEXTURE_2D;
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &old_binding);
+ }
+ else if (target == GL_TEXTURE_RECTANGLE_ARB)
+ {
+ bind_target = GL_TEXTURE_RECTANGLE_ARB;
+ glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding);
+ }
+ else
+ {
+ bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+ glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARB, &old_binding);
+ }
+
+ glBindTexture(bind_target, surface->texture_name);
+ if (update_minfilter) glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ if (update_magfilter) glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glBindTexture(bind_target, old_binding);
}
- glBindTexture(bind_target, surface_impl->texture_name);
- if (update_minfilter) glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- if (update_magfilter) glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glBindTexture(bind_target, old_binding);
+ checkGLcall("apply_attachment_filter_states()");
}
-
- checkGLcall("apply_attachment_filter_states()");
}
/* GL locking is done by the caller */
void context_attach_depth_stencil_fbo(struct wined3d_context *context,
- GLenum fbo_target, IWineD3DSurface *depth_stencil, BOOL use_render_buffer)
+ GLenum fbo_target, IWineD3DSurfaceImpl *depth_stencil, BOOL use_render_buffer)
{
- IWineD3DSurfaceImpl *depth_stencil_impl = (IWineD3DSurfaceImpl *)depth_stencil;
const struct wined3d_gl_info *gl_info = context->gl_info;
TRACE("Attach depth stencil %p\n", depth_stencil);
if (depth_stencil)
{
- DWORD format_flags = depth_stencil_impl->resource.format_desc->Flags;
+ DWORD format_flags = depth_stencil->resource.format_desc->Flags;
- if (use_render_buffer && depth_stencil_impl->current_renderbuffer)
+ if (use_render_buffer && depth_stencil->current_renderbuffer)
{
if (format_flags & WINED3DFMT_FLAG_DEPTH)
{
gl_info->fbo_ops.glFramebufferRenderbuffer(fbo_target, GL_DEPTH_ATTACHMENT,
- GL_RENDERBUFFER, depth_stencil_impl->current_renderbuffer->id);
+ GL_RENDERBUFFER, depth_stencil->current_renderbuffer->id);
checkGLcall("glFramebufferRenderbuffer()");
}
if (format_flags & WINED3DFMT_FLAG_STENCIL)
{
gl_info->fbo_ops.glFramebufferRenderbuffer(fbo_target, GL_STENCIL_ATTACHMENT,
- GL_RENDERBUFFER, depth_stencil_impl->current_renderbuffer->id);
+ GL_RENDERBUFFER, depth_stencil->current_renderbuffer->id);
checkGLcall("glFramebufferRenderbuffer()");
}
}
else
{
- surface_prepare_texture(depth_stencil_impl, FALSE);
+ surface_prepare_texture(depth_stencil, gl_info, FALSE);
context_apply_attachment_filter_states(depth_stencil);
if (format_flags & WINED3DFMT_FLAG_DEPTH)
{
gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_DEPTH_ATTACHMENT,
- depth_stencil_impl->texture_target, depth_stencil_impl->texture_name,
- depth_stencil_impl->texture_level);
+ depth_stencil->texture_target, depth_stencil->texture_name,
+ depth_stencil->texture_level);
checkGLcall("glFramebufferTexture2D()");
}
if (format_flags & WINED3DFMT_FLAG_STENCIL)
{
gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_STENCIL_ATTACHMENT,
- depth_stencil_impl->texture_target, depth_stencil_impl->texture_name,
- depth_stencil_impl->texture_level);
+ depth_stencil->texture_target, depth_stencil->texture_name,
+ depth_stencil->texture_level);
checkGLcall("glFramebufferTexture2D()");
}
}
@@ -249,21 +251,20 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context,
}
/* GL locking is done by the caller */
-void context_attach_surface_fbo(const struct wined3d_context *context,
- GLenum fbo_target, DWORD idx, IWineD3DSurface *surface)
+static void context_attach_surface_fbo(const struct wined3d_context *context,
+ GLenum fbo_target, DWORD idx, 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)
{
- surface_prepare_texture(surface_impl, FALSE);
+ surface_prepare_texture(surface, gl_info, 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);
+ gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx, surface->texture_target,
+ surface->texture_name, surface->texture_level);
checkGLcall("glFramebufferTexture2D()");
}
else
@@ -274,12 +275,12 @@ void context_attach_surface_fbo(const struct wined3d_context *context,
}
/* GL locking is done by the caller */
-static void context_check_fbo_status(struct wined3d_context *context)
+static void context_check_fbo_status(struct wined3d_context *context, GLenum target)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
GLenum status;
- status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ status = gl_info->fbo_ops.glCheckFramebufferStatus(target);
if (status == GL_FRAMEBUFFER_COMPLETE)
{
TRACE("FBO complete\n");
@@ -297,7 +298,7 @@ static void context_check_fbo_status(struct wined3d_context *context)
/* Dump the FBO attachments */
for (i = 0; i < gl_info->limits.buffers; ++i)
{
- attachment = (IWineD3DSurfaceImpl *)context->current_fbo->render_targets[i];
+ attachment = context->current_fbo->render_targets[i];
if (attachment)
{
FIXME("\tColor attachment %d: (%p) %s %ux%u\n",
@@ -305,7 +306,7 @@ static void context_check_fbo_status(struct wined3d_context *context)
attachment->pow2Width, attachment->pow2Height);
}
}
- attachment = (IWineD3DSurfaceImpl *)context->current_fbo->depth_stencil;
+ attachment = context->current_fbo->depth_stencil;
if (attachment)
{
FIXME("\tDepth attachment: (%p) %s %ux%u\n",
@@ -315,16 +316,16 @@ static void context_check_fbo_status(struct wined3d_context *context)
}
}
-static struct fbo_entry *context_create_fbo_entry(struct wined3d_context *context)
+static struct fbo_entry *context_create_fbo_entry(struct wined3d_context *context,
+ IWineD3DSurfaceImpl **render_targets, IWineD3DSurfaceImpl *depth_stencil)
{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
const struct wined3d_gl_info *gl_info = context->gl_info;
struct fbo_entry *entry;
entry = HeapAlloc(GetProcessHeap(), 0, sizeof(*entry));
entry->render_targets = HeapAlloc(GetProcessHeap(), 0, gl_info->limits.buffers * sizeof(*entry->render_targets));
- memcpy(entry->render_targets, device->render_targets, gl_info->limits.buffers * sizeof(*entry->render_targets));
- entry->depth_stencil = device->stencilBufferTarget;
+ memcpy(entry->render_targets, render_targets, gl_info->limits.buffers * sizeof(*entry->render_targets));
+ entry->depth_stencil = depth_stencil;
entry->attached = FALSE;
entry->id = 0;
@@ -332,16 +333,17 @@ static struct fbo_entry *context_create_fbo_entry(struct wined3d_context *contex
}
/* GL locking is done by the caller */
-static void context_reuse_fbo_entry(struct wined3d_context *context, struct fbo_entry *entry)
+static void context_reuse_fbo_entry(struct wined3d_context *context, GLenum target,
+ IWineD3DSurfaceImpl **render_targets, IWineD3DSurfaceImpl *depth_stencil,
+ struct fbo_entry *entry)
{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
const struct wined3d_gl_info *gl_info = context->gl_info;
- context_bind_fbo(context, GL_FRAMEBUFFER, &entry->id);
- context_clean_fbo_attachments(gl_info);
+ context_bind_fbo(context, target, &entry->id);
+ context_clean_fbo_attachments(gl_info, target);
- memcpy(entry->render_targets, device->render_targets, gl_info->limits.buffers * sizeof(*entry->render_targets));
- entry->depth_stencil = device->stencilBufferTarget;
+ memcpy(entry->render_targets, render_targets, gl_info->limits.buffers * sizeof(*entry->render_targets));
+ entry->depth_stencil = depth_stencil;
entry->attached = FALSE;
}
@@ -361,17 +363,17 @@ static void context_destroy_fbo_entry(struct wined3d_context *context, struct fb
/* GL locking is done by the caller */
-static struct fbo_entry *context_find_fbo_entry(struct wined3d_context *context)
+static struct fbo_entry *context_find_fbo_entry(struct wined3d_context *context, GLenum target,
+ IWineD3DSurfaceImpl **render_targets, IWineD3DSurfaceImpl *depth_stencil)
{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
const struct wined3d_gl_info *gl_info = context->gl_info;
struct fbo_entry *entry;
LIST_FOR_EACH_ENTRY(entry, &context->fbo_list, struct fbo_entry, entry)
{
if (!memcmp(entry->render_targets,
- device->render_targets, gl_info->limits.buffers * sizeof(*entry->render_targets))
- && entry->depth_stencil == device->stencilBufferTarget)
+ render_targets, gl_info->limits.buffers * sizeof(*entry->render_targets))
+ && entry->depth_stencil == depth_stencil)
{
list_remove(&entry->entry);
list_add_head(&context->fbo_list, &entry->entry);
@@ -381,14 +383,14 @@ static struct fbo_entry *context_find_fbo_entry(struct wined3d_context *context)
if (context->fbo_entry_count < WINED3D_MAX_FBO_ENTRIES)
{
- entry = context_create_fbo_entry(context);
+ entry = context_create_fbo_entry(context, render_targets, depth_stencil);
list_add_head(&context->fbo_list, &entry->entry);
++context->fbo_entry_count;
}
else
{
entry = LIST_ENTRY(list_tail(&context->fbo_list), struct fbo_entry, entry);
- context_reuse_fbo_entry(context, entry);
+ context_reuse_fbo_entry(context, target, render_targets, depth_stencil, entry);
list_remove(&entry->entry);
list_add_head(&context->fbo_list, &entry->entry);
}
@@ -397,32 +399,28 @@ static struct fbo_entry *context_find_fbo_entry(struct wined3d_context *context)
}
/* GL locking is done by the caller */
-static void context_apply_fbo_entry(struct wined3d_context *context, struct fbo_entry *entry)
+static void context_apply_fbo_entry(struct wined3d_context *context, GLenum target, struct fbo_entry *entry)
{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
const struct wined3d_gl_info *gl_info = context->gl_info;
unsigned int i;
- context_bind_fbo(context, GL_FRAMEBUFFER, &entry->id);
+ context_bind_fbo(context, target, &entry->id);
if (!entry->attached)
{
/* Apply render targets */
for (i = 0; i < gl_info->limits.buffers; ++i)
{
- IWineD3DSurface *render_target = device->render_targets[i];
- context_attach_surface_fbo(context, GL_FRAMEBUFFER, i, render_target);
+ context_attach_surface_fbo(context, target, i, entry->render_targets[i]);
}
/* Apply depth targets */
- if (device->stencilBufferTarget)
+ if (entry->depth_stencil)
{
- unsigned int w = ((IWineD3DSurfaceImpl *)device->render_targets[0])->pow2Width;
- unsigned int h = ((IWineD3DSurfaceImpl *)device->render_targets[0])->pow2Height;
-
- surface_set_compatible_renderbuffer(device->stencilBufferTarget, w, h);
+ surface_set_compatible_renderbuffer(entry->depth_stencil,
+ entry->render_targets[0]->pow2Width, entry->render_targets[0]->pow2Height);
}
- context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, device->stencilBufferTarget, TRUE);
+ context_attach_depth_stencil_fbo(context, target, entry->depth_stencil, TRUE);
entry->attached = TRUE;
}
@@ -430,24 +428,17 @@ 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]);
+ if (entry->render_targets[i])
+ context_apply_attachment_filter_states(entry->render_targets[i]);
}
- if (device->stencilBufferTarget)
- context_apply_attachment_filter_states(device->stencilBufferTarget);
- }
-
- for (i = 0; i < gl_info->limits.buffers; ++i)
- {
- if (device->render_targets[i])
- device->draw_buffers[i] = GL_COLOR_ATTACHMENT0 + i;
- else
- device->draw_buffers[i] = GL_NONE;
+ if (entry->depth_stencil)
+ context_apply_attachment_filter_states(entry->depth_stencil);
}
}
/* GL locking is done by the caller */
-static void context_apply_fbo_state(struct wined3d_context *context)
+static void context_apply_fbo_state(struct wined3d_context *context, GLenum target,
+ IWineD3DSurfaceImpl **render_targets, IWineD3DSurfaceImpl *depth_stencil)
{
struct fbo_entry *entry, *entry2;
@@ -456,16 +447,39 @@ static void context_apply_fbo_state(struct wined3d_context *context)
context_destroy_fbo_entry(context, entry);
}
- if (context->render_offscreen)
+ if (context->rebind_fbo)
{
- context->current_fbo = context_find_fbo_entry(context);
- context_apply_fbo_entry(context, context->current_fbo);
- } else {
- context->current_fbo = NULL;
context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
+ context->rebind_fbo = FALSE;
}
- context_check_fbo_status(context);
+ if (render_targets)
+ {
+ context->current_fbo = context_find_fbo_entry(context, target, render_targets, depth_stencil);
+ context_apply_fbo_entry(context, target, context->current_fbo);
+ }
+ else
+ {
+ context->current_fbo = NULL;
+ context_bind_fbo(context, target, NULL);
+ }
+
+ context_check_fbo_status(context, target);
+}
+
+/* GL locking is done by the caller */
+void context_apply_fbo_state_blit(struct wined3d_context *context, GLenum target,
+ IWineD3DSurfaceImpl *render_target, IWineD3DSurfaceImpl *depth_stencil)
+{
+ if (surface_is_offscreen(render_target))
+ {
+ context->blit_targets[0] = render_target;
+ context_apply_fbo_state(context, target, context->blit_targets, depth_stencil);
+ }
+ else
+ {
+ context_apply_fbo_state(context, target, NULL, NULL);
+ }
}
/* Context activation is done by the caller. */
@@ -614,13 +628,13 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource
const struct wined3d_gl_info *gl_info = context->gl_info;
struct fbo_entry *entry, *entry2;
- if (context->current_rt == (IWineD3DSurface *)resource) context->current_rt = NULL;
+ if (context->current_rt == (IWineD3DSurfaceImpl *)resource) context->current_rt = NULL;
LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry)
{
UINT j;
- if (entry->depth_stencil == (IWineD3DSurface *)resource)
+ if (entry->depth_stencil == (IWineD3DSurfaceImpl *)resource)
{
list_remove(&entry->entry);
list_add_head(&context->fbo_destroy_list, &entry->entry);
@@ -629,7 +643,7 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource
for (j = 0; j < gl_info->limits.buffers; ++j)
{
- if (entry->render_targets[j] == (IWineD3DSurface *)resource)
+ if (entry->render_targets[j] == (IWineD3DSurfaceImpl *)resource)
{
list_remove(&entry->entry);
list_add_head(&context->fbo_destroy_list, &entry->entry);
@@ -647,6 +661,115 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource
}
}
+void context_surface_update(struct wined3d_context *context, IWineD3DSurfaceImpl *surface)
+{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ struct fbo_entry *entry = context->current_fbo;
+ unsigned int i;
+
+ if (!entry || context->rebind_fbo) return;
+
+ for (i = 0; i < gl_info->limits.buffers; ++i)
+ {
+ if (surface == entry->render_targets[i])
+ {
+ TRACE("Updated surface %p is bound as color attachment %u to the current FBO.\n", surface, i);
+ context->rebind_fbo = TRUE;
+ return;
+ }
+ }
+
+ if (surface == entry->depth_stencil)
+ {
+ TRACE("Updated surface %p is bound as depth attachment to the current FBO.\n", surface);
+ context->rebind_fbo = TRUE;
+ }
+}
+
+static BOOL context_set_pixel_format(const struct wined3d_gl_info *gl_info, HDC dc, int format)
+{
+ int current = GetPixelFormat(dc);
+
+ if (current == format) return TRUE;
+
+ if (!current)
+ {
+ if (!SetPixelFormat(dc, format, NULL))
+ {
+ ERR("Failed to set pixel format %d on device context %p, last error %#x.\n",
+ format, dc, GetLastError());
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+ /* By default WGL doesn't allow pixel format adjustments but we need it
+ * here. For this reason there's a Wine specific wglSetPixelFormat()
+ * which allows us to set the pixel format multiple times. Only use it
+ * when really needed. */
+ if (gl_info->supported[WGL_WINE_PIXEL_FORMAT_PASSTHROUGH])
+ {
+ if (!GL_EXTCALL(wglSetPixelFormatWINE(dc, format, NULL)))
+ {
+ ERR("wglSetPixelFormatWINE failed to set pixel format %d on device context %p.\n",
+ format, dc);
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+ /* OpenGL doesn't allow pixel format adjustments. Print an error and
+ * continue using the old format. There's a big chance that the old
+ * format works although with a performance hit and perhaps rendering
+ * errors. */
+ ERR("Unable to set pixel format %d on device context %p. Already using format %d.\n",
+ format, dc, current);
+ return TRUE;
+}
+
+static void context_update_window(struct wined3d_context *context)
+{
+ TRACE("Updating context %p window from %p to %p.\n",
+ context, context->win_handle, context->swapchain->win_handle);
+
+ if (context->valid)
+ {
+ if (!ReleaseDC(context->win_handle, context->hdc))
+ {
+ ERR("Failed to release device context %p, last error %#x.\n",
+ context->hdc, GetLastError());
+ }
+ }
+ else context->valid = 1;
+
+ context->win_handle = context->swapchain->win_handle;
+
+ if (!(context->hdc = GetDC(context->win_handle)))
+ {
+ ERR("Failed to get a device context for window %p.\n", context->win_handle);
+ goto err;
+ }
+
+ if (!context_set_pixel_format(context->gl_info, context->hdc, context->pixel_format))
+ {
+ ERR("Failed to set pixel format %d on device context %p.\n",
+ context->pixel_format, context->hdc);
+ goto err;
+ }
+
+ if (!pwglMakeCurrent(context->hdc, context->glCtx))
+ {
+ ERR("Failed to make GL context %p current on device context %p, last error %#x.\n",
+ context->glCtx, context->hdc, GetLastError());
+ goto err;
+ }
+
+ return;
+
+err:
+ context->valid = 0;
+}
+
static void context_validate(struct wined3d_context *context)
{
HWND wnd = WindowFromDC(context->hdc);
@@ -657,6 +780,9 @@ static void context_validate(struct wined3d_context *context)
context->hdc, wnd, context->win_handle);
context->valid = 0;
}
+
+ if (context->win_handle != context->swapchain->win_handle)
+ context_update_window(context);
}
static void context_destroy_gl_resources(struct wined3d_context *context)
@@ -713,11 +839,6 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
if (context->valid)
{
- if (context->src_fbo)
- {
- TRACE("Destroy src FBO %d\n", context->src_fbo);
- context_destroy_fbo(context, &context->src_fbo);
- }
if (context->dst_fbo)
{
TRACE("Destroy dst FBO %d\n", context->dst_fbo);
@@ -772,15 +893,7 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
ERR("Failed to disable GL context.\n");
}
- if (context->pbuffer)
- {
- GL_EXTCALL(wglReleasePbufferDCARB(context->pbuffer, context->hdc));
- GL_EXTCALL(wglDestroyPbufferARB(context->pbuffer));
- }
- else
- {
- ReleaseDC(context->win_handle, context->hdc);
- }
+ ReleaseDC(context->win_handle, context->hdc);
if (!pwglDeleteContext(context->glCtx))
{
@@ -928,68 +1041,10 @@ static void Context_MarkStateDirty(struct wined3d_context *context, DWORD state,
context->isStateDirty[idx] |= (1 << shift);
}
-/*****************************************************************************
- * AddContextToArray
- *
- * Adds a context to the context array. Helper function for context_create().
- *
- * This method is not called in performance-critical code paths, only when a
- * new render target or swapchain is created. Thus performance is not an issue
- * here.
- *
- * Params:
- * This: Device to add the context for
- * hdc: device context
- * glCtx: WGL context to add
- * pbuffer: optional pbuffer used with this context
- *
- *****************************************************************************/
-static struct wined3d_context *AddContextToArray(IWineD3DDeviceImpl *This,
- HWND win_handle, HDC hdc, HGLRC glCtx, HPBUFFERARB pbuffer)
-{
- struct wined3d_context **oldArray = This->contexts;
- DWORD state;
-
- This->contexts = HeapAlloc(GetProcessHeap(), 0, sizeof(*This->contexts) * (This->numContexts + 1));
- if(This->contexts == NULL) {
- ERR("Unable to grow the context array\n");
- This->contexts = oldArray;
- return NULL;
- }
- if(oldArray) {
- memcpy(This->contexts, oldArray, sizeof(*This->contexts) * This->numContexts);
- }
-
- This->contexts[This->numContexts] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(**This->contexts));
- if(This->contexts[This->numContexts] == NULL) {
- ERR("Unable to allocate a new context\n");
- HeapFree(GetProcessHeap(), 0, This->contexts);
- This->contexts = oldArray;
- return NULL;
- }
-
- This->contexts[This->numContexts]->hdc = hdc;
- This->contexts[This->numContexts]->glCtx = glCtx;
- This->contexts[This->numContexts]->pbuffer = pbuffer;
- This->contexts[This->numContexts]->win_handle = win_handle;
- HeapFree(GetProcessHeap(), 0, oldArray);
-
- /* Mark all states dirty to force a proper initialization of the states on the first use of the context
- */
- for(state = 0; state <= STATE_HIGHEST; state++) {
- if (This->StateTable[state].representative)
- Context_MarkStateDirty(This->contexts[This->numContexts], state, This->StateTable);
- }
-
- This->numContexts++;
- TRACE("Created context %p\n", This->contexts[This->numContexts - 1]);
- return This->contexts[This->numContexts - 1];
-}
-
/* This function takes care of WineD3D pixel format selection. */
static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc,
- const struct GlPixelFormatDesc *color_format_desc, const struct GlPixelFormatDesc *ds_format_desc,
- BOOL auxBuffers, int numSamples, BOOL pbuffer, BOOL findCompatible)
+ const struct wined3d_format_desc *color_format_desc, const struct wined3d_format_desc *ds_format_desc,
+ BOOL auxBuffers, int numSamples, BOOL findCompatible)
{
int iPixelFormat=0;
unsigned int matchtry;
@@ -1019,9 +1074,9 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc,
int i = 0;
int nCfgs = This->adapter->nCfgs;
- TRACE("ColorFormat=%s, DepthStencilFormat=%s, auxBuffers=%d, numSamples=%d, pbuffer=%d, findCompatible=%d\n",
+ TRACE("ColorFormat=%s, DepthStencilFormat=%s, auxBuffers=%d, numSamples=%d, findCompatible=%d\n",
debug_d3dformat(color_format_desc->format), debug_d3dformat(ds_format_desc->format),
- auxBuffers, numSamples, pbuffer, findCompatible);
+ auxBuffers, numSamples, findCompatible);
if (!getColorBits(color_format_desc, &redBits, &greenBits, &blueBits, &alphaBits, &colorBits))
{
@@ -1030,23 +1085,6 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc,
return 0;
}
- /* In WGL both color, depth and stencil are features of a pixel format. In case of D3D they are separate.
- * You are able to add a depth + stencil surface at a later stage when you need it.
- * In order to support this properly in WineD3D we need the ability to recreate the opengl context and
- * drawable when this is required. This is very tricky as we need to reapply ALL opengl states for the new
- * context, need torecreate shaders, textures and other resources.
- *
- * The context manager already takes care of the state problem and for the other tasks code from Reset
- * can be used. These changes are way to risky during the 1.0 code freeze which is taking place right now.
- * Likely a lot of other new bugs will be exposed. For that reason request a depth stencil surface all the
- * time. It can cause a slight performance hit but fixes a lot of regressions. A fixme reminds of that this
- * issue needs to be fixed. */
- if (ds_format_desc->format != WINED3DFMT_D24_UNORM_S8_UINT)
- {
- FIXME("Add OpenGL context recreation support to SetDepthStencilSurface\n");
- ds_format_desc = getFormatDescEntry(WINED3DFMT_D24_UNORM_S8_UINT, &This->adapter->gl_info);
- }
-
getDepthStencilBits(ds_format_desc, &depthBits, &stencilBits);
for(matchtry = 0; matchtry < (sizeof(matches) / sizeof(matches[0])) && !iPixelFormat; matchtry++) {
@@ -1059,18 +1097,14 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc,
if(cfg->iPixelType != WGL_TYPE_RGBA_ARB)
continue;
- /* In window mode (!pbuffer) we need a window drawable format and double buffering. */
- if(!pbuffer && !(cfg->windowDrawable && cfg->doubleBuffer))
+ /* In window mode we need a window drawable format and double buffering. */
+ if(!(cfg->windowDrawable && cfg->doubleBuffer))
continue;
/* We like to have aux buffers in backbuffer mode */
if(auxBuffers && !cfg->auxBuffers && matches[matchtry].require_aux)
continue;
- /* In pbuffer-mode we need a pbuffer-capable format but we don't want double buffering */
- if(pbuffer && (!cfg->pbufferDrawable || cfg->doubleBuffer))
- continue;
-
if(matches[matchtry].exact_color) {
if(cfg->redSize != redBits)
continue;
@@ -1167,227 +1201,174 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc,
/*****************************************************************************
* context_create
*
- * Creates a new context for a window, or a pbuffer context.
+ * Creates a new context.
*
* * Params:
* This: Device to activate the context for
* target: Surface this context will render to
* win_handle: handle to the window which we are drawing to
- * create_pbuffer: tells whether to create a pbuffer or not
* pPresentParameters: contains the pixelformats to use for onscreen rendering
*
*****************************************************************************/
-struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target,
- HWND win_handle, BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *pPresentParms)
+struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3DSurfaceImpl *target,
+ const struct wined3d_format_desc *ds_format_desc)
{
- const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
- struct wined3d_context *ret = NULL;
- HPBUFFERARB pbuffer = NULL;
+ IWineD3DDeviceImpl *device = swapchain->device;
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ const struct wined3d_format_desc *color_format_desc;
+ struct wined3d_context *ret;
+ PIXELFORMATDESCRIPTOR pfd;
+ BOOL auxBuffers = FALSE;
+ int numSamples = 0;
+ int pixel_format;
unsigned int s;
+ DWORD state;
HGLRC ctx;
HDC hdc;
- TRACE("(%p): Creating a %s context for render target %p\n", This, create_pbuffer ? "offscreen" : "onscreen", target);
+ TRACE("swapchain %p, target %p, window %p.\n", swapchain, target, swapchain->win_handle);
- if(create_pbuffer) {
- HDC hdc_parent = GetDC(win_handle);
- int iPixelFormat = 0;
+ ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret));
+ if (!ret)
+ {
+ ERR("Failed to allocate context memory.\n");
+ return NULL;
+ }
- IWineD3DSurface *StencilSurface = This->stencilBufferTarget;
- const struct GlPixelFormatDesc *ds_format_desc = StencilSurface
- ? ((IWineD3DSurfaceImpl *)StencilSurface)->resource.format_desc
- : getFormatDescEntry(WINED3DFMT_UNKNOWN, &This->adapter->gl_info);
+ if (!(hdc = GetDC(swapchain->win_handle)))
+ {
+ ERR("Failed to retrieve a device context.\n");
+ goto out;
+ }
- /* Try to find a pixel format with pbuffer support. */
- iPixelFormat = WineD3D_ChoosePixelFormat(This, hdc_parent, target->resource.format_desc,
- ds_format_desc, FALSE /* auxBuffers */, 0 /* numSamples */, TRUE /* PBUFFER */,
- FALSE /* findCompatible */);
- if(!iPixelFormat) {
- TRACE("Trying to locate a compatible pixel format because an exact match failed.\n");
+ color_format_desc = target->resource.format_desc;
- /* For some reason we weren't able to find a format, try to find something instead of crashing.
- * A reason for failure could have been wglChoosePixelFormatARB strictness. */
- iPixelFormat = WineD3D_ChoosePixelFormat(This, hdc_parent, target->resource.format_desc,
- ds_format_desc, FALSE /* auxBuffer */, 0 /* numSamples */, TRUE /* PBUFFER */,
- TRUE /* findCompatible */);
- }
+ /* In case of ORM_BACKBUFFER, make sure to request an alpha component for
+ * X4R4G4B4/X8R8G8B8 as we might need it for the backbuffer. */
+ if (wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER)
+ {
+ auxBuffers = TRUE;
- /* This shouldn't happen as ChoosePixelFormat always returns something */
- if(!iPixelFormat) {
- ERR("Unable to locate a pixel format for a pbuffer\n");
- ReleaseDC(win_handle, hdc_parent);
- goto out;
- }
+ if (color_format_desc->format == WINED3DFMT_B4G4R4X4_UNORM)
+ color_format_desc = getFormatDescEntry(WINED3DFMT_B4G4R4A4_UNORM, gl_info);
+ else if (color_format_desc->format == WINED3DFMT_B8G8R8X8_UNORM)
+ color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, gl_info);
+ }
- TRACE("Creating a pBuffer drawable for the new context\n");
- pbuffer = GL_EXTCALL(wglCreatePbufferARB(hdc_parent, iPixelFormat, target->currentDesc.Width, target->currentDesc.Height, 0));
- if(!pbuffer) {
- ERR("Cannot create a pbuffer\n");
- ReleaseDC(win_handle, hdc_parent);
- goto out;
- }
+ /* DirectDraw supports 8bit paletted render targets and these are used by
+ * old games like Starcraft and C&C. Most modern hardware doesn't support
+ * 8bit natively so we perform some form of 8bit -> 32bit conversion. The
+ * conversion (ab)uses the alpha component for storing the palette index.
+ * For this reason we require a format with 8bit alpha, so request
+ * A8R8G8B8. */
+ if (color_format_desc->format == WINED3DFMT_P8_UINT)
+ color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, gl_info);
- /* In WGL a pbuffer is 'wrapped' inside a HDC to 'fool' wglMakeCurrent */
- hdc = GL_EXTCALL(wglGetPbufferDCARB(pbuffer));
- if(!hdc) {
- ERR("Cannot get a HDC for pbuffer (%p)\n", pbuffer);
- GL_EXTCALL(wglDestroyPbufferARB(pbuffer));
- ReleaseDC(win_handle, hdc_parent);
- goto out;
- }
- ReleaseDC(win_handle, hdc_parent);
- } else {
- PIXELFORMATDESCRIPTOR pfd;
- int iPixelFormat;
- int res;
- const struct GlPixelFormatDesc *color_format_desc = target->resource.format_desc;
- const struct GlPixelFormatDesc *ds_format_desc = getFormatDescEntry(WINED3DFMT_UNKNOWN,
- &This->adapter->gl_info);
- BOOL auxBuffers = FALSE;
- int numSamples = 0;
-
- hdc = GetDC(win_handle);
- if(hdc == NULL) {
- ERR("Cannot retrieve a device context!\n");
- goto out;
- }
-
- /* In case of ORM_BACKBUFFER, make sure to request an alpha component for X4R4G4B4/X8R8G8B8 as we might need it for the backbuffer. */
- if(wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER) {
- auxBuffers = TRUE;
-
- if (color_format_desc->format == WINED3DFMT_B4G4R4X4_UNORM)
- color_format_desc = getFormatDescEntry(WINED3DFMT_B4G4R4A4_UNORM, &This->adapter->gl_info);
- else if (color_format_desc->format == WINED3DFMT_B8G8R8X8_UNORM)
- color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, &This->adapter->gl_info);
- }
-
- /* DirectDraw supports 8bit paletted render targets and these are used by old games like Starcraft and C&C.
- * Most modern hardware doesn't support 8bit natively so we perform some form of 8bit -> 32bit conversion.
- * The conversion (ab)uses the alpha component for storing the palette index. For this reason we require
- * a format with 8bit alpha, so request A8R8G8B8. */
- if (color_format_desc->format == WINED3DFMT_P8_UINT)
- color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, &This->adapter->gl_info);
-
- /* Retrieve the depth stencil format from the present parameters.
- * The choice of the proper format can give a nice performance boost
- * in case of GPU limited programs. */
- if(pPresentParms->EnableAutoDepthStencil) {
- TRACE("pPresentParms->EnableAutoDepthStencil=enabled; using AutoDepthStencilFormat=%s\n", debug_d3dformat(pPresentParms->AutoDepthStencilFormat));
- ds_format_desc = getFormatDescEntry(pPresentParms->AutoDepthStencilFormat, &This->adapter->gl_info);
- }
-
- /* D3D only allows multisampling when SwapEffect is set to WINED3DSWAPEFFECT_DISCARD */
- if(pPresentParms->MultiSampleType && (pPresentParms->SwapEffect == WINED3DSWAPEFFECT_DISCARD)) {
- if (!gl_info->supported[ARB_MULTISAMPLE])
- ERR("The program is requesting multisampling without support!\n");
- else
- {
- TRACE("Requesting multisample type %#x.\n", pPresentParms->MultiSampleType);
- numSamples = pPresentParms->MultiSampleType;
- }
- }
-
- /* Try to find a pixel format which matches our requirements */
- iPixelFormat = WineD3D_ChoosePixelFormat(This, hdc, color_format_desc, ds_format_desc,
- auxBuffers, numSamples, FALSE /* PBUFFER */, FALSE /* findCompatible */);
-
- /* Try to locate a compatible format if we weren't able to find anything */
- if(!iPixelFormat) {
- TRACE("Trying to locate a compatible pixel format because an exact match failed.\n");
- iPixelFormat = WineD3D_ChoosePixelFormat(This, hdc, color_format_desc, ds_format_desc,
- auxBuffers, 0 /* numSamples */, FALSE /* PBUFFER */, TRUE /* findCompatible */ );
- }
-
- /* If we still don't have a pixel format, something is very wrong as ChoosePixelFormat barely fails */
- if(!iPixelFormat) {
- ERR("Can't find a suitable iPixelFormat\n");
- return NULL;
- }
-
- DescribePixelFormat(hdc, iPixelFormat, sizeof(pfd), &pfd);
- res = SetPixelFormat(hdc, iPixelFormat, NULL);
- if(!res) {
- int oldPixelFormat = GetPixelFormat(hdc);
-
- /* By default WGL doesn't allow pixel format adjustments but we need it here.
- * For this reason there is a WINE-specific wglSetPixelFormat which allows you to
- * set the pixel format multiple times. Only use it when it is really needed. */
-
- if(oldPixelFormat == iPixelFormat) {
- /* We don't have to do anything as the formats are the same :) */
- }
- else if (oldPixelFormat && gl_info->supported[WGL_WINE_PIXEL_FORMAT_PASSTHROUGH])
- {
- res = GL_EXTCALL(wglSetPixelFormatWINE(hdc, iPixelFormat, NULL));
-
- if(!res) {
- ERR("wglSetPixelFormatWINE failed on HDC=%p for iPixelFormat=%d\n", hdc, iPixelFormat);
- return NULL;
- }
- } else if(oldPixelFormat) {
- /* OpenGL doesn't allow pixel format adjustments. Print an error and continue using the old format.
- * There's a big chance that the old format works although with a performance hit and perhaps rendering errors. */
- ERR("HDC=%p is already set to iPixelFormat=%d and OpenGL doesn't allow changes!\n", hdc, oldPixelFormat);
- } else {
- ERR("SetPixelFormat failed on HDC=%p for iPixelFormat=%d\n", hdc, iPixelFormat);
- return NULL;
- }
+ /* D3D only allows multisampling when SwapEffect is set to WINED3DSWAPEFFECT_DISCARD. */
+ if (swapchain->presentParms.MultiSampleType && (swapchain->presentParms.SwapEffect == WINED3DSWAPEFFECT_DISCARD))
+ {
+ if (!gl_info->supported[ARB_MULTISAMPLE])
+ WARN("The application is requesting multisampling without support.\n");
+ else
+ {
+ TRACE("Requesting multisample type %#x.\n", swapchain->presentParms.MultiSampleType);
+ numSamples = swapchain->presentParms.MultiSampleType;
}
}
- ctx = pwglCreateContext(hdc);
- if (This->numContexts)
+ /* Try to find a pixel format which matches our requirements. */
+ pixel_format = WineD3D_ChoosePixelFormat(device, hdc, color_format_desc, ds_format_desc,
+ auxBuffers, numSamples, FALSE /* findCompatible */);
+
+ /* Try to locate a compatible format if we weren't able to find anything. */
+ if (!pixel_format)
{
- if (!pwglShareLists(This->contexts[0]->glCtx, ctx))
+ TRACE("Trying to locate a compatible pixel format because an exact match failed.\n");
+ pixel_format = WineD3D_ChoosePixelFormat(device, hdc, color_format_desc, ds_format_desc,
+ auxBuffers, 0 /* numSamples */, TRUE /* findCompatible */);
+ }
+
+ /* If we still don't have a pixel format, something is very wrong as ChoosePixelFormat barely fails */
+ if (!pixel_format)
+ {
+ ERR("Can't find a suitable pixel format.\n");
+ goto out;
+ }
+
+ DescribePixelFormat(hdc, pixel_format, sizeof(pfd), &pfd);
+ if (!context_set_pixel_format(gl_info, hdc, pixel_format))
+ {
+ ERR("Failed to set pixel format %d on device context %p.\n", pixel_format, hdc);
+ goto out;
+ }
+
+ ctx = pwglCreateContext(hdc);
+ if (device->numContexts)
+ {
+ if (!pwglShareLists(device->contexts[0]->glCtx, ctx))
{
DWORD err = GetLastError();
ERR("wglShareLists(%p, %p) failed, last error %#x.\n",
- This->contexts[0]->glCtx, ctx, err);
+ device->contexts[0]->glCtx, ctx, err);
}
}
if(!ctx) {
ERR("Failed to create a WGL context\n");
- if(create_pbuffer) {
- GL_EXTCALL(wglReleasePbufferDCARB(pbuffer, hdc));
- GL_EXTCALL(wglDestroyPbufferARB(pbuffer));
- }
goto out;
}
- ret = AddContextToArray(This, win_handle, hdc, ctx, pbuffer);
- if(!ret) {
+
+ if (!device_context_add(device, ret))
+ {
ERR("Failed to add the newly created context to the context list\n");
if (!pwglDeleteContext(ctx))
{
DWORD err = GetLastError();
ERR("wglDeleteContext(%p) failed, last error %#x.\n", ctx, err);
}
- if(create_pbuffer) {
- GL_EXTCALL(wglReleasePbufferDCARB(pbuffer, hdc));
- GL_EXTCALL(wglDestroyPbufferARB(pbuffer));
- }
goto out;
}
- ret->valid = 1;
- ret->gl_info = &This->adapter->gl_info;
- ret->surface = (IWineD3DSurface *) target;
- ret->current_rt = (IWineD3DSurface *)target;
- ret->render_offscreen = surface_is_offscreen((IWineD3DSurface *) target);
- ret->draw_buffer_dirty = TRUE;
+
+ ret->gl_info = gl_info;
+
+ /* Mark all states dirty to force a proper initialization of the states
+ * on the first use of the context. */
+ for (state = 0; state <= STATE_HIGHEST; ++state)
+ {
+ if (device->StateTable[state].representative)
+ Context_MarkStateDirty(ret, state, device->StateTable);
+ }
+
+ ret->swapchain = swapchain;
+ ret->current_rt = target;
ret->tid = GetCurrentThreadId();
- if(This->shader_backend->shader_dirtifyable_constants((IWineD3DDevice *) This)) {
+
+ ret->render_offscreen = surface_is_offscreen(target);
+ ret->draw_buffer_dirty = TRUE;
+ ret->valid = 1;
+
+ ret->glCtx = ctx;
+ ret->win_handle = swapchain->win_handle;
+ ret->hdc = hdc;
+ ret->pixel_format = pixel_format;
+
+ if (device->shader_backend->shader_dirtifyable_constants((IWineD3DDevice *)device))
+ {
/* Create the dirty constants array and initialize them to dirty */
ret->vshader_const_dirty = HeapAlloc(GetProcessHeap(), 0,
- sizeof(*ret->vshader_const_dirty) * This->d3d_vshader_constantF);
+ sizeof(*ret->vshader_const_dirty) * device->d3d_vshader_constantF);
ret->pshader_const_dirty = HeapAlloc(GetProcessHeap(), 0,
- sizeof(*ret->pshader_const_dirty) * This->d3d_pshader_constantF);
+ sizeof(*ret->pshader_const_dirty) * device->d3d_pshader_constantF);
memset(ret->vshader_const_dirty, 1,
- sizeof(*ret->vshader_const_dirty) * This->d3d_vshader_constantF);
+ sizeof(*ret->vshader_const_dirty) * device->d3d_vshader_constantF);
memset(ret->pshader_const_dirty, 1,
- sizeof(*ret->pshader_const_dirty) * This->d3d_pshader_constantF);
+ sizeof(*ret->pshader_const_dirty) * device->d3d_pshader_constantF);
}
+ ret->blit_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ gl_info->limits.buffers * sizeof(*ret->blit_targets));
+ if (!ret->blit_targets) goto out;
+
ret->free_occlusion_query_size = 4;
ret->free_occlusion_queries = HeapAlloc(GetProcessHeap(), 0,
ret->free_occlusion_query_size * sizeof(*ret->free_occlusion_queries));
@@ -1440,10 +1421,10 @@ struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurface
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
checkGLcall("glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);");
- glPixelStorei(GL_PACK_ALIGNMENT, This->surface_alignment);
- checkGLcall("glPixelStorei(GL_PACK_ALIGNMENT, This->surface_alignment);");
- glPixelStorei(GL_UNPACK_ALIGNMENT, This->surface_alignment);
- checkGLcall("glPixelStorei(GL_UNPACK_ALIGNMENT, This->surface_alignment);");
+ glPixelStorei(GL_PACK_ALIGNMENT, device->surface_alignment);
+ checkGLcall("glPixelStorei(GL_PACK_ALIGNMENT, device->surface_alignment);");
+ glPixelStorei(GL_UNPACK_ALIGNMENT, device->surface_alignment);
+ checkGLcall("glPixelStorei(GL_UNPACK_ALIGNMENT, device->surface_alignment);");
if (gl_info->supported[APPLE_CLIENT_STORAGE])
{
@@ -1512,83 +1493,22 @@ struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurface
LEAVE_GL();
- This->frag_pipe->enable_extension((IWineD3DDevice *) This, TRUE);
+ device->frag_pipe->enable_extension((IWineD3DDevice *)device, TRUE);
+
+ TRACE("Created context %p.\n", ret);
return ret;
out:
- if (ret)
- {
- HeapFree(GetProcessHeap(), 0, ret->free_event_queries);
- HeapFree(GetProcessHeap(), 0, ret->free_occlusion_queries);
- HeapFree(GetProcessHeap(), 0, ret->pshader_const_dirty);
- HeapFree(GetProcessHeap(), 0, ret->vshader_const_dirty);
- HeapFree(GetProcessHeap(), 0, ret);
- }
+ HeapFree(GetProcessHeap(), 0, ret->free_event_queries);
+ HeapFree(GetProcessHeap(), 0, ret->free_occlusion_queries);
+ HeapFree(GetProcessHeap(), 0, ret->blit_targets);
+ HeapFree(GetProcessHeap(), 0, ret->pshader_const_dirty);
+ HeapFree(GetProcessHeap(), 0, ret->vshader_const_dirty);
+ HeapFree(GetProcessHeap(), 0, ret);
return NULL;
}
-/*****************************************************************************
- * RemoveContextFromArray
- *
- * Removes a context from the context manager. The opengl context is not
- * destroyed or unset. context is not a valid pointer after that call.
- *
- * Similar to the former call this isn't a performance critical function. A
- * helper function for context_destroy().
- *
- * Params:
- * This: Device to activate the context for
- * context: Context to remove
- *
- *****************************************************************************/
-static void RemoveContextFromArray(IWineD3DDeviceImpl *This, struct wined3d_context *context)
-{
- struct wined3d_context **new_array;
- BOOL found = FALSE;
- UINT i;
-
- TRACE("Removing ctx %p\n", context);
-
- for (i = 0; i < This->numContexts; ++i)
- {
- if (This->contexts[i] == context)
- {
- found = TRUE;
- break;
- }
- }
-
- if (!found)
- {
- ERR("Context %p doesn't exist in context array\n", context);
- return;
- }
-
- while (i < This->numContexts - 1)
- {
- This->contexts[i] = This->contexts[i + 1];
- ++i;
- }
-
- --This->numContexts;
- if (!This->numContexts)
- {
- HeapFree(GetProcessHeap(), 0, This->contexts);
- This->contexts = NULL;
- return;
- }
-
- new_array = HeapReAlloc(GetProcessHeap(), 0, This->contexts, This->numContexts * sizeof(*This->contexts));
- if (!new_array)
- {
- ERR("Failed to shrink context array. Oh well.\n");
- return;
- }
-
- This->contexts = new_array;
-}
-
/*****************************************************************************
* context_destroy
*
@@ -1617,9 +1537,10 @@ void context_destroy(IWineD3DDeviceImpl *This, struct wined3d_context *context)
destroy = FALSE;
}
+ HeapFree(GetProcessHeap(), 0, context->blit_targets);
HeapFree(GetProcessHeap(), 0, context->vshader_const_dirty);
HeapFree(GetProcessHeap(), 0, context->pshader_const_dirty);
- RemoveContextFromArray(This, context);
+ device_context_remove(This, context);
if (destroy) HeapFree(GetProcessHeap(), 0, context);
}
@@ -1657,8 +1578,8 @@ static void SetupForBlit(IWineD3DDeviceImpl *This, struct wined3d_context *conte
int i;
const struct StateEntry *StateTable = This->StateTable;
const struct wined3d_gl_info *gl_info = context->gl_info;
- UINT width = ((IWineD3DSurfaceImpl *)context->current_rt)->currentDesc.Width;
- UINT height = ((IWineD3DSurfaceImpl *)context->current_rt)->currentDesc.Height;
+ UINT width = context->current_rt->currentDesc.Width;
+ UINT height = context->current_rt->currentDesc.Height;
DWORD sampler;
TRACE("Setting up context %p for blitting\n", context);
@@ -1811,6 +1732,9 @@ static void SetupForBlit(IWineD3DDeviceImpl *This, struct wined3d_context *conte
glColorMask(GL_TRUE, GL_TRUE,GL_TRUE,GL_TRUE);
checkGLcall("glColorMask");
Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_COLORWRITEENABLE), StateTable);
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_COLORWRITEENABLE1), StateTable);
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_COLORWRITEENABLE2), StateTable);
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_COLORWRITEENABLE3), StateTable);
if (gl_info->supported[EXT_SECONDARY_COLOR])
{
glDisable(GL_COLOR_SUM_EXT);
@@ -1882,14 +1806,12 @@ static struct wined3d_context *findThreadContextForSwapChain(IWineD3DSwapChain *
* Returns: The needed context
*
*****************************************************************************/
-static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target)
+static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target)
{
IWineD3DSwapChain *swapchain = NULL;
struct wined3d_context *current_context = context_get_current();
- const struct StateEntry *StateTable = This->StateTable;
DWORD tid = GetCurrentThreadId();
struct wined3d_context *context;
- BOOL old_render_offscreen;
if (current_context && current_context->destroyed) current_context = NULL;
@@ -1897,15 +1819,15 @@ static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSur
{
if (current_context
&& current_context->current_rt
- && ((IWineD3DSurfaceImpl *)current_context->surface)->resource.device == This)
+ && current_context->swapchain->device == This)
{
target = current_context->current_rt;
}
else
{
IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)This->swapchains[0];
- if (swapchain->backBuffer) target = swapchain->backBuffer[0];
- else target = swapchain->frontBuffer;
+ if (swapchain->back_buffers) target = swapchain->back_buffers[0];
+ else target = swapchain->front_buffer;
}
}
@@ -1915,165 +1837,36 @@ static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSur
return current_context;
}
- if (SUCCEEDED(IWineD3DSurface_GetContainer(target, &IID_IWineD3DSwapChain, (void **)&swapchain))) {
+ if (target->Flags & SFLAG_SWAPCHAIN)
+ {
TRACE("Rendering onscreen\n");
+ swapchain = (IWineD3DSwapChain *)target->container;
context = findThreadContextForSwapChain(swapchain, tid);
-
- old_render_offscreen = context->render_offscreen;
- context->render_offscreen = surface_is_offscreen(target);
- /* The context != This->activeContext will catch a NOP context change. This can occur
- * if we are switching back to swapchain rendering in case of FBO or Back Buffer offscreen
- * rendering. No context change is needed in that case
- */
-
- if(wined3d_settings.offscreen_rendering_mode == ORM_PBUFFER) {
- if(This->pbufferContext && tid == This->pbufferContext->tid) {
- This->pbufferContext->tid = 0;
- }
- }
- IWineD3DSwapChain_Release(swapchain);
}
else
{
TRACE("Rendering offscreen\n");
-retry:
- if (wined3d_settings.offscreen_rendering_mode == ORM_PBUFFER)
+ /* Stay with the currently active context. */
+ if (current_context && current_context->swapchain->device == This)
{
- IWineD3DSurfaceImpl *targetimpl = (IWineD3DSurfaceImpl *)target;
- if (!This->pbufferContext
- || This->pbufferWidth < targetimpl->currentDesc.Width
- || This->pbufferHeight < targetimpl->currentDesc.Height)
- {
- if (This->pbufferContext) context_destroy(This, This->pbufferContext);
-
- /* The display is irrelevant here, the window is 0. But
- * context_create() needs a valid X connection. Create the context
- * on the same server as the primary swapchain. The primary
- * swapchain is exists at this point. */
- This->pbufferContext = context_create(This, targetimpl,
- ((IWineD3DSwapChainImpl *)This->swapchains[0])->context[0]->win_handle,
- TRUE /* pbuffer */, &((IWineD3DSwapChainImpl *)This->swapchains[0])->presentParms);
- This->pbufferWidth = targetimpl->currentDesc.Width;
- This->pbufferHeight = targetimpl->currentDesc.Height;
- if (This->pbufferContext) context_release(This->pbufferContext);
- }
-
- if (This->pbufferContext)
- {
- if (This->pbufferContext->tid && This->pbufferContext->tid != tid)
- {
- FIXME("The PBuffer context is only supported for one thread for now!\n");
- }
- This->pbufferContext->tid = tid;
- context = This->pbufferContext;
- }
- else
- {
- ERR("Failed to create a buffer context and drawable, falling back to back buffer offscreen rendering.\n");
- wined3d_settings.offscreen_rendering_mode = ORM_BACKBUFFER;
- goto retry;
- }
+ context = current_context;
}
else
{
- /* Stay with the currently active context. */
- if (current_context
- && ((IWineD3DSurfaceImpl *)current_context->surface)->resource.device == This)
- {
- context = current_context;
- }
- else
- {
- /* This may happen if the app jumps straight into offscreen rendering
- * Start using the context of the primary swapchain. tid == 0 is no problem
- * for findThreadContextForSwapChain.
- *
- * Can also happen on thread switches - in that case findThreadContextForSwapChain
- * is perfect to call. */
- context = findThreadContextForSwapChain(This->swapchains[0], tid);
- }
+ /* This may happen if the app jumps straight into offscreen rendering
+ * Start using the context of the primary swapchain. tid == 0 is no problem
+ * for findThreadContextForSwapChain.
+ *
+ * Can also happen on thread switches - in that case findThreadContextForSwapChain
+ * is perfect to call. */
+ context = findThreadContextForSwapChain(This->swapchains[0], tid);
}
-
- old_render_offscreen = context->render_offscreen;
- context->render_offscreen = TRUE;
}
context_validate(context);
- if (context->render_offscreen != old_render_offscreen)
- {
- Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION), StateTable);
- Context_MarkStateDirty(context, STATE_VDECL, StateTable);
- Context_MarkStateDirty(context, STATE_VIEWPORT, StateTable);
- Context_MarkStateDirty(context, STATE_SCISSORRECT, StateTable);
- Context_MarkStateDirty(context, STATE_FRONTFACE, StateTable);
- }
-
- /* To compensate the lack of format switching with some offscreen rendering methods and on onscreen buffers
- * the alpha blend state changes with different render target formats. */
- if (!context->current_rt)
- {
- Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
- }
- else
- {
- const struct GlPixelFormatDesc *old = ((IWineD3DSurfaceImpl *)context->current_rt)->resource.format_desc;
- const struct GlPixelFormatDesc *new = ((IWineD3DSurfaceImpl *)target)->resource.format_desc;
-
- if (old->format != new->format)
- {
- /* Disable blending when the alpha mask has changed and when a format doesn't support blending. */
- if ((old->alpha_mask && !new->alpha_mask) || (!old->alpha_mask && new->alpha_mask)
- || !(new->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING))
- {
- Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
- }
- }
-
- /* When switching away from an offscreen render target, and we're not
- * using FBOs, we have to read the drawable into the texture. This is
- * done via PreLoad (and SFLAG_INDRAWABLE set on the surface). There
- * are some things that need care though. PreLoad needs a GL context,
- * and FindContext is called before the context is activated. It also
- * has to be called with the old rendertarget active, otherwise a
- * wrong drawable is read. */
- if (wined3d_settings.offscreen_rendering_mode != ORM_FBO
- && old_render_offscreen && context->current_rt != target)
- {
- BOOL oldInDraw = This->isInDraw;
-
- /* surface_internal_preload() requires a context to load the
- * texture, so it will call context_acquire(). Set isInDraw to true
- * to signal surface_internal_preload() that it has a context. */
-
- /* FIXME: This is just broken. There's no guarantee whatsoever
- * that the currently active context, if any, is appropriate for
- * reading back the render target. We should probably call
- * context_set_current(context) here and then rely on
- * context_acquire() doing the right thing. */
- This->isInDraw = TRUE;
-
- /* Read the back buffer of the old drawable into the destination texture. */
- if (((IWineD3DSurfaceImpl *)context->current_rt)->texture_name_srgb)
- {
- surface_internal_preload(context->current_rt, SRGB_BOTH);
- }
- else
- {
- surface_internal_preload(context->current_rt, SRGB_RGB);
- }
-
- IWineD3DSurface_ModifyLocation(context->current_rt, SFLAG_INDRAWABLE, FALSE);
-
- This->isInDraw = oldInDraw;
- }
- }
-
- context->draw_buffer_dirty = TRUE;
- context->current_rt = target;
-
return context;
}
@@ -2081,10 +1874,10 @@ retry:
static void context_apply_draw_buffer(struct wined3d_context *context, BOOL blit)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
- IWineD3DSurface *rt = context->current_rt;
+ IWineD3DSurfaceImpl *rt = context->current_rt;
IWineD3DDeviceImpl *device;
- device = ((IWineD3DSurfaceImpl *)rt)->resource.device;
+ device = rt->resource.device;
if (!surface_is_offscreen(rt))
{
ENTER_GL();
@@ -2099,6 +1892,16 @@ static void context_apply_draw_buffer(struct wined3d_context *context, BOOL blit
{
if (!blit)
{
+ unsigned int i;
+
+ for (i = 0; i < gl_info->limits.buffers; ++i)
+ {
+ if (device->render_targets[i])
+ device->draw_buffers[i] = GL_COLOR_ATTACHMENT0 + i;
+ else
+ device->draw_buffers[i] = GL_NONE;
+ }
+
if (gl_info->supported[ARB_DRAW_BUFFERS])
{
GL_EXTCALL(glDrawBuffersARB(gl_info->limits.buffers, device->draw_buffers));
@@ -2131,116 +1934,268 @@ void context_set_draw_buffer(struct wined3d_context *context, GLenum buffer)
context->draw_buffer_dirty = TRUE;
}
+static inline void context_set_render_offscreen(struct wined3d_context *context, const struct StateEntry *StateTable,
+ BOOL offscreen)
+{
+ if (context->render_offscreen == offscreen) return;
+
+ Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION), StateTable);
+ Context_MarkStateDirty(context, STATE_VDECL, StateTable);
+ Context_MarkStateDirty(context, STATE_VIEWPORT, StateTable);
+ Context_MarkStateDirty(context, STATE_SCISSORRECT, StateTable);
+ Context_MarkStateDirty(context, STATE_FRONTFACE, StateTable);
+ context->render_offscreen = offscreen;
+}
+
+static BOOL match_depth_stencil_format(const struct wined3d_format_desc *existing,
+ const struct wined3d_format_desc *required)
+{
+ short existing_depth, existing_stencil, required_depth, required_stencil;
+
+ if(existing == required) return TRUE;
+ if((existing->Flags & WINED3DFMT_FLAG_FLOAT) != (required->Flags & WINED3DFMT_FLAG_FLOAT)) return FALSE;
+
+ getDepthStencilBits(existing, &existing_depth, &existing_stencil);
+ getDepthStencilBits(required, &required_depth, &required_stencil);
+
+ if(existing_depth < required_depth) return FALSE;
+ /* If stencil bits are used the exact amount is required - otherwise wrapping
+ * won't work correctly */
+ if(required_stencil && required_stencil != existing_stencil) return FALSE;
+ return TRUE;
+}
+/* The caller provides a context */
+static void context_validate_onscreen_formats(IWineD3DDeviceImpl *device,
+ struct wined3d_context *context, IWineD3DSurfaceImpl *depth_stencil)
+{
+ /* Onscreen surfaces are always in a swapchain */
+ IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)context->current_rt->container;
+
+ if (context->render_offscreen || !depth_stencil) return;
+ if (match_depth_stencil_format(swapchain->ds_format, depth_stencil->resource.format_desc)) return;
+
+ /* TODO: If the requested format would satisfy the needs of the existing one(reverse match),
+ * or no onscreen depth buffer was created, the OpenGL drawable could be changed to the new
+ * format. */
+ WARN("Depth stencil format is not supported by WGL, rendering the backbuffer in an FBO\n");
+
+ /* The currently active context is the necessary context to access the swapchain's onscreen buffers */
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)context->current_rt, SFLAG_INTEXTURE, NULL);
+ swapchain->render_to_fbo = TRUE;
+ context_set_render_offscreen(context, device->StateTable, TRUE);
+}
+
/* Context activation is done by the caller. */
-static void context_apply_state(struct wined3d_context *context, IWineD3DDeviceImpl *device, enum ContextUsage usage)
+void context_apply_blit_state(struct wined3d_context *context, IWineD3DDeviceImpl *device)
+{
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
+ context_validate_onscreen_formats(device, context, NULL);
+
+ if (context->render_offscreen)
+ {
+ FIXME("Applying blit state for an offscreen target with ORM_FBO. This should be avoided.\n");
+ surface_internal_preload(context->current_rt, SRGB_RGB);
+
+ ENTER_GL();
+ context_apply_fbo_state_blit(context, GL_FRAMEBUFFER, context->current_rt, NULL);
+ LEAVE_GL();
+ }
+ else
+ {
+ ENTER_GL();
+ context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
+ LEAVE_GL();
+ }
+
+ context->draw_buffer_dirty = TRUE;
+ }
+
+ if (context->draw_buffer_dirty)
+ {
+ context_apply_draw_buffer(context, TRUE);
+ if (wined3d_settings.offscreen_rendering_mode != ORM_FBO)
+ context->draw_buffer_dirty = FALSE;
+ }
+
+ SetupForBlit(device, context);
+}
+
+/* Context activation is done by the caller. */
+void context_apply_clear_state(struct wined3d_context *context, IWineD3DDeviceImpl *device,
+ IWineD3DSurfaceImpl *render_target, IWineD3DSurfaceImpl *depth_stencil)
+{
+ const struct StateEntry *state_table = device->StateTable;
+ GLenum buffer;
+
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
+ context_validate_onscreen_formats(device, context, depth_stencil);
+
+ ENTER_GL();
+ context_apply_fbo_state_blit(context, GL_FRAMEBUFFER, render_target, depth_stencil);
+ LEAVE_GL();
+ }
+
+ if (!surface_is_offscreen(render_target))
+ buffer = surface_get_gl_buffer(render_target);
+ else if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ buffer = GL_COLOR_ATTACHMENT0;
+ else
+ buffer = device->offscreenBuffer;
+
+ ENTER_GL();
+ context_set_draw_buffer(context, buffer);
+ LEAVE_GL();
+
+ if (context->last_was_blit)
+ {
+ device->frag_pipe->enable_extension((IWineD3DDevice *)device, TRUE);
+ }
+
+ /* Blending and clearing should be orthogonal, but tests on the nvidia
+ * driver show that disabling blending when clearing improves the clearing
+ * performance incredibly. */
+ ENTER_GL();
+ glDisable(GL_BLEND);
+ glEnable(GL_SCISSOR_TEST);
+ checkGLcall("glEnable GL_SCISSOR_TEST");
+ LEAVE_GL();
+
+ context->last_was_blit = FALSE;
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_table);
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), state_table);
+ Context_MarkStateDirty(context, STATE_SCISSORRECT, state_table);
+}
+
+/* Context activation is done by the caller. */
+void context_apply_draw_state(struct wined3d_context *context, IWineD3DDeviceImpl *device)
{
const struct StateEntry *state_table = device->StateTable;
unsigned int i;
- switch (usage) {
- case CTXUSAGE_CLEAR:
- case CTXUSAGE_DRAWPRIM:
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
- ENTER_GL();
- context_apply_fbo_state(context);
- LEAVE_GL();
- }
- if (context->draw_buffer_dirty) {
- context_apply_draw_buffer(context, FALSE);
- context->draw_buffer_dirty = FALSE;
- }
- break;
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
+ context_validate_onscreen_formats(device, context, device->depth_stencil);
- case CTXUSAGE_BLIT:
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
- 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);
- context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, NULL, FALSE);
- LEAVE_GL();
- } else {
- ENTER_GL();
- context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
- LEAVE_GL();
- }
- context->draw_buffer_dirty = TRUE;
- }
- if (context->draw_buffer_dirty) {
- context_apply_draw_buffer(context, TRUE);
- if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) {
- context->draw_buffer_dirty = FALSE;
- }
- }
- break;
-
- default:
- break;
+ if (!context->render_offscreen)
+ {
+ ENTER_GL();
+ context_apply_fbo_state(context, GL_FRAMEBUFFER, NULL, NULL);
+ LEAVE_GL();
+ }
+ else
+ {
+ ENTER_GL();
+ context_apply_fbo_state(context, GL_FRAMEBUFFER, device->render_targets, device->depth_stencil);
+ LEAVE_GL();
+ }
}
- switch(usage) {
- case CTXUSAGE_RESOURCELOAD:
- /* This does not require any special states to be set up */
- break;
+ if (context->draw_buffer_dirty)
+ {
+ context_apply_draw_buffer(context, FALSE);
+ context->draw_buffer_dirty = FALSE;
+ }
- case CTXUSAGE_CLEAR:
- if(context->last_was_blit) {
- device->frag_pipe->enable_extension((IWineD3DDevice *)device, TRUE);
- }
+ if (context->last_was_blit)
+ {
+ device->frag_pipe->enable_extension((IWineD3DDevice *)device, TRUE);
+ }
- /* Blending and clearing should be orthogonal, but tests on the nvidia driver show that disabling
- * blending when clearing improves the clearing performance incredibly.
- */
- ENTER_GL();
- glDisable(GL_BLEND);
- LEAVE_GL();
- Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_table);
+ IWineD3DDeviceImpl_FindTexUnitMap(device);
+ device_preload_textures(device);
+ if (isStateDirty(context, STATE_VDECL))
+ device_update_stream_info(device, context->gl_info);
- ENTER_GL();
- glEnable(GL_SCISSOR_TEST);
- checkGLcall("glEnable GL_SCISSOR_TEST");
- LEAVE_GL();
- context->last_was_blit = FALSE;
- Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), state_table);
- Context_MarkStateDirty(context, STATE_SCISSORRECT, state_table);
- break;
+ ENTER_GL();
+ for (i = 0; i < context->numDirtyEntries; ++i)
+ {
+ DWORD rep = context->dirtyArray[i];
+ DWORD idx = rep / (sizeof(*context->isStateDirty) * CHAR_BIT);
+ BYTE shift = rep & ((sizeof(*context->isStateDirty) * CHAR_BIT) - 1);
+ context->isStateDirty[idx] &= ~(1 << shift);
+ state_table[rep].apply(rep, device->stateBlock, context);
+ }
+ LEAVE_GL();
+ context->numDirtyEntries = 0; /* This makes the whole list clean */
+ context->last_was_blit = FALSE;
+}
- case CTXUSAGE_DRAWPRIM:
- /* This needs all dirty states applied */
- if(context->last_was_blit) {
- device->frag_pipe->enable_extension((IWineD3DDevice *)device, TRUE);
- }
+static void context_setup_target(IWineD3DDeviceImpl *device,
+ struct wined3d_context *context, IWineD3DSurfaceImpl *target)
+{
+ BOOL old_render_offscreen = context->render_offscreen, render_offscreen;
+ const struct StateEntry *StateTable = device->StateTable;
- IWineD3DDeviceImpl_FindTexUnitMap(device);
- device_preload_textures(device);
- if (isStateDirty(context, STATE_VDECL))
- device_update_stream_info(device, context->gl_info);
+ if (!target) return;
+ else if (context->current_rt == target) return;
+ render_offscreen = surface_is_offscreen(target);
- ENTER_GL();
- for (i = 0; i < context->numDirtyEntries; ++i)
+ context_set_render_offscreen(context, StateTable, render_offscreen);
+
+ /* To compensate the lack of format switching with some offscreen rendering methods and on onscreen buffers
+ * the alpha blend state changes with different render target formats. */
+ if (!context->current_rt)
+ {
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
+ }
+ else
+ {
+ const struct wined3d_format_desc *old = context->current_rt->resource.format_desc;
+ const struct wined3d_format_desc *new = target->resource.format_desc;
+
+ if (old->format != new->format)
+ {
+ /* Disable blending when the alpha mask has changed and when a format doesn't support blending. */
+ if ((old->alpha_mask && !new->alpha_mask) || (!old->alpha_mask && new->alpha_mask)
+ || !(new->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING))
{
- DWORD rep = context->dirtyArray[i];
- DWORD idx = rep / (sizeof(*context->isStateDirty) * CHAR_BIT);
- BYTE shift = rep & ((sizeof(*context->isStateDirty) * CHAR_BIT) - 1);
- context->isStateDirty[idx] &= ~(1 << shift);
- state_table[rep].apply(rep, device->stateBlock, context);
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
}
- LEAVE_GL();
- context->numDirtyEntries = 0; /* This makes the whole list clean */
- context->last_was_blit = FALSE;
- break;
+ }
- case CTXUSAGE_BLIT:
- SetupForBlit(device, context);
- break;
+ /* When switching away from an offscreen render target, and we're not
+ * using FBOs, we have to read the drawable into the texture. This is
+ * done via PreLoad (and SFLAG_INDRAWABLE set on the surface). There
+ * are some things that need care though. PreLoad needs a GL context,
+ * and FindContext is called before the context is activated. It also
+ * has to be called with the old rendertarget active, otherwise a
+ * wrong drawable is read. */
+ if (wined3d_settings.offscreen_rendering_mode != ORM_FBO
+ && old_render_offscreen && context->current_rt != target)
+ {
+ BOOL oldInDraw = device->isInDraw;
- default:
- FIXME("Unexpected context usage requested\n");
+ /* surface_internal_preload() requires a context to load the
+ * texture, so it will call context_acquire(). Set isInDraw to true
+ * to signal surface_internal_preload() that it has a context. */
+
+ /* FIXME: This is just broken. There's no guarantee whatsoever
+ * that the currently active context, if any, is appropriate for
+ * reading back the render target. We should probably call
+ * context_set_current(context) here and then rely on
+ * context_acquire() doing the right thing. */
+ device->isInDraw = TRUE;
+
+ /* Read the back buffer of the old drawable into the destination texture. */
+ if (context->current_rt->texture_name_srgb)
+ {
+ surface_internal_preload(context->current_rt, SRGB_BOTH);
+ }
+ else
+ {
+ surface_internal_preload(context->current_rt, SRGB_RGB);
+ }
+
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)context->current_rt, SFLAG_INDRAWABLE, FALSE);
+
+ device->isInDraw = oldInDraw;
+ }
}
+
+ context->draw_buffer_dirty = TRUE;
+ context->current_rt = target;
}
/*****************************************************************************
@@ -2256,14 +2211,15 @@ static void context_apply_state(struct wined3d_context *context, IWineD3DDeviceI
* usage: Prepares the context for blitting, drawing or other actions
*
*****************************************************************************/
-struct wined3d_context *context_acquire(IWineD3DDeviceImpl *device, IWineD3DSurface *target, enum ContextUsage usage)
+struct wined3d_context *context_acquire(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *target)
{
struct wined3d_context *current_context = context_get_current();
struct wined3d_context *context;
- TRACE("device %p, target %p, usage %#x.\n", device, target, usage);
+ TRACE("device %p, target %p.\n", device, target);
context = FindContext(device, target);
+ context_setup_target(device, context, target);
context_enter(context);
if (!context->valid) return context;
@@ -2295,7 +2251,5 @@ struct wined3d_context *context_acquire(IWineD3DDeviceImpl *device, IWineD3DSurf
}
}
- context_apply_state(context, device, usage);
-
return context;
}
diff --git a/dll/directx/wine/wined3d/cubetexture.c b/dll/directx/wine/wined3d/cubetexture.c
index c5fa6ba280f..12acee26573 100644
--- a/dll/directx/wine/wined3d/cubetexture.c
+++ b/dll/directx/wine/wined3d/cubetexture.c
@@ -31,11 +31,12 @@ static void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3
{
/* Override the IWineD3DResource Preload method. */
IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
+ UINT sub_count = This->baseTexture.level_count * This->baseTexture.layer_count;
IWineD3DDeviceImpl *device = This->resource.device;
struct wined3d_context *context = NULL;
- unsigned int i, j;
BOOL srgb_mode;
BOOL *dirty;
+ UINT i;
switch (srgb)
{
@@ -66,25 +67,24 @@ static void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3
{
/* No danger of recursive calls, context_acquire() sets isInDraw to true
* when loading offscreen render targets into their texture. */
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
}
if (This->resource.format_desc->format == WINED3DFMT_P8_UINT
|| This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM)
{
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < sub_count; ++i)
{
- for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z; ++j)
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
+
+ if (palette9_changed(surface))
{
- if (palette9_changed((IWineD3DSurfaceImpl *)This->surfaces[j][i]))
- {
- TRACE("Reloading surface because the d3d8/9 palette was changed.\n");
- /* TODO: This is not necessarily needed with hw palettized texture support. */
- IWineD3DSurface_LoadLocation(This->surfaces[j][i], SFLAG_INSYSMEM, NULL);
- /* Make sure the texture is reloaded because of the palette change,
- * this kills performance though :( */
- IWineD3DSurface_ModifyLocation(This->surfaces[j][i], SFLAG_INTEXTURE, FALSE);
- }
+ TRACE("Reloading surface %p because the d3d8/9 palette was changed.\n", surface);
+ /* TODO: This is not necessarily needed with hw palettized texture support. */
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, NULL);
+ /* Make sure the texture is reloaded because of the palette change,
+ * this kills performance though :( */
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INTEXTURE, FALSE);
}
}
}
@@ -93,12 +93,9 @@ static void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3
* since the last load then reload the surfaces. */
if (*dirty)
{
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < sub_count; ++i)
{
- for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z; ++j)
- {
- IWineD3DSurface_LoadTexture(This->surfaces[j][i], srgb_mode);
- }
+ IWineD3DSurface_LoadTexture((IWineD3DSurface *)This->baseTexture.sub_resources[i], srgb_mode);
}
}
else
@@ -114,26 +111,24 @@ static void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3
static void cubetexture_cleanup(IWineD3DCubeTextureImpl *This)
{
- unsigned int i, j;
+ UINT sub_count = This->baseTexture.level_count * This->baseTexture.layer_count;
+ UINT i;
TRACE("(%p) : Cleaning up.\n", This);
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < sub_count; ++i)
{
- for (j = 0; j < 6; ++j)
- {
- IWineD3DSurface *surface = This->surfaces[j][i];
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
- if (surface)
- {
- /* Clean out the texture name we gave to the surface so that the
- * surface doesn't try and release it. */
- surface_set_texture_name(surface, 0, TRUE);
- surface_set_texture_name(surface, 0, FALSE);
- surface_set_texture_target(surface, 0);
- IWineD3DSurface_SetContainer(surface, NULL);
- IWineD3DSurface_Release(surface);
- }
+ if (surface)
+ {
+ /* Clean out the texture name we gave to the surface so that the
+ * surface doesn't try and release it. */
+ surface_set_texture_name(surface, 0, TRUE);
+ surface_set_texture_name(surface, 0, FALSE);
+ surface_set_texture_target(surface, 0);
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)surface, NULL);
+ IWineD3DSurface_Release((IWineD3DSurface *)surface);
}
}
basetexture_cleanup((IWineD3DBaseTexture *)This);
@@ -207,21 +202,25 @@ static void WINAPI IWineD3DCubeTextureImpl_PreLoad(IWineD3DCubeTexture *iface) {
cubetexture_internal_preload((IWineD3DBaseTexture *) iface, SRGB_ANY);
}
-static void WINAPI IWineD3DCubeTextureImpl_UnLoad(IWineD3DCubeTexture *iface) {
- unsigned int i, j;
+static void WINAPI IWineD3DCubeTextureImpl_UnLoad(IWineD3DCubeTexture *iface)
+{
IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
- TRACE("(%p)\n", This);
+ UINT sub_count = This->baseTexture.level_count * This->baseTexture.layer_count;
+ UINT i;
+
+ TRACE("iface %p.\n", iface);
/* Unload all the surfaces and reset the texture name. If UnLoad was called on the
* surface before, this one will be a NOP and vice versa. Unloading an unloaded
- * surface is fine
- */
- for (i = 0; i < This->baseTexture.levels; i++) {
- for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z ; j++) {
- IWineD3DSurface_UnLoad(This->surfaces[j][i]);
- surface_set_texture_name(This->surfaces[j][i], 0, TRUE);
- surface_set_texture_name(This->surfaces[j][i], 0, FALSE);
- }
+ * surface is fine. */
+
+ for (i = 0; i < sub_count; ++i)
+ {
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
+
+ IWineD3DSurface_UnLoad((IWineD3DSurface *)surface);
+ surface_set_texture_name(surface, 0, TRUE);
+ surface_set_texture_name(surface, 0, FALSE);
}
basetexture_unload((IWineD3DBaseTexture *)iface);
@@ -281,16 +280,19 @@ static HRESULT WINAPI IWineD3DCubeTextureImpl_BindTexture(IWineD3DCubeTexture *i
TRACE("(%p) : relay to BaseTexture\n", This);
hr = basetexture_bind((IWineD3DBaseTexture *)iface, srgb, &set_gl_texture_desc);
- if (set_gl_texture_desc && SUCCEEDED(hr)) {
- UINT i, j;
- for (i = 0; i < This->baseTexture.levels; ++i) {
- for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z; ++j) {
- if(This->baseTexture.is_srgb) {
- surface_set_texture_name(This->surfaces[j][i], This->baseTexture.texture_srgb.name, TRUE);
- } else {
- surface_set_texture_name(This->surfaces[j][i], This->baseTexture.texture_rgb.name, FALSE);
- }
- }
+ if (set_gl_texture_desc && SUCCEEDED(hr))
+ {
+ UINT sub_count = This->baseTexture.level_count * This->baseTexture.layer_count;
+ UINT i;
+
+ for (i = 0; i < sub_count; ++i)
+ {
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
+
+ if (This->baseTexture.is_srgb)
+ surface_set_texture_name(surface, This->baseTexture.texture_srgb.name, TRUE);
+ else
+ surface_set_texture_name(surface, This->baseTexture.texture_rgb.name, FALSE);
}
}
@@ -314,82 +316,102 @@ static BOOL WINAPI IWineD3DCubeTextureImpl_IsCondNP2(IWineD3DCubeTexture *iface)
/* *******************************************
IWineD3DCubeTexture IWineD3DCubeTexture parts follow
******************************************* */
-static HRESULT WINAPI IWineD3DCubeTextureImpl_GetLevelDesc(IWineD3DCubeTexture *iface, UINT Level, WINED3DSURFACE_DESC* pDesc) {
- IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
+static HRESULT WINAPI IWineD3DCubeTextureImpl_GetLevelDesc(IWineD3DCubeTexture *iface,
+ UINT level, WINED3DSURFACE_DESC *desc)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *surface;
- if (Level < This->baseTexture.levels) {
- TRACE("(%p) level (%d)\n", This, Level);
- return IWineD3DSurface_GetDesc(This->surfaces[0][Level], pDesc);
+ TRACE("iface %p, level %u, desc %p.\n", iface, level, desc);
+
+ if (!(surface = (IWineD3DSurface *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- WARN("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
- return WINED3DERR_INVALIDCALL;
+
+ return IWineD3DSurface_GetDesc(surface, desc);
}
-static HRESULT WINAPI IWineD3DCubeTextureImpl_GetCubeMapSurface(IWineD3DCubeTexture *iface, WINED3DCUBEMAP_FACES FaceType, UINT Level, IWineD3DSurface** ppCubeMapSurface) {
- IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
- HRESULT hr = WINED3DERR_INVALIDCALL;
+static HRESULT WINAPI IWineD3DCubeTextureImpl_GetCubeMapSurface(IWineD3DCubeTexture *iface,
+ WINED3DCUBEMAP_FACES face, UINT level, IWineD3DSurface **surface)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *s;
- if (Level < This->baseTexture.levels && FaceType <= WINED3DCUBEMAP_FACE_NEGATIVE_Z) {
- *ppCubeMapSurface = This->surfaces[FaceType][Level];
- IWineD3DSurface_AddRef(*ppCubeMapSurface);
+ TRACE("iface %p, face %u, level %u, surface %p.\n",
+ iface, face, level, surface);
- hr = WINED3D_OK;
- }
- if (WINED3D_OK == hr) {
- TRACE("(%p) -> faceType(%d) level(%d) returning surface@%p\n", This, FaceType, Level, This->surfaces[FaceType][Level]);
- } else {
- WARN("(%p) level(%d) overflow Levels(%d) Or FaceType(%d)\n", This, Level, This->baseTexture.levels, FaceType);
+ if (!(s = (IWineD3DSurface *)basetexture_get_sub_resource(texture, face, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- return hr;
+ IWineD3DSurface_AddRef(s);
+ *surface = s;
+
+ TRACE("Returning surface %p.\n", *surface);
+
+ return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DCubeTextureImpl_LockRect(IWineD3DCubeTexture *iface, WINED3DCUBEMAP_FACES FaceType, UINT Level, WINED3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) {
- HRESULT hr = WINED3DERR_INVALIDCALL;
- IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
+static HRESULT WINAPI IWineD3DCubeTextureImpl_LockRect(IWineD3DCubeTexture *iface,
+ WINED3DCUBEMAP_FACES face, UINT level, WINED3DLOCKED_RECT *locked_rect, const RECT *rect, DWORD flags)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *surface;
- if (Level < This->baseTexture.levels && FaceType <= WINED3DCUBEMAP_FACE_NEGATIVE_Z) {
- hr = IWineD3DSurface_LockRect(This->surfaces[FaceType][Level], pLockedRect, pRect, Flags);
+ TRACE("iface %p, face %u, level %u, locked_rect %p, rect %s, flags %#x.\n",
+ iface, face, level, locked_rect, wine_dbgstr_rect(rect), flags);
+
+ if (!(surface = (IWineD3DSurface *)basetexture_get_sub_resource(texture, face, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- if (WINED3D_OK == hr) {
- TRACE("(%p) -> faceType(%d) level(%d) returning memory@%p success(%u)\n", This, FaceType, Level, pLockedRect->pBits, hr);
- } else {
- WARN("(%p) level(%d) overflow Levels(%d) Or FaceType(%d)\n", This, Level, This->baseTexture.levels, FaceType);
- }
-
- return hr;
+ return IWineD3DSurface_LockRect(surface, locked_rect, rect, flags);
}
-static HRESULT WINAPI IWineD3DCubeTextureImpl_UnlockRect(IWineD3DCubeTexture *iface, WINED3DCUBEMAP_FACES FaceType, UINT Level) {
- HRESULT hr = WINED3DERR_INVALIDCALL;
- IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
+static HRESULT WINAPI IWineD3DCubeTextureImpl_UnlockRect(IWineD3DCubeTexture *iface,
+ WINED3DCUBEMAP_FACES face, UINT level)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *surface;
- if (Level < This->baseTexture.levels && FaceType <= WINED3DCUBEMAP_FACE_NEGATIVE_Z) {
- hr = IWineD3DSurface_UnlockRect(This->surfaces[FaceType][Level]);
+ TRACE("iface %p, face %u, level %u.\n",
+ iface, face, level);
+
+ if (!(surface = (IWineD3DSurface *)basetexture_get_sub_resource(texture, face, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- if (WINED3D_OK == hr) {
- TRACE("(%p) -> faceType(%d) level(%d) success(%u)\n", This, FaceType, Level, hr);
- } else {
- WARN("(%p) level(%d) overflow Levels(%d) Or FaceType(%d)\n", This, Level, This->baseTexture.levels, FaceType);
- }
- return hr;
+ return IWineD3DSurface_UnlockRect(surface);
}
-static HRESULT WINAPI IWineD3DCubeTextureImpl_AddDirtyRect(IWineD3DCubeTexture *iface, WINED3DCUBEMAP_FACES FaceType, CONST RECT* pDirtyRect) {
- HRESULT hr = WINED3DERR_INVALIDCALL;
- IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
- This->baseTexture.texture_rgb.dirty = TRUE;
- This->baseTexture.texture_srgb.dirty = TRUE;
- TRACE("(%p) : dirtyfication of faceType(%d) Level (0)\n", This, FaceType);
- if (FaceType <= WINED3DCUBEMAP_FACE_NEGATIVE_Z) {
- surface_add_dirty_rect(This->surfaces[FaceType][0], pDirtyRect);
- hr = WINED3D_OK;
- } else {
- WARN("(%p) overflow FaceType(%d)\n", This, FaceType);
+static HRESULT WINAPI IWineD3DCubeTextureImpl_AddDirtyRect(IWineD3DCubeTexture *iface,
+ WINED3DCUBEMAP_FACES face, const RECT *dirty_rect)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurfaceImpl *surface;
+
+ TRACE("iface %p, face %u, dirty_rect %s.\n",
+ iface, face, wine_dbgstr_rect(dirty_rect));
+
+ if (!(surface = (IWineD3DSurfaceImpl *)basetexture_get_sub_resource(texture, face, 0)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- return hr;
+
+ texture->baseTexture.texture_rgb.dirty = TRUE;
+ texture->baseTexture.texture_srgb.dirty = TRUE;
+ surface_add_dirty_rect(surface, dirty_rect);
+
+ return WINED3D_OK;
}
static const IWineD3DCubeTextureVtbl IWineD3DCubeTexture_Vtbl =
@@ -433,7 +455,7 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN
IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
{
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, gl_info);
UINT pow2_edge_length;
unsigned int i, j;
UINT tmp_w;
@@ -478,8 +500,8 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN
texture->lpVtbl = &IWineD3DCubeTexture_Vtbl;
- hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, WINED3DRTYPE_CUBETEXTURE,
- device, 0, usage, format_desc, pool, parent, parent_ops);
+ hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, 6, levels,
+ WINED3DRTYPE_CUBETEXTURE, device, 0, usage, format_desc, pool, parent, parent_ops);
if (FAILED(hr))
{
WARN("Failed to initialize basetexture, returning %#x\n", hr);
@@ -510,7 +532,7 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN
/* Generate all the surfaces. */
tmp_w = edge_length;
- for (i = 0; i < texture->baseTexture.levels; ++i)
+ for (i = 0; i < texture->baseTexture.level_count; ++i)
{
/* Create the 6 faces. */
for (j = 0; j < 6; ++j)
@@ -524,20 +546,22 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN
GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB,
};
+ UINT idx = j * texture->baseTexture.level_count + i;
+ IWineD3DSurface *surface;
hr = IWineD3DDeviceParent_CreateSurface(device->device_parent, parent, tmp_w, tmp_w,
- format, usage, pool, i /* Level */, j, &texture->surfaces[j][i]);
+ format, usage, pool, i /* Level */, j, &surface);
if (FAILED(hr))
{
FIXME("(%p) Failed to create surface, hr %#x.\n", texture, hr);
- texture->surfaces[j][i] = NULL;
cubetexture_cleanup(texture);
return hr;
}
- IWineD3DSurface_SetContainer(texture->surfaces[j][i], (IWineD3DBase *)texture);
- TRACE("Created surface level %u @ %p.\n", i, texture->surfaces[j][i]);
- surface_set_texture_target(texture->surfaces[j][i], cube_targets[j]);
+ IWineD3DSurface_SetContainer(surface, (IWineD3DBase *)texture);
+ surface_set_texture_target((IWineD3DSurfaceImpl *)surface, cube_targets[j]);
+ texture->baseTexture.sub_resources[idx] = (IWineD3DResourceImpl *)surface;
+ TRACE("Created surface level %u @ %p.\n", i, surface);
}
tmp_w = max(1, tmp_w >> 1);
}
diff --git a/dll/directx/wine/wined3d/device.c b/dll/directx/wine/wined3d/device.c
index 6682aa4635e..7eb9153fca9 100644
--- a/dll/directx/wine/wined3d/device.c
+++ b/dll/directx/wine/wined3d/device.c
@@ -34,7 +34,6 @@
#include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION This->adapter->gl_info
/* Define the default light parameters as specified by MSDN */
const WINED3DLIGHT WINED3D_default_light = {
@@ -213,7 +212,8 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
else
{
TRACE("Stream %u isn't UP, %p\n", element->input_slot, This->stateBlock->streamSource[element->input_slot]);
- data = buffer_get_memory(This->stateBlock->streamSource[element->input_slot], 0, &buffer_object);
+ data = buffer_get_memory(This->stateBlock->streamSource[element->input_slot],
+ &This->adapter->gl_info, &buffer_object);
/* Can't use vbo's if the base vertex index is negative. OpenGL doesn't accept negative offsets
* (or rather offsets bigger than the vbo, because the pointer is unsigned), so use system memory
@@ -224,7 +224,8 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
{
WARN("loadBaseVertexIndex is < 0 (%d), not using vbos\n", This->stateBlock->loadBaseVertexIndex);
buffer_object = 0;
- data = buffer_get_sysmem((struct wined3d_buffer *)This->stateBlock->streamSource[element->input_slot]);
+ data = buffer_get_sysmem((struct wined3d_buffer *)This->stateBlock->streamSource[element->input_slot],
+ &This->adapter->gl_info);
if ((UINT_PTR)data < -This->stateBlock->loadBaseVertexIndex * stride)
{
FIXME("System memory vertex data load offset is negative!\n");
@@ -305,6 +306,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
}
}
+ This->num_buffer_queries = 0;
if (!This->stateBlock->streamIsUP)
{
WORD map = stream_info->use_map;
@@ -314,6 +316,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
{
struct wined3d_stream_info_element *element;
struct wined3d_buffer *buffer;
+ struct wined3d_event_query *query;
if (!(map & 1)) continue;
@@ -325,7 +328,13 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
if (buffer->buffer_object != element->buffer_object)
{
element->buffer_object = 0;
- element->data = buffer_get_sysmem(buffer) + (ptrdiff_t)element->data;
+ element->data = buffer_get_sysmem(buffer, &This->adapter->gl_info) + (ptrdiff_t)element->data;
+ }
+
+ query = ((struct wined3d_buffer *) buffer)->query;
+ if(query)
+ {
+ This->buffer_queries[This->num_buffer_queries++] = query;
}
}
}
@@ -334,7 +343,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
static void stream_info_element_from_strided(const struct wined3d_gl_info *gl_info,
const struct WineDirect3DStridedData *strided, struct wined3d_stream_info_element *e)
{
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(strided->format, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(strided->format, gl_info);
e->format_desc = format_desc;
e->stride = strided->dwStride;
e->data = strided->lpData;
@@ -494,6 +503,95 @@ void device_preload_textures(IWineD3DDeviceImpl *device)
}
}
+BOOL device_context_add(IWineD3DDeviceImpl *device, struct wined3d_context *context)
+{
+ struct wined3d_context **new_array;
+
+ TRACE("Adding context %p.\n", context);
+
+ if (!device->contexts) new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*new_array));
+ else new_array = HeapReAlloc(GetProcessHeap(), 0, device->contexts, sizeof(*new_array) * (device->numContexts + 1));
+
+ if (!new_array)
+ {
+ ERR("Failed to grow the context array.\n");
+ return FALSE;
+ }
+
+ new_array[device->numContexts++] = context;
+ device->contexts = new_array;
+ return TRUE;
+}
+
+void device_context_remove(IWineD3DDeviceImpl *device, struct wined3d_context *context)
+{
+ struct wined3d_context **new_array;
+ BOOL found = FALSE;
+ UINT i;
+
+ TRACE("Removing context %p.\n", context);
+
+ for (i = 0; i < device->numContexts; ++i)
+ {
+ if (device->contexts[i] == context)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ ERR("Context %p doesn't exist in context array.\n", context);
+ return;
+ }
+
+ if (!--device->numContexts)
+ {
+ HeapFree(GetProcessHeap(), 0, device->contexts);
+ device->contexts = NULL;
+ return;
+ }
+
+ memmove(&device->contexts[i], &device->contexts[i + 1], (device->numContexts - i) * sizeof(*device->contexts));
+ new_array = HeapReAlloc(GetProcessHeap(), 0, device->contexts, device->numContexts * sizeof(*device->contexts));
+ if (!new_array)
+ {
+ ERR("Failed to shrink context array. Oh well.\n");
+ return;
+ }
+
+ device->contexts = new_array;
+}
+
+void device_get_draw_rect(IWineD3DDeviceImpl *device, RECT *rect)
+{
+ IWineD3DStateBlockImpl *stateblock = device->stateBlock;
+ WINED3DVIEWPORT *vp = &stateblock->viewport;
+
+ SetRect(rect, vp->X, vp->Y, vp->X + vp->Width, vp->Y + vp->Height);
+
+ if (stateblock->renderState[WINED3DRS_SCISSORTESTENABLE])
+ {
+ IntersectRect(rect, rect, &stateblock->scissorRect);
+ }
+}
+
+void device_switch_onscreen_ds(IWineD3DDeviceImpl *device,
+ struct wined3d_context *context, IWineD3DSurfaceImpl *depth_stencil)
+{
+ if (device->onscreen_depth_stencil)
+ {
+ surface_load_ds_location(device->onscreen_depth_stencil, context, SFLAG_DS_OFFSCREEN);
+ surface_modify_ds_location(device->onscreen_depth_stencil, SFLAG_DS_OFFSCREEN,
+ device->onscreen_depth_stencil->ds_current_size.cx,
+ device->onscreen_depth_stencil->ds_current_size.cy);
+ IWineD3DSurface_Release((IWineD3DSurface *)device->onscreen_depth_stencil);
+ }
+ device->onscreen_depth_stencil = depth_stencil;
+ IWineD3DSurface_AddRef((IWineD3DSurface *)device->onscreen_depth_stencil);
+}
+
/**********************************************************
* IUnknown parts follows
**********************************************************/
@@ -540,9 +638,17 @@ static ULONG WINAPI IWineD3DDeviceImpl_Release(IWineD3DDevice *iface) {
/* NOTE: You must release the parent if the object was created via a callback
** ***************************/
- if (!list_empty(&This->resources)) {
+ if (!list_empty(&This->resources))
+ {
+ IWineD3DResourceImpl *resource;
FIXME("(%p) Device released with resources still bound, acceptable but unexpected\n", This);
- dumpResources(&This->resources);
+
+ LIST_FOR_EACH_ENTRY(resource, &This->resources, IWineD3DResourceImpl, resource.resource_list_entry)
+ {
+ WINED3DRESOURCETYPE type = IWineD3DResource_GetType((IWineD3DResource *)resource);
+ FIXME("Leftover resource %p with type %s (%#x).\n",
+ resource, debug_d3dresourcetype(type), type);
+ }
}
if(This->contexts) ERR("Context array not freed!\n");
@@ -760,6 +866,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateRendertargetView(IWineD3DDevice *
{
struct wined3d_rendertarget_view *object;
+ TRACE("iface %p, resource %p, parent %p, rendertarget_view %p.\n",
+ iface, resource, parent, rendertarget_view);
+
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
if (!object)
{
@@ -767,12 +876,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateRendertargetView(IWineD3DDevice *
return E_OUTOFMEMORY;
}
- object->vtbl = &wined3d_rendertarget_view_vtbl;
- object->refcount = 1;
- IWineD3DResource_AddRef(resource);
- object->resource = resource;
- object->parent = parent;
+ wined3d_rendertarget_view_init(object, resource, parent);
+ TRACE("Created render target view %p.\n", object);
*rendertarget_view = (IWineD3DRendertargetView *)object;
return WINED3D_OK;
@@ -1030,11 +1136,39 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclaration(IWineD3DDevice
return WINED3D_OK;
}
-static unsigned int ConvertFvfToDeclaration(IWineD3DDeviceImpl *This, /* For the GL info, which has the type table */
- DWORD fvf, WINED3DVERTEXELEMENT** ppVertexElements) {
+struct wined3d_fvf_convert_state
+{
+ const struct wined3d_gl_info *gl_info;
+ WINED3DVERTEXELEMENT *elements;
+ UINT offset;
+ UINT idx;
+};
- unsigned int idx, idx2;
- unsigned int offset;
+static void append_decl_element(struct wined3d_fvf_convert_state *state,
+ WINED3DFORMAT format, WINED3DDECLUSAGE usage, UINT usage_idx)
+{
+ WINED3DVERTEXELEMENT *elements = state->elements;
+ const struct wined3d_format_desc *format_desc;
+ UINT offset = state->offset;
+ UINT idx = state->idx;
+
+ elements[idx].format = format;
+ elements[idx].input_slot = 0;
+ elements[idx].offset = offset;
+ elements[idx].output_slot = 0;
+ elements[idx].method = WINED3DDECLMETHOD_DEFAULT;
+ elements[idx].usage = usage;
+ elements[idx].usage_idx = usage_idx;
+
+ format_desc = getFormatDescEntry(format, state->gl_info);
+ state->offset += format_desc->component_count * format_desc->component_size;
+ ++state->idx;
+}
+
+static unsigned int ConvertFvfToDeclaration(IWineD3DDeviceImpl *This, /* For the GL info, which has the type table */
+ DWORD fvf, WINED3DVERTEXELEMENT **ppVertexElements)
+{
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
BOOL has_pos = (fvf & WINED3DFVF_POSITION_MASK) != 0;
BOOL has_blend = (fvf & WINED3DFVF_XYZB5) > WINED3DFVF_XYZRHW;
BOOL has_blend_idx = has_blend &&
@@ -1048,9 +1182,9 @@ static unsigned int ConvertFvfToDeclaration(IWineD3DDeviceImpl *This, /* For the
DWORD num_textures = (fvf & WINED3DFVF_TEXCOUNT_MASK) >> WINED3DFVF_TEXCOUNT_SHIFT;
DWORD texcoords = (fvf & 0xFFFF0000) >> 16;
- WINED3DVERTEXELEMENT *elements = NULL;
-
+ struct wined3d_fvf_convert_state state;
unsigned int size;
+ unsigned int idx;
DWORD num_blends = 1 + (((fvf & WINED3DFVF_XYZB5) - WINED3DFVF_XYZB1) >> 1);
if (has_blend_idx) num_blends--;
@@ -1058,112 +1192,84 @@ static unsigned int ConvertFvfToDeclaration(IWineD3DDeviceImpl *This, /* For the
size = has_pos + (has_blend && num_blends > 0) + has_blend_idx + has_normal +
has_psize + has_diffuse + has_specular + num_textures;
- /* convert the declaration */
- elements = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WINED3DVERTEXELEMENT));
- if (!elements) return ~0U;
+ state.gl_info = gl_info;
+ state.elements = HeapAlloc(GetProcessHeap(), 0, size * sizeof(*state.elements));
+ if (!state.elements) return ~0U;
+ state.offset = 0;
+ state.idx = 0;
- idx = 0;
- if (has_pos) {
- if (!has_blend && (fvf & WINED3DFVF_XYZRHW)) {
- elements[idx].format = WINED3DFMT_R32G32B32A32_FLOAT;
- elements[idx].usage = WINED3DDECLUSAGE_POSITIONT;
- }
- else if ((fvf & WINED3DFVF_XYZW) == WINED3DFVF_XYZW) {
- elements[idx].format = WINED3DFMT_R32G32B32A32_FLOAT;
- elements[idx].usage = WINED3DDECLUSAGE_POSITION;
- }
- else {
- elements[idx].format = WINED3DFMT_R32G32B32_FLOAT;
- elements[idx].usage = WINED3DDECLUSAGE_POSITION;
- }
- elements[idx].usage_idx = 0;
- idx++;
+ if (has_pos)
+ {
+ if (!has_blend && (fvf & WINED3DFVF_XYZRHW))
+ append_decl_element(&state, WINED3DFMT_R32G32B32A32_FLOAT, WINED3DDECLUSAGE_POSITIONT, 0);
+ else if ((fvf & WINED3DFVF_XYZW) == WINED3DFVF_XYZW)
+ append_decl_element(&state, WINED3DFMT_R32G32B32A32_FLOAT, WINED3DDECLUSAGE_POSITION, 0);
+ else
+ append_decl_element(&state, WINED3DFMT_R32G32B32_FLOAT, WINED3DDECLUSAGE_POSITION, 0);
}
- if (has_blend && (num_blends > 0)) {
- if (((fvf & WINED3DFVF_XYZB5) == WINED3DFVF_XYZB2) && (fvf & WINED3DFVF_LASTBETA_D3DCOLOR))
- elements[idx].format = WINED3DFMT_B8G8R8A8_UNORM;
- else {
- switch(num_blends) {
- case 1: elements[idx].format = WINED3DFMT_R32_FLOAT; break;
- case 2: elements[idx].format = WINED3DFMT_R32G32_FLOAT; break;
- case 3: elements[idx].format = WINED3DFMT_R32G32B32_FLOAT; break;
- case 4: elements[idx].format = WINED3DFMT_R32G32B32A32_FLOAT; break;
+
+ if (has_blend && (num_blends > 0))
+ {
+ if ((fvf & WINED3DFVF_XYZB5) == WINED3DFVF_XYZB2 && (fvf & WINED3DFVF_LASTBETA_D3DCOLOR))
+ append_decl_element(&state, WINED3DFMT_B8G8R8A8_UNORM, WINED3DDECLUSAGE_BLENDWEIGHT, 0);
+ else
+ {
+ switch (num_blends)
+ {
+ case 1:
+ append_decl_element(&state, WINED3DFMT_R32_FLOAT, WINED3DDECLUSAGE_BLENDWEIGHT, 0);
+ break;
+ case 2:
+ append_decl_element(&state, WINED3DFMT_R32G32_FLOAT, WINED3DDECLUSAGE_BLENDWEIGHT, 0);
+ break;
+ case 3:
+ append_decl_element(&state, WINED3DFMT_R32G32B32_FLOAT, WINED3DDECLUSAGE_BLENDWEIGHT, 0);
+ break;
+ case 4:
+ append_decl_element(&state, WINED3DFMT_R32G32B32A32_FLOAT, WINED3DDECLUSAGE_BLENDWEIGHT, 0);
+ break;
default:
ERR("Unexpected amount of blend values: %u\n", num_blends);
}
}
- elements[idx].usage = WINED3DDECLUSAGE_BLENDWEIGHT;
- elements[idx].usage_idx = 0;
- idx++;
}
- if (has_blend_idx) {
- if (fvf & WINED3DFVF_LASTBETA_UBYTE4 ||
- (((fvf & WINED3DFVF_XYZB5) == WINED3DFVF_XYZB2) && (fvf & WINED3DFVF_LASTBETA_D3DCOLOR)))
- elements[idx].format = WINED3DFMT_R8G8B8A8_UINT;
+
+ if (has_blend_idx)
+ {
+ if ((fvf & WINED3DFVF_LASTBETA_UBYTE4)
+ || ((fvf & WINED3DFVF_XYZB5) == WINED3DFVF_XYZB2 && (fvf & WINED3DFVF_LASTBETA_D3DCOLOR)))
+ append_decl_element(&state, WINED3DFMT_R8G8B8A8_UINT, WINED3DDECLUSAGE_BLENDINDICES, 0);
else if (fvf & WINED3DFVF_LASTBETA_D3DCOLOR)
- elements[idx].format = WINED3DFMT_B8G8R8A8_UNORM;
+ append_decl_element(&state, WINED3DFMT_B8G8R8A8_UNORM, WINED3DDECLUSAGE_BLENDINDICES, 0);
else
- elements[idx].format = WINED3DFMT_R32_FLOAT;
- elements[idx].usage = WINED3DDECLUSAGE_BLENDINDICES;
- elements[idx].usage_idx = 0;
- idx++;
+ append_decl_element(&state, WINED3DFMT_R32_FLOAT, WINED3DDECLUSAGE_BLENDINDICES, 0);
}
- if (has_normal) {
- elements[idx].format = WINED3DFMT_R32G32B32_FLOAT;
- elements[idx].usage = WINED3DDECLUSAGE_NORMAL;
- elements[idx].usage_idx = 0;
- idx++;
- }
- if (has_psize) {
- elements[idx].format = WINED3DFMT_R32_FLOAT;
- elements[idx].usage = WINED3DDECLUSAGE_PSIZE;
- elements[idx].usage_idx = 0;
- idx++;
- }
- if (has_diffuse) {
- elements[idx].format = WINED3DFMT_B8G8R8A8_UNORM;
- elements[idx].usage = WINED3DDECLUSAGE_COLOR;
- elements[idx].usage_idx = 0;
- idx++;
- }
- if (has_specular) {
- elements[idx].format = WINED3DFMT_B8G8R8A8_UNORM;
- elements[idx].usage = WINED3DDECLUSAGE_COLOR;
- elements[idx].usage_idx = 1;
- idx++;
- }
- for (idx2 = 0; idx2 < num_textures; idx2++) {
- unsigned int numcoords = (texcoords >> (idx2*2)) & 0x03;
- switch (numcoords) {
+
+ if (has_normal) append_decl_element(&state, WINED3DFMT_R32G32B32_FLOAT, WINED3DDECLUSAGE_NORMAL, 0);
+ if (has_psize) append_decl_element(&state, WINED3DFMT_R32_FLOAT, WINED3DDECLUSAGE_PSIZE, 0);
+ if (has_diffuse) append_decl_element(&state, WINED3DFMT_B8G8R8A8_UNORM, WINED3DDECLUSAGE_COLOR, 0);
+ if (has_specular) append_decl_element(&state, WINED3DFMT_B8G8R8A8_UNORM, WINED3DDECLUSAGE_COLOR, 1);
+
+ for (idx = 0; idx < num_textures; ++idx)
+ {
+ switch ((texcoords >> (idx * 2)) & 0x03)
+ {
case WINED3DFVF_TEXTUREFORMAT1:
- elements[idx].format = WINED3DFMT_R32_FLOAT;
+ append_decl_element(&state, WINED3DFMT_R32_FLOAT, WINED3DDECLUSAGE_TEXCOORD, idx);
break;
case WINED3DFVF_TEXTUREFORMAT2:
- elements[idx].format = WINED3DFMT_R32G32_FLOAT;
+ append_decl_element(&state, WINED3DFMT_R32G32_FLOAT, WINED3DDECLUSAGE_TEXCOORD, idx);
break;
case WINED3DFVF_TEXTUREFORMAT3:
- elements[idx].format = WINED3DFMT_R32G32B32_FLOAT;
+ append_decl_element(&state, WINED3DFMT_R32G32B32_FLOAT, WINED3DDECLUSAGE_TEXCOORD, idx);
break;
case WINED3DFVF_TEXTUREFORMAT4:
- elements[idx].format = WINED3DFMT_R32G32B32A32_FLOAT;
+ append_decl_element(&state, WINED3DFMT_R32G32B32A32_FLOAT, WINED3DDECLUSAGE_TEXCOORD, idx);
break;
}
- elements[idx].usage = WINED3DDECLUSAGE_TEXCOORD;
- elements[idx].usage_idx = idx2;
- idx++;
}
- /* Now compute offsets, and initialize the rest of the fields */
- for (idx = 0, offset = 0; idx < size; ++idx)
- {
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(elements[idx].format, &This->adapter->gl_info);
- elements[idx].input_slot = 0;
- elements[idx].method = WINED3DDECLMETHOD_DEFAULT;
- elements[idx].offset = offset;
- offset += format_desc->component_count * format_desc->component_size;
- }
-
- *ppVertexElements = elements;
+ *ppVertexElements = state.elements;
return size;
}
@@ -1282,35 +1388,27 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreatePalette(IWineD3DDevice *iface, DW
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
IWineD3DPaletteImpl *object;
HRESULT hr;
- TRACE("(%p)->(%x, %p, %p, %p)\n", This, Flags, PalEnt, Palette, Parent);
- /* Create the new object */
- object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DPaletteImpl));
- if(!object) {
- ERR("Out of memory when allocating memory for a IWineD3DPalette implementation\n");
+ TRACE("iface %p, flags %#x, entries %p, palette %p, parent %p.\n",
+ iface, Flags, PalEnt, Palette, Parent);
+
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+ if (!object)
+ {
+ ERR("Failed to allocate palette memory.\n");
return E_OUTOFMEMORY;
}
- object->lpVtbl = &IWineD3DPalette_Vtbl;
- object->ref = 1;
- object->Flags = Flags;
- object->parent = Parent;
- object->device = This;
- object->palNumEntries = IWineD3DPaletteImpl_Size(Flags);
- object->hpal = CreatePalette((const LOGPALETTE*)&(object->palVersion));
-
- if(!object->hpal) {
- HeapFree( GetProcessHeap(), 0, object);
- return E_OUTOFMEMORY;
- }
-
- hr = IWineD3DPalette_SetEntries((IWineD3DPalette *) object, 0, 0, IWineD3DPaletteImpl_Size(Flags), PalEnt);
- if(FAILED(hr)) {
- IWineD3DPalette_Release((IWineD3DPalette *) object);
+ hr = wined3d_palette_init(object, This, Flags, PalEnt, Parent);
+ if (FAILED(hr))
+ {
+ WARN("Failed to initialize palette, hr %#x.\n", hr);
+ HeapFree(GetProcessHeap(), 0, object);
return hr;
}
- *Palette = (IWineD3DPalette *) object;
+ TRACE("Created palette %p.\n", object);
+ *Palette = (IWineD3DPalette *)object;
return WINED3D_OK;
}
@@ -1429,6 +1527,30 @@ static void destroy_dummy_textures(IWineD3DDeviceImpl *device, const struct wine
memset(device->dummyTextureName, 0, gl_info->limits.textures * sizeof(*device->dummyTextureName));
}
+static HRESULT WINAPI IWineD3DDeviceImpl_AcquireFocusWindow(IWineD3DDevice *iface, HWND window)
+{
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface;
+
+ if (!wined3d_register_window(window, device))
+ {
+ ERR("Failed to register window %p.\n", window);
+ return E_FAIL;
+ }
+
+ device->focus_window = window;
+ SetForegroundWindow(window);
+
+ return WINED3D_OK;
+}
+
+static void WINAPI IWineD3DDeviceImpl_ReleaseFocusWindow(IWineD3DDevice *iface)
+{
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface;
+
+ if (device->focus_window) wined3d_unregister_window(device->focus_window);
+ device->focus_window = NULL;
+}
+
static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
WINED3DPRESENT_PARAMETERS *pPresentationParameters)
{
@@ -1445,17 +1567,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
if(This->d3d_initialized) return WINED3DERR_INVALIDCALL;
if(!This->adapter->opengl) return WINED3DERR_INVALIDCALL;
- if (!pPresentationParameters->Windowed)
- {
- This->focus_window = This->createParms.hFocusWindow;
- if (!This->focus_window) This->focus_window = pPresentationParameters->hDeviceWindow;
- if (!wined3d_register_window(This->focus_window, This))
- {
- ERR("Failed to register window %p.\n", This->focus_window);
- return E_FAIL;
- }
- }
-
TRACE("(%p) : Creating stateblock\n", This);
/* Creating the startup stateBlock - Note Special Case: 0 => Don't fill in yet! */
hr = IWineD3DDevice_CreateStateBlock(iface,
@@ -1471,7 +1582,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
IWineD3DStateBlock_AddRef((IWineD3DStateBlock*)This->updateStateBlock);
This->render_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
- sizeof(IWineD3DSurface *) * gl_info->limits.buffers);
+ sizeof(*This->render_targets) * gl_info->limits.buffers);
This->draw_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(GLenum) * gl_info->limits.buffers);
@@ -1509,8 +1620,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
}
}
- if (This->focus_window) SetFocus(This->focus_window);
-
/* Setup the implicit swapchain. This also initializes a context. */
TRACE("Creating implicit swapchain\n");
hr = IWineD3DDeviceParent_CreateSwapChain(This->device_parent,
@@ -1529,21 +1638,22 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
}
This->swapchains[0] = (IWineD3DSwapChain *) swapchain;
- if(swapchain->backBuffer && swapchain->backBuffer[0]) {
- TRACE("Setting rendertarget to %p\n", swapchain->backBuffer);
- This->render_targets[0] = swapchain->backBuffer[0];
+ if (swapchain->back_buffers && swapchain->back_buffers[0])
+ {
+ TRACE("Setting rendertarget to %p.\n", swapchain->back_buffers);
+ This->render_targets[0] = swapchain->back_buffers[0];
}
- else {
- TRACE("Setting rendertarget to %p\n", swapchain->frontBuffer);
- This->render_targets[0] = swapchain->frontBuffer;
+ else
+ {
+ TRACE("Setting rendertarget to %p.\n", swapchain->front_buffer);
+ This->render_targets[0] = swapchain->front_buffer;
}
- IWineD3DSurface_AddRef(This->render_targets[0]);
+ IWineD3DSurface_AddRef((IWineD3DSurface *)This->render_targets[0]);
/* Depth Stencil support */
- This->stencilBufferTarget = This->auto_depth_stencil_buffer;
- if (NULL != This->stencilBufferTarget) {
- IWineD3DSurface_AddRef(This->stencilBufferTarget);
- }
+ This->depth_stencil = This->auto_depth_stencil;
+ if (This->depth_stencil)
+ IWineD3DSurface_AddRef((IWineD3DSurface *)This->depth_stencil);
hr = This->shader_backend->shader_alloc_private(iface);
if(FAILED(hr)) {
@@ -1566,7 +1676,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
/* Setup all the devices defaults */
IWineD3DStateBlock_InitStartupStateBlock((IWineD3DStateBlock *)This->stateBlock);
- context = context_acquire(This, swapchain->frontBuffer, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This, swapchain->front_buffer);
create_dummy_textures(This);
@@ -1583,10 +1693,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
This->offscreenBuffer = GL_COLOR_ATTACHMENT0;
break;
- case ORM_PBUFFER:
- This->offscreenBuffer = GL_BACK;
- break;
-
case ORM_BACKBUFFER:
{
if (context_get_current()->aux_buffers > 0)
@@ -1645,7 +1751,6 @@ err_out:
if (This->shader_priv) {
This->shader_backend->shader_free_private(iface);
}
- if (This->focus_window) wined3d_unregister_window(This->focus_window);
return hr;
}
@@ -1702,7 +1807,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface,
/* I don't think that the interface guarantees that the device is destroyed from the same thread
* it was created. Thus make sure a context is active for the glDelete* calls
*/
- context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This, NULL);
gl_info = context->gl_info;
if(This->logo_surface) IWineD3DSurface_Release(This->logo_surface);
@@ -1720,9 +1825,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface,
}
}
- /* Delete the pbuffer context if there is any */
- if(This->pbufferContext) context_destroy(This, This->pbufferContext);
-
/* Delete the mouse cursor texture */
if(This->cursorTexture) {
ENTER_GL();
@@ -1781,26 +1883,33 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface,
This->shader_backend->shader_free_private(iface);
/* Release the buffers (with sanity checks)*/
- TRACE("Releasing the depth stencil buffer at %p\n", This->stencilBufferTarget);
- if(This->stencilBufferTarget != NULL && (IWineD3DSurface_Release(This->stencilBufferTarget) >0)){
- if(This->auto_depth_stencil_buffer != This->stencilBufferTarget)
- FIXME("(%p) Something's still holding the stencilBufferTarget\n",This);
+ if (This->onscreen_depth_stencil)
+ {
+ IWineD3DSurface_Release((IWineD3DSurface *)This->onscreen_depth_stencil);
+ This->onscreen_depth_stencil = NULL;
}
- This->stencilBufferTarget = NULL;
+
+ TRACE("Releasing the depth stencil buffer at %p\n", This->depth_stencil);
+ if (This->depth_stencil && IWineD3DSurface_Release((IWineD3DSurface *)This->depth_stencil))
+ {
+ if (This->auto_depth_stencil != This->depth_stencil)
+ FIXME("(%p) Something is still holding the depth/stencil buffer.\n",This);
+ }
+ This->depth_stencil = NULL;
TRACE("Releasing the render target at %p\n", This->render_targets[0]);
- if(IWineD3DSurface_Release(This->render_targets[0]) >0){
- /* This check is a bit silly, it should be in swapchain_release FIXME("(%p) Something's still holding the renderTarget\n",This); */
- }
+ IWineD3DSurface_Release((IWineD3DSurface *)This->render_targets[0]);
+
TRACE("Setting rendertarget to NULL\n");
This->render_targets[0] = NULL;
- if (This->auto_depth_stencil_buffer) {
- if (IWineD3DSurface_Release(This->auto_depth_stencil_buffer) > 0)
+ if (This->auto_depth_stencil)
+ {
+ if (IWineD3DSurface_Release((IWineD3DSurface *)This->auto_depth_stencil))
{
FIXME("(%p) Something's still holding the auto depth stencil buffer\n", This);
}
- This->auto_depth_stencil_buffer = NULL;
+ This->auto_depth_stencil = NULL;
}
context_release(context);
@@ -1828,8 +1937,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface,
This->d3d_initialized = FALSE;
- if (This->focus_window) wined3d_unregister_window(This->focus_window);
-
return WINED3D_OK;
}
@@ -1867,8 +1974,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetDisplayMode(IWineD3DDevice *iface, U
const WINED3DDISPLAYMODE* pMode) {
DEVMODEW devmode;
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(pMode->Format, &This->adapter->gl_info);
LONG ret;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(pMode->Format, &This->adapter->gl_info);
RECT clip_rc;
TRACE("(%p)->(%d,%p) Mode=%dx%dx@%d, %s\n", This, iSwapChain, pMode, pMode->Width, pMode->Height, pMode->RefreshRate, debug_d3dformat(pMode->Format));
@@ -2982,7 +3089,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetVertexShaderConstantI(
TRACE("(iface %p, dstData %p, start %d, count %d)\n",
iface, dstData, start, count);
- if (dstData == NULL || ((signed int) MAX_CONST_I - (signed int) start) <= (signed int) 0)
+ if (dstData == NULL || ((signed int) MAX_CONST_I - (signed int) start) <= 0)
return WINED3DERR_INVALIDCALL;
memcpy(dstData, &This->stateBlock->vertexShaderConstantI[start * 4], cnt * sizeof(int) * 4);
@@ -3469,9 +3576,8 @@ static HRESULT process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIn
/* We might access VBOs from this code, so hold the lock */
ENTER_GL();
- if (dest->resource.allocatedMemory == NULL) {
- buffer_get_sysmem(dest);
- }
+ if (!dest->resource.allocatedMemory)
+ buffer_get_sysmem(dest, gl_info);
/* Get a pointer into the destination vbo(create one if none exists) and
* write correct opengl data into it. It's cheap and allows us to run drawStridedFast
@@ -3518,7 +3624,7 @@ static HRESULT process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIn
FIXME("Clipping is broken and disabled for now\n");
}
} else doClip = FALSE;
- dest_ptr = ((char *) buffer_get_sysmem(dest)) + dwDestIndex * get_flexible_vertex_size(DestFVF);
+ dest_ptr = ((char *)buffer_get_sysmem(dest, gl_info)) + dwDestIndex * get_flexible_vertex_size(DestFVF);
IWineD3DDevice_GetTransform( (IWineD3DDevice *) This,
WINED3DTS_VIEW,
@@ -3794,6 +3900,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface,
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
struct wined3d_stream_info stream_info;
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
BOOL vbo = FALSE, streamWasUP = This->stateBlock->streamIsUP;
HRESULT hr;
@@ -3805,7 +3912,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface,
}
/* Need any context to write to the vbo. */
- context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This, NULL);
+ gl_info = context->gl_info;
/* ProcessVertices reads from vertex buffers, which have to be assigned. DrawPrimitive and DrawPrimitiveUP
* control the streamIsUP flag, thus restore it afterwards.
@@ -3832,7 +3940,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface,
{
struct wined3d_buffer *vb = (struct wined3d_buffer *)This->stateBlock->streamSource[e->stream_idx];
e->buffer_object = 0;
- e->data = (BYTE *)((unsigned long)e->data + (unsigned long)buffer_get_sysmem(vb));
+ e->data = (BYTE *)((ULONG_PTR)e->data + (ULONG_PTR)buffer_get_sysmem(vb, gl_info));
ENTER_GL();
GL_EXTCALL(glDeleteBuffersARB(1, &vb->buffer_object));
vb->buffer_object = 0;
@@ -4218,7 +4326,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_EndScene(IWineD3DDevice *iface)
return WINED3DERR_INVALIDCALL;
}
- context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This, NULL);
/* We only have to do this if we need to read the, swapbuffers performs a flush for us */
wglFlush();
/* No checkGLcall here to avoid locking the lock just for checking a call that hardly ever
@@ -4250,18 +4358,81 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Present(IWineD3DDevice *iface,
return WINED3D_OK;
}
+static BOOL is_full_clear(IWineD3DSurfaceImpl *target, const RECT *draw_rect, const RECT *clear_rect)
+{
+ /* partial draw rect */
+ if (draw_rect->left || draw_rect->top
+ || draw_rect->right < target->currentDesc.Width
+ || draw_rect->bottom < target->currentDesc.Height)
+ return FALSE;
+
+ /* partial clear rect */
+ if (clear_rect && (clear_rect->left > 0 || clear_rect->top > 0
+ || clear_rect->right < target->currentDesc.Width
+ || clear_rect->bottom < target->currentDesc.Height))
+ return FALSE;
+
+ return TRUE;
+}
+
+static void prepare_ds_clear(IWineD3DSurfaceImpl *ds, struct wined3d_context *context,
+ DWORD location, const RECT *draw_rect, UINT rect_count, const RECT *clear_rect)
+{
+ RECT current_rect, r;
+
+ if (ds->Flags & location)
+ SetRect(¤t_rect, 0, 0,
+ ds->ds_current_size.cx,
+ ds->ds_current_size.cy);
+ else
+ SetRectEmpty(¤t_rect);
+
+ IntersectRect(&r, draw_rect, ¤t_rect);
+ if (EqualRect(&r, draw_rect))
+ {
+ /* current_rect ⊇ draw_rect, modify only. */
+ surface_modify_ds_location(ds, location, ds->ds_current_size.cx, ds->ds_current_size.cy);
+ return;
+ }
+
+ if (EqualRect(&r, ¤t_rect))
+ {
+ /* draw_rect ⊇ current_rect, test if we're doing a full clear. */
+
+ if (!clear_rect)
+ {
+ /* Full clear, modify only. */
+ surface_modify_ds_location(ds, location, draw_rect->right, draw_rect->bottom);
+ return;
+ }
+
+ IntersectRect(&r, draw_rect, clear_rect);
+ if (EqualRect(&r, draw_rect))
+ {
+ /* clear_rect ⊇ draw_rect, modify only. */
+ surface_modify_ds_location(ds, location, draw_rect->right, draw_rect->bottom);
+ return;
+ }
+ }
+
+ /* Full load. */
+ surface_load_ds_location(ds, context, location);
+ surface_modify_ds_location(ds, location, ds->ds_current_size.cx, ds->ds_current_size.cy);
+}
+
/* Not called from the VTable (internal subroutine) */
-HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, DWORD Count,
- CONST WINED3DRECT* pRects, DWORD Flags, WINED3DCOLOR Color,
- float Z, DWORD Stencil) {
+HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, DWORD Count,
+ const WINED3DRECT *pRects, DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil)
+{
+ const RECT *clear_rect = (Count > 0 && pRects) ? (const RECT *)pRects : NULL;
+ IWineD3DSurfaceImpl *depth_stencil = This->depth_stencil;
GLbitfield glMask = 0;
unsigned int i;
- WINED3DRECT curRect;
- RECT vp_rect;
- const WINED3DVIEWPORT *vp = &This->stateBlock->viewport;
UINT drawable_width, drawable_height;
- IWineD3DSurfaceImpl *depth_stencil = (IWineD3DSurfaceImpl *) This->stencilBufferTarget;
struct wined3d_context *context;
+ RECT draw_rect;
+
+ device_get_draw_rect(This, &draw_rect);
/* When we're clearing parts of the drawable, make sure that the target surface is well up to date in the
* drawable. After the clear we'll mark the drawable up to date, so we have to make sure that this is true
@@ -4272,132 +4443,119 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
* the drawable up to date. We have to check all settings that limit the clear area though. Do not bother
* checking all this if the dest surface is in the drawable anyway.
*/
- if((Flags & WINED3DCLEAR_TARGET) && !(target->Flags & SFLAG_INDRAWABLE)) {
- while(1) {
- if(vp->X != 0 || vp->Y != 0 ||
- vp->Width < target->currentDesc.Width || vp->Height < target->currentDesc.Height) {
- IWineD3DSurface_LoadLocation((IWineD3DSurface *) target, SFLAG_INDRAWABLE, NULL);
- break;
- }
- if(This->stateBlock->renderState[WINED3DRS_SCISSORTESTENABLE] && (
- This->stateBlock->scissorRect.left > 0 || This->stateBlock->scissorRect.top > 0 ||
- This->stateBlock->scissorRect.right < target->currentDesc.Width ||
- This->stateBlock->scissorRect.bottom < target->currentDesc.Height)) {
- IWineD3DSurface_LoadLocation((IWineD3DSurface *) target, SFLAG_INDRAWABLE, NULL);
- break;
- }
- if(Count > 0 && pRects && (
- pRects[0].x1 > 0 || pRects[0].y1 > 0 ||
- pRects[0].x2 < target->currentDesc.Width ||
- pRects[0].y2 < target->currentDesc.Height)) {
- IWineD3DSurface_LoadLocation((IWineD3DSurface *) target, SFLAG_INDRAWABLE, NULL);
- break;
- }
- break;
- }
+ if (Flags & WINED3DCLEAR_TARGET && !(target->Flags & SFLAG_INDRAWABLE))
+ {
+ if (!is_full_clear(target, &draw_rect, clear_rect))
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)target, SFLAG_INDRAWABLE, NULL);
}
- context = context_acquire(This, (IWineD3DSurface *)target, CTXUSAGE_CLEAR);
+ context = context_acquire(This, target);
+ if (!context->valid)
+ {
+ context_release(context);
+ WARN("Invalid context, skipping clear.\n");
+ return WINED3D_OK;
+ }
+
+ context_apply_clear_state(context, This, target, depth_stencil);
target->get_drawable_size(context, &drawable_width, &drawable_height);
ENTER_GL();
/* Only set the values up once, as they are not changing */
- if (Flags & WINED3DCLEAR_STENCIL) {
+ if (Flags & WINED3DCLEAR_STENCIL)
+ {
+ if (context->gl_info->supported[EXT_STENCIL_TWO_SIDE])
+ {
+ glDisable(GL_STENCIL_TEST_TWO_SIDE_EXT);
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_TWOSIDEDSTENCILMODE));
+ }
+ glStencilMask(~0U);
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_STENCILWRITEMASK));
glClearStencil(Stencil);
checkGLcall("glClearStencil");
glMask = glMask | GL_STENCIL_BUFFER_BIT;
- glStencilMask(0xFFFFFFFF);
}
- if (Flags & WINED3DCLEAR_ZBUFFER) {
+ if (Flags & WINED3DCLEAR_ZBUFFER)
+ {
DWORD location = context->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN;
+
+ if (location == SFLAG_DS_ONSCREEN && depth_stencil != This->onscreen_depth_stencil)
+ device_switch_onscreen_ds(This, context, depth_stencil);
+ prepare_ds_clear(depth_stencil, context, location, &draw_rect, Count, clear_rect);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)depth_stencil, SFLAG_INDRAWABLE, TRUE);
+
glDepthMask(GL_TRUE);
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ZWRITEENABLE));
glClearDepth(Z);
checkGLcall("glClearDepth");
glMask = glMask | GL_DEPTH_BUFFER_BIT;
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ZWRITEENABLE));
-
- if (vp->X != 0 || vp->Y != 0 ||
- vp->Width < depth_stencil->currentDesc.Width || vp->Height < depth_stencil->currentDesc.Height) {
- surface_load_ds_location(This->stencilBufferTarget, context, location);
- }
- else if (This->stateBlock->renderState[WINED3DRS_SCISSORTESTENABLE] && (
- This->stateBlock->scissorRect.left > 0 || This->stateBlock->scissorRect.top > 0 ||
- This->stateBlock->scissorRect.right < depth_stencil->currentDesc.Width ||
- This->stateBlock->scissorRect.bottom < depth_stencil->currentDesc.Height)) {
- surface_load_ds_location(This->stencilBufferTarget, context, location);
- }
- else if (Count > 0 && pRects && (
- pRects[0].x1 > 0 || pRects[0].y1 > 0 ||
- pRects[0].x2 < depth_stencil->currentDesc.Width ||
- pRects[0].y2 < depth_stencil->currentDesc.Height)) {
- surface_load_ds_location(This->stencilBufferTarget, context, location);
- }
}
- if (Flags & WINED3DCLEAR_TARGET) {
- TRACE("Clearing screen with glClear to color %x\n", Color);
- glClearColor(D3DCOLOR_R(Color),
- D3DCOLOR_G(Color),
- D3DCOLOR_B(Color),
- D3DCOLOR_A(Color));
- checkGLcall("glClearColor");
+ if (Flags & WINED3DCLEAR_TARGET)
+ {
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)target, SFLAG_INDRAWABLE, TRUE);
- /* Clear ALL colors! */
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE1));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE2));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE3));
+ glClearColor(D3DCOLOR_R(Color), D3DCOLOR_G(Color), D3DCOLOR_B(Color), D3DCOLOR_A(Color));
+ checkGLcall("glClearColor");
glMask = glMask | GL_COLOR_BUFFER_BIT;
}
- vp_rect.left = vp->X;
- vp_rect.top = vp->Y;
- vp_rect.right = vp->X + vp->Width;
- vp_rect.bottom = vp->Y + vp->Height;
- if (!(Count > 0 && pRects)) {
- if(This->stateBlock->renderState[WINED3DRS_SCISSORTESTENABLE]) {
- IntersectRect(&vp_rect, &vp_rect, &This->stateBlock->scissorRect);
- }
+ if (!clear_rect)
+ {
if (context->render_offscreen)
{
- glScissor(vp_rect.left, vp_rect.top,
- vp_rect.right - vp_rect.left, vp_rect.bottom - vp_rect.top);
- } else {
- glScissor(vp_rect.left, drawable_height - vp_rect.bottom,
- vp_rect.right - vp_rect.left, vp_rect.bottom - vp_rect.top);
+ glScissor(draw_rect.left, draw_rect.top,
+ draw_rect.right - draw_rect.left, draw_rect.bottom - draw_rect.top);
+ }
+ else
+ {
+ glScissor(draw_rect.left, drawable_height - draw_rect.bottom,
+ draw_rect.right - draw_rect.left, draw_rect.bottom - draw_rect.top);
}
checkGLcall("glScissor");
glClear(glMask);
checkGLcall("glClear");
- } else {
- /* Now process each rect in turn */
- for (i = 0; i < Count; i++) {
+ }
+ else
+ {
+ RECT current_rect;
+
+ /* Now process each rect in turn. */
+ for (i = 0; i < Count; ++i)
+ {
/* Note gl uses lower left, width/height */
- IntersectRect((RECT *)&curRect, &vp_rect, (const RECT *)&pRects[i]);
- if(This->stateBlock->renderState[WINED3DRS_SCISSORTESTENABLE]) {
- IntersectRect((RECT *) &curRect, (RECT *) &curRect, &This->stateBlock->scissorRect);
- }
- TRACE("(%p) Rect=(%d,%d)->(%d,%d) glRect=(%d,%d), len=%d, hei=%d\n", This,
- pRects[i].x1, pRects[i].y1, pRects[i].x2, pRects[i].y2,
- curRect.x1, (target->currentDesc.Height - curRect.y2),
- curRect.x2 - curRect.x1, curRect.y2 - curRect.y1);
+ IntersectRect(¤t_rect, &draw_rect, &clear_rect[i]);
+
+ TRACE("clear_rect[%u] %s, current_rect %s.\n", i,
+ wine_dbgstr_rect(&clear_rect[i]),
+ wine_dbgstr_rect(¤t_rect));
/* Tests show that rectangles where x1 > x2 or y1 > y2 are ignored silently.
* The rectangle is not cleared, no error is returned, but further rectanlges are
- * still cleared if they are valid
- */
- if(curRect.x1 > curRect.x2 || curRect.y1 > curRect.y2) {
- TRACE("Rectangle with negative dimensions, ignoring\n");
+ * still cleared if they are valid. */
+ if (current_rect.left > current_rect.right || current_rect.top > current_rect.bottom)
+ {
+ TRACE("Rectangle with negative dimensions, ignoring.\n");
continue;
}
if (context->render_offscreen)
{
- glScissor(curRect.x1, curRect.y1,
- curRect.x2 - curRect.x1, curRect.y2 - curRect.y1);
- } else {
- glScissor(curRect.x1, drawable_height - curRect.y2,
- curRect.x2 - curRect.x1, curRect.y2 - curRect.y1);
+ glScissor(current_rect.left, current_rect.top,
+ current_rect.right - current_rect.left, current_rect.bottom - current_rect.top);
+ }
+ else
+ {
+ glScissor(current_rect.left, drawable_height - current_rect.bottom,
+ current_rect.right - current_rect.left, current_rect.bottom - current_rect.top);
}
checkGLcall("glScissor");
@@ -4406,52 +4564,33 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
}
}
- /* Restore the old values (why..?) */
- if (Flags & WINED3DCLEAR_STENCIL) {
- glStencilMask(This->stateBlock->renderState[WINED3DRS_STENCILWRITEMASK]);
- }
- if (Flags & WINED3DCLEAR_TARGET) {
- DWORD mask = This->stateBlock->renderState[WINED3DRS_COLORWRITEENABLE];
- glColorMask(mask & WINED3DCOLORWRITEENABLE_RED ? GL_TRUE : GL_FALSE,
- mask & WINED3DCOLORWRITEENABLE_GREEN ? GL_TRUE : GL_FALSE,
- mask & WINED3DCOLORWRITEENABLE_BLUE ? GL_TRUE : GL_FALSE,
- mask & WINED3DCOLORWRITEENABLE_ALPHA ? GL_TRUE : GL_FALSE);
-
- /* Dirtify the target surface for now. If the surface is locked regularly, and an up to date sysmem copy exists,
- * it is most likely more efficient to perform a clear on the sysmem copy too instead of downloading it
- */
- IWineD3DSurface_ModifyLocation((IWineD3DSurface *)target, SFLAG_INDRAWABLE, TRUE);
- }
- if (Flags & WINED3DCLEAR_ZBUFFER) {
- /* Note that WINED3DCLEAR_ZBUFFER implies a depth stencil exists on the device */
- DWORD location = context->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN;
- surface_modify_ds_location(This->stencilBufferTarget, location);
- }
-
LEAVE_GL();
- wglFlush(); /* Flush to ensure ordering across contexts. */
+ if (wined3d_settings.strict_draw_ordering || ((target->Flags & SFLAG_SWAPCHAIN)
+ && ((IWineD3DSwapChainImpl *)target->container)->front_buffer == target))
+ wglFlush(); /* Flush to ensure ordering across contexts. */
context_release(context);
return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DDeviceImpl_Clear(IWineD3DDevice *iface, DWORD Count, CONST WINED3DRECT* pRects,
- DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil) {
+static HRESULT WINAPI IWineD3DDeviceImpl_Clear(IWineD3DDevice *iface, DWORD Count,
+ const WINED3DRECT *pRects, DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil)
+{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- IWineD3DSurfaceImpl *target = (IWineD3DSurfaceImpl *)This->render_targets[0];
TRACE("(%p) Count (%d), pRects (%p), Flags (%x), Color (0x%08x), Z (%f), Stencil (%d)\n", This,
Count, pRects, Flags, Color, Z, Stencil);
- if(Flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL) && This->stencilBufferTarget == NULL) {
+ if (Flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL) && !This->depth_stencil)
+ {
WARN("Clearing depth and/or stencil without a depth stencil buffer attached, returning WINED3DERR_INVALIDCALL\n");
/* TODO: What about depth stencil buffers without stencil bits? */
return WINED3DERR_INVALIDCALL;
}
- return IWineD3DDeviceImpl_ClearSurface(This, target, Count, pRects, Flags, Color, Z, Stencil);
+ return IWineD3DDeviceImpl_ClearSurface(This, This->render_targets[0], Count, pRects, Flags, Color, Z, Stencil);
}
/*****
@@ -5083,71 +5222,58 @@ static float WINAPI IWineD3DDeviceImpl_GetNPatchMode(IWineD3DDevice *iface)
return 0.0f;
}
-static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface, IWineD3DSurface *pSourceSurface, CONST RECT* pSourceRect, IWineD3DSurface *pDestinationSurface, CONST POINT* pDestPoint) {
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
- /** TODO: remove casts to IWineD3DSurfaceImpl
- * NOTE: move code to surface to accomplish this
- ****************************************/
- IWineD3DSurfaceImpl *pSrcSurface = (IWineD3DSurfaceImpl *)pSourceSurface;
- IWineD3DSurfaceImpl *dst_impl = (IWineD3DSurfaceImpl *)pDestinationSurface;
- int srcWidth, srcHeight;
- unsigned int srcSurfaceWidth, srcSurfaceHeight, destSurfaceWidth, destSurfaceHeight;
- WINED3DFORMAT destFormat, srcFormat;
- UINT destSize;
- int srcLeft, destLeft, destTop;
- WINED3DPOOL srcPool, destPool;
- int offset = 0;
- int rowoffset = 0; /* how many bytes to add onto the end of a row to wraparound to the beginning of the next */
- const struct GlPixelFormatDesc *src_format_desc, *dst_format_desc;
- GLenum dummy;
- DWORD sampler;
- int bpp;
- CONVERT_TYPES convert = NO_CONVERSION;
+static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
+ IWineD3DSurface *src_surface, const RECT *src_rect,
+ IWineD3DSurface *dst_surface, const POINT *dst_point)
+{
+ IWineD3DSurfaceImpl *src_impl = (IWineD3DSurfaceImpl *)src_surface;
+ IWineD3DSurfaceImpl *dst_impl = (IWineD3DSurfaceImpl *)dst_surface;
+ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ const struct wined3d_format_desc *src_format;
+ const struct wined3d_format_desc *dst_format;
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
+ const unsigned char *data;
+ UINT update_w, update_h;
+ CONVERT_TYPES convert;
+ UINT src_w, src_h;
+ UINT dst_x, dst_y;
+ DWORD sampler;
+ struct wined3d_format_desc desc;
- WINED3DSURFACE_DESC winedesc;
+ TRACE("iface %p, src_surface %p, src_rect %s, dst_surface %p, dst_point %s.\n",
+ iface, src_surface, wine_dbgstr_rect(src_rect),
+ dst_surface, wine_dbgstr_point(dst_point));
- TRACE("(%p) : Source (%p) Rect (%p) Destination (%p) Point(%p)\n", This, pSourceSurface, pSourceRect, pDestinationSurface, pDestPoint);
-
- IWineD3DSurface_GetDesc(pSourceSurface, &winedesc);
- srcSurfaceWidth = winedesc.width;
- srcSurfaceHeight = winedesc.height;
- srcPool = winedesc.pool;
- srcFormat = winedesc.format;
-
- IWineD3DSurface_GetDesc(pDestinationSurface, &winedesc);
- destSurfaceWidth = winedesc.width;
- destSurfaceHeight = winedesc.height;
- destPool = winedesc.pool;
- destFormat = winedesc.format;
- destSize = winedesc.size;
-
- if(srcPool != WINED3DPOOL_SYSTEMMEM || destPool != WINED3DPOOL_DEFAULT){
- WARN("source %p must be SYSTEMMEM and dest %p must be DEFAULT, returning WINED3DERR_INVALIDCALL\n", pSourceSurface, pDestinationSurface);
+ if (src_impl->resource.pool != WINED3DPOOL_SYSTEMMEM || dst_impl->resource.pool != WINED3DPOOL_DEFAULT)
+ {
+ WARN("source %p must be SYSTEMMEM and dest %p must be DEFAULT, returning WINED3DERR_INVALIDCALL\n",
+ src_surface, dst_surface);
return WINED3DERR_INVALIDCALL;
}
- /* This call loads the opengl surface directly, instead of copying the surface to the
- * destination's sysmem copy. If surface conversion is needed, use BltFast instead to
- * copy in sysmem and use regular surface loading.
- */
- d3dfmt_get_conv(dst_impl, FALSE, TRUE, &dummy, &dummy, &dummy, &convert, &bpp, FALSE);
- if(convert != NO_CONVERSION) {
- return IWineD3DSurface_BltFast(pDestinationSurface,
- pDestPoint ? pDestPoint->x : 0,
- pDestPoint ? pDestPoint->y : 0,
- pSourceSurface, pSourceRect, 0);
+ src_format = src_impl->resource.format_desc;
+ dst_format = dst_impl->resource.format_desc;
+
+ if (src_format->format != dst_format->format)
+ {
+ WARN("Source and destination surfaces should have the same format.\n");
+ return WINED3DERR_INVALIDCALL;
}
- if (destFormat == WINED3DFMT_UNKNOWN) {
- TRACE("(%p) : Converting destination surface from WINED3DFMT_UNKNOWN to the source format\n", This);
- IWineD3DSurface_SetFormat(pDestinationSurface, srcFormat);
+ dst_x = dst_point ? dst_point->x : 0;
+ dst_y = dst_point ? dst_point->y : 0;
- /* Get the update surface description */
- IWineD3DSurface_GetDesc(pDestinationSurface, &winedesc);
- }
+ /* This call loads the OpenGL surface directly, instead of copying the
+ * surface to the destination's sysmem copy. If surface conversion is
+ * needed, use BltFast instead to copy in sysmem and use regular surface
+ * loading. */
+ d3dfmt_get_conv(dst_impl, FALSE, TRUE, &desc, &convert);
+ if (convert != NO_CONVERSION || desc.convert)
+ return IWineD3DSurface_BltFast(dst_surface, dst_x, dst_y, src_surface, src_rect, 0);
- context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This, NULL);
+ gl_info = context->gl_info;
ENTER_GL();
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB));
@@ -5155,92 +5281,79 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
LEAVE_GL();
/* Make sure the surface is loaded and up to date */
- surface_internal_preload(pDestinationSurface, SRGB_RGB);
- IWineD3DSurface_BindTexture(pDestinationSurface, FALSE);
+ surface_internal_preload(dst_impl, SRGB_RGB);
+ IWineD3DSurface_BindTexture(dst_surface, FALSE);
- src_format_desc = ((IWineD3DSurfaceImpl *)pSrcSurface)->resource.format_desc;
- dst_format_desc = dst_impl->resource.format_desc;
+ src_w = src_impl->currentDesc.Width;
+ src_h = src_impl->currentDesc.Height;
+ update_w = src_rect ? src_rect->right - src_rect->left : src_w;
+ update_h = src_rect ? src_rect->bottom - src_rect->top : src_h;
- /* this needs to be done in lines if the sourceRect != the sourceWidth */
- srcWidth = pSourceRect ? pSourceRect->right - pSourceRect->left : srcSurfaceWidth;
- srcHeight = pSourceRect ? pSourceRect->bottom - pSourceRect->top : srcSurfaceHeight;
- srcLeft = pSourceRect ? pSourceRect->left : 0;
- destLeft = pDestPoint ? pDestPoint->x : 0;
- destTop = pDestPoint ? pDestPoint->y : 0;
-
-
- /* This function doesn't support compressed textures
- the pitch is just bytesPerPixel * width */
- if(srcWidth != srcSurfaceWidth || srcLeft ){
- rowoffset = srcSurfaceWidth * src_format_desc->byte_count;
- offset += srcLeft * src_format_desc->byte_count;
- /* TODO: do we ever get 3bpp?, would a shift and an add be quicker than a mul (well maybe a cycle or two) */
- }
- /* TODO DXT formats */
-
- if(pSourceRect != NULL && pSourceRect->top != 0){
- offset += pSourceRect->top * srcSurfaceWidth * src_format_desc->byte_count;
- }
- TRACE("(%p) glTexSubImage2D, level %d, left %d, top %d, width %d, height %d, fmt %#x, type %#x, memory %p+%#x\n",
- This, dst_impl->texture_level, destLeft, destTop, srcWidth, srcHeight, dst_format_desc->glFormat,
- dst_format_desc->glType, IWineD3DSurface_GetData(pSourceSurface), offset);
-
- /* Sanity check */
- if (IWineD3DSurface_GetData(pSourceSurface) == NULL) {
-
- /* need to lock the surface to get the data */
- FIXME("Surfaces has no allocated memory, but should be an in memory only surface\n");
- }
+ data = IWineD3DSurface_GetData(src_surface);
+ if (!data) ERR("Source surface has no allocated memory, but should be a sysmem surface.\n");
ENTER_GL();
- /* TODO: Cube and volume support */
- if(rowoffset != 0){
- /* not a whole row so we have to do it a line at a time */
- int j;
+ if (dst_format->Flags & WINED3DFMT_FLAG_COMPRESSED)
+ {
+ UINT row_length = (update_w / src_format->block_width) * src_format->block_byte_count;
+ UINT row_count = update_h / src_format->block_height;
+ UINT src_pitch = IWineD3DSurface_GetPitch(src_surface);
- /* hopefully using pointer addition will be quicker than using a point + j * rowoffset */
- const unsigned char* data =((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface)) + offset;
-
- for (j = destTop; j < (srcHeight + destTop); ++j)
+ if (src_rect)
{
- glTexSubImage2D(dst_impl->texture_target, dst_impl->texture_level, destLeft, j,
- srcWidth, 1, dst_format_desc->glFormat, dst_format_desc->glType,data);
- data += rowoffset;
+ data += (src_rect->top / src_format->block_height) * src_pitch;
+ data += (src_rect->left / src_format->block_width) * src_format->block_byte_count;
}
- } else { /* Full width, so just write out the whole texture */
- const unsigned char* data = ((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface)) + offset;
+ TRACE("glCompressedTexSubImage2DARB, target %#x, level %d, x %d, y %d, w %d, h %d, "
+ "format %#x, image_size %#x, data %p.\n", dst_impl->texture_target, dst_impl->texture_level,
+ dst_x, dst_y, update_w, update_h, dst_format->glFormat, row_count * row_length, data);
- if (dst_format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED)
+ if (row_length == src_pitch)
{
- if (destSurfaceHeight != srcHeight || destSurfaceWidth != srcWidth)
- {
- /* FIXME: The easy way to do this is to lock the destination, and copy the bits across. */
- FIXME("Updating part of a compressed texture is not supported.\n");
- }
- if (destFormat != srcFormat)
- {
- FIXME("Updating mixed format compressed textures is not supported.\n");
- }
- else
- {
- GL_EXTCALL(glCompressedTexImage2DARB(dst_impl->texture_target, dst_impl->texture_level,
- dst_format_desc->glInternal, srcWidth, srcHeight, 0, destSize, data));
- }
+ GL_EXTCALL(glCompressedTexSubImage2DARB(dst_impl->texture_target, dst_impl->texture_level,
+ dst_x, dst_y, update_w, update_h, dst_format->glInternal, row_count * row_length, data));
}
else
{
- glTexSubImage2D(dst_impl->texture_target, dst_impl->texture_level, destLeft, destTop,
- srcWidth, srcHeight, dst_format_desc->glFormat, dst_format_desc->glType, data);
+ UINT row, y;
+
+ /* glCompressedTexSubImage2DARB() ignores pixel store state, so we
+ * can't use the unpack row length like below. */
+ for (row = 0, y = dst_y; row < row_count; ++row)
+ {
+ GL_EXTCALL(glCompressedTexSubImage2DARB(dst_impl->texture_target, dst_impl->texture_level,
+ dst_x, y, update_w, src_format->block_height, dst_format->glInternal, row_length, data));
+ y += src_format->block_height;
+ data += src_pitch;
+ }
}
- }
- checkGLcall("glTexSubImage2D");
+ checkGLcall("glCompressedTexSubImage2DARB");
+ }
+ else
+ {
+ if (src_rect)
+ {
+ data += src_rect->top * src_w * src_format->byte_count;
+ data += src_rect->left * src_format->byte_count;
+ }
+
+ TRACE("glTexSubImage2D, target %#x, level %d, x %d, y %d, w %d, h %d, format %#x, type %#x, data %p.\n",
+ dst_impl->texture_target, dst_impl->texture_level, dst_x, dst_y,
+ update_w, update_h, dst_format->glFormat, dst_format->glType, data);
+
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, src_w);
+ glTexSubImage2D(dst_impl->texture_target, dst_impl->texture_level, dst_x, dst_y,
+ update_w, update_h, dst_format->glFormat, dst_format->glType, data);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+ checkGLcall("glTexSubImage2D");
+ }
LEAVE_GL();
context_release(context);
- IWineD3DSurface_ModifyLocation(pDestinationSurface, SFLAG_INTEXTURE, TRUE);
+ IWineD3DSurface_ModifyLocation(dst_surface, SFLAG_INTEXTURE, TRUE);
sampler = This->rev_tex_unit_map[0];
if (sampler != WINED3D_UNMAPPED_STAGE)
{
@@ -5370,68 +5483,39 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DeletePatch(IWineD3DDevice *iface, UINT
return WINED3DERR_INVALIDCALL;
}
-static IWineD3DSwapChain *get_swapchain(IWineD3DSurface *target) {
- HRESULT hr;
- IWineD3DSwapChain *swapchain;
-
- hr = IWineD3DSurface_GetContainer(target, &IID_IWineD3DSwapChain, (void **)&swapchain);
- if (SUCCEEDED(hr)) {
- IWineD3DSwapChain_Release((IUnknown *)swapchain);
- return swapchain;
- }
-
- return NULL;
-}
-
-static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface,
+static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface,
const WINED3DRECT *rect, const float color[4])
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
struct wined3d_context *context;
- if (rect) IWineD3DSurface_LoadLocation(surface, SFLAG_INDRAWABLE, NULL);
- IWineD3DSurface_ModifyLocation(surface, SFLAG_INDRAWABLE, TRUE);
+ if (rect) IWineD3DSurface_LoadLocation((IWineD3DSurface *)surface, SFLAG_INDRAWABLE, NULL);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INDRAWABLE, TRUE);
- if (!surface_is_offscreen(surface))
+ context = context_acquire(This, surface);
+ context_apply_clear_state(context, This, surface, NULL);
+
+ ENTER_GL();
+
+ if (rect)
{
- TRACE("Surface %p is onscreen\n", surface);
-
- context = context_acquire(This, surface, CTXUSAGE_RESOURCELOAD);
- ENTER_GL();
- context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
- context_set_draw_buffer(context, surface_get_gl_buffer(surface));
+ if (surface_is_offscreen(surface))
+ glScissor(rect->x1, rect->y1, rect->x2 - rect->x1, rect->y2 - rect->y1);
+ else
+ glScissor(rect->x1, surface->currentDesc.Height - rect->y2,
+ rect->x2 - rect->x1, rect->y2 - rect->y1);
+ checkGLcall("glScissor");
}
else
{
- TRACE("Surface %p is offscreen\n", surface);
-
- context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
- ENTER_GL();
- context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo);
- context_attach_surface_fbo(context, GL_FRAMEBUFFER, 0, surface);
- context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, NULL, FALSE);
- }
-
- if (rect) {
- glEnable(GL_SCISSOR_TEST);
- if(surface_is_offscreen(surface)) {
- glScissor(rect->x1, rect->y1, rect->x2 - rect->x1, rect->y2 - rect->y1);
- } else {
- glScissor(rect->x1, ((IWineD3DSurfaceImpl *)surface)->currentDesc.Height - rect->y2,
- rect->x2 - rect->x1, rect->y2 - rect->y1);
- }
- checkGLcall("glScissor");
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SCISSORRECT);
- } else {
glDisable(GL_SCISSOR_TEST);
}
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE));
-
- glDisable(GL_BLEND);
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE));
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE1));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE2));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE3));
glClearColor(color[0], color[1], color[2], color[3]);
glClear(GL_COLOR_BUFFER_BIT);
@@ -5439,119 +5523,11 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface,
LEAVE_GL();
- wglFlush(); /* Flush to ensure ordering across contexts. */
+ if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */
context_release(context);
}
-static inline DWORD argb_to_fmt(DWORD color, WINED3DFORMAT destfmt) {
- unsigned int r, g, b, a;
- DWORD ret;
-
- if (destfmt == WINED3DFMT_B8G8R8A8_UNORM
- || destfmt == WINED3DFMT_B8G8R8X8_UNORM
- || destfmt == WINED3DFMT_B8G8R8_UNORM)
- return color;
-
- TRACE("Converting color %08x to format %s\n", color, debug_d3dformat(destfmt));
-
- a = (color & 0xff000000) >> 24;
- r = (color & 0x00ff0000) >> 16;
- g = (color & 0x0000ff00) >> 8;
- b = (color & 0x000000ff) >> 0;
-
- switch(destfmt)
- {
- case WINED3DFMT_B5G6R5_UNORM:
- if(r == 0xff && g == 0xff && b == 0xff) return 0xffff;
- r = (r * 32) / 256;
- g = (g * 64) / 256;
- b = (b * 32) / 256;
- ret = r << 11;
- ret |= g << 5;
- ret |= b;
- TRACE("Returning %08x\n", ret);
- return ret;
-
- case WINED3DFMT_B5G5R5X1_UNORM:
- case WINED3DFMT_B5G5R5A1_UNORM:
- a = (a * 2) / 256;
- r = (r * 32) / 256;
- g = (g * 32) / 256;
- b = (b * 32) / 256;
- ret = a << 15;
- ret |= r << 10;
- ret |= g << 5;
- ret |= b << 0;
- TRACE("Returning %08x\n", ret);
- return ret;
-
- case WINED3DFMT_A8_UNORM:
- TRACE("Returning %08x\n", a);
- return a;
-
- case WINED3DFMT_B4G4R4X4_UNORM:
- case WINED3DFMT_B4G4R4A4_UNORM:
- a = (a * 16) / 256;
- r = (r * 16) / 256;
- g = (g * 16) / 256;
- b = (b * 16) / 256;
- ret = a << 12;
- ret |= r << 8;
- ret |= g << 4;
- ret |= b << 0;
- TRACE("Returning %08x\n", ret);
- return ret;
-
- case WINED3DFMT_B2G3R3_UNORM:
- r = (r * 8) / 256;
- g = (g * 8) / 256;
- b = (b * 4) / 256;
- ret = r << 5;
- ret |= g << 2;
- ret |= b << 0;
- TRACE("Returning %08x\n", ret);
- return ret;
-
- case WINED3DFMT_R8G8B8X8_UNORM:
- case WINED3DFMT_R8G8B8A8_UNORM:
- ret = a << 24;
- ret |= b << 16;
- ret |= g << 8;
- ret |= r << 0;
- TRACE("Returning %08x\n", ret);
- return ret;
-
- case WINED3DFMT_B10G10R10A2_UNORM:
- a = (a * 4) / 256;
- r = (r * 1024) / 256;
- g = (g * 1024) / 256;
- b = (b * 1024) / 256;
- ret = a << 30;
- ret |= r << 20;
- ret |= g << 10;
- ret |= b << 0;
- TRACE("Returning %08x\n", ret);
- return ret;
-
- case WINED3DFMT_R10G10B10A2_UNORM:
- a = (a * 4) / 256;
- r = (r * 1024) / 256;
- g = (g * 1024) / 256;
- b = (b * 1024) / 256;
- ret = a << 30;
- ret |= b << 20;
- ret |= g << 10;
- ret |= r << 0;
- TRACE("Returning %08x\n", ret);
- return ret;
-
- default:
- FIXME("Add a COLORFILL conversion for format %s\n", debug_d3dformat(destfmt));
- return 0;
- }
-}
-
static HRESULT WINAPI IWineD3DDeviceImpl_ColorFill(IWineD3DDevice *iface,
IWineD3DSurface *pSurface, const WINED3DRECT *pRect, WINED3DCOLOR color)
{
@@ -5567,13 +5543,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ColorFill(IWineD3DDevice *iface,
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
const float c[4] = {D3DCOLOR_R(color), D3DCOLOR_G(color), D3DCOLOR_B(color), D3DCOLOR_A(color)};
- color_fill_fbo(iface, pSurface, pRect, c);
+ color_fill_fbo(iface, surface, pRect, c);
return WINED3D_OK;
} else {
/* Just forward this to the DirectDraw blitting engine */
memset(&BltFx, 0, sizeof(BltFx));
BltFx.dwSize = sizeof(BltFx);
- BltFx.u5.dwFillColor = argb_to_fmt(color, surface->resource.format_desc->format);
+ BltFx.u5.dwFillColor = color_convert_argb_to_fmt(color, surface->resource.format_desc->format);
return IWineD3DSurface_Blt(pSurface, (const RECT *)pRect, NULL, NULL,
WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT);
}
@@ -5583,7 +5559,7 @@ static void WINAPI IWineD3DDeviceImpl_ClearRendertargetView(IWineD3DDevice *ifac
IWineD3DRendertargetView *rendertarget_view, const float color[4])
{
IWineD3DResource *resource;
- IWineD3DSurface *surface;
+ IWineD3DSurfaceImpl *surface;
HRESULT hr;
hr = IWineD3DRendertargetView_GetResource(rendertarget_view, &resource);
@@ -5600,7 +5576,7 @@ static void WINAPI IWineD3DDeviceImpl_ClearRendertargetView(IWineD3DDevice *ifac
return;
}
- surface = (IWineD3DSurface *)resource;
+ surface = (IWineD3DSurfaceImpl *)resource;
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
{
@@ -5621,8 +5597,9 @@ static void WINAPI IWineD3DDeviceImpl_ClearRendertargetView(IWineD3DDevice *ifac
/* Just forward this to the DirectDraw blitting engine */
memset(&BltFx, 0, sizeof(BltFx));
BltFx.dwSize = sizeof(BltFx);
- BltFx.u5.dwFillColor = argb_to_fmt(c, ((IWineD3DSurfaceImpl *)surface)->resource.format_desc->format);
- hr = IWineD3DSurface_Blt(surface, NULL, NULL, NULL, WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT);
+ BltFx.u5.dwFillColor = color_convert_argb_to_fmt(c, surface->resource.format_desc->format);
+ hr = IWineD3DSurface_Blt((IWineD3DSurface *)surface, NULL, NULL, NULL,
+ WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT);
if (FAILED(hr))
{
ERR("Blt failed, hr %#x\n", hr);
@@ -5643,7 +5620,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetRenderTarget(IWineD3DDevice* iface
return WINED3DERR_INVALIDCALL;
}
- *ppRenderTarget = This->render_targets[RenderTargetIndex];
+ *ppRenderTarget = (IWineD3DSurface *)This->render_targets[RenderTargetIndex];
TRACE("(%p) : RenderTarget %d Index returning %p\n", This, RenderTargetIndex, *ppRenderTarget);
/* Note inc ref on returned surface */
if(*ppRenderTarget != NULL)
@@ -5652,110 +5629,103 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetRenderTarget(IWineD3DDevice* iface
}
static HRESULT WINAPI IWineD3DDeviceImpl_SetFrontBackBuffers(IWineD3DDevice *iface,
- IWineD3DSurface *Front, IWineD3DSurface *Back)
+ IWineD3DSurface *front, IWineD3DSurface *back)
{
- IWineD3DSurfaceImpl *FrontImpl = (IWineD3DSurfaceImpl *) Front;
- IWineD3DSurfaceImpl *BackImpl = (IWineD3DSurfaceImpl *) Back;
- IWineD3DSwapChainImpl *Swapchain;
+ IWineD3DSurfaceImpl *front_impl = (IWineD3DSurfaceImpl *)front;
+ IWineD3DSurfaceImpl *back_impl = (IWineD3DSurfaceImpl *)back;
+ IWineD3DSwapChainImpl *swapchain;
HRESULT hr;
- TRACE("iface %p, front %p, back %p.\n", iface, Front, Back);
+ TRACE("iface %p, front %p, back %p.\n", iface, front, back);
- hr = IWineD3DDevice_GetSwapChain(iface, 0, (IWineD3DSwapChain **) &Swapchain);
- if(hr != WINED3D_OK) {
- ERR("Can't get the swapchain\n");
+ if (FAILED(hr = IWineD3DDevice_GetSwapChain(iface, 0, (IWineD3DSwapChain **)&swapchain)))
+ {
+ ERR("Failed to get the swapchain, hr %#x.\n", hr);
return hr;
}
- /* Make sure to release the swapchain */
- IWineD3DSwapChain_Release((IWineD3DSwapChain *) Swapchain);
-
- if(FrontImpl && !(FrontImpl->resource.usage & WINED3DUSAGE_RENDERTARGET) ) {
- ERR("Trying to set a front buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage\n");
- return WINED3DERR_INVALIDCALL;
- }
- else if(BackImpl && !(BackImpl->resource.usage & WINED3DUSAGE_RENDERTARGET)) {
- ERR("Trying to set a back buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage\n");
+ if (front_impl && !(front_impl->resource.usage & WINED3DUSAGE_RENDERTARGET))
+ {
+ ERR("Trying to set a front buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage.\n");
+ IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain);
return WINED3DERR_INVALIDCALL;
}
- if(Swapchain->frontBuffer != Front) {
- TRACE("Changing the front buffer from %p to %p\n", Swapchain->frontBuffer, Front);
-
- if(Swapchain->frontBuffer)
+ if (back_impl)
+ {
+ if (!(back_impl->resource.usage & WINED3DUSAGE_RENDERTARGET))
{
- IWineD3DSurface_SetContainer(Swapchain->frontBuffer, NULL);
- ((IWineD3DSurfaceImpl *)Swapchain->frontBuffer)->Flags &= ~SFLAG_SWAPCHAIN;
+ ERR("Trying to set a back buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage.\n");
+ IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain);
+ return WINED3DERR_INVALIDCALL;
}
- Swapchain->frontBuffer = Front;
- if(Swapchain->frontBuffer) {
- IWineD3DSurface_SetContainer(Swapchain->frontBuffer, (IWineD3DBase *) Swapchain);
- ((IWineD3DSurfaceImpl *)Swapchain->frontBuffer)->Flags |= SFLAG_SWAPCHAIN;
- }
- }
-
- if(Back && !Swapchain->backBuffer) {
- /* We need memory for the back buffer array - only one back buffer this way */
- Swapchain->backBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DSurface *));
- if(!Swapchain->backBuffer) {
- ERR("Out of memory\n");
- return E_OUTOFMEMORY;
- }
- }
-
- if(Swapchain->backBuffer[0] != Back) {
- TRACE("Changing the back buffer from %p to %p\n", Swapchain->backBuffer, Back);
-
- /* What to do about the context here in the case of multithreading? Not sure.
- * This function is called by IDirect3D7::CreateDevice so in theory its initialization code
- */
- WARN("No active context?\n");
-
- ENTER_GL();
- if(!Swapchain->backBuffer[0]) {
- /* GL was told to draw to the front buffer at creation,
- * undo that
- */
- glDrawBuffer(GL_BACK);
- checkGLcall("glDrawBuffer(GL_BACK)");
- /* Set the backbuffer count to 1 because other code uses it to fing the back buffers */
- Swapchain->presentParms.BackBufferCount = 1;
- } else if (!Back) {
- /* That makes problems - disable for now */
- /* glDrawBuffer(GL_FRONT); */
- checkGLcall("glDrawBuffer(GL_FRONT)");
- /* We have lost our back buffer, set this to 0 to avoid confusing other code */
- Swapchain->presentParms.BackBufferCount = 0;
- }
- LEAVE_GL();
-
- if(Swapchain->backBuffer[0])
+ if (!swapchain->back_buffers)
{
- IWineD3DSurface_SetContainer(Swapchain->backBuffer[0], NULL);
- ((IWineD3DSurfaceImpl *)Swapchain->backBuffer[0])->Flags &= ~SFLAG_SWAPCHAIN;
+ swapchain->back_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*swapchain->back_buffers));
+ if (!swapchain->back_buffers)
+ {
+ ERR("Failed to allocate back buffer array memory.\n");
+ IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain);
+ return E_OUTOFMEMORY;
+ }
}
- Swapchain->backBuffer[0] = Back;
-
- 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;
- }
-
}
+ if (swapchain->front_buffer != front_impl)
+ {
+ TRACE("Changing the front buffer from %p to %p.\n", swapchain->front_buffer, front_impl);
+
+ if (swapchain->front_buffer)
+ {
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->front_buffer, NULL);
+ swapchain->front_buffer->Flags &= ~SFLAG_SWAPCHAIN;
+ }
+ swapchain->front_buffer = front_impl;
+
+ if (front)
+ {
+ IWineD3DSurface_SetContainer(front, (IWineD3DBase *)swapchain);
+ front_impl->Flags |= SFLAG_SWAPCHAIN;
+ }
+ }
+
+ if (swapchain->back_buffers[0] != back_impl)
+ {
+ TRACE("Changing the back buffer from %p to %p.\n", swapchain->back_buffers[0], back_impl);
+
+ if (swapchain->back_buffers[0])
+ {
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->back_buffers[0], NULL);
+ swapchain->back_buffers[0]->Flags &= ~SFLAG_SWAPCHAIN;
+ }
+ swapchain->back_buffers[0] = back_impl;
+
+ if (back)
+ {
+ swapchain->presentParms.BackBufferWidth = back_impl->currentDesc.Width;
+ swapchain->presentParms.BackBufferHeight = back_impl->currentDesc.Height;
+ swapchain->presentParms.BackBufferFormat = back_impl->resource.format_desc->format;
+ swapchain->presentParms.BackBufferCount = 1;
+
+ IWineD3DSurface_SetContainer(back, (IWineD3DBase *)swapchain);
+ back_impl->Flags |= SFLAG_SWAPCHAIN;
+ }
+ else
+ {
+ swapchain->presentParms.BackBufferCount = 0;
+ HeapFree(GetProcessHeap(), 0, swapchain->back_buffers);
+ swapchain->back_buffers = NULL;
+ }
+ }
+
+ IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain);
return WINED3D_OK;
}
static HRESULT WINAPI IWineD3DDeviceImpl_GetDepthStencilSurface(IWineD3DDevice* iface, IWineD3DSurface **ppZStencilSurface) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- *ppZStencilSurface = This->stencilBufferTarget;
+ *ppZStencilSurface = (IWineD3DSurface *)This->depth_stencil;
TRACE("(%p) : zStencilSurface returning %p\n", This, *ppZStencilSurface);
if(*ppZStencilSurface != NULL) {
@@ -5767,21 +5737,21 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetDepthStencilSurface(IWineD3DDevice
}
}
-void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED3DRECT *src_rect,
- IWineD3DSurface *dst_surface, WINED3DRECT *dst_rect, const WINED3DTEXTUREFILTERTYPE filter, BOOL flip)
+void stretch_rect_fbo(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *src_surface, const RECT *src_rect_in,
+ IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect_in, const WINED3DTEXTUREFILTERTYPE filter)
{
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
GLbitfield mask = GL_COLOR_BUFFER_BIT; /* TODO: Support blitting depth/stencil surfaces */
- IWineD3DSwapChain *src_swapchain, *dst_swapchain;
const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
GLenum gl_filter;
- POINT offset = {0, 0};
+ RECT src_rect, dst_rect;
- TRACE("(%p) : src_surface %p, src_rect %p, dst_surface %p, dst_rect %p, filter %s (0x%08x), flip %u\n",
- This, src_surface, src_rect, dst_surface, dst_rect, debug_d3dtexturefiltertype(filter), filter, flip);
- TRACE("src_rect [%u, %u]->[%u, %u]\n", src_rect->x1, src_rect->y1, src_rect->x2, src_rect->y2);
- TRACE("dst_rect [%u, %u]->[%u, %u]\n", dst_rect->x1, dst_rect->y1, dst_rect->x2, dst_rect->y2);
+ TRACE("device %p, src_surface %p, src_rect_in %s, dst_surface %p, dst_rect_in %s, filter %s (0x%08x).\n",
+ device, src_surface, wine_dbgstr_rect(src_rect_in), dst_surface,
+ wine_dbgstr_rect(dst_rect_in), debug_d3dtexturefiltertype(filter), filter);
+
+ src_rect = *src_rect_in;
+ dst_rect = *dst_rect_in;
switch (filter) {
case WINED3DTEXF_LINEAR:
@@ -5799,16 +5769,19 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
/* 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);
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)src_surface, SFLAG_INDRAWABLE, NULL);
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)dst_surface, SFLAG_INDRAWABLE, NULL);
- /* Attach src surface to src fbo */
- src_swapchain = get_swapchain(src_surface);
- dst_swapchain = get_swapchain(dst_surface);
+ if (!surface_is_offscreen(src_surface)) context = context_acquire(device, src_surface);
+ else if (!surface_is_offscreen(dst_surface)) context = context_acquire(device, dst_surface);
+ else context = context_acquire(device, NULL);
- if (src_swapchain) context = context_acquire(This, src_surface, CTXUSAGE_RESOURCELOAD);
- else if (dst_swapchain) context = context_acquire(This, dst_surface, CTXUSAGE_RESOURCELOAD);
- else context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ if (!context->valid)
+ {
+ context_release(context);
+ WARN("Invalid context, skipping blit.\n");
+ return;
+ }
gl_info = context->gl_info;
@@ -5818,19 +5791,11 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
TRACE("Source surface %p is onscreen\n", src_surface);
- if(buffer == GL_FRONT) {
- RECT windowsize;
- UINT h;
- ClientToScreen(((IWineD3DSwapChainImpl *)src_swapchain)->win_handle, &offset);
- GetClientRect(((IWineD3DSwapChainImpl *)src_swapchain)->win_handle, &windowsize);
- h = windowsize.bottom - windowsize.top;
- src_rect->x1 -= offset.x; src_rect->x2 -=offset.x;
- src_rect->y1 = offset.y + h - src_rect->y1;
- src_rect->y2 = offset.y + h - src_rect->y2;
- } else {
- src_rect->y1 = ((IWineD3DSurfaceImpl *)src_surface)->currentDesc.Height - src_rect->y1;
- src_rect->y2 = ((IWineD3DSurfaceImpl *)src_surface)->currentDesc.Height - src_rect->y2;
- }
+ if (buffer == GL_FRONT)
+ surface_translate_frontbuffer_coords(src_surface, context->win_handle, &src_rect);
+
+ src_rect.top = src_surface->currentDesc.Height - src_rect.top;
+ src_rect.bottom = src_surface->currentDesc.Height - src_rect.bottom;
ENTER_GL();
context_bind_fbo(context, GL_READ_FRAMEBUFFER, NULL);
@@ -5839,11 +5804,9 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
} else {
TRACE("Source surface %p is offscreen\n", src_surface);
ENTER_GL();
- context_bind_fbo(context, GL_READ_FRAMEBUFFER, &context->src_fbo);
- context_attach_surface_fbo(context, GL_READ_FRAMEBUFFER, 0, src_surface);
+ context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, src_surface, NULL);
glReadBuffer(GL_COLOR_ATTACHMENT0);
checkGLcall("glReadBuffer()");
- context_attach_depth_stencil_fbo(context, GL_READ_FRAMEBUFFER, NULL, FALSE);
}
LEAVE_GL();
@@ -5854,20 +5817,11 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
TRACE("Destination surface %p is onscreen\n", dst_surface);
- if(buffer == GL_FRONT) {
- RECT windowsize;
- UINT h;
- ClientToScreen(((IWineD3DSwapChainImpl *)dst_swapchain)->win_handle, &offset);
- GetClientRect(((IWineD3DSwapChainImpl *)dst_swapchain)->win_handle, &windowsize);
- h = windowsize.bottom - windowsize.top;
- dst_rect->x1 -= offset.x; dst_rect->x2 -=offset.x;
- dst_rect->y1 = offset.y + h - dst_rect->y1;
- dst_rect->y2 = offset.y + h - dst_rect->y2;
- } else {
- /* Screen coords = window coords, surface height = window height */
- dst_rect->y1 = ((IWineD3DSurfaceImpl *)dst_surface)->currentDesc.Height - dst_rect->y1;
- dst_rect->y2 = ((IWineD3DSurfaceImpl *)dst_surface)->currentDesc.Height - dst_rect->y2;
- }
+ if (buffer == GL_FRONT)
+ surface_translate_frontbuffer_coords(dst_surface, context->win_handle, &dst_rect);
+
+ dst_rect.top = dst_surface->currentDesc.Height - dst_rect.top;
+ dst_rect.bottom = dst_surface->currentDesc.Height - dst_rect.bottom;
ENTER_GL();
context_bind_fbo(context, GL_DRAW_FRAMEBUFFER, NULL);
@@ -5878,31 +5832,23 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
TRACE("Destination surface %p is offscreen\n", dst_surface);
ENTER_GL();
- context_bind_fbo(context, GL_DRAW_FRAMEBUFFER, &context->dst_fbo);
- context_attach_surface_fbo(context, GL_DRAW_FRAMEBUFFER, 0, dst_surface);
+ context_apply_fbo_state_blit(context, GL_DRAW_FRAMEBUFFER, dst_surface, NULL);
context_set_draw_buffer(context, GL_COLOR_ATTACHMENT0);
- context_attach_depth_stencil_fbo(context, GL_DRAW_FRAMEBUFFER, NULL, FALSE);
}
glDisable(GL_SCISSOR_TEST);
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE));
+ IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE));
- if (flip) {
- gl_info->fbo_ops.glBlitFramebuffer(src_rect->x1, src_rect->y1, src_rect->x2, src_rect->y2,
- dst_rect->x1, dst_rect->y2, dst_rect->x2, dst_rect->y1, mask, gl_filter);
- checkGLcall("glBlitFramebuffer()");
- } else {
- gl_info->fbo_ops.glBlitFramebuffer(src_rect->x1, src_rect->y1, src_rect->x2, src_rect->y2,
- dst_rect->x1, dst_rect->y1, dst_rect->x2, dst_rect->y2, mask, gl_filter);
- checkGLcall("glBlitFramebuffer()");
- }
+ gl_info->fbo_ops.glBlitFramebuffer(src_rect.left, src_rect.top, src_rect.right, src_rect.bottom,
+ dst_rect.left, dst_rect.top, dst_rect.right, dst_rect.bottom, mask, gl_filter);
+ checkGLcall("glBlitFramebuffer()");
LEAVE_GL();
- wglFlush(); /* Flush to ensure ordering across contexts. */
+ if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */
context_release(context);
- IWineD3DSurface_ModifyLocation(dst_surface, SFLAG_INDRAWABLE, TRUE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)dst_surface, SFLAG_INDRAWABLE, TRUE);
}
static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface, DWORD RenderTargetIndex, IWineD3DSurface *pRenderTarget,
@@ -5932,13 +5878,16 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface,
}
/* If we are trying to set what we already have, don't bother */
- if (pRenderTarget == This->render_targets[RenderTargetIndex]) {
+ if (pRenderTarget == (IWineD3DSurface *)This->render_targets[RenderTargetIndex])
+ {
TRACE("Trying to do a NOP SetRenderTarget operation\n");
return WINED3D_OK;
}
- if(pRenderTarget) IWineD3DSurface_AddRef(pRenderTarget);
- if(This->render_targets[RenderTargetIndex]) IWineD3DSurface_Release(This->render_targets[RenderTargetIndex]);
- This->render_targets[RenderTargetIndex] = pRenderTarget;
+ if (pRenderTarget)
+ IWineD3DSurface_AddRef(pRenderTarget);
+ if (This->render_targets[RenderTargetIndex])
+ IWineD3DSurface_Release((IWineD3DSurface *)This->render_targets[RenderTargetIndex]);
+ This->render_targets[RenderTargetIndex] = (IWineD3DSurfaceImpl *)pRenderTarget;
/* Render target 0 is special */
if(RenderTargetIndex == 0 && set_viewport) {
@@ -5946,8 +5895,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface,
* Tests show that stateblock recording is ignored, the change goes
* directly into the primary stateblock.
*/
- This->stateBlock->viewport.Height = ((IWineD3DSurfaceImpl *)This->render_targets[0])->currentDesc.Height;
- This->stateBlock->viewport.Width = ((IWineD3DSurfaceImpl *)This->render_targets[0])->currentDesc.Width;
+ This->stateBlock->viewport.Height = This->render_targets[0]->currentDesc.Height;
+ This->stateBlock->viewport.Width = This->render_targets[0]->currentDesc.Width;
This->stateBlock->viewport.X = 0;
This->stateBlock->viewport.Y = 0;
This->stateBlock->viewport.MaxZ = 1.0f;
@@ -5965,49 +5914,46 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface,
static HRESULT WINAPI IWineD3DDeviceImpl_SetDepthStencilSurface(IWineD3DDevice *iface, IWineD3DSurface *pNewZStencil) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- HRESULT hr = WINED3D_OK;
- IWineD3DSurface *tmp;
+ IWineD3DSurfaceImpl *tmp;
- TRACE("(%p) Swapping z-buffer. Old = %p, new = %p\n",This, This->stencilBufferTarget, pNewZStencil);
+ TRACE("device %p, depth_stencil %p, old depth_stencil %p.\n", This, pNewZStencil, This->depth_stencil);
- if (pNewZStencil == This->stencilBufferTarget) {
- TRACE("Trying to do a NOP SetRenderTarget operation\n");
- } else {
- /** OpenGL doesn't support 'sharing' of the stencilBuffer so we may incur an extra memory overhead
- * depending on the renter target implementation being used.
- * A shared context implementation will share all buffers between all rendertargets (including swapchains),
- * implementations that use separate pbuffers for different swapchains or rendertargets will have to duplicate the
- * stencil buffer and incur an extra memory overhead
- ******************************************************/
+ if (This->depth_stencil == (IWineD3DSurfaceImpl *)pNewZStencil)
+ {
+ TRACE("Trying to do a NOP SetRenderTarget operation.\n");
+ return WINED3D_OK;
+ }
- if (This->stencilBufferTarget) {
- if (((IWineD3DSwapChainImpl *)This->swapchains[0])->presentParms.Flags & WINED3DPRESENTFLAG_DISCARD_DEPTHSTENCIL
- || ((IWineD3DSurfaceImpl *)This->stencilBufferTarget)->Flags & SFLAG_DISCARD) {
- surface_modify_ds_location(This->stencilBufferTarget, SFLAG_DS_DISCARDED);
- } else {
- struct wined3d_context *context = context_acquire(This, This->render_targets[0], CTXUSAGE_RESOURCELOAD);
- surface_load_ds_location(This->stencilBufferTarget, context, SFLAG_DS_OFFSCREEN);
- surface_modify_ds_location(This->stencilBufferTarget, SFLAG_DS_OFFSCREEN);
- context_release(context);
+ if (This->depth_stencil)
+ {
+ if (((IWineD3DSwapChainImpl *)This->swapchains[0])->presentParms.Flags & WINED3DPRESENTFLAG_DISCARD_DEPTHSTENCIL
+ || This->depth_stencil->Flags & SFLAG_DISCARD)
+ {
+ surface_modify_ds_location(This->depth_stencil, SFLAG_DS_DISCARDED,
+ This->depth_stencil->currentDesc.Width,
+ This->depth_stencil->currentDesc.Height);
+ if (This->depth_stencil == This->onscreen_depth_stencil)
+ {
+ IWineD3DSurface_Release((IWineD3DSurface *)This->onscreen_depth_stencil);
+ This->onscreen_depth_stencil = NULL;
}
}
-
- tmp = This->stencilBufferTarget;
- This->stencilBufferTarget = pNewZStencil;
- /* should we be calling the parent or the wined3d surface? */
- if (NULL != This->stencilBufferTarget) IWineD3DSurface_AddRef(This->stencilBufferTarget);
- if (NULL != tmp) IWineD3DSurface_Release(tmp);
- hr = WINED3D_OK;
-
- if((!tmp && pNewZStencil) || (!pNewZStencil && tmp)) {
- /* Swapping NULL / non NULL depth stencil affects the depth and tests */
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ZENABLE));
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_STENCILENABLE));
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_STENCILWRITEMASK));
- }
}
- return hr;
+ tmp = This->depth_stencil;
+ This->depth_stencil = (IWineD3DSurfaceImpl *)pNewZStencil;
+ if (This->depth_stencil) IWineD3DSurface_AddRef((IWineD3DSurface *)This->depth_stencil);
+ if (tmp) IWineD3DSurface_Release((IWineD3DSurface *)tmp);
+
+ if ((!tmp && pNewZStencil) || (!pNewZStencil && tmp))
+ {
+ /* Swapping NULL / non NULL depth stencil affects the depth and tests */
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ZENABLE));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_STENCILENABLE));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_STENCILWRITEMASK));
+ }
+
+ return WINED3D_OK;
}
static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* iface, UINT XHotSpot,
@@ -6020,8 +5966,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i
TRACE("(%p) : Spot Pos(%u,%u)\n", This, XHotSpot, YHotSpot);
/* some basic validation checks */
- if(This->cursorTexture) {
- struct wined3d_context *context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ if (This->cursorTexture)
+ {
+ struct wined3d_context *context = context_acquire(This, NULL);
ENTER_GL();
glDeleteTextures(1, &This->cursorTexture);
LEAVE_GL();
@@ -6065,15 +6012,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i
if (SUCCEEDED(IWineD3DSurface_LockRect(pCursorBitmap, &rect, NULL, WINED3DLOCK_READONLY)))
{
const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
- const struct GlPixelFormatDesc *glDesc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, gl_info);
struct wined3d_context *context;
char *mem, *bits = rect.pBits;
- GLint intfmt = glDesc->glInternal;
- GLint format = glDesc->glFormat;
- GLint type = glDesc->glType;
+ GLint intfmt = format_desc->glInternal;
+ GLint format = format_desc->glFormat;
+ GLint type = format_desc->glType;
INT height = This->cursorHeight;
INT width = This->cursorWidth;
- INT bpp = glDesc->byte_count;
+ INT bpp = format_desc->byte_count;
DWORD sampler;
INT i;
@@ -6084,7 +6031,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i
memcpy(&mem[width * bpp * i], &bits[rect.Pitch * i], width * bpp);
IWineD3DSurface_UnlockRect(pCursorBitmap);
- context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This, NULL);
ENTER_GL();
@@ -6258,14 +6205,10 @@ static HRESULT updateSurfaceDesc(IWineD3DSurfaceImpl *surface, const WINED3DPRES
while (surface->pow2Width < pPresentationParameters->BackBufferWidth) surface->pow2Width <<= 1;
while (surface->pow2Height < pPresentationParameters->BackBufferHeight) surface->pow2Height <<= 1;
}
- surface->glRect.left = 0;
- surface->glRect.top = 0;
- surface->glRect.right = surface->pow2Width;
- surface->glRect.bottom = surface->pow2Height;
if (surface->texture_name)
{
- struct wined3d_context *context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ struct wined3d_context *context = context_acquire(device, NULL);
ENTER_GL();
glDeleteTextures(1, &surface->texture_name);
LEAVE_GL();
@@ -6286,7 +6229,7 @@ static HRESULT updateSurfaceDesc(IWineD3DSurfaceImpl *surface, const WINED3DPRES
/* Put all surfaces into sysmem - the drawable might disappear if the backbuffer was rendered
* to a FBO */
- if(!surface_init_sysmem((IWineD3DSurface *) surface))
+ if (!surface_init_sysmem(surface))
{
return E_OUTOFMEMORY;
}
@@ -6327,14 +6270,14 @@ static BOOL is_display_mode_supported(IWineD3DDeviceImpl *This, const WINED3DPRE
return FALSE;
}
-void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain_iface) {
+static void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChainImpl *swapchain)
+{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
- IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *) swapchain_iface;
const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
IWineD3DBaseShaderImpl *shader;
- context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This, NULL);
gl_info = context->gl_info;
IWineD3DDevice_EnumResources(iface, reset_unload_resources, NULL);
@@ -6371,9 +6314,9 @@ void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain_
swapchain->num_contexts = 0;
}
-HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain_iface) {
+static HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChainImpl *swapchain)
+{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
- IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *) swapchain_iface;
struct wined3d_context *context;
HRESULT hr;
IWineD3DSurfaceImpl *target;
@@ -6386,9 +6329,8 @@ HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain *
return E_OUTOFMEMORY;
}
- target = (IWineD3DSurfaceImpl *)(swapchain->backBuffer ? swapchain->backBuffer[0] : swapchain->frontBuffer);
- context = context_create(This, target, swapchain->win_handle, FALSE, &swapchain->presentParms);
- if (!context)
+ target = swapchain->back_buffers ? swapchain->back_buffers[0] : swapchain->front_buffer;
+ if (!(context = context_create(swapchain, target, swapchain->ds_format)))
{
WARN("Failed to create context.\n");
HeapFree(GetProcessHeap(), 0, swapchain->context);
@@ -6427,7 +6369,7 @@ HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain *
return WINED3D_OK;
err:
- context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ context_acquire(This, NULL);
destroy_dummy_textures(This, context->gl_info);
context_release(context);
context_destroy(This, context);
@@ -6499,7 +6441,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
pPresentationParameters->hDeviceWindow != swapchain->presentParms.hDeviceWindow) {
ERR("Cannot change the device window yet\n");
}
- if (pPresentationParameters->EnableAutoDepthStencil && !This->auto_depth_stencil_buffer) {
+ if (pPresentationParameters->EnableAutoDepthStencil && !This->auto_depth_stencil)
+ {
HRESULT hrc;
TRACE("Creating the depth stencil buffer\n");
@@ -6512,7 +6455,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
pPresentationParameters->MultiSampleType,
pPresentationParameters->MultiSampleQuality,
FALSE,
- &This->auto_depth_stencil_buffer);
+ (IWineD3DSurface **)&This->auto_depth_stencil);
if (FAILED(hrc)) {
ERR("Failed to create the depth stencil buffer\n");
@@ -6521,9 +6464,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
}
}
+ if (This->onscreen_depth_stencil)
+ {
+ IWineD3DSurface_Release((IWineD3DSurface *)This->onscreen_depth_stencil);
+ This->onscreen_depth_stencil = NULL;
+ }
+
/* Reset the depth stencil */
if (pPresentationParameters->EnableAutoDepthStencil)
- IWineD3DDevice_SetDepthStencilSurface(iface, This->auto_depth_stencil_buffer);
+ IWineD3DDevice_SetDepthStencilSurface(iface, (IWineD3DSurface *)This->auto_depth_stencil);
else
IWineD3DDevice_SetDepthStencilSurface(iface, NULL);
@@ -6531,7 +6480,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->updateStateBlock);
IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->stateBlock);
- delete_opengl_contexts(iface, (IWineD3DSwapChain *) swapchain);
+ delete_opengl_contexts(iface, swapchain);
if(pPresentationParameters->Windowed) {
mode.Width = swapchain->orig_width;
@@ -6558,23 +6507,25 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
swapchain->presentParms.BackBufferWidth = pPresentationParameters->BackBufferWidth;
swapchain->presentParms.BackBufferHeight = pPresentationParameters->BackBufferHeight;
- hr = updateSurfaceDesc((IWineD3DSurfaceImpl *)swapchain->frontBuffer, pPresentationParameters);
+ hr = updateSurfaceDesc(swapchain->front_buffer, pPresentationParameters);
if(FAILED(hr))
{
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
return hr;
}
- for(i = 0; i < swapchain->presentParms.BackBufferCount; i++) {
- hr = updateSurfaceDesc((IWineD3DSurfaceImpl *)swapchain->backBuffer[i], pPresentationParameters);
+ for (i = 0; i < swapchain->presentParms.BackBufferCount; ++i)
+ {
+ hr = updateSurfaceDesc(swapchain->back_buffers[i], pPresentationParameters);
if(FAILED(hr))
{
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
return hr;
}
}
- if(This->auto_depth_stencil_buffer) {
- hr = updateSurfaceDesc((IWineD3DSurfaceImpl *)This->auto_depth_stencil_buffer, pPresentationParameters);
+ if (This->auto_depth_stencil)
+ {
+ hr = updateSurfaceDesc(This->auto_depth_stencil, pPresentationParameters);
if(FAILED(hr))
{
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
@@ -6583,24 +6534,26 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
}
}
- if((pPresentationParameters->Windowed && !swapchain->presentParms.Windowed) ||
- (swapchain->presentParms.Windowed && !pPresentationParameters->Windowed) ||
- DisplayModeChanged) {
-
+ if (!pPresentationParameters->Windowed != !swapchain->presentParms.Windowed
+ || DisplayModeChanged)
+ {
IWineD3DDevice_SetDisplayMode(iface, 0, &mode);
- if(swapchain->win_handle && !pPresentationParameters->Windowed) {
+ if (!pPresentationParameters->Windowed)
+ {
if(swapchain->presentParms.Windowed) {
/* switch from windowed to fs */
swapchain_setup_fullscreen_window(swapchain, pPresentationParameters->BackBufferWidth,
pPresentationParameters->BackBufferHeight);
} else {
/* Fullscreen -> fullscreen mode change */
- MoveWindow(swapchain->win_handle, 0, 0,
+ MoveWindow(swapchain->device_window, 0, 0,
pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight,
TRUE);
}
- } else if(swapchain->win_handle && !swapchain->presentParms.Windowed) {
+ }
+ else if (!swapchain->presentParms.Windowed)
+ {
/* Fullscreen -> windowed switch */
swapchain_restore_fullscreen_window(swapchain);
}
@@ -6657,7 +6610,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
}
}
- hr = create_primary_opengl_context(iface, (IWineD3DSwapChain *) swapchain);
+ hr = create_primary_opengl_context(iface, swapchain);
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
/* All done. There is no need to reload resources or shaders, this will happen automatically on the
@@ -6747,13 +6700,11 @@ void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resour
{
for (i = 0; i < This->adapter->gl_info.limits.buffers; ++i)
{
- if (This->render_targets[i] == (IWineD3DSurface *)resource) {
+ if (This->render_targets[i] == (IWineD3DSurfaceImpl *)resource)
This->render_targets[i] = NULL;
- }
- }
- if (This->stencilBufferTarget == (IWineD3DSurface *)resource) {
- This->stencilBufferTarget = NULL;
}
+ if (This->depth_stencil == (IWineD3DSurfaceImpl *)resource)
+ This->depth_stencil = NULL;
}
break;
@@ -6845,6 +6796,28 @@ static HRESULT WINAPI IWineD3DDeviceImpl_EnumResources(IWineD3DDevice *iface, D3
return WINED3D_OK;
}
+static HRESULT WINAPI IWineD3DDeviceImpl_GetSurfaceFromDC(IWineD3DDevice *iface, HDC dc, IWineD3DSurface **surface)
+{
+ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
+ IWineD3DResourceImpl *resource;
+
+ LIST_FOR_EACH_ENTRY(resource, &This->resources, IWineD3DResourceImpl, resource.resource_list_entry)
+ {
+ WINED3DRESOURCETYPE type = IWineD3DResource_GetType((IWineD3DResource *)resource);
+ if (type == WINED3DRTYPE_SURFACE)
+ {
+ if (((IWineD3DSurfaceImpl *)resource)->hDC == dc)
+ {
+ TRACE("Found surface %p for dc %p.\n", resource, dc);
+ *surface = (IWineD3DSurface *)resource;
+ return WINED3D_OK;
+ }
+ }
+ }
+
+ return WINED3DERR_INVALIDCALL;
+}
+
/**********************************************************
* IWineD3DDevice VTbl follows
**********************************************************/
@@ -6993,7 +6966,10 @@ static const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl =
IWineD3DDeviceImpl_UpdateSurface,
IWineD3DDeviceImpl_GetFrontBufferData,
/*** object tracking ***/
- IWineD3DDeviceImpl_EnumResources
+ IWineD3DDeviceImpl_EnumResources,
+ IWineD3DDeviceImpl_GetSurfaceFromDC,
+ IWineD3DDeviceImpl_AcquireFocusWindow,
+ IWineD3DDeviceImpl_ReleaseFocusWindow,
};
HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
@@ -7045,27 +7021,29 @@ HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
select_shader_mode(&adapter->gl_info, &device->ps_selected_mode, &device->vs_selected_mode);
device->shader_backend = adapter->shader_backend;
- memset(&shader_caps, 0, sizeof(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));
+ if (device->shader_backend)
+ {
+ 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;
+ }
fragment_pipeline = adapter->fragment_pipe;
device->frag_pipe = fragment_pipeline;
- fragment_pipeline->get_caps(&adapter->gl_info, &ffp_caps);
- device->max_ffp_textures = ffp_caps.MaxSimultaneousTextures;
-
- hr = compile_state_table(device->StateTable, device->multistate_funcs, &adapter->gl_info,
- ffp_vertexstate_template, fragment_pipeline, misc_state_template);
- if (FAILED(hr))
+ if (fragment_pipeline)
{
- ERR("Failed to compile state table, hr %#x.\n", hr);
- IWineD3D_Release(device->wined3d);
- return hr;
- }
+ fragment_pipeline->get_caps(&adapter->gl_info, &ffp_caps);
+ device->max_ffp_textures = ffp_caps.MaxSimultaneousTextures;
+ hr = compile_state_table(device->StateTable, device->multistate_funcs, &adapter->gl_info,
+ ffp_vertexstate_template, fragment_pipeline, misc_state_template);
+ if (FAILED(hr))
+ {
+ ERR("Failed to compile state table, hr %#x.\n", hr);
+ IWineD3D_Release(device->wined3d);
+ return hr;
+ }
+ }
device->blitter = adapter->blitter;
return WINED3D_OK;
@@ -7090,31 +7068,21 @@ void IWineD3DDeviceImpl_MarkStateDirty(IWineD3DDeviceImpl *This, DWORD state) {
}
}
-void get_drawable_size_pbuffer(struct wined3d_context *context, UINT *width, UINT *height)
-{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->current_rt)->resource.device;
- /* The drawable size of a pbuffer render target is the current pbuffer size. */
- *width = device->pbufferWidth;
- *height = device->pbufferHeight;
-}
-
void get_drawable_size_fbo(struct wined3d_context *context, UINT *width, UINT *height)
{
- IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)context->current_rt;
/* The drawable size of a fbo target is the opengl texture size, which is the power of two size. */
- *width = surface->pow2Width;
- *height = surface->pow2Height;
+ *width = context->current_rt->pow2Width;
+ *height = context->current_rt->pow2Height;
}
void get_drawable_size_backbuffer(struct wined3d_context *context, UINT *width, UINT *height)
{
- IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)context->surface;
+ IWineD3DSwapChainImpl *swapchain = context->swapchain;
/* The drawable size of a backbuffer / aux buffer offscreen target is the size of the
* current context's drawable, which is the size of the back buffer of the swapchain
- * the active context belongs to. The back buffer of the swapchain is stored as the
- * surface the context belongs to. */
- *width = surface->currentDesc.Width;
- *height = surface->currentDesc.Height;
+ * the active context belongs to. */
+ *width = swapchain->presentParms.BackBufferWidth;
+ *height = swapchain->presentParms.BackBufferHeight;
}
LRESULT device_process_message(IWineD3DDeviceImpl *device, HWND window,
diff --git a/dll/directx/wine/wined3d/directx.c b/dll/directx/wine/wined3d/directx.c
index 812e5ccc9e8..29061476ddd 100644
--- a/dll/directx/wine/wined3d/directx.c
+++ b/dll/directx/wine/wined3d/directx.c
@@ -24,14 +24,13 @@
*/
#include "config.h"
+#include
#include "wined3d_private.h"
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 } };
@@ -74,6 +73,7 @@ static const struct {
{"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_shadow", ARB_SHADOW, 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 },
@@ -104,6 +104,7 @@ static const struct {
{"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_draw_buffers2", EXT_DRAW_BUFFERS2, 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 },
@@ -325,12 +326,12 @@ fail:
}
/* Adjust the amount of used texture memory */
-long WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *D3DDevice, long glram)
+unsigned int WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *device, unsigned int glram)
{
- struct wined3d_adapter *adapter = D3DDevice->adapter;
+ struct wined3d_adapter *adapter = device->adapter;
adapter->UsedTextureRam += glram;
- TRACE("Adjusted gl ram by %ld to %d\n", glram, adapter->UsedTextureRam);
+ TRACE("Adjusted gl ram by %d to %d\n", glram, adapter->UsedTextureRam);
return adapter->UsedTextureRam;
}
@@ -528,9 +529,12 @@ static void test_pbo_functionality(struct wined3d_gl_info *gl_info)
checkGLcall("Loading the PBO test texture");
GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0));
+ LEAVE_GL();
+
wglFinish(); /* just to be sure */
memset(check, 0, sizeof(check));
+ ENTER_GL();
glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, check);
checkGLcall("Reading back the PBO test texture");
@@ -570,7 +574,7 @@ static BOOL match_apple_nonr500ati(const struct wined3d_gl_info *gl_info, const
static BOOL match_fglrx(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
{
- return (gl_vendor == GL_VENDOR_ATI);
+ return gl_vendor == GL_VENDOR_FGLRX;
}
@@ -669,6 +673,61 @@ static BOOL match_broken_nv_clip(const struct wined3d_gl_info *gl_info, const ch
return ret;
}
+/* Context activation is done by the caller. */
+static BOOL match_fbo_tex_update(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+ enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
+{
+ char data[4 * 4 * 4];
+ GLuint tex, fbo;
+ GLenum status;
+
+ if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) return FALSE;
+
+ memset(data, 0xcc, sizeof(data));
+
+ ENTER_GL();
+
+ glGenTextures(1, &tex);
+ glBindTexture(GL_TEXTURE_2D, tex);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
+ checkGLcall("glTexImage2D");
+
+ gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
+ gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+ gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
+ checkGLcall("glFramebufferTexture2D");
+
+ status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ if (status != GL_FRAMEBUFFER_COMPLETE) ERR("FBO status %#x\n", status);
+ checkGLcall("glCheckFramebufferStatus");
+
+ memset(data, 0x11, sizeof(data));
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
+ checkGLcall("glTexSubImage2D");
+
+ glClearColor(0.996, 0.729, 0.745, 0.792);
+ glClear(GL_COLOR_BUFFER_BIT);
+ checkGLcall("glClear");
+
+ glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
+ checkGLcall("glGetTexImage");
+
+ gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
+ gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ checkGLcall("glBindTexture");
+
+ gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
+ glDeleteTextures(1, &tex);
+ checkGLcall("glDeleteTextures");
+
+ LEAVE_GL();
+
+ return *(DWORD *)data == 0x11111111;
+}
+
static void quirk_arb_constants(struct wined3d_gl_info *gl_info)
{
TRACE_(d3d_caps)("Using ARB vs constant limit(=%u) for GLSL.\n", gl_info->limits.arb_vs_native_constants);
@@ -797,6 +856,11 @@ static void quirk_disable_nvvp_clip(struct wined3d_gl_info *gl_info)
gl_info->quirks |= WINED3D_QUIRK_NV_CLIP_BROKEN;
}
+static void quirk_fbo_tex_update(struct wined3d_gl_info *gl_info)
+{
+ gl_info->quirks |= WINED3D_QUIRK_FBO_TEX_UPDATE;
+}
+
struct driver_quirk
{
BOOL (*match)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
@@ -876,6 +940,11 @@ static const struct driver_quirk quirk_table[] =
quirk_disable_nvvp_clip,
"Apple NV_vertex_program clip bug quirk"
},
+ {
+ match_fbo_tex_update,
+ quirk_fbo_tex_update,
+ "FBO rebind for attachment updates"
+ },
};
/* Certain applications (Steam) complain if we report an outdated driver version. In general,
@@ -955,7 +1024,7 @@ static const struct driver_version_information driver_version_table[] =
{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_HD2350, "ATI Mobility Radeon HD 2350", 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 },
@@ -1131,10 +1200,11 @@ static enum wined3d_gl_vendor wined3d_guess_gl_vendor(struct wined3d_gl_info *gl
return GL_VENDOR_NVIDIA;
if (strstr(gl_vendor_string, "ATI"))
- return GL_VENDOR_ATI;
+ return GL_VENDOR_FGLRX;
if (strstr(gl_vendor_string, "Intel(R)")
- || strstr(gl_renderer, "Intel(R)")
+ /* Intel switched from Intel(R) to Intel® recently, so just match Intel. */
+ || strstr(gl_renderer, "Intel")
|| strstr(gl_vendor_string, "Intel Inc."))
return GL_VENDOR_INTEL;
@@ -1148,9 +1218,10 @@ static enum wined3d_gl_vendor wined3d_guess_gl_vendor(struct wined3d_gl_info *gl
|| strstr(gl_renderer, "Gallium"))
return GL_VENDOR_MESA;
- FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning GL_VENDOR_WINE.\n", debugstr_a(gl_vendor_string));
+ FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning GL_VENDOR_UNKNOWN.\n",
+ debugstr_a(gl_vendor_string));
- return GL_VENDOR_WINE;
+ return GL_VENDOR_UNKNOWN;
}
static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_string, const char *gl_renderer)
@@ -1165,14 +1236,15 @@ static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_s
return HW_VENDOR_ATI;
if (strstr(gl_vendor_string, "Intel(R)")
- || strstr(gl_renderer, "Intel(R)")
+ /* Intel switched from Intel(R) to Intel® recently, so just match Intel. */
+ || strstr(gl_renderer, "Intel")
|| 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;
+ return HW_VENDOR_SOFTWARE;
FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning HW_VENDOR_NVIDIA.\n", debugstr_a(gl_vendor_string));
@@ -1181,13 +1253,10 @@ static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_s
-enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- unsigned int *vidmem )
+static 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])
+ if (WINE_D3D10_CAPABLE(gl_info))
{
/* Geforce 200 - highend */
if (strstr(gl_renderer, "GTX 280")
@@ -1293,6 +1362,16 @@ enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl_info *
return CARD_NVIDIA_GEFORCE_8300GS;
}
+ /* Geforce8-compatible fall back if the GPU is not in the list yet */
+ *vidmem = 128;
+ return CARD_NVIDIA_GEFORCE_8300GS;
+ }
+
+ /* 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])
+ {
/* Geforce7 - highend */
if (strstr(gl_renderer, "7800")
|| strstr(gl_renderer, "7900")
@@ -1425,14 +1504,14 @@ enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl_info *
}
-enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- unsigned int *vidmem )
+static 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))
+ if (WINE_D3D10_CAPABLE(gl_info))
{
/* Radeon EG CYPRESS XT / PRO HD5800 - highend */
if (strstr(gl_renderer, "HD 5800") /* Radeon EG CYPRESS HD58xx generic renderer string */
@@ -1507,16 +1586,17 @@ enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_
return CARD_ATI_RADEON_HD2600;
}
- /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
- if (strstr(gl_renderer, "HD 2300")
+ /* Radeon R6xx HD2350/HD2400/HD3400 - lowend
+ * Note HD2300=DX9, HD2350=DX10 */
+ if (strstr(gl_renderer, "HD 2350")
|| 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;
+ *vidmem = 256; /* HD2350/2400 use 256MB, HD34xx use 256-512MB */
+ return CARD_ATI_RADEON_HD2350;
}
/* Radeon R6xx/R7xx integrated */
@@ -1528,6 +1608,13 @@ enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_
return CARD_ATI_RADEON_HD3200;
}
+ /* Default for when no GPU has been found */
+ *vidmem = 128; /* 128MB */
+ return CARD_ATI_RADEON_HD3200;
+ }
+
+ if (WINE_D3D8_CAPABLE(gl_info))
+ {
/* Radeon R5xx */
if (strstr(gl_renderer, "X1600")
|| strstr(gl_renderer, "X1650")
@@ -1539,14 +1626,19 @@ enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_
return CARD_ATI_RADEON_X1600;
}
- /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300 (lowend R5xx) */
+ /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300/X2500/HD2300 (lowend R5xx)
+ * Note X2300/X2500/HD2300 are R5xx GPUs with a 2xxx naming but they are still DX9-only */
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"))
+ || strstr(gl_renderer, "X1550")
+ || strstr(gl_renderer, "X2300")
+ || strstr(gl_renderer, "X2500")
+ || strstr(gl_renderer, "HD 2300")
+ )
{
*vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */
return CARD_ATI_RADEON_X700;
@@ -1581,8 +1673,8 @@ enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_
}
-enum wined3d_pci_device select_card_intel_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- unsigned int *vidmem )
+static 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"))
{
@@ -1607,8 +1699,8 @@ enum wined3d_pci_device select_card_intel_binary(const struct wined3d_gl_info *g
}
-enum wined3d_pci_device (select_card_ati_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- unsigned int *vidmem )
+static 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
*
@@ -1663,12 +1755,12 @@ enum wined3d_pci_device (select_card_ati_mesa)(const struct wined3d_gl_info *gl_
return CARD_ATI_RADEON_HD2600;
}
- /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
+ /* Radeon R6xx HD2350/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;
+ *vidmem = 256; /* HD2350/2400 use 256MB, HD34xx use 256-512MB */
+ return CARD_ATI_RADEON_HD2350;
}
/* Radeon R6xx/R7xx integrated */
@@ -1786,8 +1878,8 @@ enum wined3d_pci_device (select_card_ati_mesa)(const struct wined3d_gl_info *gl_
if (strstr(gl_renderer, "(RV610")
|| strstr(gl_renderer, "(RV620"))
{
- *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
- return CARD_ATI_RADEON_HD2300;
+ *vidmem = 256; /* HD2350/2400 use 256MB, HD34xx use 256-512MB */
+ return CARD_ATI_RADEON_HD2350;
}
/* Radeon R6xx/R7xx integrated */
@@ -1816,8 +1908,8 @@ enum wined3d_pci_device (select_card_ati_mesa)(const struct wined3d_gl_info *gl_
}
-enum wined3d_pci_device (select_card_nvidia_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- unsigned int *vidmem )
+static 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;
@@ -1827,8 +1919,8 @@ enum wined3d_pci_device (select_card_nvidia_mesa)(const struct wined3d_gl_info *
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 )
+static 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;
@@ -1850,10 +1942,11 @@ static const struct vendor_card_selection vendor_card_select_table[] =
{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_FGLRX, 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}
+ {GL_VENDOR_MESA, HW_VENDOR_INTEL, "Mesa Intel driver", select_card_intel_mesa},
+ {GL_VENDOR_INTEL, HW_VENDOR_INTEL, "Mesa Intel driver", select_card_intel_mesa}
};
@@ -2034,6 +2127,7 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter)
* with Default values
*/
memset(gl_info->supported, 0, sizeof(gl_info->supported));
+ gl_info->limits.blends = 1;
gl_info->limits.buffers = 1;
gl_info->limits.textures = 1;
gl_info->limits.fragment_samplers = 1;
@@ -2347,7 +2441,13 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter)
if (gl_info->supported[ARB_SHADING_LANGUAGE_100])
{
const char *str = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION_ARB);
+ unsigned int major, minor;
+
TRACE_(d3d_caps)("GLSL version string: %s.\n", debugstr_a(str));
+
+ /* The format of the GLSL version string is "major.minor[.release] [vendor info]". */
+ sscanf(str, "%u.%u", &major, &minor);
+ gl_info->glsl_version = MAKEDWORD_VERSION(major, minor);
}
if (gl_info->supported[NV_LIGHT_MAX_EXPONENT])
{
@@ -2522,10 +2622,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter)
ThisExtn[len] = '\0';
TRACE_(d3d_caps)("- %s\n", debugstr_a(ThisExtn));
- if (!strcmp(ThisExtn, "WGL_ARB_pbuffer")) {
- gl_info->supported[WGL_ARB_PBUFFER] = TRUE;
- TRACE_(d3d_caps)("FOUND: WGL_ARB_pbuffer support\n");
- }
if (!strcmp(ThisExtn, "WGL_ARB_pixel_format")) {
gl_info->supported[WGL_ARB_PIXEL_FORMAT] = TRUE;
TRACE_(d3d_caps)("FOUND: WGL_ARB_pixel_format support\n");
@@ -2590,7 +2686,7 @@ static UINT WINAPI IWineD3DImpl_GetAdapterModeCount(IWineD3D *iface, UINT Ad
/* TODO: Store modes per adapter and read it from the adapter structure */
if (Adapter == 0) { /* Display */
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(Format, &This->adapters[Adapter].gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(Format, &This->adapters[Adapter].gl_info);
UINT format_bits = format_desc->byte_count * CHAR_BIT;
unsigned int i = 0;
unsigned int j = 0;
@@ -2637,7 +2733,7 @@ static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapte
/* TODO: Store modes per adapter and read it from the adapter structure */
if (Adapter == 0)
{
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(Format, &This->adapters[Adapter].gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(Format, &This->adapters[Adapter].gl_info);
UINT format_bits = format_desc->byte_count * CHAR_BIT;
DEVMODEW DevModeW;
int ModeIdx = 0;
@@ -2802,13 +2898,16 @@ static HRESULT WINAPI IWineD3DImpl_GetAdapterIdentifier(IWineD3D *iface, UINT Ad
}
static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(const struct wined3d_gl_info *gl_info,
- const WineD3D_PixelFormat *cfg, const struct GlPixelFormatDesc *format_desc)
+ const WineD3D_PixelFormat *cfg, const struct wined3d_format_desc *format_desc)
{
short redSize, greenSize, blueSize, alphaSize, colorBits;
if(!cfg)
return FALSE;
+ /* Float formats need FBOs. If FBOs are used this function isn't called */
+ if (format_desc->Flags & WINED3DFMT_FLAG_FLOAT) return FALSE;
+
if(cfg->iPixelType == WGL_TYPE_RGBA_ARB) { /* Integer RGBA formats */
if (!getColorBits(format_desc, &redSize, &greenSize, &blueSize, &alphaSize, &colorBits))
{
@@ -2829,29 +2928,14 @@ static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(const struct wined
return FALSE;
return TRUE;
- } else if(cfg->iPixelType == WGL_TYPE_RGBA_FLOAT_ARB) { /* Float RGBA formats; TODO: WGL_NV_float_buffer */
- if (format_desc->format == WINED3DFMT_R16_FLOAT)
- return (cfg->redSize == 16 && cfg->greenSize == 0 && cfg->blueSize == 0 && cfg->alphaSize == 0);
- if (format_desc->format == WINED3DFMT_R16G16_FLOAT)
- return (cfg->redSize == 16 && cfg->greenSize == 16 && cfg->blueSize == 0 && cfg->alphaSize == 0);
- if (format_desc->format == WINED3DFMT_R16G16B16A16_FLOAT)
- return (cfg->redSize == 16 && cfg->greenSize == 16 && cfg->blueSize == 16 && cfg->alphaSize == 16);
- if (format_desc->format == WINED3DFMT_R32_FLOAT)
- return (cfg->redSize == 32 && cfg->greenSize == 0 && cfg->blueSize == 0 && cfg->alphaSize == 0);
- if (format_desc->format == WINED3DFMT_R32G32_FLOAT)
- return (cfg->redSize == 32 && cfg->greenSize == 32 && cfg->blueSize == 0 && cfg->alphaSize == 0);
- if (format_desc->format == WINED3DFMT_R32G32B32A32_FLOAT)
- return (cfg->redSize == 32 && cfg->greenSize == 32 && cfg->blueSize == 32 && cfg->alphaSize == 32);
- } else {
- /* Probably a color index mode */
- return FALSE;
}
+ /* Probably a RGBA_float or color index mode */
return FALSE;
}
static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(const struct wined3d_gl_info *gl_info,
- const WineD3D_PixelFormat *cfg, const struct GlPixelFormatDesc *format_desc)
+ const WineD3D_PixelFormat *cfg, const struct wined3d_format_desc *format_desc)
{
short depthSize, stencilSize;
BOOL lockable = FALSE;
@@ -2865,6 +2949,9 @@ static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(const struct wined3
return FALSE;
}
+ /* Float formats need FBOs. If FBOs are used this function isn't called */
+ if (format_desc->Flags & WINED3DFMT_FLAG_FLOAT) return FALSE;
+
if ((format_desc->format == WINED3DFMT_D16_LOCKABLE) || (format_desc->format == WINED3DFMT_D32_FLOAT))
lockable = TRUE;
@@ -2890,8 +2977,8 @@ static HRESULT WINAPI IWineD3DImpl_CheckDepthStencilMatch(IWineD3D *iface, UINT
int nCfgs;
const WineD3D_PixelFormat *cfgs;
const struct wined3d_adapter *adapter;
- const struct GlPixelFormatDesc *rt_format_desc;
- const struct GlPixelFormatDesc *ds_format_desc;
+ const struct wined3d_format_desc *rt_format_desc;
+ const struct wined3d_format_desc *ds_format_desc;
int it;
WARN_(d3d_caps)("(%p)-> (STUB) (Adptr:%d, DevType:(%x,%s), AdptFmt:(%x,%s), RendrTgtFmt:(%x,%s), DepthStencilFmt:(%x,%s))\n",
@@ -2909,15 +2996,26 @@ static HRESULT WINAPI IWineD3DImpl_CheckDepthStencilMatch(IWineD3D *iface, UINT
adapter = &This->adapters[Adapter];
rt_format_desc = getFormatDescEntry(RenderTargetFormat, &adapter->gl_info);
ds_format_desc = getFormatDescEntry(DepthStencilFormat, &adapter->gl_info);
- cfgs = adapter->cfgs;
- nCfgs = adapter->nCfgs;
- for (it = 0; it < nCfgs; ++it) {
- if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, &cfgs[it], rt_format_desc))
- {
- if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, &cfgs[it], ds_format_desc))
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
+ if ((rt_format_desc->Flags & WINED3DFMT_FLAG_RENDERTARGET) &&
+ (ds_format_desc->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))) {
+ TRACE_(d3d_caps)("(%p) : Formats matched\n", This);
+ return WINED3D_OK;
+ }
+ }
+ else
+ {
+ cfgs = adapter->cfgs;
+ nCfgs = adapter->nCfgs;
+ for (it = 0; it < nCfgs; ++it) {
+ if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, &cfgs[it], rt_format_desc))
{
- TRACE_(d3d_caps)("(%p) : Formats matched\n", This);
- return WINED3D_OK;
+ if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, &cfgs[it], ds_format_desc))
+ {
+ TRACE_(d3d_caps)("(%p) : Formats matched\n", This);
+ return WINED3D_OK;
+ }
}
}
}
@@ -2930,7 +3028,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, U
WINED3DFORMAT SurfaceFormat, BOOL Windowed, WINED3DMULTISAMPLE_TYPE MultiSampleType, DWORD *pQualityLevels)
{
IWineD3DImpl *This = (IWineD3DImpl *)iface;
- const struct GlPixelFormatDesc *glDesc;
+ const struct wined3d_format_desc *glDesc;
const struct wined3d_adapter *adapter;
TRACE_(d3d_caps)("(%p)-> (Adptr:%d, DevType:(%x,%s), SurfFmt:(%x,%s), Win?%d, MultiSamp:%x, pQual:%p)\n",
@@ -3109,51 +3207,41 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceType(IWineD3D *iface, UINT Adapter
/* Check if we support bumpmapping for a format */
-static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter,
- WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc)
+static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
{
- switch(format_desc->format)
- {
- case WINED3DFMT_R8G8_SNORM:
- case WINED3DFMT_R16G16_SNORM:
- case WINED3DFMT_R5G5_SNORM_L6_UNORM:
- case WINED3DFMT_R8G8_SNORM_L8X8_UNORM:
- case WINED3DFMT_R8G8B8A8_SNORM:
- /* 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. */
- if (adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup))
- {
- TRACE_(d3d_caps)("[OK]\n");
- return TRUE;
- }
- TRACE_(d3d_caps)("[FAILED]\n");
- return FALSE;
-
- default:
- TRACE_(d3d_caps)("[FAILED]\n");
- return FALSE;
- }
+ /* 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. */
+ return (format_desc->Flags & WINED3DFMT_FLAG_BUMPMAP)
+ && adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup);
}
/* Check if the given DisplayFormat + DepthStencilFormat combination is valid for the Adapter */
static BOOL CheckDepthStencilCapability(struct wined3d_adapter *adapter,
- const struct GlPixelFormatDesc *display_format_desc, const struct GlPixelFormatDesc *ds_format_desc)
+ const struct wined3d_format_desc *display_format_desc, const struct wined3d_format_desc *ds_format_desc)
{
int it=0;
/* Only allow depth/stencil formats */
if (!(ds_format_desc->depth_size || ds_format_desc->stencil_size)) return FALSE;
- /* Walk through all WGL pixel formats to find a match */
- for (it = 0; it < adapter->nCfgs; ++it)
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
{
- WineD3D_PixelFormat *cfg = &adapter->cfgs[it];
- if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, cfg, display_format_desc))
+ /* With FBOs WGL limitations do not apply, but the format needs to be FBO attachable */
+ if (ds_format_desc->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) return TRUE;
+ }
+ else
+ {
+ /* Walk through all WGL pixel formats to find a match */
+ for (it = 0; it < adapter->nCfgs; ++it)
{
- if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, cfg, ds_format_desc))
+ WineD3D_PixelFormat *cfg = &adapter->cfgs[it];
+ if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, cfg, display_format_desc))
{
- return TRUE;
+ if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, cfg, ds_format_desc))
+ {
+ return TRUE;
+ }
}
}
}
@@ -3161,7 +3249,7 @@ static BOOL CheckDepthStencilCapability(struct wined3d_adapter *adapter,
return FALSE;
}
-static BOOL CheckFilterCapability(struct wined3d_adapter *adapter, const struct GlPixelFormatDesc *format_desc)
+static BOOL CheckFilterCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
{
/* The flags entry of a format contains the filtering capability */
if (format_desc->Flags & WINED3DFMT_FLAG_FILTERING) return TRUE;
@@ -3171,11 +3259,10 @@ static BOOL CheckFilterCapability(struct wined3d_adapter *adapter, const struct
/* Check the render target capabilities of a format */
static BOOL CheckRenderTargetCapability(struct wined3d_adapter *adapter,
- const struct GlPixelFormatDesc *adapter_format_desc, const struct GlPixelFormatDesc *check_format_desc)
+ const struct wined3d_format_desc *adapter_format_desc, const struct wined3d_format_desc *check_format_desc)
{
/* Filter out non-RT formats */
if (!(check_format_desc->Flags & WINED3DFMT_FLAG_RENDERTARGET)) return FALSE;
-
if(wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER) {
WineD3D_PixelFormat *cfgs = adapter->cfgs;
int it;
@@ -3204,23 +3291,9 @@ static BOOL CheckRenderTargetCapability(struct wined3d_adapter *adapter,
return TRUE;
}
}
- } else if(wined3d_settings.offscreen_rendering_mode == ORM_PBUFFER) {
- /* We can probably use this function in FBO mode too on some drivers to get some basic indication of the capabilities. */
- WineD3D_PixelFormat *cfgs = adapter->cfgs;
- int it;
-
- /* Check if there is a WGL pixel format matching the requirements, the pixel format should also be usable with pbuffers */
- for (it = 0; it < adapter->nCfgs; ++it)
- {
- if (cfgs[it].pbufferDrawable && IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info,
- &cfgs[it], check_format_desc))
- {
- TRACE_(d3d_caps)("iPixelFormat=%d is compatible with CheckFormat=%s\n",
- cfgs[it].iPixelFormat, debug_d3dformat(check_format_desc->format));
- return TRUE;
- }
- }
- } else if(wined3d_settings.offscreen_rendering_mode == ORM_FBO){
+ }
+ else if(wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
/* For now return TRUE for FBOs until we have some proper checks.
* Note that this function will only be called when the format is around for texturing. */
return TRUE;
@@ -3228,46 +3301,18 @@ static BOOL CheckRenderTargetCapability(struct wined3d_adapter *adapter,
return FALSE;
}
-static BOOL CheckSrgbReadCapability(struct wined3d_adapter *adapter, const struct GlPixelFormatDesc *format_desc)
+static BOOL CheckSrgbReadCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
{
- const struct wined3d_gl_info *gl_info = &adapter->gl_info;
-
- /* Check for supported sRGB formats (Texture loading and framebuffer) */
- if (!gl_info->supported[EXT_TEXTURE_SRGB])
- {
- TRACE_(d3d_caps)("[FAILED] GL_EXT_texture_sRGB not supported\n");
- return FALSE;
- }
-
- switch (format_desc->format)
- {
- case WINED3DFMT_B8G8R8A8_UNORM:
- case WINED3DFMT_B8G8R8X8_UNORM:
- case WINED3DFMT_B4G4R4A4_UNORM:
- case WINED3DFMT_L8_UNORM:
- case WINED3DFMT_L8A8_UNORM:
- case WINED3DFMT_DXT1:
- case WINED3DFMT_DXT2:
- case WINED3DFMT_DXT3:
- case WINED3DFMT_DXT4:
- case WINED3DFMT_DXT5:
- TRACE_(d3d_caps)("[OK]\n");
- return TRUE;
-
- default:
- TRACE_(d3d_caps)("[FAILED] Gamma texture format %s not supported.\n", debug_d3dformat(format_desc->format));
- return FALSE;
- }
- return FALSE;
+ return adapter->gl_info.supported[EXT_TEXTURE_SRGB]
+ && (format_desc->Flags & WINED3DFMT_FLAG_SRGB_READ);
}
-static BOOL CheckSrgbWriteCapability(struct wined3d_adapter *adapter,
- WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc)
+static BOOL CheckSrgbWriteCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
{
/* Only offer SRGB writing on X8R8G8B8/A8R8G8B8 when we use ARB or GLSL shaders as we are
* doing the color fixup in shaders.
* Note Windows drivers (at least on the Geforce 8800) also offer this on R5G6B5. */
- if ((format_desc->format == WINED3DFMT_B8G8R8X8_UNORM) || (format_desc->format == WINED3DFMT_B8G8R8A8_UNORM))
+ if (format_desc->Flags & WINED3DFMT_FLAG_SRGB_WRITE)
{
int vs_selected_mode;
int ps_selected_mode;
@@ -3285,7 +3330,7 @@ static BOOL CheckSrgbWriteCapability(struct wined3d_adapter *adapter,
/* Check if a format support blending in combination with pixel shaders */
static BOOL CheckPostPixelShaderBlendingCapability(struct wined3d_adapter *adapter,
- const struct GlPixelFormatDesc *format_desc)
+ const struct wined3d_format_desc *format_desc)
{
/* The flags entry of a format contains the post pixel shader blending capability */
if (format_desc->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING) return TRUE;
@@ -3293,7 +3338,7 @@ static BOOL CheckPostPixelShaderBlendingCapability(struct wined3d_adapter *adapt
return FALSE;
}
-static BOOL CheckWrapAndMipCapability(struct wined3d_adapter *adapter, const struct GlPixelFormatDesc *format_desc)
+static BOOL CheckWrapAndMipCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
{
/* OpenGL supports mipmapping on all formats basically. Wrapping is unsupported,
* but we have to report mipmapping so we cannot reject this flag. Tests show that
@@ -3308,8 +3353,7 @@ static BOOL CheckWrapAndMipCapability(struct wined3d_adapter *adapter, const str
}
/* Check if a texture format is supported on the given adapter */
-static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
- WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc)
+static BOOL CheckTextureCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
{
const struct wined3d_gl_info *gl_info = &adapter->gl_info;
@@ -3340,12 +3384,12 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
return FALSE;
/*****
- * supported: Palettized
+ * Not supported: Palettized
+ * Only some Geforce/Voodoo3/G400 cards offer 8-bit textures in case of <=Direct3D7.
+ * Since it is not widely available, don't offer it. Further no Windows driver offers
+ * WINED3DFMT_P8_UINT_A8_NORM, so don't offer it either.
*/
case WINED3DFMT_P8_UINT:
- TRACE_(d3d_caps)("[OK]\n");
- return TRUE;
- /* No Windows driver offers WINED3DFMT_P8_UINT_A8_UNORM, so don't offer it either */
case WINED3DFMT_P8_UINT_A8_UNORM:
return FALSE;
@@ -3539,8 +3583,10 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
return FALSE;
}
-static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, const struct GlPixelFormatDesc *adapter_format_desc,
- WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *check_format_desc, WINED3DSURFTYPE SurfaceType)
+static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter,
+ const struct wined3d_format_desc *adapter_format_desc,
+ const struct wined3d_format_desc *check_format_desc,
+ WINED3DSURFTYPE SurfaceType)
{
if(SurfaceType == SURFACE_GDI) {
switch(check_format_desc->format)
@@ -3572,12 +3618,14 @@ static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, const struct
}
/* All format that are supported for textures are supported for surfaces as well */
- if (CheckTextureCapability(adapter, DeviceType, check_format_desc)) return TRUE;
+ if (CheckTextureCapability(adapter, check_format_desc)) return TRUE;
/* All depth stencil formats are supported on surfaces */
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 */
- if (adapter->blitter->color_fixup_supported(check_format_desc->color_fixup))
+ if (adapter->blitter->blit_supported(&adapter->gl_info, BLIT_OP_BLIT,
+ NULL, WINED3DPOOL_DEFAULT, 0, check_format_desc,
+ NULL, WINED3DPOOL_DEFAULT, 0, adapter_format_desc))
{
TRACE_(d3d_caps)("[OK]\n");
return TRUE;
@@ -3588,32 +3636,11 @@ static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, const struct
return FALSE;
}
-static BOOL CheckVertexTextureCapability(struct wined3d_adapter *adapter, const struct GlPixelFormatDesc *format_desc)
+static BOOL CheckVertexTextureCapability(struct wined3d_adapter *adapter,
+ const struct wined3d_format_desc *format_desc)
{
- const struct wined3d_gl_info *gl_info = &adapter->gl_info;
-
- if (!gl_info->limits.vertex_samplers)
- {
- TRACE_(d3d_caps)("[FAILED]\n");
- return FALSE;
- }
-
- switch (format_desc->format)
- {
- case WINED3DFMT_R32G32B32A32_FLOAT:
- if (!gl_info->supported[ARB_TEXTURE_FLOAT])
- {
- TRACE_(d3d_caps)("[FAILED]\n");
- return FALSE;
- }
- TRACE_(d3d_caps)("[OK]\n");
- return TRUE;
-
- default:
- TRACE_(d3d_caps)("[FAILED]\n");
- return FALSE;
- }
- return FALSE;
+ return adapter->gl_info.limits.vertex_samplers
+ && (format_desc->Flags & WINED3DFMT_FLAG_VTF);
}
static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType,
@@ -3623,8 +3650,8 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt
IWineD3DImpl *This = (IWineD3DImpl *)iface;
struct wined3d_adapter *adapter = &This->adapters[Adapter];
const struct wined3d_gl_info *gl_info = &adapter->gl_info;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(CheckFormat, gl_info);
- const struct GlPixelFormatDesc *adapter_format_desc = getFormatDescEntry(AdapterFormat, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(CheckFormat, gl_info);
+ const struct wined3d_format_desc *adapter_format_desc = getFormatDescEntry(AdapterFormat, gl_info);
DWORD UsageCaps = 0;
TRACE_(d3d_caps)("(%p)-> (STUB) (Adptr:%d, DevType:(%u,%s), AdptFmt:(%u,%s), Use:(%u,%s,%s), ResTyp:(%x,%s), CheckFmt:(%u,%s))\n",
@@ -3640,484 +3667,476 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt
return WINED3DERR_INVALIDCALL;
}
- if(RType == WINED3DRTYPE_CUBETEXTURE) {
-
- if(SurfaceType != SURFACE_OPENGL) {
- TRACE("[FAILED]\n");
- return WINED3DERR_NOTAVAILABLE;
- }
-
- /* Cubetexture allows:
- * - D3DUSAGE_AUTOGENMIPMAP
- * - D3DUSAGE_DEPTHSTENCIL
- * - D3DUSAGE_DYNAMIC
- * - D3DUSAGE_NONSECURE (d3d9ex)
- * - D3DUSAGE_RENDERTARGET
- * - D3DUSAGE_SOFTWAREPROCESSING
- * - D3DUSAGE_QUERY_WRAPANDMIP
- */
- if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
- {
- /* Check if the texture format is around */
- if (CheckTextureCapability(adapter, DeviceType, format_desc))
+ switch (RType)
+ {
+ case WINED3DRTYPE_CUBETEXTURE:
+ /* Cubetexture allows:
+ * - WINED3DUSAGE_AUTOGENMIPMAP
+ * - WINED3DUSAGE_DEPTHSTENCIL
+ * - WINED3DUSAGE_DYNAMIC
+ * - WINED3DUSAGE_NONSECURE (d3d9ex)
+ * - WINED3DUSAGE_RENDERTARGET
+ * - WINED3DUSAGE_SOFTWAREPROCESSING
+ * - WINED3DUSAGE_QUERY_WRAPANDMIP
+ */
+ if (SurfaceType != SURFACE_OPENGL)
{
- if(Usage & WINED3DUSAGE_AUTOGENMIPMAP) {
- /* Check for automatic mipmap generation support */
- if (gl_info->supported[SGIS_GENERATE_MIPMAP])
- {
- UsageCaps |= WINED3DUSAGE_AUTOGENMIPMAP;
- } else {
- /* When autogenmipmap isn't around continue and return WINED3DOK_NOAUTOGEN instead of D3D_OK */
- TRACE_(d3d_caps)("[FAILED] - No autogenmipmap support, but continuing\n");
- }
- }
+ TRACE_(d3d_caps)("[FAILED]\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
- /* Always report dynamic locking */
- if(Usage & WINED3DUSAGE_DYNAMIC)
- UsageCaps |= WINED3DUSAGE_DYNAMIC;
+ if (!gl_info->supported[ARB_TEXTURE_CUBE_MAP])
+ {
+ TRACE_(d3d_caps)("[FAILED] - No cube texture support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
- if(Usage & WINED3DUSAGE_RENDERTARGET) {
- if(CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_RENDERTARGET;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Always report software processing */
- if(Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
- UsageCaps |= WINED3DUSAGE_SOFTWAREPROCESSING;
-
- /* Check QUERY_FILTER support */
- if(Usage & WINED3DUSAGE_QUERY_FILTER) {
- if (CheckFilterCapability(adapter, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No query filter support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Check QUERY_POSTPIXELSHADER_BLENDING support */
- if(Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) {
- if (CheckPostPixelShaderBlendingCapability(adapter, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Check QUERY_SRGBREAD support */
- if(Usage & WINED3DUSAGE_QUERY_SRGBREAD) {
- if (CheckSrgbReadCapability(adapter, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Check QUERY_SRGBWRITE support */
- if(Usage & WINED3DUSAGE_QUERY_SRGBWRITE) {
- if (CheckSrgbWriteCapability(adapter, DeviceType, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Check QUERY_VERTEXTEXTURE support */
- if(Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE) {
- if (CheckVertexTextureCapability(adapter, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Check QUERY_WRAPANDMIP support */
- if(Usage & WINED3DUSAGE_QUERY_WRAPANDMIP) {
- if (CheckWrapAndMipCapability(adapter, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
- } else {
+ if (!CheckTextureCapability(adapter, format_desc))
+ {
TRACE_(d3d_caps)("[FAILED] - Cube texture format not supported\n");
return WINED3DERR_NOTAVAILABLE;
}
- } else {
- TRACE_(d3d_caps)("[FAILED] - No cube texture support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- } else if(RType == WINED3DRTYPE_SURFACE) {
- /* Surface allows:
- * - D3DUSAGE_DEPTHSTENCIL
- * - D3DUSAGE_NONSECURE (d3d9ex)
- * - D3DUSAGE_RENDERTARGET
- */
- if (CheckSurfaceCapability(adapter, adapter_format_desc, DeviceType, format_desc, SurfaceType))
- {
- if(Usage & WINED3DUSAGE_DEPTHSTENCIL) {
- if (CheckDepthStencilCapability(adapter, adapter_format_desc, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_DEPTHSTENCIL;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No depthstencil support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- if(Usage & WINED3DUSAGE_RENDERTARGET) {
- if (CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_RENDERTARGET;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Check QUERY_POSTPIXELSHADER_BLENDING support */
- if(Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) {
- if (CheckPostPixelShaderBlendingCapability(adapter, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
- } else {
- TRACE_(d3d_caps)("[FAILED] - Not supported for plain surfaces\n");
- return WINED3DERR_NOTAVAILABLE;
- }
-
- } else if(RType == WINED3DRTYPE_TEXTURE) {
- /* Texture allows:
- * - D3DUSAGE_AUTOGENMIPMAP
- * - D3DUSAGE_DEPTHSTENCIL
- * - D3DUSAGE_DMAP
- * - D3DUSAGE_DYNAMIC
- * - D3DUSAGE_NONSECURE (d3d9ex)
- * - D3DUSAGE_RENDERTARGET
- * - D3DUSAGE_SOFTWAREPROCESSING
- * - D3DUSAGE_TEXTAPI (d3d9ex)
- * - D3DUSAGE_QUERY_WRAPANDMIP
- */
-
- if(SurfaceType != SURFACE_OPENGL) {
- TRACE("[FAILED]\n");
- return WINED3DERR_NOTAVAILABLE;
- }
-
- /* Check if the texture format is around */
- if (CheckTextureCapability(adapter, DeviceType, format_desc))
- {
- if(Usage & WINED3DUSAGE_AUTOGENMIPMAP) {
- /* Check for automatic mipmap generation support */
- if (gl_info->supported[SGIS_GENERATE_MIPMAP])
- {
- UsageCaps |= WINED3DUSAGE_AUTOGENMIPMAP;
- } else {
- /* When autogenmipmap isn't around continue and return WINED3DOK_NOAUTOGEN instead of D3D_OK */
+ if (Usage & WINED3DUSAGE_AUTOGENMIPMAP)
+ {
+ if (!gl_info->supported[SGIS_GENERATE_MIPMAP])
+ /* When autogenmipmap isn't around continue and return
+ * WINED3DOK_NOAUTOGEN instead of D3D_OK. */
TRACE_(d3d_caps)("[FAILED] - No autogenmipmap support, but continuing\n");
- }
+ else
+ UsageCaps |= WINED3DUSAGE_AUTOGENMIPMAP;
}
- /* Always report dynamic locking */
- if(Usage & WINED3DUSAGE_DYNAMIC)
+ /* Always report dynamic locking. */
+ if (Usage & WINED3DUSAGE_DYNAMIC)
UsageCaps |= WINED3DUSAGE_DYNAMIC;
- if(Usage & WINED3DUSAGE_RENDERTARGET) {
- if (CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc))
+ if (Usage & WINED3DUSAGE_RENDERTARGET)
+ {
+ if (!CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc))
{
- UsageCaps |= WINED3DUSAGE_RENDERTARGET;
- } else {
TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_RENDERTARGET;
}
- /* Always report software processing */
- if(Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
+ /* Always report software processing. */
+ if (Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
UsageCaps |= WINED3DUSAGE_SOFTWAREPROCESSING;
- /* Check QUERY_FILTER support */
- if(Usage & WINED3DUSAGE_QUERY_FILTER) {
- if (CheckFilterCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_FILTER)
+ {
+ if (!CheckFilterCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query filter support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
}
- /* Check QUERY_LEGACYBUMPMAP support */
- if(Usage & WINED3DUSAGE_QUERY_LEGACYBUMPMAP) {
- if (CheckBumpMapCapability(adapter, DeviceType, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
+ {
+ if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_LEGACYBUMPMAP;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No legacy bumpmap support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Check QUERY_POSTPIXELSHADER_BLENDING support */
- if(Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) {
- if (CheckPostPixelShaderBlendingCapability(adapter, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
}
- /* Check QUERY_SRGBREAD support */
- if(Usage & WINED3DUSAGE_QUERY_SRGBREAD) {
- if (CheckSrgbReadCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_SRGBREAD)
+ {
+ if (!CheckSrgbReadCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
}
- /* Check QUERY_SRGBWRITE support */
- if(Usage & WINED3DUSAGE_QUERY_SRGBWRITE) {
- if (CheckSrgbWriteCapability(adapter, DeviceType, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_SRGBWRITE)
+ {
+ if (!CheckSrgbWriteCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
}
- /* Check QUERY_VERTEXTEXTURE support */
- if(Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE) {
- if (CheckVertexTextureCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE)
+ {
+ if (!CheckVertexTextureCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
}
- /* Check QUERY_WRAPANDMIP support */
- if(Usage & WINED3DUSAGE_QUERY_WRAPANDMIP) {
- if (CheckWrapAndMipCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_WRAPANDMIP)
+ {
+ if (!CheckWrapAndMipCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
- } else {
TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
+ }
+ break;
+
+ case WINED3DRTYPE_SURFACE:
+ /* Surface allows:
+ * - WINED3DUSAGE_DEPTHSTENCIL
+ * - WINED3DUSAGE_NONSECURE (d3d9ex)
+ * - WINED3DUSAGE_RENDERTARGET
+ */
+ if (!CheckSurfaceCapability(adapter, adapter_format_desc, format_desc, SurfaceType))
+ {
+ TRACE_(d3d_caps)("[FAILED] - Not supported for plain surfaces\n");
+ return WINED3DERR_NOTAVAILABLE;
}
- if(Usage & WINED3DUSAGE_DEPTHSTENCIL) {
- if (CheckDepthStencilCapability(adapter, adapter_format_desc, format_desc))
+ if (Usage & WINED3DUSAGE_DEPTHSTENCIL)
+ {
+ if (!CheckDepthStencilCapability(adapter, adapter_format_desc, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No depthstencil support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_DEPTHSTENCIL;
+ }
+
+ if (Usage & WINED3DUSAGE_RENDERTARGET)
+ {
+ if (!CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_RENDERTARGET;
+ }
+
+ if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
+ {
+ if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
+ }
+ break;
+
+ case WINED3DRTYPE_TEXTURE:
+ /* Texture allows:
+ * - WINED3DUSAGE_AUTOGENMIPMAP
+ * - WINED3DUSAGE_DEPTHSTENCIL
+ * - WINED3DUSAGE_DMAP
+ * - WINED3DUSAGE_DYNAMIC
+ * - WINED3DUSAGE_NONSECURE (d3d9ex)
+ * - WINED3DUSAGE_RENDERTARGET
+ * - WINED3DUSAGE_SOFTWAREPROCESSING
+ * - WINED3DUSAGE_TEXTAPI (d3d9ex)
+ * - WINED3DUSAGE_QUERY_WRAPANDMIP
+ */
+ if (SurfaceType != SURFACE_OPENGL)
+ {
+ TRACE_(d3d_caps)("[FAILED]\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+
+ if (!CheckTextureCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - Texture format not supported\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+
+ if (Usage & WINED3DUSAGE_AUTOGENMIPMAP)
+ {
+ if (!gl_info->supported[SGIS_GENERATE_MIPMAP])
+ /* When autogenmipmap isn't around continue and return
+ * WINED3DOK_NOAUTOGEN instead of D3D_OK. */
+ TRACE_(d3d_caps)("[FAILED] - No autogenmipmap support, but continuing\n");
+ else
+ UsageCaps |= WINED3DUSAGE_AUTOGENMIPMAP;
+ }
+
+ /* Always report dynamic locking. */
+ if (Usage & WINED3DUSAGE_DYNAMIC)
+ UsageCaps |= WINED3DUSAGE_DYNAMIC;
+
+ if (Usage & WINED3DUSAGE_RENDERTARGET)
+ {
+ if (!CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_RENDERTARGET;
+ }
+
+ /* Always report software processing. */
+ if (Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
+ UsageCaps |= WINED3DUSAGE_SOFTWAREPROCESSING;
+
+ if (Usage & WINED3DUSAGE_QUERY_FILTER)
+ {
+ if (!CheckFilterCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No query filter support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
+ }
+
+ if (Usage & WINED3DUSAGE_QUERY_LEGACYBUMPMAP)
+ {
+ if (!CheckBumpMapCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No legacy bumpmap support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_LEGACYBUMPMAP;
+ }
+
+ if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
+ {
+ if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
+ }
+
+ if (Usage & WINED3DUSAGE_QUERY_SRGBREAD)
+ {
+ if (!CheckSrgbReadCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
+ }
+
+ if (Usage & WINED3DUSAGE_QUERY_SRGBWRITE)
+ {
+ if (!CheckSrgbWriteCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
+ }
+
+ if (Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE)
+ {
+ if (!CheckVertexTextureCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
+ }
+
+ if (Usage & WINED3DUSAGE_QUERY_WRAPANDMIP)
+ {
+ if (!CheckWrapAndMipCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
+ }
+
+ if (Usage & WINED3DUSAGE_DEPTHSTENCIL)
+ {
+ if (!CheckDepthStencilCapability(adapter, adapter_format_desc, format_desc))
{
- UsageCaps |= WINED3DUSAGE_DEPTHSTENCIL;
- } else {
TRACE_(d3d_caps)("[FAILED] - No depth stencil support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ if ((format_desc->Flags & WINED3DFMT_FLAG_SHADOW) && !gl_info->supported[ARB_SHADOW])
+ {
+ TRACE_(d3d_caps)("[FAILED] - No shadow sampler support.\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_DEPTHSTENCIL;
}
- } else {
- TRACE_(d3d_caps)("[FAILED] - Texture format not supported\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- } else if((RType == WINED3DRTYPE_VOLUME) || (RType == WINED3DRTYPE_VOLUMETEXTURE)) {
- /* Volume is to VolumeTexture what Surface is to Texture but its usage caps are not documented.
- * Most driver seem to offer (nearly) the same on Volume and VolumeTexture, so do that too.
- *
- * Volumetexture allows:
- * - D3DUSAGE_DYNAMIC
- * - D3DUSAGE_NONSECURE (d3d9ex)
- * - D3DUSAGE_SOFTWAREPROCESSING
- * - D3DUSAGE_QUERY_WRAPANDMIP
- */
+ break;
- if(SurfaceType != SURFACE_OPENGL) {
- TRACE("[FAILED]\n");
- return WINED3DERR_NOTAVAILABLE;
- }
+ case WINED3DRTYPE_VOLUMETEXTURE:
+ case WINED3DRTYPE_VOLUME:
+ /* Volume is to VolumeTexture what Surface is to Texture, but its
+ * usage caps are not documented. Most driver seem to offer
+ * (nearly) the same on Volume and VolumeTexture, so do that too.
+ *
+ * Volumetexture allows:
+ * - D3DUSAGE_DYNAMIC
+ * - D3DUSAGE_NONSECURE (d3d9ex)
+ * - D3DUSAGE_SOFTWAREPROCESSING
+ * - D3DUSAGE_QUERY_WRAPANDMIP
+ */
+ if (SurfaceType != SURFACE_OPENGL)
+ {
+ TRACE_(d3d_caps)("[FAILED]\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
- /* Check volume texture and volume usage caps */
- if (gl_info->supported[EXT_TEXTURE3D])
- {
- if (!CheckTextureCapability(adapter, DeviceType, format_desc))
+ if (!gl_info->supported[EXT_TEXTURE3D])
+ {
+ TRACE_(d3d_caps)("[FAILED] - No volume texture support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+
+ if (!CheckTextureCapability(adapter, format_desc))
{
TRACE_(d3d_caps)("[FAILED] - Format not supported\n");
return WINED3DERR_NOTAVAILABLE;
}
- /* Always report dynamic locking */
- if(Usage & WINED3DUSAGE_DYNAMIC)
+ /* Filter formats that need conversion; For one part, this
+ * conversion is unimplemented, and volume textures are huge, so
+ * it would be a big performance hit. Unless we hit an application
+ * needing one of those formats, don't advertize them to avoid
+ * leading applications into temptation. The windows drivers don't
+ * support most of those formats on volumes anyway, except for
+ * WINED3DFMT_R32_FLOAT. */
+ switch (CheckFormat)
+ {
+ case WINED3DFMT_P8_UINT:
+ case WINED3DFMT_L4A4_UNORM:
+ case WINED3DFMT_R32_FLOAT:
+ case WINED3DFMT_R16_FLOAT:
+ case WINED3DFMT_R8G8_SNORM_L8X8_UNORM:
+ case WINED3DFMT_R5G5_SNORM_L6_UNORM:
+ case WINED3DFMT_R16G16_UNORM:
+ TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
+ return WINED3DERR_NOTAVAILABLE;
+
+ case WINED3DFMT_R8G8B8A8_SNORM:
+ case WINED3DFMT_R16G16_SNORM:
+ if (!gl_info->supported[NV_TEXTURE_SHADER])
+ {
+ TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ break;
+
+ case WINED3DFMT_R8G8_SNORM:
+ if (!gl_info->supported[NV_TEXTURE_SHADER])
+ {
+ TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ break;
+
+ case WINED3DFMT_DXT1:
+ case WINED3DFMT_DXT2:
+ case WINED3DFMT_DXT3:
+ case WINED3DFMT_DXT4:
+ case WINED3DFMT_DXT5:
+ /* The GL_EXT_texture_compression_s3tc spec requires that
+ * loading an s3tc compressed texture results in an error.
+ * While the D3D refrast does support s3tc volumes, at
+ * least the nvidia windows driver does not, so we're free
+ * not to support this format. */
+ TRACE_(d3d_caps)("[FAILED] - DXTn does not support 3D textures\n");
+ return WINED3DERR_NOTAVAILABLE;
+
+ default:
+ /* Do nothing, continue with checking the format below */
+ break;
+ }
+
+ /* Always report dynamic locking. */
+ if (Usage & WINED3DUSAGE_DYNAMIC)
UsageCaps |= WINED3DUSAGE_DYNAMIC;
- /* Always report software processing */
- if(Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
+ /* Always report software processing. */
+ if (Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
UsageCaps |= WINED3DUSAGE_SOFTWAREPROCESSING;
- /* Check QUERY_FILTER support */
- if(Usage & WINED3DUSAGE_QUERY_FILTER) {
- if (CheckFilterCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_FILTER)
+ {
+ if (!CheckFilterCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query filter support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
}
- /* Check QUERY_POSTPIXELSHADER_BLENDING support */
- if(Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) {
- if (CheckPostPixelShaderBlendingCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
+ {
+ if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
}
- /* Check QUERY_SRGBREAD support */
- if(Usage & WINED3DUSAGE_QUERY_SRGBREAD) {
- if (CheckSrgbReadCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_SRGBREAD)
+ {
+ if (!CheckSrgbReadCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
}
- /* Check QUERY_SRGBWRITE support */
- if(Usage & WINED3DUSAGE_QUERY_SRGBWRITE) {
- if (CheckSrgbWriteCapability(adapter, DeviceType, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_SRGBWRITE)
+ {
+ if (!CheckSrgbWriteCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
}
- /* Check QUERY_VERTEXTEXTURE support */
- if(Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE) {
- if (CheckVertexTextureCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE)
+ {
+ if (!CheckVertexTextureCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
}
- /* Check QUERY_WRAPANDMIP support */
- if(Usage & WINED3DUSAGE_QUERY_WRAPANDMIP) {
- if (CheckWrapAndMipCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_WRAPANDMIP)
+ {
+ if (!CheckWrapAndMipCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
- } else {
TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
}
- } else {
- TRACE_(d3d_caps)("[FAILED] - No volume texture support\n");
+ break;
+
+ default:
+ FIXME_(d3d_caps)("Unhandled resource type %s.\n", debug_d3dresourcetype(RType));
return WINED3DERR_NOTAVAILABLE;
- }
-
- /* Filter formats that need conversion; For one part, this conversion is unimplemented,
- * and volume textures are huge, so it would be a big performance hit. Unless we hit an
- * app needing one of those formats, don't advertize them to avoid leading apps into
- * temptation. The windows drivers don't support most of those formats on volumes anyway,
- * except of R32F.
- */
- switch(CheckFormat) {
- case WINED3DFMT_P8_UINT:
- case WINED3DFMT_L4A4_UNORM:
- case WINED3DFMT_R32_FLOAT:
- case WINED3DFMT_R16_FLOAT:
- case WINED3DFMT_R8G8_SNORM_L8X8_UNORM:
- case WINED3DFMT_R5G5_SNORM_L6_UNORM:
- case WINED3DFMT_R16G16_UNORM:
- TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
- return WINED3DERR_NOTAVAILABLE;
-
- case WINED3DFMT_R8G8B8A8_SNORM:
- case WINED3DFMT_R16G16_SNORM:
- if (!gl_info->supported[NV_TEXTURE_SHADER])
- {
- TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- break;
-
- case WINED3DFMT_R8G8_SNORM:
- if (!gl_info->supported[NV_TEXTURE_SHADER])
- {
- TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- break;
-
- case WINED3DFMT_DXT1:
- case WINED3DFMT_DXT2:
- case WINED3DFMT_DXT3:
- case WINED3DFMT_DXT4:
- case WINED3DFMT_DXT5:
- /* The GL_EXT_texture_compression_s3tc spec requires that loading an s3tc
- * compressed texture results in an error. While the D3D refrast does
- * support s3tc volumes, at least the nvidia windows driver does not, so
- * we're free not to support this format.
- */
- TRACE_(d3d_caps)("[FAILED] - DXTn does not support 3D textures\n");
- return WINED3DERR_NOTAVAILABLE;
-
- default:
- /* Do nothing, continue with checking the format below */
- break;
- }
- } else if(RType == WINED3DRTYPE_BUFFER){
- /* For instance vertexbuffer/indexbuffer aren't supported yet because no Windows drivers seem to offer it */
- TRACE_(d3d_caps)("Unhandled resource type D3DRTYPE_INDEXBUFFER / D3DRTYPE_VERTEXBUFFER\n");
- return WINED3DERR_NOTAVAILABLE;
}
- /* When the UsageCaps exactly matches Usage return WINED3D_OK except for the situation in which
- * WINED3DUSAGE_AUTOGENMIPMAP isn't around, then WINED3DOK_NOAUTOGEN is returned if all the other
- * usage flags match. */
- if(UsageCaps == Usage) {
+ /* When the UsageCaps exactly matches Usage return WINED3D_OK except for
+ * the situation in which WINED3DUSAGE_AUTOGENMIPMAP isn't around, then
+ * WINED3DOK_NOAUTOGEN is returned if all the other usage flags match. */
+ if (UsageCaps == Usage)
return WINED3D_OK;
- } else if((UsageCaps == (Usage & ~WINED3DUSAGE_AUTOGENMIPMAP)) && (Usage & WINED3DUSAGE_AUTOGENMIPMAP)){
+ if (UsageCaps == (Usage & ~WINED3DUSAGE_AUTOGENMIPMAP))
return WINED3DOK_NOAUTOGEN;
- } else {
- TRACE_(d3d_caps)("[FAILED] - Usage=%#08x requested for CheckFormat=%s and RType=%d but only %#08x is available\n", Usage, debug_d3dformat(CheckFormat), RType, UsageCaps);
- return WINED3DERR_NOTAVAILABLE;
- }
+
+ TRACE_(d3d_caps)("[FAILED] - Usage %#x requested for CheckFormat %s and RType %s but only %#x is available\n",
+ Usage, debug_d3dformat(CheckFormat), debug_d3dresourcetype(RType), UsageCaps);
+
+ return WINED3DERR_NOTAVAILABLE;
}
static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormatConversion(IWineD3D *iface, UINT adapter_idx,
@@ -4204,13 +4223,14 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
WINED3DPMISCCAPS_MRTPOSTPIXELSHADERBLENDING;
/* TODO:
WINED3DPMISCCAPS_NULLREFERENCE
- WINED3DPMISCCAPS_INDEPENDENTWRITEMASKS
WINED3DPMISCCAPS_FOGANDSPECULARALPHA
WINED3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS
WINED3DPMISCCAPS_FOGVERTEXCLAMPED */
if (gl_info->supported[EXT_BLEND_EQUATION_SEPARATE] && gl_info->supported[EXT_BLEND_FUNC_SEPARATE])
pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_SEPARATEALPHABLEND;
+ if (gl_info->supported[EXT_DRAW_BUFFERS2])
+ pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_INDEPENDENTWRITEMASKS;
pCaps->RasterCaps = WINED3DPRASTERCAPS_DITHER |
WINED3DPRASTERCAPS_PAT |
@@ -4517,10 +4537,7 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
WINED3DPTFILTERCAPS_MAGFLINEAR;
pCaps->VertexTextureFilterCaps = 0;
- memset(&shader_caps, 0, sizeof(shader_caps));
adapter->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
-
- memset(&fragment_caps, 0, sizeof(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 */
@@ -4551,13 +4568,6 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
pCaps->MaxTextureBlendStages = fragment_caps.MaxTextureBlendStages;
pCaps->MaxSimultaneousTextures = fragment_caps.MaxSimultaneousTextures;
- pCaps->VS20Caps = shader_caps.VS20Caps;
- pCaps->MaxVShaderInstructionsExecuted = shader_caps.MaxVShaderInstructionsExecuted;
- pCaps->MaxVertexShader30InstructionSlots= shader_caps.MaxVertexShader30InstructionSlots;
- pCaps->PS20Caps = shader_caps.PS20Caps;
- pCaps->MaxPShaderInstructionsExecuted = shader_caps.MaxPShaderInstructionsExecuted;
- pCaps->MaxPixelShader30InstructionSlots = shader_caps.MaxPixelShader30InstructionSlots;
-
/* The following caps are shader specific, but they are things we cannot detect, or which
* are the same among all shader models. So to avoid code duplication set the shader version
* specific, but otherwise constant caps here
@@ -4959,7 +4969,7 @@ static void fillGLAttribFuncs(const struct wined3d_gl_info *gl_info)
}
}
-BOOL InitAdapters(IWineD3DImpl *This)
+static BOOL InitAdapters(IWineD3DImpl *This)
{
static HMODULE mod_gl;
BOOL ret;
@@ -5120,17 +5130,6 @@ BOOL InitAdapters(IWineD3DImpl *This)
cfgs->doubleBuffer = values[9];
cfgs->auxBuffers = values[10];
- cfgs->pbufferDrawable = FALSE;
- /* Check for pbuffer support when it is around as
- * wglGetPixelFormatAttribiv fails for unknown attributes. */
- if (gl_info->supported[WGL_ARB_PBUFFER])
- {
- int attrib = WGL_DRAW_TO_PBUFFER_ARB;
- int value;
- if(GL_EXTCALL(wglGetPixelFormatAttribivARB(hdc, iPixelFormat, 0, 1, &attrib, &value)))
- cfgs->pbufferDrawable = value;
- }
-
cfgs->numSamples = 0;
/* Check multisample support */
if (gl_info->supported[ARB_MULTISAMPLE])
@@ -5145,7 +5144,11 @@ BOOL InitAdapters(IWineD3DImpl *This)
}
}
- 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);
+ TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, "
+ "depth=%d, stencil=%d, samples=%d, windowDrawable=%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++;
}
}
@@ -5182,14 +5185,17 @@ BOOL InitAdapters(IWineD3DImpl *This)
cfgs->colorSize = ppfd.cColorBits;
cfgs->depthSize = ppfd.cDepthBits;
cfgs->stencilSize = ppfd.cStencilBits;
- cfgs->pbufferDrawable = 0;
cfgs->windowDrawable = (ppfd.dwFlags & PFD_DRAW_TO_WINDOW) ? 1 : 0;
cfgs->iPixelType = (ppfd.iPixelType == PFD_TYPE_RGBA) ? WGL_TYPE_RGBA_ARB : WGL_TYPE_COLORINDEX_ARB;
cfgs->doubleBuffer = (ppfd.dwFlags & PFD_DOUBLEBUFFER) ? 1 : 0;
cfgs->auxBuffers = ppfd.cAuxBuffers;
cfgs->numSamples = 0;
- 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, windowDrawable=%d\n",
+ cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer,
+ cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize,
+ cfgs->depthSize, cfgs->stencilSize, cfgs->windowDrawable);
cfgs++;
adapter->nCfgs++;
}
@@ -5261,7 +5267,7 @@ nogl_adapter:
* IWineD3D VTbl follows
**********************************************************/
-const IWineD3DVtbl IWineD3D_Vtbl =
+static const struct IWineD3DVtbl IWineD3D_Vtbl =
{
/* IUnknown */
IWineD3DImpl_QueryInterface,
@@ -5291,3 +5297,23 @@ const struct wined3d_parent_ops wined3d_null_parent_ops =
{
wined3d_null_wined3d_object_destroyed,
};
+
+HRESULT wined3d_init(IWineD3DImpl *wined3d, UINT version, IUnknown *parent)
+{
+ wined3d->lpVtbl = &IWineD3D_Vtbl;
+ wined3d->dxVersion = version;
+ wined3d->ref = 1;
+ wined3d->parent = parent;
+
+ if (!InitAdapters(wined3d))
+ {
+ WARN("Failed to initialize adapters.\n");
+ if (version > 7)
+ {
+ MESSAGE("Direct3D%u is not available without OpenGL.\n", version);
+ return E_FAIL;
+ }
+ }
+
+ return WINED3D_OK;
+}
diff --git a/dll/directx/wine/wined3d/drawprim.c b/dll/directx/wine/wined3d/drawprim.c
index b29d012b9d1..b36ef5b49ae 100644
--- a/dll/directx/wine/wined3d/drawprim.c
+++ b/dll/directx/wine/wined3d/drawprim.c
@@ -28,7 +28,6 @@
#include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d_draw);
-#define GLINFO_LOCATION This->adapter->gl_info
#include
#include
@@ -71,7 +70,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context
UINT vx_index;
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
const UINT *streamOffset = This->stateBlock->streamOffset;
- long SkipnStrides = startIdx + This->stateBlock->loadBaseVertexIndex;
+ LONG SkipnStrides = startIdx + This->stateBlock->loadBaseVertexIndex;
BOOL pixelShader = use_ps(This->stateBlock);
BOOL specular_fog = FALSE;
const BYTE *texCoords[WINED3DDP_MAXTEXCOORD];
@@ -85,14 +84,14 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context
TRACE("Using slow vertex array code\n");
/* Variable Initialization */
- if (idxSize != 0) {
- /* Immediate mode drawing can't make use of indices in a vbo - get the data from the index buffer.
- * If the index buffer has no vbo(not supported or other reason), or with user pointer drawing
- * idxData will be != NULL
- */
- if(idxData == NULL) {
- idxData = buffer_get_sysmem((struct wined3d_buffer *) This->stateBlock->pIndexData);
- }
+ if (idxSize)
+ {
+ /* Immediate mode drawing can't make use of indices in a vbo - get the
+ * data from the index buffer. If the index buffer has no vbo (not
+ * supported or other reason), or with user pointer drawing idxData
+ * will be non-NULL. */
+ if (!idxData)
+ idxData = buffer_get_sysmem((struct wined3d_buffer *)This->stateBlock->pIndexData, gl_info);
if (idxSize == 2) pIdxBufS = idxData;
else pIdxBufL = idxData;
@@ -102,7 +101,6 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context
}
/* Start drawing in GL */
- VTRACE(("glBegin(%x)\n", glPrimType));
glBegin(glPrimType);
if (si->use_map & (1 << WINED3D_FFP_POSITION))
@@ -226,13 +224,10 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context
if (idxData != NULL) {
/* Indexed so work out the number of strides to skip */
- if (idxSize == 2) {
- VTRACE(("Idx for vertex %u = %u\n", vx_index, pIdxBufS[startIdx+vx_index]));
+ if (idxSize == 2)
SkipnStrides = pIdxBufS[startIdx + vx_index] + This->stateBlock->loadBaseVertexIndex;
- } else {
- VTRACE(("Idx for vertex %u = %u\n", vx_index, pIdxBufL[startIdx+vx_index]));
+ else
SkipnStrides = pIdxBufL[startIdx + vx_index] + This->stateBlock->loadBaseVertexIndex;
- }
}
tmp_tex_mask = tex_mask;
@@ -426,7 +421,8 @@ static void drawStridedSlowVs(IWineD3DDevice *iface, const struct wined3d_stream
GLenum glPrimitiveType, const void *idxData, UINT idxSize, UINT startIdx)
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
- long SkipnStrides = startIdx + This->stateBlock->loadBaseVertexIndex;
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
+ LONG SkipnStrides = startIdx + This->stateBlock->loadBaseVertexIndex;
const WORD *pIdxBufS = NULL;
const DWORD *pIdxBufL = NULL;
UINT vx_index;
@@ -434,14 +430,14 @@ static void drawStridedSlowVs(IWineD3DDevice *iface, const struct wined3d_stream
IWineD3DStateBlockImpl *stateblock = This->stateBlock;
const BYTE *ptr;
- if (idxSize != 0) {
- /* Immediate mode drawing can't make use of indices in a vbo - get the data from the index buffer.
- * If the index buffer has no vbo(not supported or other reason), or with user pointer drawing
- * idxData will be != NULL
- */
- if(idxData == NULL) {
- idxData = buffer_get_sysmem((struct wined3d_buffer *) This->stateBlock->pIndexData);
- }
+ if (idxSize)
+ {
+ /* Immediate mode drawing can't make use of indices in a vbo - get the
+ * data from the index buffer. If the index buffer has no vbo (not
+ * supported or other reason), or with user pointer drawing idxData
+ * will be non-NULL. */
+ if (!idxData)
+ idxData = buffer_get_sysmem((struct wined3d_buffer *)This->stateBlock->pIndexData, gl_info);
if (idxSize == 2) pIdxBufS = idxData;
else pIdxBufL = idxData;
@@ -451,20 +447,16 @@ static void drawStridedSlowVs(IWineD3DDevice *iface, const struct wined3d_stream
}
/* Start drawing in GL */
- VTRACE(("glBegin(%x)\n", glPrimitiveType));
glBegin(glPrimitiveType);
for (vx_index = 0; vx_index < numberOfVertices; ++vx_index) {
if (idxData != NULL) {
/* Indexed so work out the number of strides to skip */
- if (idxSize == 2) {
- VTRACE(("Idx for vertex %d = %d\n", vx_index, pIdxBufS[startIdx+vx_index]));
+ if (idxSize == 2)
SkipnStrides = pIdxBufS[startIdx + vx_index] + stateblock->loadBaseVertexIndex;
- } else {
- VTRACE(("Idx for vertex %d = %d\n", vx_index, pIdxBufL[startIdx+vx_index]));
+ else
SkipnStrides = pIdxBufL[startIdx + vx_index] + stateblock->loadBaseVertexIndex;
- }
}
for (i = MAX_ATTRIBS - 1; i >= 0; i--)
@@ -543,7 +535,7 @@ static inline void drawStridedInstanced(IWineD3DDevice *iface, const struct wine
{
struct wined3d_buffer *vb =
(struct wined3d_buffer *)stateblock->streamSource[si->elements[instancedData[j]].stream_idx];
- ptr += (long) buffer_get_sysmem(vb);
+ ptr += (ULONG_PTR)buffer_get_sysmem(vb, &This->adapter->gl_info);
}
send_attribute(This, si->elements[instancedData[j]].format_desc->format, instancedData[j], ptr);
@@ -555,7 +547,8 @@ static inline void drawStridedInstanced(IWineD3DDevice *iface, const struct wine
}
}
-static inline void remove_vbos(IWineD3DDeviceImpl *This, struct wined3d_stream_info *s)
+static inline void remove_vbos(IWineD3DDeviceImpl *This, const struct wined3d_gl_info *gl_info,
+ struct wined3d_stream_info *s)
{
unsigned int i;
@@ -570,7 +563,7 @@ static inline void remove_vbos(IWineD3DDeviceImpl *This, struct wined3d_stream_i
{
struct wined3d_buffer *vb = (struct wined3d_buffer *)This->stateBlock->streamSource[e->stream_idx];
e->buffer_object = 0;
- e->data = (BYTE *)((unsigned long)e->data + (unsigned long)buffer_get_sysmem(vb));
+ e->data = (BYTE *)((ULONG_PTR)e->data + (ULONG_PTR)buffer_get_sysmem(vb, gl_info));
}
}
}
@@ -580,7 +573,6 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- IWineD3DSurfaceImpl *target;
struct wined3d_context *context;
unsigned int i;
@@ -591,11 +583,11 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
/* Invalidate the back buffer memory so LockRect will read it the next time */
for (i = 0; i < This->adapter->gl_info.limits.buffers; ++i)
{
- target = (IWineD3DSurfaceImpl *)This->render_targets[i];
+ IWineD3DSurface *target = (IWineD3DSurface *)This->render_targets[i];
if (target)
{
- IWineD3DSurface_LoadLocation((IWineD3DSurface *)target, SFLAG_INDRAWABLE, NULL);
- IWineD3DSurface_ModifyLocation((IWineD3DSurface *)target, SFLAG_INDRAWABLE, TRUE);
+ IWineD3DSurface_LoadLocation(target, SFLAG_INDRAWABLE, NULL);
+ IWineD3DSurface_ModifyLocation(target, SFLAG_INDRAWABLE, TRUE);
}
}
}
@@ -603,9 +595,18 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
/* Signals other modules that a drawing is in progress and the stateblock finalized */
This->isInDraw = TRUE;
- context = context_acquire(This, This->render_targets[0], CTXUSAGE_DRAWPRIM);
+ context = context_acquire(This, This->render_targets[0]);
+ if (!context->valid)
+ {
+ context_release(context);
+ WARN("Invalid context, skipping draw.\n");
+ return;
+ }
- if (This->stencilBufferTarget) {
+ context_apply_draw_state(context, This);
+
+ if (This->depth_stencil)
+ {
/* Note that this depends on the context_acquire() call above to set
* This->render_offscreen properly. We don't currently take the
* Z-compare function into account, but we could skip loading the
@@ -614,9 +615,33 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
DWORD location = context->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN;
if (This->stateBlock->renderState[WINED3DRS_ZWRITEENABLE]
|| This->stateBlock->renderState[WINED3DRS_ZENABLE])
- surface_load_ds_location(This->stencilBufferTarget, context, location);
- if (This->stateBlock->renderState[WINED3DRS_ZWRITEENABLE])
- surface_modify_ds_location(This->stencilBufferTarget, location);
+ {
+ RECT current_rect, draw_rect, r;
+
+ if (location == SFLAG_DS_ONSCREEN && This->depth_stencil != This->onscreen_depth_stencil)
+ device_switch_onscreen_ds(This, context, This->depth_stencil);
+
+ if (This->depth_stencil->Flags & location)
+ SetRect(¤t_rect, 0, 0,
+ This->depth_stencil->ds_current_size.cx,
+ This->depth_stencil->ds_current_size.cy);
+ else
+ SetRectEmpty(¤t_rect);
+
+ device_get_draw_rect(This, &draw_rect);
+
+ IntersectRect(&r, &draw_rect, ¤t_rect);
+ if (!EqualRect(&r, &draw_rect))
+ surface_load_ds_location(This->depth_stencil, context, location);
+
+ if (This->stateBlock->renderState[WINED3DRS_ZWRITEENABLE])
+ {
+ surface_modify_ds_location(This->depth_stencil, location,
+ This->depth_stencil->ds_current_size.cx,
+ This->depth_stencil->ds_current_size.cy);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)This->depth_stencil, SFLAG_INDRAWABLE, TRUE);
+ }
+ }
}
/* Ok, we will be updating the screen from here onwards so grab the lock */
@@ -659,7 +684,7 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
if(emulation) {
stream_info = &stridedlcl;
memcpy(&stridedlcl, &This->strided_streams, sizeof(stridedlcl));
- remove_vbos(This, &stridedlcl);
+ remove_vbos(This, context->gl_info, &stridedlcl);
}
}
@@ -691,7 +716,12 @@ 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. */
+ for(i = 0; i < This->num_buffer_queries; i++)
+ {
+ wined3d_event_query_issue(This->buffer_queries[i], This);
+ }
+
+ if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */
context_release(context);
@@ -700,14 +730,14 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
/* Diagnostics */
#ifdef SHOW_FRAME_MAKEUP
{
- static long int primCounter = 0;
+ static LONG primCounter = 0;
/* NOTE: set primCounter to the value reported by drawprim
before you want to to write frame makeup to /tmp */
if (primCounter >= 0) {
WINED3DLOCKED_RECT r;
char buffer[80];
IWineD3DSurface_LockRect(This->render_targets[0], &r, NULL, WINED3DLOCK_READONLY);
- sprintf(buffer, "/tmp/backbuffer_%ld.tga", primCounter);
+ sprintf(buffer, "/tmp/backbuffer_%d.tga", primCounter);
TRACE("Saving screenshot %s\n", buffer);
IWineD3DSurface_SaveSnapshot(This->render_targets[0], buffer);
IWineD3DSurface_UnlockRect(This->render_targets[0]);
@@ -718,7 +748,7 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
int textureNo;
for (textureNo = 0; textureNo < MAX_COMBINED_SAMPLERS; ++textureNo) {
if (This->stateBlock->textures[textureNo] != NULL) {
- sprintf(buffer, "/tmp/texture_%p_%ld_%d.tga", This->stateBlock->textures[textureNo], primCounter, textureNo);
+ sprintf(buffer, "/tmp/texture_%p_%d_%d.tga", This->stateBlock->textures[textureNo], primCounter, textureNo);
TRACE("Saving texture %s\n", buffer);
if (IWineD3DBaseTexture_GetType(This->stateBlock->textures[textureNo]) == WINED3DRTYPE_TEXTURE) {
IWineD3DTexture_GetSurfaceLevel(This->stateBlock->textures[textureNo], 0, &pSur);
@@ -732,7 +762,7 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
}
#endif
}
- TRACE("drawprim #%ld\n", primCounter);
+ TRACE("drawprim #%d\n", primCounter);
++primCounter;
}
#endif
@@ -788,7 +818,8 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
/* Simply activate the context for blitting. This disables all the things we don't want and
* takes care of dirtifying. Dirtifying is preferred over pushing / popping, since drawing the
* patch (as opposed to normal draws) will most likely need different changes anyway. */
- context = context_acquire(This, NULL, CTXUSAGE_BLIT);
+ context = context_acquire(This, NULL);
+ context_apply_blit_state(context, This);
/* First, locate the position data. This is provided in a vertex buffer in the stateblock.
* Beware of vbos
@@ -800,7 +831,7 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
{
struct wined3d_buffer *vb;
vb = (struct wined3d_buffer *)This->stateBlock->streamSource[e->stream_idx];
- e->data = (BYTE *)((unsigned long)e->data + (unsigned long)buffer_get_sysmem(vb));
+ e->data = (BYTE *)((ULONG_PTR)e->data + (ULONG_PTR)buffer_get_sysmem(vb, context->gl_info));
}
vtxStride = e->stride;
data = e->data +
diff --git a/dll/directx/wine/wined3d/glsl_shader.c b/dll/directx/wine/wined3d/glsl_shader.c
index cb23ee6aa0e..056e9adb45a 100644
--- a/dll/directx/wine/wined3d/glsl_shader.c
+++ b/dll/directx/wine/wined3d/glsl_shader.c
@@ -39,8 +39,6 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_constants);
WINE_DECLARE_DEBUG_CHANNEL(d3d_caps);
WINE_DECLARE_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION (*gl_info)
-
#define WINED3D_GLSL_SAMPLE_PROJECTED 0x1
#define WINED3D_GLSL_SAMPLE_RECT 0x2
#define WINED3D_GLSL_SAMPLE_LOD 0x4
@@ -89,7 +87,8 @@ struct shader_glsl_priv {
struct constant_heap vconst_heap;
struct constant_heap pconst_heap;
unsigned char *stack;
- GLhandleARB depth_blt_program[tex_type_count];
+ GLhandleARB depth_blt_program_full[tex_type_count];
+ GLhandleARB depth_blt_program_masked[tex_type_count];
UINT next_constant_version;
};
@@ -255,7 +254,7 @@ 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;
+ GLint i, object_count, source_size = -1;
GLhandleARB *objects;
char *source = NULL;
@@ -275,7 +274,7 @@ static void shader_glsl_dump_program_source(const struct wined3d_gl_info *gl_inf
GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_SHADER_SOURCE_LENGTH_ARB, &tmp));
- if (!source || source_size < tmp)
+ if (source_size < tmp)
{
HeapFree(GetProcessHeap(), 0, source);
@@ -719,8 +718,8 @@ static void shader_glsl_load_np2fixup_constants(
static void shader_glsl_load_constants(const struct wined3d_context *context,
char usePixelShader, char useVertexShader)
{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
const struct wined3d_gl_info *gl_info = context->gl_info;
+ IWineD3DDeviceImpl *device = context->swapchain->device;
IWineD3DStateBlockImpl* stateBlock = device->stateBlock;
struct shader_glsl_priv *priv = device->shader_priv;
@@ -807,7 +806,7 @@ static void shader_glsl_load_constants(const struct wined3d_context *context,
correction_params[1] = 1.0f;
} else {
/* position is window relative, not viewport relative */
- correction_params[0] = ((IWineD3DSurfaceImpl *)context->current_rt)->currentDesc.Height;
+ correction_params[0] = context->current_rt->currentDesc.Height;
correction_params[1] = -1.0f;
}
GL_EXTCALL(glUniform4fvARB(prog->ycorrection_location, 1, correction_params));
@@ -1034,7 +1033,7 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
*/
FIXME("Cannot find a free uniform for vpos correction params\n");
shader_addline(buffer, "const vec4 ycorrection = vec4(%f, %f, 0.0, 0.0);\n",
- context->render_offscreen ? 0.0f : ((IWineD3DSurfaceImpl *)device->render_targets[0])->currentDesc.Height,
+ context->render_offscreen ? 0.0f : device->render_targets[0]->currentDesc.Height,
context->render_offscreen ? 1.0f : -1.0f);
}
shader_addline(buffer, "vec4 vpos;\n");
@@ -1048,20 +1047,37 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
switch (reg_maps->sampler_type[i])
{
case WINED3DSTT_1D:
- shader_addline(buffer, "uniform sampler1D %csampler%u;\n", prefix, i);
+ if (pshader && ps_args->shadow & (1 << i))
+ shader_addline(buffer, "uniform sampler1DShadow %csampler%u;\n", prefix, i);
+ else
+ shader_addline(buffer, "uniform sampler1D %csampler%u;\n", prefix, i);
break;
case WINED3DSTT_2D:
- if(device->stateBlock->textures[i] &&
- IWineD3DBaseTexture_GetTextureDimensions(device->stateBlock->textures[i]) == GL_TEXTURE_RECTANGLE_ARB) {
- shader_addline(buffer, "uniform sampler2DRect %csampler%u;\n", prefix, i);
- } else {
- shader_addline(buffer, "uniform sampler2D %csampler%u;\n", prefix, i);
+ if (pshader && ps_args->shadow & (1 << i))
+ {
+ if (device->stateBlock->textures[i]
+ && IWineD3DBaseTexture_GetTextureDimensions(device->stateBlock->textures[i])
+ == GL_TEXTURE_RECTANGLE_ARB)
+ shader_addline(buffer, "uniform sampler2DRectShadow %csampler%u;\n", prefix, i);
+ else
+ shader_addline(buffer, "uniform sampler2DShadow %csampler%u;\n", prefix, i);
+ }
+ else
+ {
+ if (device->stateBlock->textures[i]
+ && IWineD3DBaseTexture_GetTextureDimensions(device->stateBlock->textures[i])
+ == GL_TEXTURE_RECTANGLE_ARB)
+ shader_addline(buffer, "uniform sampler2DRect %csampler%u;\n", prefix, i);
+ else
+ shader_addline(buffer, "uniform sampler2D %csampler%u;\n", prefix, i);
}
break;
case WINED3DSTT_CUBE:
+ if (pshader && ps_args->shadow & (1 << i)) FIXME("Unsupported Cube shadow sampler.\n");
shader_addline(buffer, "uniform samplerCube %csampler%u;\n", prefix, i);
break;
case WINED3DSTT_VOLUME:
+ if (pshader && ps_args->shadow & (1 << i)) FIXME("Unsupported 3D shadow sampler.\n");
shader_addline(buffer, "uniform sampler3D %csampler%u;\n", prefix, i);
break;
default:
@@ -1642,9 +1658,13 @@ static inline const char *shader_get_comp_op(DWORD op)
}
}
-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)
+static void shader_glsl_get_sample_function(const struct wined3d_shader_context *ctx,
+ DWORD sampler_idx, DWORD flags, glsl_sample_function_t *sample_function)
{
+ WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ctx->reg_maps->sampler_type[sampler_idx];
+ const struct wined3d_gl_info *gl_info = ctx->gl_info;
+ BOOL shadow = shader_is_pshader_version(ctx->reg_maps->shader_version.type)
+ && (((const struct shader_glsl_ctx_priv *)ctx->backend_data)->cur_ps_args->shadow & (1 << sampler_idx));
BOOL projected = flags & WINED3D_GLSL_SAMPLE_PROJECTED;
BOOL texrect = flags & WINED3D_GLSL_SAMPLE_RECT;
BOOL lod = flags & WINED3D_GLSL_SAMPLE_LOD;
@@ -1653,115 +1673,225 @@ static void shader_glsl_get_sample_function(const struct wined3d_gl_info *gl_inf
/* Note that there's no such thing as a projected cube texture. */
switch(sampler_type) {
case WINED3DSTT_1D:
- if(lod) {
- sample_function->name = projected ? "texture1DProjLod" : "texture1DLod";
- }
- else if (grad)
+ if (shadow)
{
- 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";
+ if (lod)
+ {
+ sample_function->name = projected ? "shadow1DProjLod" : "shadow1DLod";
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = projected ? "shadow1DProjGrad" : "shadow1DGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = projected ? "shadow1DProjGradARB" : "shadow1DGradARB";
+ else
+ {
+ FIXME("Unsupported 1D shadow grad function.\n");
+ sample_function->name = "unsupported1DGrad";
+ }
+ }
else
{
- FIXME("Unsupported 1D grad function.\n");
- sample_function->name = "unsupported1DGrad";
+ sample_function->name = projected ? "shadow1DProj" : "shadow1D";
}
+ sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1;
}
else
{
- sample_function->name = projected ? "texture1DProj" : "texture1D";
+ if (lod)
+ {
+ sample_function->name = projected ? "texture1DProjLod" : "texture1DLod";
+ }
+ 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;
}
- sample_function->coord_mask = WINED3DSP_WRITEMASK_0;
break;
+
case WINED3DSTT_2D:
- if(texrect) {
- if(lod) {
- sample_function->name = projected ? "texture2DRectProjLod" : "texture2DRectLod";
- }
- else if (grad)
+ if (shadow)
+ {
+ if (texrect)
{
- 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";
+ if (lod)
+ {
+ sample_function->name = projected ? "shadow2DRectProjLod" : "shadow2DRectLod";
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = projected ? "shadow2DRectProjGrad" : "shadow2DRectGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = projected ? "shadow2DRectProjGradARB" : "shadow2DRectGradARB";
+ else
+ {
+ FIXME("Unsupported RECT shadow grad function.\n");
+ sample_function->name = "unsupported2DRectGrad";
+ }
+ }
else
{
- FIXME("Unsupported RECT grad function.\n");
- sample_function->name = "unsupported2DRectGrad";
+ sample_function->name = projected ? "shadow2DRectProj" : "shadow2DRect";
}
}
else
{
- sample_function->name = projected ? "texture2DRectProj" : "texture2DRect";
- }
- } else {
- if(lod) {
- sample_function->name = projected ? "texture2DProjLod" : "texture2DLod";
- }
- 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";
+ if (lod)
+ {
+ sample_function->name = projected ? "shadow2DProjLod" : "shadow2DLod";
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = projected ? "shadow2DProjGrad" : "shadow2DGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = projected ? "shadow2DProjGradARB" : "shadow2DGradARB";
+ else
+ {
+ FIXME("Unsupported 2D shadow grad function.\n");
+ sample_function->name = "unsupported2DGrad";
+ }
+ }
else
{
- FIXME("Unsupported 2D grad function.\n");
- sample_function->name = "unsupported2DGrad";
+ sample_function->name = projected ? "shadow2DProj" : "shadow2D";
}
}
- else
- {
- sample_function->name = projected ? "texture2DProj" : "texture2D";
- }
+ sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
+ }
+ else
+ {
+ if (texrect)
+ {
+ if (lod)
+ {
+ sample_function->name = projected ? "texture2DRectProjLod" : "texture2DRectLod";
+ }
+ 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)
+ {
+ 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";
+ }
+ }
+ sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1;
}
- sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1;
break;
+
case WINED3DSTT_CUBE:
- if(lod) {
- sample_function->name = "textureCubeLod";
- }
- else if (grad)
+ if (shadow)
{
- 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";
- }
+ FIXME("Unsupported Cube shadow function.\n ");
+ sample_function->name = "unsupportedCubeShadow";
+ sample_function->coord_mask = 0;
}
else
{
- sample_function->name = "textureCube";
+ if (lod)
+ {
+ sample_function->name = "textureCubeLod";
+ }
+ 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;
}
- sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
break;
+
case WINED3DSTT_VOLUME:
- if(lod) {
- sample_function->name = projected ? "texture3DProjLod" : "texture3DLod";
- }
- else if (grad)
+ if (shadow)
{
- 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";
- }
+ FIXME("Unsupported 3D shadow function.\n ");
+ sample_function->name = "unsupported3DShadow";
+ sample_function->coord_mask = 0;
}
else
{
- sample_function->name = projected ? "texture3DProj" : "texture3D";
+ if (lod)
+ {
+ sample_function->name = projected ? "texture3DProjLod" : "texture3DLod";
+ }
+ 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;
}
- sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
break;
+
default:
sample_function->name = "";
sample_function->coord_mask = 0;
@@ -2164,16 +2294,26 @@ 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;
+ unsigned int mask_size;
DWORD write_mask;
char dst_mask[6];
write_mask = shader_glsl_get_write_mask(ins->dst, dst_mask);
+ mask_size = shader_glsl_get_write_mask_size(write_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);
+ if (mask_size > 1)
+ {
+ shader_addline(buffer, "tmp0.x == 0.0 ? vec%u(0.0) : (%s / tmp0.x));\n",
+ mask_size, src_param.param_str);
+ }
+ else
+ {
+ shader_addline(buffer, "tmp0.x == 0.0 ? 0.0 : (%s / tmp0.x));\n",
+ src_param.param_str);
+ }
}
/** Process the WINED3DSIO_EXPP instruction in GLSL:
@@ -2868,10 +3008,8 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
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;
DWORD sampler_idx;
DWORD mask = 0, swizzle;
@@ -2879,11 +3017,11 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
* 2.0+: Use provided sampler source. */
if (shader_version < WINED3D_SHADER_VERSION(2,0)) sampler_idx = ins->dst[0].reg.idx;
else sampler_idx = ins->src[1].reg.idx;
- sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
if (shader_version < WINED3D_SHADER_VERSION(1,4))
{
DWORD flags = deviceImpl->stateBlock->textureState[sampler_idx][WINED3DTSS_TEXTURETRANSFORMFLAGS];
+ WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
/* Projected cube textures don't make a lot of sense, the resulting coordinates stay the same. */
if (flags & WINED3DTTFF_PROJECTED && sampler_type != WINED3DSTT_CUBE) {
@@ -2922,7 +3060,7 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
}
- shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, sample_flags, &sample_function);
mask |= sample_function.coord_mask;
if (shader_version < WINED3D_SHADER_VERSION(2,0)) swizzle = WINED3DSP_NOSWIZZLE;
@@ -2960,7 +3098,6 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
glsl_sample_function_t sample_function;
glsl_src_param_t coord_param, dx_param, dy_param;
DWORD sample_flags = WINED3D_GLSL_SAMPLE_GRAD;
- DWORD sampler_type;
DWORD sampler_idx;
DWORD swizzle = ins->src[1].swizzle;
@@ -2971,13 +3108,12 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
}
sampler_idx = ins->src[1].reg.idx;
- sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
if(deviceImpl->stateBlock->textures[sampler_idx] &&
IWineD3DBaseTexture_GetTextureDimensions(deviceImpl->stateBlock->textures[sampler_idx]) == GL_TEXTURE_RECTANGLE_ARB) {
sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
}
- shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, 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);
@@ -2994,17 +3130,15 @@ static void shader_glsl_texldl(const struct wined3d_shader_instruction *ins)
glsl_sample_function_t sample_function;
glsl_src_param_t coord_param, lod_param;
DWORD sample_flags = WINED3D_GLSL_SAMPLE_LOD;
- DWORD sampler_type;
DWORD sampler_idx;
DWORD swizzle = ins->src[1].swizzle;
sampler_idx = ins->src[1].reg.idx;
- sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
if(deviceImpl->stateBlock->textures[sampler_idx] &&
IWineD3DBaseTexture_GetTextureDimensions(deviceImpl->stateBlock->textures[sampler_idx]) == GL_TEXTURE_RECTANGLE_ARB) {
sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
}
- shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, 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);
@@ -3071,12 +3205,10 @@ 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;
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
- WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
UINT mask_size;
shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param);
@@ -3086,7 +3218,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(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, 0, &sample_function);
mask_size = shader_glsl_get_write_mask_size(sample_function.coord_mask);
switch(mask_size)
@@ -3199,18 +3331,16 @@ 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;
glsl_src_param_t src0_param;
- WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[reg];
glsl_sample_function_t sample_function;
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(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, reg, 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");
@@ -3223,17 +3353,15 @@ 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;
- WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[reg];
glsl_sample_function_t sample_function;
shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param);
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(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, reg, 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");
@@ -3266,13 +3394,11 @@ static void shader_glsl_texm3x3(const struct wined3d_shader_instruction *ins)
static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins)
{
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;
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
SHADER_PARSE_STATE* current_state = &shader->baseShader.parse_state;
- WINED3DSAMPLER_TEXTURE_TYPE stype = ins->ctx->reg_maps->sampler_type[reg];
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
glsl_sample_function_t sample_function;
@@ -3285,7 +3411,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(gl_info, stype, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, reg, 0, &sample_function);
/* Sample the texture */
shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz");
@@ -3298,13 +3424,11 @@ static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins
static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *ins)
{
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;
glsl_src_param_t src0_param;
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
- WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[reg];
glsl_sample_function_t sample_function;
shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param);
@@ -3318,7 +3442,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(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, reg, 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");
@@ -3334,10 +3458,8 @@ static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins)
{
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;
DWORD sampler_idx;
DWORD mask;
DWORD flags;
@@ -3346,9 +3468,8 @@ static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins)
sampler_idx = ins->dst[0].reg.idx;
flags = deviceImpl->stateBlock->textureState[sampler_idx][WINED3DTSS_TEXTURETRANSFORMFLAGS];
- sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
/* Dependent read, not valid with conditional NP2 */
- shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, 0, &sample_function);
mask = sample_function.coord_mask;
shader_glsl_write_mask_to_str(mask, coord_mask);
@@ -3407,15 +3528,13 @@ 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];
glsl_sample_function_t sample_function;
shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_ALL, &src0_param);
- shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, 0, &sample_function);
shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL,
"%s.wx", src0_param.reg_name);
}
@@ -3424,15 +3543,13 @@ 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];
glsl_sample_function_t sample_function;
shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_ALL, &src0_param);
- shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, 0, &sample_function);
shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL,
"%s.yz", src0_param.reg_name);
}
@@ -3441,14 +3558,12 @@ 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(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, 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,
@@ -4453,10 +4568,12 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
}
/* GL locking is done by the caller */
-static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info, enum tex_types tex_type)
+static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info, enum tex_types tex_type, BOOL masked)
{
GLhandleARB program_id;
GLhandleARB vshader_id, pshader_id;
+ const char *blt_pshader;
+
static const char *blt_vshader[] =
{
"#version 120\n"
@@ -4468,7 +4585,7 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info,
"}\n"
};
- static const char *blt_pshaders[tex_type_count] =
+ static const char *blt_pshaders_full[tex_type_count] =
{
/* tex_1d */
NULL,
@@ -4498,7 +4615,44 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info,
"}\n",
};
- if (!blt_pshaders[tex_type])
+ static const char *blt_pshaders_masked[tex_type_count] =
+ {
+ /* tex_1d */
+ NULL,
+ /* tex_2d */
+ "#version 120\n"
+ "uniform sampler2D sampler;\n"
+ "uniform vec4 mask;\n"
+ "void main(void)\n"
+ "{\n"
+ " if (all(lessThan(gl_FragCoord.xy, mask.zw))) discard;\n"
+ " gl_FragDepth = texture2D(sampler, gl_TexCoord[0].xy).x;\n"
+ "}\n",
+ /* tex_3d */
+ NULL,
+ /* tex_cube */
+ "#version 120\n"
+ "uniform samplerCube sampler;\n"
+ "uniform vec4 mask;\n"
+ "void main(void)\n"
+ "{\n"
+ " if (all(lessThan(gl_FragCoord.xy, mask.zw))) discard;\n"
+ " gl_FragDepth = textureCube(sampler, gl_TexCoord[0].xyz).x;\n"
+ "}\n",
+ /* tex_rect */
+ "#version 120\n"
+ "#extension GL_ARB_texture_rectangle : enable\n"
+ "uniform sampler2DRect sampler;\n"
+ "uniform vec4 mask;\n"
+ "void main(void)\n"
+ "{\n"
+ " if (all(lessThan(gl_FragCoord.xy, mask.zw))) discard;\n"
+ " gl_FragDepth = texture2DRect(sampler, gl_TexCoord[0].xy).x;\n"
+ "}\n",
+ };
+
+ blt_pshader = masked ? blt_pshaders_masked[tex_type] : blt_pshaders_full[tex_type];
+ if (!blt_pshader)
{
FIXME("tex_type %#x not supported\n", tex_type);
tex_type = tex_2d;
@@ -4509,7 +4663,7 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info,
GL_EXTCALL(glCompileShaderARB(vshader_id));
pshader_id = GL_EXTCALL(glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB));
- GL_EXTCALL(glShaderSourceARB(pshader_id, 1, &blt_pshaders[tex_type], NULL));
+ GL_EXTCALL(glShaderSourceARB(pshader_id, 1, &blt_pshader, NULL));
GL_EXTCALL(glCompileShaderARB(pshader_id));
program_id = GL_EXTCALL(glCreateProgramObjectARB());
@@ -4530,8 +4684,8 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info,
/* GL locking is done by the caller */
static void shader_glsl_select(const struct wined3d_context *context, BOOL usePS, BOOL useVS)
{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
const struct wined3d_gl_info *gl_info = context->gl_info;
+ IWineD3DDeviceImpl *device = context->swapchain->device;
struct shader_glsl_priv *priv = device->shader_priv;
GLhandleARB program_id = 0;
GLenum old_vertex_color_clamp, current_vertex_color_clamp;
@@ -4571,21 +4725,34 @@ static void shader_glsl_select(const struct wined3d_context *context, BOOL usePS
}
/* GL locking is done by the caller */
-static void shader_glsl_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) {
+static void shader_glsl_select_depth_blt(IWineD3DDevice *iface,
+ enum tex_types tex_type, const SIZE *ds_mask_size)
+{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
+ BOOL masked = ds_mask_size->cx && ds_mask_size->cy;
struct shader_glsl_priv *priv = This->shader_priv;
- GLhandleARB *blt_program = &priv->depth_blt_program[tex_type];
+ GLhandleARB *blt_program;
+ GLint loc;
- if (!*blt_program) {
- GLint loc;
- *blt_program = create_glsl_blt_shader(gl_info, tex_type);
+ blt_program = masked ? &priv->depth_blt_program_masked[tex_type] : &priv->depth_blt_program_full[tex_type];
+ if (!*blt_program)
+ {
+ *blt_program = create_glsl_blt_shader(gl_info, tex_type, masked);
loc = GL_EXTCALL(glGetUniformLocationARB(*blt_program, "sampler"));
GL_EXTCALL(glUseProgramObjectARB(*blt_program));
GL_EXTCALL(glUniform1iARB(loc, 0));
- } else {
+ }
+ else
+ {
GL_EXTCALL(glUseProgramObjectARB(*blt_program));
}
+
+ if (masked)
+ {
+ loc = GL_EXTCALL(glGetUniformLocationARB(*blt_program, "mask"));
+ GL_EXTCALL(glUniform4fARB(loc, 0.0f, 0.0f, (float)ds_mask_size->cx, (float)ds_mask_size->cy));
+ }
}
/* GL locking is done by the caller */
@@ -4625,7 +4792,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
return;
}
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
gl_info = context->gl_info;
if (priv->glsl_program && (IWineD3DBaseShader *)priv->glsl_program->pshader == iface)
@@ -4644,7 +4811,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
return;
}
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
gl_info = context->gl_info;
if (priv->glsl_program && (IWineD3DBaseShader *)priv->glsl_program->vshader == iface)
@@ -4821,9 +4988,13 @@ static void shader_glsl_free(IWineD3DDevice *iface) {
ENTER_GL();
for (i = 0; i < tex_type_count; ++i)
{
- if (priv->depth_blt_program[i])
+ if (priv->depth_blt_program_full[i])
{
- GL_EXTCALL(glDeleteObjectARB(priv->depth_blt_program[i]));
+ GL_EXTCALL(glDeleteObjectARB(priv->depth_blt_program_full[i]));
+ }
+ if (priv->depth_blt_program_masked[i])
+ {
+ GL_EXTCALL(glDeleteObjectARB(priv->depth_blt_program_masked[i]));
}
}
LEAVE_GL();
diff --git a/dll/directx/wine/wined3d/nvidia_texture_shader.c b/dll/directx/wine/wined3d/nvidia_texture_shader.c
index 64bb883d6c8..24cba329f20 100644
--- a/dll/directx/wine/wined3d/nvidia_texture_shader.c
+++ b/dll/directx/wine/wined3d/nvidia_texture_shader.c
@@ -28,8 +28,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION stateblock->device->adapter->gl_info
-
/* GL locking for state handlers is done by the caller. */
static void nvts_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
@@ -137,7 +135,6 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX
GLenum portion = is_alpha ? GL_ALPHA : GL_RGB;
GLenum target = GL_COMBINER0_NV + stage;
GLenum output;
- IWineD3DStateBlockImpl *stateblock = This->stateBlock; /* For GLINFO_LOCATION */
TRACE("stage %d, is_alpha %d, op %s, arg1 %#x, arg2 %#x, arg3 %#x, texture_idx %d\n",
stage, is_alpha, debug_d3dtop(op), arg1, arg2, arg3, texture_idx);
@@ -579,6 +576,7 @@ static void nvts_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, str
{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
DWORD mapped_stage = stateblock->device->texUnitMap[stage + 1];
+ const struct wined3d_gl_info *gl_info = context->gl_info;
float mat[2][2];
/* Direct3D sets the matrix in the stage reading the perturbation map. The result is used to
@@ -587,7 +585,7 @@ static void nvts_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, str
* map is read from a specified source stage(always stage - 1 for d3d). Thus set the matrix
* for stage + 1. Keep the nvrc tex unit mapping in mind too
*/
- if (mapped_stage < context->gl_info->limits.textures)
+ if (mapped_stage < gl_info->limits.textures)
{
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
checkGLcall("GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage))");
@@ -606,6 +604,7 @@ static void nvts_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, str
static void nvrc_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
float col[4];
D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], col);
GL_EXTCALL(glCombinerParameterfvNV(GL_CONSTANT_COLOR0_NV, &col[0]));
@@ -629,6 +628,15 @@ static void nvts_enable(IWineD3DDevice *iface, BOOL enable) {
static void nvrc_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
{
+ pCaps->PrimitiveMiscCaps = WINED3DPMISCCAPS_TSSARGTEMP;
+
+ /* The caps below can be supported but aren't handled yet in utils.c
+ * 'd3dta_to_combiner_input', disable them until support is fixed */
+#if 0
+ if (gl_info->supported[NV_REGISTER_COMBINERS2])
+ pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_PERSTAGECONSTANT;
+#endif
+
pCaps->TextureOpCaps = WINED3DTEXOPCAPS_ADD |
WINED3DTEXOPCAPS_ADDSIGNED |
WINED3DTEXOPCAPS_ADDSIGNED2X |
@@ -672,14 +680,6 @@ static void nvrc_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct
pCaps->MaxTextureBlendStages = min(MAX_TEXTURES, gl_info->limits.general_combiners);
pCaps->MaxSimultaneousTextures = gl_info->limits.textures;
-
- pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_TSSARGTEMP;
-
- /* The caps below can be supported but aren't handled yet in utils.c 'd3dta_to_combiner_input', disable them until support is fixed */
-#if 0
- if (gl_info->supported[NV_REGISTER_COMBINERS2])
- pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_PERSTAGECONSTANT;
-#endif
}
static HRESULT nvrc_fragment_alloc(IWineD3DDevice *iface) { return WINED3D_OK; }
@@ -713,119 +713,119 @@ static BOOL nvts_color_fixup_supported(struct color_fixup_desc fixup)
static const struct StateEntryTemplate nvrc_fragmentstate_template[] = {
{ STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_PIXELSHADER, { STATE_PIXELSHADER, apply_pixelshader }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, apply_pixelshader }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), nvrc_texfactor }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGDENSITY), { STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), nvts_texdim }, NV_TEXTURE_SHADER2 },
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(1), { STATE_SAMPLER(1), nvts_texdim }, NV_TEXTURE_SHADER2 },
diff --git a/dll/directx/wine/wined3d/palette.c b/dll/directx/wine/wined3d/palette.c
index 553a08a787b..3fd8be9dd10 100644
--- a/dll/directx/wine/wined3d/palette.c
+++ b/dll/directx/wine/wined3d/palette.c
@@ -74,7 +74,8 @@ static ULONG WINAPI IWineD3DPaletteImpl_Release(IWineD3DPalette *iface) {
}
/* Not called from the vtable */
-DWORD IWineD3DPaletteImpl_Size(DWORD dwFlags) {
+static DWORD IWineD3DPaletteImpl_Size(DWORD dwFlags)
+{
switch (dwFlags & SIZE_BITS) {
case WINEDDPCAPS_1BIT: return 2;
case WINEDDPCAPS_2BIT: return 4;
@@ -183,7 +184,7 @@ static HRESULT WINAPI IWineD3DPaletteImpl_GetParent(IWineD3DPalette *iface, IUn
return WINED3D_OK;
}
-const IWineD3DPaletteVtbl IWineD3DPalette_Vtbl =
+static const IWineD3DPaletteVtbl IWineD3DPalette_Vtbl =
{
/*** IUnknown ***/
IWineD3DPaletteImpl_QueryInterface,
@@ -195,3 +196,33 @@ const IWineD3DPaletteVtbl IWineD3DPalette_Vtbl =
IWineD3DPaletteImpl_GetCaps,
IWineD3DPaletteImpl_SetEntries
};
+
+HRESULT wined3d_palette_init(IWineD3DPaletteImpl *palette, IWineD3DDeviceImpl *device,
+ DWORD flags, const PALETTEENTRY *entries, IUnknown *parent)
+{
+ HRESULT hr;
+
+ palette->lpVtbl = &IWineD3DPalette_Vtbl;
+ palette->ref = 1;
+ palette->parent = parent;
+ palette->device = device;
+ palette->Flags = flags;
+
+ palette->palNumEntries = IWineD3DPaletteImpl_Size(flags);
+ palette->hpal = CreatePalette((const LOGPALETTE *)&palette->palVersion);
+ if (!palette->hpal)
+ {
+ WARN("Failed to create palette.\n");
+ return E_FAIL;
+ }
+
+ hr = IWineD3DPalette_SetEntries((IWineD3DPalette *)palette, 0, 0, IWineD3DPaletteImpl_Size(flags), entries);
+ if (FAILED(hr))
+ {
+ WARN("Failed to set palette entries, hr %#x.\n", hr);
+ DeleteObject(palette->hpal);
+ return hr;
+ }
+
+ return WINED3D_OK;
+}
diff --git a/dll/directx/wine/wined3d/query.c b/dll/directx/wine/wined3d/query.c
index 3860e2c95b5..b3c77eae692 100644
--- a/dll/directx/wine/wined3d/query.c
+++ b/dll/directx/wine/wined3d/query.c
@@ -25,33 +25,19 @@
#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)
+BOOL wined3d_event_query_supported(const struct wined3d_gl_info *gl_info)
{
- 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;
+ return gl_info->supported[ARB_SYNC] || gl_info->supported[NV_FENCE] || gl_info->supported[APPLE_FENCE];
}
-static void wined3d_event_query_destroy(struct wined3d_event_query *query)
+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)
+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;
@@ -72,7 +58,7 @@ static enum wined3d_event_query_result wined3d_event_query_test(struct wined3d_e
return WINED3D_EVENT_QUERY_WRONG_THREAD;
}
- context = context_acquire(device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, query->context->current_rt);
gl_info = context->gl_info;
ENTER_GL();
@@ -125,7 +111,75 @@ static enum wined3d_event_query_result wined3d_event_query_test(struct wined3d_e
return ret;
}
-static void wined3d_event_query_issue(struct wined3d_event_query *query, IWineD3DDeviceImpl *device)
+enum wined3d_event_query_result wined3d_event_query_finish(struct wined3d_event_query *query, IWineD3DDeviceImpl *device)
+{
+ struct wined3d_context *context;
+ const struct wined3d_gl_info *gl_info;
+ enum wined3d_event_query_result ret;
+
+ TRACE("(%p)\n", query);
+
+ if (!query->context)
+ {
+ TRACE("Query not started\n");
+ return WINED3D_EVENT_QUERY_NOT_STARTED;
+ }
+ gl_info = query->context->gl_info;
+
+ if (query->context->tid != GetCurrentThreadId() && !gl_info->supported[ARB_SYNC])
+ {
+ /* A glFinish does not reliably wait for draws in other contexts. The caller has
+ * to find its own way to cope with the thread switch
+ */
+ WARN("Event query finished from wrong thread\n");
+ return WINED3D_EVENT_QUERY_WRONG_THREAD;
+ }
+
+ context = context_acquire(device, query->context->current_rt);
+
+ ENTER_GL();
+ if (gl_info->supported[ARB_SYNC])
+ {
+ GLenum gl_ret = GL_EXTCALL(glClientWaitSync(query->object.sync, 0, ~(GLuint64)0));
+ checkGLcall("glClientWaitSync");
+
+ switch (gl_ret)
+ {
+ case GL_ALREADY_SIGNALED:
+ case GL_CONDITION_SATISFIED:
+ ret = WINED3D_EVENT_QUERY_OK;
+ break;
+
+ /* We don't expect a timeout for a ~584 year wait */
+ default:
+ ERR("glClientWaitSync returned %#x.\n", gl_ret);
+ ret = WINED3D_EVENT_QUERY_ERROR;
+ }
+ }
+ else if (context->gl_info->supported[APPLE_FENCE])
+ {
+ GL_EXTCALL(glFinishFenceAPPLE(query->object.id));
+ checkGLcall("glFinishFenceAPPLE");
+ ret = WINED3D_EVENT_QUERY_OK;
+ }
+ else if (context->gl_info->supported[NV_FENCE])
+ {
+ GL_EXTCALL(glFinishFenceNV(query->object.id));
+ checkGLcall("glFinishFenceNV");
+ ret = WINED3D_EVENT_QUERY_OK;
+ }
+ else
+ {
+ ERR("Event query created without GL support\n");
+ ret = WINED3D_EVENT_QUERY_ERROR;
+ }
+ LEAVE_GL();
+
+ context_release(context);
+ return ret;
+}
+
+void wined3d_event_query_issue(struct wined3d_event_query *query, IWineD3DDeviceImpl *device)
{
const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
@@ -135,17 +189,17 @@ static void wined3d_event_query_issue(struct wined3d_event_query *query, IWineD3
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 = context_acquire(device, NULL);
context_alloc_event_query(context, query);
}
else
{
- context = context_acquire(device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, query->context->current_rt);
}
}
else
{
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
context_alloc_event_query(context, query);
}
@@ -293,7 +347,7 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_GetData(IWineD3DQuery* iface,
return S_OK;
}
- context = context_acquire(This->device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This->device, query->context->current_rt);
ENTER_GL();
@@ -430,12 +484,12 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_Issue(IWineD3DQuery* iface, D
FIXME("Wrong thread, can't restart query.\n");
context_free_occlusion_query(query);
- context = context_acquire(This->device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This->device, NULL);
context_alloc_occlusion_query(context, query);
}
else
{
- context = context_acquire(This->device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This->device, query->context->current_rt);
ENTER_GL();
GL_EXTCALL(glEndQueryARB(GL_SAMPLES_PASSED_ARB));
@@ -446,7 +500,7 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_Issue(IWineD3DQuery* iface, D
else
{
if (query->context) context_free_occlusion_query(query);
- context = context_acquire(This->device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This->device, NULL);
context_alloc_occlusion_query(context, query);
}
@@ -470,7 +524,7 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_Issue(IWineD3DQuery* iface, D
}
else
{
- context = context_acquire(This->device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This->device, query->context->current_rt);
ENTER_GL();
GL_EXTCALL(glEndQueryARB(GL_SAMPLES_PASSED_ARB));
@@ -525,7 +579,6 @@ 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)
{
@@ -548,9 +601,7 @@ HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device,
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)
+ if (!wined3d_event_query_supported(gl_info))
{
/* Half-Life 2 needs this query. It does not render the main
* menu correctly otherwise. Pretend to support it, faking
@@ -558,9 +609,12 @@ HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device,
* lowering performance. */
FIXME("Event query: Unimplemented, but pretending to be supported.\n");
}
- else if(FAILED(hr))
+ query->lpVtbl = &IWineD3DEventQuery_Vtbl;
+ query->extendedData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct wined3d_event_query));
+ if (!query->extendedData)
{
- return hr;
+ ERR("Failed to allocate event query memory.\n");
+ return E_OUTOFMEMORY;
}
break;
diff --git a/dll/directx/wine/wined3d/resource.c b/dll/directx/wine/wined3d/resource.c
index b867586096d..67622a38942 100644
--- a/dll/directx/wine/wined3d/resource.c
+++ b/dll/directx/wine/wined3d/resource.c
@@ -28,7 +28,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
HRESULT resource_init(IWineD3DResource *iface, WINED3DRESOURCETYPE resource_type,
- IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc,
+ IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct wined3d_format_desc *format_desc,
WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
{
struct IWineD3DResourceClass *resource = &((IWineD3DResourceImpl *)iface)->resource;
@@ -247,11 +247,3 @@ HRESULT resource_get_parent(IWineD3DResource *iface, IUnknown **pParent)
*pParent = This->resource.parent;
return WINED3D_OK;
}
-
-void dumpResources(struct list *list) {
- IWineD3DResourceImpl *resource;
-
- LIST_FOR_EACH_ENTRY(resource, list, IWineD3DResourceImpl, resource.resource_list_entry) {
- FIXME("Leftover resource %p with type %d,%s\n", resource, IWineD3DResource_GetType((IWineD3DResource *) resource), debug_d3dresourcetype(IWineD3DResource_GetType((IWineD3DResource *) resource)));
- }
-}
diff --git a/dll/directx/wine/wined3d/shader.c b/dll/directx/wine/wined3d/shader.c
index 307cadf804c..f26122af869 100644
--- a/dll/directx/wine/wined3d/shader.c
+++ b/dll/directx/wine/wined3d/shader.c
@@ -721,6 +721,7 @@ static HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct
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;
+ else if (ins.handler_idx == WINED3DSIH_RCP) reg_maps->usesrcp = 1;
limit = ins.src_count + (ins.predicate ? 1 : 0);
for (i = 0; i < limit; ++i)
@@ -1150,7 +1151,11 @@ void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffe
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++;
+ if (ins.predicate)
+ {
+ FIXME("Predicates not implemented.\n");
+ ins.predicate = *ptr++;
+ }
/* Other source tokens */
for (i = 0; i < ins.src_count; ++i)
@@ -1399,7 +1404,7 @@ static void shader_cleanup(IWineD3DBaseShader *iface)
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_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type, const SIZE *ds_mask_size) {}
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) {}
@@ -1414,8 +1419,11 @@ static void shader_none_get_caps(const struct wined3d_gl_info *gl_info, struct s
{
/* Set the shader caps to 0 for the none shader backend */
caps->VertexShaderVersion = 0;
+ caps->MaxVertexShaderConst = 0;
caps->PixelShaderVersion = 0;
caps->PixelShader1xMaxValue = 0.0f;
+ caps->MaxPixelShaderConst = 0;
+ caps->VSClipping = FALSE;
}
static BOOL shader_none_color_fixup_supported(struct color_fixup_desc fixup)
@@ -2017,6 +2025,9 @@ void find_ps_compile_args(IWineD3DPixelShaderImpl *shader,
}
args->color_fixup[i] = texture->resource.format_desc->color_fixup;
+ if (texture->resource.format_desc->Flags & WINED3DFMT_FLAG_SHADOW)
+ args->shadow |= 1 << i;
+
/* Flag samplers that need NP2 texcoord fixup. */
if (!texture->baseTexture.pow2Matrix_identity)
{
diff --git a/dll/directx/wine/wined3d/state.c b/dll/directx/wine/wined3d/state.c
index 5efe069bb19..4c6d5bfe025 100644
--- a/dll/directx/wine/wined3d/state.c
+++ b/dll/directx/wine/wined3d/state.c
@@ -35,31 +35,20 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
WINE_DECLARE_DEBUG_CHANNEL(d3d_shader);
-#define GLINFO_LOCATION (*context->gl_info)
-
/* GL locking for state handlers is done by the caller. */
static void state_blendop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context);
-static void state_nogl(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
-{
- /* Used for states which are not mapped to a gl state as-is, but used somehow different,
- * e.g as a parameter for drawing, or which are unimplemented in windows d3d
- */
- if(STATE_IS_RENDER(state)) {
- WINED3DRENDERSTATETYPE RenderState = state - STATE_RENDER(0);
- TRACE("(%s,%d) no direct mapping to gl\n", debug_d3drenderstate(RenderState), stateblock->renderState[RenderState]);
- } else {
- /* Shouldn't have an unknown type here */
- FIXME("%d no direct mapping to gl of state with unknown type\n", state);
- }
-}
-
static void state_undefined(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
ERR("Undefined state.\n");
}
+static void state_nop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ TRACE("%s: nop in current pipe config.\n", debug_d3dstate(state));
+}
+
static void state_fillmode(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
WINED3DFILLMODE Value = stateblock->renderState[WINED3DRS_FILLMODE];
@@ -108,7 +97,7 @@ static void state_lighting(DWORD state, IWineD3DStateBlockImpl *stateblock, stru
static void state_zenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
/* No z test without depth stencil buffers */
- if (!stateblock->device->stencilBufferTarget)
+ if (!stateblock->device->depth_stencil)
{
TRACE("No Z buffer - disabling depth test\n");
glDisable(GL_DEPTH_TEST); /* This also disables z writing in gl */
@@ -242,7 +231,8 @@ static void state_ambient(DWORD state, IWineD3DStateBlockImpl *stateblock, struc
static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- IWineD3DSurfaceImpl *target = (IWineD3DSurfaceImpl *)stateblock->device->render_targets[0];
+ IWineD3DSurfaceImpl *target = stateblock->device->render_targets[0];
+ const struct wined3d_gl_info *gl_info = context->gl_info;
int srcBlend = GL_ZERO;
int dstBlend = GL_ZERO;
@@ -450,10 +440,7 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct
/* colorkey fixup for stage 0 alphaop depends on WINED3DRS_ALPHABLENDENABLE state,
so it may need updating */
if (stateblock->renderState[WINED3DRS_COLORKEYENABLE])
- {
- const struct StateEntry *StateTable = stateblock->device->StateTable;
- StateTable[STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP)].apply(STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), stateblock, context);
- }
+ stateblock_apply_state(STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), stateblock, context);
}
static void state_blendfactor_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
@@ -463,6 +450,7 @@ static void state_blendfactor_w(DWORD state, IWineD3DStateBlockImpl *stateblock,
static void state_blendfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
float col[4];
TRACE("Setting BlendFactor to %d\n", stateblock->renderState[WINED3DRS_BLENDFACTOR]);
@@ -491,9 +479,8 @@ static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, struct
if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB)
{
- IWineD3DSurfaceImpl *surf;
-
- surf = (IWineD3DSurfaceImpl *) ((IWineD3DTextureImpl *)stateblock->textures[0])->surfaces[0];
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)stateblock->textures[0];
+ IWineD3DSurfaceImpl *surf = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[0];
if (surf->CKeyFlags & WINEDDSD_CKSRCBLT)
{
@@ -506,10 +493,7 @@ static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, struct
}
if (enable_ckey || context->last_was_ckey)
- {
- const struct StateEntry *StateTable = stateblock->device->StateTable;
- StateTable[STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP)].apply(STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), stateblock, context);
- }
+ stateblock_apply_state(STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), stateblock, context);
context->last_was_ckey = enable_ckey;
if (stateblock->renderState[WINED3DRS_ALPHATESTENABLE] ||
@@ -621,12 +605,13 @@ static void state_blendop_w(DWORD state, IWineD3DStateBlockImpl *stateblock, str
static void state_blendop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
int blendEquation = GL_FUNC_ADD;
int blendEquationAlpha = GL_FUNC_ADD;
/* BLENDOPALPHA requires GL_EXT_blend_equation_separate, so make sure it is around */
if (stateblock->renderState[WINED3DRS_BLENDOPALPHA]
- && !context->gl_info->supported[EXT_BLEND_EQUATION_SEPARATE])
+ && !gl_info->supported[EXT_BLEND_EQUATION_SEPARATE])
{
WARN("Unsupported in local OpenGL implementation: glBlendEquationSeparateEXT\n");
return;
@@ -779,6 +764,7 @@ static void state_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock
static void state_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
unsigned int i;
/* Note the texture color applies to all textures whereas
@@ -788,7 +774,7 @@ static void state_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, str
D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], col);
/* And now the default texture color as well */
- for (i = 0; i < context->gl_info->limits.texture_stages; ++i)
+ for (i = 0; i < gl_info->limits.texture_stages; ++i)
{
/* Note the WINED3DRS value applies to all textures, but GL has one
* per texture, so apply it now ready to be used!
@@ -804,6 +790,8 @@ static void state_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, str
static void renderstate_stencil_twosided(struct wined3d_context *context, GLint face,
GLint func, GLint ref, GLuint mask, GLint stencilFail, GLint depthFail, GLint stencilPass)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT);
checkGLcall("glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT)");
GL_EXTCALL(glActiveStencilFaceEXT(face));
@@ -831,7 +819,7 @@ static void state_stencil(DWORD state, IWineD3DStateBlockImpl *stateblock, struc
GLint stencilPass_ccw = GL_KEEP;
/* No stencil test without a stencil buffer. */
- if (!stateblock->device->stencilBufferTarget)
+ if (!stateblock->device->depth_stencil)
{
glDisable(GL_STENCIL_TEST);
checkGLcall("glDisable GL_STENCIL_TEST");
@@ -914,7 +902,8 @@ static void state_stencil(DWORD state, IWineD3DStateBlockImpl *stateblock, struc
static void state_stencilwrite2s(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- DWORD mask = stateblock->device->stencilBufferTarget ? stateblock->renderState[WINED3DRS_STENCILWRITEMASK] : 0;
+ DWORD mask = stateblock->device->depth_stencil ? stateblock->renderState[WINED3DRS_STENCILWRITEMASK] : 0;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
GL_EXTCALL(glActiveStencilFaceEXT(GL_BACK));
checkGLcall("glActiveStencilFaceEXT(GL_BACK)");
@@ -927,7 +916,7 @@ static void state_stencilwrite2s(DWORD state, IWineD3DStateBlockImpl *stateblock
static void state_stencilwrite(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- DWORD mask = stateblock->device->stencilBufferTarget ? stateblock->renderState[WINED3DRS_STENCILWRITEMASK] : 0;
+ DWORD mask = stateblock->device->depth_stencil ? stateblock->renderState[WINED3DRS_STENCILWRITEMASK] : 0;
glStencilMask(mask);
checkGLcall("glStencilMask");
@@ -1402,7 +1391,9 @@ static void state_psizemin_w(DWORD state, IWineD3DStateBlockImpl *stateblock, st
static void state_psizemin_ext(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- union {
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ union
+ {
DWORD d;
float f;
} min, max;
@@ -1423,7 +1414,9 @@ static void state_psizemin_ext(DWORD state, IWineD3DStateBlockImpl *stateblock,
static void state_psizemin_arb(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- union {
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ union
+ {
DWORD d;
float f;
} min, max;
@@ -1525,30 +1518,60 @@ static void state_debug_monitor(DWORD state, IWineD3DStateBlockImpl *stateblock,
static void state_colorwrite(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- DWORD Value = stateblock->renderState[WINED3DRS_COLORWRITEENABLE];
+ DWORD mask0 = stateblock->renderState[WINED3DRS_COLORWRITEENABLE];
+ DWORD mask1 = stateblock->renderState[WINED3DRS_COLORWRITEENABLE1];
+ DWORD mask2 = stateblock->renderState[WINED3DRS_COLORWRITEENABLE2];
+ DWORD mask3 = stateblock->renderState[WINED3DRS_COLORWRITEENABLE3];
TRACE("Color mask: r(%d) g(%d) b(%d) a(%d)\n",
- Value & WINED3DCOLORWRITEENABLE_RED ? 1 : 0,
- Value & WINED3DCOLORWRITEENABLE_GREEN ? 1 : 0,
- Value & WINED3DCOLORWRITEENABLE_BLUE ? 1 : 0,
- Value & WINED3DCOLORWRITEENABLE_ALPHA ? 1 : 0);
- glColorMask(Value & WINED3DCOLORWRITEENABLE_RED ? GL_TRUE : GL_FALSE,
- Value & WINED3DCOLORWRITEENABLE_GREEN ? GL_TRUE : GL_FALSE,
- Value & WINED3DCOLORWRITEENABLE_BLUE ? GL_TRUE : GL_FALSE,
- Value & WINED3DCOLORWRITEENABLE_ALPHA ? GL_TRUE : GL_FALSE);
+ mask0 & WINED3DCOLORWRITEENABLE_RED ? 1 : 0,
+ mask0 & WINED3DCOLORWRITEENABLE_GREEN ? 1 : 0,
+ mask0 & WINED3DCOLORWRITEENABLE_BLUE ? 1 : 0,
+ mask0 & WINED3DCOLORWRITEENABLE_ALPHA ? 1 : 0);
+ glColorMask(mask0 & WINED3DCOLORWRITEENABLE_RED ? GL_TRUE : GL_FALSE,
+ mask0 & WINED3DCOLORWRITEENABLE_GREEN ? GL_TRUE : GL_FALSE,
+ mask0 & WINED3DCOLORWRITEENABLE_BLUE ? GL_TRUE : GL_FALSE,
+ mask0 & WINED3DCOLORWRITEENABLE_ALPHA ? GL_TRUE : GL_FALSE);
checkGLcall("glColorMask(...)");
- /* depends on WINED3DRS_COLORWRITEENABLE. */
- if(stateblock->renderState[WINED3DRS_COLORWRITEENABLE1] != 0x0000000F ||
- stateblock->renderState[WINED3DRS_COLORWRITEENABLE2] != 0x0000000F ||
- stateblock->renderState[WINED3DRS_COLORWRITEENABLE3] != 0x0000000F ) {
- ERR("(WINED3DRS_COLORWRITEENABLE1/2/3,%d,%d,%d) not yet implemented. Missing of cap D3DPMISCCAPS_INDEPENDENTWRITEMASKS wasn't honored?\n",
- stateblock->renderState[WINED3DRS_COLORWRITEENABLE1],
- stateblock->renderState[WINED3DRS_COLORWRITEENABLE2],
- stateblock->renderState[WINED3DRS_COLORWRITEENABLE3]);
+ if (!((mask1 == mask0 && mask2 == mask0 && mask3 == mask0)
+ || (mask1 == 0xf && mask2 == 0xf && mask3 == 0xf)))
+ {
+ FIXME("WINED3DRS_COLORWRITEENABLE/1/2/3, %#x/%#x/%#x/%#x not yet implemented.\n",
+ mask0, mask1, mask2, mask3);
+ FIXME("Missing of cap D3DPMISCCAPS_INDEPENDENTWRITEMASKS wasn't honored?\n");
}
}
+static void set_color_mask(const struct wined3d_gl_info *gl_info, UINT index, DWORD mask)
+{
+ GL_EXTCALL(glColorMaskIndexedEXT(index,
+ mask & WINED3DCOLORWRITEENABLE_RED ? GL_TRUE : GL_FALSE,
+ mask & WINED3DCOLORWRITEENABLE_GREEN ? GL_TRUE : GL_FALSE,
+ mask & WINED3DCOLORWRITEENABLE_BLUE ? GL_TRUE : GL_FALSE,
+ mask & WINED3DCOLORWRITEENABLE_ALPHA ? GL_TRUE : GL_FALSE));
+}
+
+static void state_colorwrite0(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ set_color_mask(context->gl_info, 0, stateblock->renderState[WINED3DRS_COLORWRITEENABLE]);
+}
+
+static void state_colorwrite1(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ set_color_mask(context->gl_info, 1, stateblock->renderState[WINED3DRS_COLORWRITEENABLE1]);
+}
+
+static void state_colorwrite2(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ set_color_mask(context->gl_info, 2, stateblock->renderState[WINED3DRS_COLORWRITEENABLE2]);
+}
+
+static void state_colorwrite3(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ set_color_mask(context->gl_info, 3, stateblock->renderState[WINED3DRS_COLORWRITEENABLE3]);
+}
+
static void state_localviewer(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
if(stateblock->renderState[WINED3DRS_LOCALVIEWER]) {
@@ -1706,6 +1729,12 @@ static void state_depthbias(DWORD state, IWineD3DStateBlockImpl *stateblock, str
}
}
+static void state_zvisible(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ if (stateblock->renderState[WINED3DRS_ZVISIBLE])
+ FIXME("WINED3DRS_ZVISIBLE not implemented.\n");
+}
+
static void state_perspective(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
if (stateblock->renderState[WINED3DRS_TEXTUREPERSPECTIVE]) {
@@ -1843,13 +1872,6 @@ static void state_stippleenable(DWORD state, IWineD3DStateBlockImpl *stateblock,
}
}
-static void state_bordercolor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
-{
- if(stateblock->renderState[WINED3DRS_BORDERCOLOR]) {
- FIXME("Render state WINED3DRS_BORDERCOLOR not implemented yet\n");
- }
-}
-
static void state_mipmaplodbias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
if(stateblock->renderState[WINED3DRS_MIPMAPLODBIAS]) {
@@ -3083,9 +3105,8 @@ void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d
if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB)
{
- IWineD3DSurfaceImpl *surf;
-
- surf = (IWineD3DSurfaceImpl *) ((IWineD3DTextureImpl *) stateblock->textures[0])->surfaces[0];
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)stateblock->textures[0];
+ IWineD3DSurfaceImpl *surf = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[0];
if (surf->CKeyFlags & WINEDDSD_CKSRCBLT && !surf->resource.format_desc->alpha_mask)
{
@@ -3157,6 +3178,7 @@ static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, s
{
DWORD texUnit = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
DWORD mapped_stage = stateblock->device->texUnitMap[texUnit];
+ const struct wined3d_gl_info *gl_info = context->gl_info;
BOOL generated;
int coordIdx;
@@ -3168,7 +3190,7 @@ static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, s
}
if (mapped_stage == WINED3D_UNMAPPED_STAGE) return;
- if (mapped_stage >= context->gl_info->limits.textures) return;
+ if (mapped_stage >= gl_info->limits.textures) return;
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
checkGLcall("glActiveTextureARB");
@@ -3197,21 +3219,20 @@ static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, s
}
}
-static void unloadTexCoords(const struct wined3d_context *context)
+static void unloadTexCoords(const struct wined3d_gl_info *gl_info)
{
unsigned int texture_idx;
- for (texture_idx = 0; texture_idx < context->gl_info->limits.texture_stages; ++texture_idx)
+ for (texture_idx = 0; texture_idx < gl_info->limits.texture_stages; ++texture_idx)
{
GL_EXTCALL(glClientActiveTextureARB(GL_TEXTURE0_ARB + texture_idx));
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
}
-static void loadTexCoords(const struct wined3d_context *context, IWineD3DStateBlockImpl *stateblock,
+static void loadTexCoords(const struct wined3d_gl_info *gl_info, IWineD3DStateBlockImpl *stateblock,
const struct wined3d_stream_info *si, GLuint *curVBO)
{
- const struct wined3d_gl_info *gl_info = context->gl_info;
const UINT *offset = stateblock->streamOffset;
unsigned int mapped_stage = 0;
unsigned int textureNo = 0;
@@ -3431,8 +3452,8 @@ static void tex_coordindex(DWORD state, IWineD3DStateBlockImpl *stateblock, stru
*/
GLuint curVBO = gl_info->supported[ARB_VERTEX_BUFFER_OBJECT] ? ~0U : 0;
- unloadTexCoords(context);
- loadTexCoords(context, stateblock, &stateblock->device->strided_streams, &curVBO);
+ unloadTexCoords(gl_info);
+ loadTexCoords(gl_info, stateblock, &stateblock->device->strided_streams, &curVBO);
}
}
@@ -3603,10 +3624,8 @@ void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, struct w
* 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);
- }
+ if (!isStateDirty(context, STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP)))
+ stateblock_apply_state(STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP), stateblock, context);
}
context->last_was_pshader = FALSE;
}
@@ -3750,27 +3769,20 @@ static void transform_worldex(DWORD state, IWineD3DStateBlockImpl *stateblock, s
static void state_vertexblend_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- static BOOL once = FALSE;
+ WINED3DVERTEXBLENDFLAGS f = stateblock->renderState[WINED3DRS_VERTEXBLEND];
+ static unsigned int once;
- switch(stateblock->renderState[WINED3DRS_VERTEXBLEND]) {
- case WINED3DVBF_1WEIGHTS:
- case WINED3DVBF_2WEIGHTS:
- case WINED3DVBF_3WEIGHTS:
- if(!once) {
- once = TRUE;
- /* TODO: Implement vertex blending in drawStridedSlow */
- FIXME("Vertex blending enabled, but not supported by hardware\n");
- }
- break;
+ if (f == WINED3DVBF_DISABLE) return;
- case WINED3DVBF_TWEENING:
- WARN("Tweening not supported yet\n");
- }
+ if (!once++) FIXME("Vertex blend flags %#x not supported.\n", f);
+ else WARN("Vertex blend flags %#x not supported.\n", f);
}
static void state_vertexblend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
WINED3DVERTEXBLENDFLAGS val = stateblock->renderState[WINED3DRS_VERTEXBLEND];
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ static unsigned int once;
switch(val) {
case WINED3DVBF_1WEIGHTS:
@@ -3787,7 +3799,7 @@ static void state_vertexblend(DWORD state, IWineD3DStateBlockImpl *stateblock, s
if (!stateblock->device->vertexBlendUsed)
{
unsigned int i;
- for (i = 1; i < context->gl_info->limits.blends; ++i)
+ for (i = 1; i < gl_info->limits.blends; ++i)
{
if (!isStateDirty(context, STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(i))))
{
@@ -3798,19 +3810,15 @@ static void state_vertexblend(DWORD state, IWineD3DStateBlockImpl *stateblock, s
}
break;
+ case WINED3DVBF_TWEENING:
+ case WINED3DVBF_0WEIGHTS: /* Indexed vertex blending, not supported. */
+ if (!once++) FIXME("Vertex blend flags %#x not supported.\n", val);
+ else WARN("Vertex blend flags %#x not supported.\n", val);
+ /* Fall through. */
case WINED3DVBF_DISABLE:
- case WINED3DVBF_0WEIGHTS: /* for Indexed vertex blending - not supported */
glDisable(GL_VERTEX_BLEND_ARB);
checkGLcall("glDisable(GL_VERTEX_BLEND_ARB)");
break;
-
- case WINED3DVBF_TWEENING:
- /* Just set the vertex weight for weight 0, enable vertex blending and hope the app doesn't have
- * vertex weights in the vertices?
- * For now we don't report that as supported, so a warn should suffice
- */
- WARN("Tweening not supported yet\n");
- break;
}
}
@@ -3975,10 +3983,8 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock
/* This should match any arrays loaded in loadVertexData.
* TODO: Only load / unload arrays if we have to.
*/
-static inline void unloadVertexData(const struct wined3d_context *context)
+static inline void unloadVertexData(const struct wined3d_gl_info *gl_info)
{
- const struct wined3d_gl_info *gl_info = context->gl_info;
-
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
@@ -3990,11 +3996,13 @@ static inline void unloadVertexData(const struct wined3d_context *context)
{
glDisableClientState(GL_WEIGHT_ARRAY_ARB);
}
- unloadTexCoords(context);
+ unloadTexCoords(gl_info);
}
-static inline void unload_numbered_array(IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context, int i)
+static inline void unload_numbered_array(struct wined3d_context *context, int i)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
GL_EXTCALL(glDisableVertexAttribArrayARB(i));
checkGLcall("glDisableVertexAttribArrayARB(reg)");
@@ -4004,7 +4012,7 @@ static inline void unload_numbered_array(IWineD3DStateBlockImpl *stateblock, str
/* This should match any arrays loaded in loadNumberedArrays
* TODO: Only load / unload arrays if we have to.
*/
-static inline void unloadNumberedArrays(IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+static inline void unloadNumberedArrays(struct wined3d_context *context)
{
/* disable any attribs (this is the same for both GLSL and ARB modes) */
GLint maxAttribs = 16;
@@ -4016,7 +4024,7 @@ static inline void unloadNumberedArrays(IWineD3DStateBlockImpl *stateblock, stru
if (glGetError() != GL_NO_ERROR)
maxAttribs = 16;
for (i = 0; i < maxAttribs; ++i) {
- unload_numbered_array(stateblock, context, i);
+ unload_numbered_array(context, i);
}
}
@@ -4036,14 +4044,14 @@ static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock,
for (i = 0; i < MAX_ATTRIBS; i++) {
if (!(stream_info->use_map & (1 << i)))
{
- if (context->numbered_array_mask & (1 << i)) unload_numbered_array(stateblock, context, i);
+ if (context->numbered_array_mask & (1 << i)) unload_numbered_array(context, i);
continue;
}
/* Do not load instance data. It will be specified using glTexCoord by drawprim */
if (stateblock->streamFlags[stream_info->elements[i].stream_idx] & WINED3DSTREAMSOURCE_INSTANCEDATA)
{
- if (context->numbered_array_mask & (1 << i)) unload_numbered_array(stateblock, context, i);
+ if (context->numbered_array_mask & (1 << i)) unload_numbered_array(context, i);
stateblock->device->instancedDraw = TRUE;
continue;
}
@@ -4102,10 +4110,10 @@ static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock,
if (stream_info->elements[i].buffer_object)
{
vb = (struct wined3d_buffer *)stateblock->streamSource[stream_info->elements[i].stream_idx];
- ptr += (long) buffer_get_sysmem(vb);
+ ptr += (ULONG_PTR)buffer_get_sysmem(vb, gl_info);
}
- if (context->numbered_array_mask & (1 << i)) unload_numbered_array(stateblock, context, i);
+ if (context->numbered_array_mask & (1 << i)) unload_numbered_array(context, i);
switch (stream_info->elements[i].format_desc->format)
{
@@ -4225,11 +4233,6 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
GL_EXTCALL(glVertexBlendARB(e->format_desc->component_count + 1));
- VTRACE(("glWeightPointerARB(%d, GL_FLOAT, %d, %p)\n",
- WINED3D_ATR_FORMAT(sd->u.s.blendWeights.dwType) ,
- sd->u.s.blendWeights.dwStride,
- sd->u.s.blendWeights.lpData + stateblock->loadBaseVertexIndex * sd->u.s.blendWeights.dwStride + offset[sd->u.s.blendWeights.streamNo]));
-
if (curVBO != e->buffer_object)
{
GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, e->buffer_object));
@@ -4237,8 +4240,13 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
curVBO = e->buffer_object;
}
- GL_EXTCALL(glWeightPointerARB)(e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride,
- e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ TRACE("glWeightPointerARB(%#x, %#x, %#x, %p);\n",
+ e->format_desc->gl_vtx_format,
+ e->format_desc->gl_vtx_type,
+ e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ GL_EXTCALL(glWeightPointerARB(e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]));
checkGLcall("glWeightPointerARB");
@@ -4279,8 +4287,6 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
/* Vertex Pointers -----------------------------------------*/
if (si->use_map & (1 << WINED3D_FFP_POSITION))
{
- VTRACE(("glVertexPointer(%d, GL_FLOAT, %d, %p)\n", e->stride, e->size, e->data));
-
e = &si->elements[WINED3D_FFP_POSITION];
if (curVBO != e->buffer_object)
{
@@ -4299,9 +4305,16 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
*/
if (!e->buffer_object)
{
+ TRACE("glVertexPointer(3, %#x, %#x, %p);\n", e->format_desc->gl_vtx_type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
glVertexPointer(3 /* min(e->format_desc->gl_vtx_format, 3) */, e->format_desc->gl_vtx_type, e->stride,
e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
- } else {
+ }
+ else
+ {
+ TRACE("glVertexPointer(%#x, %#x, %#x, %p);\n",
+ e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
glVertexPointer(e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride,
e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
}
@@ -4313,8 +4326,6 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
/* Normals -------------------------------------------------*/
if (si->use_map & (1 << WINED3D_FFP_NORMAL))
{
- VTRACE(("glNormalPointer(GL_FLOAT, %d, %p)\n", e->stride, e->data));
-
e = &si->elements[WINED3D_FFP_NORMAL];
if (curVBO != e->buffer_object)
{
@@ -4322,6 +4333,9 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
checkGLcall("glBindBufferARB");
curVBO = e->buffer_object;
}
+
+ TRACE("glNormalPointer(%#x, %#x, %p);\n", e->format_desc->gl_vtx_type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
glNormalPointer(e->format_desc->gl_vtx_type, e->stride,
e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
checkGLcall("glNormalPointer(...)");
@@ -4344,8 +4358,6 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
if (si->use_map & (1 << WINED3D_FFP_DIFFUSE))
{
- VTRACE(("glColorPointer(4, GL_UNSIGNED_BYTE, %d, %p)\n", e->stride, e->data));
-
e = &si->elements[WINED3D_FFP_DIFFUSE];
if (curVBO != e->buffer_object)
{
@@ -4354,6 +4366,9 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
curVBO = e->buffer_object;
}
+ TRACE("glColorPointer(%#x, %#x %#x, %p);\n",
+ e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
glColorPointer(e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride,
e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
checkGLcall("glColorPointer(4, GL_UNSIGNED_BYTE, ...)");
@@ -4369,7 +4384,6 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
if (si->use_map & (1 << WINED3D_FFP_SPECULAR))
{
TRACE("setting specular colour\n");
- VTRACE(("glSecondaryColorPointer(4, GL_UNSIGNED_BYTE, %d, %p)\n", e->stride, e->data));
e = &si->elements[WINED3D_FFP_SPECULAR];
if (gl_info->supported[EXT_SECONDARY_COLOR])
@@ -4391,8 +4405,10 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
* vertex pipeline can pass the specular alpha through, and pixel shaders can read it. So it GL accepts
* 4 component secondary colors use it
*/
- GL_EXTCALL(glSecondaryColorPointerEXT)(format, type,
- e->stride, e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ TRACE("glSecondaryColorPointer(%#x, %#x, %#x, %p);\n", format, type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ GL_EXTCALL(glSecondaryColorPointerEXT(format, type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]));
checkGLcall("glSecondaryColorPointerEXT(format, type, ...)");
}
else
@@ -4400,25 +4416,29 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
switch(type)
{
case GL_UNSIGNED_BYTE:
- GL_EXTCALL(glSecondaryColorPointerEXT)(3, GL_UNSIGNED_BYTE,
- e->stride, e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ TRACE("glSecondaryColorPointer(3, GL_UNSIGNED_BYTE, %#x, %p);\n", e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ GL_EXTCALL(glSecondaryColorPointerEXT(3, GL_UNSIGNED_BYTE, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]));
checkGLcall("glSecondaryColorPointerEXT(3, GL_UNSIGNED_BYTE, ...)");
break;
default:
FIXME("Add 4 component specular color pointers for type %x\n", type);
/* Make sure that the right color component is dropped */
- GL_EXTCALL(glSecondaryColorPointerEXT)(3, type,
- e->stride, e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ TRACE("glSecondaryColorPointer(3, %#x, %#x, %p);\n", type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ GL_EXTCALL(glSecondaryColorPointerEXT(3, type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]));
checkGLcall("glSecondaryColorPointerEXT(3, type, ...)");
}
}
glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT);
checkGLcall("glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT)");
- } else {
-
- /* Missing specular color is not critical, no warnings */
- VTRACE(("Specular colour is not supported in this GL implementation\n"));
+ }
+ else
+ {
+ WARN("Specular colour is not supported in this GL implementation.\n");
}
}
else
@@ -4427,15 +4447,15 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
{
GL_EXTCALL(glSecondaryColor3fEXT)(0, 0, 0);
checkGLcall("glSecondaryColor3fEXT(0, 0, 0)");
- } else {
-
- /* Missing specular color is not critical, no warnings */
- VTRACE(("Specular colour is not supported in this GL implementation\n"));
+ }
+ else
+ {
+ WARN("Specular colour is not supported in this GL implementation.\n");
}
}
/* Texture coords -------------------------------------------*/
- loadTexCoords(context, stateblock, si, &curVBO);
+ loadTexCoords(gl_info, stateblock, si, &curVBO);
}
static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
@@ -4446,13 +4466,13 @@ static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wi
if (context->numberedArraysLoaded && !load_numbered)
{
- unloadNumberedArrays(stateblock, context);
+ unloadNumberedArrays(context);
context->numberedArraysLoaded = FALSE;
context->numbered_array_mask = 0;
}
else if (context->namedArraysLoaded)
{
- unloadVertexData(context);
+ unloadVertexData(context->gl_info);
context->namedArraysLoaded = FALSE;
}
@@ -4618,9 +4638,8 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, s
context->last_was_vshader = useVertexShaderFunction;
- if(updateFog) {
- device->StateTable[STATE_RENDER(WINED3DRS_FOGVERTEXMODE)].apply(STATE_RENDER(WINED3DRS_FOGVERTEXMODE), stateblock, context);
- }
+ if (updateFog) stateblock_apply_state(STATE_RENDER(WINED3DRS_FOGVERTEXMODE), stateblock, context);
+
if(!useVertexShaderFunction) {
int i;
for(i = 0; i < MAX_TEXTURES; i++) {
@@ -4633,7 +4652,7 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, s
static void viewport_miscpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- IWineD3DSurfaceImpl *target = (IWineD3DSurfaceImpl *)stateblock->device->render_targets[0];
+ IWineD3DSurfaceImpl *target = stateblock->device->render_targets[0];
UINT width, height;
WINED3DVIEWPORT vp = stateblock->viewport;
@@ -4671,6 +4690,8 @@ static void viewport_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock,
if(!isStateDirty(context, STATE_RENDER(WINED3DRS_POINTSCALEENABLE))) {
state_pscale(STATE_RENDER(WINED3DRS_POINTSCALEENABLE), stateblock, context);
}
+ if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT))
+ shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock, context);
}
static void light(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
@@ -4789,7 +4810,7 @@ static void light(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3
static void scissorrect(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- IWineD3DSurfaceImpl *target = (IWineD3DSurfaceImpl *)stateblock->device->render_targets[0];
+ IWineD3DSurfaceImpl *target = stateblock->device->render_targets[0];
RECT *pRect = &stateblock->scissorRect;
UINT height;
UINT width;
@@ -4812,6 +4833,8 @@ static void scissorrect(DWORD state, IWineD3DStateBlockImpl *stateblock, struct
static void indexbuffer(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
if(stateblock->streamIsUP || stateblock->pIndexData == NULL ) {
GL_EXTCALL(glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0));
} else {
@@ -4833,17 +4856,17 @@ static void frontface(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wi
}
const struct StateEntryTemplate misc_state_template[] = {
- { STATE_RENDER(WINED3DRS_SRCBLEND), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_DESTBLEND), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SRCBLEND), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_DESTBLEND), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_EDGEANTIALIAS), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_ANTIALIASEDLINEENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_SEPARATEALPHABLENDENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_SRCBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_BLENDOPALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_STREAMSRC, { STATE_VDECL, streamsrc }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_EDGEANTIALIAS), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ANTIALIASEDLINEENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SEPARATEALPHABLENDENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SRCBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_BLENDOPALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_STREAMSRC, { STATE_VDECL, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_VDECL, { STATE_VDECL, streamsrc }, WINED3D_GL_EXT_NONE },
{ STATE_FRONTFACE, { STATE_FRONTFACE, frontface }, WINED3D_GL_EXT_NONE },
{ STATE_SCISSORRECT, { STATE_SCISSORRECT, scissorrect }, WINED3D_GL_EXT_NONE },
@@ -4851,58 +4874,59 @@ const struct StateEntryTemplate misc_state_template[] = {
* vshader loadings are untied from each other
*/
{ STATE_VERTEXSHADERCONSTANT, { STATE_VERTEXSHADERCONSTANT, shaderconstant }, WINED3D_GL_EXT_NONE },
- { STATE_PIXELSHADERCONSTANT, { STATE_VERTEXSHADERCONSTANT, shaderconstant }, WINED3D_GL_EXT_NONE },
+ { STATE_PIXELSHADERCONSTANT, { STATE_VERTEXSHADERCONSTANT, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_VIEWPORT, { STATE_VIEWPORT, viewport_miscpart }, WINED3D_GL_EXT_NONE },
{ STATE_INDEXBUFFER, { STATE_INDEXBUFFER, indexbuffer }, ARB_VERTEX_BUFFER_OBJECT },
+ { STATE_INDEXBUFFER, { STATE_INDEXBUFFER, state_nop }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_ANTIALIAS), { STATE_RENDER(WINED3DRS_ANTIALIAS), state_antialias }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_TEXTUREPERSPECTIVE), { STATE_RENDER(WINED3DRS_TEXTUREPERSPECTIVE), state_perspective }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_ZENABLE), { STATE_RENDER(WINED3DRS_ZENABLE), state_zenable }, WINED3D_GL_EXT_NONE },
@@ -4916,9 +4940,9 @@ const struct StateEntryTemplate misc_state_template[] = {
{ STATE_RENDER(WINED3DRS_PLANEMASK), { STATE_RENDER(WINED3DRS_PLANEMASK), state_planemask }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_ZWRITEENABLE), { STATE_RENDER(WINED3DRS_ZWRITEENABLE), state_zwritenable }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_ALPHATESTENABLE), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_ALPHAREF), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_ALPHAFUNC), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_COLORKEYENABLE), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ALPHAREF), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ALPHAFUNC), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_COLORKEYENABLE), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_LASTPIXEL), { STATE_RENDER(WINED3DRS_LASTPIXEL), state_lastpixel }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_CULLMODE), { STATE_RENDER(WINED3DRS_CULLMODE), state_cullmode }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_ZFUNC), { STATE_RENDER(WINED3DRS_ZFUNC), state_zfunc }, WINED3D_GL_EXT_NONE },
@@ -4933,35 +4957,35 @@ const struct StateEntryTemplate misc_state_template[] = {
{ STATE_RENDER(WINED3DRS_FLUSHBATCH), { STATE_RENDER(WINED3DRS_FLUSHBATCH), state_flushbatch }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_TRANSLUCENTSORTINDEPENDENT), { STATE_RENDER(WINED3DRS_TRANSLUCENTSORTINDEPENDENT), state_translucentsi }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_STENCILENABLE), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_STENCILFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_STENCILZFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_STENCILPASS), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_STENCILFUNC), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_STENCILREF), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_STENCILMASK), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILZFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILPASS), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILFUNC), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILREF), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILMASK), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_STENCILWRITEMASK), { STATE_RENDER(WINED3DRS_STENCILWRITEMASK), state_stencilwrite2s}, EXT_STENCIL_TWO_SIDE },
{ STATE_RENDER(WINED3DRS_STENCILWRITEMASK), { STATE_RENDER(WINED3DRS_STENCILWRITEMASK), state_stencilwrite }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_TWOSIDEDSTENCILMODE), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_CCW_STENCILFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_CCW_STENCILZFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_CCW_STENCILPASS), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_CCW_STENCILFUNC), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_TWOSIDEDSTENCILMODE), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_CCW_STENCILFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_CCW_STENCILZFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_CCW_STENCILPASS), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_CCW_STENCILFUNC), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_WRAP0), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP1), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP2), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP3), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP4), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP5), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP6), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP7), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP8), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP9), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP10), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP11), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP12), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP13), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP14), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP15), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP1), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP2), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP3), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP4), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP5), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP6), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP7), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP8), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP9), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP10), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP11), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP12), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP13), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP14), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP15), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_EXTENTS), { STATE_RENDER(WINED3DRS_EXTENTS), state_extents }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_COLORKEYBLENDENABLE), { STATE_RENDER(WINED3DRS_COLORKEYBLENDENABLE), state_ckeyblend }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_SOFTWAREVERTEXPROCESSING), { STATE_RENDER(WINED3DRS_SOFTWAREVERTEXPROCESSING), state_swvp }, WINED3D_GL_EXT_NONE },
@@ -4969,28 +4993,33 @@ const struct StateEntryTemplate misc_state_template[] = {
{ STATE_RENDER(WINED3DRS_PATCHSEGMENTS), { STATE_RENDER(WINED3DRS_PATCHSEGMENTS), state_patchsegments }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_POSITIONDEGREE), { STATE_RENDER(WINED3DRS_POSITIONDEGREE), state_positiondegree}, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_NORMALDEGREE), { STATE_RENDER(WINED3DRS_NORMALDEGREE), state_normaldegree }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_MINTESSELLATIONLEVEL), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_MAXTESSELLATIONLEVEL), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_ADAPTIVETESS_X), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Y), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Z), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_ADAPTIVETESS_W), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_MINTESSELLATIONLEVEL), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_MAXTESSELLATIONLEVEL), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ADAPTIVETESS_X), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Y), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Z), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ADAPTIVETESS_W), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), { STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), state_msaa }, ARB_MULTISAMPLE },
{ STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), { STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), state_msaa_w }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_MULTISAMPLEMASK), { STATE_RENDER(WINED3DRS_MULTISAMPLEMASK), state_multisampmask }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_DEBUGMONITORTOKEN), { STATE_RENDER(WINED3DRS_DEBUGMONITORTOKEN), state_debug_monitor }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite0 }, EXT_DRAW_BUFFERS2 },
{ STATE_RENDER(WINED3DRS_COLORWRITEENABLE), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_BLENDOP), { STATE_RENDER(WINED3DRS_BLENDOP), state_blendop }, EXT_BLEND_MINMAX },
{ STATE_RENDER(WINED3DRS_BLENDOP), { STATE_RENDER(WINED3DRS_BLENDOP), state_blendop_w }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), { STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), state_scissor }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_SLOPESCALEDEPTHBIAS), { STATE_RENDER(WINED3DRS_DEPTHBIAS), state_depthbias }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_COLORWRITEENABLE1), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_COLORWRITEENABLE2), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_COLORWRITEENABLE3), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SLOPESCALEDEPTHBIAS), { STATE_RENDER(WINED3DRS_DEPTHBIAS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE1), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE1), state_colorwrite1 }, EXT_DRAW_BUFFERS2 },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE1), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE2), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE2), state_colorwrite2 }, EXT_DRAW_BUFFERS2 },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE2), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE3), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE3), state_colorwrite3 }, EXT_DRAW_BUFFERS2 },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE3), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_BLENDFACTOR), { STATE_RENDER(WINED3DRS_BLENDFACTOR), state_blendfactor }, EXT_BLEND_COLOR },
{ STATE_RENDER(WINED3DRS_BLENDFACTOR), { STATE_RENDER(WINED3DRS_BLENDFACTOR), state_blendfactor_w }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_DEPTHBIAS), { STATE_RENDER(WINED3DRS_DEPTHBIAS), state_depthbias }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ZVISIBLE), { STATE_RENDER(WINED3DRS_ZVISIBLE), state_zvisible }, WINED3D_GL_EXT_NONE },
/* Samplers */
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler }, WINED3D_GL_EXT_NONE },
@@ -5017,8 +5046,8 @@ const struct StateEntryTemplate misc_state_template[] = {
const struct StateEntryTemplate ffp_vertexstate_template[] = {
{ STATE_VDECL, { STATE_VDECL, vertexdeclaration }, WINED3D_GL_EXT_NONE },
- { STATE_VSHADER, { STATE_VDECL, vertexdeclaration }, WINED3D_GL_EXT_NONE },
- { STATE_MATERIAL, { STATE_RENDER(WINED3DRS_SPECULARENABLE), state_specularenable}, WINED3D_GL_EXT_NONE },
+ { STATE_VSHADER, { STATE_VDECL, NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_MATERIAL, { STATE_RENDER(WINED3DRS_SPECULARENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_SPECULARENABLE), { STATE_RENDER(WINED3DRS_SPECULARENABLE), state_specularenable}, WINED3D_GL_EXT_NONE },
/* Clip planes */
{ STATE_CLIPPLANE(0), { STATE_CLIPPLANE(0), clipplane }, WINED3D_GL_EXT_NONE },
@@ -5067,14 +5096,14 @@ const struct StateEntryTemplate ffp_vertexstate_template[] = {
/* Transform states follow */
{ STATE_TRANSFORM(WINED3DTS_VIEW), { STATE_TRANSFORM(WINED3DTS_VIEW), transform_view }, WINED3D_GL_EXT_NONE },
{ STATE_TRANSFORM(WINED3DTS_PROJECTION), { STATE_TRANSFORM(WINED3DTS_PROJECTION), transform_projection}, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE0), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE1), { STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE2), { STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE3), { STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE4), { STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE5), { STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE6), { STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE7), { STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE0), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE1), { STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE2), { STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE3), { STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE4), { STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE5), { STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE6), { STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE7), { STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 0)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 0)), transform_world }, WINED3D_GL_EXT_NONE },
{ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 1)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 1)), transform_worldex }, WINED3D_GL_EXT_NONE },
{ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 2)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 2)), transform_worldex }, WINED3D_GL_EXT_NONE },
@@ -5349,36 +5378,39 @@ const struct StateEntryTemplate ffp_vertexstate_template[] = {
{ STATE_TEXTURESTAGE(7, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(7, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, WINED3D_GL_EXT_NONE },
/* Fog */
{ STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_vertexpart}, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_vertexpart}, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_vertexpart}, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_RANGEFOGENABLE), { STATE_RENDER(WINED3DRS_RANGEFOGENABLE), state_rangefog }, NV_FOG_DISTANCE },
{ STATE_RENDER(WINED3DRS_RANGEFOGENABLE), { STATE_RENDER(WINED3DRS_RANGEFOGENABLE), state_rangefog_w }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_CLIPPING), { STATE_RENDER(WINED3DRS_CLIPPING), state_clipping }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_CLIPPLANEENABLE), { STATE_RENDER(WINED3DRS_CLIPPING), state_clipping }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_CLIPPLANEENABLE), { STATE_RENDER(WINED3DRS_CLIPPING), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_LIGHTING), { STATE_RENDER(WINED3DRS_LIGHTING), state_lighting }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_AMBIENT), { STATE_RENDER(WINED3DRS_AMBIENT), state_ambient }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_COLORVERTEX), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_LOCALVIEWER), { STATE_RENDER(WINED3DRS_LOCALVIEWER), state_localviewer }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_NORMALIZENORMALS), { STATE_RENDER(WINED3DRS_NORMALIZENORMALS), state_normalize }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_DIFFUSEMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_SPECULARMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_AMBIENTMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_EMISSIVEMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_DIFFUSEMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SPECULARMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_AMBIENTMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_EMISSIVEMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_VERTEXBLEND), { STATE_RENDER(WINED3DRS_VERTEXBLEND), state_vertexblend }, ARB_VERTEX_BLEND },
{ STATE_RENDER(WINED3DRS_VERTEXBLEND), { STATE_RENDER(WINED3DRS_VERTEXBLEND), state_vertexblend_w }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_POINTSIZE), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_POINTSIZE), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_POINTSIZE_MIN), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_arb }, ARB_POINT_PARAMETERS },
{ STATE_RENDER(WINED3DRS_POINTSIZE_MIN), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_ext }, EXT_POINT_PARAMETERS },
{ STATE_RENDER(WINED3DRS_POINTSIZE_MIN), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_w }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_POINTSPRITEENABLE), { STATE_RENDER(WINED3DRS_POINTSPRITEENABLE), state_pointsprite }, ARB_POINT_SPRITE },
{ STATE_RENDER(WINED3DRS_POINTSPRITEENABLE), { STATE_RENDER(WINED3DRS_POINTSPRITEENABLE), state_pointsprite_w }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_POINTSCALEENABLE), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_POINTSCALE_A), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_POINTSCALE_B), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_POINTSCALE_C), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_arb }, ARB_POINT_PARAMETERS },
- { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_ext }, EXT_POINT_PARAMETERS },
- { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_w }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_POINTSCALE_A), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_POINTSCALE_B), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_POINTSCALE_C), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), NULL }, ARB_POINT_PARAMETERS },
+ { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), NULL }, EXT_POINT_PARAMETERS },
+ { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_TWEENFACTOR), { STATE_RENDER(WINED3DRS_VERTEXBLEND), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_INDEXEDVERTEXBLENDENABLE), { STATE_RENDER(WINED3DRS_VERTEXBLEND), NULL }, WINED3D_GL_EXT_NONE },
+
/* Samplers for NP2 texture matrix adjustions. They are not needed if GL_ARB_texture_non_power_of_two is supported,
* so register a NULL state handler in that case to get the vertex part of sampler() skipped(VTF is handled in the misc states.
* otherwise, register sampler_texmatrix, which takes care of updating the texture matrix
@@ -5412,96 +5444,95 @@ const struct StateEntryTemplate ffp_vertexstate_template[] = {
static const struct StateEntryTemplate ffp_fragmentstate_template[] = {
{ STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_PIXELSHADER, { STATE_PIXELSHADER, apply_pixelshader }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, apply_pixelshader }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_BORDERCOLOR), { STATE_RENDER(WINED3DRS_BORDERCOLOR), state_bordercolor }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGDENSITY), { STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texdim }, WINED3D_GL_EXT_NONE },
@@ -5512,13 +5543,13 @@ static const struct StateEntryTemplate ffp_fragmentstate_template[] = {
{ STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texdim }, WINED3D_GL_EXT_NONE },
{0 /* Terminate */, { 0, 0 }, WINED3D_GL_EXT_NONE },
};
-#undef GLINFO_LOCATION
/* Context activation is done by the caller. */
static void ffp_enable(IWineD3DDevice *iface, BOOL enable) { }
static void ffp_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
{
+ pCaps->PrimitiveMiscCaps = 0;
pCaps->TextureOpCaps = WINED3DTEXOPCAPS_ADD |
WINED3DTEXOPCAPS_ADDSIGNED |
WINED3DTEXOPCAPS_ADDSIGNED2X |
@@ -5626,20 +5657,94 @@ static void prune_invalid_states(struct StateEntry *state_table, const struct wi
state_table[i].representative = 0;
state_table[i].apply = state_undefined;
}
+
+ start = STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(gl_info->limits.blends));
+ last = STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255));
+ for (i = start; i <= last; ++i)
+ {
+ state_table[i].representative = 0;
+ state_table[i].apply = state_undefined;
+ }
}
static void validate_state_table(struct StateEntry *state_table)
{
- unsigned int i;
+ static const struct
+ {
+ DWORD first;
+ DWORD last;
+ }
+ rs_holes[] =
+ {
+ { 1, 1},
+ { 3, 3},
+ { 17, 18},
+ { 21, 21},
+ { 42, 45},
+ { 61, 127},
+ {149, 150},
+ {169, 169},
+ {177, 177},
+ {196, 197},
+ { 0, 0},
+ };
+ static const DWORD simple_states[] =
+ {
+ STATE_MATERIAL,
+ STATE_VDECL,
+ STATE_STREAMSRC,
+ STATE_INDEXBUFFER,
+ STATE_VERTEXSHADERCONSTANT,
+ STATE_PIXELSHADERCONSTANT,
+ STATE_VSHADER,
+ STATE_PIXELSHADER,
+ STATE_VIEWPORT,
+ STATE_SCISSORRECT,
+ STATE_FRONTFACE,
+ };
+ unsigned int i, current;
+
+ for (i = STATE_RENDER(1), current = 0; i <= STATE_RENDER(WINEHIGHEST_RENDER_STATE); ++i)
+ {
+ if (!rs_holes[current].first || i < STATE_RENDER(rs_holes[current].first))
+ {
+ if (!state_table[i].representative)
+ ERR("State %s (%#x) should have a representative.\n", debug_d3dstate(i), i);
+ }
+ else if (state_table[i].representative)
+ ERR("State %s (%#x) shouldn't have a representative.\n", debug_d3dstate(i), i);
+
+ if (i == STATE_RENDER(rs_holes[current].last)) ++current;
+ }
+
+ for (i = 0; i < sizeof(simple_states) / sizeof(*simple_states); ++i)
+ {
+ if (!state_table[simple_states[i]].representative)
+ ERR("State %s (%#x) should have a representative.\n",
+ debug_d3dstate(simple_states[i]), simple_states[i]);
+ }
for (i = 0; i < STATE_HIGHEST + 1; ++i)
{
DWORD rep = state_table[i].representative;
- if (rep && !state_table[rep].representative)
+ if (rep)
{
- ERR("State %s (%#x) has invalid representative %s (%#x).\n",
- debug_d3dstate(i), i, debug_d3dstate(rep), rep);
- state_table[i].representative = 0;
+ if (state_table[rep].representative != rep)
+ {
+ ERR("State %s (%#x) has invalid representative %s (%#x).\n",
+ debug_d3dstate(i), i, debug_d3dstate(rep), rep);
+ state_table[i].representative = 0;
+ }
+
+ if (rep != i)
+ {
+ if (state_table[i].apply)
+ ERR("State %s (%#x) has both a handler and representative.\n", debug_d3dstate(i), i);
+ }
+ else if (!state_table[i].apply)
+ {
+ ERR("Self representing state %s (%#x) has no handler.\n", debug_d3dstate(i), i);
+ }
}
}
}
@@ -5696,7 +5801,7 @@ HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_
* applying later lines, but do not record anything in the state
* table
*/
- if(!cur[i].content.apply) continue;
+ if (!cur[i].content.representative) continue;
handlers = num_handlers(multistate_funcs[cur[i].state]);
multistate_funcs[cur[i].state][handlers] = cur[i].content.apply;
diff --git a/dll/directx/wine/wined3d/stateblock.c b/dll/directx/wine/wined3d/stateblock.c
index 48f9eacc453..1696646849e 100644
--- a/dll/directx/wine/wined3d/stateblock.c
+++ b/dll/directx/wine/wined3d/stateblock.c
@@ -757,7 +757,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface)
{
TRACE("Updating scissor rect.\n");
- targetStateBlock->scissorRect = This->scissorRect;
+ This->scissorRect = targetStateBlock->scissorRect;
}
map = This->changed.streamSource;
@@ -866,7 +866,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface)
return WINED3D_OK;
}
-static void apply_lights(IWineD3DDevice *pDevice, const IWineD3DStateBlockImpl *This)
+static void apply_lights(IWineD3DDevice *device, const IWineD3DStateBlockImpl *This)
{
UINT i;
for(i = 0; i < LIGHTMAP_SIZE; i++) {
@@ -876,8 +876,8 @@ static void apply_lights(IWineD3DDevice *pDevice, const IWineD3DStateBlockImpl *
{
const struct wined3d_light_info *light = LIST_ENTRY(e, struct wined3d_light_info, entry);
- IWineD3DDevice_SetLight(pDevice, light->OriginalIndex, &light->OriginalParms);
- IWineD3DDevice_SetLightEnable(pDevice, light->OriginalIndex, light->glIndex != -1);
+ IWineD3DDevice_SetLight(device, light->OriginalIndex, &light->OriginalParms);
+ IWineD3DDevice_SetLightEnable(device, light->OriginalIndex, light->glIndex != -1);
}
}
}
@@ -885,58 +885,58 @@ static void apply_lights(IWineD3DDevice *pDevice, const IWineD3DStateBlockImpl *
static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
{
IWineD3DStateBlockImpl *This = (IWineD3DStateBlockImpl *)iface;
- IWineD3DDevice *pDevice = (IWineD3DDevice *)This->device;
+ IWineD3DDevice *device = (IWineD3DDevice *)This->device;
unsigned int i;
DWORD map;
- TRACE("(%p) : Applying state block %p ------------------v\n", This, pDevice);
+ TRACE("(%p) : Applying state block %p ------------------v\n", This, device);
TRACE("Blocktype: %d\n", This->blockType);
- if (This->changed.vertexShader) IWineD3DDevice_SetVertexShader(pDevice, This->vertexShader);
+ if (This->changed.vertexShader) IWineD3DDevice_SetVertexShader(device, This->vertexShader);
/* Vertex Shader Constants */
for (i = 0; i < This->num_contained_vs_consts_f; ++i)
{
- IWineD3DDevice_SetVertexShaderConstantF(pDevice, This->contained_vs_consts_f[i],
+ IWineD3DDevice_SetVertexShaderConstantF(device, This->contained_vs_consts_f[i],
This->vertexShaderConstantF + This->contained_vs_consts_f[i] * 4, 1);
}
for (i = 0; i < This->num_contained_vs_consts_i; ++i)
{
- IWineD3DDevice_SetVertexShaderConstantI(pDevice, This->contained_vs_consts_i[i],
+ IWineD3DDevice_SetVertexShaderConstantI(device, This->contained_vs_consts_i[i],
This->vertexShaderConstantI + This->contained_vs_consts_i[i] * 4, 1);
}
for (i = 0; i < This->num_contained_vs_consts_b; ++i)
{
- IWineD3DDevice_SetVertexShaderConstantB(pDevice, This->contained_vs_consts_b[i],
+ IWineD3DDevice_SetVertexShaderConstantB(device, This->contained_vs_consts_b[i],
This->vertexShaderConstantB + This->contained_vs_consts_b[i], 1);
}
- apply_lights(pDevice, This);
+ apply_lights(device, This);
- if (This->changed.pixelShader) IWineD3DDevice_SetPixelShader(pDevice, This->pixelShader);
+ if (This->changed.pixelShader) IWineD3DDevice_SetPixelShader(device, This->pixelShader);
/* Pixel Shader Constants */
for (i = 0; i < This->num_contained_ps_consts_f; ++i)
{
- IWineD3DDevice_SetPixelShaderConstantF(pDevice, This->contained_ps_consts_f[i],
+ IWineD3DDevice_SetPixelShaderConstantF(device, This->contained_ps_consts_f[i],
This->pixelShaderConstantF + This->contained_ps_consts_f[i] * 4, 1);
}
for (i = 0; i < This->num_contained_ps_consts_i; ++i)
{
- IWineD3DDevice_SetPixelShaderConstantI(pDevice, This->contained_ps_consts_i[i],
+ IWineD3DDevice_SetPixelShaderConstantI(device, This->contained_ps_consts_i[i],
This->pixelShaderConstantI + This->contained_ps_consts_i[i] * 4, 1);
}
for (i = 0; i < This->num_contained_ps_consts_b; ++i)
{
- IWineD3DDevice_SetPixelShaderConstantB(pDevice, This->contained_ps_consts_b[i],
+ IWineD3DDevice_SetPixelShaderConstantB(device, This->contained_ps_consts_b[i],
This->pixelShaderConstantB + This->contained_ps_consts_b[i], 1);
}
/* Render */
for (i = 0; i < This->num_contained_render_states; ++i)
{
- IWineD3DDevice_SetRenderState(pDevice, This->contained_render_states[i],
+ IWineD3DDevice_SetRenderState(device, This->contained_render_states[i],
This->renderState[This->contained_render_states[i]]);
}
@@ -946,7 +946,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
DWORD stage = This->contained_tss_states[i].stage;
DWORD state = This->contained_tss_states[i].state;
- IWineD3DDevice_SetTextureStageState(pDevice, stage, state, This->textureState[stage][state]);
+ IWineD3DDevice_SetTextureStageState(device, stage, state, This->textureState[stage][state]);
}
/* Sampler states */
@@ -957,12 +957,12 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
DWORD value = This->samplerState[stage][state];
if (stage >= MAX_FRAGMENT_SAMPLERS) stage += WINED3DVERTEXTEXTURESAMPLER0 - MAX_FRAGMENT_SAMPLERS;
- IWineD3DDevice_SetSamplerState(pDevice, stage, state, value);
+ IWineD3DDevice_SetSamplerState(device, stage, state, value);
}
for (i = 0; i < This->num_contained_transform_states; ++i)
{
- IWineD3DDevice_SetTransform(pDevice, This->contained_transform_states[i],
+ IWineD3DDevice_SetTransform(device, This->contained_transform_states[i],
&This->transforms[This->contained_transform_states[i]]);
}
@@ -974,40 +974,40 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
if (This->changed.indices)
{
- IWineD3DDevice_SetIndexBuffer(pDevice, This->pIndexData, This->IndexFmt);
- IWineD3DDevice_SetBaseVertexIndex(pDevice, This->baseVertexIndex);
+ IWineD3DDevice_SetIndexBuffer(device, This->pIndexData, This->IndexFmt);
+ IWineD3DDevice_SetBaseVertexIndex(device, This->baseVertexIndex);
}
if (This->changed.vertexDecl && This->vertexDecl)
{
- IWineD3DDevice_SetVertexDeclaration(pDevice, This->vertexDecl);
+ IWineD3DDevice_SetVertexDeclaration(device, This->vertexDecl);
}
if (This->changed.material)
{
- IWineD3DDevice_SetMaterial(pDevice, &This->material);
+ IWineD3DDevice_SetMaterial(device, &This->material);
}
if (This->changed.viewport)
{
- IWineD3DDevice_SetViewport(pDevice, &This->viewport);
+ IWineD3DDevice_SetViewport(device, &This->viewport);
}
if (This->changed.scissorRect)
{
- IWineD3DDevice_SetScissorRect(pDevice, &This->scissorRect);
+ IWineD3DDevice_SetScissorRect(device, &This->scissorRect);
}
map = This->changed.streamSource;
for (i = 0; map; map >>= 1, ++i)
{
- if (map & 1) IWineD3DDevice_SetStreamSource(pDevice, i, This->streamSource[i], 0, This->streamStride[i]);
+ if (map & 1) IWineD3DDevice_SetStreamSource(device, i, This->streamSource[i], 0, This->streamStride[i]);
}
map = This->changed.streamFreq;
for (i = 0; map; map >>= 1, ++i)
{
- if (map & 1) IWineD3DDevice_SetStreamSourceFreq(pDevice, i, This->streamFreq[i] | This->streamFlags[i]);
+ if (map & 1) IWineD3DDevice_SetStreamSourceFreq(device, i, This->streamFreq[i] | This->streamFlags[i]);
}
map = This->changed.textures;
@@ -1018,7 +1018,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
if (!(map & 1)) continue;
stage = i < MAX_FRAGMENT_SAMPLERS ? i : WINED3DVERTEXTEXTURESAMPLER0 + i - MAX_FRAGMENT_SAMPLERS;
- IWineD3DDevice_SetTexture(pDevice, stage, This->textures[i]);
+ IWineD3DDevice_SetTexture(device, stage, This->textures[i]);
}
map = This->changed.clipplane;
@@ -1032,7 +1032,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
clip[1] = This->clipplane[i][1];
clip[2] = This->clipplane[i][2];
clip[3] = This->clipplane[i][3];
- IWineD3DDevice_SetClipPlane(pDevice, i, clip);
+ IWineD3DDevice_SetClipPlane(device, i, clip);
}
This->device->stateBlock->lowest_disabled_stage = MAX_TEXTURES - 1;
@@ -1044,7 +1044,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
break;
}
}
- TRACE("(%p) : Applied state block %p ------------------^\n", This, pDevice);
+ TRACE("(%p) : Applied state block %p ------------------^\n", This, device);
return WINED3D_OK;
}
@@ -1052,8 +1052,8 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStateBlock* iface) {
IWineD3DStateBlockImpl *This = (IWineD3DStateBlockImpl *)iface;
IWineD3DDevice *device = (IWineD3DDevice *)This->device;
- IWineD3DDeviceImpl *ThisDevice = (IWineD3DDeviceImpl *)device;
- const struct wined3d_gl_info *gl_info = &ThisDevice->adapter->gl_info;
+ IWineD3DDeviceImpl *device_impl = (IWineD3DDeviceImpl *)device;
+ const struct wined3d_gl_info *gl_info = &device_impl->adapter->gl_info;
union {
WINED3DLINEPATTERN lp;
DWORD d;
@@ -1070,7 +1070,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat
/* Note this may have a large overhead but it should only be executed
once, in order to initialize the complete state of the device and
all opengl equivalents */
- TRACE("(%p) -----------------------> Setting up device defaults... %p\n", This, ThisDevice);
+ TRACE("(%p) -----------------------> Setting up device defaults... %p\n", This, device);
/* TODO: make a special stateblock type for the primary stateblock (it never gets applied so it doesn't need a real type) */
This->blockType = WINED3DSBT_INIT;
@@ -1083,11 +1083,10 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat
TRACE("Render states\n");
/* Render states: */
- if (ThisDevice->auto_depth_stencil_buffer != NULL) {
+ if (device_impl->auto_depth_stencil)
IWineD3DDevice_SetRenderState(device, WINED3DRS_ZENABLE, WINED3DZB_TRUE);
- } else {
+ else
IWineD3DDevice_SetRenderState(device, WINED3DRS_ZENABLE, WINED3DZB_FALSE);
- }
IWineD3DDevice_SetRenderState(device, WINED3DRS_FILLMODE, WINED3DFILL_SOLID);
IWineD3DDevice_SetRenderState(device, WINED3DRS_SHADEMODE, WINED3DSHADE_GOURAUD);
lp.lp.wRepeatFactor = 0;
diff --git a/dll/directx/wine/wined3d/surface.c b/dll/directx/wine/wined3d/surface.c
index d17d35cc16d..0903f6eecaf 100644
--- a/dll/directx/wine/wined3d/surface.c
+++ b/dll/directx/wine/wined3d/surface.c
@@ -34,8 +34,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface);
WINE_DECLARE_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION (*gl_info)
-
static void surface_cleanup(IWineD3DSurfaceImpl *This)
{
IWineD3DDeviceImpl *device = This->resource.device;
@@ -51,7 +49,7 @@ static void surface_cleanup(IWineD3DSurfaceImpl *This)
* target, Uninit3D() will activate a context before doing anything. */
if (device->render_targets && device->render_targets[0])
{
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
}
ENTER_GL();
@@ -98,7 +96,7 @@ static void surface_cleanup(IWineD3DSurfaceImpl *This)
if (context) context_release(context);
}
-UINT surface_calculate_size(const struct GlPixelFormatDesc *format_desc, UINT alignment, UINT width, UINT height)
+UINT surface_calculate_size(const struct wined3d_format_desc *format_desc, UINT alignment, UINT width, UINT height)
{
UINT size;
@@ -123,13 +121,233 @@ UINT surface_calculate_size(const struct GlPixelFormatDesc *format_desc, UINT al
return size;
}
+struct blt_info
+{
+ GLenum binding;
+ GLenum bind_target;
+ enum tex_types tex_type;
+ GLfloat coords[4][3];
+};
+
+struct float_rect
+{
+ float l;
+ float t;
+ float r;
+ float b;
+};
+
+static inline void cube_coords_float(const RECT *r, UINT w, UINT h, struct float_rect *f)
+{
+ f->l = ((r->left * 2.0f) / w) - 1.0f;
+ f->t = ((r->top * 2.0f) / h) - 1.0f;
+ f->r = ((r->right * 2.0f) / w) - 1.0f;
+ f->b = ((r->bottom * 2.0f) / h) - 1.0f;
+}
+
+static void surface_get_blt_info(GLenum target, const RECT *rect_in, GLsizei w, GLsizei h, struct blt_info *info)
+{
+ GLfloat (*coords)[3] = info->coords;
+ RECT rect;
+ struct float_rect f;
+
+ if (rect_in)
+ rect = *rect_in;
+ else
+ {
+ rect.left = 0;
+ rect.top = h;
+ rect.right = w;
+ rect.bottom = 0;
+ }
+
+ switch (target)
+ {
+ default:
+ FIXME("Unsupported texture target %#x\n", target);
+ /* Fall back to GL_TEXTURE_2D */
+ case GL_TEXTURE_2D:
+ info->binding = GL_TEXTURE_BINDING_2D;
+ info->bind_target = GL_TEXTURE_2D;
+ info->tex_type = tex_2d;
+ coords[0][0] = (float)rect.left / w;
+ coords[0][1] = (float)rect.top / h;
+ coords[0][2] = 0.0f;
+
+ coords[1][0] = (float)rect.right / w;
+ coords[1][1] = (float)rect.top / h;
+ coords[1][2] = 0.0f;
+
+ coords[2][0] = (float)rect.left / w;
+ coords[2][1] = (float)rect.bottom / h;
+ coords[2][2] = 0.0f;
+
+ coords[3][0] = (float)rect.right / w;
+ coords[3][1] = (float)rect.bottom / h;
+ coords[3][2] = 0.0f;
+ break;
+
+ case GL_TEXTURE_RECTANGLE_ARB:
+ info->binding = GL_TEXTURE_BINDING_RECTANGLE_ARB;
+ info->bind_target = GL_TEXTURE_RECTANGLE_ARB;
+ info->tex_type = tex_rect;
+ coords[0][0] = rect.left; coords[0][1] = rect.top; coords[0][2] = 0.0f;
+ coords[1][0] = rect.right; coords[1][1] = rect.top; coords[1][2] = 0.0f;
+ coords[2][0] = rect.left; coords[2][1] = rect.bottom; coords[2][2] = 0.0f;
+ coords[3][0] = rect.right; coords[3][1] = rect.bottom; coords[3][2] = 0.0f;
+ break;
+
+ case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
+ info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
+ info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+ info->tex_type = tex_cube;
+ cube_coords_float(&rect, w, h, &f);
+
+ coords[0][0] = 1.0f; coords[0][1] = -f.t; coords[0][2] = -f.l;
+ coords[1][0] = 1.0f; coords[1][1] = -f.t; coords[1][2] = -f.r;
+ coords[2][0] = 1.0f; coords[2][1] = -f.b; coords[2][2] = -f.l;
+ coords[3][0] = 1.0f; coords[3][1] = -f.b; coords[3][2] = -f.r;
+ break;
+
+ case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
+ info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
+ info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+ info->tex_type = tex_cube;
+ cube_coords_float(&rect, w, h, &f);
+
+ coords[0][0] = -1.0f; coords[0][1] = -f.t; coords[0][2] = f.l;
+ coords[1][0] = -1.0f; coords[1][1] = -f.t; coords[1][2] = f.r;
+ coords[2][0] = -1.0f; coords[2][1] = -f.b; coords[2][2] = f.l;
+ coords[3][0] = -1.0f; coords[3][1] = -f.b; coords[3][2] = f.r;
+ break;
+
+ case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
+ info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
+ info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+ info->tex_type = tex_cube;
+ cube_coords_float(&rect, w, h, &f);
+
+ coords[0][0] = f.l; coords[0][1] = 1.0f; coords[0][2] = f.t;
+ coords[1][0] = f.r; coords[1][1] = 1.0f; coords[1][2] = f.t;
+ coords[2][0] = f.l; coords[2][1] = 1.0f; coords[2][2] = f.b;
+ coords[3][0] = f.r; coords[3][1] = 1.0f; coords[3][2] = f.b;
+ break;
+
+ case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
+ info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
+ info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+ info->tex_type = tex_cube;
+ cube_coords_float(&rect, w, h, &f);
+
+ coords[0][0] = f.l; coords[0][1] = -1.0f; coords[0][2] = -f.t;
+ coords[1][0] = f.r; coords[1][1] = -1.0f; coords[1][2] = -f.t;
+ coords[2][0] = f.l; coords[2][1] = -1.0f; coords[2][2] = -f.b;
+ coords[3][0] = f.r; coords[3][1] = -1.0f; coords[3][2] = -f.b;
+ break;
+
+ case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
+ info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
+ info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+ info->tex_type = tex_cube;
+ cube_coords_float(&rect, w, h, &f);
+
+ coords[0][0] = f.l; coords[0][1] = -f.t; coords[0][2] = 1.0f;
+ coords[1][0] = f.r; coords[1][1] = -f.t; coords[1][2] = 1.0f;
+ coords[2][0] = f.l; coords[2][1] = -f.b; coords[2][2] = 1.0f;
+ coords[3][0] = f.r; coords[3][1] = -f.b; coords[3][2] = 1.0f;
+ break;
+
+ case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
+ info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
+ info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+ info->tex_type = tex_cube;
+ cube_coords_float(&rect, w, h, &f);
+
+ coords[0][0] = -f.l; coords[0][1] = -f.t; coords[0][2] = -1.0f;
+ coords[1][0] = -f.r; coords[1][1] = -f.t; coords[1][2] = -1.0f;
+ coords[2][0] = -f.l; coords[2][1] = -f.b; coords[2][2] = -1.0f;
+ coords[3][0] = -f.r; coords[3][1] = -f.b; coords[3][2] = -1.0f;
+ break;
+ }
+}
+
+static inline void surface_get_rect(IWineD3DSurfaceImpl *This, const RECT *rect_in, RECT *rect_out)
+{
+ if (rect_in)
+ *rect_out = *rect_in;
+ else
+ {
+ rect_out->left = 0;
+ rect_out->top = 0;
+ rect_out->right = This->currentDesc.Width;
+ rect_out->bottom = This->currentDesc.Height;
+ }
+}
+
+/* GL locking and context activation is done by the caller */
+void draw_textured_quad(IWineD3DSurfaceImpl *src_surface, const RECT *src_rect, const RECT *dst_rect, WINED3DTEXTUREFILTERTYPE Filter)
+{
+ IWineD3DBaseTextureImpl *texture;
+ struct blt_info info;
+
+ surface_get_blt_info(src_surface->texture_target, src_rect, src_surface->pow2Width, src_surface->pow2Height, &info);
+
+ glEnable(info.bind_target);
+ checkGLcall("glEnable(bind_target)");
+
+ /* Bind the texture */
+ glBindTexture(info.bind_target, src_surface->texture_name);
+ checkGLcall("glBindTexture");
+
+ /* Filtering for StretchRect */
+ glTexParameteri(info.bind_target, GL_TEXTURE_MAG_FILTER,
+ wined3d_gl_mag_filter(magLookup, Filter));
+ checkGLcall("glTexParameteri");
+ glTexParameteri(info.bind_target, GL_TEXTURE_MIN_FILTER,
+ wined3d_gl_min_mip_filter(minMipLookup, Filter, WINED3DTEXF_NONE));
+ checkGLcall("glTexParameteri");
+ glTexParameteri(info.bind_target, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(info.bind_target, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ checkGLcall("glTexEnvi");
+
+ /* Draw a quad */
+ glBegin(GL_TRIANGLE_STRIP);
+ glTexCoord3fv(info.coords[0]);
+ glVertex2i(dst_rect->left, dst_rect->top);
+
+ glTexCoord3fv(info.coords[1]);
+ glVertex2i(dst_rect->right, dst_rect->top);
+
+ glTexCoord3fv(info.coords[2]);
+ glVertex2i(dst_rect->left, dst_rect->bottom);
+
+ glTexCoord3fv(info.coords[3]);
+ glVertex2i(dst_rect->right, dst_rect->bottom);
+ glEnd();
+
+ /* Unbind the texture */
+ glBindTexture(info.bind_target, 0);
+ checkGLcall("glBindTexture(info->bind_target, 0)");
+
+ /* 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 *)src_surface, &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);
+ }
+}
+
HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, UINT alignment,
UINT width, UINT height, UINT level, BOOL lockable, BOOL discard, WINED3DMULTISAMPLE_TYPE multisample_type,
UINT multisample_quality, IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format,
WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
{
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, gl_info);
void (*cleanup)(IWineD3DSurfaceImpl *This);
unsigned int resource_size;
HRESULT hr;
@@ -226,7 +444,7 @@ HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type,
}
/* Mark the texture as dirty so that it gets loaded first time around. */
- surface_add_dirty_rect((IWineD3DSurface *)surface, NULL);
+ surface_add_dirty_rect(surface, NULL);
list_init(&surface->renderbuffers);
TRACE("surface %p, memory %p, size %u\n", surface, surface->resource.allocatedMemory, surface->resource.size);
@@ -243,64 +461,59 @@ HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type,
return hr;
}
-static void surface_force_reload(IWineD3DSurface *iface)
+static void surface_force_reload(IWineD3DSurfaceImpl *surface)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
-
- This->Flags &= ~(SFLAG_ALLOCATED | SFLAG_SRGBALLOCATED);
+ surface->Flags &= ~(SFLAG_ALLOCATED | SFLAG_SRGBALLOCATED);
}
-void surface_set_texture_name(IWineD3DSurface *iface, GLuint new_name, BOOL srgb)
+void surface_set_texture_name(IWineD3DSurfaceImpl *surface, GLuint new_name, BOOL srgb)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
GLuint *name;
DWORD flag;
+ TRACE("surface %p, new_name %u, srgb %#x.\n", surface, new_name, srgb);
+
if(srgb)
{
- name = &This->texture_name_srgb;
+ name = &surface->texture_name_srgb;
flag = SFLAG_INSRGBTEX;
}
else
{
- name = &This->texture_name;
+ name = &surface->texture_name;
flag = SFLAG_INTEXTURE;
}
- TRACE("(%p) : setting texture name %u\n", This, new_name);
-
if (!*name && new_name)
{
/* FIXME: We shouldn't need to remove SFLAG_INTEXTURE if the
* surface has no texture name yet. See if we can get rid of this. */
- if (This->Flags & flag)
+ if (surface->Flags & flag)
ERR("Surface has SFLAG_INTEXTURE set, but no texture name\n");
- IWineD3DSurface_ModifyLocation(iface, flag, FALSE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, flag, FALSE);
}
*name = new_name;
- surface_force_reload(iface);
+ surface_force_reload(surface);
}
-void surface_set_texture_target(IWineD3DSurface *iface, GLenum target)
+void surface_set_texture_target(IWineD3DSurfaceImpl *surface, GLenum target)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
+ TRACE("surface %p, target %#x.\n", surface, target);
- TRACE("(%p) : setting target %#x\n", This, target);
-
- if (This->texture_target != target)
+ if (surface->texture_target != target)
{
if (target == GL_TEXTURE_RECTANGLE_ARB)
{
- This->Flags &= ~SFLAG_NORMCOORD;
+ surface->Flags &= ~SFLAG_NORMCOORD;
}
- else if (This->texture_target == GL_TEXTURE_RECTANGLE_ARB)
+ else if (surface->texture_target == GL_TEXTURE_RECTANGLE_ARB)
{
- This->Flags |= SFLAG_NORMCOORD;
+ surface->Flags |= SFLAG_NORMCOORD;
}
}
- This->texture_target = target;
- surface_force_reload(iface);
+ surface->texture_target = target;
+ surface_force_reload(surface);
}
/* Context activation is done by the caller. */
@@ -334,8 +547,9 @@ static void surface_bind_and_dirtify(IWineD3DSurfaceImpl *This, BOOL srgb) {
/* This function checks if the primary render target uses the 8bit paletted format. */
static BOOL primary_render_target_is_p8(IWineD3DDeviceImpl *device)
{
- if (device->render_targets && device->render_targets[0]) {
- IWineD3DSurfaceImpl* render_target = (IWineD3DSurfaceImpl*)device->render_targets[0];
+ if (device->render_targets && device->render_targets[0])
+ {
+ IWineD3DSurfaceImpl *render_target = device->render_targets[0];
if ((render_target->resource.usage & WINED3DUSAGE_RENDERTARGET)
&& (render_target->resource.format_desc->format == WINED3DFMT_P8_UINT))
return TRUE;
@@ -343,15 +557,12 @@ static BOOL primary_render_target_is_p8(IWineD3DDeviceImpl *device)
return FALSE;
}
-#undef GLINFO_LOCATION
-
-#define GLINFO_LOCATION This->resource.device->adapter->gl_info
-
/* This call just downloads data, the caller is responsible for binding the
* correct texture. */
/* Context activation is done by the caller. */
-static void surface_download_data(IWineD3DSurfaceImpl *This) {
- const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
+static void surface_download_data(IWineD3DSurfaceImpl *This, const struct wined3d_gl_info *gl_info)
+{
+ const struct wined3d_format_desc *format_desc = This->resource.format_desc;
/* Only support read back of converted P8 surfaces */
if (This->Flags & SFLAG_CONVERTED && format_desc->format != WINED3DFMT_P8_UINT)
@@ -502,11 +713,28 @@ static void surface_download_data(IWineD3DSurfaceImpl *This) {
/* This call just uploads data, the caller is responsible for binding the
* correct texture. */
/* Context activation is done by the caller. */
-static void surface_upload_data(IWineD3DSurfaceImpl *This, GLenum internal, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *data) {
- const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
+static void surface_upload_data(IWineD3DSurfaceImpl *This, const struct wined3d_gl_info *gl_info,
+ const struct wined3d_format_desc *format_desc, BOOL srgb, const GLvoid *data)
+{
+ GLsizei width = This->currentDesc.Width;
+ GLsizei height = This->currentDesc.Height;
+ GLenum internal;
+
+ if (srgb)
+ {
+ internal = format_desc->glGammaInternal;
+ }
+ else if (This->resource.usage & WINED3DUSAGE_RENDERTARGET && surface_is_offscreen(This))
+ {
+ internal = format_desc->rtInternal;
+ }
+ else
+ {
+ internal = format_desc->glInternal;
+ }
TRACE("This %p, internal %#x, width %d, height %d, format %#x, type %#x, data %p.\n",
- This, internal, width, height, format, type, data);
+ This, internal, width, height, format_desc->glFormat, format_desc->glType, data);
TRACE("target %#x, level %u, resource size %u.\n",
This->texture_target, This->texture_level, This->resource.size);
@@ -536,7 +764,7 @@ static void surface_upload_data(IWineD3DSurfaceImpl *This, GLenum internal, GLsi
TRACE("Calling glTexSubImage2D.\n");
glTexSubImage2D(This->texture_target, This->texture_level,
- 0, 0, width, height, format, type, data);
+ 0, 0, width, height, format_desc->glFormat, format_desc->glType, data);
checkGLcall("glTexSubImage2D");
}
@@ -547,32 +775,58 @@ static void surface_upload_data(IWineD3DSurfaceImpl *This, GLenum internal, GLsi
}
LEAVE_GL();
+
+ if (gl_info->quirks & WINED3D_QUIRK_FBO_TEX_UPDATE)
+ {
+ IWineD3DDeviceImpl *device = This->resource.device;
+ unsigned int i;
+
+ for (i = 0; i < device->numContexts; ++i)
+ {
+ context_surface_update(device->contexts[i], This);
+ }
+ }
}
/* This call just allocates the texture, the caller is responsible for binding
* the correct texture. */
/* Context activation is done by the caller. */
-static void surface_allocate_surface(IWineD3DSurfaceImpl *This, GLenum internal, GLsizei width, GLsizei height, GLenum format, GLenum type) {
- const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info;
- const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
+static void surface_allocate_surface(IWineD3DSurfaceImpl *This, const struct wined3d_gl_info *gl_info,
+ const struct wined3d_format_desc *format_desc, BOOL srgb)
+{
BOOL enable_client_storage = FALSE;
+ GLsizei width = This->pow2Width;
+ GLsizei height = This->pow2Height;
const BYTE *mem = NULL;
+ GLenum internal;
+
+ if (srgb)
+ {
+ internal = format_desc->glGammaInternal;
+ }
+ else if (This->resource.usage & WINED3DUSAGE_RENDERTARGET && surface_is_offscreen(This))
+ {
+ internal = format_desc->rtInternal;
+ }
+ else
+ {
+ internal = format_desc->glInternal;
+ }
if (format_desc->heightscale != 1.0f && format_desc->heightscale != 0.0f) height *= format_desc->heightscale;
TRACE("(%p) : Creating surface (target %#x) level %d, d3d format %s, internal format %#x, width %d, height %d, gl format %#x, gl type=%#x\n",
This, This->texture_target, This->texture_level, debug_d3dformat(format_desc->format),
- internal, width, height, format, type);
+ internal, width, height, format_desc->glFormat, format_desc->glType);
ENTER_GL();
if (gl_info->supported[APPLE_CLIENT_STORAGE])
{
- if(This->Flags & (SFLAG_NONPOW2 | SFLAG_DIBSECTION | SFLAG_OVERSIZE | SFLAG_CONVERTED) || This->resource.allocatedMemory == NULL) {
+ if(This->Flags & (SFLAG_NONPOW2 | SFLAG_DIBSECTION | SFLAG_CONVERTED) || This->resource.allocatedMemory == NULL) {
/* In some cases we want to disable client storage.
* SFLAG_NONPOW2 has a bigger opengl texture than the client memory, and different pitches
* SFLAG_DIBSECTION: Dibsections may have read / write protections on the memory. Avoid issues...
- * SFLAG_OVERSIZE: The gl texture is smaller than the allocated memory
* SFLAG_CONVERTED: The conversion destination memory is freed after loading the surface
* allocatedMemory == NULL: Not defined in the extension. Seems to disable client storage effectively
*/
@@ -598,7 +852,7 @@ static void surface_allocate_surface(IWineD3DSurfaceImpl *This, GLenum internal,
else
{
glTexImage2D(This->texture_target, This->texture_level,
- internal, width, height, 0, format, type, mem);
+ internal, width, height, 0, format_desc->glFormat, format_desc->glType, mem);
checkGLcall("glTexImage2D");
}
@@ -613,15 +867,15 @@ static void surface_allocate_surface(IWineD3DSurfaceImpl *This, GLenum internal,
* render target dimensions. With FBOs, the dimensions have to be an exact match. */
/* TODO: We should synchronize the renderbuffer's content with the texture's content. */
/* GL locking is done by the caller */
-void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int width, unsigned int height) {
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info;
+void surface_set_compatible_renderbuffer(IWineD3DSurfaceImpl *surface, unsigned int width, unsigned int height)
+{
+ const struct wined3d_gl_info *gl_info = &surface->resource.device->adapter->gl_info;
renderbuffer_entry_t *entry;
GLuint renderbuffer = 0;
unsigned int src_width, src_height;
- src_width = This->pow2Width;
- src_height = This->pow2Height;
+ src_width = surface->pow2Width;
+ src_height = surface->pow2Height;
/* A depth stencil smaller than the render target is not valid */
if (width > src_width || height > src_height) return;
@@ -630,51 +884,53 @@ void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int wi
if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT]
|| (width == src_width && height == src_height))
{
- This->current_renderbuffer = NULL;
+ surface->current_renderbuffer = NULL;
return;
}
/* Look if we've already got a renderbuffer of the correct dimensions */
- LIST_FOR_EACH_ENTRY(entry, &This->renderbuffers, renderbuffer_entry_t, entry) {
- if (entry->width == width && entry->height == height) {
+ LIST_FOR_EACH_ENTRY(entry, &surface->renderbuffers, renderbuffer_entry_t, entry)
+ {
+ if (entry->width == width && entry->height == height)
+ {
renderbuffer = entry->id;
- This->current_renderbuffer = entry;
+ surface->current_renderbuffer = entry;
break;
}
}
- if (!renderbuffer) {
+ if (!renderbuffer)
+ {
gl_info->fbo_ops.glGenRenderbuffers(1, &renderbuffer);
gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER,
- This->resource.format_desc->glInternal, width, height);
+ surface->resource.format_desc->glInternal, width, height);
entry = HeapAlloc(GetProcessHeap(), 0, sizeof(renderbuffer_entry_t));
entry->width = width;
entry->height = height;
entry->id = renderbuffer;
- list_add_head(&This->renderbuffers, &entry->entry);
+ list_add_head(&surface->renderbuffers, &entry->entry);
- This->current_renderbuffer = entry;
+ surface->current_renderbuffer = entry;
}
checkGLcall("set_compatible_renderbuffer");
}
-GLenum surface_get_gl_buffer(IWineD3DSurface *iface)
+GLenum surface_get_gl_buffer(IWineD3DSurfaceImpl *surface)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)This->container;
+ IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)surface->container;
- TRACE("iface %p.\n", iface);
+ TRACE("surface %p.\n", surface);
- if (!(This->Flags & SFLAG_SWAPCHAIN))
+ if (!(surface->Flags & SFLAG_SWAPCHAIN))
{
- ERR("Surface %p is not on a swapchain.\n", iface);
+ ERR("Surface %p is not on a swapchain.\n", surface);
return GL_NONE;
}
- if (swapchain->backBuffer && swapchain->backBuffer[0] == iface)
+ if (swapchain->back_buffers && swapchain->back_buffers[0] == surface)
{
if (swapchain->render_to_fbo)
{
@@ -684,7 +940,7 @@ GLenum surface_get_gl_buffer(IWineD3DSurface *iface)
TRACE("Returning GL_BACK\n");
return GL_BACK;
}
- else if (swapchain->frontBuffer == iface)
+ else if (surface == swapchain->front_buffer)
{
TRACE("Returning GL_FRONT\n");
return GL_FRONT;
@@ -695,35 +951,35 @@ GLenum surface_get_gl_buffer(IWineD3DSurface *iface)
}
/* Slightly inefficient way to handle multiple dirty rects but it works :) */
-void surface_add_dirty_rect(IWineD3DSurface *iface, const RECT *dirty_rect)
+void surface_add_dirty_rect(IWineD3DSurfaceImpl *surface, const RECT *dirty_rect)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
IWineD3DBaseTexture *baseTexture = NULL;
- if (!(This->Flags & SFLAG_INSYSMEM) && (This->Flags & SFLAG_INTEXTURE))
- IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, NULL /* no partial locking for textures yet */);
+ TRACE("surface %p, dirty_rect %s.\n", surface, wine_dbgstr_rect(dirty_rect));
- IWineD3DSurface_ModifyLocation(iface, SFLAG_INSYSMEM, TRUE);
+ if (!(surface->Flags & SFLAG_INSYSMEM) && (surface->Flags & SFLAG_INTEXTURE))
+ /* No partial locking for textures yet. */
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, NULL);
+
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, TRUE);
if (dirty_rect)
{
- This->dirtyRect.left = min(This->dirtyRect.left, dirty_rect->left);
- This->dirtyRect.top = min(This->dirtyRect.top, dirty_rect->top);
- This->dirtyRect.right = max(This->dirtyRect.right, dirty_rect->right);
- This->dirtyRect.bottom = max(This->dirtyRect.bottom, dirty_rect->bottom);
+ surface->dirtyRect.left = min(surface->dirtyRect.left, dirty_rect->left);
+ surface->dirtyRect.top = min(surface->dirtyRect.top, dirty_rect->top);
+ surface->dirtyRect.right = max(surface->dirtyRect.right, dirty_rect->right);
+ surface->dirtyRect.bottom = max(surface->dirtyRect.bottom, dirty_rect->bottom);
}
else
{
- This->dirtyRect.left = 0;
- This->dirtyRect.top = 0;
- This->dirtyRect.right = This->currentDesc.Width;
- This->dirtyRect.bottom = This->currentDesc.Height;
+ surface->dirtyRect.left = 0;
+ surface->dirtyRect.top = 0;
+ surface->dirtyRect.right = surface->currentDesc.Width;
+ surface->dirtyRect.bottom = surface->currentDesc.Height;
}
- TRACE("(%p) : Dirty: yes, Rect:(%d, %d, %d, %d)\n", This, This->dirtyRect.left,
- This->dirtyRect.top, This->dirtyRect.right, This->dirtyRect.bottom);
-
/* if the container is a basetexture then mark it dirty. */
- if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&baseTexture)))
+ if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface,
+ &IID_IWineD3DBaseTexture, (void **)&baseTexture)))
{
TRACE("Passing to container\n");
IWineD3DBaseTexture_SetDirty(baseTexture, TRUE);
@@ -731,15 +987,59 @@ void surface_add_dirty_rect(IWineD3DSurface *iface, const RECT *dirty_rect)
}
}
-static inline BOOL surface_can_stretch_rect(IWineD3DSurfaceImpl *src, IWineD3DSurfaceImpl *dst)
+static BOOL surface_convert_color_to_argb(IWineD3DSurfaceImpl *This, DWORD color, DWORD *argb_color)
{
- return ((src->resource.format_desc->Flags & WINED3DFMT_FLAG_FBO_ATTACHABLE)
- || (src->resource.usage & WINED3DUSAGE_RENDERTARGET))
- && ((dst->resource.format_desc->Flags & WINED3DFMT_FLAG_FBO_ATTACHABLE)
- || (dst->resource.usage & WINED3DUSAGE_RENDERTARGET))
- && (src->resource.format_desc->format == dst->resource.format_desc->format
- || (is_identity_fixup(src->resource.format_desc->color_fixup)
- && is_identity_fixup(dst->resource.format_desc->color_fixup)));
+ IWineD3DDeviceImpl *device = This->resource.device;
+
+ switch(This->resource.format_desc->format)
+ {
+ case WINED3DFMT_P8_UINT:
+ {
+ DWORD alpha;
+
+ if (primary_render_target_is_p8(device))
+ alpha = color << 24;
+ else
+ alpha = 0xFF000000;
+
+ if (This->palette) {
+ *argb_color = (alpha |
+ (This->palette->palents[color].peRed << 16) |
+ (This->palette->palents[color].peGreen << 8) |
+ (This->palette->palents[color].peBlue));
+ } else {
+ *argb_color = alpha;
+ }
+ }
+ break;
+
+ case WINED3DFMT_B5G6R5_UNORM:
+ {
+ if (color == 0xFFFF) {
+ *argb_color = 0xFFFFFFFF;
+ } else {
+ *argb_color = ((0xFF000000) |
+ ((color & 0xF800) << 8) |
+ ((color & 0x07E0) << 5) |
+ ((color & 0x001F) << 3));
+ }
+ }
+ break;
+
+ case WINED3DFMT_B8G8R8_UNORM:
+ case WINED3DFMT_B8G8R8X8_UNORM:
+ *argb_color = 0xFF000000 | color;
+ break;
+
+ case WINED3DFMT_B8G8R8A8_UNORM:
+ *argb_color = color;
+ break;
+
+ default:
+ ERR("Unhandled conversion from %s to ARGB!\n", debug_d3dformat(This->resource.format_desc->format));
+ return FALSE;
+ }
+ return TRUE;
}
static ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface)
@@ -764,46 +1064,49 @@ static ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface)
IWineD3DSurface IWineD3DResource parts follow
**************************************************** */
-void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb)
+void surface_internal_preload(IWineD3DSurfaceImpl *surface, enum WINED3DSRGB srgb)
{
/* TODO: check for locks */
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- IWineD3DDeviceImpl *device = This->resource.device;
+ IWineD3DDeviceImpl *device = surface->resource.device;
IWineD3DBaseTexture *baseTexture = NULL;
- TRACE("(%p)Checking to see if the container is a base texture\n", This);
- if (IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&baseTexture) == WINED3D_OK) {
- IWineD3DBaseTextureImpl *tex_impl = (IWineD3DBaseTextureImpl *) baseTexture;
+ TRACE("(%p)Checking to see if the container is a base texture\n", surface);
+ if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface,
+ &IID_IWineD3DBaseTexture, (void **)&baseTexture)))
+ {
+ IWineD3DBaseTextureImpl *tex_impl = (IWineD3DBaseTextureImpl *)baseTexture;
TRACE("Passing to container\n");
tex_impl->baseTexture.internal_preload(baseTexture, srgb);
IWineD3DBaseTexture_Release(baseTexture);
} else {
struct wined3d_context *context = NULL;
- TRACE("(%p) : About to load surface\n", This);
+ TRACE("(%p) : About to load surface\n", surface);
- if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ if (!device->isInDraw) context = context_acquire(device, NULL);
- if (This->resource.format_desc->format == WINED3DFMT_P8_UINT
- || This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM)
+ if (surface->resource.format_desc->format == WINED3DFMT_P8_UINT
+ || surface->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM)
{
- if(palette9_changed(This)) {
+ if (palette9_changed(surface))
+ {
TRACE("Reloading surface because the d3d8/9 palette was changed\n");
/* TODO: This is not necessarily needed with hw palettized texture support */
- IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, NULL);
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, NULL);
/* Make sure the texture is reloaded because of the palette change, this kills performance though :( */
- IWineD3DSurface_ModifyLocation(iface, SFLAG_INTEXTURE, FALSE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INTEXTURE, FALSE);
}
}
- IWineD3DSurface_LoadTexture(iface, srgb == SRGB_SRGB ? TRUE : FALSE);
+ IWineD3DSurface_LoadTexture((IWineD3DSurface *)surface, srgb == SRGB_SRGB ? TRUE : FALSE);
- if (This->resource.pool == WINED3DPOOL_DEFAULT) {
+ if (surface->resource.pool == WINED3DPOOL_DEFAULT)
+ {
/* Tell opengl to try and keep this texture in video ram (well mostly) */
GLclampf tmp;
tmp = 0.9f;
ENTER_GL();
- glPrioritizeTextures(1, &This->texture_name, &tmp);
+ glPrioritizeTextures(1, &surface->texture_name, &tmp);
LEAVE_GL();
}
@@ -811,12 +1114,14 @@ void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb)
}
}
-static void WINAPI IWineD3DSurfaceImpl_PreLoad(IWineD3DSurface *iface) {
- surface_internal_preload(iface, SRGB_ANY);
+static void WINAPI IWineD3DSurfaceImpl_PreLoad(IWineD3DSurface *iface)
+{
+ surface_internal_preload((IWineD3DSurfaceImpl *)iface, SRGB_ANY);
}
/* Context activation is done by the caller. */
-static void surface_remove_pbo(IWineD3DSurfaceImpl *This) {
+static void surface_remove_pbo(IWineD3DSurfaceImpl *This, const struct wined3d_gl_info *gl_info)
+{
This->resource.heapMemory = HeapAlloc(GetProcessHeap() ,0 , This->resource.size + RESOURCE_ALIGNMENT);
This->resource.allocatedMemory =
(BYTE *)(((ULONG_PTR) This->resource.heapMemory + (RESOURCE_ALIGNMENT - 1)) & ~(RESOURCE_ALIGNMENT - 1));
@@ -834,27 +1139,26 @@ static void surface_remove_pbo(IWineD3DSurfaceImpl *This) {
This->Flags &= ~SFLAG_PBO;
}
-BOOL surface_init_sysmem(IWineD3DSurface *iface)
+BOOL surface_init_sysmem(IWineD3DSurfaceImpl *surface)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
-
- if(!This->resource.allocatedMemory)
+ if (!surface->resource.allocatedMemory)
{
- This->resource.heapMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->resource.size + RESOURCE_ALIGNMENT);
- if(!This->resource.heapMemory)
+ surface->resource.heapMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ surface->resource.size + RESOURCE_ALIGNMENT);
+ if (!surface->resource.heapMemory)
{
ERR("Out of memory\n");
return FALSE;
}
- This->resource.allocatedMemory =
- (BYTE *)(((ULONG_PTR) This->resource.heapMemory + (RESOURCE_ALIGNMENT - 1)) & ~(RESOURCE_ALIGNMENT - 1));
+ surface->resource.allocatedMemory =
+ (BYTE *)(((ULONG_PTR)surface->resource.heapMemory + (RESOURCE_ALIGNMENT - 1)) & ~(RESOURCE_ALIGNMENT - 1));
}
else
{
- memset(This->resource.allocatedMemory, 0, This->resource.size);
+ memset(surface->resource.allocatedMemory, 0, surface->resource.size);
}
- IWineD3DSurface_ModifyLocation(iface, SFLAG_INSYSMEM, TRUE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, TRUE);
return TRUE;
}
@@ -879,8 +1183,10 @@ static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) {
* or the depth stencil into an FBO the texture or render buffer will be removed
* and all flags get lost
*/
- surface_init_sysmem(iface);
- } else {
+ surface_init_sysmem(This);
+ }
+ else
+ {
/* Load the surface into system memory */
IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, NULL);
IWineD3DSurface_ModifyLocation(iface, SFLAG_INDRAWABLE, FALSE);
@@ -889,13 +1195,12 @@ static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) {
IWineD3DSurface_ModifyLocation(iface, SFLAG_INSRGBTEX, FALSE);
This->Flags &= ~(SFLAG_ALLOCATED | SFLAG_SRGBALLOCATED);
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
gl_info = context->gl_info;
/* Destroy PBOs, but load them into real sysmem before */
- if(This->Flags & SFLAG_PBO) {
- surface_remove_pbo(This);
- }
+ if (This->Flags & SFLAG_PBO)
+ surface_remove_pbo(This, gl_info);
/* Destroy fbo render buffers. This is needed for implicit render targets, for
* all application-created targets the application has to release the surface
@@ -936,7 +1241,8 @@ static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) {
/* Read the framebuffer back into the surface */
static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, void *dest, UINT pitch)
{
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = This->resource.device;
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
BYTE *mem;
GLint fmt;
@@ -964,26 +1270,29 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, v
* should help here. Furthermore unlockrect will need the context set up for blitting. The context manager will find
* context->last_was_blit set on the unlock.
*/
- context = context_acquire(myDevice, (IWineD3DSurface *) This, CTXUSAGE_BLIT);
+ context = context_acquire(device, This);
+ context_apply_blit_state(context, device);
+ gl_info = context->gl_info;
+
ENTER_GL();
/* Select the correct read buffer, and give some debug output.
* There is no need to keep track of the current read buffer or reset it, every part of the code
* that reads sets the read buffer as desired.
*/
- if (surface_is_offscreen((IWineD3DSurface *) This))
+ if (surface_is_offscreen(This))
{
/* Locking the primary render target which is not on a swapchain(=offscreen render target).
* Read from the back buffer
*/
TRACE("Locking offscreen render target\n");
- glReadBuffer(myDevice->offscreenBuffer);
+ glReadBuffer(device->offscreenBuffer);
srcIsUpsideDown = TRUE;
}
else
{
/* Onscreen surfaces are always part of a swapchain */
- GLenum buffer = surface_get_gl_buffer((IWineD3DSurface *)This);
+ GLenum buffer = surface_get_gl_buffer(This);
TRACE("Locking %#x buffer\n", buffer);
glReadBuffer(buffer);
checkGLcall("glReadBuffer");
@@ -1005,7 +1314,8 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, v
{
case WINED3DFMT_P8_UINT:
{
- if(primary_render_target_is_p8(myDevice)) {
+ if (primary_render_target_is_p8(device))
+ {
/* In case of P8 render targets the index is stored in the alpha component */
fmt = GL_ALPHA;
type = GL_UNSIGNED_BYTE;
@@ -1140,7 +1450,7 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, v
* the same color but we have no choice.
* In case of P8 render targets, the index is stored in the alpha component so no conversion is needed.
*/
- if (This->resource.format_desc->format == WINED3DFMT_P8_UINT && !primary_render_target_is_p8(myDevice))
+ if (This->resource.format_desc->format == WINED3DFMT_P8_UINT && !primary_render_target_is_p8(device))
{
const PALETTEENTRY *pal = NULL;
DWORD width = pitch / 3;
@@ -1180,20 +1490,18 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, v
static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb)
{
IWineD3DDeviceImpl *device = This->resource.device;
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
- int bpp;
- GLenum format, internal, type;
- CONVERT_TYPES convert;
GLint prevRead;
- BOOL alloc_flag = srgb ? SFLAG_SRGBALLOCATED : SFLAG_ALLOCATED;
-
- d3dfmt_get_conv(This, TRUE /* We need color keying */, TRUE /* We will use textures */, &format, &internal, &type, &convert, &bpp, srgb);
/* Activate the surface to read from. In some situations it isn't the currently active target(e.g. backbuffer
* locking during offscreen rendering). RESOURCELOAD is ok because glCopyTexSubImage2D isn't affected by any
* states in the stateblock, and no driver was found yet that had bugs in that regard.
*/
- context = context_acquire(device, (IWineD3DSurface *) This, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, This);
+ gl_info = context->gl_info;
+
+ surface_prepare_texture(This, gl_info, srgb);
surface_bind_and_dirtify(This, srgb);
ENTER_GL();
@@ -1204,9 +1512,9 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb)
* There is no need to keep track of the current read buffer or reset it, every part of the code
* that reads sets the read buffer as desired.
*/
- if (!surface_is_offscreen((IWineD3DSurface *)This))
+ if (!surface_is_offscreen(This))
{
- GLenum buffer = surface_get_gl_buffer((IWineD3DSurface *)This);
+ GLenum buffer = surface_get_gl_buffer(This);
TRACE("Locking %#x buffer\n", buffer);
ENTER_GL();
@@ -1226,12 +1534,6 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb)
LEAVE_GL();
}
- if(!(This->Flags & alloc_flag)) {
- surface_allocate_surface(This, internal, This->pow2Width,
- This->pow2Height, format, type);
- This->Flags |= alloc_flag;
- }
-
ENTER_GL();
/* If !SrcIsUpsideDown we should flip the surface.
* This can be done using glCopyTexSubImage2D but this
@@ -1254,34 +1556,47 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb)
}
/* Context activation is done by the caller. */
-void surface_prepare_texture(IWineD3DSurfaceImpl *surface, BOOL srgb)
+static void surface_prepare_texture_internal(IWineD3DSurfaceImpl *surface,
+ const struct wined3d_gl_info *gl_info, BOOL srgb)
{
DWORD alloc_flag = srgb ? SFLAG_SRGBALLOCATED : SFLAG_ALLOCATED;
- GLenum format, internal, type;
- GLsizei width, height;
CONVERT_TYPES convert;
- int bpp;
+ struct wined3d_format_desc desc;
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;
+ d3dfmt_get_conv(surface, TRUE, TRUE, &desc, &convert);
+ if(convert != NO_CONVERSION || desc.convert) surface->Flags |= SFLAG_CONVERTED;
else surface->Flags &= ~SFLAG_CONVERTED;
- if ((surface->Flags & SFLAG_NONPOW2) && !(surface->Flags & SFLAG_OVERSIZE))
+ surface_bind_and_dirtify(surface, srgb);
+ surface_allocate_surface(surface, gl_info, &desc, srgb);
+ surface->Flags |= alloc_flag;
+}
+
+/* Context activation is done by the caller. */
+void surface_prepare_texture(IWineD3DSurfaceImpl *surface, const struct wined3d_gl_info *gl_info, BOOL srgb)
+{
+ IWineD3DBaseTextureImpl *texture;
+
+ if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface,
+ &IID_IWineD3DBaseTexture, (void **)&texture)))
{
- width = surface->pow2Width;
- height = surface->pow2Height;
- }
- else
- {
- width = surface->glRect.right - surface->glRect.left;
- height = surface->glRect.bottom - surface->glRect.top;
+ UINT sub_count = texture->baseTexture.level_count * texture->baseTexture.layer_count;
+ UINT i;
+
+ TRACE("surface %p is a subresource of texture %p.\n", surface, texture);
+
+ for (i = 0; i < sub_count; ++i)
+ {
+ IWineD3DSurfaceImpl *s = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[i];
+ surface_prepare_texture_internal(s, gl_info, srgb);
+ }
+
+ IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture);
}
- surface_bind_and_dirtify(surface, srgb);
- surface_allocate_surface(surface, internal, width, height, format, type);
- surface->Flags |= alloc_flag;
+ surface_prepare_texture_internal(surface, gl_info, srgb);
}
static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This)
@@ -1312,7 +1627,7 @@ static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This)
GLenum error;
struct wined3d_context *context;
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
ENTER_GL();
GL_EXTCALL(glGenBuffersARB(1, &This->pbo));
@@ -1360,10 +1675,11 @@ static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This)
static HRESULT WINAPI IWineD3DSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = This->resource.device;
const RECT *pass_rect = pRect;
- TRACE("(%p) : rect@%p flags(%08x), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, This->resource.allocatedMemory);
+ TRACE("iface %p, locked_rect %p, rect %s, flags %#x.\n",
+ iface, pLockedRect, wine_dbgstr_rect(pRect), Flags);
/* This is also done in the base class, but we have to verify this before loading any data from
* gl into the sysmem copy. The PBO may be mapped, a different rectangle locked, the discard flag
@@ -1404,7 +1720,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED
}
if (!(wined3d_settings.rendertargetlock_mode == RTL_DISABLE
- && ((This->Flags & SFLAG_SWAPCHAIN) || iface == myDevice->render_targets[0])))
+ && ((This->Flags & SFLAG_SWAPCHAIN) || This == device->render_targets[0])))
{
IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, pass_rect);
}
@@ -1412,9 +1728,12 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED
lock_end:
if (This->Flags & SFLAG_PBO)
{
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
- context = context_acquire(myDevice, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
+ gl_info = context->gl_info;
+
ENTER_GL();
GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, This->pbo));
checkGLcall("glBindBufferARB");
@@ -1443,7 +1762,7 @@ lock_end:
* Dirtify on lock
* as seen in msdn docs
*/
- surface_add_dirty_rect(iface, pRect);
+ surface_add_dirty_rect(This, pRect);
/** Dirtify Container if needed */
if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&pBaseTexture))) {
@@ -1463,16 +1782,20 @@ static void flush_to_framebuffer_drawpixels(IWineD3DSurfaceImpl *This, GLenum fm
GLint prev_rasterpos[4];
GLint skipBytes = 0;
UINT pitch = IWineD3DSurface_GetPitch((IWineD3DSurface *) This); /* target is argb, 4 byte */
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = This->resource.device;
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
/* Activate the correct context for the render target */
- context = context_acquire(myDevice, (IWineD3DSurface *) This, CTXUSAGE_BLIT);
+ context = context_acquire(device, This);
+ context_apply_blit_state(context, device);
+ gl_info = context->gl_info;
+
ENTER_GL();
- if (!surface_is_offscreen((IWineD3DSurface *)This))
+ if (!surface_is_offscreen(This))
{
- GLenum buffer = surface_get_gl_buffer((IWineD3DSurface *)This);
+ GLenum buffer = surface_get_gl_buffer(This);
TRACE("Unlocking %#x buffer.\n", buffer);
context_set_draw_buffer(context, buffer);
}
@@ -1480,7 +1803,7 @@ static void flush_to_framebuffer_drawpixels(IWineD3DSurfaceImpl *This, GLenum fm
{
/* Primary offscreen render target */
TRACE("Offscreen render target.\n");
- context_set_draw_buffer(context, myDevice->offscreenBuffer);
+ context_set_draw_buffer(context, device->offscreenBuffer);
}
glGetIntegerv(GL_PACK_SWAP_BYTES, &prev_store);
@@ -1553,7 +1876,7 @@ static void flush_to_framebuffer_drawpixels(IWineD3DSurfaceImpl *This, GLenum fm
static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = This->resource.device;
BOOL fullsurface;
if (!(This->Flags & SFLAG_LOCKED)) {
@@ -1563,11 +1886,14 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) {
if (This->Flags & SFLAG_PBO)
{
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
TRACE("Freeing PBO memory\n");
- context = context_acquire(myDevice, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
+ gl_info = context->gl_info;
+
ENTER_GL();
GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, This->pbo));
GL_EXTCALL(glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB));
@@ -1586,7 +1912,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) {
goto unlock_end;
}
- if ((This->Flags & SFLAG_SWAPCHAIN) || (myDevice->render_targets && iface == myDevice->render_targets[0]))
+ if ((This->Flags & SFLAG_SWAPCHAIN) || (device->render_targets && This == device->render_targets[0]))
{
if(wined3d_settings.rendertargetlock_mode == RTL_DISABLE) {
static BOOL warned = FALSE;
@@ -1633,7 +1959,9 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) {
This->dirtyRect.top = This->currentDesc.Height;
This->dirtyRect.right = 0;
This->dirtyRect.bottom = 0;
- } else if(iface == myDevice->stencilBufferTarget) {
+ }
+ else if (This == device->depth_stencil)
+ {
FIXME("Depth Stencil buffer locking is not implemented\n");
} else {
/* The rest should be a normal texture */
@@ -1643,9 +1971,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) {
* states need resetting
*/
if(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&impl) == WINED3D_OK) {
- if(impl->baseTexture.bindCount) {
- IWineD3DDeviceImpl_MarkStateDirty(myDevice, STATE_SAMPLER(impl->baseTexture.sampler));
- }
+ if (impl->baseTexture.bindCount)
+ IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SAMPLER(impl->baseTexture.sampler));
IWineD3DBaseTexture_Release((IWineD3DBaseTexture *) impl);
}
}
@@ -1661,35 +1988,34 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) {
return WINED3D_OK;
}
-static void surface_release_client_storage(IWineD3DSurface *iface)
+static void surface_release_client_storage(IWineD3DSurfaceImpl *surface)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
struct wined3d_context *context;
- context = context_acquire(This->resource.device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(surface->resource.device, NULL);
ENTER_GL();
glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE);
- if(This->texture_name)
+ if (surface->texture_name)
{
- surface_bind_and_dirtify(This, FALSE);
- glTexImage2D(This->texture_target, This->texture_level,
- GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
+ surface_bind_and_dirtify(surface, FALSE);
+ glTexImage2D(surface->texture_target, surface->texture_level,
+ GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
}
- if(This->texture_name_srgb)
+ if (surface->texture_name_srgb)
{
- surface_bind_and_dirtify(This, TRUE);
- glTexImage2D(This->texture_target, This->texture_level,
- GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
+ surface_bind_and_dirtify(surface, TRUE);
+ glTexImage2D(surface->texture_target, surface->texture_level,
+ GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
}
glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
LEAVE_GL();
context_release(context);
- IWineD3DSurface_ModifyLocation(iface, SFLAG_INSRGBTEX, FALSE);
- IWineD3DSurface_ModifyLocation(iface, SFLAG_INTEXTURE, FALSE);
- surface_force_reload(iface);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INSRGBTEX, FALSE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INTEXTURE, FALSE);
+ surface_force_reload(surface);
}
static HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHDC)
@@ -1720,7 +2046,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHD
if(!This->hDC) {
if(This->Flags & SFLAG_CLIENT) {
IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, NULL);
- surface_release_client_storage(iface);
+ surface_release_client_storage(This);
}
hr = IWineD3DBaseSurfaceImpl_CreateDIBSection(iface);
if(FAILED(hr)) return WINED3DERR_INVALIDCALL;
@@ -1761,7 +2087,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHD
IWineD3DSurfaceImpl *dds_primary;
IWineD3DSwapChainImpl *swapchain;
swapchain = (IWineD3DSwapChainImpl *)This->resource.device->swapchains[0];
- dds_primary = (IWineD3DSurfaceImpl *)swapchain->frontBuffer;
+ dds_primary = swapchain->front_buffer;
if (dds_primary && dds_primary->palette)
pal = dds_primary->palette->palents;
}
@@ -1815,28 +2141,17 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_ReleaseDC(IWineD3DSurface *iface, HDC
IWineD3DSurface Internal (No mapping to directx api) parts follow
****************************************************** */
-HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_texturing, GLenum *format, GLenum *internal, GLenum *type, CONVERT_TYPES *convert, int *target_bpp, BOOL srgb_mode) {
+HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_texturing, struct wined3d_format_desc *desc, CONVERT_TYPES *convert)
+{
BOOL colorkey_active = need_alpha_ck && (This->CKeyFlags & WINEDDSD_CKSRCBLT);
- const struct GlPixelFormatDesc *glDesc = This->resource.format_desc;
IWineD3DDeviceImpl *device = This->resource.device;
- const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ BOOL blit_supported = FALSE;
+ RECT rect = {0, 0, This->pow2Width, This->pow2Height};
- /* Default values: From the surface */
- *format = glDesc->glFormat;
- *type = glDesc->glType;
+ /* Copy the default values from the surface. Below we might perform fixups */
+ /* TODO: get rid of color keying desc fixups by using e.g. a table. */
+ *desc = *This->resource.format_desc;
*convert = NO_CONVERSION;
- *target_bpp = glDesc->byte_count;
-
- if(srgb_mode) {
- *internal = glDesc->glGammaInternal;
- }
- else if (This->resource.usage & WINED3DUSAGE_RENDERTARGET
- && surface_is_offscreen((IWineD3DSurface *) This))
- {
- *internal = glDesc->rtInternal;
- } else {
- *internal = glDesc->glInternal;
- }
/* Ok, now look if we have to do any conversion */
switch(This->resource.format_desc->format)
@@ -1846,34 +2161,30 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
Paletted Texture
**************** */
- /* Use conversion when the paletted texture extension OR fragment shaders are available. When either
- * of the two is available make sure texturing is requested as neither of the two works in
- * conjunction with calls like glDraw-/glReadPixels. Further also use conversion in case of color keying.
+ blit_supported = device->blitter->blit_supported(&device->adapter->gl_info, BLIT_OP_BLIT,
+ &rect, This->resource.usage, This->resource.pool,
+ This->resource.format_desc, &rect, This->resource.usage,
+ This->resource.pool, This->resource.format_desc);
+
+ /* Use conversion when the blit_shader backend supports it. It only supports this in case of
+ * texturing. Further also use conversion in case of color keying.
* Paletted textures can be emulated using shaders but only do that for 2D purposes e.g. situations
* 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] || (device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup)
- && device->render_targets && This == (IWineD3DSurfaceImpl*)device->render_targets[0]))
+ if (!((blit_supported && device->render_targets && This == device->render_targets[0]))
|| colorkey_active || !use_texturing)
{
- *format = GL_RGBA;
- *internal = GL_RGBA;
- *type = GL_UNSIGNED_BYTE;
- *target_bpp = 4;
+ desc->glFormat = GL_RGBA;
+ desc->glInternal = GL_RGBA;
+ desc->glType = GL_UNSIGNED_BYTE;
+ desc->conv_byte_count = 4;
if(colorkey_active) {
*convert = CONVERT_PALETTED_CK;
} else {
*convert = CONVERT_PALETTED;
}
}
- 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;
- *target_bpp = 1;
- }
-
break;
case WINED3DFMT_B2G3R3_UNORM:
@@ -1890,149 +2201,40 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
case WINED3DFMT_B5G6R5_UNORM:
if (colorkey_active) {
*convert = CONVERT_CK_565;
- *format = GL_RGBA;
- *internal = GL_RGB5_A1;
- *type = GL_UNSIGNED_SHORT_5_5_5_1;
+ desc->glFormat = GL_RGBA;
+ desc->glInternal = GL_RGB5_A1;
+ desc->glType = GL_UNSIGNED_SHORT_5_5_5_1;
+ desc->conv_byte_count = 2;
}
break;
case WINED3DFMT_B5G5R5X1_UNORM:
if (colorkey_active) {
*convert = CONVERT_CK_5551;
- *format = GL_BGRA;
- *internal = GL_RGB5_A1;
- *type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+ desc->glFormat = GL_BGRA;
+ desc->glInternal = GL_RGB5_A1;
+ desc->glType = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+ desc->conv_byte_count = 2;
}
break;
case WINED3DFMT_B8G8R8_UNORM:
if (colorkey_active) {
*convert = CONVERT_CK_RGB24;
- *format = GL_RGBA;
- *internal = GL_RGBA8;
- *type = GL_UNSIGNED_INT_8_8_8_8;
- *target_bpp = 4;
+ desc->glFormat = GL_RGBA;
+ desc->glInternal = GL_RGBA8;
+ desc->glType = GL_UNSIGNED_INT_8_8_8_8;
+ desc->conv_byte_count = 4;
}
break;
case WINED3DFMT_B8G8R8X8_UNORM:
if (colorkey_active) {
*convert = CONVERT_RGB32_888;
- *format = GL_RGBA;
- *internal = GL_RGBA8;
- *type = GL_UNSIGNED_INT_8_8_8_8;
- }
- break;
-
- case WINED3DFMT_R8G8_SNORM:
- if (gl_info->supported[NV_TEXTURE_SHADER]) break;
- *convert = CONVERT_V8U8;
- *format = GL_BGR;
- *type = GL_UNSIGNED_BYTE;
- *target_bpp = 3;
- break;
-
- case WINED3DFMT_R5G5_SNORM_L6_UNORM:
- *convert = CONVERT_L6V5U5;
- if (gl_info->supported[NV_TEXTURE_SHADER])
- {
- *target_bpp = 3;
- /* Use format and types from table */
- } else {
- /* Load it into unsigned R5G6B5, swap L and V channels, and revert that in the shader */
- *target_bpp = 2;
- *format = GL_RGB;
- *type = GL_UNSIGNED_SHORT_5_6_5;
- }
- break;
-
- case WINED3DFMT_R8G8_SNORM_L8X8_UNORM:
- *convert = CONVERT_X8L8V8U8;
- *target_bpp = 4;
- if (gl_info->supported[NV_TEXTURE_SHADER])
- {
- /* Use formats from gl table. It is a bit unfortunate, but the conversion
- * is needed to set the X format to 255 to get 1.0 for alpha when sampling
- * the texture. OpenGL can't use GL_DSDT8_MAG8_NV as internal format with
- * the needed type and format parameter, so the internal format contains a
- * 4th component, which is returned as alpha
- */
- } else {
- *format = GL_BGRA;
- *type = GL_UNSIGNED_INT_8_8_8_8_REV;
- }
- break;
-
- case WINED3DFMT_R8G8B8A8_SNORM:
- if (gl_info->supported[NV_TEXTURE_SHADER]) break;
- *convert = CONVERT_Q8W8V8U8;
- *format = GL_BGRA;
- *type = GL_UNSIGNED_BYTE;
- *target_bpp = 4;
- break;
-
- case WINED3DFMT_R16G16_SNORM:
- if (gl_info->supported[NV_TEXTURE_SHADER]) break;
- *convert = CONVERT_V16U16;
- *format = GL_BGR;
- *type = GL_UNSIGNED_SHORT;
- *target_bpp = 6;
- break;
-
- case WINED3DFMT_L4A4_UNORM:
- /* WINED3DFMT_L4A4_UNORM exists as an internal gl format, but for some reason there is not
- * format+type combination to load it. Thus convert it to A8L8, then load it
- * with A4L4 internal, but A8L8 format+type
- */
- *convert = CONVERT_A4L4;
- *format = GL_LUMINANCE_ALPHA;
- *type = GL_UNSIGNED_BYTE;
- *target_bpp = 2;
- break;
-
- case WINED3DFMT_R16G16_UNORM:
- *convert = CONVERT_G16R16;
- *format = GL_RGB;
- *type = GL_UNSIGNED_SHORT;
- *target_bpp = 6;
- break;
-
- case WINED3DFMT_R16G16_FLOAT:
- *convert = CONVERT_R16G16F;
- *format = GL_RGB;
- *type = GL_HALF_FLOAT_ARB;
- *target_bpp = 6;
- break;
-
- case WINED3DFMT_R32G32_FLOAT:
- *convert = CONVERT_R32G32F;
- *format = GL_RGB;
- *type = GL_FLOAT;
- *target_bpp = 12;
- break;
-
- case WINED3DFMT_S1_UINT_D15_UNORM:
- if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT]
- || gl_info->supported[EXT_PACKED_DEPTH_STENCIL])
- {
- *convert = CONVERT_D15S1;
- *target_bpp = 4;
- }
- break;
-
- case WINED3DFMT_S4X4_UINT_D24_UNORM:
- if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT]
- || gl_info->supported[EXT_PACKED_DEPTH_STENCIL])
- {
- *convert = CONVERT_D24X4S4;
- }
- break;
-
- case WINED3DFMT_S8_UINT_D24_FLOAT:
- if (gl_info->supported[ARB_DEPTH_BUFFER_FLOAT])
- {
- *convert = CONVERT_D24FS8;
- *target_bpp = 8;
+ desc->glFormat = GL_RGBA;
+ desc->glInternal = GL_RGBA8;
+ desc->glType = GL_UNSIGNED_INT_8_8_8_8;
+ desc->conv_byte_count = 4;
}
break;
@@ -2043,7 +2245,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
return WINED3D_OK;
}
-static void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *This, BYTE table[256][4], BOOL colorkey)
+void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *This, BYTE table[256][4], BOOL colorkey)
{
IWineD3DDeviceImpl *device = This->resource.device;
IWineD3DPaletteImpl *pal = This->palette;
@@ -2126,8 +2328,6 @@ static void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *This, BYTE table[256][4]
static HRESULT d3dfmt_convert_surface(const BYTE *src, BYTE *dst, UINT pitch, UINT width,
UINT height, UINT outpitch, CONVERT_TYPES convert, IWineD3DSurfaceImpl *This)
{
- IWineD3DDeviceImpl *device = This->resource.device;
- const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
const BYTE *source;
BYTE *dest;
TRACE("(%p)->(%p),(%d,%d,%d,%d,%p)\n", src, dst, pitch, height, outpitch, convert,This);
@@ -2273,338 +2473,12 @@ static HRESULT d3dfmt_convert_surface(const BYTE *src, BYTE *dst, UINT pitch, UI
}
break;
- case CONVERT_V8U8:
- {
- unsigned int x, y;
- const short *Source;
- unsigned char *Dest;
- for(y = 0; y < height; y++) {
- Source = (const short *)(src + y * pitch);
- Dest = dst + y * outpitch;
- for (x = 0; x < width; x++ ) {
- long color = (*Source++);
- /* B */ Dest[0] = 0xff;
- /* G */ Dest[1] = (color >> 8) + 128; /* V */
- /* R */ Dest[2] = (color) + 128; /* U */
- Dest += 3;
- }
- }
- break;
- }
-
- case CONVERT_V16U16:
- {
- unsigned int x, y;
- const DWORD *Source;
- unsigned short *Dest;
- for(y = 0; y < height; y++) {
- Source = (const DWORD *)(src + y * pitch);
- Dest = (unsigned short *) (dst + y * outpitch);
- for (x = 0; x < width; x++ ) {
- DWORD color = (*Source++);
- /* B */ Dest[0] = 0xffff;
- /* G */ Dest[1] = (color >> 16) + 32768; /* V */
- /* R */ Dest[2] = (color ) + 32768; /* U */
- Dest += 3;
- }
- }
- break;
- }
-
- case CONVERT_Q8W8V8U8:
- {
- unsigned int x, y;
- const DWORD *Source;
- unsigned char *Dest;
- for(y = 0; y < height; y++) {
- Source = (const DWORD *)(src + y * pitch);
- Dest = dst + y * outpitch;
- for (x = 0; x < width; x++ ) {
- long color = (*Source++);
- /* B */ Dest[0] = ((color >> 16) & 0xff) + 128; /* W */
- /* G */ Dest[1] = ((color >> 8 ) & 0xff) + 128; /* V */
- /* R */ Dest[2] = (color & 0xff) + 128; /* U */
- /* A */ Dest[3] = ((color >> 24) & 0xff) + 128; /* Q */
- Dest += 4;
- }
- }
- break;
- }
-
- case CONVERT_L6V5U5:
- {
- unsigned int x, y;
- const WORD *Source;
- unsigned char *Dest;
-
- if (gl_info->supported[NV_TEXTURE_SHADER])
- {
- /* This makes the gl surface bigger(24 bit instead of 16), but it works with
- * fixed function and shaders without further conversion once the surface is
- * loaded
- */
- for(y = 0; y < height; y++) {
- Source = (const WORD *)(src + y * pitch);
- Dest = dst + y * outpitch;
- for (x = 0; x < width; x++ ) {
- short color = (*Source++);
- unsigned char l = ((color >> 10) & 0xfc);
- char v = ((color >> 5) & 0x3e);
- char u = ((color ) & 0x1f);
-
- /* 8 bits destination, 6 bits source, 8th bit is the sign. gl ignores the sign
- * and doubles the positive range. Thus shift left only once, gl does the 2nd
- * shift. GL reads a signed value and converts it into an unsigned value.
- */
- /* M */ Dest[2] = l << 1;
-
- /* Those are read as signed, but kept signed. Just left-shift 3 times to scale
- * from 5 bit values to 8 bit values.
- */
- /* V */ Dest[1] = v << 3;
- /* U */ Dest[0] = u << 3;
- Dest += 3;
- }
- }
- } else {
- for(y = 0; y < height; y++) {
- unsigned short *Dest_s = (unsigned short *) (dst + y * outpitch);
- Source = (const WORD *)(src + y * pitch);
- for (x = 0; x < width; x++ ) {
- short color = (*Source++);
- unsigned char l = ((color >> 10) & 0xfc);
- short v = ((color >> 5) & 0x3e);
- short u = ((color ) & 0x1f);
- short v_conv = v + 16;
- short u_conv = u + 16;
-
- *Dest_s = ((v_conv << 11) & 0xf800) | ((l << 5) & 0x7e0) | (u_conv & 0x1f);
- Dest_s += 1;
- }
- }
- }
- break;
- }
-
- case CONVERT_X8L8V8U8:
- {
- unsigned int x, y;
- const DWORD *Source;
- unsigned char *Dest;
-
- if (gl_info->supported[NV_TEXTURE_SHADER])
- {
- /* This implementation works with the fixed function pipeline and shaders
- * without further modification after converting the surface.
- */
- for(y = 0; y < height; y++) {
- Source = (const DWORD *)(src + y * pitch);
- Dest = dst + y * outpitch;
- for (x = 0; x < width; x++ ) {
- long color = (*Source++);
- /* L */ Dest[2] = ((color >> 16) & 0xff); /* L */
- /* V */ Dest[1] = ((color >> 8 ) & 0xff); /* V */
- /* U */ Dest[0] = (color & 0xff); /* U */
- /* I */ Dest[3] = 255; /* X */
- Dest += 4;
- }
- }
- } else {
- /* Doesn't work correctly with the fixed function pipeline, but can work in
- * shaders if the shader is adjusted. (There's no use for this format in gl's
- * standard fixed function pipeline anyway).
- */
- for(y = 0; y < height; y++) {
- Source = (const DWORD *)(src + y * pitch);
- Dest = dst + y * outpitch;
- for (x = 0; x < width; x++ ) {
- long color = (*Source++);
- /* B */ Dest[0] = ((color >> 16) & 0xff); /* L */
- /* G */ Dest[1] = ((color >> 8 ) & 0xff) + 128; /* V */
- /* R */ Dest[2] = (color & 0xff) + 128; /* U */
- Dest += 4;
- }
- }
- }
- break;
- }
-
- case CONVERT_A4L4:
- {
- unsigned int x, y;
- const unsigned char *Source;
- unsigned char *Dest;
- for(y = 0; y < height; y++) {
- Source = src + y * pitch;
- Dest = dst + y * outpitch;
- for (x = 0; x < width; x++ ) {
- unsigned char color = (*Source++);
- /* A */ Dest[1] = (color & 0xf0) << 0;
- /* L */ Dest[0] = (color & 0x0f) << 4;
- Dest += 2;
- }
- }
- break;
- }
-
- case CONVERT_G16R16:
- case CONVERT_R16G16F:
- {
- unsigned int x, y;
- const WORD *Source;
- WORD *Dest;
-
- for(y = 0; y < height; y++) {
- Source = (const WORD *)(src + y * pitch);
- Dest = (WORD *) (dst + y * outpitch);
- for (x = 0; x < width; x++ ) {
- WORD green = (*Source++);
- WORD red = (*Source++);
- Dest[0] = green;
- Dest[1] = red;
- /* Strictly speaking not correct for R16G16F, but it doesn't matter because the
- * shader overwrites it anyway
- */
- Dest[2] = 0xffff;
- Dest += 3;
- }
- }
- break;
- }
-
- case CONVERT_R32G32F:
- {
- unsigned int x, y;
- const float *Source;
- float *Dest;
- for(y = 0; y < height; y++) {
- Source = (const float *)(src + y * pitch);
- Dest = (float *) (dst + y * outpitch);
- for (x = 0; x < width; x++ ) {
- float green = (*Source++);
- float red = (*Source++);
- Dest[0] = green;
- Dest[1] = red;
- Dest[2] = 1.0f;
- Dest += 3;
- }
- }
- break;
- }
-
- case CONVERT_D15S1:
- {
- unsigned int x, y;
-
- for (y = 0; y < height; ++y)
- {
- const WORD *source = (const WORD *)(src + y * pitch);
- DWORD *dest = (DWORD *)(dst + y * outpitch);
-
- for (x = 0; x < width; ++x)
- {
- /* The depth data is normalized, so needs to be scaled,
- * the stencil data isn't. Scale depth data by
- * (2^24-1)/(2^15-1) ~~ (2^9 + 2^-6). */
- WORD d15 = source[x] >> 1;
- DWORD d24 = (d15 << 9) + (d15 >> 6);
- dest[x] = (d24 << 8) | (source[x] & 0x1);
- }
- }
- break;
- }
-
- case CONVERT_D24X4S4:
- {
- unsigned int x, y;
-
- for (y = 0; y < height; ++y)
- {
- const DWORD *source = (const DWORD *)(src + y * pitch);
- DWORD *dest = (DWORD *)(dst + y * outpitch);
-
- for (x = 0; x < width; ++x)
- {
- /* Just need to clear out the X4 part. */
- dest[x] = source[x] & ~0xf0;
- }
- }
- break;
- }
-
- case CONVERT_D24FS8:
- {
- unsigned int x, y;
-
- for (y = 0; y < height; ++y)
- {
- const DWORD *source = (const DWORD *)(src + y * pitch);
- float *dest_f = (float *)(dst + y * outpitch);
- DWORD *dest_s = (DWORD *)(dst + y * outpitch);
-
- for (x = 0; x < width; ++x)
- {
- dest_f[x * 2] = float_24_to_32((source[x] & 0xffffff00) >> 8);
- dest_s[x * 2 + 1] = source[x] & 0xff;
- }
- }
- break;
- }
-
default:
ERR("Unsupported conversion type %#x.\n", convert);
}
return WINED3D_OK;
}
-/* This function is used in case of 8bit paletted textures to upload the palette.
- It supports GL_EXT_paletted_texture and GL_ARB_fragment_program, support for other
- extensions like ATI_fragment_shaders is possible.
-*/
-/* Context activation is done by the caller. */
-static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES convert) {
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- BYTE table[256][4];
- IWineD3DDeviceImpl *device = This->resource.device;
- const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
-
- d3dfmt_p8_init_palette(This, table, (convert == CONVERT_PALETTED_CK));
-
- /* Try to use the paletted texture extension */
- if (gl_info->supported[EXT_PALETTED_TEXTURE])
- {
- TRACE("Using GL_EXT_PALETTED_TEXTURE for 8-bit paletted texture support\n");
- ENTER_GL();
- GL_EXTCALL(glColorTableEXT(This->texture_target, GL_RGBA, 256, GL_RGBA, GL_UNSIGNED_BYTE, table));
- LEAVE_GL();
- }
- else
- {
- /* Let a fragment shader do the color conversion by uploading the palette to a 1D texture.
- * 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();
- GL_EXTCALL(glActiveTextureARB(GL_TEXTURE1));
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
-
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /* Make sure we have discrete color levels. */
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, table); /* Upload the palette */
-
- /* Switch back to unit 0 in which the 2D texture will be stored. */
- GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0));
-
- /* Rebind the texture because it isn't bound anymore */
- glBindTexture(This->texture_target, This->texture_name);
- LEAVE_GL();
- }
-}
-
BOOL palette9_changed(IWineD3DSurfaceImpl *This)
{
IWineD3DDeviceImpl *device = This->resource.device;
@@ -2827,7 +2701,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_SaveSnapshot(IWineD3DSurface *iface, c
LEAVE_GL();
} else { /* bind the real texture, and make sure it up to date */
- surface_internal_preload(iface, SRGB_RGB);
+ surface_internal_preload(This, SRGB_RGB);
surface_bind_and_dirtify(This, FALSE);
}
allocatedMemory = HeapAlloc(GetProcessHeap(), 0, width * height * 4);
@@ -2948,9 +2822,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_SetMem(IWineD3DSurface *iface, void *M
IWineD3DSurface_ModifyLocation(iface, SFLAG_INSYSMEM, TRUE);
/* For client textures opengl has to be notified */
- if(This->Flags & SFLAG_CLIENT) {
- surface_release_client_storage(iface);
- }
+ if (This->Flags & SFLAG_CLIENT)
+ surface_release_client_storage(This);
/* Now free the old memory if any */
HeapFree(GetProcessHeap(), 0, release);
@@ -2961,9 +2834,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_SetMem(IWineD3DSurface *iface, void *M
if(This->resource.heapMemory != NULL) ERR("User pointer surface has heap memory allocated\n");
This->Flags &= ~SFLAG_USERPTR;
- if(This->Flags & SFLAG_CLIENT) {
- surface_release_client_storage(iface);
- }
+ if (This->Flags & SFLAG_CLIENT)
+ surface_release_client_storage(This);
}
return WINED3D_OK;
}
@@ -3099,7 +2971,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Flip(IWineD3DSurface *iface, IWineD3DS
}
/* Flipping a OpenGL surface -> Use WineD3DDevice::Present */
- hr = IWineD3DSwapChain_Present((IWineD3DSwapChain *) swapchain, NULL, NULL, 0, NULL, 0);
+ hr = IWineD3DSwapChain_Present((IWineD3DSwapChain *)swapchain,
+ NULL, NULL, swapchain->win_handle, NULL, 0);
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
return hr;
}
@@ -3107,36 +2980,48 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Flip(IWineD3DSurface *iface, IWineD3DS
/* Does a direct frame buffer -> texture copy. Stretching is done
* with single pixel copy calls
*/
-static inline void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *This, IWineD3DSurface *SrcSurface,
- const WINED3DRECT *srect, const WINED3DRECT *drect, BOOL upsidedown, WINED3DTEXTUREFILTERTYPE Filter)
+static void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *dst_surface, IWineD3DSurfaceImpl *src_surface,
+ const RECT *src_rect, const RECT *dst_rect_in, WINED3DTEXTUREFILTERTYPE Filter)
{
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = dst_surface->resource.device;
float xrel, yrel;
UINT row;
- IWineD3DSurfaceImpl *Src = (IWineD3DSurfaceImpl *) SrcSurface;
struct wined3d_context *context;
+ BOOL upsidedown = FALSE;
+ RECT dst_rect = *dst_rect_in;
+ /* Make sure that the top pixel is always above the bottom pixel, and keep a separate upside down flag
+ * glCopyTexSubImage is a bit picky about the parameters we pass to it
+ */
+ if(dst_rect.top > dst_rect.bottom) {
+ UINT tmp = dst_rect.bottom;
+ dst_rect.bottom = dst_rect.top;
+ dst_rect.top = tmp;
+ upsidedown = TRUE;
+ }
- context = context_acquire(myDevice, SrcSurface, CTXUSAGE_BLIT);
- surface_internal_preload((IWineD3DSurface *) This, SRGB_RGB);
+ context = context_acquire(device, src_surface);
+ context_apply_blit_state(context, device);
+ surface_internal_preload(dst_surface, SRGB_RGB);
ENTER_GL();
/* Bind the target texture */
- glBindTexture(This->texture_target, This->texture_name);
+ glBindTexture(dst_surface->texture_target, dst_surface->texture_name);
checkGLcall("glBindTexture");
- if(surface_is_offscreen(SrcSurface)) {
+ if (surface_is_offscreen(src_surface))
+ {
TRACE("Reading from an offscreen target\n");
upsidedown = !upsidedown;
- glReadBuffer(myDevice->offscreenBuffer);
+ glReadBuffer(device->offscreenBuffer);
}
else
{
- glReadBuffer(surface_get_gl_buffer(SrcSurface));
+ glReadBuffer(surface_get_gl_buffer(src_surface));
}
checkGLcall("glReadBuffer");
- xrel = (float) (srect->x2 - srect->x1) / (float) (drect->x2 - drect->x1);
- yrel = (float) (srect->y2 - srect->y1) / (float) (drect->y2 - drect->y1);
+ xrel = (float) (src_rect->right - src_rect->left) / (float) (dst_rect.right - dst_rect.left);
+ yrel = (float) (src_rect->bottom - src_rect->top) / (float) (dst_rect.bottom - dst_rect.top);
if ((xrel - 1.0f < -eps) || (xrel - 1.0f > eps))
{
@@ -3158,19 +3043,19 @@ static inline void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *This, IWineD3D
{
/* Upside down copy without stretching is nice, one glCopyTexSubImage call will do */
- glCopyTexSubImage2D(This->texture_target, This->texture_level,
- drect->x1 /*xoffset */, drect->y1 /* y offset */,
- srect->x1, Src->currentDesc.Height - srect->y2,
- drect->x2 - drect->x1, drect->y2 - drect->y1);
+ glCopyTexSubImage2D(dst_surface->texture_target, dst_surface->texture_level,
+ dst_rect.left /*xoffset */, dst_rect.top /* y offset */,
+ src_rect->left, src_surface->currentDesc.Height - src_rect->bottom,
+ dst_rect.right - dst_rect.left, dst_rect.bottom - dst_rect.top);
} else {
- UINT yoffset = Src->currentDesc.Height - srect->y1 + drect->y1 - 1;
+ UINT yoffset = src_surface->currentDesc.Height - src_rect->top + dst_rect.top - 1;
/* I have to process this row by row to swap the image,
* otherwise it would be upside down, so stretching in y direction
* doesn't cost extra time
*
* However, stretching in x direction can be avoided if not necessary
*/
- for(row = drect->y1; row < drect->y2; row++) {
+ for(row = dst_rect.top; row < dst_rect.bottom; row++) {
if ((xrel - 1.0f < -eps) || (xrel - 1.0f > eps))
{
/* Well, that stuff works, but it's very slow.
@@ -3178,15 +3063,18 @@ static inline void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *This, IWineD3D
*/
UINT col;
- for(col = drect->x1; col < drect->x2; col++) {
- glCopyTexSubImage2D(This->texture_target, This->texture_level,
- drect->x1 + col /* x offset */, row /* y offset */,
- srect->x1 + col * xrel, yoffset - (int) (row * yrel), 1, 1);
+ for (col = dst_rect.left; col < dst_rect.right; ++col)
+ {
+ glCopyTexSubImage2D(dst_surface->texture_target, dst_surface->texture_level,
+ dst_rect.left + col /* x offset */, row /* y offset */,
+ src_rect->left + col * xrel, yoffset - (int) (row * yrel), 1, 1);
}
- } else {
- glCopyTexSubImage2D(This->texture_target, This->texture_level,
- drect->x1 /* x offset */, row /* y offset */,
- srect->x1, yoffset - (int) (row * yrel), drect->x2-drect->x1, 1);
+ }
+ else
+ {
+ glCopyTexSubImage2D(dst_surface->texture_target, dst_surface->texture_level,
+ dst_rect.left /* x offset */, row /* y offset */,
+ src_rect->left, yoffset - (int) (row * yrel), dst_rect.right - dst_rect.left, 1);
}
}
}
@@ -3198,37 +3086,39 @@ static inline void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *This, IWineD3D
/* The texture is now most up to date - If the surface is a render target and has a drawable, this
* path is never entered
*/
- IWineD3DSurface_ModifyLocation((IWineD3DSurface *) This, SFLAG_INTEXTURE, TRUE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)dst_surface, SFLAG_INTEXTURE, TRUE);
}
/* Uses the hardware to stretch and flip the image */
-static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWineD3DSurface *SrcSurface,
- IWineD3DSwapChainImpl *swapchain, const WINED3DRECT *srect, const WINED3DRECT *drect,
- BOOL upsidedown, WINED3DTEXTUREFILTERTYPE Filter)
+static void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *dst_surface, IWineD3DSurfaceImpl *src_surface,
+ const RECT *src_rect, const RECT *dst_rect_in, WINED3DTEXTUREFILTERTYPE Filter)
{
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = dst_surface->resource.device;
GLuint src, backup = 0;
- IWineD3DSurfaceImpl *Src = (IWineD3DSurfaceImpl *) SrcSurface;
+ IWineD3DSwapChainImpl *src_swapchain = NULL;
float left, right, top, bottom; /* Texture coordinates */
- UINT fbwidth = Src->currentDesc.Width;
- UINT fbheight = Src->currentDesc.Height;
+ UINT fbwidth = src_surface->currentDesc.Width;
+ UINT fbheight = src_surface->currentDesc.Height;
struct wined3d_context *context;
GLenum drawBuffer = GL_BACK;
GLenum texture_target;
BOOL noBackBufferBackup;
BOOL src_offscreen;
+ BOOL upsidedown = FALSE;
+ RECT dst_rect = *dst_rect_in;
TRACE("Using hwstretch blit\n");
/* Activate the Proper context for reading from the source surface, set it up for blitting */
- context = context_acquire(myDevice, SrcSurface, CTXUSAGE_BLIT);
- surface_internal_preload((IWineD3DSurface *) This, SRGB_RGB);
+ context = context_acquire(device, src_surface);
+ context_apply_blit_state(context, device);
+ surface_internal_preload(dst_surface, SRGB_RGB);
- src_offscreen = surface_is_offscreen(SrcSurface);
+ src_offscreen = surface_is_offscreen(src_surface);
noBackBufferBackup = src_offscreen && wined3d_settings.offscreen_rendering_mode == ORM_FBO;
- if (!noBackBufferBackup && !Src->texture_name)
+ if (!noBackBufferBackup && !src_surface->texture_name)
{
/* Get it a description */
- surface_internal_preload(SrcSurface, SRGB_RGB);
+ surface_internal_preload(src_surface, SRGB_RGB);
}
ENTER_GL();
@@ -3240,7 +3130,7 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
/* Got more than one aux buffer? Use the 2nd aux buffer */
drawBuffer = GL_AUX1;
}
- else if ((!src_offscreen || myDevice->offscreenBuffer == GL_BACK) && context->aux_buffers >= 1)
+ else if ((!src_offscreen || device->offscreenBuffer == GL_BACK) && context->aux_buffers >= 1)
{
/* Only one aux buffer, but it isn't used (Onscreen rendering, or non-aux orm)? Use it! */
drawBuffer = GL_AUX0;
@@ -3256,25 +3146,35 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
/* Backup the back buffer and copy the source buffer into a texture to draw an upside down stretched quad. If
* we are reading from the back buffer, the backup can be used as source texture
*/
- texture_target = Src->texture_target;
- glBindTexture(texture_target, Src->texture_name);
- checkGLcall("glBindTexture(texture_target, Src->texture_name)");
+ texture_target = src_surface->texture_target;
+ glBindTexture(texture_target, src_surface->texture_name);
+ checkGLcall("glBindTexture(texture_target, src_surface->texture_name)");
glEnable(texture_target);
checkGLcall("glEnable(texture_target)");
/* For now invalidate the texture copy of the back buffer. Drawable and sysmem copy are untouched */
- Src->Flags &= ~SFLAG_INTEXTURE;
+ src_surface->Flags &= ~SFLAG_INTEXTURE;
+ }
+
+ /* Make sure that the top pixel is always above the bottom pixel, and keep a separate upside down flag
+ * glCopyTexSubImage is a bit picky about the parameters we pass to it
+ */
+ if(dst_rect.top > dst_rect.bottom) {
+ UINT tmp = dst_rect.bottom;
+ dst_rect.bottom = dst_rect.top;
+ dst_rect.top = tmp;
+ upsidedown = TRUE;
}
if (src_offscreen)
{
TRACE("Reading from an offscreen target\n");
upsidedown = !upsidedown;
- glReadBuffer(myDevice->offscreenBuffer);
+ glReadBuffer(device->offscreenBuffer);
}
else
{
- glReadBuffer(surface_get_gl_buffer(SrcSurface));
+ glReadBuffer(surface_get_gl_buffer(src_surface));
}
/* TODO: Only back up the part that will be overwritten */
@@ -3294,9 +3194,14 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
wined3d_gl_min_mip_filter(minMipLookup, Filter, WINED3DTEXF_NONE));
checkGLcall("glTexParameteri");
- if(!swapchain || (IWineD3DSurface *) Src == swapchain->backBuffer[0]) {
- src = backup ? backup : Src->texture_name;
- } else {
+ IWineD3DSurface_GetContainer((IWineD3DSurface *)src_surface, &IID_IWineD3DSwapChain, (void **)&src_swapchain);
+ if (src_swapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *)src_swapchain);
+ if (!src_swapchain || src_surface == src_swapchain->back_buffers[0])
+ {
+ src = backup ? backup : src_surface->texture_name;
+ }
+ else
+ {
glReadBuffer(GL_FRONT);
checkGLcall("glReadBuffer(GL_FRONT)");
@@ -3305,11 +3210,11 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
glBindTexture(GL_TEXTURE_2D, src);
checkGLcall("glBindTexture(GL_TEXTURE_2D, src)");
- /* TODO: Only copy the part that will be read. Use srect->x1, srect->y2 as origin, but with the width watch
+ /* TODO: Only copy the part that will be read. Use src_rect->left, src_rect->bottom as origin, but with the width watch
* out for power of 2 sizes
*/
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Src->pow2Width, Src->pow2Height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, src_surface->pow2Width,
+ src_surface->pow2Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
checkGLcall("glTexImage2D");
glCopyTexSubImage2D(GL_TEXTURE_2D, 0,
0, 0 /* read offsets */,
@@ -3333,22 +3238,26 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
}
checkGLcall("glEnd and previous");
- left = srect->x1;
- right = srect->x2;
+ left = src_rect->left;
+ right = src_rect->right;
- if(upsidedown) {
- top = Src->currentDesc.Height - srect->y1;
- bottom = Src->currentDesc.Height - srect->y2;
- } else {
- top = Src->currentDesc.Height - srect->y2;
- bottom = Src->currentDesc.Height - srect->y1;
+ if (upsidedown)
+ {
+ top = src_surface->currentDesc.Height - src_rect->top;
+ bottom = src_surface->currentDesc.Height - src_rect->bottom;
+ }
+ else
+ {
+ top = src_surface->currentDesc.Height - src_rect->bottom;
+ bottom = src_surface->currentDesc.Height - src_rect->top;
}
- if(Src->Flags & SFLAG_NORMCOORD) {
- left /= Src->pow2Width;
- right /= Src->pow2Width;
- top /= Src->pow2Height;
- bottom /= Src->pow2Height;
+ if (src_surface->Flags & SFLAG_NORMCOORD)
+ {
+ left /= src_surface->pow2Width;
+ right /= src_surface->pow2Width;
+ top /= src_surface->pow2Height;
+ bottom /= src_surface->pow2Height;
}
/* draw the source texture stretched and upside down. The correct surface is bound already */
@@ -3365,33 +3274,33 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
/* top left */
glTexCoord2f(left, top);
- glVertex2i(0, fbheight - drect->y2 - drect->y1);
+ glVertex2i(0, fbheight - dst_rect.bottom - dst_rect.top);
/* top right */
glTexCoord2f(right, top);
- glVertex2i(drect->x2 - drect->x1, fbheight - drect->y2 - drect->y1);
+ glVertex2i(dst_rect.right - dst_rect.left, fbheight - dst_rect.bottom - dst_rect.top);
/* bottom right */
glTexCoord2f(right, bottom);
- glVertex2i(drect->x2 - drect->x1, fbheight);
+ glVertex2i(dst_rect.right - dst_rect.left, fbheight);
glEnd();
checkGLcall("glEnd and previous");
- if (texture_target != This->texture_target)
+ if (texture_target != dst_surface->texture_target)
{
glDisable(texture_target);
- glEnable(This->texture_target);
- texture_target = This->texture_target;
+ glEnable(dst_surface->texture_target);
+ texture_target = dst_surface->texture_target;
}
/* Now read the stretched and upside down image into the destination texture */
- glBindTexture(texture_target, This->texture_name);
+ glBindTexture(texture_target, dst_surface->texture_name);
checkGLcall("glBindTexture");
glCopyTexSubImage2D(texture_target,
0,
- drect->x1, drect->y1, /* xoffset, yoffset */
+ dst_rect.left, dst_rect.top, /* xoffset, yoffset */
0, 0, /* We blitted the image to the origin */
- drect->x2 - drect->x1, drect->y2 - drect->y1);
+ dst_rect.right - dst_rect.left, dst_rect.bottom - dst_rect.top);
checkGLcall("glCopyTexSubImage2D");
if(drawBuffer == GL_BACK) {
@@ -3404,20 +3313,22 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
}
glBindTexture(GL_TEXTURE_2D, backup);
checkGLcall("glBindTexture(GL_TEXTURE_2D, backup)");
- } else {
- if (texture_target != Src->texture_target)
+ }
+ else
+ {
+ if (texture_target != src_surface->texture_target)
{
glDisable(texture_target);
- glEnable(Src->texture_target);
- texture_target = Src->texture_target;
+ glEnable(src_surface->texture_target);
+ texture_target = src_surface->texture_target;
}
- glBindTexture(Src->texture_target, Src->texture_name);
- checkGLcall("glBindTexture(Src->texture_target, Src->texture_name)");
+ glBindTexture(src_surface->texture_target, src_surface->texture_name);
+ checkGLcall("glBindTexture(src_surface->texture_target, src_surface->texture_name)");
}
glBegin(GL_QUADS);
/* top left */
- glTexCoord2f(0.0f, (float)fbheight / (float)Src->pow2Height);
+ glTexCoord2f(0.0f, (float)fbheight / (float)src_surface->pow2Height);
glVertex2i(0, 0);
/* bottom left */
@@ -3425,11 +3336,12 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
glVertex2i(0, fbheight);
/* bottom right */
- glTexCoord2f((float)fbwidth / (float)Src->pow2Width, 0.0f);
- glVertex2i(fbwidth, Src->currentDesc.Height);
+ glTexCoord2f((float)fbwidth / (float)src_surface->pow2Width, 0.0f);
+ glVertex2i(fbwidth, src_surface->currentDesc.Height);
/* top right */
- glTexCoord2f((float) fbwidth / (float) Src->pow2Width, (float) fbheight / (float) Src->pow2Height);
+ glTexCoord2f((float)fbwidth / (float)src_surface->pow2Width,
+ (float)fbheight / (float)src_surface->pow2Height);
glVertex2i(fbwidth, 0);
glEnd();
}
@@ -3437,7 +3349,7 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
checkGLcall("glDisable(texture_target)");
/* Cleanup */
- if (src != Src->texture_name && src != backup)
+ if (src != src_surface->texture_name && src != backup)
{
glDeleteTextures(1, &src);
checkGLcall("glDeleteTextures(1, &src)");
@@ -3449,48 +3361,76 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
LEAVE_GL();
- wglFlush(); /* Flush to ensure ordering across contexts. */
+ if (wined3d_settings.strict_draw_ordering) 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
* path is never entered
*/
- IWineD3DSurface_ModifyLocation((IWineD3DSurface *) This, SFLAG_INTEXTURE, TRUE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)dst_surface, SFLAG_INTEXTURE, TRUE);
+}
+
+/* Until the blit_shader is ready, define some prototypes here. */
+static BOOL fbo_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op,
+ const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool,
+ const struct wined3d_format_desc *src_format_desc,
+ const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool,
+ const struct wined3d_format_desc *dst_format_desc);
+
+/* Front buffer coordinates are always full screen coordinates, but our GL
+ * drawable is limited to the window's client area. The sysmem and texture
+ * copies do have the full screen size. Note that GL has a bottom-left
+ * origin, while D3D has a top-left origin. */
+void surface_translate_frontbuffer_coords(IWineD3DSurfaceImpl *surface, HWND window, RECT *rect)
+{
+ POINT offset = {0, surface->currentDesc.Height};
+ RECT windowsize;
+
+ GetClientRect(window, &windowsize);
+ offset.y -= windowsize.bottom - windowsize.top;
+ ScreenToClient(window, &offset);
+ OffsetRect(rect, offset.x, offset.y);
}
/* Not called from the VTable */
-static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const RECT *DestRect,
- IWineD3DSurface *SrcSurface, const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx,
+static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *dst_surface, const RECT *DestRect,
+ IWineD3DSurfaceImpl *src_surface, const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx,
WINED3DTEXTUREFILTERTYPE Filter)
{
- IWineD3DDeviceImpl *myDevice = This->resource.device;
- WINED3DRECT rect;
+ IWineD3DDeviceImpl *device = dst_surface->resource.device;
IWineD3DSwapChainImpl *srcSwapchain = NULL, *dstSwapchain = NULL;
- IWineD3DSurfaceImpl *Src = (IWineD3DSurfaceImpl *) SrcSurface;
+ RECT dst_rect, src_rect;
- TRACE("(%p)->(%p,%p,%p,%08x,%p)\n", This, DestRect, SrcSurface, SrcRect, Flags, DDBltFx);
+ TRACE("dst_surface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, blt_fx %p, filter %s.\n",
+ dst_surface, wine_dbgstr_rect(DestRect), src_surface, wine_dbgstr_rect(SrcRect),
+ Flags, DDBltFx, debug_d3dtexturefiltertype(Filter));
/* Get the swapchain. One of the surfaces has to be a primary surface */
- if(This->resource.pool == WINED3DPOOL_SYSTEMMEM) {
+ if (dst_surface->resource.pool == WINED3DPOOL_SYSTEMMEM)
+ {
WARN("Destination is in sysmem, rejecting gl blt\n");
return WINED3DERR_INVALIDCALL;
}
- IWineD3DSurface_GetContainer( (IWineD3DSurface *) This, &IID_IWineD3DSwapChain, (void **)&dstSwapchain);
- if(dstSwapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *) dstSwapchain);
- if(Src) {
- if(Src->resource.pool == WINED3DPOOL_SYSTEMMEM) {
+ IWineD3DSurface_GetContainer((IWineD3DSurface *)dst_surface, &IID_IWineD3DSwapChain, (void **)&dstSwapchain);
+ if (dstSwapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *)dstSwapchain);
+ if (src_surface)
+ {
+ if (src_surface->resource.pool == WINED3DPOOL_SYSTEMMEM)
+ {
WARN("Src is in sysmem, rejecting gl blt\n");
return WINED3DERR_INVALIDCALL;
}
- IWineD3DSurface_GetContainer( (IWineD3DSurface *) Src, &IID_IWineD3DSwapChain, (void **)&srcSwapchain);
- if(srcSwapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *) srcSwapchain);
+ IWineD3DSurface_GetContainer((IWineD3DSurface *)src_surface, &IID_IWineD3DSwapChain, (void **)&srcSwapchain);
+ if (srcSwapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *)srcSwapchain);
}
/* Early sort out of cases where no render target is used */
- if(!dstSwapchain && !srcSwapchain &&
- SrcSurface != myDevice->render_targets[0] && This != (IWineD3DSurfaceImpl *) myDevice->render_targets[0]) {
- TRACE("No surface is render target, not using hardware blit. Src = %p, dst = %p\n", Src, This);
+ if (!dstSwapchain && !srcSwapchain
+ && src_surface != device->render_targets[0]
+ && dst_surface != device->render_targets[0])
+ {
+ TRACE("No surface is render target, not using hardware blit.\n");
return WINED3DERR_INVALIDCALL;
}
@@ -3501,21 +3441,14 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
return WINED3DERR_INVALIDCALL;
}
- if (DestRect) {
- rect.x1 = DestRect->left;
- rect.y1 = DestRect->top;
- rect.x2 = DestRect->right;
- rect.y2 = DestRect->bottom;
- } else {
- rect.x1 = 0;
- rect.y1 = 0;
- rect.x2 = This->currentDesc.Width;
- rect.y2 = This->currentDesc.Height;
- }
+ surface_get_rect(dst_surface, DestRect, &dst_rect);
+ if (src_surface) surface_get_rect(src_surface, SrcRect, &src_rect);
/* The only case where both surfaces on a swapchain are supported is a back buffer -> front buffer blit on the same swapchain */
- if(dstSwapchain && dstSwapchain == srcSwapchain && dstSwapchain->backBuffer &&
- ((IWineD3DSurface *) This == dstSwapchain->frontBuffer) && SrcSurface == dstSwapchain->backBuffer[0]) {
+ if (dstSwapchain && dstSwapchain == srcSwapchain && dstSwapchain->back_buffers
+ && dst_surface == dstSwapchain->front_buffer
+ && src_surface == dstSwapchain->back_buffers[0])
+ {
/* Half-life does a Blt from the back buffer to the front buffer,
* Full surface size, no flags... Use present instead
*
@@ -3525,57 +3458,50 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
/* Check rects - IWineD3DDevice_Present doesn't handle them */
while(1)
{
- RECT mySrcRect;
TRACE("Looking if a Present can be done...\n");
/* Source Rectangle must be full surface */
- if( SrcRect ) {
- if(SrcRect->left != 0 || SrcRect->top != 0 ||
- SrcRect->right != Src->currentDesc.Width || SrcRect->bottom != Src->currentDesc.Height) {
- TRACE("No, Source rectangle doesn't match\n");
- break;
- }
+ if (src_rect.left || src_rect.top
+ || src_rect.right != src_surface->currentDesc.Width
+ || src_rect.bottom != src_surface->currentDesc.Height)
+ {
+ TRACE("No, Source rectangle doesn't match\n");
+ break;
}
- mySrcRect.left = 0;
- mySrcRect.top = 0;
- mySrcRect.right = Src->currentDesc.Width;
- mySrcRect.bottom = Src->currentDesc.Height;
/* No stretching may occur */
- if(mySrcRect.right != rect.x2 - rect.x1 ||
- mySrcRect.bottom != rect.y2 - rect.y1) {
+ if(src_rect.right != dst_rect.right - dst_rect.left ||
+ src_rect.bottom != dst_rect.bottom - dst_rect.top) {
TRACE("No, stretching is done\n");
break;
}
/* Destination must be full surface or match the clipping rectangle */
- if(This->clipper && ((IWineD3DClipperImpl *) This->clipper)->hWnd)
+ if (dst_surface->clipper && ((IWineD3DClipperImpl *)dst_surface->clipper)->hWnd)
{
RECT cliprect;
POINT pos[2];
- GetClientRect(((IWineD3DClipperImpl *) This->clipper)->hWnd, &cliprect);
- pos[0].x = rect.x1;
- pos[0].y = rect.y1;
- pos[1].x = rect.x2;
- pos[1].y = rect.y2;
- MapWindowPoints(GetDesktopWindow(), ((IWineD3DClipperImpl *) This->clipper)->hWnd,
- pos, 2);
+ GetClientRect(((IWineD3DClipperImpl *)dst_surface->clipper)->hWnd, &cliprect);
+ pos[0].x = dst_rect.left;
+ pos[0].y = dst_rect.top;
+ pos[1].x = dst_rect.right;
+ pos[1].y = dst_rect.bottom;
+ MapWindowPoints(GetDesktopWindow(), ((IWineD3DClipperImpl *)dst_surface->clipper)->hWnd, pos, 2);
if(pos[0].x != cliprect.left || pos[0].y != cliprect.top ||
pos[1].x != cliprect.right || pos[1].y != cliprect.bottom)
{
TRACE("No, dest rectangle doesn't match(clipper)\n");
- TRACE("Clip rect at (%d,%d)-(%d,%d)\n", cliprect.left, cliprect.top, cliprect.right, cliprect.bottom);
- TRACE("Blt dest: (%d,%d)-(%d,%d)\n", rect.x1, rect.y1, rect.x2, rect.y2);
+ TRACE("Clip rect at %s\n", wine_dbgstr_rect(&cliprect));
+ TRACE("Blt dest: %s\n", wine_dbgstr_rect(&dst_rect));
break;
}
}
- else
+ else if (dst_rect.left || dst_rect.top
+ || dst_rect.right != dst_surface->currentDesc.Width
+ || dst_rect.bottom != dst_surface->currentDesc.Height)
{
- if(rect.x1 != 0 || rect.y1 != 0 ||
- rect.x2 != This->currentDesc.Width || rect.y2 != This->currentDesc.Height) {
- TRACE("No, dest rectangle doesn't match(surface size)\n");
- break;
- }
+ TRACE("No, dest rectangle doesn't match(surface size)\n");
+ break;
}
TRACE("Yes\n");
@@ -3603,7 +3529,8 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
dstSwapchain->presentParms.PresentationInterval = WINED3DPRESENT_INTERVAL_IMMEDIATE;
TRACE("Full screen back buffer -> front buffer blt, performing a flip instead\n");
- IWineD3DSwapChain_Present((IWineD3DSwapChain *) dstSwapchain, NULL, NULL, 0, NULL, 0);
+ IWineD3DSwapChain_Present((IWineD3DSwapChain *)dstSwapchain,
+ NULL, NULL, dstSwapchain->win_handle, NULL, 0);
dstSwapchain->presentParms.SwapEffect = orig_swap;
@@ -3620,21 +3547,31 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
} else if(dstSwapchain && srcSwapchain) {
FIXME("Implement hardware blit between two different swapchains\n");
return WINED3DERR_INVALIDCALL;
- } else if(dstSwapchain) {
- if(SrcSurface == myDevice->render_targets[0]) {
+ }
+ else if (dstSwapchain)
+ {
+ /* Handled with regular texture -> swapchain blit */
+ if (src_surface == device->render_targets[0])
TRACE("Blit from active render target to a swapchain\n");
- /* Handled with regular texture -> swapchain blit */
- }
- } else if(srcSwapchain && This == (IWineD3DSurfaceImpl *) myDevice->render_targets[0]) {
+ }
+ else if (srcSwapchain && dst_surface == device->render_targets[0])
+ {
FIXME("Implement blit from a swapchain to the active render target\n");
return WINED3DERR_INVALIDCALL;
}
- if((srcSwapchain || SrcSurface == myDevice->render_targets[0]) && !dstSwapchain) {
+ if ((srcSwapchain || src_surface == device->render_targets[0]) && !dstSwapchain)
+ {
/* Blit from render target to texture */
- WINED3DRECT srect;
- BOOL upsideDown, stretchx;
- BOOL paletteOverride = FALSE;
+ BOOL stretchx;
+
+ /* P8 read back is not implemented */
+ if (src_surface->resource.format_desc->format == WINED3DFMT_P8_UINT
+ || dst_surface->resource.format_desc->format == WINED3DFMT_P8_UINT)
+ {
+ TRACE("P8 read back not supported by frame buffer to texture blit\n");
+ return WINED3DERR_INVALIDCALL;
+ }
if(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE)) {
TRACE("Color keying not supported by frame buffer to texture blit\n");
@@ -3642,50 +3579,12 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
/* Destination color key is checked above */
}
- /* Make sure that the top pixel is always above the bottom pixel, and keep a separate upside down flag
- * glCopyTexSubImage is a bit picky about the parameters we pass to it
- */
- if(SrcRect) {
- if(SrcRect->top < SrcRect->bottom) {
- srect.y1 = SrcRect->top;
- srect.y2 = SrcRect->bottom;
- upsideDown = FALSE;
- } else {
- srect.y1 = SrcRect->bottom;
- srect.y2 = SrcRect->top;
- upsideDown = TRUE;
- }
- srect.x1 = SrcRect->left;
- srect.x2 = SrcRect->right;
- } else {
- srect.x1 = 0;
- srect.y1 = 0;
- srect.x2 = Src->currentDesc.Width;
- srect.y2 = Src->currentDesc.Height;
- upsideDown = FALSE;
- }
- if(rect.x1 > rect.x2) {
- UINT tmp = rect.x2;
- rect.x2 = rect.x1;
- rect.x1 = tmp;
- upsideDown = !upsideDown;
- }
-
- if(rect.x2 - rect.x1 != srect.x2 - srect.x1) {
+ if(dst_rect.right - dst_rect.left != src_rect.right - src_rect.left) {
stretchx = TRUE;
} else {
stretchx = FALSE;
}
- /* When blitting from a render target a texture, the texture isn't required to have a palette.
- * In this case grab the palette from the render target. */
- if (This->resource.format_desc->format == WINED3DFMT_P8_UINT && !This->palette)
- {
- paletteOverride = TRUE;
- TRACE("Source surface (%p) lacks palette, overriding palette with palette %p of destination surface (%p)\n", Src, This->palette, This);
- This->palette = Src->palette;
- }
-
/* Blt is a pretty powerful call, while glCopyTexSubImage2D is not. glCopyTexSubImage cannot
* flip the image nor scale it.
*
@@ -3701,92 +3600,66 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
* FBO support, so it doesn't really make sense to try and make it work with different offscreen rendering
* backends.
*/
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO
- && myDevice->adapter->gl_info.fbo_ops.glBlitFramebuffer
- && surface_can_stretch_rect(Src, This))
+ if (fbo_blit_supported(&device->adapter->gl_info, BLIT_OP_BLIT,
+ &src_rect, src_surface->resource.usage, src_surface->resource.pool, src_surface->resource.format_desc,
+ &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, dst_surface->resource.format_desc))
+ {
+ stretch_rect_fbo(device, src_surface, &src_rect, dst_surface, &dst_rect, Filter);
+ }
+ else if (!stretchx || dst_rect.right - dst_rect.left > src_surface->currentDesc.Width
+ || dst_rect.bottom - dst_rect.top > src_surface->currentDesc.Height)
{
- stretch_rect_fbo((IWineD3DDevice *)myDevice, SrcSurface, &srect,
- (IWineD3DSurface *)This, &rect, Filter, upsideDown);
- } else if((!stretchx) || rect.x2 - rect.x1 > Src->currentDesc.Width ||
- rect.y2 - rect.y1 > Src->currentDesc.Height) {
TRACE("No stretching in x direction, using direct framebuffer -> texture copy\n");
- fb_copy_to_texture_direct(This, SrcSurface, &srect, &rect, upsideDown, Filter);
+ fb_copy_to_texture_direct(dst_surface, src_surface, &src_rect, &dst_rect, Filter);
} else {
TRACE("Using hardware stretching to flip / stretch the texture\n");
- fb_copy_to_texture_hwstretch(This, SrcSurface, srcSwapchain, &srect, &rect, upsideDown, Filter);
+ fb_copy_to_texture_hwstretch(dst_surface, src_surface, &src_rect, &dst_rect, Filter);
}
- /* Clear the palette as the surface didn't have a palette attached, it would confuse GetPalette and other calls */
- if(paletteOverride)
- This->palette = NULL;
-
- if(!(This->Flags & SFLAG_DONOTFREE)) {
- HeapFree(GetProcessHeap(), 0, This->resource.heapMemory);
- This->resource.allocatedMemory = NULL;
- This->resource.heapMemory = NULL;
- } else {
- This->Flags &= ~SFLAG_INSYSMEM;
+ if (!(dst_surface->Flags & SFLAG_DONOTFREE))
+ {
+ HeapFree(GetProcessHeap(), 0, dst_surface->resource.heapMemory);
+ dst_surface->resource.allocatedMemory = NULL;
+ dst_surface->resource.heapMemory = NULL;
+ }
+ else
+ {
+ dst_surface->Flags &= ~SFLAG_INSYSMEM;
}
return WINED3D_OK;
- } else if(Src) {
+ }
+ else if (src_surface)
+ {
/* Blit from offscreen surface to render target */
- float glTexCoord[4];
- DWORD oldCKeyFlags = Src->CKeyFlags;
- WINEDDCOLORKEY oldBltCKey = Src->SrcBltCKey;
+ DWORD oldCKeyFlags = src_surface->CKeyFlags;
+ WINEDDCOLORKEY oldBltCKey = src_surface->SrcBltCKey;
struct wined3d_context *context;
- RECT SourceRectangle;
- BOOL paletteOverride = FALSE;
- TRACE("Blt from surface %p to rendertarget %p\n", Src, This);
+ TRACE("Blt from surface %p to rendertarget %p\n", src_surface, dst_surface);
- if(SrcRect) {
- SourceRectangle.left = SrcRect->left;
- SourceRectangle.right = SrcRect->right;
- SourceRectangle.top = SrcRect->top;
- SourceRectangle.bottom = SrcRect->bottom;
- } else {
- SourceRectangle.left = 0;
- SourceRectangle.right = Src->currentDesc.Width;
- SourceRectangle.top = 0;
- SourceRectangle.bottom = Src->currentDesc.Height;
- }
-
- /* When blitting from an offscreen surface to a rendertarget, the source
- * surface is not required to have a palette. Our rendering / conversion
- * code further down the road retrieves the palette from the surface, so
- * it must have a palette set. */
- if (Src->resource.format_desc->format == WINED3DFMT_P8_UINT && !Src->palette)
- {
- paletteOverride = TRUE;
- TRACE("Source surface (%p) lacks palette, overriding palette with palette %p of destination surface (%p)\n", Src, This->palette, This);
- Src->palette = This->palette;
- }
-
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO
- && myDevice->adapter->gl_info.fbo_ops.glBlitFramebuffer
- && !(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE))
- && surface_can_stretch_rect(Src, This))
+ if (!(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE))
+ && fbo_blit_supported(&device->adapter->gl_info, BLIT_OP_BLIT,
+ &src_rect, src_surface->resource.usage, src_surface->resource.pool,
+ src_surface->resource.format_desc,
+ &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool,
+ dst_surface->resource.format_desc))
{
TRACE("Using stretch_rect_fbo\n");
/* The source is always a texture, but never the currently active render target, and the texture
- * contents are never upside down
- */
- stretch_rect_fbo((IWineD3DDevice *)myDevice, SrcSurface, (WINED3DRECT *) &SourceRectangle,
- (IWineD3DSurface *)This, &rect, Filter, FALSE);
-
- /* Clear the palette as the surface didn't have a palette attached, it would confuse GetPalette and other calls */
- if(paletteOverride)
- Src->palette = NULL;
+ * contents are never upside down. */
+ stretch_rect_fbo(device, src_surface, &src_rect, dst_surface, &dst_rect, Filter);
return WINED3D_OK;
}
- if(!CalculateTexRect(Src, &SourceRectangle, glTexCoord)) {
- /* Fall back to software */
- WARN("(%p) Source texture area (%d,%d)-(%d,%d) is too big\n", Src,
- SourceRectangle.left, SourceRectangle.top,
- SourceRectangle.right, SourceRectangle.bottom);
- return WINED3DERR_INVALIDCALL;
+ if (!(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE))
+ && arbfp_blit.blit_supported(&device->adapter->gl_info, BLIT_OP_BLIT,
+ &src_rect, src_surface->resource.usage, src_surface->resource.pool,
+ src_surface->resource.format_desc,
+ &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool,
+ dst_surface->resource.format_desc))
+ {
+ return arbfp_blit_surface(device, src_surface, &src_rect, dst_surface, &dst_rect, BLIT_OP_BLIT, Filter);
}
/* Color keying: Check if we have to do a color keyed blt,
@@ -3800,72 +3673,35 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
/* Use color key from surface */
} else if(Flags & WINEDDBLT_KEYSRCOVERRIDE) {
/* Use color key from DDBltFx */
- Src->CKeyFlags |= WINEDDSD_CKSRCBLT;
- Src->SrcBltCKey = DDBltFx->ddckSrcColorkey;
+ src_surface->CKeyFlags |= WINEDDSD_CKSRCBLT;
+ src_surface->SrcBltCKey = DDBltFx->ddckSrcColorkey;
} else {
/* Do not use color key */
- Src->CKeyFlags &= ~WINEDDSD_CKSRCBLT;
+ src_surface->CKeyFlags &= ~WINEDDSD_CKSRCBLT;
}
/* Now load the surface */
- surface_internal_preload((IWineD3DSurface *) Src, SRGB_RGB);
+ surface_internal_preload(src_surface, SRGB_RGB);
/* Activate the destination context, set it up for blitting */
- context = context_acquire(myDevice, (IWineD3DSurface *)This, CTXUSAGE_BLIT);
+ context = context_acquire(device, dst_surface);
+ context_apply_blit_state(context, device);
- /* The coordinates of the ddraw front buffer are always fullscreen ('screen coordinates',
- * while OpenGL coordinates are window relative.
- * Also beware of the origin difference(top left vs bottom left).
- * Also beware that the front buffer's surface size is screen width x screen height,
- * whereas the real gl drawable size is the size of the window.
- */
- if (dstSwapchain && (IWineD3DSurface *)This == dstSwapchain->frontBuffer) {
- RECT windowsize;
- POINT offset = {0,0};
- UINT h;
- ClientToScreen(dstSwapchain->win_handle, &offset);
- GetClientRect(dstSwapchain->win_handle, &windowsize);
- h = windowsize.bottom - windowsize.top;
- rect.x1 -= offset.x; rect.x2 -=offset.x;
- rect.y1 -= offset.y; rect.y2 -=offset.y;
- rect.y1 += This->currentDesc.Height - h; rect.y2 += This->currentDesc.Height - h;
- }
+ if (dstSwapchain && dst_surface == dstSwapchain->front_buffer)
+ surface_translate_frontbuffer_coords(dst_surface, context->win_handle, &dst_rect);
- if (!is_identity_fixup(This->resource.format_desc->color_fixup))
+ if (!device->blitter->blit_supported(&device->adapter->gl_info, BLIT_OP_BLIT,
+ &src_rect, src_surface->resource.usage, src_surface->resource.pool, src_surface->resource.format_desc,
+ &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, dst_surface->resource.format_desc))
{
- FIXME("Destination format %s has a fixup, this is not supported.\n",
- debug_d3dformat(This->resource.format_desc->format));
- dump_color_fixup_desc(This->resource.format_desc->color_fixup);
+ FIXME("Unsupported blit operation falling back to software\n");
+ return WINED3DERR_INVALIDCALL;
}
- if (!myDevice->blitter->color_fixup_supported(Src->resource.format_desc->color_fixup))
- {
- FIXME("Source format %s has an unsupported fixup:\n",
- debug_d3dformat(Src->resource.format_desc->format));
- dump_color_fixup_desc(Src->resource.format_desc->color_fixup);
- }
-
- myDevice->blitter->set_shader((IWineD3DDevice *) myDevice, Src->resource.format_desc,
- Src->texture_target, Src->pow2Width, Src->pow2Height);
+ device->blitter->set_shader((IWineD3DDevice *)device, src_surface);
ENTER_GL();
- /* Bind the texture */
- glBindTexture(Src->texture_target, Src->texture_name);
- checkGLcall("glBindTexture");
-
- /* Filtering for StretchRect */
- glTexParameteri(Src->texture_target, GL_TEXTURE_MAG_FILTER,
- wined3d_gl_mag_filter(magLookup, Filter));
- checkGLcall("glTexParameteri");
- glTexParameteri(Src->texture_target, GL_TEXTURE_MIN_FILTER,
- wined3d_gl_min_mip_filter(minMipLookup, Filter, WINED3DTEXF_NONE));
- checkGLcall("glTexParameteri");
- glTexParameteri(Src->texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP);
- glTexParameteri(Src->texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP);
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
- checkGLcall("glTexEnvi");
-
/* This is for color keying */
if(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE)) {
glEnable(GL_ALPHA_TEST);
@@ -3874,8 +3710,8 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
/* When the primary render target uses P8, the alpha component contains the palette index.
* Which means that the colorkey is one of the palette entries. In other cases pixels that
* should be masked away have alpha set to 0. */
- if(primary_render_target_is_p8(myDevice))
- glAlphaFunc(GL_NOTEQUAL, (float)Src->SrcBltCKey.dwColorSpaceLowValue / 256.0f);
+ if (primary_render_target_is_p8(device))
+ glAlphaFunc(GL_NOTEQUAL, (float)src_surface->SrcBltCKey.dwColorSpaceLowValue / 256.0f);
else
glAlphaFunc(GL_NOTEQUAL, 0.0f);
checkGLcall("glAlphaFunc");
@@ -3886,46 +3722,26 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
/* Draw a textured quad
*/
- glBegin(GL_QUADS);
-
- glColor3f(1.0f, 1.0f, 1.0f);
- glTexCoord2f(glTexCoord[0], glTexCoord[2]);
- glVertex3f(rect.x1, rect.y1, 0.0f);
-
- glTexCoord2f(glTexCoord[0], glTexCoord[3]);
- glVertex3f(rect.x1, rect.y2, 0.0f);
-
- glTexCoord2f(glTexCoord[1], glTexCoord[3]);
- glVertex3f(rect.x2, rect.y2, 0.0f);
-
- glTexCoord2f(glTexCoord[1], glTexCoord[2]);
- glVertex3f(rect.x2, rect.y1, 0.0f);
-
- glEnd();
- checkGLcall("glEnd");
+ draw_textured_quad(src_surface, &src_rect, &dst_rect, Filter);
if(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE)) {
glDisable(GL_ALPHA_TEST);
checkGLcall("glDisable(GL_ALPHA_TEST)");
}
- glBindTexture(Src->texture_target, 0);
- checkGLcall("glBindTexture(Src->texture_target, 0)");
-
/* Restore the color key parameters */
- Src->CKeyFlags = oldCKeyFlags;
- Src->SrcBltCKey = oldBltCKey;
-
- /* Clear the palette as the surface didn't have a palette attached, it would confuse GetPalette and other calls */
- if(paletteOverride)
- Src->palette = NULL;
+ src_surface->CKeyFlags = oldCKeyFlags;
+ src_surface->SrcBltCKey = oldBltCKey;
LEAVE_GL();
/* Leave the opengl state valid for blitting */
- myDevice->blitter->unset_shader((IWineD3DDevice *) myDevice);
+ device->blitter->unset_shader((IWineD3DDevice *)device);
- wglFlush(); /* Flush to ensure ordering across contexts. */
+ if (wined3d_settings.strict_draw_ordering || (dstSwapchain
+ && (dst_surface == dstSwapchain->front_buffer
+ || dstSwapchain->num_contexts > 1)))
+ wglFlush(); /* Flush to ensure ordering across contexts. */
context_release(context);
@@ -3933,74 +3749,40 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
/* The surface is now in the drawable. On onscreen surfaces or without fbos the texture
* is outdated now
*/
- IWineD3DSurface_ModifyLocation((IWineD3DSurface *) This, SFLAG_INDRAWABLE, TRUE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)dst_surface, SFLAG_INDRAWABLE, TRUE);
return WINED3D_OK;
} else {
/* Source-Less Blit to render target */
if (Flags & WINEDDBLT_COLORFILL) {
- /* This is easy to handle for the D3D Device... */
DWORD color;
TRACE("Colorfill\n");
- /* This == (IWineD3DSurfaceImpl *) myDevice->render_targets[0] || dstSwapchain
- must be true if we are here */
- if (This != (IWineD3DSurfaceImpl *) myDevice->render_targets[0] &&
- !(This == (IWineD3DSurfaceImpl*) dstSwapchain->frontBuffer ||
- (dstSwapchain->backBuffer && This == (IWineD3DSurfaceImpl*) dstSwapchain->backBuffer[0]))) {
- TRACE("Surface is higher back buffer, falling back to software\n");
- return WINED3DERR_INVALIDCALL;
- }
-
/* The color as given in the Blt function is in the format of the frame-buffer...
* 'clear' expect it in ARGB format => we need to do some conversion :-)
*/
- if (This->resource.format_desc->format == WINED3DFMT_P8_UINT)
+ if (!surface_convert_color_to_argb(dst_surface, DDBltFx->u5.dwFillColor, &color))
{
- DWORD alpha;
-
- if (primary_render_target_is_p8(myDevice)) alpha = DDBltFx->u5.dwFillColor << 24;
- else alpha = 0xFF000000;
-
- if (This->palette) {
- color = (alpha |
- (This->palette->palents[DDBltFx->u5.dwFillColor].peRed << 16) |
- (This->palette->palents[DDBltFx->u5.dwFillColor].peGreen << 8) |
- (This->palette->palents[DDBltFx->u5.dwFillColor].peBlue));
- } else {
- color = alpha;
- }
- }
- else if (This->resource.format_desc->format == WINED3DFMT_B5G6R5_UNORM)
- {
- if (DDBltFx->u5.dwFillColor == 0xFFFF) {
- color = 0xFFFFFFFF;
- } else {
- color = ((0xFF000000) |
- ((DDBltFx->u5.dwFillColor & 0xF800) << 8) |
- ((DDBltFx->u5.dwFillColor & 0x07E0) << 5) |
- ((DDBltFx->u5.dwFillColor & 0x001F) << 3));
- }
- }
- else if (This->resource.format_desc->format == WINED3DFMT_B8G8R8_UNORM
- || This->resource.format_desc->format == WINED3DFMT_B8G8R8X8_UNORM)
- {
- color = 0xFF000000 | DDBltFx->u5.dwFillColor;
- }
- else if (This->resource.format_desc->format == WINED3DFMT_B8G8R8A8_UNORM)
- {
- color = DDBltFx->u5.dwFillColor;
- }
- else {
- ERR("Wrong surface type for BLT override(Format doesn't match) !\n");
+ /* The color conversion function already prints an error, so need to do it here */
return WINED3DERR_INVALIDCALL;
}
- TRACE("(%p) executing Render Target override, color = %x\n", This, color);
- IWineD3DDeviceImpl_ClearSurface(myDevice, This, 1 /* Number of rectangles */,
- &rect, WINED3DCLEAR_TARGET, color, 0.0f /* Z */, 0 /* Stencil */);
- return WINED3D_OK;
+ if (ffp_blit.blit_supported(&device->adapter->gl_info, BLIT_OP_COLOR_FILL,
+ NULL, 0, 0, NULL,
+ &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool,
+ dst_surface->resource.format_desc))
+ {
+ return ffp_blit.color_fill(device, dst_surface, &dst_rect, color);
+ }
+ else if (cpu_blit.blit_supported(&device->adapter->gl_info, BLIT_OP_COLOR_FILL,
+ NULL, 0, 0, NULL,
+ &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool,
+ dst_surface->resource.format_desc))
+ {
+ return cpu_blit.color_fill(device, dst_surface, &dst_rect, color);
+ }
+ return WINED3DERR_INVALIDCALL;
}
}
@@ -4012,7 +3794,7 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
static HRESULT IWineD3DSurfaceImpl_BltZ(IWineD3DSurfaceImpl *This, const RECT *DestRect,
IWineD3DSurface *SrcSurface, const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx)
{
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = This->resource.device;
float depth;
if (Flags & WINEDDBLT_DEPTHFILL) {
@@ -4036,13 +3818,8 @@ static HRESULT IWineD3DSurfaceImpl_BltZ(IWineD3DSurfaceImpl *This, const RECT *D
ERR("Unexpected format for depth fill: %s\n", debug_d3dformat(This->resource.format_desc->format));
}
- return IWineD3DDevice_Clear((IWineD3DDevice *) myDevice,
- DestRect == NULL ? 0 : 1,
- (const WINED3DRECT *)DestRect,
- WINED3DCLEAR_ZBUFFER,
- 0x00000000,
- depth,
- 0x00000000);
+ return IWineD3DDevice_Clear((IWineD3DDevice *)device, DestRect ? 1 : 0, (const WINED3DRECT *)DestRect,
+ WINED3DCLEAR_ZBUFFER, 0x00000000, depth, 0x00000000);
}
FIXME("(%p): Unsupp depthstencil blit\n", This);
@@ -4053,7 +3830,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT
const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx, WINED3DTEXTUREFILTERTYPE Filter) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
IWineD3DSurfaceImpl *Src = (IWineD3DSurfaceImpl *) SrcSurface;
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = This->resource.device;
TRACE("(%p)->(%p,%p,%p,%x,%p)\n", This, DestRect, SrcSurface, SrcRect, Flags, DDBltFx);
TRACE("(%p): Usage is %s\n", This, debug_d3dusage(This->resource.usage));
@@ -4067,8 +3844,10 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT
/* Accessing the depth stencil is supposed to fail between a BeginScene and EndScene pair,
* except depth blits, which seem to work
*/
- if(iface == myDevice->stencilBufferTarget || (SrcSurface && SrcSurface == myDevice->stencilBufferTarget)) {
- if(myDevice->inScene && !(Flags & WINEDDBLT_DEPTHFILL)) {
+ if (This == device->depth_stencil || (Src && Src == device->depth_stencil))
+ {
+ if (device->inScene && !(Flags & WINEDDBLT_DEPTHFILL))
+ {
TRACE("Attempt to access the depth stencil surface in a BeginScene / EndScene pair, returning WINED3DERR_INVALIDCALL\n");
return WINED3DERR_INVALIDCALL;
} else if(IWineD3DSurfaceImpl_BltZ(This, DestRect, SrcSurface, SrcRect, Flags, DDBltFx) == WINED3D_OK) {
@@ -4078,9 +3857,11 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT
}
/* Special cases for RenderTargets */
- if( (This->resource.usage & WINED3DUSAGE_RENDERTARGET) ||
- ( Src && (Src->resource.usage & WINED3DUSAGE_RENDERTARGET) )) {
- if(IWineD3DSurfaceImpl_BltOverride(This, DestRect, SrcSurface, SrcRect, Flags, DDBltFx, Filter) == WINED3D_OK) return WINED3D_OK;
+ if ((This->resource.usage & WINED3DUSAGE_RENDERTARGET)
+ || (Src && (Src->resource.usage & WINED3DUSAGE_RENDERTARGET)))
+ {
+ if (SUCCEEDED(IWineD3DSurfaceImpl_BltOverride(This, DestRect, Src, SrcRect, Flags, DDBltFx, Filter)))
+ return WINED3D_OK;
}
/* For the rest call the X11 surface implementation.
@@ -4095,7 +3876,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD
{
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
IWineD3DSurfaceImpl *srcImpl = (IWineD3DSurfaceImpl *) Source;
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = This->resource.device;
TRACE("(%p)->(%d, %d, %p, %p, %08x\n", iface, dstx, dsty, Source, rsrc, trans);
@@ -4105,9 +3886,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD
return WINEDDERR_SURFACEBUSY;
}
- if(myDevice->inScene &&
- (iface == myDevice->stencilBufferTarget ||
- (Source == myDevice->stencilBufferTarget))) {
+ if (device->inScene && (This == device->depth_stencil || srcImpl == device->depth_stencil))
+ {
TRACE("Attempt to access the depth stencil surface in a BeginScene / EndScene pair, returning WINED3DERR_INVALIDCALL\n");
return WINED3DERR_INVALIDCALL;
}
@@ -4119,17 +3899,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD
RECT SrcRect, DstRect;
DWORD Flags=0;
- if(rsrc) {
- SrcRect.left = rsrc->left;
- SrcRect.top= rsrc->top;
- SrcRect.bottom = rsrc->bottom;
- SrcRect.right = rsrc->right;
- } else {
- SrcRect.left = 0;
- SrcRect.top = 0;
- SrcRect.right = srcImpl->currentDesc.Width;
- SrcRect.bottom = srcImpl->currentDesc.Height;
- }
+ surface_get_rect(srcImpl, rsrc, &SrcRect);
DstRect.left = dstx;
DstRect.top=dsty;
@@ -4146,7 +3916,9 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD
if(trans & WINEDDBLTFAST_DONOTWAIT)
Flags |= WINEDDBLT_DONOTWAIT;
- if(IWineD3DSurfaceImpl_BltOverride(This, &DstRect, Source, &SrcRect, Flags, NULL, WINED3DTEXF_POINT) == WINED3D_OK) return WINED3D_OK;
+ if (SUCCEEDED(IWineD3DSurfaceImpl_BltOverride(This,
+ &DstRect, srcImpl, &SrcRect, Flags, NULL, WINED3DTEXF_POINT)))
+ return WINED3D_OK;
}
@@ -4166,31 +3938,13 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface)
if (This->resource.format_desc->format == WINED3DFMT_P8_UINT
|| This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM)
{
- int bpp;
- GLenum format, internal, type;
- CONVERT_TYPES convert;
-
- /* Check if we are using a RTL mode which uses texturing for uploads */
- BOOL use_texture = (wined3d_settings.rendertargetlock_mode == RTL_READTEX);
-
- /* Check if we have hardware palette conversion if we have convert is set to NO_CONVERSION */
- d3dfmt_get_conv(This, TRUE, use_texture, &format, &internal, &type, &convert, &bpp, FALSE);
-
- if((This->resource.usage & WINED3DUSAGE_RENDERTARGET) && (convert == NO_CONVERSION))
+ if(This->resource.usage & WINED3DUSAGE_RENDERTARGET)
{
- IWineD3DDeviceImpl *device = This->resource.device;
- struct wined3d_context *context;
-
/* Make sure the texture is up to date. This call doesn't do anything if the texture is already up to date. */
IWineD3DSurface_LoadLocation(iface, SFLAG_INTEXTURE, NULL);
/* We want to force a palette refresh, so mark the drawable as not being up to date */
IWineD3DSurface_ModifyLocation(iface, SFLAG_INDRAWABLE, FALSE);
-
- /* Re-upload the palette */
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
- d3dfmt_p8_upload_palette(iface, convert);
- context_release(context);
} else {
if(!(This->Flags & SFLAG_INSYSMEM)) {
TRACE("Palette changed with surface that does not have an up to date system memory copy\n");
@@ -4269,18 +4023,18 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) {
3: WARN and return WINED3DERR_NOTAVAILABLE;
4: Create the surface, but allow it to be used only for DirectDraw Blts. Some apps(e.g. Swat 3) create textures with a Height of 16 and a Width > 3000 and blt 16x16 letter areas from them to the render target.
*/
- WARN("(%p) Creating an oversized surface: %ux%u (texture is %ux%u)\n",
- This, This->pow2Width, This->pow2Height, This->currentDesc.Width, This->currentDesc.Height);
- This->Flags |= SFLAG_OVERSIZE;
+ if(This->resource.pool == WINED3DPOOL_DEFAULT || This->resource.pool == WINED3DPOOL_MANAGED)
+ {
+ WARN("(%p) Unable to allocate a surface which exceeds the maximum OpenGL texture size\n", This);
+ return WINED3DERR_NOTAVAILABLE;
+ }
- /* This will be initialized on the first blt */
- This->glRect.left = 0;
- This->glRect.top = 0;
- This->glRect.right = 0;
- This->glRect.bottom = 0;
- } else {
- /* Check this after the oversize check - do not make an oversized surface a texture_rectangle one.
- Second also don't use ARB_TEXTURE_RECTANGLE in case the surface format is P8 and EXT_PALETTED_TEXTURE
+ /* We should never use this surface in combination with OpenGL! */
+ TRACE("(%p) Creating an oversized surface: %ux%u\n", This, This->pow2Width, This->pow2Height);
+ }
+ else
+ {
+ /* Don't use ARB_TEXTURE_RECTANGLE in case the surface format is P8 and EXT_PALETTED_TEXTURE
is used in combination with texture uploads (RTL_READTEX/RTL_TEXTEX). The reason is that EXT_PALETTED_TEXTURE
doesn't work in combination with ARB_TEXTURE_RECTANGLE.
*/
@@ -4294,19 +4048,11 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) {
This->pow2Height = This->currentDesc.Height;
This->Flags &= ~(SFLAG_NONPOW2 | SFLAG_NORMCOORD);
}
-
- /* No oversize, gl rect is the full texture size */
- This->Flags &= ~SFLAG_OVERSIZE;
- This->glRect.left = 0;
- This->glRect.top = 0;
- This->glRect.right = This->pow2Width;
- This->glRect.bottom = This->pow2Height;
}
if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) {
switch(wined3d_settings.offscreen_rendering_mode) {
case ORM_FBO: This->get_drawable_size = get_drawable_size_fbo; break;
- case ORM_PBUFFER: This->get_drawable_size = get_drawable_size_pbuffer; break;
case ORM_BACKBUFFER: This->get_drawable_size = get_drawable_size_backbuffer; break;
}
}
@@ -4316,104 +4062,13 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) {
return WINED3D_OK;
}
-struct depth_blt_info
-{
- GLenum binding;
- GLenum bind_target;
- enum tex_types tex_type;
- GLfloat coords[4][3];
-};
-
-static void surface_get_depth_blt_info(GLenum target, GLsizei w, GLsizei h, struct depth_blt_info *info)
-{
- GLfloat (*coords)[3] = info->coords;
-
- switch (target)
- {
- default:
- FIXME("Unsupported texture target %#x\n", target);
- /* Fall back to GL_TEXTURE_2D */
- case GL_TEXTURE_2D:
- info->binding = GL_TEXTURE_BINDING_2D;
- info->bind_target = GL_TEXTURE_2D;
- info->tex_type = tex_2d;
- coords[0][0] = 0.0f; coords[0][1] = 1.0f; coords[0][2] = 0.0f;
- coords[1][0] = 1.0f; coords[1][1] = 1.0f; coords[1][2] = 0.0f;
- coords[2][0] = 0.0f; coords[2][1] = 0.0f; coords[2][2] = 0.0f;
- coords[3][0] = 1.0f; coords[3][1] = 0.0f; coords[3][2] = 0.0f;
- break;
-
- case GL_TEXTURE_RECTANGLE_ARB:
- info->binding = GL_TEXTURE_BINDING_RECTANGLE_ARB;
- info->bind_target = GL_TEXTURE_RECTANGLE_ARB;
- info->tex_type = tex_rect;
- coords[0][0] = 0.0f; coords[0][1] = h; coords[0][2] = 0.0f;
- coords[1][0] = w; coords[1][1] = h; coords[1][2] = 0.0f;
- coords[2][0] = 0.0f; coords[2][1] = 0.0f; coords[2][2] = 0.0f;
- coords[3][0] = w; coords[3][1] = 0.0f; coords[3][2] = 0.0f;
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
- info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- info->tex_type = tex_cube;
- coords[0][0] = 1.0f; coords[0][1] = -1.0f; coords[0][2] = 1.0f;
- coords[1][0] = 1.0f; coords[1][1] = -1.0f; coords[1][2] = -1.0f;
- coords[2][0] = 1.0f; coords[2][1] = 1.0f; coords[2][2] = 1.0f;
- coords[3][0] = 1.0f; coords[3][1] = 1.0f; coords[3][2] = -1.0f;
-
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
- info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- info->tex_type = tex_cube;
- coords[0][0] = -1.0f; coords[0][1] = -1.0f; coords[0][2] = -1.0f;
- coords[1][0] = -1.0f; coords[1][1] = -1.0f; coords[1][2] = 1.0f;
- coords[2][0] = -1.0f; coords[2][1] = 1.0f; coords[2][2] = -1.0f;
- coords[3][0] = -1.0f; coords[3][1] = 1.0f; coords[3][2] = 1.0f;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
- info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- info->tex_type = tex_cube;
- coords[0][0] = -1.0f; coords[0][1] = 1.0f; coords[0][2] = 1.0f;
- coords[1][0] = 1.0f; coords[1][1] = 1.0f; coords[1][2] = 1.0f;
- coords[2][0] = -1.0f; coords[2][1] = 1.0f; coords[2][2] = -1.0f;
- coords[3][0] = 1.0f; coords[3][1] = 1.0f; coords[3][2] = -1.0f;
-
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
- info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- info->tex_type = tex_cube;
- coords[0][0] = -1.0f; coords[0][1] = -1.0f; coords[0][2] = -1.0f;
- coords[1][0] = 1.0f; coords[1][1] = -1.0f; coords[1][2] = -1.0f;
- coords[2][0] = -1.0f; coords[2][1] = -1.0f; coords[2][2] = 1.0f;
- coords[3][0] = 1.0f; coords[3][1] = -1.0f; coords[3][2] = 1.0f;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
- info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- info->tex_type = tex_cube;
- coords[0][0] = -1.0f; coords[0][1] = -1.0f; coords[0][2] = 1.0f;
- coords[1][0] = 1.0f; coords[1][1] = -1.0f; coords[1][2] = 1.0f;
- coords[2][0] = -1.0f; coords[2][1] = 1.0f; coords[2][2] = 1.0f;
- coords[3][0] = 1.0f; coords[3][1] = 1.0f; coords[3][2] = 1.0f;
-
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
- info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- info->tex_type = tex_cube;
- coords[0][0] = 1.0f; coords[0][1] = -1.0f; coords[0][2] = -1.0f;
- coords[1][0] = -1.0f; coords[1][1] = -1.0f; coords[1][2] = -1.0f;
- coords[2][0] = 1.0f; coords[2][1] = 1.0f; coords[2][2] = -1.0f;
- coords[3][0] = -1.0f; coords[3][1] = 1.0f; coords[3][2] = -1.0f;
- }
-}
-
/* GL locking is done by the caller */
-static void surface_depth_blt(IWineD3DSurfaceImpl *This, GLuint texture, GLsizei w, GLsizei h, GLenum target)
+static void surface_depth_blt(IWineD3DSurfaceImpl *This, const struct wined3d_gl_info *gl_info,
+ GLuint texture, GLsizei w, GLsizei h, GLenum target)
{
IWineD3DDeviceImpl *device = This->resource.device;
- struct depth_blt_info info;
+ GLint compare_mode = GL_NONE;
+ struct blt_info info;
GLint old_binding = 0;
glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_VIEWPORT_BIT);
@@ -4429,12 +4084,18 @@ static void surface_depth_blt(IWineD3DSurfaceImpl *This, GLuint texture, GLsizei
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glViewport(0, 0, w, h);
- surface_get_depth_blt_info(target, w, h, &info);
+ surface_get_blt_info(target, NULL, w, h, &info);
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB));
glGetIntegerv(info.binding, &old_binding);
glBindTexture(info.bind_target, texture);
+ if (gl_info->supported[ARB_SHADOW])
+ {
+ glGetTexParameteriv(info.bind_target, GL_TEXTURE_COMPARE_MODE_ARB, &compare_mode);
+ if (compare_mode != GL_NONE) glTexParameteri(info.bind_target, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
+ }
- device->shader_backend->shader_select_depth_blt((IWineD3DDevice *)device, info.tex_type);
+ device->shader_backend->shader_select_depth_blt((IWineD3DDevice *)device,
+ info.tex_type, &This->ds_current_size);
glBegin(GL_TRIANGLE_STRIP);
glTexCoord3fv(info.coords[0]);
@@ -4447,6 +4108,7 @@ static void surface_depth_blt(IWineD3DSurfaceImpl *This, GLuint texture, GLsizei
glVertex2f(1.0f, 1.0f);
glEnd();
+ if (compare_mode != GL_NONE) glTexParameteri(info.bind_target, GL_TEXTURE_COMPARE_MODE_ARB, compare_mode);
glBindTexture(info.bind_target, old_binding);
glPopAttrib();
@@ -4454,139 +4116,156 @@ static void surface_depth_blt(IWineD3DSurfaceImpl *This, GLuint texture, GLsizei
device->shader_backend->shader_deselect_depth_blt((IWineD3DDevice *)device);
}
-void surface_modify_ds_location(IWineD3DSurface *iface, DWORD location) {
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
+void surface_modify_ds_location(IWineD3DSurfaceImpl *surface,
+ DWORD location, UINT w, UINT h)
+{
+ TRACE("surface %p, new location %#x, w %u, h %u.\n", surface, location, w, h);
- TRACE("(%p) New location %#x\n", This, location);
+ if (location & ~SFLAG_DS_LOCATIONS)
+ FIXME("Invalid location (%#x) specified.\n", location);
- if (location & ~SFLAG_DS_LOCATIONS) {
- FIXME("(%p) Invalid location (%#x) specified\n", This, location);
- }
-
- This->Flags &= ~SFLAG_DS_LOCATIONS;
- This->Flags |= location;
+ surface->ds_current_size.cx = w;
+ surface->ds_current_size.cy = h;
+ surface->Flags &= ~SFLAG_DS_LOCATIONS;
+ surface->Flags |= location;
}
/* Context activation is done by the caller. */
-void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *context, DWORD location)
+void surface_load_ds_location(IWineD3DSurfaceImpl *surface, struct wined3d_context *context, DWORD location)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- IWineD3DDeviceImpl *device = This->resource.device;
+ IWineD3DDeviceImpl *device = surface->resource.device;
const struct wined3d_gl_info *gl_info = context->gl_info;
- TRACE("(%p) New location %#x\n", This, location);
+ TRACE("surface %p, new location %#x.\n", surface, location);
/* TODO: Make this work for modes other than FBO */
if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) return;
- if (This->Flags & location) {
- TRACE("(%p) Location (%#x) is already up to date\n", This, location);
+ if (!(surface->Flags & location))
+ {
+ surface->ds_current_size.cx = 0;
+ surface->ds_current_size.cy = 0;
+ }
+
+ if (surface->ds_current_size.cx == surface->currentDesc.Width
+ && surface->ds_current_size.cy == surface->currentDesc.Height)
+ {
+ TRACE("Location (%#x) is already up to date.\n", location);
return;
}
- if (This->current_renderbuffer) {
- FIXME("(%p) Not supported with fixed up depth stencil\n", This);
+ if (surface->current_renderbuffer)
+ {
+ FIXME("Not supported with fixed up depth stencil.\n");
return;
}
- if (location == SFLAG_DS_OFFSCREEN) {
- if (This->Flags & SFLAG_DS_ONSCREEN) {
- GLint old_binding = 0;
- GLenum bind_target;
-
- TRACE("(%p) Copying onscreen depth buffer to depth texture\n", This);
-
- ENTER_GL();
-
- if (!device->depth_blt_texture) {
- glGenTextures(1, &device->depth_blt_texture);
- }
-
- /* Note that we use depth_blt here as well, rather than glCopyTexImage2D
- * directly on the FBO texture. That's because we need to flip. */
- context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
- if (This->texture_target == GL_TEXTURE_RECTANGLE_ARB)
- {
- glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding);
- bind_target = GL_TEXTURE_RECTANGLE_ARB;
- } else {
- glGetIntegerv(GL_TEXTURE_BINDING_2D, &old_binding);
- bind_target = GL_TEXTURE_2D;
- }
- glBindTexture(bind_target, device->depth_blt_texture);
- glCopyTexImage2D(bind_target, This->texture_level, This->resource.format_desc->glInternal,
- 0, 0, This->currentDesc.Width, This->currentDesc.Height, 0);
- glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(bind_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(bind_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(bind_target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
- glTexParameteri(bind_target, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE);
- glBindTexture(bind_target, old_binding);
-
- /* Setup the destination */
- if (!device->depth_blt_rb) {
- gl_info->fbo_ops.glGenRenderbuffers(1, &device->depth_blt_rb);
- checkGLcall("glGenRenderbuffersEXT");
- }
- if (device->depth_blt_rb_w != This->currentDesc.Width
- || device->depth_blt_rb_h != This->currentDesc.Height) {
- gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, device->depth_blt_rb);
- checkGLcall("glBindRenderbufferEXT");
- gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8,
- This->currentDesc.Width, This->currentDesc.Height);
- checkGLcall("glRenderbufferStorageEXT");
- device->depth_blt_rb_w = This->currentDesc.Width;
- device->depth_blt_rb_h = This->currentDesc.Height;
- }
-
- context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo);
- gl_info->fbo_ops.glFramebufferRenderbuffer(GL_FRAMEBUFFER,
- GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, device->depth_blt_rb);
- checkGLcall("glFramebufferRenderbufferEXT");
- context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, iface, FALSE);
-
- /* Do the actual blit */
- surface_depth_blt(This, device->depth_blt_texture, This->currentDesc.Width, This->currentDesc.Height, bind_target);
- checkGLcall("depth_blt");
-
- if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER, &context->current_fbo->id);
- else context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
-
- LEAVE_GL();
-
- wglFlush(); /* Flush to ensure ordering across contexts. */
- }
- else
- {
- FIXME("No up to date depth stencil location\n");
- }
- } else if (location == SFLAG_DS_ONSCREEN) {
- if (This->Flags & SFLAG_DS_OFFSCREEN) {
- TRACE("(%p) Copying depth texture to onscreen depth buffer\n", This);
-
- ENTER_GL();
-
- context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
- surface_depth_blt(This, This->texture_name, This->currentDesc.Width,
- This->currentDesc.Height, This->texture_target);
- checkGLcall("depth_blt");
-
- if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER, &context->current_fbo->id);
-
- LEAVE_GL();
-
- wglFlush(); /* Flush to ensure ordering across contexts. */
- }
- else
- {
- FIXME("No up to date depth stencil location\n");
- }
- } else {
- ERR("(%p) Invalid location (%#x) specified\n", This, location);
+ if (!(surface->Flags & SFLAG_LOCATIONS))
+ {
+ FIXME("No up to date depth stencil location.\n");
+ surface->Flags |= location;
+ return;
}
- This->Flags |= location;
+ if (location == SFLAG_DS_OFFSCREEN)
+ {
+ GLint old_binding = 0;
+ GLenum bind_target;
+
+ TRACE("Copying onscreen depth buffer to depth texture.\n");
+
+ ENTER_GL();
+
+ if (!device->depth_blt_texture)
+ {
+ glGenTextures(1, &device->depth_blt_texture);
+ }
+
+ /* Note that we use depth_blt here as well, rather than glCopyTexImage2D
+ * directly on the FBO texture. That's because we need to flip. */
+ context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
+ if (surface->texture_target == GL_TEXTURE_RECTANGLE_ARB)
+ {
+ glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding);
+ bind_target = GL_TEXTURE_RECTANGLE_ARB;
+ }
+ else
+ {
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &old_binding);
+ bind_target = GL_TEXTURE_2D;
+ }
+ glBindTexture(bind_target, device->depth_blt_texture);
+ glCopyTexImage2D(bind_target, surface->texture_level, surface->resource.format_desc->glInternal,
+ 0, 0, surface->currentDesc.Width, surface->currentDesc.Height, 0);
+ glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(bind_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(bind_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(bind_target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
+ glTexParameteri(bind_target, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE);
+ glBindTexture(bind_target, old_binding);
+
+ /* Setup the destination */
+ if (!device->depth_blt_rb)
+ {
+ gl_info->fbo_ops.glGenRenderbuffers(1, &device->depth_blt_rb);
+ checkGLcall("glGenRenderbuffersEXT");
+ }
+ if (device->depth_blt_rb_w != surface->currentDesc.Width
+ || device->depth_blt_rb_h != surface->currentDesc.Height)
+ {
+ gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, device->depth_blt_rb);
+ checkGLcall("glBindRenderbufferEXT");
+ gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8,
+ surface->currentDesc.Width, surface->currentDesc.Height);
+ checkGLcall("glRenderbufferStorageEXT");
+ device->depth_blt_rb_w = surface->currentDesc.Width;
+ device->depth_blt_rb_h = surface->currentDesc.Height;
+ }
+
+ context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo);
+ gl_info->fbo_ops.glFramebufferRenderbuffer(GL_FRAMEBUFFER,
+ GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, device->depth_blt_rb);
+ checkGLcall("glFramebufferRenderbufferEXT");
+ context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, surface, FALSE);
+
+ /* Do the actual blit */
+ surface_depth_blt(surface, gl_info, device->depth_blt_texture,
+ surface->currentDesc.Width, surface->currentDesc.Height, bind_target);
+ checkGLcall("depth_blt");
+
+ if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER, &context->current_fbo->id);
+ else context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
+
+ LEAVE_GL();
+
+ if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */
+ }
+ else if (location == SFLAG_DS_ONSCREEN)
+ {
+ TRACE("Copying depth texture to onscreen depth buffer.\n");
+
+ ENTER_GL();
+
+ context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
+ surface_depth_blt(surface, gl_info, surface->texture_name,
+ surface->currentDesc.Width, surface->currentDesc.Height, surface->texture_target);
+ checkGLcall("depth_blt");
+
+ if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER, &context->current_fbo->id);
+
+ LEAVE_GL();
+
+ if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */
+ }
+ else
+ {
+ ERR("Invalid location (%#x) specified.\n", location);
+ }
+
+ surface->Flags |= location;
+ surface->ds_current_size.cx = surface->currentDesc.Width;
+ surface->ds_current_size.cy = surface->currentDesc.Height;
}
static void WINAPI IWineD3DSurfaceImpl_ModifyLocation(IWineD3DSurface *iface, DWORD flag, BOOL persistent) {
@@ -4597,8 +4276,9 @@ static void WINAPI IWineD3DSurfaceImpl_ModifyLocation(IWineD3DSurface *iface, DW
TRACE("(%p)->(%s, %s)\n", iface, debug_surflocation(flag),
persistent ? "TRUE" : "FALSE");
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
- if (surface_is_offscreen(iface))
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
+ if (surface_is_offscreen(This))
{
/* With ORM_FBO, SFLAG_INTEXTURE and SFLAG_INDRAWABLE are the same for offscreen targets. */
if (flag & (SFLAG_INTEXTURE | SFLAG_INDRAWABLE)) flag |= (SFLAG_INTEXTURE | SFLAG_INDRAWABLE);
@@ -4643,185 +4323,44 @@ static void WINAPI IWineD3DSurfaceImpl_ModifyLocation(IWineD3DSurface *iface, DW
}
}
-struct coords {
- GLfloat x, y, z;
-};
-
-struct float_rect
-{
- float l;
- float t;
- float r;
- float b;
-};
-
-static inline void cube_coords_float(const RECT *r, UINT w, UINT h, struct float_rect *f)
-{
- f->l = ((r->left * 2.0f) / w) - 1.0f;
- f->t = ((r->top * 2.0f) / h) - 1.0f;
- f->r = ((r->right * 2.0f) / w) - 1.0f;
- f->b = ((r->bottom * 2.0f) / h) - 1.0f;
-}
-
static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT *rect_in)
{
IWineD3DDeviceImpl *device = This->resource.device;
- IWineD3DBaseTextureImpl *texture;
+ IWineD3DSwapChainImpl *swapchain;
struct wined3d_context *context;
- struct coords coords[4];
- RECT rect;
- GLenum bind_target;
- struct float_rect f;
+ RECT src_rect, dst_rect;
- if(rect_in) {
- rect = *rect_in;
- } else {
- rect.left = 0;
- rect.top = 0;
- rect.right = This->currentDesc.Width;
- rect.bottom = This->currentDesc.Height;
- }
-
- switch (This->texture_target)
- {
- case GL_TEXTURE_2D:
- bind_target = GL_TEXTURE_2D;
-
- coords[0].x = (float)rect.left / This->pow2Width;
- coords[0].y = (float)rect.top / This->pow2Height;
- coords[0].z = 0;
-
- coords[1].x = (float)rect.left / This->pow2Width;
- coords[1].y = (float)rect.bottom / This->pow2Height;
- coords[1].z = 0;
-
- coords[2].x = (float)rect.right / This->pow2Width;
- coords[2].y = (float)rect.bottom / This->pow2Height;
- coords[2].z = 0;
-
- coords[3].x = (float)rect.right / This->pow2Width;
- coords[3].y = (float)rect.top / This->pow2Height;
- coords[3].z = 0;
- break;
-
- case GL_TEXTURE_RECTANGLE_ARB:
- bind_target = GL_TEXTURE_RECTANGLE_ARB;
- coords[0].x = rect.left; coords[0].y = rect.top; coords[0].z = 0;
- coords[1].x = rect.left; coords[1].y = rect.bottom; coords[1].z = 0;
- coords[2].x = rect.right; coords[2].y = rect.bottom; coords[2].z = 0;
- coords[3].x = rect.right; coords[3].y = rect.top; coords[3].z = 0;
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- cube_coords_float(&rect, This->pow2Width, This->pow2Height, &f);
- coords[0].x = 1; coords[0].y = -f.t; coords[0].z = -f.l;
- coords[1].x = 1; coords[1].y = -f.b; coords[1].z = -f.l;
- coords[2].x = 1; coords[2].y = -f.b; coords[2].z = -f.r;
- coords[3].x = 1; coords[3].y = -f.t; coords[3].z = -f.r;
- break;
-
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- cube_coords_float(&rect, This->pow2Width, This->pow2Height, &f);
- coords[0].x = -1; coords[0].y = -f.t; coords[0].z = f.l;
- coords[1].x = -1; coords[1].y = -f.b; coords[1].z = f.l;
- coords[2].x = -1; coords[2].y = -f.b; coords[2].z = f.r;
- coords[3].x = -1; coords[3].y = -f.t; coords[3].z = f.r;
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- cube_coords_float(&rect, This->pow2Width, This->pow2Height, &f);
- coords[0].x = f.l; coords[0].y = 1; coords[0].z = f.t;
- coords[1].x = f.l; coords[1].y = 1; coords[1].z = f.b;
- coords[2].x = f.r; coords[2].y = 1; coords[2].z = f.b;
- coords[3].x = f.r; coords[3].y = 1; coords[3].z = f.t;
- break;
-
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- cube_coords_float(&rect, This->pow2Width, This->pow2Height, &f);
- coords[0].x = f.l; coords[0].y = -1; coords[0].z = -f.t;
- coords[1].x = f.l; coords[1].y = -1; coords[1].z = -f.b;
- coords[2].x = f.r; coords[2].y = -1; coords[2].z = -f.b;
- coords[3].x = f.r; coords[3].y = -1; coords[3].z = -f.t;
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- cube_coords_float(&rect, This->pow2Width, This->pow2Height, &f);
- coords[0].x = f.l; coords[0].y = -f.t; coords[0].z = 1;
- coords[1].x = f.l; coords[1].y = -f.b; coords[1].z = 1;
- coords[2].x = f.r; coords[2].y = -f.b; coords[2].z = 1;
- coords[3].x = f.r; coords[3].y = -f.t; coords[3].z = 1;
- break;
-
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- cube_coords_float(&rect, This->pow2Width, This->pow2Height, &f);
- coords[0].x = -f.l; coords[0].y = -f.t; coords[0].z = -1;
- coords[1].x = -f.l; coords[1].y = -f.b; coords[1].z = -1;
- coords[2].x = -f.r; coords[2].y = -f.b; coords[2].z = -1;
- coords[3].x = -f.r; coords[3].y = -f.t; coords[3].z = -1;
- break;
-
- default:
- ERR("Unexpected texture target %#x\n", This->texture_target);
- return;
- }
-
- context = context_acquire(device, (IWineD3DSurface*)This, CTXUSAGE_BLIT);
-
- ENTER_GL();
-
- glEnable(bind_target);
- checkGLcall("glEnable(bind_target)");
- glBindTexture(bind_target, This->texture_name);
- checkGLcall("glBindTexture(bind_target, This->texture_name)");
- glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- checkGLcall("glTexParameteri");
- glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- checkGLcall("glTexParameteri");
+ surface_get_rect(This, rect_in, &src_rect);
+ context = context_acquire(device, This);
+ context_apply_blit_state(context, device);
if (context->render_offscreen)
{
- LONG tmp = rect.top;
- rect.top = rect.bottom;
- rect.bottom = tmp;
+ dst_rect.left = src_rect.left;
+ dst_rect.right = src_rect.right;
+ dst_rect.top = src_rect.bottom;
+ dst_rect.bottom = src_rect.top;
+ }
+ else
+ {
+ dst_rect = src_rect;
}
- glBegin(GL_QUADS);
- glTexCoord3fv(&coords[0].x);
- glVertex2i(rect.left, rect.top);
+ if ((This->Flags & SFLAG_SWAPCHAIN) && This == ((IWineD3DSwapChainImpl *)This->container)->front_buffer)
+ surface_translate_frontbuffer_coords(This, context->win_handle, &dst_rect);
- glTexCoord3fv(&coords[1].x);
- glVertex2i(rect.left, rect.bottom);
-
- glTexCoord3fv(&coords[2].x);
- glVertex2i(rect.right, rect.bottom);
-
- glTexCoord3fv(&coords[3].x);
- glVertex2i(rect.right, rect.top);
- glEnd();
- checkGLcall("glEnd");
-
- glDisable(bind_target);
- checkGLcall("glDisable(bind_target)");
+ device->blitter->set_shader((IWineD3DDevice *) device, This);
+ ENTER_GL();
+ draw_textured_quad(This, &src_rect, &dst_rect, WINED3DTEXF_POINT);
LEAVE_GL();
- wglFlush(); /* Flush to ensure ordering across contexts. */
+ device->blitter->set_shader((IWineD3DDevice *) device, This);
- /* 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);
- }
+ swapchain = (This->Flags & SFLAG_SWAPCHAIN) ? (IWineD3DSwapChainImpl *)This->container : NULL;
+ if (wined3d_settings.strict_draw_ordering || (swapchain
+ && (This == swapchain->front_buffer || swapchain->num_contexts > 1)))
+ wglFlush(); /* Flush to ensure ordering across contexts. */
context_release(context);
}
@@ -4851,16 +4390,32 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
IWineD3DDeviceImpl *device = This->resource.device;
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- GLenum format, internal, type;
+ struct wined3d_format_desc desc;
CONVERT_TYPES convert;
- int bpp;
int width, pitch, outpitch;
BYTE *mem;
BOOL drawable_read_ok = TRUE;
BOOL in_fbo = FALSE;
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
- if (surface_is_offscreen(iface))
+ if (This->resource.usage & WINED3DUSAGE_DEPTHSTENCIL)
+ {
+ if (flag == SFLAG_INTEXTURE)
+ {
+ struct wined3d_context *context = context_acquire(device, NULL);
+ surface_load_ds_location(This, context, SFLAG_DS_OFFSCREEN);
+ context_release(context);
+ return WINED3D_OK;
+ }
+ else
+ {
+ FIXME("Unimplemented location %#x for depth/stencil buffers.\n", flag);
+ return WINED3DERR_INVALIDCALL;
+ }
+ }
+
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
+ if (surface_is_offscreen(This))
{
/* With ORM_FBO, SFLAG_INTEXTURE and SFLAG_INDRAWABLE are the same for offscreen targets.
* Prefer SFLAG_INTEXTURE. */
@@ -4898,10 +4453,10 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
{
struct wined3d_context *context = NULL;
- if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ if (!device->isInDraw) context = context_acquire(device, NULL);
surface_bind_and_dirtify(This, !(This->Flags & SFLAG_INTEXTURE));
- surface_download_data(This);
+ surface_download_data(This, gl_info);
if (context) context_release(context);
}
@@ -4916,6 +4471,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
if(This->Flags & SFLAG_INTEXTURE) {
surface_blt_to_drawable(This, rect);
} else {
+ int byte_count;
if((This->Flags & SFLAG_LOCATIONS) == SFLAG_INSRGBTEX) {
/* This needs a shader to convert the srgb data sampled from the GL texture into RGB
* values, otherwise we get incorrect values in the target. For now go the slow way
@@ -4924,7 +4480,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
IWineD3DSurfaceImpl_LoadLocation(iface, SFLAG_INSYSMEM, rect);
}
- d3dfmt_get_conv(This, TRUE /* We need color keying */, FALSE /* We won't use textures */, &format, &internal, &type, &convert, &bpp, FALSE);
+ d3dfmt_get_conv(This, FALSE /* We need color keying */, FALSE /* We won't use textures */, &desc, &convert);
/* The width is in 'length' not in bytes */
width = This->currentDesc.Width;
@@ -4938,16 +4494,17 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
TRACE("Removing the pbo attached to surface %p\n", This);
- if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
- surface_remove_pbo(This);
+ if (!device->isInDraw) context = context_acquire(device, NULL);
+ surface_remove_pbo(This, gl_info);
if (context) context_release(context);
}
if((convert != NO_CONVERSION) && This->resource.allocatedMemory) {
int height = This->currentDesc.Height;
+ byte_count = desc.conv_byte_count;
/* Stick to the alignment for the converted surface too, makes it easier to load the surface */
- outpitch = width * bpp;
+ outpitch = width * byte_count;
outpitch = (outpitch + device->surface_alignment - 1) & ~(device->surface_alignment - 1);
mem = HeapAlloc(GetProcessHeap(), 0, outpitch * height);
@@ -4961,9 +4518,10 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
} else {
This->Flags &= ~SFLAG_CONVERTED;
mem = This->resource.allocatedMemory;
+ byte_count = desc.byte_count;
}
- flush_to_framebuffer_drawpixels(This, format, type, bpp, mem);
+ flush_to_framebuffer_drawpixels(This, desc.glFormat, desc.glType, byte_count, mem);
/* Don't delete PBO memory */
if((mem != This->resource.allocatedMemory) && !(This->Flags & SFLAG_PBO))
@@ -4980,7 +4538,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
struct wined3d_context *context = NULL;
d3dfmt_get_conv(This, TRUE /* We need color keying */, TRUE /* We will use textures */,
- &format, &internal, &type, &convert, &bpp, srgb);
+ &desc, &convert);
if(srgb) {
if((This->Flags & (SFLAG_INTEXTURE | SFLAG_INSYSMEM)) == SFLAG_INTEXTURE) {
@@ -5002,9 +4560,9 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
IWineD3DSurfaceImpl_LoadLocation(iface, SFLAG_INSYSMEM, rect);
}
- if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ if (!device->isInDraw) context = context_acquire(device, NULL);
- surface_prepare_texture(This, srgb);
+ surface_prepare_texture(This, gl_info, srgb);
surface_bind_and_dirtify(This, srgb);
if(This->CKeyFlags & WINEDDSD_CKSRCBLT) {
@@ -5019,16 +4577,32 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
/* Don't use PBOs for converted surfaces. During PBO conversion we look at SFLAG_CONVERTED
* but it isn't set (yet) in all cases it is getting called. */
- if((convert != NO_CONVERSION) && (This->Flags & SFLAG_PBO)) {
+ if(((convert != NO_CONVERSION) || desc.convert) && (This->Flags & SFLAG_PBO)) {
TRACE("Removing the pbo attached to surface %p\n", This);
- surface_remove_pbo(This);
+ surface_remove_pbo(This, gl_info);
}
- if((convert != NO_CONVERSION) && This->resource.allocatedMemory) {
+ if(desc.convert) {
+ /* This code is entered for texture formats which need a fixup. */
int height = This->currentDesc.Height;
/* Stick to the alignment for the converted surface too, makes it easier to load the surface */
- outpitch = width * bpp;
+ outpitch = width * desc.conv_byte_count;
+ outpitch = (outpitch + device->surface_alignment - 1) & ~(device->surface_alignment - 1);
+
+ mem = HeapAlloc(GetProcessHeap(), 0, outpitch * height);
+ if(!mem) {
+ ERR("Out of memory %d, %d!\n", outpitch, height);
+ if (context) context_release(context);
+ return WINED3DERR_OUTOFVIDEOMEMORY;
+ }
+ desc.convert(This->resource.allocatedMemory, mem, pitch, width, height);
+ } else if((convert != NO_CONVERSION) && This->resource.allocatedMemory) {
+ /* This code is only entered for color keying fixups */
+ int height = This->currentDesc.Height;
+
+ /* Stick to the alignment for the converted surface too, makes it easier to load the surface */
+ outpitch = width * desc.conv_byte_count;
outpitch = (outpitch + device->surface_alignment - 1) & ~(device->surface_alignment - 1);
mem = HeapAlloc(GetProcessHeap(), 0, outpitch * height);
@@ -5038,12 +4612,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
return WINED3DERR_OUTOFVIDEOMEMORY;
}
d3dfmt_convert_surface(This->resource.allocatedMemory, mem, pitch, width, height, outpitch, convert, This);
- }
- else if (This->resource.format_desc->format == WINED3DFMT_P8_UINT
- && (gl_info->supported[EXT_PALETTED_TEXTURE] || device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup)))
- {
- d3dfmt_p8_upload_palette(iface, convert);
- mem = This->resource.allocatedMemory;
} else {
mem = This->resource.allocatedMemory;
}
@@ -5053,19 +4621,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
glPixelStorei(GL_UNPACK_ROW_LENGTH, width);
LEAVE_GL();
- if ((This->Flags & SFLAG_NONPOW2) && !(This->Flags & SFLAG_OVERSIZE)) {
- TRACE("non power of two support\n");
- if (mem || (This->Flags & SFLAG_PBO)) {
- surface_upload_data(This, internal, This->currentDesc.Width, This->currentDesc.Height, format, type, mem);
- }
- } else {
- /* 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 (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);
- }
- }
+ if (mem || (This->Flags & SFLAG_PBO))
+ surface_upload_data(This, gl_info, &desc, srgb, mem);
/* Restore the default pitch */
ENTER_GL();
@@ -5107,7 +4664,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_SetContainer(IWineD3DSurface *iface, I
} else if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) {
switch(wined3d_settings.offscreen_rendering_mode) {
case ORM_FBO: This->get_drawable_size = get_drawable_size_fbo; break;
- case ORM_PBUFFER: This->get_drawable_size = get_drawable_size_pbuffer; break;
case ORM_BACKBUFFER: This->get_drawable_size = get_drawable_size_backbuffer; break;
}
}
@@ -5141,16 +4697,15 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_DrawOverlay(IWineD3DSurface *iface) {
return hr;
}
-BOOL surface_is_offscreen(IWineD3DSurface *iface)
+BOOL surface_is_offscreen(IWineD3DSurfaceImpl *surface)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
- IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *) This->container;
+ IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)surface->container;
/* Not on a swapchain - must be offscreen */
- if (!(This->Flags & SFLAG_SWAPCHAIN)) return TRUE;
+ if (!(surface->Flags & SFLAG_SWAPCHAIN)) return TRUE;
/* The front buffer is always onscreen */
- if(iface == swapchain->frontBuffer) return FALSE;
+ if (surface == swapchain->front_buffer) return FALSE;
/* If the swapchain is rendered to an FBO, the backbuffer is
* offscreen, otherwise onscreen */
@@ -5212,20 +4767,42 @@ const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl =
IWineD3DSurfaceImpl_GetImplType,
IWineD3DSurfaceImpl_DrawOverlay
};
-#undef GLINFO_LOCATION
-#define GLINFO_LOCATION device->adapter->gl_info
static HRESULT ffp_blit_alloc(IWineD3DDevice *iface) { return WINED3D_OK; }
/* Context activation is done by the caller. */
static void ffp_blit_free(IWineD3DDevice *iface) { }
+/* This function is used in case of 8bit paletted textures using GL_EXT_paletted_texture */
/* Context activation is done by the caller. */
-static HRESULT ffp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatDesc *format_desc,
- GLenum textype, UINT width, UINT height)
+static void ffp_blit_p8_upload_palette(IWineD3DSurfaceImpl *surface, const struct wined3d_gl_info *gl_info)
{
+ BYTE table[256][4];
+ BOOL colorkey_active = (surface->CKeyFlags & WINEDDSD_CKSRCBLT) ? TRUE : FALSE;
+
+ d3dfmt_p8_init_palette(surface, table, colorkey_active);
+
+ TRACE("Using GL_EXT_PALETTED_TEXTURE for 8-bit paletted texture support\n");
ENTER_GL();
- glEnable(textype);
- checkGLcall("glEnable(textype)");
+ GL_EXTCALL(glColorTableEXT(surface->texture_target, GL_RGBA, 256, GL_RGBA, GL_UNSIGNED_BYTE, table));
+ LEAVE_GL();
+}
+
+/* Context activation is done by the caller. */
+static HRESULT ffp_blit_set(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface)
+{
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface;
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ enum complex_fixup fixup = get_complex_fixup(surface->resource.format_desc->color_fixup);
+
+ /* When EXT_PALETTED_TEXTURE is around, palette conversion is done by the GPU
+ * else the surface is converted in software at upload time in LoadLocation.
+ */
+ if(fixup == COMPLEX_FIXUP_P8 && gl_info->supported[EXT_PALETTED_TEXTURE])
+ ffp_blit_p8_upload_palette(surface, gl_info);
+
+ ENTER_GL();
+ glEnable(surface->texture_target);
+ checkGLcall("glEnable(surface->texture_target)");
LEAVE_GL();
return WINED3D_OK;
}
@@ -5252,16 +4829,52 @@ static void ffp_blit_unset(IWineD3DDevice *iface)
LEAVE_GL();
}
-static BOOL ffp_blit_color_fixup_supported(struct color_fixup_desc fixup)
+static BOOL ffp_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op,
+ const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool,
+ const struct wined3d_format_desc *src_format_desc,
+ const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool,
+ const struct wined3d_format_desc *dst_format_desc)
{
+ enum complex_fixup src_fixup;
+
+ if (blit_op == BLIT_OP_COLOR_FILL)
+ {
+ if (!(dst_usage & WINED3DUSAGE_RENDERTARGET))
+ {
+ TRACE("Color fill not supported\n");
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ src_fixup = get_complex_fixup(src_format_desc->color_fixup);
if (TRACE_ON(d3d_surface) && TRACE_ON(d3d))
{
TRACE("Checking support for fixup:\n");
- dump_color_fixup_desc(fixup);
+ dump_color_fixup_desc(src_format_desc->color_fixup);
+ }
+
+ if (blit_op != BLIT_OP_BLIT)
+ {
+ TRACE("Unsupported blit_op=%d\n", blit_op);
+ return FALSE;
+ }
+
+ if (!is_identity_fixup(dst_format_desc->color_fixup))
+ {
+ TRACE("Destination fixups are not supported\n");
+ return FALSE;
+ }
+
+ if (src_fixup == COMPLEX_FIXUP_P8 && gl_info->supported[EXT_PALETTED_TEXTURE])
+ {
+ TRACE("P8 fixup supported\n");
+ return TRUE;
}
/* We only support identity conversions. */
- if (is_identity_fixup(fixup))
+ if (is_identity_fixup(src_format_desc->color_fixup))
{
TRACE("[OK]\n");
return TRUE;
@@ -5271,10 +4884,105 @@ static BOOL ffp_blit_color_fixup_supported(struct color_fixup_desc fixup)
return FALSE;
}
+static HRESULT ffp_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD fill_color)
+{
+ return IWineD3DDeviceImpl_ClearSurface(device, dst_surface, 1 /* Number of rectangles */,
+ (const WINED3DRECT*)dst_rect, WINED3DCLEAR_TARGET, fill_color, 0.0f /* Z */, 0 /* Stencil */);
+}
+
const struct blit_shader ffp_blit = {
ffp_blit_alloc,
ffp_blit_free,
ffp_blit_set,
ffp_blit_unset,
- ffp_blit_color_fixup_supported
+ ffp_blit_supported,
+ ffp_blit_color_fill
};
+
+static HRESULT cpu_blit_alloc(IWineD3DDevice *iface)
+{
+ return WINED3D_OK;
+}
+
+/* Context activation is done by the caller. */
+static void cpu_blit_free(IWineD3DDevice *iface)
+{
+}
+
+/* Context activation is done by the caller. */
+static HRESULT cpu_blit_set(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface)
+{
+ return WINED3D_OK;
+}
+
+/* Context activation is done by the caller. */
+static void cpu_blit_unset(IWineD3DDevice *iface)
+{
+}
+
+static BOOL cpu_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op,
+ const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool,
+ const struct wined3d_format_desc *src_format_desc,
+ const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool,
+ const struct wined3d_format_desc *dst_format_desc)
+{
+ if (blit_op == BLIT_OP_COLOR_FILL)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static HRESULT cpu_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD fill_color)
+{
+ WINEDDBLTFX BltFx;
+ memset(&BltFx, 0, sizeof(BltFx));
+ BltFx.dwSize = sizeof(BltFx);
+ BltFx.u5.dwFillColor = color_convert_argb_to_fmt(fill_color, dst_surface->resource.format_desc->format);
+ return IWineD3DBaseSurfaceImpl_Blt((IWineD3DSurface*)dst_surface, dst_rect, NULL, NULL, WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT);
+}
+
+const struct blit_shader cpu_blit = {
+ cpu_blit_alloc,
+ cpu_blit_free,
+ cpu_blit_set,
+ cpu_blit_unset,
+ cpu_blit_supported,
+ cpu_blit_color_fill
+};
+
+static BOOL fbo_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op,
+ const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool,
+ const struct wined3d_format_desc *src_format_desc,
+ const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool,
+ const struct wined3d_format_desc *dst_format_desc)
+{
+ if ((wined3d_settings.offscreen_rendering_mode != ORM_FBO) || !gl_info->fbo_ops.glBlitFramebuffer)
+ return FALSE;
+
+ /* We only support blitting. Things like color keying / color fill should
+ * be handled by other blitters.
+ */
+ if (blit_op != BLIT_OP_BLIT)
+ return FALSE;
+
+ /* Source and/or destination need to be on the GL side */
+ if (src_pool == WINED3DPOOL_SYSTEMMEM || dst_pool == WINED3DPOOL_SYSTEMMEM)
+ return FALSE;
+
+ if(!((src_format_desc->Flags & WINED3DFMT_FLAG_FBO_ATTACHABLE) || (src_usage & WINED3DUSAGE_RENDERTARGET))
+ && ((dst_format_desc->Flags & WINED3DFMT_FLAG_FBO_ATTACHABLE) || (dst_usage & WINED3DUSAGE_RENDERTARGET)))
+ return FALSE;
+
+ if (!is_identity_fixup(src_format_desc->color_fixup) ||
+ !is_identity_fixup(dst_format_desc->color_fixup))
+ return FALSE;
+
+ if (!(src_format_desc->format == dst_format_desc->format
+ || (is_identity_fixup(src_format_desc->color_fixup)
+ && is_identity_fixup(dst_format_desc->color_fixup))))
+ return FALSE;
+
+ return TRUE;
+}
diff --git a/dll/directx/wine/wined3d/surface_base.c b/dll/directx/wine/wined3d/surface_base.c
index 33e3d3ed885..2b6cdb41f22 100644
--- a/dll/directx/wine/wined3d/surface_base.c
+++ b/dll/directx/wine/wined3d/surface_base.c
@@ -83,9 +83,6 @@ static inline unsigned short float_32_to_16(const float *in)
return ret;
}
-
-/* Do NOT define GLINFO_LOCATION in this file. THIS CODE MUST NOT USE IT */
-
/* *******************************************
IWineD3DSurface IUnknown parts follow
******************************************* */
@@ -326,7 +323,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetPalette(IWineD3DSurface *iface, IWineD
DWORD WINAPI IWineD3DBaseSurfaceImpl_GetPitch(IWineD3DSurface *iface) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
- const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
+ const struct wined3d_format_desc *format_desc = This->resource.format_desc;
DWORD ret;
TRACE("(%p)\n", This);
@@ -502,7 +499,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetContainer(IWineD3DSurface *iface, IWin
HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3DFORMAT format) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format,
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(format,
&This->resource.device->adapter->gl_info);
if (This->resource.format_desc->format != WINED3DFMT_UNKNOWN)
@@ -527,7 +524,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3D
HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
+ const struct wined3d_format_desc *format_desc = This->resource.format_desc;
int extraline = 0;
SYSTEM_INFO sysInfo;
BITMAPINFO* b_info;
@@ -742,6 +739,55 @@ static void convert_a8r8g8b8_x8r8g8b8(const BYTE *src, BYTE *dst,
}
}
+static inline BYTE cliptobyte(int x)
+{
+ return (BYTE) ((x < 0) ? 0 : ((x > 255) ? 255 : x));
+}
+
+static void convert_yuy2_x8r8g8b8(const BYTE *src, BYTE *dst,
+ DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h)
+{
+ unsigned int x, y;
+ int c2, d, e, r2 = 0, g2 = 0, b2 = 0;
+
+ TRACE("Converting %ux%u pixels, pitches %u %u\n", w, h, pitch_in, pitch_out);
+
+ for (y = 0; y < h; ++y)
+ {
+ const BYTE *src_line = src + y * pitch_in;
+ DWORD *dst_line = (DWORD *)(dst + y * pitch_out);
+ for (x = 0; x < w; ++x)
+ {
+ /* YUV to RGB conversion formulas from http://en.wikipedia.org/wiki/YUV:
+ * C = Y - 16; D = U - 128; E = V - 128;
+ * R = cliptobyte((298 * C + 409 * E + 128) >> 8);
+ * G = cliptobyte((298 * C - 100 * D - 208 * E + 128) >> 8);
+ * B = cliptobyte((298 * C + 516 * D + 128) >> 8);
+ * Two adjacent YUY2 pixels are stored as four bytes: Y0 U Y1 V .
+ * U and V are shared between the pixels.
+ */
+ if (!(x & 1)) /* for every even pixel, read new U and V */
+ {
+ d = (int) src_line[1] - 128;
+ e = (int) src_line[3] - 128;
+ r2 = 409 * e + 128;
+ g2 = - 100 * d - 208 * e + 128;
+ b2 = 516 * d + 128;
+ }
+ c2 = 298 * ((int) src_line[0] - 16);
+ dst_line[x] = 0xff000000
+ | cliptobyte((c2 + r2) >> 8) << 16 /* red */
+ | cliptobyte((c2 + g2) >> 8) << 8 /* green */
+ | cliptobyte((c2 + b2) >> 8); /* blue */
+ /* Scale RGB values to 0..255 range,
+ * then clip them if still not in range (may be negative),
+ * then shift them within DWORD if necessary.
+ */
+ src_line += 2;
+ }
+ }
+}
+
struct d3dfmt_convertor_desc {
WINED3DFORMAT from, to;
void (*convert)(const BYTE *src, BYTE *dst, DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h);
@@ -752,6 +798,7 @@ static const struct d3dfmt_convertor_desc convertors[] =
{WINED3DFMT_R32_FLOAT, WINED3DFMT_R16_FLOAT, convert_r32_float_r16_float},
{WINED3DFMT_B5G6R5_UNORM, WINED3DFMT_B8G8R8X8_UNORM, convert_r5g6b5_x8r8g8b8},
{WINED3DFMT_B8G8R8A8_UNORM, WINED3DFMT_B8G8R8X8_UNORM, convert_a8r8g8b8_x8r8g8b8},
+ {WINED3DFMT_YUY2, WINED3DFMT_B8G8R8X8_UNORM, convert_yuy2_x8r8g8b8},
};
static inline const struct d3dfmt_convertor_desc *find_convertor(WINED3DFORMAT from, WINED3DFORMAT to)
@@ -892,7 +939,7 @@ static HRESULT
/*****************************************************************************
* IWineD3DSurface::Blt, SW emulation version
*
- * Performs blits to a surface, eigher from a source of source-less blts
+ * Performs a blit to a surface, with or without a source surface.
* This is the main functionality of DirectDraw
*
* Params:
@@ -909,7 +956,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D
HRESULT ret = WINED3D_OK;
WINED3DLOCKED_RECT dlock, slock;
int bpp, srcheight, srcwidth, dstheight, dstwidth, width;
- const struct GlPixelFormatDesc *sEntry, *dEntry;
+ const struct wined3d_format_desc *sEntry, *dEntry;
int x, y;
const BYTE *sbuf;
BYTE *dbuf;
@@ -943,144 +990,145 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D
FIXME("Filters not supported in software blit\n");
}
- /* First check for the validity of source / destination rectangles. This was
- * verified using a test application + by MSDN.
- */
- if ((Src != NULL) && (SrcRect != NULL) &&
- ((SrcRect->bottom > Src->currentDesc.Height)||(SrcRect->bottom < 0) ||
- (SrcRect->top > Src->currentDesc.Height)||(SrcRect->top < 0) ||
- (SrcRect->left > Src->currentDesc.Width) ||(SrcRect->left < 0) ||
- (SrcRect->right > Src->currentDesc.Width) ||(SrcRect->right < 0) ||
- (SrcRect->right < SrcRect->left) ||(SrcRect->bottom < SrcRect->top)))
- {
- WARN("Application gave us bad source rectangle for Blt.\n");
- return WINEDDERR_INVALIDRECT;
- }
- /* For the Destination rect, it can be out of bounds on the condition that a clipper
- * is set for the given surface.
- */
- if ((/*This->clipper == NULL*/ TRUE) && (DestRect) &&
- ((DestRect->bottom > This->currentDesc.Height)||(DestRect->bottom < 0) ||
- (DestRect->top > This->currentDesc.Height)||(DestRect->top < 0) ||
- (DestRect->left > This->currentDesc.Width) ||(DestRect->left < 0) ||
- (DestRect->right > This->currentDesc.Width) ||(DestRect->right < 0) ||
- (DestRect->right < DestRect->left) ||(DestRect->bottom < DestRect->top)))
- {
- WARN("Application gave us bad destination rectangle for Blt without a clipper set.\n");
- return WINEDDERR_INVALIDRECT;
- }
+ /* First check for the validity of source / destination rectangles.
+ * This was verified using a test application + by MSDN. */
- /* Now handle negative values in the rectangles. Warning: only supported for now
- in the 'simple' cases (ie not in any stretching / rotation cases).
-
- First, the case where nothing is to be done.
- */
- if ((DestRect && ((DestRect->bottom <= 0) || (DestRect->right <= 0) ||
- (DestRect->top >= (int) This->currentDesc.Height) ||
- (DestRect->left >= (int) This->currentDesc.Width))) ||
- ((Src != NULL) && (SrcRect != NULL) &&
- ((SrcRect->bottom <= 0) || (SrcRect->right <= 0) ||
- (SrcRect->top >= (int) Src->currentDesc.Height) ||
- (SrcRect->left >= (int) Src->currentDesc.Width)) ))
+ if (SrcRect)
{
- TRACE("Nothing to be done !\n");
- return WINED3D_OK;
+ if (Src)
+ {
+ if (SrcRect->right < SrcRect->left || SrcRect->bottom < SrcRect->top
+ || SrcRect->left > Src->currentDesc.Width || SrcRect->left < 0
+ || SrcRect->top > Src->currentDesc.Height || SrcRect->top < 0
+ || SrcRect->right > Src->currentDesc.Width || SrcRect->right < 0
+ || SrcRect->bottom > Src->currentDesc.Height || SrcRect->bottom < 0)
+ {
+ WARN("Application gave us bad source rectangle for Blt.\n");
+ return WINEDDERR_INVALIDRECT;
+ }
+
+ if (!SrcRect->right || !SrcRect->bottom
+ || SrcRect->left == (int)Src->currentDesc.Width
+ || SrcRect->top == (int)Src->currentDesc.Height)
+ {
+ TRACE("Nothing to be done.\n");
+ return WINED3D_OK;
+ }
+ }
+
+ xsrc = *SrcRect;
+ }
+ else if (Src)
+ {
+ xsrc.left = 0;
+ xsrc.top = 0;
+ xsrc.right = Src->currentDesc.Width;
+ xsrc.bottom = Src->currentDesc.Height;
+ }
+ else
+ {
+ memset(&xsrc, 0, sizeof(xsrc));
}
if (DestRect)
{
- xdst = *DestRect;
- }
- else
- {
- xdst.top = 0;
- xdst.bottom = This->currentDesc.Height;
- xdst.left = 0;
- xdst.right = This->currentDesc.Width;
- }
-
- if (SrcRect)
- {
- xsrc = *SrcRect;
- }
- else
- {
- if (Src)
+ /* For the Destination rect, it can be out of bounds on the condition
+ * that a clipper is set for the given surface. */
+ if (!This->clipper && (DestRect->right < DestRect->left || DestRect->bottom < DestRect->top
+ || DestRect->left > This->currentDesc.Width || DestRect->left < 0
+ || DestRect->top > This->currentDesc.Height || DestRect->top < 0
+ || DestRect->right > This->currentDesc.Width || DestRect->right < 0
+ || DestRect->bottom > This->currentDesc.Height || DestRect->bottom < 0))
{
- xsrc.top = 0;
- xsrc.bottom = Src->currentDesc.Height;
- xsrc.left = 0;
- xsrc.right = Src->currentDesc.Width;
+ WARN("Application gave us bad destination rectangle for Blt without a clipper set.\n");
+ return WINEDDERR_INVALIDRECT;
+ }
+
+ if (DestRect->right <= 0 || DestRect->bottom <= 0
+ || DestRect->left >= (int)This->currentDesc.Width
+ || DestRect->top >= (int)This->currentDesc.Height)
+ {
+ TRACE("Nothing to be done.\n");
+ return WINED3D_OK;
+ }
+
+ if (!Src)
+ {
+ RECT full_rect;
+
+ full_rect.left = 0;
+ full_rect.top = 0;
+ full_rect.right = This->currentDesc.Width;
+ full_rect.bottom = This->currentDesc.Height;
+ IntersectRect(&xdst, &full_rect, DestRect);
}
else
{
- memset(&xsrc,0,sizeof(xsrc));
+ BOOL clip_horiz, clip_vert;
+
+ xdst = *DestRect;
+ clip_horiz = xdst.left < 0 || xdst.right > (int)This->currentDesc.Width;
+ clip_vert = xdst.top < 0 || xdst.bottom > (int)This->currentDesc.Height;
+
+ if (clip_vert || clip_horiz)
+ {
+ /* Now check if this is a special case or not... */
+ if ((Flags & WINEDDBLT_DDFX)
+ || (clip_horiz && xdst.right - xdst.left != xsrc.right - xsrc.left)
+ || (clip_vert && xdst.bottom - xdst.top != xsrc.bottom - xsrc.top))
+ {
+ WARN("Out of screen rectangle in special case. Not handled right now.\n");
+ return WINED3D_OK;
+ }
+
+ if (clip_horiz)
+ {
+ if (xdst.left < 0)
+ {
+ xsrc.left -= xdst.left;
+ xdst.left = 0;
+ }
+ if (xdst.right > This->currentDesc.Width)
+ {
+ xsrc.right -= (xdst.right - (int)This->currentDesc.Width);
+ xdst.right = (int)This->currentDesc.Width;
+ }
+ }
+
+ if (clip_vert)
+ {
+ if (xdst.top < 0)
+ {
+ xsrc.top -= xdst.top;
+ xdst.top = 0;
+ }
+ if (xdst.bottom > This->currentDesc.Height)
+ {
+ xsrc.bottom -= (xdst.bottom - (int)This->currentDesc.Height);
+ xdst.bottom = (int)This->currentDesc.Height;
+ }
+ }
+
+ /* And check if after clipping something is still to be done... */
+ if ((xdst.right <= 0) || (xdst.bottom <= 0)
+ || (xdst.left >= (int)This->currentDesc.Width)
+ || (xdst.top >= (int)This->currentDesc.Height)
+ || (xsrc.right <= 0) || (xsrc.bottom <= 0)
+ || (xsrc.left >= (int) Src->currentDesc.Width)
+ || (xsrc.top >= (int)Src->currentDesc.Height))
+ {
+ TRACE("Nothing to be done after clipping.\n");
+ return WINED3D_OK;
+ }
+ }
}
}
-
- /* The easy case : the source-less blits.... */
- if (Src == NULL && DestRect)
+ else
{
- RECT full_rect;
- RECT temp_rect; /* No idea if intersect rect can be the same as one of the source rect */
-
- full_rect.left = 0;
- full_rect.top = 0;
- full_rect.right = This->currentDesc.Width;
- full_rect.bottom = This->currentDesc.Height;
- IntersectRect(&temp_rect, &full_rect, DestRect);
- xdst = temp_rect;
- }
- else if (DestRect)
- {
- /* Only handle clipping on the destination rectangle */
- int clip_horiz = (DestRect->left < 0) || (DestRect->right > (int) This->currentDesc.Width );
- int clip_vert = (DestRect->top < 0) || (DestRect->bottom > (int) This->currentDesc.Height);
- if (clip_vert || clip_horiz)
- {
- /* Now check if this is a special case or not... */
- if ((((DestRect->bottom - DestRect->top ) != (xsrc.bottom - xsrc.top )) && clip_vert ) ||
- (((DestRect->right - DestRect->left) != (xsrc.right - xsrc.left)) && clip_horiz) ||
- (Flags & WINEDDBLT_DDFX))
- {
- WARN("Out of screen rectangle in special case. Not handled right now.\n");
- return WINED3D_OK;
- }
-
- if (clip_horiz)
- {
- if (DestRect->left < 0) { xsrc.left -= DestRect->left; xdst.left = 0; }
- if (DestRect->right > This->currentDesc.Width)
- {
- xsrc.right -= (DestRect->right - (int) This->currentDesc.Width);
- xdst.right = (int) This->currentDesc.Width;
- }
- }
- if (clip_vert)
- {
- if (DestRect->top < 0)
- {
- xsrc.top -= DestRect->top;
- xdst.top = 0;
- }
- if (DestRect->bottom > This->currentDesc.Height)
- {
- xsrc.bottom -= (DestRect->bottom - (int) This->currentDesc.Height);
- xdst.bottom = (int) This->currentDesc.Height;
- }
- }
- /* And check if after clipping something is still to be done... */
- if ((xdst.bottom <= 0) || (xdst.right <= 0) ||
- (xdst.top >= (int) This->currentDesc.Height) ||
- (xdst.left >= (int) This->currentDesc.Width) ||
- (xsrc.bottom <= 0) || (xsrc.right <= 0) ||
- (xsrc.top >= (int) Src->currentDesc.Height) ||
- (xsrc.left >= (int) Src->currentDesc.Width))
- {
- TRACE("Nothing to be done after clipping !\n");
- return WINED3D_OK;
- }
- }
+ xdst.left = 0;
+ xdst.top = 0;
+ xdst.right = This->currentDesc.Width;
+ xdst.bottom = This->currentDesc.Height;
}
if (Src == This)
@@ -1552,7 +1600,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dst
RECT lock_src, lock_dst, lock_union;
const BYTE *sbuf;
BYTE *dbuf;
- const struct GlPixelFormatDesc *sEntry, *dEntry;
+ const struct wined3d_format_desc *sEntry, *dEntry;
if (TRACE_ON(d3d_surface))
{
@@ -1833,7 +1881,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DL
}
else
{
- const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
+ const struct wined3d_format_desc *format_desc = This->resource.format_desc;
TRACE("Lock Rect (%p) = l %d, t %d, r %d, b %d\n",
pRect, pRect->left, pRect->top, pRect->right, pRect->bottom);
diff --git a/dll/directx/wine/wined3d/surface_gdi.c b/dll/directx/wine/wined3d/surface_gdi.c
index 3f09dc3c130..580c88a9080 100644
--- a/dll/directx/wine/wined3d/surface_gdi.c
+++ b/dll/directx/wine/wined3d/surface_gdi.c
@@ -200,7 +200,7 @@ IWineGDISurfaceImpl_UnlockRect(IWineD3DSurface *iface)
/* Tell the swapchain to update the screen */
if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DSwapChain, (void **)&swapchain)))
{
- if(iface == swapchain->frontBuffer)
+ if (This == swapchain->front_buffer)
{
x11_copy_to_screen(swapchain, &This->lockedRect);
}
@@ -240,7 +240,8 @@ IWineGDISurfaceImpl_Flip(IWineD3DSurface *iface,
return WINEDDERR_NOTFLIPPABLE;
}
- hr = IWineD3DSwapChain_Present((IWineD3DSwapChain *) swapchain, NULL, NULL, 0, NULL, 0);
+ hr = IWineD3DSwapChain_Present((IWineD3DSwapChain *)swapchain,
+ NULL, NULL, swapchain->win_handle, NULL, 0);
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
return hr;
}
@@ -296,9 +297,9 @@ const char* filename)
FILE* f = NULL;
UINT y = 0, x = 0;
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
+ const struct wined3d_format_desc *format_desc = This->resource.format_desc;
static char *output = NULL;
static UINT size = 0;
- const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
if (This->pow2Width > size) {
output = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->pow2Width * 3);
@@ -340,14 +341,13 @@ const char* filename)
fwrite(output, 3 * This->pow2Width, 1, f);
}
} else {
- int red_shift, green_shift, blue_shift, pix_width, alpha_shift;
+ int red_shift, green_shift, blue_shift, pix_width;
pix_width = format_desc->byte_count;
red_shift = get_shift(format_desc->red_mask);
green_shift = get_shift(format_desc->green_mask);
blue_shift = get_shift(format_desc->blue_mask);
- alpha_shift = get_shift(format_desc->alpha_mask);
for (y = 0; y < This->pow2Height; y++) {
const unsigned char *src = This->resource.allocatedMemory + (y * 1 * IWineD3DSurface_GetPitch(iface));
@@ -366,8 +366,8 @@ const char* filename)
output[3 * x + 0] = red_shift > 0 ? comp >> red_shift : comp << -red_shift;
comp = color & format_desc->green_mask;
output[3 * x + 1] = green_shift > 0 ? comp >> green_shift : comp << -green_shift;
- comp = color & format_desc->alpha_mask;
- output[3 * x + 2] = alpha_shift > 0 ? comp >> alpha_shift : comp << -alpha_shift;
+ comp = color & format_desc->blue_mask;
+ output[3 * x + 2] = blue_shift > 0 ? comp >> blue_shift : comp << -blue_shift;
}
fwrite(output, 3 * This->pow2Width, 1, f);
}
@@ -430,7 +430,7 @@ static HRESULT WINAPI IWineGDISurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHD
IWineD3DSurfaceImpl *dds_primary;
IWineD3DSwapChainImpl *swapchain;
swapchain = (IWineD3DSwapChainImpl *)This->resource.device->swapchains[0];
- dds_primary = (IWineD3DSurfaceImpl *)swapchain->frontBuffer;
+ dds_primary = swapchain->front_buffer;
if (dds_primary && dds_primary->palette)
pal = dds_primary->palette->palents;
}
@@ -500,7 +500,7 @@ static HRESULT WINAPI IWineGDISurfaceImpl_RealizePalette(IWineD3DSurface *iface)
/* Tell the swapchain to update the screen */
if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DSwapChain, (void **)&swapchain)))
{
- if(iface == swapchain->frontBuffer)
+ if (This == swapchain->front_buffer)
{
x11_copy_to_screen(swapchain, NULL);
}
diff --git a/dll/directx/wine/wined3d/swapchain.c b/dll/directx/wine/wined3d/swapchain.c
index cbdb961f705..b0d591a7587 100644
--- a/dll/directx/wine/wined3d/swapchain.c
+++ b/dll/directx/wine/wined3d/swapchain.c
@@ -33,8 +33,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
WINE_DECLARE_DEBUG_CHANNEL(fps);
-#define GLINFO_LOCATION This->device->adapter->gl_info
-
/*IWineD3DSwapChain parts follow: */
static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface)
{
@@ -46,32 +44,32 @@ static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface)
IWineD3DSwapChain_SetGammaRamp(iface, 0, &This->orig_gamma);
- /* Release the swapchain's draw buffers. Make sure This->backBuffer[0] is
+ /* Release the swapchain's draw buffers. Make sure This->back_buffers[0] is
* the last buffer to be destroyed, FindContext() depends on that. */
- if (This->frontBuffer)
+ if (This->front_buffer)
{
- IWineD3DSurface_SetContainer(This->frontBuffer, 0);
- if (IWineD3DSurface_Release(This->frontBuffer))
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)This->front_buffer, NULL);
+ if (IWineD3DSurface_Release((IWineD3DSurface *)This->front_buffer))
{
WARN("(%p) Something's still holding the front buffer (%p).\n",
- This, This->frontBuffer);
+ This, This->front_buffer);
}
- This->frontBuffer = NULL;
+ This->front_buffer = NULL;
}
- if (This->backBuffer)
+ if (This->back_buffers)
{
UINT i = This->presentParms.BackBufferCount;
while (i--)
{
- IWineD3DSurface_SetContainer(This->backBuffer[i], 0);
- if (IWineD3DSurface_Release(This->backBuffer[i]))
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)This->back_buffers[i], NULL);
+ if (IWineD3DSurface_Release((IWineD3DSurface *)This->back_buffers[i]))
WARN("(%p) Something's still holding back buffer %u (%p).\n",
- This, i, This->backBuffer[i]);
+ This, i, This->back_buffers[i]);
}
- HeapFree(GetProcessHeap(), 0, This->backBuffer);
- This->backBuffer = NULL;
+ HeapFree(GetProcessHeap(), 0, This->back_buffers);
+ This->back_buffers = NULL;
}
for (i = 0; i < This->num_contexts; ++i)
@@ -100,11 +98,13 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context *
const RECT *src_rect, const RECT *dst_rect)
{
IWineD3DDeviceImpl *device = This->device;
- IWineD3DSurfaceImpl *backbuffer = ((IWineD3DSurfaceImpl *) This->backBuffer[0]);
+ IWineD3DSurfaceImpl *backbuffer = This->back_buffers[0];
UINT src_w = src_rect->right - src_rect->left;
UINT src_h = src_rect->bottom - src_rect->top;
GLenum gl_filter;
const struct wined3d_gl_info *gl_info = context->gl_info;
+ RECT win_rect;
+ UINT win_h;
TRACE("swapchain %p, context %p, src_rect %s, dst_rect %s.\n",
This, context, wine_dbgstr_rect(src_rect), wine_dbgstr_rect(dst_rect));
@@ -114,12 +114,14 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context *
else
gl_filter = GL_LINEAR;
- if (gl_info->fbo_ops.glBlitFramebuffer)
+ GetClientRect(This->win_handle, &win_rect);
+ win_h = win_rect.bottom - win_rect.top;
+
+ if (gl_info->fbo_ops.glBlitFramebuffer && is_identity_fixup(backbuffer->resource.format_desc->color_fixup))
{
ENTER_GL();
- context_bind_fbo(context, GL_READ_FRAMEBUFFER, &context->src_fbo);
- context_attach_surface_fbo(context, GL_READ_FRAMEBUFFER, 0, This->backBuffer[0]);
- context_attach_depth_stencil_fbo(context, GL_READ_FRAMEBUFFER, NULL, FALSE);
+ context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, backbuffer, NULL);
+ glReadBuffer(GL_COLOR_ATTACHMENT0);
context_bind_fbo(context, GL_DRAW_FRAMEBUFFER, NULL);
context_set_draw_buffer(context, GL_BACK);
@@ -129,8 +131,8 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context *
/* Note that the texture is upside down */
gl_info->fbo_ops.glBlitFramebuffer(src_rect->left, src_rect->top, src_rect->right, src_rect->bottom,
- dst_rect->left, dst_rect->bottom, dst_rect->right, dst_rect->top,
- GL_COLOR_BUFFER_BIT, gl_filter);
+ dst_rect->left, win_h - dst_rect->top, dst_rect->right, win_h - dst_rect->bottom,
+ GL_COLOR_BUFFER_BIT, gl_filter);
checkGLcall("Swapchain present blit(EXT_framebuffer_blit)\n");
LEAVE_GL();
}
@@ -142,7 +144,8 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context *
float tex_right = src_rect->right;
float tex_bottom = src_rect->bottom;
- context2 = context_acquire(This->device, This->backBuffer[0], CTXUSAGE_BLIT);
+ context2 = context_acquire(This->device, This->back_buffers[0]);
+ context_apply_blit_state(context2, device);
if(backbuffer->Flags & SFLAG_NORMCOORD)
{
@@ -152,30 +155,31 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context *
tex_bottom /= src_h;
}
+ if (is_complex_fixup(backbuffer->resource.format_desc->color_fixup))
+ gl_filter = GL_NEAREST;
+
ENTER_GL();
context_bind_fbo(context2, GL_DRAW_FRAMEBUFFER, NULL);
/* Set up the texture. The surface is not in a IWineD3D*Texture container,
* so there are no d3d texture settings to dirtify
*/
- device->blitter->set_shader((IWineD3DDevice *) device, backbuffer->resource.format_desc,
- backbuffer->texture_target, backbuffer->pow2Width,
- backbuffer->pow2Height);
- glTexParameteri(backbuffer->texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(backbuffer->texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ device->blitter->set_shader((IWineD3DDevice *) device, backbuffer);
+ glTexParameteri(backbuffer->texture_target, GL_TEXTURE_MIN_FILTER, gl_filter);
+ glTexParameteri(backbuffer->texture_target, GL_TEXTURE_MAG_FILTER, gl_filter);
context_set_draw_buffer(context, GL_BACK);
/* Set the viewport to the destination rectandle, disable any projection
- * transformation set up by CTXUSAGE_BLIT, and draw a (-1,-1)-(1,1) quad.
+ * transformation set up by context_apply_blit_state(), and draw a
+ * (-1,-1)-(1,1) quad.
*
* Back up viewport and matrix to avoid breaking last_was_blit
*
- * Note that CTXUSAGE_BLIT set up viewport and ortho to match the surface
- * size - we want the GL drawable(=window) size.
- */
+ * Note that context_apply_blit_state() set up viewport and ortho to
+ * match the surface size - we want the GL drawable(=window) size. */
glPushAttrib(GL_VIEWPORT_BIT);
- glViewport(dst_rect->left, dst_rect->top, dst_rect->right, dst_rect->bottom);
+ glViewport(dst_rect->left, win_h - dst_rect->bottom, dst_rect->right, win_h - dst_rect->top);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
@@ -211,6 +215,7 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context *
static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion, DWORD dwFlags) {
IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
RECT src_rect, dst_rect;
BOOL render_to_fbo;
@@ -219,7 +224,15 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
IWineD3DSwapChain_SetDestWindowOverride(iface, hDestWindowOverride);
- context = context_acquire(This->device, This->backBuffer[0], CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This->device, This->back_buffers[0]);
+ if (!context->valid)
+ {
+ context_release(context);
+ WARN("Invalid context, skipping present.\n");
+ return WINED3D_OK;
+ }
+
+ gl_info = context->gl_info;
/* Render the cursor onto the back buffer, using our nifty directdraw blitting code :-) */
if (This->device->bCursorVisible && This->device->cursorTexture)
@@ -242,17 +255,13 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
cursor.resource.ref = 1;
cursor.resource.device = This->device;
cursor.resource.pool = WINED3DPOOL_SCRATCH;
- cursor.resource.format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, context->gl_info);
+ cursor.resource.format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, gl_info);
cursor.resource.resourceType = WINED3DRTYPE_SURFACE;
cursor.texture_name = This->device->cursorTexture;
cursor.texture_target = GL_TEXTURE_2D;
cursor.texture_level = 0;
cursor.currentDesc.Width = This->device->cursorWidth;
cursor.currentDesc.Height = This->device->cursorHeight;
- cursor.glRect.left = 0;
- cursor.glRect.top = 0;
- cursor.glRect.right = cursor.currentDesc.Width;
- cursor.glRect.bottom = cursor.currentDesc.Height;
/* The cursor must have pow2 sizes */
cursor.pow2Width = cursor.currentDesc.Width;
cursor.pow2Height = cursor.currentDesc.Height;
@@ -264,14 +273,15 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
if (This->presentParms.Windowed) {
MapWindowPoints(NULL, This->win_handle, (LPPOINT)&destRect, 2);
}
- IWineD3DSurface_Blt(This->backBuffer[0], &destRect, (IWineD3DSurface *)&cursor,
+ IWineD3DSurface_Blt((IWineD3DSurface *)This->back_buffers[0], &destRect, (IWineD3DSurface *)&cursor,
NULL, WINEDDBLT_KEYSRC, NULL, WINED3DTEXF_POINT);
}
if (This->device->logo_surface)
{
/* Blit the logo into the upper left corner of the drawable. */
- IWineD3DSurface_BltFast(This->backBuffer[0], 0, 0, This->device->logo_surface, NULL, WINEDDBLTFAST_SRCCOLORKEY);
+ IWineD3DSurface_BltFast((IWineD3DSurface *)This->back_buffers[0], 0, 0,
+ This->device->logo_surface, NULL, WINEDDBLTFAST_SRCCOLORKEY);
}
TRACE("Presenting HDC %p.\n", context->hdc);
@@ -315,8 +325,8 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
*/
if (!This->render_to_fbo && render_to_fbo && wined3d_settings.offscreen_rendering_mode == ORM_FBO)
{
- IWineD3DSurface_LoadLocation(This->backBuffer[0], SFLAG_INTEXTURE, NULL);
- IWineD3DSurface_ModifyLocation(This->backBuffer[0], SFLAG_INDRAWABLE, FALSE);
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)This->back_buffers[0], SFLAG_INTEXTURE, NULL);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)This->back_buffers[0], SFLAG_INDRAWABLE, FALSE);
This->render_to_fbo = TRUE;
/* Force the context manager to update the render target configuration next draw. */
@@ -420,14 +430,14 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
WINED3DCLEAR_TARGET, 0xff00ffff, 1.0f, 0);
}
- if(!This->render_to_fbo &&
- ( ((IWineD3DSurfaceImpl *) This->frontBuffer)->Flags & SFLAG_INSYSMEM ||
- ((IWineD3DSurfaceImpl *) This->backBuffer[0])->Flags & SFLAG_INSYSMEM ) ) {
+ if (!This->render_to_fbo && ((This->front_buffer->Flags & SFLAG_INSYSMEM)
+ || (This->back_buffers[0]->Flags & SFLAG_INSYSMEM)))
+ {
/* Both memory copies of the surfaces are ok, flip them around too instead of dirtifying
* Doesn't work with render_to_fbo because we're not flipping
*/
- IWineD3DSurfaceImpl *front = (IWineD3DSurfaceImpl *) This->frontBuffer;
- IWineD3DSurfaceImpl *back = (IWineD3DSurfaceImpl *) This->backBuffer[0];
+ IWineD3DSurfaceImpl *front = This->front_buffer;
+ IWineD3DSurfaceImpl *back = This->back_buffers[0];
if(front->resource.size == back->resource.size) {
DWORD fbflags;
@@ -438,35 +448,45 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
* This serves to update the emulated overlay, if any
*/
fbflags = front->Flags;
- IWineD3DSurface_ModifyLocation(This->frontBuffer, SFLAG_INDRAWABLE, TRUE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)front, SFLAG_INDRAWABLE, TRUE);
front->Flags = fbflags;
} else {
IWineD3DSurface_ModifyLocation((IWineD3DSurface *) front, SFLAG_INDRAWABLE, TRUE);
IWineD3DSurface_ModifyLocation((IWineD3DSurface *) back, SFLAG_INDRAWABLE, TRUE);
}
- } else {
- IWineD3DSurface_ModifyLocation(This->frontBuffer, SFLAG_INDRAWABLE, TRUE);
+ }
+ else
+ {
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)This->front_buffer, SFLAG_INDRAWABLE, TRUE);
/* If the swapeffect is DISCARD, the back buffer is undefined. That means the SYSMEM
* and INTEXTURE copies can keep their old content if they have any defined content.
* If the swapeffect is COPY, the content remains the same. If it is FLIP however,
* the texture / sysmem copy needs to be reloaded from the drawable
*/
- if(This->presentParms.SwapEffect == WINED3DSWAPEFFECT_FLIP) {
- IWineD3DSurface_ModifyLocation(This->backBuffer[0], SFLAG_INDRAWABLE, TRUE);
+ if (This->presentParms.SwapEffect == WINED3DSWAPEFFECT_FLIP)
+ {
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)This->back_buffers[0], SFLAG_INDRAWABLE, TRUE);
}
}
- if (This->device->stencilBufferTarget)
+ if (This->device->depth_stencil)
{
if (This->presentParms.Flags & WINED3DPRESENTFLAG_DISCARD_DEPTHSTENCIL
- || ((IWineD3DSurfaceImpl *)This->device->stencilBufferTarget)->Flags & SFLAG_DISCARD)
+ || This->device->depth_stencil->Flags & SFLAG_DISCARD)
{
- surface_modify_ds_location(This->device->stencilBufferTarget, SFLAG_DS_DISCARDED);
+ surface_modify_ds_location(This->device->depth_stencil, SFLAG_DS_DISCARDED,
+ This->device->depth_stencil->currentDesc.Width,
+ This->device->depth_stencil->currentDesc.Height);
+ if (This->device->depth_stencil == This->device->onscreen_depth_stencil)
+ {
+ IWineD3DSurface_Release((IWineD3DSurface *)This->device->onscreen_depth_stencil);
+ This->device->onscreen_depth_stencil = NULL;
+ }
}
}
if (This->presentParms.PresentationInterval != WINED3DPRESENT_INTERVAL_IMMEDIATE
- && context->gl_info->supported[SGI_VIDEO_SYNC])
+ && gl_info->supported[SGI_VIDEO_SYNC])
{
retval = GL_EXTCALL(glXGetVideoSyncSGI(&sync));
if(retval != 0) {
@@ -514,47 +534,16 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DSwapChainImpl_SetDestWindowOverride(IWineD3DSwapChain *iface, HWND window) {
- IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
- WINED3DLOCKED_RECT r;
- BYTE *mem;
+static HRESULT WINAPI IWineD3DSwapChainImpl_SetDestWindowOverride(IWineD3DSwapChain *iface, HWND window)
+{
+ IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)iface;
- if (!window || window == This->win_handle) return WINED3D_OK;
+ if (!window) window = swapchain->device_window;
+ if (window == swapchain->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])
- {
- /* The primary context 'owns' all the opengl resources. Destroying and recreating that context requires downloading
- * all opengl resources, deleting the gl resources, destroying all other contexts, then recreating all other contexts
- * and reload the resources
- */
- delete_opengl_contexts((IWineD3DDevice *)This->device, iface);
- This->win_handle = window;
- create_primary_opengl_context((IWineD3DDevice *)This->device, iface);
- }
- else
- {
- This->win_handle = window;
+ TRACE("Setting swapchain %p window from %p to %p\n", swapchain, swapchain->win_handle, window);
+ swapchain->win_handle = window;
- /* The old back buffer has to be copied over to the new back buffer. A lockrect - switchcontext - unlockrect
- * would suffice in theory, but it is rather nasty and may cause troubles with future changes of the locking code
- * So lock read only, copy the surface out, then lock with the discard flag and write back
- */
- IWineD3DSurface_LockRect(This->backBuffer[0], &r, NULL, WINED3DLOCK_READONLY);
- mem = HeapAlloc(GetProcessHeap(), 0, r.Pitch * ((IWineD3DSurfaceImpl *) This->backBuffer[0])->currentDesc.Height);
- memcpy(mem, r.pBits, r.Pitch * ((IWineD3DSurfaceImpl *) This->backBuffer[0])->currentDesc.Height);
- IWineD3DSurface_UnlockRect(This->backBuffer[0]);
-
- context_destroy(This->device, This->context[0]);
- This->context[0] = context_create(This->device, (IWineD3DSurfaceImpl *)This->frontBuffer,
- This->win_handle, FALSE /* pbuffer */, &This->presentParms);
- context_release(This->context[0]);
-
- IWineD3DSurface_LockRect(This->backBuffer[0], &r, NULL, WINED3DLOCK_DISCARD);
- memcpy(r.pBits, mem, r.Pitch * ((IWineD3DSurfaceImpl *) This->backBuffer[0])->currentDesc.Height);
- HeapFree(GetProcessHeap(), 0, mem);
- IWineD3DSurface_UnlockRect(This->backBuffer[0]);
- }
return WINED3D_OK;
}
@@ -599,7 +588,7 @@ static LONG fullscreen_exstyle(LONG exstyle)
void swapchain_setup_fullscreen_window(IWineD3DSwapChainImpl *swapchain, UINT w, UINT h)
{
IWineD3DDeviceImpl *device = swapchain->device;
- HWND window = swapchain->win_handle;
+ HWND window = swapchain->device_window;
BOOL filter_messages;
LONG style, exstyle;
@@ -633,7 +622,7 @@ void swapchain_setup_fullscreen_window(IWineD3DSwapChainImpl *swapchain, UINT w,
void swapchain_restore_fullscreen_window(IWineD3DSwapChainImpl *swapchain)
{
IWineD3DDeviceImpl *device = swapchain->device;
- HWND window = swapchain->win_handle;
+ HWND window = swapchain->device_window;
BOOL filter_messages;
LONG style, exstyle;
@@ -671,7 +660,7 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
IWineD3DDeviceImpl *device, WINED3DPRESENT_PARAMETERS *present_parameters, IUnknown *parent)
{
const struct wined3d_adapter *adapter = device->adapter;
- const struct GlPixelFormatDesc *format_desc;
+ const struct wined3d_format_desc *format_desc;
BOOL displaymode_set = FALSE;
WINED3DDISPLAYMODE mode;
RECT client_rect;
@@ -713,6 +702,7 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
swapchain->parent = parent;
swapchain->ref = 1;
swapchain->win_handle = window;
+ swapchain->device_window = window;
if (!present_parameters->Windowed && window)
{
@@ -768,18 +758,19 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
hr = IWineD3DDeviceParent_CreateRenderTarget(device->device_parent, parent,
swapchain->presentParms.BackBufferWidth, swapchain->presentParms.BackBufferHeight,
swapchain->presentParms.BackBufferFormat, swapchain->presentParms.MultiSampleType,
- swapchain->presentParms.MultiSampleQuality, TRUE /* Lockable */, &swapchain->frontBuffer);
+ swapchain->presentParms.MultiSampleQuality, TRUE /* Lockable */,
+ (IWineD3DSurface **)&swapchain->front_buffer);
if (FAILED(hr))
{
WARN("Failed to create front buffer, hr %#x.\n", hr);
goto err;
}
- IWineD3DSurface_SetContainer(swapchain->frontBuffer, (IWineD3DBase *)swapchain);
- ((IWineD3DSurfaceImpl *)swapchain->frontBuffer)->Flags |= SFLAG_SWAPCHAIN;
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->front_buffer, (IWineD3DBase *)swapchain);
+ swapchain->front_buffer->Flags |= SFLAG_SWAPCHAIN;
if (surface_type == SURFACE_OPENGL)
{
- IWineD3DSurface_ModifyLocation(swapchain->frontBuffer, SFLAG_INDRAWABLE, TRUE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)swapchain->front_buffer, SFLAG_INDRAWABLE, TRUE);
}
/* MSDN says we're only allowed a single fullscreen swapchain per device,
@@ -816,14 +807,49 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
if (surface_type == SURFACE_OPENGL)
{
- swapchain->context[0] = context_create(device, (IWineD3DSurfaceImpl *)swapchain->frontBuffer,
- window, FALSE /* pbuffer */, present_parameters);
+ WINED3DFORMAT formats[] =
+ {
+ WINED3DFMT_D24_UNORM_S8_UINT,
+ WINED3DFMT_D32_UNORM,
+ WINED3DFMT_R24_UNORM_X8_TYPELESS,
+ WINED3DFMT_D16_UNORM,
+ WINED3DFMT_S1_UINT_D15_UNORM
+ };
+
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+
+ /* In WGL both color, depth and stencil are features of a pixel format. In case of D3D they are separate.
+ * You are able to add a depth + stencil surface at a later stage when you need it.
+ * In order to support this properly in WineD3D we need the ability to recreate the opengl context and
+ * drawable when this is required. This is very tricky as we need to reapply ALL opengl states for the new
+ * context, need torecreate shaders, textures and other resources.
+ *
+ * The context manager already takes care of the state problem and for the other tasks code from Reset
+ * can be used. These changes are way to risky during the 1.0 code freeze which is taking place right now.
+ * Likely a lot of other new bugs will be exposed. For that reason request a depth stencil surface all the
+ * time. It can cause a slight performance hit but fixes a lot of regressions. A fixme reminds of that this
+ * issue needs to be fixed. */
+ for (i = 0; i < (sizeof(formats) / sizeof(*formats)); i++)
+ {
+ swapchain->ds_format = getFormatDescEntry(formats[i], gl_info);
+ swapchain->context[0] = context_create(swapchain, swapchain->front_buffer, swapchain->ds_format);
+ if (swapchain->context[0]) break;
+ TRACE("Depth stencil format %s is not supported, trying next format\n",
+ debug_d3dformat(formats[i]));
+ }
+
if (!swapchain->context[0])
{
WARN("Failed to create context.\n");
hr = WINED3DERR_NOTAVAILABLE;
goto err;
}
+
+ if (!present_parameters->EnableAutoDepthStencil
+ || swapchain->presentParms.AutoDepthStencilFormat != swapchain->ds_format->format)
+ {
+ FIXME("Add OpenGL context recreation support to context_validate_onscreen_formats\n");
+ }
context_release(swapchain->context[0]);
}
else
@@ -833,9 +859,9 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
if (swapchain->presentParms.BackBufferCount > 0)
{
- swapchain->backBuffer = HeapAlloc(GetProcessHeap(), 0,
- sizeof(*swapchain->backBuffer) * swapchain->presentParms.BackBufferCount);
- if (!swapchain->backBuffer)
+ swapchain->back_buffers = HeapAlloc(GetProcessHeap(), 0,
+ sizeof(*swapchain->back_buffers) * swapchain->presentParms.BackBufferCount);
+ if (!swapchain->back_buffers)
{
ERR("Failed to allocate backbuffer array memory.\n");
hr = E_OUTOFMEMORY;
@@ -848,15 +874,16 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
hr = IWineD3DDeviceParent_CreateRenderTarget(device->device_parent, parent,
swapchain->presentParms.BackBufferWidth, swapchain->presentParms.BackBufferHeight,
swapchain->presentParms.BackBufferFormat, swapchain->presentParms.MultiSampleType,
- swapchain->presentParms.MultiSampleQuality, TRUE /* Lockable */, &swapchain->backBuffer[i]);
+ swapchain->presentParms.MultiSampleQuality, TRUE /* Lockable */,
+ (IWineD3DSurface **)&swapchain->back_buffers[i]);
if (FAILED(hr))
{
WARN("Failed to create back buffer %u, hr %#x.\n", i, hr);
goto err;
}
- IWineD3DSurface_SetContainer(swapchain->backBuffer[i], (IWineD3DBase *)swapchain);
- ((IWineD3DSurfaceImpl *)swapchain->backBuffer[i])->Flags |= SFLAG_SWAPCHAIN;
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->back_buffers[i], (IWineD3DBase *)swapchain);
+ swapchain->back_buffers[i]->Flags |= SFLAG_SWAPCHAIN;
}
}
@@ -864,20 +891,20 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
if (present_parameters->EnableAutoDepthStencil && surface_type == SURFACE_OPENGL)
{
TRACE("Creating depth/stencil buffer.\n");
- if (!device->auto_depth_stencil_buffer)
+ if (!device->auto_depth_stencil)
{
hr = IWineD3DDeviceParent_CreateDepthStencilSurface(device->device_parent, parent,
swapchain->presentParms.BackBufferWidth, swapchain->presentParms.BackBufferHeight,
swapchain->presentParms.AutoDepthStencilFormat, swapchain->presentParms.MultiSampleType,
swapchain->presentParms.MultiSampleQuality, FALSE /* FIXME: Discard */,
- &device->auto_depth_stencil_buffer);
+ (IWineD3DSurface **)&device->auto_depth_stencil);
if (FAILED(hr))
{
WARN("Failed to create the auto depth stencil, hr %#x.\n", hr);
goto err;
}
- IWineD3DSurface_SetContainer(device->auto_depth_stencil_buffer, NULL);
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)device->auto_depth_stencil, NULL);
}
}
@@ -902,13 +929,13 @@ err:
ChangeDisplaySettingsExW(adapter->DeviceName, &devmode, NULL, CDS_FULLSCREEN, NULL);
}
- if (swapchain->backBuffer)
+ if (swapchain->back_buffers)
{
for (i = 0; i < swapchain->presentParms.BackBufferCount; ++i)
{
- if (swapchain->backBuffer[i]) IWineD3DSurface_Release(swapchain->backBuffer[i]);
+ if (swapchain->back_buffers[i]) IWineD3DSurface_Release((IWineD3DSurface *)swapchain->back_buffers[i]);
}
- HeapFree(GetProcessHeap(), 0, swapchain->backBuffer);
+ HeapFree(GetProcessHeap(), 0, swapchain->back_buffers);
}
if (swapchain->context)
@@ -922,7 +949,7 @@ err:
HeapFree(GetProcessHeap(), 0, swapchain->context);
}
- if (swapchain->frontBuffer) IWineD3DSurface_Release(swapchain->frontBuffer);
+ if (swapchain->front_buffer) IWineD3DSurface_Release((IWineD3DSurface *)swapchain->front_buffer);
return hr;
}
@@ -935,9 +962,7 @@ struct wined3d_context *swapchain_create_context_for_thread(IWineD3DSwapChain *i
TRACE("Creating a new context for swapchain %p, thread %d\n", This, GetCurrentThreadId());
- ctx = context_create(This->device, (IWineD3DSurfaceImpl *)This->frontBuffer,
- This->context[0]->win_handle, FALSE /* pbuffer */, &This->presentParms);
- if (!ctx)
+ if (!(ctx = context_create(This, This->front_buffer, This->ds_format)))
{
ERR("Failed to create a new context for the swapchain\n");
return NULL;
@@ -962,9 +987,8 @@ struct wined3d_context *swapchain_create_context_for_thread(IWineD3DSwapChain *i
void get_drawable_size_swapchain(struct wined3d_context *context, UINT *width, UINT *height)
{
- IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)context->current_rt;
/* The drawable size of an onscreen drawable is the surface size.
* (Actually: The window size, but the surface is created in window size) */
- *width = surface->currentDesc.Width;
- *height = surface->currentDesc.Height;
+ *width = context->current_rt->currentDesc.Width;
+ *height = context->current_rt->currentDesc.Height;
}
diff --git a/dll/directx/wine/wined3d/swapchain_base.c b/dll/directx/wine/wined3d/swapchain_base.c
index 4c0590e4691..1817de2079a 100644
--- a/dll/directx/wine/wined3d/swapchain_base.c
+++ b/dll/directx/wine/wined3d/swapchain_base.c
@@ -85,7 +85,7 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetFrontBufferData(IWineD3DSwapChain *i
MapWindowPoints(This->win_handle, NULL, &start, 1);
}
- IWineD3DSurface_BltFast(pDestSurface, start.x, start.y, This->frontBuffer, NULL, 0);
+ IWineD3DSurface_BltFast(pDestSurface, start.x, start.y, (IWineD3DSurface *)This->front_buffer, NULL, 0);
return WINED3D_OK;
}
@@ -106,12 +106,13 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetBackBuffer(IWineD3DSwapChain *iface,
* used (there This->backBuffer is always NULL). We need this because this function has
* to be called from IWineD3DStateBlockImpl_InitStartupStateBlock to get the default
* scissorrect dimensions. */
- if( !This->backBuffer ) {
+ if (!This->back_buffers)
+ {
*ppBackBuffer = NULL;
return WINED3DERR_INVALIDCALL;
}
- *ppBackBuffer = This->backBuffer[iBackBuffer];
+ *ppBackBuffer = (IWineD3DSurface *)This->back_buffers[iBackBuffer];
TRACE("(%p) : BackBuf %d Type %d returning %p\n", This, iBackBuffer, Type, *ppBackBuffer);
/* Note inc ref on returned surface */
@@ -145,15 +146,14 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetDisplayMode(IWineD3DSwapChain *iface
return hr;
}
-HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetDevice(IWineD3DSwapChain *iface, IWineD3DDevice**ppDevice) {
+HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetDevice(IWineD3DSwapChain *iface, IWineD3DDevice **device)
+{
IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
- *ppDevice = (IWineD3DDevice *)This->device;
+ *device = (IWineD3DDevice *)This->device;
+ IWineD3DDevice_AddRef(*device);
- /* Note Calling this method will increase the internal reference count
- on the IDirect3DDevice9 interface. */
- IWineD3DDevice_AddRef(*ppDevice);
- TRACE("(%p) : returning %p\n", This, *ppDevice);
+ TRACE("(%p) : returning %p\n", This, *device);
return WINED3D_OK;
}
@@ -171,9 +171,9 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_SetGammaRamp(IWineD3DSwapChain *iface,
IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
HDC hDC;
TRACE("(%p) : pRamp@%p flags(%d)\n", This, pRamp, Flags);
- hDC = GetDC(This->win_handle);
+ hDC = GetDC(This->device_window);
SetDeviceGammaRamp(hDC, (LPVOID)pRamp);
- ReleaseDC(This->win_handle, hDC);
+ ReleaseDC(This->device_window, hDC);
return WINED3D_OK;
}
@@ -183,9 +183,9 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetGammaRamp(IWineD3DSwapChain *iface,
IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
HDC hDC;
TRACE("(%p) : pRamp@%p\n", This, pRamp);
- hDC = GetDC(This->win_handle);
+ hDC = GetDC(This->device_window);
GetDeviceGammaRamp(hDC, pRamp);
- ReleaseDC(This->win_handle, hDC);
+ ReleaseDC(This->device_window, hDC);
return WINED3D_OK;
}
diff --git a/dll/directx/wine/wined3d/swapchain_gdi.c b/dll/directx/wine/wined3d/swapchain_gdi.c
index c437b419f8e..b80352c1dce 100644
--- a/dll/directx/wine/wined3d/swapchain_gdi.c
+++ b/dll/directx/wine/wined3d/swapchain_gdi.c
@@ -37,24 +37,27 @@ static void WINAPI IWineGDISwapChainImpl_Destroy(IWineD3DSwapChain *iface)
IWineD3DSwapChain_SetGammaRamp(iface, 0, &This->orig_gamma);
/* release the ref to the front and back buffer parents */
- if(This->frontBuffer) {
- IWineD3DSurface_SetContainer(This->frontBuffer, 0);
- if (IWineD3DSurface_Release(This->frontBuffer) > 0)
+ if (This->front_buffer)
+ {
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)This->front_buffer, NULL);
+ if (IWineD3DSurface_Release((IWineD3DSurface *)This->front_buffer) > 0)
{
WARN("(%p) Something's still holding the front buffer\n",This);
}
}
- if(This->backBuffer) {
+ if (This->back_buffers)
+ {
UINT i;
- for(i = 0; i < This->presentParms.BackBufferCount; i++) {
- IWineD3DSurface_SetContainer(This->backBuffer[i], 0);
- if (IWineD3DSurface_Release(This->backBuffer[i]) > 0)
+ for (i = 0; i < This->presentParms.BackBufferCount; ++i)
+ {
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)This->back_buffers[i], NULL);
+ if (IWineD3DSurface_Release((IWineD3DSurface *)This->back_buffers[i]))
{
WARN("(%p) Something's still holding the back buffer\n",This);
}
}
- HeapFree(GetProcessHeap(), 0, This->backBuffer);
+ HeapFree(GetProcessHeap(), 0, This->back_buffers);
}
/* Restore the screen resolution if we rendered in fullscreen
@@ -86,7 +89,7 @@ static void WINAPI IWineGDISwapChainImpl_Destroy(IWineD3DSwapChain *iface)
*****************************************************************************/
void x11_copy_to_screen(IWineD3DSwapChainImpl *This, const RECT *rc)
{
- IWineD3DSurfaceImpl *front = (IWineD3DSurfaceImpl *) This->frontBuffer;
+ IWineD3DSurfaceImpl *front = This->front_buffer;
if(front->resource.usage & WINED3DUSAGE_RENDERTARGET) {
POINT offset = {0,0};
@@ -172,12 +175,13 @@ static HRESULT WINAPI IWineGDISwapChainImpl_Present(IWineD3DSwapChain *iface, CO
IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *) iface;
IWineD3DSurfaceImpl *front, *back;
- if(!This->backBuffer) {
+ if (!This->back_buffers)
+ {
WARN("Swapchain doesn't have a backbuffer, returning WINED3DERR_INVALIDCALL\n");
return WINED3DERR_INVALIDCALL;
}
- front = (IWineD3DSurfaceImpl *) This->frontBuffer;
- back = (IWineD3DSurfaceImpl *) This->backBuffer[0];
+ front = This->front_buffer;
+ back = This->back_buffers[0];
/* Flip the DC */
{
@@ -226,7 +230,7 @@ static HRESULT WINAPI IWineGDISwapChainImpl_Present(IWineD3DSwapChain *iface, CO
/* FPS support */
if (TRACE_ON(fps))
{
- static long prev_time, frames;
+ static LONG prev_time, frames;
DWORD time = GetTickCount();
frames++;
diff --git a/dll/directx/wine/wined3d/texture.c b/dll/directx/wine/wined3d/texture.c
index 1e272144a8a..98e7909370e 100644
--- a/dll/directx/wine/wined3d/texture.c
+++ b/dll/directx/wine/wined3d/texture.c
@@ -63,21 +63,22 @@ static void texture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRG
{
/* context_acquire() sets isInDraw to TRUE when loading a pbuffer into a texture,
* thus no danger of recursive calls. */
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
}
if (This->resource.format_desc->format == WINED3DFMT_P8_UINT
|| This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM)
{
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < This->baseTexture.level_count; ++i)
{
- if (palette9_changed((IWineD3DSurfaceImpl *)This->surfaces[i]))
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
+ if (palette9_changed(surface))
{
TRACE("Reloading surface because the d3d8/9 palette was changed.\n");
/* TODO: This is not necessarily needed with hw palettized texture support. */
- IWineD3DSurface_LoadLocation(This->surfaces[i], SFLAG_INSYSMEM, NULL);
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, NULL);
/* Make sure the texture is reloaded because of the palette change, this kills performance though :( */
- IWineD3DSurface_ModifyLocation(This->surfaces[i], SFLAG_INTEXTURE, FALSE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INTEXTURE, FALSE);
}
}
}
@@ -86,9 +87,9 @@ static void texture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRG
* since the last load then reload the surfaces. */
if (*dirty)
{
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < This->baseTexture.level_count; ++i)
{
- IWineD3DSurface_LoadTexture(This->surfaces[i], srgb_mode);
+ IWineD3DSurface_LoadTexture((IWineD3DSurface *)This->baseTexture.sub_resources[i], srgb_mode);
}
}
else
@@ -108,17 +109,18 @@ static void texture_cleanup(IWineD3DTextureImpl *This)
TRACE("(%p) : Cleaning up\n", This);
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < This->baseTexture.level_count; ++i)
{
- if (This->surfaces[i])
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
+ if (surface)
{
/* Clean out the texture name we gave to the surface so that the
* surface doesn't try and release it */
- surface_set_texture_name(This->surfaces[i], 0, TRUE);
- surface_set_texture_name(This->surfaces[i], 0, FALSE);
- surface_set_texture_target(This->surfaces[i], 0);
- IWineD3DSurface_SetContainer(This->surfaces[i], 0);
- IWineD3DSurface_Release(This->surfaces[i]);
+ surface_set_texture_name(surface, 0, TRUE);
+ surface_set_texture_name(surface, 0, FALSE);
+ surface_set_texture_target(surface, 0);
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)surface, NULL);
+ IWineD3DSurface_Release((IWineD3DSurface *)surface);
}
}
@@ -204,10 +206,12 @@ static void WINAPI IWineD3DTextureImpl_UnLoad(IWineD3DTexture *iface) {
* surface before, this one will be a NOP and vice versa. Unloading an unloaded
* surface is fine
*/
- for (i = 0; i < This->baseTexture.levels; i++) {
- IWineD3DSurface_UnLoad(This->surfaces[i]);
- surface_set_texture_name(This->surfaces[i], 0, FALSE); /* Delete rgb name */
- surface_set_texture_name(This->surfaces[i], 0, TRUE); /* delete srgb name */
+ for (i = 0; i < This->baseTexture.level_count; ++i)
+ {
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
+ IWineD3DSurface_UnLoad((IWineD3DSurface *)surface);
+ surface_set_texture_name(surface, 0, FALSE); /* Delete rgb name */
+ surface_set_texture_name(surface, 0, TRUE); /* delete srgb name */
}
basetexture_unload((IWineD3DBaseTexture *)iface);
@@ -276,14 +280,20 @@ static HRESULT WINAPI IWineD3DTextureImpl_BindTexture(IWineD3DTexture *iface, BO
gl_tex = &This->baseTexture.texture_rgb;
}
- for (i = 0; i < This->baseTexture.levels; ++i) {
- surface_set_texture_name(This->surfaces[i], gl_tex->name, This->baseTexture.is_srgb);
+ for (i = 0; i < This->baseTexture.level_count; ++i)
+ {
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
+ surface_set_texture_name(surface, gl_tex->name, This->baseTexture.is_srgb);
}
- /* Conditinal non power of two textures use a different clamping default. If we're using the GL_WINE_normalized_texrect
- * partial driver emulation, we're dealing with a GL_TEXTURE_2D texture which has the address mode set to repeat - something
- * that prevents us from hitting the accelerated codepath. Thus manually set the GL state. The same applies to filtering.
- * Even if the texture has only one mip level, the default LINEAR_MIPMAP_LINEAR filter causes a SW fallback on macos.
- */
+
+ /* Conditinal non power of two textures use a different clamping
+ * default. If we're using the GL_WINE_normalized_texrect partial
+ * driver emulation, we're dealing with a GL_TEXTURE_2D texture which
+ * has the address mode set to repeat - something that prevents us
+ * from hitting the accelerated codepath. Thus manually set the GL
+ * state. The same applies to filtering. Even if the texture has only
+ * one mip level, the default LINEAR_MIPMAP_LINEAR filter causes a SW
+ * fallback on macos. */
if(IWineD3DBaseTexture_IsCondNP2(iface)) {
ENTER_GL();
glTexParameteri(IWineD3DTexture_GetTextureDimensions(iface), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@@ -323,72 +333,94 @@ static BOOL WINAPI IWineD3DTextureImpl_IsCondNP2(IWineD3DTexture *iface) {
/* *******************************************
IWineD3DTexture IWineD3DTexture parts follow
******************************************* */
-static HRESULT WINAPI IWineD3DTextureImpl_GetLevelDesc(IWineD3DTexture *iface, UINT Level, WINED3DSURFACE_DESC* pDesc) {
- IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
+static HRESULT WINAPI IWineD3DTextureImpl_GetLevelDesc(IWineD3DTexture *iface, UINT level, WINED3DSURFACE_DESC *desc)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *surface;
- if (Level < This->baseTexture.levels) {
- TRACE("(%p) Level (%d)\n", This, Level);
- return IWineD3DSurface_GetDesc(This->surfaces[Level], pDesc);
+ TRACE("iface %p, level %u, desc %p.\n", iface, level, desc);
+
+ if (!(surface = (IWineD3DSurface *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- WARN("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
- return WINED3DERR_INVALIDCALL;
+
+ return IWineD3DSurface_GetDesc(surface, desc);
}
-static HRESULT WINAPI IWineD3DTextureImpl_GetSurfaceLevel(IWineD3DTexture *iface, UINT Level, IWineD3DSurface** ppSurfaceLevel) {
- IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
- HRESULT hr = WINED3DERR_INVALIDCALL;
+static HRESULT WINAPI IWineD3DTextureImpl_GetSurfaceLevel(IWineD3DTexture *iface,
+ UINT level, IWineD3DSurface **surface)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *s;
- if (Level < This->baseTexture.levels) {
- *ppSurfaceLevel = This->surfaces[Level];
- IWineD3DSurface_AddRef(This->surfaces[Level]);
- hr = WINED3D_OK;
- TRACE("(%p) : returning %p for level %d\n", This, *ppSurfaceLevel, Level);
+ TRACE("iface %p, level %u, surface %p.\n", iface, level, surface);
+
+ if (!(s = (IWineD3DSurface *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- if (WINED3D_OK != hr) {
- WARN("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
- *ppSurfaceLevel = NULL; /* Just to be on the safe side.. */
- }
- return hr;
+
+ IWineD3DSurface_AddRef(s);
+ *surface = s;
+
+ TRACE("Returning surface %p.\n", *surface);
+
+ return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DTextureImpl_LockRect(IWineD3DTexture *iface, UINT Level, WINED3DLOCKED_RECT *pLockedRect,
- CONST RECT *pRect, DWORD Flags) {
- IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
- HRESULT hr = WINED3DERR_INVALIDCALL;
+static HRESULT WINAPI IWineD3DTextureImpl_LockRect(IWineD3DTexture *iface,
+ UINT level, WINED3DLOCKED_RECT *locked_rect, const RECT *rect, DWORD flags)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *surface;
- if (Level < This->baseTexture.levels) {
- hr = IWineD3DSurface_LockRect(This->surfaces[Level], pLockedRect, pRect, Flags);
- }
- if (WINED3D_OK == hr) {
- TRACE("(%p) Level (%d) success\n", This, Level);
- } else {
- WARN("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
+ TRACE("iface %p, level %u, locked_rect %p, rect %s, flags %#x.\n",
+ iface, level, locked_rect, wine_dbgstr_rect(rect), flags);
+
+ if (!(surface = (IWineD3DSurface *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- return hr;
+ return IWineD3DSurface_LockRect(surface, locked_rect, rect, flags);
}
-static HRESULT WINAPI IWineD3DTextureImpl_UnlockRect(IWineD3DTexture *iface, UINT Level) {
- IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
- HRESULT hr = WINED3DERR_INVALIDCALL;
+static HRESULT WINAPI IWineD3DTextureImpl_UnlockRect(IWineD3DTexture *iface, UINT level)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *surface;
- if (Level < This->baseTexture.levels) {
- hr = IWineD3DSurface_UnlockRect(This->surfaces[Level]);
+ TRACE("iface %p, level %u.\n", iface, level);
+
+ if (!(surface = (IWineD3DSurface *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- if ( WINED3D_OK == hr) {
- TRACE("(%p) Level (%d) success\n", This, Level);
- } else {
- WARN("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
- }
- return hr;
+
+ return IWineD3DSurface_UnlockRect(surface);
}
-static HRESULT WINAPI IWineD3DTextureImpl_AddDirtyRect(IWineD3DTexture *iface, CONST RECT* pDirtyRect) {
- IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
- This->baseTexture.texture_rgb.dirty = TRUE;
- This->baseTexture.texture_srgb.dirty = TRUE;
- TRACE("(%p) : dirtyfication of surface Level (0)\n", This);
- surface_add_dirty_rect(This->surfaces[0], pDirtyRect);
+static HRESULT WINAPI IWineD3DTextureImpl_AddDirtyRect(IWineD3DTexture *iface, const RECT *dirty_rect)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurfaceImpl *surface;
+
+ TRACE("iface %p, dirty_rect %s.\n", iface, wine_dbgstr_rect(dirty_rect));
+
+ if (!(surface = (IWineD3DSurfaceImpl *)basetexture_get_sub_resource(texture, 0, 0)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ texture->baseTexture.texture_rgb.dirty = TRUE;
+ texture->baseTexture.texture_srgb.dirty = TRUE;
+ surface_add_dirty_rect(surface, dirty_rect);
return WINED3D_OK;
}
@@ -434,7 +466,7 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT
IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
{
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, gl_info);
UINT pow2_width, pow2_height;
UINT tmp_w, tmp_h;
unsigned int i;
@@ -497,8 +529,8 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT
texture->lpVtbl = &IWineD3DTexture_Vtbl;
- hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, WINED3DRTYPE_TEXTURE,
- device, 0, usage, format_desc, pool, parent, parent_ops);
+ hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, 1, levels,
+ WINED3DRTYPE_TEXTURE, device, 0, usage, format_desc, pool, parent, parent_ops);
if (FAILED(hr))
{
WARN("Failed to initialize basetexture, returning %#x.\n", hr);
@@ -565,22 +597,24 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT
/* Generate all the surfaces. */
tmp_w = width;
tmp_h = height;
- for (i = 0; i < texture->baseTexture.levels; ++i)
+ for (i = 0; i < texture->baseTexture.level_count; ++i)
{
+ IWineD3DSurface *surface;
+
/* Use the callback to create the texture surface. */
hr = IWineD3DDeviceParent_CreateSurface(device->device_parent, parent, tmp_w, tmp_h, format_desc->format,
- usage, pool, i, WINED3DCUBEMAP_FACE_POSITIVE_X, &texture->surfaces[i]);
- if (FAILED(hr) || ((IWineD3DSurfaceImpl *)texture->surfaces[i])->Flags & SFLAG_OVERSIZE)
+ usage, pool, i, 0, &surface);
+ if (FAILED(hr))
{
FIXME("Failed to create surface %p, hr %#x\n", texture, hr);
- texture->surfaces[i] = NULL;
texture_cleanup(texture);
return hr;
}
- IWineD3DSurface_SetContainer(texture->surfaces[i], (IWineD3DBase *)texture);
- TRACE("Created surface level %u @ %p.\n", i, texture->surfaces[i]);
- surface_set_texture_target(texture->surfaces[i], texture->target);
+ IWineD3DSurface_SetContainer(surface, (IWineD3DBase *)texture);
+ surface_set_texture_target((IWineD3DSurfaceImpl *)surface, texture->target);
+ texture->baseTexture.sub_resources[i] = (IWineD3DResourceImpl *)surface;
+ TRACE("Created surface level %u @ %p.\n", i, surface);
/* Calculate the next mipmap level. */
tmp_w = max(1, tmp_w >> 1);
tmp_h = max(1, tmp_h >> 1);
diff --git a/dll/directx/wine/wined3d/utils.c b/dll/directx/wine/wined3d/utils.c
index 2ff16752c33..b63a5f8cee8 100644
--- a/dll/directx/wine/wined3d/utils.c
+++ b/dll/directx/wine/wined3d/utils.c
@@ -141,31 +141,40 @@ struct wined3d_format_base_flags
static const struct wined3d_format_base_flags format_base_flags[] =
{
- {WINED3DFMT_UYVY, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_YUY2, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_YV12, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_DXT1, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_DXT2, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_DXT3, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_DXT4, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_DXT5, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_MULTI2_ARGB8, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_G8R8_G8B8, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_R8G8_B8G8, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_P8_UINT, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B8G8R8_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B8G8R8A8_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B8G8R8X8_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B5G6R5_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B5G5R5X1_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B5G5R5A1_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B4G4R4A4_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B4G4R4X4_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_R8G8B8A8_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_R8G8B8X8_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_ATI2N, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_NVHU, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_NVHS, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_UYVY, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_YUY2, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_YV12, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_DXT1, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_DXT2, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_DXT3, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_DXT4, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_DXT5, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_MULTI2_ARGB8, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_G8R8_G8B8, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_R8G8_B8G8, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_P8_UINT, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B8G8R8_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B8G8R8A8_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B8G8R8X8_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B5G6R5_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B5G5R5X1_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B5G5R5A1_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B4G4R4A4_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B4G4R4X4_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_R8G8B8A8_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_R8G8B8X8_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_ATI2N, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_NVHU, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_NVHS, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_R32_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_R32G32_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_R32G32B32_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_R32G32B32A32_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_R16_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_R16G16_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_R16G16B16A16_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_D32_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_S8_UINT_D24_FLOAT, WINED3DFMT_FLAG_FLOAT},
};
struct wined3d_format_compression_info
@@ -183,7 +192,7 @@ static const struct wined3d_format_compression_info format_compression_info[] =
{WINED3DFMT_DXT3, 4, 4, 16},
{WINED3DFMT_DXT4, 4, 4, 16},
{WINED3DFMT_DXT5, 4, 4, 16},
- {WINED3DFMT_ATI2N, 4, 4, 16},
+ {WINED3DFMT_ATI2N, 1, 1, 1},
};
struct wined3d_format_vertex_info
@@ -218,20 +227,328 @@ static const struct wined3d_format_vertex_info format_vertex_info[] =
{WINED3DFMT_R16G16B16A16_FLOAT, WINED3D_FFP_EMIT_FLOAT16_4, 4, GL_FLOAT, 4, GL_FALSE, sizeof(GLhalfNV)}
};
-typedef struct {
- WINED3DFORMAT fmt;
- GLint glInternal, glGammaInternal, rtInternal, glFormat, glType;
- unsigned int Flags;
+struct wined3d_format_texture_info
+{
+ WINED3DFORMAT format;
+ GLint gl_internal;
+ GLint gl_srgb_internal;
+ GLint gl_rt_internal;
+ GLint gl_format;
+ GLint gl_type;
+ unsigned int conv_byte_count;
+ unsigned int flags;
GL_SupportedExt extension;
-} GlPixelFormatDescTemplate;
+ void (*convert)(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height);
+};
-/*****************************************************************************
- * OpenGL format template. Contains unexciting formats which do not need
- * extension checks. The order in this table is independent of the order in
- * the table StaticPixelFormatDesc above. Not all formats have to be in this
- * table.
- */
-static const GlPixelFormatDescTemplate gl_formats_template[] = {
+static void convert_l4a4_unorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ /* WINED3DFMT_L4A4_UNORM exists as an internal gl format, but for some reason there is not
+ * format+type combination to load it. Thus convert it to A8L8, then load it
+ * with A4L4 internal, but A8L8 format+type
+ */
+ unsigned int x, y;
+ const unsigned char *Source;
+ unsigned char *Dest;
+ UINT outpitch = pitch * 2;
+
+ for(y = 0; y < height; y++) {
+ Source = src + y * pitch;
+ Dest = dst + y * outpitch;
+ for (x = 0; x < width; x++ ) {
+ unsigned char color = (*Source++);
+ /* A */ Dest[1] = (color & 0xf0) << 0;
+ /* L */ Dest[0] = (color & 0x0f) << 4;
+ Dest += 2;
+ }
+ }
+}
+
+static void convert_r5g5_snorm_l6_unorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const WORD *Source;
+
+ for(y = 0; y < height; y++)
+ {
+ unsigned short *Dest_s = (unsigned short *) (dst + y * pitch);
+ Source = (const WORD *)(src + y * pitch);
+ for (x = 0; x < width; x++ )
+ {
+ short color = (*Source++);
+ unsigned char l = ((color >> 10) & 0xfc);
+ short v = ((color >> 5) & 0x3e);
+ short u = ((color ) & 0x1f);
+ short v_conv = v + 16;
+ short u_conv = u + 16;
+
+ *Dest_s = ((v_conv << 11) & 0xf800) | ((l << 5) & 0x7e0) | (u_conv & 0x1f);
+ Dest_s += 1;
+ }
+ }
+}
+
+static void convert_r5g5_snorm_l6_unorm_nv(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const WORD *Source;
+ unsigned char *Dest;
+ UINT outpitch = (pitch * 3)/2;
+
+ /* This makes the gl surface bigger(24 bit instead of 16), but it works with
+ * fixed function and shaders without further conversion once the surface is
+ * loaded
+ */
+ for(y = 0; y < height; y++) {
+ Source = (const WORD *)(src + y * pitch);
+ Dest = dst + y * outpitch;
+ for (x = 0; x < width; x++ ) {
+ short color = (*Source++);
+ unsigned char l = ((color >> 10) & 0xfc);
+ char v = ((color >> 5) & 0x3e);
+ char u = ((color ) & 0x1f);
+
+ /* 8 bits destination, 6 bits source, 8th bit is the sign. gl ignores the sign
+ * and doubles the positive range. Thus shift left only once, gl does the 2nd
+ * shift. GL reads a signed value and converts it into an unsigned value.
+ */
+ /* M */ Dest[2] = l << 1;
+
+ /* Those are read as signed, but kept signed. Just left-shift 3 times to scale
+ * from 5 bit values to 8 bit values.
+ */
+ /* V */ Dest[1] = v << 3;
+ /* U */ Dest[0] = u << 3;
+ Dest += 3;
+ }
+ }
+}
+
+static void convert_r8g8_snorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const short *Source;
+ unsigned char *Dest;
+ UINT outpitch = (pitch * 3)/2;
+
+ for(y = 0; y < height; y++)
+ {
+ Source = (const short *)(src + y * pitch);
+ Dest = dst + y * outpitch;
+ for (x = 0; x < width; x++ )
+ {
+ LONG color = (*Source++);
+ /* B */ Dest[0] = 0xff;
+ /* G */ Dest[1] = (color >> 8) + 128; /* V */
+ /* R */ Dest[2] = (color) + 128; /* U */
+ Dest += 3;
+ }
+ }
+}
+
+static void convert_r8g8_snorm_l8x8_unorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const DWORD *Source;
+ unsigned char *Dest;
+
+ /* Doesn't work correctly with the fixed function pipeline, but can work in
+ * shaders if the shader is adjusted. (There's no use for this format in gl's
+ * standard fixed function pipeline anyway).
+ */
+ for(y = 0; y < height; y++)
+ {
+ Source = (const DWORD *)(src + y * pitch);
+ Dest = dst + y * pitch;
+ for (x = 0; x < width; x++ )
+ {
+ LONG color = (*Source++);
+ /* B */ Dest[0] = ((color >> 16) & 0xff); /* L */
+ /* G */ Dest[1] = ((color >> 8 ) & 0xff) + 128; /* V */
+ /* R */ Dest[2] = (color & 0xff) + 128; /* U */
+ Dest += 4;
+ }
+ }
+}
+
+static void convert_r8g8_snorm_l8x8_unorm_nv(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const DWORD *Source;
+ unsigned char *Dest;
+
+ /* This implementation works with the fixed function pipeline and shaders
+ * without further modification after converting the surface.
+ */
+ for(y = 0; y < height; y++)
+ {
+ Source = (const DWORD *)(src + y * pitch);
+ Dest = dst + y * pitch;
+ for (x = 0; x < width; x++ )
+ {
+ LONG color = (*Source++);
+ /* L */ Dest[2] = ((color >> 16) & 0xff); /* L */
+ /* V */ Dest[1] = ((color >> 8 ) & 0xff); /* V */
+ /* U */ Dest[0] = (color & 0xff); /* U */
+ /* I */ Dest[3] = 255; /* X */
+ Dest += 4;
+ }
+ }
+}
+
+static void convert_r8g8b8a8_snorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const DWORD *Source;
+ unsigned char *Dest;
+
+ for(y = 0; y < height; y++)
+ {
+ Source = (const DWORD *)(src + y * pitch);
+ Dest = dst + y * pitch;
+ for (x = 0; x < width; x++ )
+ {
+ LONG color = (*Source++);
+ /* B */ Dest[0] = ((color >> 16) & 0xff) + 128; /* W */
+ /* G */ Dest[1] = ((color >> 8 ) & 0xff) + 128; /* V */
+ /* R */ Dest[2] = (color & 0xff) + 128; /* U */
+ /* A */ Dest[3] = ((color >> 24) & 0xff) + 128; /* Q */
+ Dest += 4;
+ }
+ }
+}
+
+static void convert_r16g16_snorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const DWORD *Source;
+ unsigned short *Dest;
+ UINT outpitch = (pitch * 3)/2;
+
+ for(y = 0; y < height; y++)
+ {
+ Source = (const DWORD *)(src + y * pitch);
+ Dest = (unsigned short *) (dst + y * outpitch);
+ for (x = 0; x < width; x++ )
+ {
+ DWORD color = (*Source++);
+ /* B */ Dest[0] = 0xffff;
+ /* G */ Dest[1] = (color >> 16) + 32768; /* V */
+ /* R */ Dest[2] = (color ) + 32768; /* U */
+ Dest += 3;
+ }
+ }
+}
+
+static void convert_r16g16(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const WORD *Source;
+ WORD *Dest;
+ UINT outpitch = (pitch * 3)/2;
+
+ for(y = 0; y < height; y++)
+ {
+ Source = (const WORD *)(src + y * pitch);
+ Dest = (WORD *) (dst + y * outpitch);
+ for (x = 0; x < width; x++ )
+ {
+ WORD green = (*Source++);
+ WORD red = (*Source++);
+ Dest[0] = green;
+ Dest[1] = red;
+ /* Strictly speaking not correct for R16G16F, but it doesn't matter because the
+ * shader overwrites it anyway
+ */
+ Dest[2] = 0xffff;
+ Dest += 3;
+ }
+ }
+}
+
+static void convert_r32g32_float(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const float *Source;
+ float *Dest;
+ UINT outpitch = (pitch * 3)/2;
+
+ for(y = 0; y < height; y++)
+ {
+ Source = (const float *)(src + y * pitch);
+ Dest = (float *) (dst + y * outpitch);
+ for (x = 0; x < width; x++ )
+ {
+ float green = (*Source++);
+ float red = (*Source++);
+ Dest[0] = green;
+ Dest[1] = red;
+ Dest[2] = 1.0f;
+ Dest += 3;
+ }
+ }
+}
+
+static void convert_s1_uint_d15_unorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ UINT outpitch = pitch * 2;
+
+ for (y = 0; y < height; ++y)
+ {
+ const WORD *source = (const WORD *)(src + y * pitch);
+ DWORD *dest = (DWORD *)(dst + y * outpitch);
+
+ for (x = 0; x < width; ++x)
+ {
+ /* The depth data is normalized, so needs to be scaled,
+ * the stencil data isn't. Scale depth data by
+ * (2^24-1)/(2^15-1) ~~ (2^9 + 2^-6). */
+ WORD d15 = source[x] >> 1;
+ DWORD d24 = (d15 << 9) + (d15 >> 6);
+ dest[x] = (d24 << 8) | (source[x] & 0x1);
+ }
+ }
+}
+
+static void convert_s4x4_uint_d24_unorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+
+ for (y = 0; y < height; ++y)
+ {
+ const DWORD *source = (const DWORD *)(src + y * pitch);
+ DWORD *dest = (DWORD *)(dst + y * pitch);
+
+ for (x = 0; x < width; ++x)
+ {
+ /* Just need to clear out the X4 part. */
+ dest[x] = source[x] & ~0xf0;
+ }
+ }
+}
+
+static void convert_s8_uint_d24_float(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ UINT outpitch = pitch * 2;
+
+ for (y = 0; y < height; ++y)
+ {
+ const DWORD *source = (const DWORD *)(src + y * pitch);
+ float *dest_f = (float *)(dst + y * outpitch);
+ DWORD *dest_s = (DWORD *)(dst + y * outpitch);
+
+ for (x = 0; x < width; ++x)
+ {
+ dest_f[x * 2] = float_24_to_32((source[x] & 0xffffff00) >> 8);
+ dest_s[x * 2 + 1] = source[x] & 0xff;
+ }
+ }
+}
+
+static const struct wined3d_format_texture_info format_texture_info[] =
+{
/* WINED3DFORMAT internal srgbInternal rtInternal
format type
flags
@@ -244,289 +561,296 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = {
* endian machine
*/
{WINED3DFMT_UYVY, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, 0,
- GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_UYVY, GL_RGB, GL_RGB, 0,
- GL_YCBCR_422_APPLE, UNSIGNED_SHORT_8_8_APPLE,
+ GL_YCBCR_422_APPLE, UNSIGNED_SHORT_8_8_APPLE, 0,
WINED3DFMT_FLAG_FILTERING,
- APPLE_YCBCR_422},
+ APPLE_YCBCR_422, NULL},
{WINED3DFMT_YUY2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, 0,
- GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_YUY2, GL_RGB, GL_RGB, 0,
- GL_YCBCR_422_APPLE, UNSIGNED_SHORT_8_8_REV_APPLE,
+ GL_YCBCR_422_APPLE, UNSIGNED_SHORT_8_8_REV_APPLE, 0,
WINED3DFMT_FLAG_FILTERING,
- APPLE_YCBCR_422},
+ APPLE_YCBCR_422, NULL},
{WINED3DFMT_YV12, GL_ALPHA, GL_ALPHA, 0,
- GL_ALPHA, GL_UNSIGNED_BYTE,
+ GL_ALPHA, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_DXT1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0,
- GL_RGBA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- EXT_TEXTURE_COMPRESSION_S3TC},
+ GL_RGBA, GL_UNSIGNED_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ EXT_TEXTURE_COMPRESSION_S3TC, NULL},
{WINED3DFMT_DXT2, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0,
- GL_RGBA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- EXT_TEXTURE_COMPRESSION_S3TC},
+ GL_RGBA, GL_UNSIGNED_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ EXT_TEXTURE_COMPRESSION_S3TC, NULL},
{WINED3DFMT_DXT3, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0,
- GL_RGBA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- EXT_TEXTURE_COMPRESSION_S3TC},
+ GL_RGBA, GL_UNSIGNED_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ EXT_TEXTURE_COMPRESSION_S3TC, NULL},
{WINED3DFMT_DXT4, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0,
- GL_RGBA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- EXT_TEXTURE_COMPRESSION_S3TC},
+ GL_RGBA, GL_UNSIGNED_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ EXT_TEXTURE_COMPRESSION_S3TC, NULL},
{WINED3DFMT_DXT5, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0,
- GL_RGBA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- EXT_TEXTURE_COMPRESSION_S3TC},
+ GL_RGBA, GL_UNSIGNED_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ EXT_TEXTURE_COMPRESSION_S3TC, NULL},
/* IEEE formats */
{WINED3DFMT_R32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0,
- GL_RED, GL_FLOAT,
+ GL_RED, GL_FLOAT, 0,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_FLOAT},
+ ARB_TEXTURE_FLOAT, NULL},
{WINED3DFMT_R32_FLOAT, GL_R32F, GL_R32F, 0,
- GL_RED, GL_FLOAT,
+ GL_RED, GL_FLOAT, 0,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_RG},
+ ARB_TEXTURE_RG, NULL},
{WINED3DFMT_R32G32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0,
- GL_RGB, GL_FLOAT,
+ GL_RGB, GL_FLOAT, 12,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_FLOAT},
+ ARB_TEXTURE_FLOAT, &convert_r32g32_float},
{WINED3DFMT_R32G32_FLOAT, GL_RG32F, GL_RG32F, 0,
- GL_RG, GL_FLOAT,
+ GL_RG, GL_FLOAT, 0,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_RG},
+ ARB_TEXTURE_RG, NULL},
{WINED3DFMT_R32G32B32A32_FLOAT, GL_RGBA32F_ARB, GL_RGBA32F_ARB, 0,
- GL_RGBA, GL_FLOAT,
- WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_FLOAT},
+ GL_RGBA, GL_FLOAT, 0,
+ WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_VTF,
+ ARB_TEXTURE_FLOAT, NULL},
/* Float */
{WINED3DFMT_R16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0,
- GL_RED, GL_HALF_FLOAT_ARB,
+ GL_RED, GL_HALF_FLOAT_ARB, 0,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_FLOAT},
+ ARB_TEXTURE_FLOAT, NULL},
{WINED3DFMT_R16_FLOAT, GL_R16F, GL_R16F, 0,
- GL_RED, GL_HALF_FLOAT_ARB,
+ GL_RED, GL_HALF_FLOAT_ARB, 0,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_RG},
+ ARB_TEXTURE_RG, NULL},
{WINED3DFMT_R16G16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0,
- GL_RGB, GL_HALF_FLOAT_ARB,
+ GL_RGB, GL_HALF_FLOAT_ARB, 6,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_FLOAT},
+ ARB_TEXTURE_FLOAT, &convert_r16g16},
{WINED3DFMT_R16G16_FLOAT, GL_RG16F, GL_RG16F, 0,
- GL_RG, GL_HALF_FLOAT_ARB,
+ GL_RG, GL_HALF_FLOAT_ARB, 0,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_RG},
+ ARB_TEXTURE_RG, NULL},
{WINED3DFMT_R16G16B16A16_FLOAT, GL_RGBA16F_ARB, GL_RGBA16F_ARB, 0,
- GL_RGBA, GL_HALF_FLOAT_ARB,
+ GL_RGBA, GL_HALF_FLOAT_ARB, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_FLOAT},
+ ARB_TEXTURE_FLOAT, NULL},
/* Palettized formats */
{WINED3DFMT_P8_UINT, GL_RGBA, GL_RGBA, 0,
- GL_RGBA, GL_UNSIGNED_BYTE,
+ GL_ALPHA, GL_UNSIGNED_BYTE, 0,
0,
- ARB_FRAGMENT_PROGRAM},
+ ARB_FRAGMENT_PROGRAM, NULL},
{WINED3DFMT_P8_UINT, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX8_EXT, 0,
- GL_COLOR_INDEX, GL_UNSIGNED_BYTE,
+ GL_COLOR_INDEX, GL_UNSIGNED_BYTE, 0,
0,
- EXT_PALETTED_TEXTURE},
+ EXT_PALETTED_TEXTURE, NULL},
/* Standard ARGB formats */
{WINED3DFMT_B8G8R8_UNORM, GL_RGB8, GL_RGB8, 0,
- GL_BGR, GL_UNSIGNED_BYTE,
+ GL_BGR, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B8G8R8A8_UNORM, GL_RGBA8, GL_SRGB8_ALPHA8_EXT, 0,
- GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
- WINED3D_GL_EXT_NONE},
+ GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET
+ | WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE,
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B8G8R8X8_UNORM, GL_RGB8, GL_SRGB8_EXT, 0,
- GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
- WINED3D_GL_EXT_NONE},
+ GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET
+ | WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE,
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B5G6R5_UNORM, GL_RGB5, GL_RGB5, GL_RGB8,
- GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
+ GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B5G5R5X1_UNORM, GL_RGB5, GL_RGB5_A1, 0,
- GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV,
+ GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B5G5R5A1_UNORM, GL_RGB5_A1, GL_RGB5_A1, 0,
- GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV,
+ GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B4G4R4A4_UNORM, GL_RGBA4, GL_SRGB8_ALPHA8_EXT, 0,
- GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B2G3R3_UNORM, GL_R3_G3_B2, GL_R3_G3_B2, 0,
- GL_RGB, GL_UNSIGNED_BYTE_3_3_2,
+ GL_RGB, GL_UNSIGNED_BYTE_3_3_2, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_A8_UNORM, GL_ALPHA8, GL_ALPHA8, 0,
- GL_ALPHA, GL_UNSIGNED_BYTE,
+ GL_ALPHA, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B4G4R4X4_UNORM, GL_RGB4, GL_RGB4, 0,
- GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV,
+ GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0,
- GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV,
+ GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_R8G8B8A8_UNORM, GL_RGBA8, GL_RGBA8, 0,
- GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV,
+ GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_R8G8B8X8_UNORM, GL_RGB8, GL_RGB8, 0,
- GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV,
+ GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_R16G16_UNORM, GL_RGB16, GL_RGB16, GL_RGBA16,
- GL_RGB, GL_UNSIGNED_SHORT,
+ GL_RGB, GL_UNSIGNED_SHORT, 6,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, &convert_r16g16},
{WINED3DFMT_B10G10R10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0,
- GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV,
+ GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_R16G16B16A16_UNORM, GL_RGBA16, GL_RGBA16, 0,
- GL_RGBA, GL_UNSIGNED_SHORT,
+ GL_RGBA, GL_UNSIGNED_SHORT, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
/* Luminance */
{WINED3DFMT_L8_UNORM, GL_LUMINANCE8, GL_SLUMINANCE8_EXT, 0,
- GL_LUMINANCE, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_LUMINANCE, GL_UNSIGNED_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_L8A8_UNORM, GL_LUMINANCE8_ALPHA8, GL_SLUMINANCE8_ALPHA8_EXT, 0,
- GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_L4A4_UNORM, GL_LUMINANCE4_ALPHA4, GL_LUMINANCE4_ALPHA4, 0,
- GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 2,
0,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, &convert_l4a4_unorm},
/* Bump mapping stuff */
{WINED3DFMT_R8G8_SNORM, GL_RGB8, GL_RGB8, 0,
- GL_BGR, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_BGR, GL_UNSIGNED_BYTE, 3,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ WINED3D_GL_EXT_NONE, &convert_r8g8_snorm},
{WINED3DFMT_R8G8_SNORM, GL_DSDT8_NV, GL_DSDT8_NV, 0,
- GL_DSDT_NV, GL_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- NV_TEXTURE_SHADER},
+ GL_DSDT_NV, GL_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ NV_TEXTURE_SHADER, NULL},
{WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_RGB5, GL_RGB5, 0,
- GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 2,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ WINED3D_GL_EXT_NONE, &convert_r5g5_snorm_l6_unorm},
{WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_DSDT8_MAG8_NV, GL_DSDT8_MAG8_NV, 0,
- GL_DSDT_MAG_NV, GL_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- NV_TEXTURE_SHADER},
+ GL_DSDT_MAG_NV, GL_BYTE, 3,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ NV_TEXTURE_SHADER, &convert_r5g5_snorm_l6_unorm_nv},
{WINED3DFMT_R8G8_SNORM_L8X8_UNORM, GL_RGB8, GL_RGB8, 0,
- GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 4,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ WINED3D_GL_EXT_NONE, &convert_r8g8_snorm_l8x8_unorm},
{WINED3DFMT_R8G8_SNORM_L8X8_UNORM, GL_DSDT8_MAG8_INTENSITY8_NV, GL_DSDT8_MAG8_INTENSITY8_NV, 0,
- GL_DSDT_MAG_VIB_NV, GL_UNSIGNED_INT_8_8_S8_S8_REV_NV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- NV_TEXTURE_SHADER},
+ GL_DSDT_MAG_VIB_NV, GL_UNSIGNED_INT_8_8_S8_S8_REV_NV, 4,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ NV_TEXTURE_SHADER, &convert_r8g8_snorm_l8x8_unorm_nv},
{WINED3DFMT_R8G8B8A8_SNORM, GL_RGBA8, GL_RGBA8, 0,
- GL_BGRA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_BGRA, GL_UNSIGNED_BYTE, 4,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ WINED3D_GL_EXT_NONE, &convert_r8g8b8a8_snorm},
{WINED3DFMT_R8G8B8A8_SNORM, GL_SIGNED_RGBA8_NV, GL_SIGNED_RGBA8_NV, 0,
- GL_RGBA, GL_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- NV_TEXTURE_SHADER},
+ GL_RGBA, GL_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ NV_TEXTURE_SHADER, NULL},
{WINED3DFMT_R16G16_SNORM, GL_RGB16, GL_RGB16, 0,
- GL_BGR, GL_UNSIGNED_SHORT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_BGR, GL_UNSIGNED_SHORT, 6,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ WINED3D_GL_EXT_NONE, &convert_r16g16_snorm},
{WINED3DFMT_R16G16_SNORM, GL_SIGNED_HILO16_NV, GL_SIGNED_HILO16_NV, 0,
- GL_HILO_NV, GL_SHORT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- NV_TEXTURE_SHADER},
+ GL_HILO_NV, GL_SHORT, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ NV_TEXTURE_SHADER, NULL},
/* Depth stencil formats */
{WINED3DFMT_D16_LOCKABLE, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
- GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,
- WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_TEXTURE},
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_TEXTURE, NULL},
{WINED3DFMT_D32_UNORM, GL_DEPTH_COMPONENT32_ARB, GL_DEPTH_COMPONENT32_ARB, 0,
- GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
- WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_TEXTURE},
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_TEXTURE, NULL},
{WINED3DFMT_S1_UINT_D15_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
- GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,
- WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_TEXTURE},
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_TEXTURE, NULL},
{WINED3DFMT_S1_UINT_D15_UNORM, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0,
- GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT,
- WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
- EXT_PACKED_DEPTH_STENCIL},
+ GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, 4,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
+ EXT_PACKED_DEPTH_STENCIL, &convert_s1_uint_d15_unorm},
{WINED3DFMT_S1_UINT_D15_UNORM, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0,
- GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
- WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
- ARB_FRAMEBUFFER_OBJECT},
+ GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 4,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
+ ARB_FRAMEBUFFER_OBJECT, &convert_s1_uint_d15_unorm},
{WINED3DFMT_D24_UNORM_S8_UINT, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
- GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_TEXTURE},
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH
+ | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_TEXTURE, NULL},
{WINED3DFMT_D24_UNORM_S8_UINT, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0,
- GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
- EXT_PACKED_DEPTH_STENCIL},
+ GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH
+ | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
+ EXT_PACKED_DEPTH_STENCIL, NULL},
{WINED3DFMT_D24_UNORM_S8_UINT, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0,
- GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
- ARB_FRAMEBUFFER_OBJECT},
+ GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH
+ | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
+ ARB_FRAMEBUFFER_OBJECT, NULL},
{WINED3DFMT_X8D24_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
- GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_TEXTURE},
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH
+ | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_TEXTURE, NULL},
{WINED3DFMT_S4X4_UINT_D24_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
- GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
- WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_TEXTURE},
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_TEXTURE, NULL},
{WINED3DFMT_S4X4_UINT_D24_UNORM, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0,
- GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT,
- WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
- EXT_PACKED_DEPTH_STENCIL},
+ GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, 4,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
+ EXT_PACKED_DEPTH_STENCIL, &convert_s4x4_uint_d24_unorm},
{WINED3DFMT_S4X4_UINT_D24_UNORM, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0,
- GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
- WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
- ARB_FRAMEBUFFER_OBJECT},
+ GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 4,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
+ ARB_FRAMEBUFFER_OBJECT, &convert_s4x4_uint_d24_unorm},
{WINED3DFMT_D16_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
- GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_TEXTURE},
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH
+ | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_TEXTURE, NULL},
{WINED3DFMT_L16_UNORM, GL_LUMINANCE16, GL_LUMINANCE16, 0,
- GL_LUMINANCE, GL_UNSIGNED_SHORT,
+ GL_LUMINANCE, GL_UNSIGNED_SHORT, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_D32_FLOAT, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT32F, 0,
- GL_DEPTH_COMPONENT, GL_FLOAT,
- WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_BUFFER_FLOAT},
+ GL_DEPTH_COMPONENT, GL_FLOAT, 0,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_BUFFER_FLOAT, NULL},
{WINED3DFMT_S8_UINT_D24_FLOAT, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, 0,
- GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV,
- WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
- ARB_DEPTH_BUFFER_FLOAT},
+ GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, 8,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_BUFFER_FLOAT, &convert_s8_uint_d24_float},
/* Vendor-specific formats */
{WINED3DFMT_ATI2N, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0,
- GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
0,
- ATI_TEXTURE_COMPRESSION_3DC},
+ ATI_TEXTURE_COMPRESSION_3DC, NULL},
{WINED3DFMT_ATI2N, GL_COMPRESSED_RED_GREEN_RGTC2_EXT, GL_COMPRESSED_RED_GREEN_RGTC2_EXT, 0,
- GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
0,
- EXT_TEXTURE_COMPRESSION_RGTC},
+ EXT_TEXTURE_COMPRESSION_RGTC, NULL},
};
static inline int getFmtIdx(WINED3DFORMAT fmt) {
@@ -560,7 +884,7 @@ static BOOL init_format_base_info(struct wined3d_gl_info *gl_info)
for (i = 0; i < format_count; ++i)
{
- struct GlPixelFormatDesc *desc = &gl_info->gl_formats[i];
+ struct wined3d_format_desc *desc = &gl_info->gl_formats[i];
desc->format = formats[i].format;
desc->red_mask = formats[i].redMask;
desc->green_mask = formats[i].greenMask;
@@ -595,7 +919,7 @@ static BOOL init_format_compression_info(struct wined3d_gl_info *gl_info)
for (i = 0; i < (sizeof(format_compression_info) / sizeof(*format_compression_info)); ++i)
{
- struct GlPixelFormatDesc *format_desc;
+ struct wined3d_format_desc *format_desc;
int fmt_idx = getFmtIdx(format_compression_info[i].format);
if (fmt_idx == -1)
@@ -616,7 +940,7 @@ static BOOL init_format_compression_info(struct wined3d_gl_info *gl_info)
}
/* Context activation is done by the caller. */
-static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct GlPixelFormatDesc *format_desc)
+static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct wined3d_format_desc *format_desc)
{
/* Check if the default internal format is supported as a frame buffer
* target, otherwise fall back to the render target internal.
@@ -755,7 +1079,7 @@ static void init_format_fbo_compat_info(struct wined3d_gl_info *gl_info)
for (i = 0; i < sizeof(formats) / sizeof(*formats); ++i)
{
- struct GlPixelFormatDesc *desc = &gl_info->gl_formats[i];
+ struct wined3d_format_desc *desc = &gl_info->gl_formats[i];
if (!desc->glInternal) continue;
@@ -798,29 +1122,33 @@ static BOOL init_format_texture_info(struct wined3d_gl_info *gl_info)
{
unsigned int i;
- for (i = 0; i < sizeof(gl_formats_template) / sizeof(gl_formats_template[0]); ++i)
+ for (i = 0; i < sizeof(format_texture_info) / sizeof(*format_texture_info); ++i)
{
- int fmt_idx = getFmtIdx(gl_formats_template[i].fmt);
- struct GlPixelFormatDesc *desc;
+ int fmt_idx = getFmtIdx(format_texture_info[i].format);
+ struct wined3d_format_desc *desc;
if (fmt_idx == -1)
{
ERR("Format %s (%#x) not found.\n",
- debug_d3dformat(gl_formats_template[i].fmt), gl_formats_template[i].fmt);
+ debug_d3dformat(format_texture_info[i].format), format_texture_info[i].format);
return FALSE;
}
- if (!gl_info->supported[gl_formats_template[i].extension]) continue;
+ if (!gl_info->supported[format_texture_info[i].extension]) continue;
desc = &gl_info->gl_formats[fmt_idx];
- desc->glInternal = gl_formats_template[i].glInternal;
- desc->glGammaInternal = gl_formats_template[i].glGammaInternal;
- desc->rtInternal = gl_formats_template[i].rtInternal;
- desc->glFormat = gl_formats_template[i].glFormat;
- desc->glType = gl_formats_template[i].glType;
+ desc->glInternal = format_texture_info[i].gl_internal;
+ desc->glGammaInternal = format_texture_info[i].gl_srgb_internal;
+ desc->rtInternal = format_texture_info[i].gl_rt_internal;
+ desc->glFormat = format_texture_info[i].gl_format;
+ desc->glType = format_texture_info[i].gl_type;
desc->color_fixup = COLOR_FIXUP_IDENTITY;
- desc->Flags |= gl_formats_template[i].Flags;
+ desc->Flags |= format_texture_info[i].flags;
desc->heightscale = 1.0f;
+
+ /* Texture conversion stuff */
+ desc->convert = format_texture_info[i].convert;
+ desc->conv_byte_count = format_texture_info[i].conv_byte_count;
}
return TRUE;
@@ -938,6 +1266,7 @@ static BOOL check_filter(const struct wined3d_gl_info *gl_info, GLenum internal)
static void init_format_filter_info(struct wined3d_gl_info *gl_info, enum wined3d_pci_vendor vendor)
{
+ struct wined3d_format_desc *desc;
unsigned int fmt_idx, i;
WINED3DFORMAT fmts16[] = {
WINED3DFMT_R16_FLOAT,
@@ -945,7 +1274,6 @@ static void init_format_filter_info(struct wined3d_gl_info *gl_info, enum wined3
WINED3DFMT_R16G16B16A16_FLOAT,
};
BOOL filtered;
- struct GlPixelFormatDesc *desc;
if(wined3d_settings.offscreen_rendering_mode != ORM_FBO)
{
@@ -1043,6 +1371,7 @@ static void apply_format_fixups(struct wined3d_gl_info *gl_info)
idx = getFmtIdx(WINED3DFMT_R8G8_SNORM);
gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
+
idx = getFmtIdx(WINED3DFMT_R16G16_SNORM);
gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
@@ -1098,8 +1427,11 @@ static void apply_format_fixups(struct wined3d_gl_info *gl_info)
gl_info->gl_formats[idx].heightscale = 1.5f;
gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YV12);
- idx = getFmtIdx(WINED3DFMT_P8_UINT);
- gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_P8);
+ if (gl_info->supported[EXT_PALETTED_TEXTURE] || gl_info->supported[ARB_FRAGMENT_PROGRAM])
+ {
+ 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])
{
@@ -1125,7 +1457,7 @@ static BOOL init_format_vertex_info(struct wined3d_gl_info *gl_info)
for (i = 0; i < (sizeof(format_vertex_info) / sizeof(*format_vertex_info)); ++i)
{
- struct GlPixelFormatDesc *format_desc;
+ struct wined3d_format_desc *format_desc;
int fmt_idx = getFmtIdx(format_vertex_info[i].format);
if (fmt_idx == -1)
@@ -1182,7 +1514,7 @@ fail:
return FALSE;
}
-const struct GlPixelFormatDesc *getFormatDescEntry(WINED3DFORMAT fmt, const struct wined3d_gl_info *gl_info)
+const struct wined3d_format_desc *getFormatDescEntry(WINED3DFORMAT fmt, const struct wined3d_gl_info *gl_info)
{
int idx = getFmtIdx(fmt);
@@ -1485,9 +1817,7 @@ const char* debug_d3dprimitivetype(WINED3DPRIMITIVETYPE PrimitiveType) {
const char* debug_d3drenderstate(DWORD state) {
switch (state) {
#define D3DSTATE_TO_STR(u) case u: return #u
- D3DSTATE_TO_STR(WINED3DRS_TEXTUREHANDLE );
D3DSTATE_TO_STR(WINED3DRS_ANTIALIAS );
- D3DSTATE_TO_STR(WINED3DRS_TEXTUREADDRESS );
D3DSTATE_TO_STR(WINED3DRS_TEXTUREPERSPECTIVE );
D3DSTATE_TO_STR(WINED3DRS_WRAPU );
D3DSTATE_TO_STR(WINED3DRS_WRAPV );
@@ -1501,11 +1831,8 @@ const char* debug_d3drenderstate(DWORD state) {
D3DSTATE_TO_STR(WINED3DRS_ZWRITEENABLE );
D3DSTATE_TO_STR(WINED3DRS_ALPHATESTENABLE );
D3DSTATE_TO_STR(WINED3DRS_LASTPIXEL );
- D3DSTATE_TO_STR(WINED3DRS_TEXTUREMAG );
- D3DSTATE_TO_STR(WINED3DRS_TEXTUREMIN );
D3DSTATE_TO_STR(WINED3DRS_SRCBLEND );
D3DSTATE_TO_STR(WINED3DRS_DESTBLEND );
- D3DSTATE_TO_STR(WINED3DRS_TEXTUREMAPBLEND );
D3DSTATE_TO_STR(WINED3DRS_CULLMODE );
D3DSTATE_TO_STR(WINED3DRS_ZFUNC );
D3DSTATE_TO_STR(WINED3DRS_ALPHAREF );
@@ -1526,9 +1853,6 @@ const char* debug_d3drenderstate(DWORD state) {
D3DSTATE_TO_STR(WINED3DRS_STIPPLEENABLE );
D3DSTATE_TO_STR(WINED3DRS_EDGEANTIALIAS );
D3DSTATE_TO_STR(WINED3DRS_COLORKEYENABLE );
- D3DSTATE_TO_STR(WINED3DRS_BORDERCOLOR );
- D3DSTATE_TO_STR(WINED3DRS_TEXTUREADDRESSU );
- D3DSTATE_TO_STR(WINED3DRS_TEXTUREADDRESSV );
D3DSTATE_TO_STR(WINED3DRS_MIPMAPLODBIAS );
D3DSTATE_TO_STR(WINED3DRS_ZBIAS );
D3DSTATE_TO_STR(WINED3DRS_RANGEFOGENABLE );
@@ -1544,38 +1868,6 @@ const char* debug_d3drenderstate(DWORD state) {
D3DSTATE_TO_STR(WINED3DRS_STENCILMASK );
D3DSTATE_TO_STR(WINED3DRS_STENCILWRITEMASK );
D3DSTATE_TO_STR(WINED3DRS_TEXTUREFACTOR );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN00 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN01 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN02 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN03 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN04 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN05 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN06 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN07 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN08 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN09 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN10 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN11 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN12 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN13 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN14 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN15 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN16 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN17 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN18 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN19 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN20 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN21 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN22 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN23 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN24 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN25 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN26 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN27 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN28 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN29 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN30 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN31 );
D3DSTATE_TO_STR(WINED3DRS_WRAP0 );
D3DSTATE_TO_STR(WINED3DRS_WRAP1 );
D3DSTATE_TO_STR(WINED3DRS_WRAP2 );
@@ -2125,7 +2417,7 @@ unsigned int count_bits(unsigned int mask)
/* Helper function for retrieving color info for ChoosePixelFormat and wglChoosePixelFormatARB.
* The later function requires individual color components. */
-BOOL getColorBits(const struct GlPixelFormatDesc *format_desc,
+BOOL getColorBits(const struct wined3d_format_desc *format_desc,
short *redSize, short *greenSize, short *blueSize, short *alphaSize, short *totalSize)
{
TRACE("fmt: %s\n", debug_d3dformat(format_desc->format));
@@ -2162,7 +2454,7 @@ BOOL getColorBits(const struct GlPixelFormatDesc *format_desc,
}
/* Helper function for retrieving depth/stencil info for ChoosePixelFormat and wglChoosePixelFormatARB */
-BOOL getDepthStencilBits(const struct GlPixelFormatDesc *format_desc, short *depthSize, short *stencilSize)
+BOOL getDepthStencilBits(const struct wined3d_format_desc *format_desc, short *depthSize, short *stencilSize)
{
TRACE("fmt: %s\n", debug_d3dformat(format_desc->format));
switch(format_desc->format)
@@ -2190,6 +2482,115 @@ BOOL getDepthStencilBits(const struct GlPixelFormatDesc *format_desc, short *dep
return TRUE;
}
+DWORD color_convert_argb_to_fmt(DWORD color, WINED3DFORMAT destfmt)
+{
+ unsigned int r, g, b, a;
+ DWORD ret;
+
+ if (destfmt == WINED3DFMT_B8G8R8A8_UNORM
+ || destfmt == WINED3DFMT_B8G8R8X8_UNORM
+ || destfmt == WINED3DFMT_B8G8R8_UNORM)
+ return color;
+
+ TRACE("Converting color %08x to format %s\n", color, debug_d3dformat(destfmt));
+
+ a = (color & 0xff000000) >> 24;
+ r = (color & 0x00ff0000) >> 16;
+ g = (color & 0x0000ff00) >> 8;
+ b = (color & 0x000000ff) >> 0;
+
+ switch(destfmt)
+ {
+ case WINED3DFMT_B5G6R5_UNORM:
+ if(r == 0xff && g == 0xff && b == 0xff) return 0xffff;
+ r = (r * 32) / 256;
+ g = (g * 64) / 256;
+ b = (b * 32) / 256;
+ ret = r << 11;
+ ret |= g << 5;
+ ret |= b;
+ TRACE("Returning %08x\n", ret);
+ return ret;
+
+ case WINED3DFMT_B5G5R5X1_UNORM:
+ case WINED3DFMT_B5G5R5A1_UNORM:
+ a = (a * 2) / 256;
+ r = (r * 32) / 256;
+ g = (g * 32) / 256;
+ b = (b * 32) / 256;
+ ret = a << 15;
+ ret |= r << 10;
+ ret |= g << 5;
+ ret |= b << 0;
+ TRACE("Returning %08x\n", ret);
+ return ret;
+
+ case WINED3DFMT_A8_UNORM:
+ TRACE("Returning %08x\n", a);
+ return a;
+
+ case WINED3DFMT_B4G4R4X4_UNORM:
+ case WINED3DFMT_B4G4R4A4_UNORM:
+ a = (a * 16) / 256;
+ r = (r * 16) / 256;
+ g = (g * 16) / 256;
+ b = (b * 16) / 256;
+ ret = a << 12;
+ ret |= r << 8;
+ ret |= g << 4;
+ ret |= b << 0;
+ TRACE("Returning %08x\n", ret);
+ return ret;
+
+ case WINED3DFMT_B2G3R3_UNORM:
+ r = (r * 8) / 256;
+ g = (g * 8) / 256;
+ b = (b * 4) / 256;
+ ret = r << 5;
+ ret |= g << 2;
+ ret |= b << 0;
+ TRACE("Returning %08x\n", ret);
+ return ret;
+
+ case WINED3DFMT_R8G8B8X8_UNORM:
+ case WINED3DFMT_R8G8B8A8_UNORM:
+ ret = a << 24;
+ ret |= b << 16;
+ ret |= g << 8;
+ ret |= r << 0;
+ TRACE("Returning %08x\n", ret);
+ return ret;
+
+ case WINED3DFMT_B10G10R10A2_UNORM:
+ a = (a * 4) / 256;
+ r = (r * 1024) / 256;
+ g = (g * 1024) / 256;
+ b = (b * 1024) / 256;
+ ret = a << 30;
+ ret |= r << 20;
+ ret |= g << 10;
+ ret |= b << 0;
+ TRACE("Returning %08x\n", ret);
+ return ret;
+
+ case WINED3DFMT_R10G10B10A2_UNORM:
+ a = (a * 4) / 256;
+ r = (r * 1024) / 256;
+ g = (g * 1024) / 256;
+ b = (b * 1024) / 256;
+ ret = a << 30;
+ ret |= b << 20;
+ ret |= g << 10;
+ ret |= r << 0;
+ TRACE("Returning %08x\n", ret);
+ return ret;
+
+ default:
+ FIXME("Add a COLORFILL conversion for format %s\n", debug_d3dformat(destfmt));
+ return 0;
+ }
+}
+
/* DirectDraw stuff */
WINED3DFORMAT pixelformat_for_depth(DWORD depth) {
switch(depth) {
@@ -2258,147 +2659,6 @@ DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) {
return size;
}
-/***********************************************************************
- * CalculateTexRect
- *
- * Calculates the dimensions of the opengl texture used for blits.
- * Handled oversized opengl textures and updates the source rectangle
- * accordingly
- *
- * Params:
- * This: Surface to operate on
- * Rect: Requested rectangle
- *
- * Returns:
- * TRUE if the texture part can be loaded,
- * FALSE otherwise
- *
- *********************************************************************/
-BOOL CalculateTexRect(IWineD3DSurfaceImpl *This, RECT *Rect, float glTexCoord[4])
-{
- const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info;
- int x1 = Rect->left, x2 = Rect->right;
- int y1 = Rect->top, y2 = Rect->bottom;
- GLint maxSize = gl_info->limits.texture_size;
-
- TRACE("(%p)->(%d,%d)-(%d,%d)\n", This,
- Rect->left, Rect->top, Rect->right, Rect->bottom);
-
- /* The sizes might be reversed */
- if(Rect->left > Rect->right) {
- x1 = Rect->right;
- x2 = Rect->left;
- }
- if(Rect->top > Rect->bottom) {
- y1 = Rect->bottom;
- y2 = Rect->top;
- }
-
- /* No oversized texture? This is easy */
- if(!(This->Flags & SFLAG_OVERSIZE)) {
- /* Which rect from the texture do I need? */
- if (This->texture_target == GL_TEXTURE_RECTANGLE_ARB)
- {
- glTexCoord[0] = (float) Rect->left;
- glTexCoord[2] = (float) Rect->top;
- glTexCoord[1] = (float) Rect->right;
- glTexCoord[3] = (float) Rect->bottom;
- } else {
- glTexCoord[0] = (float) Rect->left / (float) This->pow2Width;
- glTexCoord[2] = (float) Rect->top / (float) This->pow2Height;
- glTexCoord[1] = (float) Rect->right / (float) This->pow2Width;
- glTexCoord[3] = (float) Rect->bottom / (float) This->pow2Height;
- }
-
- return TRUE;
- } else {
- /* Check if we can succeed at all */
- if( (x2 - x1) > maxSize ||
- (y2 - y1) > maxSize ) {
- TRACE("Requested rectangle is too large for gl\n");
- return FALSE;
- }
-
- /* A part of the texture has to be picked. First, check if
- * some texture part is loaded already, if yes try to re-use it.
- * If the texture is dirty, or the part can't be used,
- * re-position the part to load
- */
- if(This->Flags & SFLAG_INTEXTURE) {
- if(This->glRect.left <= x1 && This->glRect.right >= x2 &&
- This->glRect.top <= y1 && This->glRect.bottom >= x2 ) {
- /* Ok, the rectangle is ok, re-use it */
- TRACE("Using existing gl Texture\n");
- } else {
- /* Rectangle is not ok, dirtify the texture to reload it */
- TRACE("Dirtifying texture to force reload\n");
- This->Flags &= ~SFLAG_INTEXTURE;
- }
- }
-
- /* Now if we are dirty(no else if!) */
- if(!(This->Flags & SFLAG_INTEXTURE)) {
- /* Set the new rectangle. Use the following strategy:
- * 1) Use as big textures as possible.
- * 2) Place the texture part in the way that the requested
- * part is in the middle of the texture(well, almost)
- * 3) If the texture is moved over the edges of the
- * surface, replace it nicely
- * 4) If the coord is not limiting the texture size,
- * use the whole size
- */
- if((This->pow2Width) > maxSize) {
- This->glRect.left = x1 - maxSize / 2;
- if(This->glRect.left < 0) {
- This->glRect.left = 0;
- }
- This->glRect.right = This->glRect.left + maxSize;
- if(This->glRect.right > This->currentDesc.Width) {
- This->glRect.right = This->currentDesc.Width;
- This->glRect.left = This->glRect.right - maxSize;
- }
- } else {
- This->glRect.left = 0;
- This->glRect.right = This->pow2Width;
- }
-
- if (This->pow2Height > maxSize)
- {
- This->glRect.top = x1 - gl_info->limits.texture_size / 2;
- if(This->glRect.top < 0) This->glRect.top = 0;
- This->glRect.bottom = This->glRect.left + maxSize;
- if(This->glRect.bottom > This->currentDesc.Height) {
- This->glRect.bottom = This->currentDesc.Height;
- This->glRect.top = This->glRect.bottom - maxSize;
- }
- } else {
- This->glRect.top = 0;
- This->glRect.bottom = This->pow2Height;
- }
- TRACE("(%p): Using rect (%d,%d)-(%d,%d)\n", This,
- This->glRect.left, This->glRect.top, This->glRect.right, This->glRect.bottom);
- }
-
- /* Re-calculate the rect to draw */
- Rect->left -= This->glRect.left;
- Rect->right -= This->glRect.left;
- Rect->top -= This->glRect.top;
- Rect->bottom -= This->glRect.top;
-
- /* Get the gl coordinates. The gl rectangle is a power of 2, eigher the max size,
- * or the pow2Width / pow2Height of the surface.
- *
- * Can never be GL_TEXTURE_RECTANGLE_ARB because oversized surfaces are always set up
- * as regular GL_TEXTURE_2D.
- */
- glTexCoord[0] = (float) Rect->left / (float) (This->glRect.right - This->glRect.left);
- glTexCoord[2] = (float) Rect->top / (float) (This->glRect.bottom - This->glRect.top);
- glTexCoord[1] = (float) Rect->right / (float) (This->glRect.right - This->glRect.left);
- glTexCoord[3] = (float) Rect->bottom / (float) (This->glRect.bottom - This->glRect.top);
- }
- return TRUE;
-}
-
void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_settings *settings, BOOL ignore_textype) {
#define ARG1 0x01
#define ARG2 0x02
@@ -2518,8 +2778,8 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting
if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB)
{
- IWineD3DSurfaceImpl *surf;
- surf = (IWineD3DSurfaceImpl *) ((IWineD3DTextureImpl *) stateblock->textures[0])->surfaces[0];
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)stateblock->textures[0];
+ IWineD3DSurfaceImpl *surf = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[0];
if (surf->CKeyFlags & WINEDDSD_CKSRCBLT && !surf->resource.format_desc->alpha_mask)
{
@@ -2826,8 +3086,10 @@ UINT wined3d_log2i(UINT32 x)
* and the user preferences in wined3d_settings. */
void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected, int *vs_selected)
{
+ BOOL glsl = wined3d_settings.glslRequested && gl_info->glsl_version >= MAKEDWORD_VERSION(1, 20);
+
if (wined3d_settings.vs_mode == VS_NONE) *vs_selected = SHADER_NONE;
- else if (gl_info->supported[ARB_VERTEX_SHADER] && wined3d_settings.glslRequested)
+ else if (gl_info->supported[ARB_VERTEX_SHADER] && glsl)
{
/* Geforce4 cards support GLSL but for vertex shaders only. Further its reported GLSL caps are
* wrong. This combined with the fact that glsl won't offer more features or performance, use ARB
@@ -2839,7 +3101,7 @@ void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected,
else *vs_selected = SHADER_NONE;
if (wined3d_settings.ps_mode == PS_NONE) *ps_selected = SHADER_NONE;
- else if (gl_info->supported[ARB_FRAGMENT_SHADER] && wined3d_settings.glslRequested) *ps_selected = SHADER_GLSL;
+ else if (gl_info->supported[ARB_FRAGMENT_SHADER] && glsl) *ps_selected = SHADER_GLSL;
else if (gl_info->supported[ARB_FRAGMENT_PROGRAM]) *ps_selected = SHADER_ARB;
else if (gl_info->supported[ATI_FRAGMENT_SHADER]) *ps_selected = SHADER_ATI;
else *ps_selected = SHADER_NONE;
diff --git a/dll/directx/wine/wined3d/view.c b/dll/directx/wine/wined3d/view.c
index bbf0f5f65c1..0c9919dd14c 100644
--- a/dll/directx/wine/wined3d/view.c
+++ b/dll/directx/wine/wined3d/view.c
@@ -97,7 +97,7 @@ static HRESULT STDMETHODCALLTYPE rendertarget_view_GetResource(IWineD3DRendertar
return WINED3D_OK;
}
-const struct IWineD3DRendertargetViewVtbl wined3d_rendertarget_view_vtbl =
+static const struct IWineD3DRendertargetViewVtbl wined3d_rendertarget_view_vtbl =
{
/* IUnknown methods */
rendertarget_view_QueryInterface,
@@ -108,3 +108,13 @@ const struct IWineD3DRendertargetViewVtbl wined3d_rendertarget_view_vtbl =
/* IWineD3DRendertargetView methods */
rendertarget_view_GetResource,
};
+
+void wined3d_rendertarget_view_init(struct wined3d_rendertarget_view *view,
+ IWineD3DResource *resource, IUnknown *parent)
+{
+ view->vtbl = &wined3d_rendertarget_view_vtbl;
+ view->refcount = 1;
+ IWineD3DResource_AddRef(resource);
+ view->resource = resource;
+ view->parent = parent;
+}
diff --git a/dll/directx/wine/wined3d/volume.c b/dll/directx/wine/wined3d/volume.c
index 8e19ee9c763..42e61e68d22 100644
--- a/dll/directx/wine/wined3d/volume.c
+++ b/dll/directx/wine/wined3d/volume.c
@@ -25,7 +25,6 @@
#include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface);
-#define GLINFO_LOCATION This->resource.device->adapter->gl_info
/* Context activation is done by the caller. */
static void volume_bind_and_dirtify(IWineD3DVolume *iface) {
@@ -313,9 +312,11 @@ static HRESULT WINAPI IWineD3DVolumeImpl_SetContainer(IWineD3DVolume *iface, IWi
}
/* Context activation is done by the caller. */
-static HRESULT WINAPI IWineD3DVolumeImpl_LoadTexture(IWineD3DVolume *iface, int gl_level, BOOL srgb_mode) {
- IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface;
- const struct GlPixelFormatDesc *glDesc = This->resource.format_desc;
+static HRESULT WINAPI IWineD3DVolumeImpl_LoadTexture(IWineD3DVolume *iface, int gl_level, BOOL srgb_mode)
+{
+ IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface;
+ const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info;
+ const struct wined3d_format_desc *glDesc = This->resource.format_desc;
TRACE("(%p) : level %u, format %s (0x%08x)\n", This, gl_level, debug_d3dformat(glDesc->format), glDesc->format);
@@ -386,7 +387,7 @@ HRESULT volume_init(IWineD3DVolumeImpl *volume, IWineD3DDeviceImpl *device, UINT
IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
{
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, gl_info);
HRESULT hr;
if (!gl_info->supported[EXT_TEXTURE3D])
diff --git a/dll/directx/wine/wined3d/volumetexture.c b/dll/directx/wine/wined3d/volumetexture.c
index 14ca72fcd49..9fccb2b8936 100644
--- a/dll/directx/wine/wined3d/volumetexture.c
+++ b/dll/directx/wine/wined3d/volumetexture.c
@@ -39,7 +39,7 @@ static void volumetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINE
TRACE("(%p) : About to load texture.\n", This);
- if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ if (!device->isInDraw) context = context_acquire(device, NULL);
else if (gl_info->supported[EXT_TEXTURE_SRGB] && This->baseTexture.bindCount > 0)
{
srgb_mode = device->stateBlock->samplerState[This->baseTexture.sampler][WINED3DSAMP_SRGBTEXTURE];
@@ -51,17 +51,19 @@ static void volumetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINE
* since the last load then reload the volumes. */
if (This->baseTexture.texture_rgb.dirty)
{
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < This->baseTexture.level_count; ++i)
{
- IWineD3DVolume_LoadTexture(This->volumes[i], i, srgb_mode);
+ IWineD3DVolume *volume = (IWineD3DVolume *)This->baseTexture.sub_resources[i];
+ IWineD3DVolume_LoadTexture(volume, i, srgb_mode);
}
}
else if (srgb_was_toggled)
{
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < This->baseTexture.level_count; ++i)
{
- volume_add_dirty_box(This->volumes[i], NULL);
- IWineD3DVolume_LoadTexture(This->volumes[i], i, srgb_mode);
+ IWineD3DVolume *volume = (IWineD3DVolume *)This->baseTexture.sub_resources[i];
+ volume_add_dirty_box(volume, NULL);
+ IWineD3DVolume_LoadTexture(volume, i, srgb_mode);
}
}
else
@@ -81,9 +83,9 @@ static void volumetexture_cleanup(IWineD3DVolumeTextureImpl *This)
TRACE("(%p) : Cleaning up.\n", This);
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < This->baseTexture.level_count; ++i)
{
- IWineD3DVolume *volume = This->volumes[i];
+ IWineD3DVolume *volume = (IWineD3DVolume *)This->baseTexture.sub_resources[i];
if (volume)
{
@@ -172,8 +174,9 @@ static void WINAPI IWineD3DVolumeTextureImpl_UnLoad(IWineD3DVolumeTexture *iface
* surface before, this one will be a NOP and vice versa. Unloading an unloaded
* surface is fine
*/
- for (i = 0; i < This->baseTexture.levels; i++) {
- IWineD3DVolume_UnLoad(This->volumes[i]);
+ for (i = 0; i < This->baseTexture.level_count; ++i)
+ {
+ IWineD3DVolume_UnLoad((IWineD3DVolume *)This->baseTexture.sub_resources[i]);
}
basetexture_unload((IWineD3DBaseTexture *)iface);
@@ -250,65 +253,95 @@ static BOOL WINAPI IWineD3DVolumeTextureImpl_IsCondNP2(IWineD3DVolumeTexture *if
/* *******************************************
IWineD3DVolumeTexture IWineD3DVolumeTexture parts follow
******************************************* */
-static HRESULT WINAPI IWineD3DVolumeTextureImpl_GetLevelDesc(IWineD3DVolumeTexture *iface, UINT Level,WINED3DVOLUME_DESC *pDesc) {
- IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
- if (Level < This->baseTexture.levels) {
- TRACE("(%p) Level (%d)\n", This, Level);
- return IWineD3DVolume_GetDesc(This->volumes[Level], pDesc);
- } else {
- WARN("(%p) Level (%d)\n", This, Level);
+static HRESULT WINAPI IWineD3DVolumeTextureImpl_GetLevelDesc(IWineD3DVolumeTexture *iface,
+ UINT level, WINED3DVOLUME_DESC *desc)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DVolume *volume;
+
+ TRACE("iface %p, level %u, desc %p.\n", iface, level, desc);
+
+ if (!(volume = (IWineD3DVolume *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
+
+ return IWineD3DVolume_GetDesc(volume, desc);
+}
+
+static HRESULT WINAPI IWineD3DVolumeTextureImpl_GetVolumeLevel(IWineD3DVolumeTexture *iface,
+ UINT level, IWineD3DVolume **volume)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DVolume *v;
+
+ TRACE("iface %p, level %u, volume %p.\n", iface, level, volume);
+
+ if (!(v = (IWineD3DVolume *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ IWineD3DVolume_AddRef(v);
+ *volume = v;
+
+ TRACE("Returning volume %p.\n", *volume);
+
return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DVolumeTextureImpl_GetVolumeLevel(IWineD3DVolumeTexture *iface, UINT Level, IWineD3DVolume** ppVolumeLevel) {
- IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
- if (Level < This->baseTexture.levels) {
- *ppVolumeLevel = This->volumes[Level];
- IWineD3DVolume_AddRef(*ppVolumeLevel);
- TRACE("(%p) -> level(%d) returning volume@%p\n", This, Level, *ppVolumeLevel);
- } else {
- WARN("(%p) Level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
- return WINED3DERR_INVALIDCALL;
+
+static HRESULT WINAPI IWineD3DVolumeTextureImpl_LockBox(IWineD3DVolumeTexture *iface,
+ UINT level, WINED3DLOCKED_BOX *locked_box, const WINED3DBOX *box, DWORD flags)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DVolume *volume;
+
+ TRACE("iface %p, level %u, locked_box %p, box %p, flags %#x.\n",
+ iface, level, locked_box, box, flags);
+
+ if (!(volume = (IWineD3DVolume *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- return WINED3D_OK;
-}
-static HRESULT WINAPI IWineD3DVolumeTextureImpl_LockBox(IWineD3DVolumeTexture *iface, UINT Level, WINED3DLOCKED_BOX* pLockedVolume, CONST WINED3DBOX* pBox, DWORD Flags) {
- HRESULT hr;
- IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
-
- if (Level < This->baseTexture.levels) {
- hr = IWineD3DVolume_LockBox(This->volumes[Level], pLockedVolume, pBox, Flags);
- TRACE("(%p) Level (%d) success(%u)\n", This, Level, hr);
-
- } else {
- FIXME("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
- return WINED3DERR_INVALIDCALL;
- }
- return hr;
+ return IWineD3DVolume_LockBox(volume, locked_box, box, flags);
}
-static HRESULT WINAPI IWineD3DVolumeTextureImpl_UnlockBox(IWineD3DVolumeTexture *iface, UINT Level) {
- HRESULT hr;
- IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
+static HRESULT WINAPI IWineD3DVolumeTextureImpl_UnlockBox(IWineD3DVolumeTexture *iface, UINT level)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DVolume *volume;
- if (Level < This->baseTexture.levels) {
- hr = IWineD3DVolume_UnlockBox(This->volumes[Level]);
- TRACE("(%p) -> level(%d) success(%u)\n", This, Level, hr);
+ TRACE("iface %p, level %u.\n", iface, level);
- } else {
- FIXME("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
- return WINED3DERR_INVALIDCALL;
+ if (!(volume = (IWineD3DVolume *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- return hr;
+
+ return IWineD3DVolume_UnlockBox(volume);
}
-static HRESULT WINAPI IWineD3DVolumeTextureImpl_AddDirtyBox(IWineD3DVolumeTexture *iface, CONST WINED3DBOX* pDirtyBox) {
- IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
- This->baseTexture.texture_rgb.dirty = TRUE;
- This->baseTexture.texture_srgb.dirty = TRUE;
- TRACE("(%p) : dirtyfication of volume Level (0)\n", This);
- volume_add_dirty_box(This->volumes[0], pDirtyBox);
+static HRESULT WINAPI IWineD3DVolumeTextureImpl_AddDirtyBox(IWineD3DVolumeTexture *iface, const WINED3DBOX *dirty_box)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DVolume *volume;
+
+ TRACE("iface %p, dirty_box %p.\n", iface, dirty_box);
+
+ if (!(volume = (IWineD3DVolume *)basetexture_get_sub_resource(texture, 0, 0)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ texture->baseTexture.texture_rgb.dirty = TRUE;
+ texture->baseTexture.texture_srgb.dirty = TRUE;
+ volume_add_dirty_box(volume, dirty_box);
return WINED3D_OK;
}
@@ -355,7 +388,7 @@ HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT
WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
{
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, gl_info);
UINT tmp_w, tmp_h, tmp_d;
unsigned int i;
HRESULT hr;
@@ -399,8 +432,8 @@ HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT
texture->lpVtbl = &IWineD3DVolumeTexture_Vtbl;
- hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, WINED3DRTYPE_VOLUMETEXTURE,
- device, 0, usage, format_desc, pool, parent, parent_ops);
+ hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, 1, levels,
+ WINED3DRTYPE_VOLUMETEXTURE, device, 0, usage, format_desc, pool, parent, parent_ops);
if (FAILED(hr))
{
WARN("Failed to initialize basetexture, returning %#x.\n", hr);
@@ -418,21 +451,23 @@ HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT
tmp_h = height;
tmp_d = depth;
- for (i = 0; i < texture->baseTexture.levels; ++i)
+ for (i = 0; i < texture->baseTexture.level_count; ++i)
{
+ IWineD3DVolume *volume;
+
/* Create the volume. */
hr = IWineD3DDeviceParent_CreateVolume(device->device_parent, parent,
- tmp_w, tmp_h, tmp_d, format, pool, usage, &texture->volumes[i]);
+ tmp_w, tmp_h, tmp_d, format, pool, usage, &volume);
if (FAILED(hr))
{
ERR("Creating a volume for the volume texture failed, hr %#x.\n", hr);
- texture->volumes[i] = NULL;
volumetexture_cleanup(texture);
return hr;
}
/* Set its container to this texture. */
- IWineD3DVolume_SetContainer(texture->volumes[i], (IWineD3DBase *)texture);
+ IWineD3DVolume_SetContainer(volume, (IWineD3DBase *)texture);
+ texture->baseTexture.sub_resources[i] = (IWineD3DResourceImpl *)volume;
/* Calculate the next mipmap level. */
tmp_w = max(1, tmp_w >> 1);
diff --git a/dll/directx/wine/wined3d/wined3d_gl.h b/dll/directx/wine/wined3d/wined3d_gl.h
index f8097d65cb9..4ece7e7df9a 100644
--- a/dll/directx/wine/wined3d/wined3d_gl.h
+++ b/dll/directx/wine/wined3d/wined3d_gl.h
@@ -1754,6 +1754,7 @@ typedef enum wined3d_gl_extension
ARB_SHADER_OBJECTS,
ARB_SHADER_TEXTURE_LOD,
ARB_SHADING_LANGUAGE_100,
+ ARB_SHADOW,
ARB_SYNC,
ARB_TEXTURE_BORDER_CLAMP,
ARB_TEXTURE_COMPRESSION,
@@ -1782,6 +1783,7 @@ typedef enum wined3d_gl_extension
EXT_BLEND_EQUATION_SEPARATE,
EXT_BLEND_FUNC_SEPARATE,
EXT_BLEND_MINMAX,
+ EXT_DRAW_BUFFERS2,
EXT_FOG_COORD,
EXT_FRAMEBUFFER_BLIT,
EXT_FRAMEBUFFER_MULTISAMPLE,
@@ -1829,7 +1831,6 @@ typedef enum wined3d_gl_extension
SGIS_GENERATE_MIPMAP,
SGI_VIDEO_SYNC,
/* WGL extensions */
- WGL_ARB_PBUFFER,
WGL_ARB_PIXEL_FORMAT,
WGL_WINE_PIXEL_FORMAT_PASSTHROUGH,
/* Internally used */
@@ -2404,6 +2405,14 @@ typedef unsigned int GLhandleARB;
#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8b8c
#endif
+/* GL_ARB_shadow */
+#ifndef GL_ARB_shadow
+#define GL_ARB_shadow 1
+#define GL_TEXTURE_COMPARE_MODE_ARB 0x884c
+#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884d
+#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884e
+#endif
+
/* GL_ARB_sync */
#ifndef GL_ARB_sync
#define GL_ARB_sync 1
@@ -2959,6 +2968,15 @@ typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONSEPARATEEXTPROC)(GLenum modeRGB, GLe
typedef void (WINE_GLAPI *PGLFNBLENDFUNCSEPARATEEXTPROC)(GLenum sfactorRGB, GLenum dfactorRGB,
GLenum sfactorAlpha, GLenum dfactorAlpha);
+/* GL_EXT_draw_buffers2 */
+typedef GLvoid (WINE_GLAPI *PGLFNCOLORMASKINDEXEDEXTPROC)(GLuint buffer_idx, GLboolean r, GLboolean g,
+ GLboolean b, GLboolean a);
+typedef GLvoid (WINE_GLAPI *PGLFNGETBOOLEANINDEXEDVEXTPROC)(GLenum param, GLuint index, GLboolean *value);
+typedef GLvoid (WINE_GLAPI *PGLFNGETINTEGERINDEXEDVEXTPROC)(GLenum param, GLuint index, GLint *value);
+typedef GLvoid (WINE_GLAPI *PGLFNENABLEINDEXEDEXTPROC)(GLenum target, GLuint index);
+typedef GLvoid (WINE_GLAPI *PGLFNDISABLEINDEXEDEXTPROC)(GLenum target, GLuint index);
+typedef GLboolean (WINE_GLAPI *PGLFNISENABLEDINDEXEDEXTPROC)(GLenum target, GLuint index);
+
/* GL_EXT_fog_coord */
#ifndef GL_EXT_fog_coord
#define GL_EXT_fog_coord 1
@@ -3680,26 +3698,6 @@ typedef const char *(WINAPI *WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc);
#define WGL_SAMPLES_ARB 0x2042
#endif
-/* 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
-#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);
-
/* WGL_ARB_pixel_format */
#ifndef WGL_ARB_pixel_format
#define WGL_ARB_pixel_format 1
@@ -3930,7 +3928,7 @@ typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelForma
glUniform3iARB, ARB_SHADER_OBJECTS, NULL) \
USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IARBPROC, \
glUniform4iARB, ARB_SHADER_OBJECTS, NULL) \
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC, \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM1FARBPROC, \
glUniform1fARB, ARB_SHADER_OBJECTS, NULL) \
USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FARBPROC, \
glUniform2fARB, ARB_SHADER_OBJECTS, NULL) \
@@ -4199,6 +4197,19 @@ typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelForma
/* GL_EXT_blend_func_separate */ \
USE_GL_FUNC(PGLFNBLENDEQUATIONSEPARATEEXTPROC, \
glBlendEquationSeparateEXT, EXT_BLEND_EQUATION_SEPARATE, NULL) \
+ /* GL_EXT_draw_buffers2 */ \
+ USE_GL_FUNC(PGLFNCOLORMASKINDEXEDEXTPROC, \
+ glColorMaskIndexedEXT, EXT_DRAW_BUFFERS2, NULL) \
+ USE_GL_FUNC(PGLFNGETBOOLEANINDEXEDVEXTPROC, \
+ glGetBooleanIndexedvEXT, EXT_DRAW_BUFFERS2, NULL) \
+ USE_GL_FUNC(PGLFNGETINTEGERINDEXEDVEXTPROC, \
+ glGetIntegerIndexedvEXT, EXT_DRAW_BUFFERS2, NULL) \
+ USE_GL_FUNC(PGLFNENABLEINDEXEDEXTPROC, \
+ glEnableIndexedEXT, EXT_DRAW_BUFFERS2, NULL) \
+ USE_GL_FUNC(PGLFNDISABLEINDEXEDEXTPROC, \
+ glDisableIndexedEXT, EXT_DRAW_BUFFERS2, NULL) \
+ USE_GL_FUNC(PGLFNISENABLEDINDEXEDEXTPROC, \
+ glIsEnabledIndexedEXT, EXT_DRAW_BUFFERS2, NULL) \
/* GL_EXT_fog_coord */ \
USE_GL_FUNC(PGLFNGLFOGCOORDFEXTPROC, \
glFogCoordfEXT, EXT_FOG_COORD, NULL) \
@@ -4489,11 +4500,6 @@ typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelForma
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_main.c b/dll/directx/wine/wined3d/wined3d_main.c
index 39416e1f875..6330eba44d4 100644
--- a/dll/directx/wine/wined3d/wined3d_main.c
+++ b/dll/directx/wine/wined3d/wined3d_main.c
@@ -72,30 +72,31 @@ wined3d_settings_t wined3d_settings =
PCI_DEVICE_NONE,/* PCI Device ID */
0, /* The default of memory is set in FillGLCaps */
NULL, /* No wine logo by default */
- FALSE /* Disable multisampling for now due to Nvidia driver bugs which happens for some users */
+ FALSE, /* Disable multisampling for now due to Nvidia driver bugs which happens for some users */
+ FALSE, /* No strict draw ordering. */
};
-IWineD3D* WINAPI WineDirect3DCreate(UINT dxVersion, IUnknown *parent) {
- IWineD3DImpl* object;
+IWineD3D * WINAPI WineDirect3DCreate(UINT version, IUnknown *parent)
+{
+ IWineD3DImpl *object;
+ HRESULT hr;
- object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DImpl));
- object->lpVtbl = &IWineD3D_Vtbl;
- object->dxVersion = dxVersion;
- object->ref = 1;
- object->parent = parent;
-
- if (!InitAdapters(object))
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+ if (!object)
{
- WARN("Failed to initialize direct3d adapters, Direct3D will not be available\n");
- if (dxVersion > 7)
- {
- ERR("Direct3D%d is not available without opengl\n", dxVersion);
- HeapFree(GetProcessHeap(), 0, object);
- return NULL;
- }
+ ERR("Failed to allocate wined3d object memory.\n");
+ return NULL;
}
- TRACE("Created WineD3D object @ %p for d3d%d support\n", object, dxVersion);
+ hr = wined3d_init(object, version, parent);
+ if (FAILED(hr))
+ {
+ WARN("Failed to initialize wined3d object, hr %#x.\n", hr);
+ HeapFree(GetProcessHeap(), 0, object);
+ return NULL;
+ }
+
+ TRACE("Created wined3d object %p for d3d%d support.\n", object, version);
return (IWineD3D *)object;
}
@@ -120,7 +121,7 @@ static void CDECL wined3d_do_nothing(void)
{
}
-static BOOL wined3d_init(HINSTANCE hInstDLL)
+static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
{
DWORD wined3d_context_tls_idx;
HMODULE mod;
@@ -236,11 +237,6 @@ static BOOL wined3d_init(HINSTANCE hInstDLL)
TRACE("Using the backbuffer for offscreen rendering\n");
wined3d_settings.offscreen_rendering_mode = ORM_BACKBUFFER;
}
- else if (!strcmp(buffer,"pbuffer"))
- {
- TRACE("Using PBuffers for offscreen rendering\n");
- wined3d_settings.offscreen_rendering_mode = ORM_PBUFFER;
- }
else if (!strcmp(buffer,"fbo"))
{
TRACE("Using FBOs for offscreen rendering\n");
@@ -324,6 +320,12 @@ static BOOL wined3d_init(HINSTANCE hInstDLL)
wined3d_settings.allow_multisampling = TRUE;
}
}
+ if (!get_config_key(hkey, appkey, "StrictDrawOrdering", buffer, size)
+ && !strcmp(buffer,"enabled"))
+ {
+ TRACE("Enforcing strict draw ordering.\n");
+ wined3d_settings.strict_draw_ordering = TRUE;
+ }
}
if (wined3d_settings.vs_mode == VS_HW)
TRACE("Allow HW vertex shaders\n");
@@ -338,7 +340,7 @@ static BOOL wined3d_init(HINSTANCE hInstDLL)
return TRUE;
}
-static BOOL wined3d_destroy(HINSTANCE hInstDLL)
+static BOOL wined3d_dll_destroy(HINSTANCE hInstDLL)
{
DWORD wined3d_context_tls_idx = context_get_tls_idx();
unsigned int i;
@@ -478,10 +480,10 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
- return wined3d_init(hInstDLL);
+ return wined3d_dll_init(hInstDLL);
case DLL_PROCESS_DETACH:
- return wined3d_destroy(hInstDLL);
+ return wined3d_dll_destroy(hInstDLL);
case DLL_THREAD_DETACH:
{
diff --git a/dll/directx/wine/wined3d/wined3d_private.h b/dll/directx/wine/wined3d/wined3d_private.h
index 1d5cd974645..5c96d764389 100644
--- a/dll/directx/wine/wined3d/wined3d_private.h
+++ b/dll/directx/wine/wined3d/wined3d_private.h
@@ -50,6 +50,7 @@
#define WINED3D_QUIRK_GLSL_CLIP_VARYING 0x00000004
#define WINED3D_QUIRK_ALLOWS_SPECULAR_ALPHA 0x00000008
#define WINED3D_QUIRK_NV_CLIP_BROKEN 0x00000010
+#define WINED3D_QUIRK_FBO_TEX_UPDATE 0x00000020
/* Texture format fixups */
@@ -67,10 +68,11 @@ enum fixup_channel_source
enum complex_fixup
{
- COMPLEX_FIXUP_YUY2 = 0,
- COMPLEX_FIXUP_UYVY = 1,
- COMPLEX_FIXUP_YV12 = 2,
- COMPLEX_FIXUP_P8 = 3,
+ COMPLEX_FIXUP_NONE = 0,
+ COMPLEX_FIXUP_YUY2 = 1,
+ COMPLEX_FIXUP_UYVY = 2,
+ COMPLEX_FIXUP_YV12 = 3,
+ COMPLEX_FIXUP_P8 = 4,
};
#include
@@ -234,8 +236,7 @@ static inline float float_24_to_32(DWORD in)
#define VBO_HW 1
#define ORM_BACKBUFFER 0
-#define ORM_PBUFFER 1
-#define ORM_FBO 2
+#define ORM_FBO 1
#define SHADER_ARB 1
#define SHADER_GLSL 2
@@ -267,6 +268,7 @@ typedef struct wined3d_settings_s {
unsigned int emulated_textureram;
char *logo;
int allow_multisampling;
+ BOOL strict_draw_ordering;
} wined3d_settings_t;
extern wined3d_settings_t wined3d_settings DECLSPEC_HIDDEN;
@@ -539,7 +541,8 @@ typedef struct shader_reg_maps
WORD usestexldl : 1;
WORD usesifc : 1;
WORD usescall : 1;
- WORD padding : 4;
+ WORD usesrcp : 1;
+ WORD padding : 3;
/* Whether or not loops are used in this shader, and nesting depth */
unsigned loop_depth;
@@ -643,14 +646,6 @@ struct shader_caps {
float PixelShader1xMaxValue;
DWORD MaxPixelShaderConst;
- WINED3DVSHADERCAPS2_0 VS20Caps;
- WINED3DPSHADERCAPS2_0 PS20Caps;
-
- DWORD MaxVShaderInstructionsExecuted;
- DWORD MaxPShaderInstructionsExecuted;
- DWORD MaxVertexShader30InstructionSlots;
- DWORD MaxPixelShader30InstructionSlots;
-
BOOL VSClipping;
};
@@ -693,6 +688,7 @@ struct ps_compile_args {
/* Bitmap for NP2 texcoord fixups (16 samplers max currently).
D3D9 has a limit of 16 samplers and the fixup is superfluous
in D3D10 (unconditional NP2 support mandatory). */
+ WORD shadow; /* MAX_FRAGMENT_SAMPLERS, 16 */
};
enum fog_src_type {
@@ -711,7 +707,7 @@ struct wined3d_context;
typedef struct {
void (*shader_handle_instruction)(const struct wined3d_shader_instruction *);
void (*shader_select)(const struct wined3d_context *context, BOOL usePS, BOOL useVS);
- void (*shader_select_depth_blt)(IWineD3DDevice *iface, enum tex_types tex_type);
+ void (*shader_select_depth_blt)(IWineD3DDevice *iface, enum tex_types tex_type, const SIZE *ds_mask_size);
void (*shader_deselect_depth_blt)(IWineD3DDevice *iface);
void (*shader_update_float_vertex_constants)(IWineD3DDevice *iface, UINT start, UINT count);
void (*shader_update_float_pixel_constants)(IWineD3DDevice *iface, UINT start, UINT count);
@@ -752,7 +748,7 @@ extern int num_lock DECLSPEC_HIDDEN;
/* GL related defines */
/* ------------------ */
-#define GL_EXTCALL(FuncName) (GLINFO_LOCATION.FuncName)
+#define GL_EXTCALL(f) (gl_info->f)
#define D3DCOLOR_B_R(dw) (((dw) >> 16) & 0xFF)
#define D3DCOLOR_B_G(dw) (((dw) >> 8) & 0xFF)
@@ -771,9 +767,6 @@ extern int num_lock DECLSPEC_HIDDEN;
(vec)[3] = D3DCOLOR_A(dw); \
} while(0)
-/* DirectX Device Limits */
-/* --------------------- */
-#define MAX_MIP_LEVELS 32 /* Maximum number of mipmap levels. */
#define HIGHEST_TRANSFORMSTATE WINED3DTS_WORLDMATRIX(255) /* Highest value in WINED3DTRANSFORMSTATETYPE */
/* Checking of API calls */
@@ -788,7 +781,7 @@ do { \
TRACE("%s call ok %s / %d\n", A, __FILE__, __LINE__); \
\
} else do { \
- FIXME(">>>>>>>>>>>>>>>>> %s (%#x) from %s @ %s / %d\n", \
+ ERR(">>>>>>>>>>>>>>>>> %s (%#x) from %s @ %s / %d\n", \
debug_glerror(err), err, A, __FILE__, __LINE__); \
err = glGetError(); \
} while (err != GL_NO_ERROR); \
@@ -830,13 +823,6 @@ extern const float identity[16] DECLSPEC_HIDDEN;
* Compilable extra diagnostics
*/
-/* Trace information per-vertex: (extremely high amount of trace) */
-#if 0 /* NOTE: Must be 0 in cvs */
-# define VTRACE(A) TRACE A
-#else
-# define VTRACE(A)
-#endif
-
/* TODO: Confirm each of these works when wined3d move completed */
#if 0 /* NOTE: Must be 0 in cvs */
/* To avoid having to get gigabytes of trace, the following can be compiled in, and at the start
@@ -910,7 +896,7 @@ enum wined3d_ffp_emit_idx
struct wined3d_stream_info_element
{
- const struct GlPixelFormatDesc *format_desc;
+ const struct wined3d_format_desc *format_desc;
GLsizei stride;
const BYTE *data;
UINT stream_idx;
@@ -1039,6 +1025,12 @@ enum wined3d_event_query_result
WINED3D_EVENT_QUERY_ERROR
};
+void wined3d_event_query_destroy(struct wined3d_event_query *query) DECLSPEC_HIDDEN;
+enum wined3d_event_query_result wined3d_event_query_test(struct wined3d_event_query *query, IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
+enum wined3d_event_query_result wined3d_event_query_finish(struct wined3d_event_query *query, IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
+void wined3d_event_query_issue(struct wined3d_event_query *query, IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
+HRESULT wined3d_event_query_supported(const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
+
struct wined3d_context
{
const struct wined3d_gl_info *gl_info;
@@ -1052,8 +1044,8 @@ struct wined3d_context
DWORD numDirtyEntries;
DWORD isStateDirty[STATE_HIGHEST / (sizeof(DWORD) * CHAR_BIT) + 1]; /* Bitmap to find out quickly if a state is dirty */
- IWineD3DSurface *surface;
- IWineD3DSurface *current_rt;
+ IWineD3DSwapChainImpl *swapchain;
+ IWineD3DSurfaceImpl *current_rt;
DWORD tid; /* Thread ID which owns this context at the moment */
/* Stores some information about the context state for optimization */
@@ -1089,7 +1081,7 @@ struct wined3d_context
HGLRC glCtx;
HWND win_handle;
HDC hdc;
- HPBUFFERARB pbuffer;
+ int pixel_format;
GLint aux_buffers;
/* FBOs */
@@ -1097,10 +1089,11 @@ struct wined3d_context
struct list fbo_list;
struct list fbo_destroy_list;
struct fbo_entry *current_fbo;
- GLuint src_fbo;
GLuint dst_fbo;
GLuint fbo_read_binding;
GLuint fbo_draw_binding;
+ BOOL rebind_fbo;
+ IWineD3DSurfaceImpl **blit_targets;
/* Queries */
GLuint *free_occlusion_queries;
@@ -1167,60 +1160,69 @@ HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_
const struct wined3d_gl_info *gl_info, const struct StateEntryTemplate *vertex,
const struct fragment_pipeline *fragment, const struct StateEntryTemplate *misc) DECLSPEC_HIDDEN;
+enum blit_operation
+{
+ BLIT_OP_BLIT,
+ BLIT_OP_COLOR_FILL
+};
+
/* Shaders for color conversions in blits */
struct blit_shader
{
HRESULT (*alloc_private)(IWineD3DDevice *iface);
void (*free_private)(IWineD3DDevice *iface);
- HRESULT (*set_shader)(IWineD3DDevice *iface, const struct GlPixelFormatDesc *format_desc,
- GLenum textype, UINT width, UINT height);
+ HRESULT (*set_shader)(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface);
void (*unset_shader)(IWineD3DDevice *iface);
- BOOL (*color_fixup_supported)(struct color_fixup_desc fixup);
+ BOOL (*blit_supported)(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op,
+ const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, const struct wined3d_format_desc *src_format_desc,
+ const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, const struct wined3d_format_desc *dst_format_desc);
+ HRESULT (*color_fill)(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD fill_color);
};
extern const struct blit_shader ffp_blit DECLSPEC_HIDDEN;
extern const struct blit_shader arbfp_blit DECLSPEC_HIDDEN;
+extern const struct blit_shader cpu_blit DECLSPEC_HIDDEN;
-typedef enum ContextUsage {
- CTXUSAGE_RESOURCELOAD = 1, /* Only loads textures: No State is applied */
- CTXUSAGE_DRAWPRIM = 2, /* OpenGL states are set up for blitting DirectDraw surfaces */
- CTXUSAGE_BLIT = 3, /* OpenGL states are set up 3D drawing */
- CTXUSAGE_CLEAR = 4, /* Drawable and states are set up for clearing */
-} ContextUsage;
+/* Temporary blit_shader helper functions */
+HRESULT arbfp_blit_surface(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *src_surface, const RECT *src_rect,
+ IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect_in, enum blit_operation blit_op,
+ DWORD Filter) DECLSPEC_HIDDEN;
-struct wined3d_context *context_acquire(IWineD3DDeviceImpl *This,
- IWineD3DSurface *target, enum ContextUsage usage) DECLSPEC_HIDDEN;
+struct wined3d_context *context_acquire(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target) DECLSPEC_HIDDEN;
void context_alloc_event_query(struct wined3d_context *context,
struct wined3d_event_query *query) DECLSPEC_HIDDEN;
void context_alloc_occlusion_query(struct wined3d_context *context,
struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN;
-void context_resource_released(IWineD3DDevice *iface,
- IWineD3DResource *resource, WINED3DRESOURCETYPE type) DECLSPEC_HIDDEN;
-void context_bind_fbo(struct wined3d_context *context, GLenum target, GLuint *fbo) DECLSPEC_HIDDEN;
+void context_apply_blit_state(struct wined3d_context *context, IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
+void context_apply_clear_state(struct wined3d_context *context, IWineD3DDeviceImpl *device,
+ IWineD3DSurfaceImpl *render_target, IWineD3DSurfaceImpl *depth_stencil) DECLSPEC_HIDDEN;
+void context_apply_draw_state(struct wined3d_context *context, IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
+void context_apply_fbo_state_blit(struct wined3d_context *context, GLenum target,
+ IWineD3DSurfaceImpl *render_target, IWineD3DSurfaceImpl *depth_stencil) DECLSPEC_HIDDEN;
void context_attach_depth_stencil_fbo(struct wined3d_context *context,
- GLenum fbo_target, IWineD3DSurface *depth_stencil, BOOL use_render_buffer) DECLSPEC_HIDDEN;
-void context_attach_surface_fbo(const struct wined3d_context *context,
- GLenum fbo_target, DWORD idx, IWineD3DSurface *surface) DECLSPEC_HIDDEN;
-struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, HWND win,
- BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *present_parameters) DECLSPEC_HIDDEN;
+ GLenum fbo_target, IWineD3DSurfaceImpl *depth_stencil, BOOL use_render_buffer) DECLSPEC_HIDDEN;
+void context_bind_fbo(struct wined3d_context *context, GLenum target, GLuint *fbo) DECLSPEC_HIDDEN;
+struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3DSurfaceImpl *target,
+ const struct wined3d_format_desc *ds_format_desc) DECLSPEC_HIDDEN;
void context_destroy(IWineD3DDeviceImpl *This, struct wined3d_context *context) DECLSPEC_HIDDEN;
void context_free_event_query(struct wined3d_event_query *query) DECLSPEC_HIDDEN;
void context_free_occlusion_query(struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN;
struct wined3d_context *context_get_current(void) DECLSPEC_HIDDEN;
DWORD context_get_tls_idx(void) DECLSPEC_HIDDEN;
void context_release(struct wined3d_context *context) DECLSPEC_HIDDEN;
+void context_resource_released(IWineD3DDevice *iface,
+ IWineD3DResource *resource, WINED3DRESOURCETYPE type) DECLSPEC_HIDDEN;
BOOL context_set_current(struct wined3d_context *ctx) DECLSPEC_HIDDEN;
void context_set_draw_buffer(struct wined3d_context *context, GLenum buffer) DECLSPEC_HIDDEN;
void context_set_tls_idx(DWORD idx) DECLSPEC_HIDDEN;
-
-void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain) DECLSPEC_HIDDEN;
-HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain) DECLSPEC_HIDDEN;
+void context_surface_update(struct wined3d_context *context, IWineD3DSurfaceImpl *surface) DECLSPEC_HIDDEN;
/* Macros for doing basic GPU detection based on opengl capabilities */
#define WINE_D3D6_CAPABLE(gl_info) (gl_info->supported[ARB_MULTITEXTURE])
#define WINE_D3D7_CAPABLE(gl_info) (gl_info->supported[ARB_TEXTURE_COMPRESSION] && gl_info->supported[ARB_TEXTURE_CUBE_MAP] && gl_info->supported[ARB_TEXTURE_ENV_DOT3])
#define WINE_D3D8_CAPABLE(gl_info) WINE_D3D7_CAPABLE(gl_info) && (gl_info->supported[ARB_MULTISAMPLE] && gl_info->supported[ARB_TEXTURE_BORDER_CLAMP])
#define WINE_D3D9_CAPABLE(gl_info) WINE_D3D8_CAPABLE(gl_info) && (gl_info->supported[ARB_FRAGMENT_PROGRAM] && gl_info->supported[ARB_VERTEX_SHADER])
+#define WINE_D3D10_CAPABLE(gl_info) WINE_D3D9_CAPABLE(gl_info) && (gl_info->supported[EXT_GPU_SHADER4])
/*****************************************************************************
* Internal representation of a light
@@ -1251,7 +1253,6 @@ typedef struct WineD3D_PixelFormat
int redSize, greenSize, blueSize, alphaSize, colorSize;
int depthSize, stencilSize;
BOOL windowDrawable;
- BOOL pbufferDrawable;
BOOL doubleBuffer;
int auxBuffers;
int numSamples;
@@ -1259,9 +1260,9 @@ typedef struct WineD3D_PixelFormat
enum wined3d_gl_vendor
{
- GL_VENDOR_WINE,
+ GL_VENDOR_UNKNOWN,
GL_VENDOR_APPLE,
- GL_VENDOR_ATI,
+ GL_VENDOR_FGLRX,
GL_VENDOR_INTEL,
GL_VENDOR_MESA,
GL_VENDOR_NVIDIA,
@@ -1270,7 +1271,7 @@ enum wined3d_gl_vendor
enum wined3d_pci_vendor
{
- HW_VENDOR_WINE = 0x0000,
+ HW_VENDOR_SOFTWARE = 0x0000,
HW_VENDOR_ATI = 0x1002,
HW_VENDOR_NVIDIA = 0x10de,
HW_VENDOR_INTEL = 0x8086,
@@ -1287,7 +1288,7 @@ enum wined3d_pci_device
CARD_ATI_RADEON_XPRESS_200M = 0x5955,
CARD_ATI_RADEON_X700 = 0x5e4c,
CARD_ATI_RADEON_X1600 = 0x71c2,
- CARD_ATI_RADEON_HD2300 = 0x7210,
+ CARD_ATI_RADEON_HD2350 = 0x94c7,
CARD_ATI_RADEON_HD2600 = 0x9581,
CARD_ATI_RADEON_HD2900 = 0x9400,
CARD_ATI_RADEON_HD3200 = 0x9620,
@@ -1418,6 +1419,7 @@ struct wined3d_gl_limits
struct wined3d_gl_info
{
+ DWORD glsl_version;
UINT vidmem;
struct wined3d_gl_limits limits;
DWORD reserved_glsl_constants;
@@ -1433,7 +1435,7 @@ struct wined3d_gl_info
WGL_EXT_FUNCS_GEN
#undef USE_GL_FUNC
- struct GlPixelFormatDesc *gl_formats;
+ struct wined3d_format_desc *gl_formats;
};
struct wined3d_driver_info
@@ -1469,7 +1471,7 @@ struct wined3d_adapter
BOOL initPixelFormats(struct wined3d_gl_info *gl_info, enum wined3d_pci_vendor vendor) DECLSPEC_HIDDEN;
BOOL initPixelFormatsNoGL(struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
-extern long WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *D3DDevice, long glram) DECLSPEC_HIDDEN;
+extern unsigned int WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *D3DDevice, unsigned int glram) DECLSPEC_HIDDEN;
extern void add_gl_compat_wrappers(struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
/*****************************************************************************
@@ -1564,14 +1566,9 @@ typedef struct IWineD3DImpl
struct wined3d_adapter adapters[1];
} IWineD3DImpl;
-extern const IWineD3DVtbl IWineD3D_Vtbl DECLSPEC_HIDDEN;
-
+HRESULT wined3d_init(IWineD3DImpl *wined3d, UINT version, IUnknown *parent) DECLSPEC_HIDDEN;
BOOL wined3d_register_window(HWND window, struct IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
void wined3d_unregister_window(HWND window) DECLSPEC_HIDDEN;
-BOOL InitAdapters(IWineD3DImpl *This) DECLSPEC_HIDDEN;
-
-/* A helper function that dumps a resource list */
-void dumpResources(struct list *list) DECLSPEC_HIDDEN;
/*****************************************************************************
* IWineD3DDevice implementation structure
@@ -1656,9 +1653,10 @@ struct IWineD3DDeviceImpl
unsigned int highest_dirty_ps_const, highest_dirty_vs_const;
/* Render Target Support */
- IWineD3DSurface **render_targets;
- IWineD3DSurface *auto_depth_stencil_buffer;
- IWineD3DSurface *stencilBufferTarget;
+ IWineD3DSurfaceImpl **render_targets;
+ IWineD3DSurfaceImpl *auto_depth_stencil;
+ IWineD3DSurfaceImpl *onscreen_depth_stencil;
+ IWineD3DSurfaceImpl *depth_stencil;
/* palettes texture management */
UINT NumberOfPalettes;
@@ -1701,12 +1699,12 @@ struct IWineD3DDeviceImpl
/* Stream source management */
struct wined3d_stream_info strided_streams;
const WineDirect3DVertexStridedData *up_strided;
+ struct wined3d_event_query *buffer_queries[MAX_ATTRIBS];
+ unsigned int num_buffer_queries;
/* Context management */
struct wined3d_context **contexts;
UINT numContexts;
- struct wined3d_context *pbufferContext; /* The context that has a pbuffer as drawable */
- DWORD pbufferWidth, pbufferHeight; /* Size of the buffer drawable */
/* High level patch management */
#define PATCHMAP_SIZE 43
@@ -1715,6 +1713,9 @@ struct IWineD3DDeviceImpl
struct WineD3DRectPatch *currentPatch;
};
+BOOL device_context_add(IWineD3DDeviceImpl *device, struct wined3d_context *context) DECLSPEC_HIDDEN;
+void device_context_remove(IWineD3DDeviceImpl *device, struct wined3d_context *context) DECLSPEC_HIDDEN;
+void device_get_draw_rect(IWineD3DDeviceImpl *device, RECT *rect) DECLSPEC_HIDDEN;
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;
@@ -1725,6 +1726,8 @@ void device_resource_add(IWineD3DDeviceImpl *This, IWineD3DResource *resource) D
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_switch_onscreen_ds(IWineD3DDeviceImpl *device, struct wined3d_context *context,
+ IWineD3DSurfaceImpl *depth_stencil) 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;
@@ -1770,7 +1773,7 @@ typedef struct IWineD3DResourceClass
WINED3DPOOL pool;
UINT size;
DWORD usage;
- const struct GlPixelFormatDesc *format_desc;
+ const struct wined3d_format_desc *format_desc;
DWORD priority;
BYTE *allocatedMemory; /* Pointer to the real data location */
BYTE *heapMemory; /* Pointer to the HeapAlloced block of memory */
@@ -1793,7 +1796,7 @@ DWORD resource_get_priority(IWineD3DResource *iface) DECLSPEC_HIDDEN;
HRESULT resource_get_private_data(IWineD3DResource *iface, REFGUID guid,
void *data, DWORD *data_size) DECLSPEC_HIDDEN;
HRESULT resource_init(IWineD3DResource *iface, WINED3DRESOURCETYPE resource_type,
- IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc,
+ IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct wined3d_format_desc *format_desc,
WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
WINED3DRESOURCETYPE resource_get_type(IWineD3DResource *iface) DECLSPEC_HIDDEN;
DWORD resource_set_priority(IWineD3DResource *iface, DWORD new_priority) DECLSPEC_HIDDEN;
@@ -1801,7 +1804,7 @@ HRESULT resource_set_private_data(IWineD3DResource *iface, REFGUID guid,
const void *data, DWORD data_size, DWORD flags) DECLSPEC_HIDDEN;
/* Tests show that the start address of resources is 32 byte aligned */
-#define RESOURCE_ALIGNMENT 32
+#define RESOURCE_ALIGNMENT 16
/*****************************************************************************
* IWineD3DBaseTexture D3D- > openGL state map lookups
@@ -1818,10 +1821,8 @@ typedef enum winetexturestates {
WINED3DTEXSTA_MAXMIPLEVEL = 7,
WINED3DTEXSTA_MAXANISOTROPY = 8,
WINED3DTEXSTA_SRGBTEXTURE = 9,
- WINED3DTEXSTA_ELEMENTINDEX = 10,
- WINED3DTEXSTA_DMAPOFFSET = 11,
- WINED3DTEXSTA_TSSADDRESSW = 12,
- MAX_WINETEXTURESTATES = 13,
+ WINED3DTEXSTA_SHADOW = 10,
+ MAX_WINETEXTURESTATES = 11,
} winetexturestates;
enum WINED3DSRGB
@@ -1845,7 +1846,9 @@ struct gl_texture
typedef struct IWineD3DBaseTextureClass
{
struct gl_texture texture_rgb, texture_srgb;
- UINT levels;
+ IWineD3DResourceImpl **sub_resources;
+ UINT layer_count;
+ UINT level_count;
float pow2Matrix[16];
UINT LOD;
WINED3DTEXTUREFILTERTYPE filterType;
@@ -1858,10 +1861,11 @@ typedef struct IWineD3DBaseTextureClass
void (*internal_preload)(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb);
} 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;
+void surface_internal_preload(IWineD3DSurfaceImpl *surface, enum WINED3DSRGB srgb) DECLSPEC_HIDDEN;
+BOOL surface_init_sysmem(IWineD3DSurfaceImpl *surface) DECLSPEC_HIDDEN;
+BOOL surface_is_offscreen(IWineD3DSurfaceImpl *iface) DECLSPEC_HIDDEN;
+void surface_prepare_texture(IWineD3DSurfaceImpl *surface,
+ const struct wined3d_gl_info *gl_info, BOOL srgb) DECLSPEC_HIDDEN;
typedef struct IWineD3DBaseTextureImpl
{
@@ -1883,9 +1887,12 @@ WINED3DTEXTUREFILTERTYPE basetexture_get_autogen_filter_type(IWineD3DBaseTexture
BOOL basetexture_get_dirty(IWineD3DBaseTexture *iface) DECLSPEC_HIDDEN;
DWORD basetexture_get_level_count(IWineD3DBaseTexture *iface) DECLSPEC_HIDDEN;
DWORD basetexture_get_lod(IWineD3DBaseTexture *iface) DECLSPEC_HIDDEN;
-HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT levels, WINED3DRESOURCETYPE resource_type,
- IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc,
- WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
+IWineD3DResourceImpl *basetexture_get_sub_resource(IWineD3DBaseTextureImpl *texture,
+ UINT layer, UINT level) DECLSPEC_HIDDEN;
+HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT layer_count, UINT level_count,
+ WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, UINT size, DWORD usage,
+ const struct wined3d_format_desc *format_desc, WINED3DPOOL pool, IUnknown *parent,
+ const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTexture *iface,
WINED3DTEXTUREFILTERTYPE filter_type) DECLSPEC_HIDDEN;
BOOL basetexture_set_dirty(IWineD3DBaseTexture *iface, BOOL dirty) DECLSPEC_HIDDEN;
@@ -1903,7 +1910,6 @@ typedef struct IWineD3DTextureImpl
IWineD3DBaseTextureClass baseTexture;
/* IWineD3DTexture */
- IWineD3DSurface *surfaces[MAX_MIP_LEVELS];
UINT target;
BOOL cond_np2;
@@ -1922,9 +1928,6 @@ typedef struct IWineD3DCubeTextureImpl
const IWineD3DCubeTextureVtbl *lpVtbl;
IWineD3DResourceClass resource;
IWineD3DBaseTextureClass baseTexture;
-
- /* IWineD3DCubeTexture */
- IWineD3DSurface *surfaces[6][MAX_MIP_LEVELS];
} IWineD3DCubeTextureImpl;
HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UINT levels,
@@ -1971,9 +1974,6 @@ typedef struct IWineD3DVolumeTextureImpl
const IWineD3DVolumeTextureVtbl *lpVtbl;
IWineD3DResourceClass resource;
IWineD3DBaseTextureClass baseTexture;
-
- /* IWineD3DVolumeTexture */
- IWineD3DVolume *volumes[MAX_MIP_LEVELS];
} IWineD3DVolumeTextureImpl;
HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT height,
@@ -2009,8 +2009,8 @@ typedef struct {
struct fbo_entry
{
struct list entry;
- IWineD3DSurface **render_targets;
- IWineD3DSurface *depth_stencil;
+ IWineD3DSurfaceImpl **render_targets;
+ IWineD3DSurfaceImpl *depth_stencil;
BOOL attached;
GLuint id;
};
@@ -2052,9 +2052,6 @@ struct IWineD3DSurfaceImpl
/* A method to retrieve the drawable size. Not in the Vtable to make it changeable */
void (*get_drawable_size)(struct wined3d_context *context, UINT *width, UINT *height);
- /* Oversized texture */
- RECT glRect;
-
/* PBO */
GLuint pbo;
GLuint texture_name;
@@ -2082,6 +2079,7 @@ struct IWineD3DSurfaceImpl
struct list renderbuffers;
renderbuffer_entry_t *current_renderbuffer;
+ SIZE ds_current_size;
/* DirectDraw clippers */
IWineD3DClipper *clipper;
@@ -2097,13 +2095,14 @@ struct IWineD3DSurfaceImpl
extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl DECLSPEC_HIDDEN;
extern const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl DECLSPEC_HIDDEN;
-UINT surface_calculate_size(const struct GlPixelFormatDesc *format_desc,
+UINT surface_calculate_size(const struct wined3d_format_desc *format_desc,
UINT alignment, UINT width, UINT height) DECLSPEC_HIDDEN;
void surface_gdi_cleanup(IWineD3DSurfaceImpl *This) DECLSPEC_HIDDEN;
HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, UINT alignment,
UINT width, UINT height, UINT level, BOOL lockable, BOOL discard, WINED3DMULTISAMPLE_TYPE multisample_type,
UINT multisample_quality, IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format,
WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
+void surface_translate_frontbuffer_coords(IWineD3DSurfaceImpl *surface, HWND window, RECT *rect) DECLSPEC_HIDDEN;
/* Predeclare the shared Surface functions */
HRESULT WINAPI IWineD3DBaseSurfaceImpl_QueryInterface(IWineD3DSurface *iface,
@@ -2153,13 +2152,13 @@ const void *WINAPI IWineD3DBaseSurfaceImpl_GetData(IWineD3DSurface *iface) DECLS
void get_drawable_size_swapchain(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
void get_drawable_size_backbuffer(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
-void get_drawable_size_pbuffer(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
void get_drawable_size_fbo(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
+void draw_textured_quad(IWineD3DSurfaceImpl *src_surface, const RECT *src_rect,
+ const RECT *dst_rect, WINED3DTEXTUREFILTERTYPE Filter) DECLSPEC_HIDDEN;
void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back) DECLSPEC_HIDDEN;
/* Surface flags: */
-#define SFLAG_OVERSIZE 0x00000001 /* Surface is bigger than gl size, blts only */
#define SFLAG_CONVERTED 0x00000002 /* Converted for color keying or Palettized */
#define SFLAG_DIBSECTION 0x00000004 /* Has a DIB section attached for GetDC */
#define SFLAG_LOCKABLE 0x00000008 /* Surface can be locked */
@@ -2186,7 +2185,6 @@ void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back) DECLSPE
#define SFLAG_SWAPCHAIN 0x01000000 /* The surface is part of a swapchain */
/* In some conditions the surface memory must not be freed:
- * SFLAG_OVERSIZE: Not all data can be kept in GL
* SFLAG_CONVERTED: Converting the data back would take too long
* SFLAG_DIBSECTION: The dib code manages the memory
* SFLAG_LOCKED: The app requires access to the surface data
@@ -2194,8 +2192,7 @@ void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back) DECLSPE
* SFLAG_PBO: PBOs don't use 'normal' memory. It is either allocated by the driver or must be NULL.
* SFLAG_CLIENT: OpenGL uses our memory as backup
*/
-#define SFLAG_DONOTFREE (SFLAG_OVERSIZE | \
- SFLAG_CONVERTED | \
+#define SFLAG_DONOTFREE (SFLAG_CONVERTED | \
SFLAG_DIBSECTION | \
SFLAG_LOCKED | \
SFLAG_DYNLOCK | \
@@ -2212,38 +2209,19 @@ void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back) DECLSPE
SFLAG_DS_OFFSCREEN)
#define SFLAG_DS_DISCARDED SFLAG_DS_LOCATIONS
-BOOL CalculateTexRect(IWineD3DSurfaceImpl *This, RECT *Rect, float glTexCoord[4]) DECLSPEC_HIDDEN;
-
typedef enum {
NO_CONVERSION,
CONVERT_PALETTED,
CONVERT_PALETTED_CK,
CONVERT_CK_565,
CONVERT_CK_5551,
- CONVERT_CK_4444,
- CONVERT_CK_4444_ARGB,
- CONVERT_CK_1555,
- CONVERT_555,
CONVERT_CK_RGB24,
- CONVERT_CK_8888,
- CONVERT_CK_8888_ARGB,
- CONVERT_RGB32_888,
- CONVERT_V8U8,
- CONVERT_L6V5U5,
- CONVERT_X8L8V8U8,
- CONVERT_Q8W8V8U8,
- CONVERT_V16U16,
- CONVERT_A4L4,
- CONVERT_G16R16,
- CONVERT_R16G16F,
- CONVERT_R32G32F,
- CONVERT_D15S1,
- CONVERT_D24X4S4,
- CONVERT_D24FS8,
+ CONVERT_RGB32_888
} CONVERT_TYPES;
-HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_texturing, GLenum *format,
- GLenum *internal, GLenum *type, CONVERT_TYPES *convert, int *target_bpp, BOOL srgb_mode) DECLSPEC_HIDDEN;
+HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_texturing,
+ struct wined3d_format_desc *desc, CONVERT_TYPES *convert) DECLSPEC_HIDDEN;
+void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *This, BYTE table[256][4], BOOL colorkey) DECLSPEC_HIDDEN;
BOOL palette9_changed(IWineD3DSurfaceImpl *This) DECLSPEC_HIDDEN;
@@ -2253,7 +2231,7 @@ BOOL palette9_changed(IWineD3DSurfaceImpl *This) DECLSPEC_HIDDEN;
struct wined3d_vertex_declaration_element
{
- const struct GlPixelFormatDesc *format_desc;
+ const struct wined3d_format_desc *format_desc;
BOOL ffp_valid;
WORD input_slot;
WORD offset;
@@ -2432,6 +2410,14 @@ HRESULT stateblock_init(IWineD3DStateBlockImpl *stateblock,
IWineD3DDeviceImpl *device, WINED3DSTATEBLOCKTYPE type) DECLSPEC_HIDDEN;
void stateblock_init_contained_states(IWineD3DStateBlockImpl *object) DECLSPEC_HIDDEN;
+static inline void stateblock_apply_state(DWORD state, IWineD3DStateBlockImpl *stateblock,
+ struct wined3d_context *context)
+{
+ const struct StateEntry *statetable = stateblock->device->StateTable;
+ DWORD rep = statetable[state].representative;
+ statetable[rep].apply(rep, stateblock, context);
+}
+
/* Direct3D terminology with little modifications. We do not have an issued state
* because only the driver knows about it, but we have a created state because d3d
* allows GetData on a created issue, but opengl doesn't
@@ -2485,6 +2471,9 @@ struct wined3d_map_range
#define WINED3D_BUFFER_CREATEBO 0x04 /* Attempt to create a buffer object next PreLoad */
#define WINED3D_BUFFER_DOUBLEBUFFER 0x08 /* Use a vbo and local allocated memory */
#define WINED3D_BUFFER_FLUSH 0x10 /* Manual unmap flushing */
+#define WINED3D_BUFFER_DISCARD 0x20 /* A DISCARD lock has occurred since the last PreLoad */
+#define WINED3D_BUFFER_NOSYNC 0x40 /* All locks since the last PreLoad had NOOVERWRITE set */
+#define WINED3D_BUFFER_APPLESYNC 0x80 /* Using sync as in GL_APPLE_flush_buffer_range */
struct wined3d_buffer
{
@@ -2503,6 +2492,7 @@ struct wined3d_buffer
LONG lock_count;
struct wined3d_map_range *maps;
ULONG maps_size, modified_areas;
+ struct wined3d_event_query *query;
/* conversion stuff */
UINT decl_change_count, full_conversion_count;
@@ -2514,8 +2504,9 @@ struct wined3d_buffer
UINT *conversion_shift; /* NULL if no shifted conversion */
};
-const BYTE *buffer_get_memory(IWineD3DBuffer *iface, UINT offset, GLuint *buffer_object) DECLSPEC_HIDDEN;
-BYTE *buffer_get_sysmem(struct wined3d_buffer *This) DECLSPEC_HIDDEN;
+const BYTE *buffer_get_memory(IWineD3DBuffer *iface, const struct wined3d_gl_info *gl_info,
+ GLuint *buffer_object) DECLSPEC_HIDDEN;
+BYTE *buffer_get_sysmem(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device,
UINT size, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, GLenum bind_hint,
const char *data, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
@@ -2530,7 +2521,8 @@ struct wined3d_rendertarget_view
IUnknown *parent;
};
-extern const IWineD3DRendertargetViewVtbl wined3d_rendertarget_view_vtbl DECLSPEC_HIDDEN;
+void wined3d_rendertarget_view_init(struct wined3d_rendertarget_view *view,
+ IWineD3DResource *resource, IUnknown *parent) DECLSPEC_HIDDEN;
/*****************************************************************************
* IWineD3DSwapChainImpl implementation structure (extends IUnknown)
@@ -2546,21 +2538,23 @@ struct IWineD3DSwapChainImpl
IWineD3DDeviceImpl *device;
/* IWineD3DSwapChain fields */
- IWineD3DSurface **backBuffer;
- IWineD3DSurface *frontBuffer;
+ IWineD3DSurfaceImpl **back_buffers;
+ IWineD3DSurfaceImpl *front_buffer;
WINED3DPRESENT_PARAMETERS presentParms;
DWORD orig_width, orig_height;
WINED3DFORMAT orig_fmt;
WINED3DGAMMARAMP orig_gamma;
BOOL render_to_fbo;
+ const struct wined3d_format_desc *ds_format;
- long prev_time, frames; /* Performance tracking */
+ LONG prev_time, frames; /* Performance tracking */
unsigned int vSyncCounter;
struct wined3d_context **context;
unsigned int num_contexts;
HWND win_handle;
+ HWND device_window;
};
const IWineD3DSwapChainVtbl IWineGDISwapChain_Vtbl DECLSPEC_HIDDEN;
@@ -2580,7 +2574,7 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetRasterStatus(IWineD3DSwapChain *ifac
HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetDisplayMode(IWineD3DSwapChain *iface,
WINED3DDISPLAYMODE *pMode) DECLSPEC_HIDDEN;
HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetDevice(IWineD3DSwapChain *iface,
- IWineD3DDevice **ppDevice) DECLSPEC_HIDDEN;
+ IWineD3DDevice **device) DECLSPEC_HIDDEN;
HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetPresentParameters(IWineD3DSwapChain *iface,
WINED3DPRESENT_PARAMETERS *pPresentationParameters) DECLSPEC_HIDDEN;
HRESULT WINAPI IWineD3DBaseSwapChainImpl_SetGammaRamp(IWineD3DSwapChain *iface,
@@ -2624,6 +2618,9 @@ const char *debug_d3dtop(WINED3DTEXTUREOP d3dtop) DECLSPEC_HIDDEN;
void dump_color_fixup_desc(struct color_fixup_desc fixup) DECLSPEC_HIDDEN;
const char *debug_surflocation(DWORD flag) DECLSPEC_HIDDEN;
+/* Color conversion routines */
+DWORD color_convert_argb_to_fmt(DWORD color, WINED3DFORMAT destfmt) DECLSPEC_HIDDEN;
+
/* Routines for GL <-> D3D values */
GLenum StencilOp(DWORD op) DECLSPEC_HIDDEN;
GLenum CompareFunc(DWORD func) DECLSPEC_HIDDEN;
@@ -2650,18 +2647,19 @@ void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock,
void state_fog_fragpart(DWORD state, IWineD3DStateBlockImpl *stateblock,
struct wined3d_context *context) DECLSPEC_HIDDEN;
-void surface_add_dirty_rect(IWineD3DSurface *iface, const RECT *dirty_rect) DECLSPEC_HIDDEN;
-GLenum surface_get_gl_buffer(IWineD3DSurface *iface) DECLSPEC_HIDDEN;
-void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN;
-void surface_modify_ds_location(IWineD3DSurface *iface, DWORD location) DECLSPEC_HIDDEN;
-void surface_set_compatible_renderbuffer(IWineD3DSurface *iface,
+void surface_add_dirty_rect(IWineD3DSurfaceImpl *surface, const RECT *dirty_rect) DECLSPEC_HIDDEN;
+GLenum surface_get_gl_buffer(IWineD3DSurfaceImpl *surface) DECLSPEC_HIDDEN;
+void surface_load_ds_location(IWineD3DSurfaceImpl *surface,
+ struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN;
+void surface_modify_ds_location(IWineD3DSurfaceImpl *surface, DWORD location, UINT w, UINT h) DECLSPEC_HIDDEN;
+void surface_set_compatible_renderbuffer(IWineD3DSurfaceImpl *surface,
unsigned int width, unsigned int height) DECLSPEC_HIDDEN;
-void surface_set_texture_name(IWineD3DSurface *iface, GLuint name, BOOL srgb_name) DECLSPEC_HIDDEN;
-void surface_set_texture_target(IWineD3DSurface *iface, GLenum target) DECLSPEC_HIDDEN;
+void surface_set_texture_name(IWineD3DSurfaceImpl *surface, GLuint name, BOOL srgb_name) DECLSPEC_HIDDEN;
+void surface_set_texture_target(IWineD3DSurfaceImpl *surface, GLenum target) DECLSPEC_HIDDEN;
-BOOL getColorBits(const struct GlPixelFormatDesc *format_desc,
+BOOL getColorBits(const struct wined3d_format_desc *format_desc,
short *redSize, short *greenSize, short *blueSize, short *alphaSize, short *totalSize) DECLSPEC_HIDDEN;
-BOOL getDepthStencilBits(const struct GlPixelFormatDesc *format_desc,
+BOOL getDepthStencilBits(const struct wined3d_format_desc *format_desc,
short *depthSize, short *stencilSize) DECLSPEC_HIDDEN;
/* Math utils */
@@ -2941,8 +2939,8 @@ struct IWineD3DPaletteImpl {
DWORD Flags;
};
-extern const IWineD3DPaletteVtbl IWineD3DPalette_Vtbl DECLSPEC_HIDDEN;
-DWORD IWineD3DPaletteImpl_Size(DWORD dwFlags) DECLSPEC_HIDDEN;
+HRESULT wined3d_palette_init(IWineD3DPaletteImpl *palette, IWineD3DDeviceImpl *device,
+ DWORD flags, const PALETTEENTRY *entries, IUnknown *parent) DECLSPEC_HIDDEN;
/* DirectDraw utility functions */
extern WINED3DFORMAT pixelformat_for_depth(DWORD depth) DECLSPEC_HIDDEN;
@@ -2952,17 +2950,23 @@ extern WINED3DFORMAT pixelformat_for_depth(DWORD depth) DECLSPEC_HIDDEN;
*/
/* WineD3D pixel format flags */
-#define WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING 0x1
-#define WINED3DFMT_FLAG_FILTERING 0x2
-#define WINED3DFMT_FLAG_DEPTH 0x4
-#define WINED3DFMT_FLAG_STENCIL 0x8
-#define WINED3DFMT_FLAG_RENDERTARGET 0x10
-#define WINED3DFMT_FLAG_FOURCC 0x20
-#define WINED3DFMT_FLAG_FBO_ATTACHABLE 0x40
-#define WINED3DFMT_FLAG_COMPRESSED 0x80
-#define WINED3DFMT_FLAG_GETDC 0x100
+#define WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING 0x00000001
+#define WINED3DFMT_FLAG_FILTERING 0x00000002
+#define WINED3DFMT_FLAG_DEPTH 0x00000004
+#define WINED3DFMT_FLAG_STENCIL 0x00000008
+#define WINED3DFMT_FLAG_RENDERTARGET 0x00000010
+#define WINED3DFMT_FLAG_FOURCC 0x00000020
+#define WINED3DFMT_FLAG_FBO_ATTACHABLE 0x00000040
+#define WINED3DFMT_FLAG_COMPRESSED 0x00000080
+#define WINED3DFMT_FLAG_GETDC 0x00000100
+#define WINED3DFMT_FLAG_FLOAT 0x00000200
+#define WINED3DFMT_FLAG_BUMPMAP 0x00000400
+#define WINED3DFMT_FLAG_SRGB_READ 0x00000800
+#define WINED3DFMT_FLAG_SRGB_WRITE 0x00001000
+#define WINED3DFMT_FLAG_VTF 0x00002000
+#define WINED3DFMT_FLAG_SHADOW 0x00004000
-struct GlPixelFormatDesc
+struct wined3d_format_desc
{
WINED3DFORMAT format;
DWORD red_mask;
@@ -2989,12 +2993,14 @@ struct GlPixelFormatDesc
GLint rtInternal;
GLint glFormat;
GLint glType;
+ UINT conv_byte_count;
unsigned int Flags;
float heightscale;
struct color_fixup_desc color_fixup;
+ void (*convert)(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height);
};
-const struct GlPixelFormatDesc *getFormatDescEntry(WINED3DFORMAT fmt,
+const struct wined3d_format_desc *getFormatDescEntry(WINED3DFORMAT fmt,
const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
static inline BOOL use_vs(IWineD3DStateBlockImpl *stateblock)
@@ -3013,9 +3019,9 @@ static inline BOOL use_ps(IWineD3DStateBlockImpl *stateblock)
return (stateblock->pixelShader && stateblock->device->ps_selected_mode != SHADER_NONE);
}
-void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface,
- WINED3DRECT *src_rect, IWineD3DSurface *dst_surface, WINED3DRECT *dst_rect,
- const WINED3DTEXTUREFILTERTYPE filter, BOOL flip) DECLSPEC_HIDDEN;
+void stretch_rect_fbo(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *src_surface,
+ const RECT *src_rect, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect,
+ const WINED3DTEXTUREFILTERTYPE filter) DECLSPEC_HIDDEN;
/* The WNDCLASS-Name for the fake window which we use to retrieve the GL capabilities */
#define WINED3D_OPENGL_WINDOW_CLASS_NAME "WineD3D_OpenGL"
@@ -3024,4 +3030,6 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface,
((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
+#define MAKEDWORD_VERSION(maj, min) (((maj & 0xffff) << 16) | (min & 0xffff))
+
#endif
diff --git a/dll/keyboard/kbdlv/kbdlv.c b/dll/keyboard/kbdlv/kbdlv.c
index d2befa16a2e..a9954371b5d 100644
--- a/dll/keyboard/kbdlv/kbdlv.c
+++ b/dll/keyboard/kbdlv/kbdlv.c
@@ -1,7 +1,7 @@
/*
- * ReactOS Latvian Keyboard layout
+ * ReactOS latvian Keyboard layout
* Copyright (C) 2008 ReactOS
- * Author: Dmitry Chapyshev
+ * Author: Dmitry Chapyshev, Arthurs B.
* License: LGPL, see: LGPL.txt
*
* Thanks to: http://www.barcodeman.com/altek/mule/scandoc.php
@@ -33,8 +33,6 @@
#define KNUMS 0xc00 /* Special + number pad */
#define KMEXT 0x300 /* Multi + ext */
-#define SHFT_INVALID 0x0F
-
ROSDATA USHORT scancode_to_vk[] = {
/* Numbers Row */
/* - 00 - */
@@ -60,10 +58,10 @@ ROSDATA USHORT scancode_to_vk[] = {
/* Third letters row */
'Z', 'X', 'C', 'V',
'B', 'N', 'M', VK_OEM_COMMA,
- VK_OEM_PERIOD,VK_OEM_2, VK_RSHIFT | KEXT,
+ VK_OEM_PERIOD,VK_OEM_2, VK_RSHIFT,
/* - 37 - */
/* Bottom Row */
- 0x26a, VK_LMENU, VK_SPACE, VK_CAPITAL,
+ VK_MULTIPLY, VK_LMENU, VK_SPACE, VK_CAPITAL,
/* - 3b - */
/* F-Keys */
@@ -86,8 +84,8 @@ ROSDATA USHORT scancode_to_vk[] = {
/* Oddities, and the remaining standard F-Keys */
VK_EMPTY, VK_OEM_102, VK_F11, VK_F12,
/* - 59 - */
- VK_CLEAR, VK_OEM_WSCTRL,VK_OEM_FINISH,VK_OEM_JUMP, VK_EREOF, /* EREOF */
- VK_OEM_BACKTAB, VK_OEM_AUTO, VK_EMPTY, VK_ZOOM, /* ZOOM */
+ VK_CLEAR, VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, /* EREOF */
+ VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, /* ZOOM */
VK_HELP,
/* - 64 - */
/* Even more F-Keys (for example, NCR keyboards from the early 90's) */
@@ -95,64 +93,25 @@ ROSDATA USHORT scancode_to_vk[] = {
VK_F21, VK_F22, VK_F23,
/* - 6f - */
/* Not sure who uses these codes */
- VK_OEM_PA3, VK_EMPTY, VK_OEM_RESET,
+ VK_EMPTY, VK_EMPTY, VK_EMPTY,
/* - 72 - */
- VK_EMPTY, 0xc1, VK_EMPTY, VK_EMPTY,
+ VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY,
/* - 76 - */
/* One more f-key */
VK_F24,
/* - 77 - */
VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY,
- VK_OEM_PA1, VK_TAB, 0xc2, 0, /* PA1 */
- 0,
+ VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, /* PA1 */
+ VK_EMPTY,
/* - 80 - */
0
};
ROSDATA VSC_VK extcode0_to_vk[] = {
- { 0x10, VK_MEDIA_PREV_TRACK | KEXT },
- { 0x19, VK_MEDIA_NEXT_TRACK | KEXT },
- { 0x1D, VK_RCONTROL | KEXT },
- { 0x20, VK_VOLUME_MUTE | KEXT },
- { 0x21, VK_LAUNCH_APP2 | KEXT },
- { 0x22, VK_MEDIA_PLAY_PAUSE | KEXT },
- { 0x24, VK_MEDIA_STOP | KEXT },
- { 0x2E, VK_VOLUME_DOWN | KEXT },
- { 0x30, VK_VOLUME_UP | KEXT },
- { 0x32, VK_BROWSER_HOME | KEXT },
- { 0x35, VK_DIVIDE | KEXT },
- { 0x37, VK_SNAPSHOT | KEXT },
- { 0x38, VK_RMENU | KEXT },
- { 0x47, VK_HOME | KEXT },
- { 0x48, VK_UP | KEXT },
- { 0x49, VK_PRIOR | KEXT },
- { 0x4B, VK_LEFT | KEXT },
- { 0x4D, VK_RIGHT | KEXT },
- { 0x4F, VK_END | KEXT },
- { 0x50, VK_DOWN | KEXT },
- { 0x51, VK_NEXT | KEXT },
- { 0x52, VK_INSERT | KEXT },
- { 0x53, VK_DELETE | KEXT },
- { 0x5B, VK_LWIN | KEXT },
- { 0x5C, VK_RWIN | KEXT },
- { 0x5D, VK_APPS | KEXT },
- { 0x5F, VK_SLEEP | KEXT },
- { 0x65, VK_BROWSER_SEARCH | KEXT },
- { 0x66, VK_BROWSER_FAVORITES | KEXT },
- { 0x67, VK_BROWSER_REFRESH | KEXT },
- { 0x68, VK_BROWSER_STOP | KEXT },
- { 0x69, VK_BROWSER_FORWARD | KEXT },
- { 0x6A, VK_BROWSER_BACK | KEXT },
- { 0x6B, VK_LAUNCH_APP1 | KEXT },
- { 0x6C, VK_LAUNCH_MAIL | KEXT },
- { 0x6D, VK_LAUNCH_MEDIA_SELECT | KEXT },
- { 0x1C, VK_RETURN | KEXT },
- { 0x46, VK_CANCEL | KEXT },
{ 0, 0 },
};
ROSDATA VSC_VK extcode1_to_vk[] = {
- { 0x1d, VK_PAUSE},
{ 0, 0 },
};
@@ -165,91 +124,93 @@ ROSDATA VK_TO_BIT modifier_keys[] = {
ROSDATA MODIFIERS modifier_bits = {
modifier_keys,
- 7,
- { 0, 1, 4, 5, SHFT_INVALID, SHFT_INVALID, 2, 3 }
+ 3,
+ { 0, 1, 2, 3 } /* Modifier bit order, NONE, SHIFT, CTRL, ALT */
};
#define NOCAPS 0
#define CAPS KSHIFT /* Caps -> shift */
ROSDATA VK_TO_WCHARS2 key_to_chars_2mod[] = {
- { VK_OEM_3, NOCAPS, {0x00ad, '?' } },
- { '9', NOCAPS, {'9', '(' } },
- { '0', NOCAPS, {'0', ')' } },
- { 'J', CAPS, {'j', 'J' } },
- { 'N', CAPS, {'n', 'N' } },
- { 'Z', CAPS, {'z', 'Z' } },
- { 'W', CAPS, {0x0113, 0x0112} },
- { 'X', CAPS, {0x010d, 0x010c} },
- { VK_OEM_1, CAPS, {0x0161, 0x0160} },
- { 'U', CAPS, {'u', 'U' } },
- { 'S', CAPS, {'s', 'S' } },
- { 'I', CAPS, {'i', 'I' } },
- { 'L', CAPS, {'l', 'L' } },
- { 'D', CAPS, {'d', 'D' } },
- { 'A', CAPS, {'a', 'A' } },
- { 'T', CAPS, {'t', 'T' } },
- { 'C', CAPS, {'c', 'C' } },
- { 'P', CAPS, {'p', 'P' } },
- { VK_OEM_8, CAPS, {0x0101, 0x0100} },
- { VK_OEM_2, CAPS, {0x013c, 0x013b} },
- { VK_DECIMAL, NOCAPS, {',', ',' } },
- { VK_TAB, NOCAPS, {'\t', '\t' } },
- { VK_ADD, NOCAPS, {'+', '+' } },
- { VK_DIVIDE, NOCAPS, {'/', '/' } },
- { VK_MULTIPLY, NOCAPS, {'*', '*' } },
- { VK_SUBTRACT, NOCAPS, {'-', '-' } },
+ /* Normal vs Shifted */
+ /* The numbers */
+ { '1', NOCAPS, {'1', '!'} },
+ /* Ctrl-2 generates NUL */
+ { '3', NOCAPS, {'3', '#'} },
+ { '4', NOCAPS, {'4', '$'} },
+ { '5', NOCAPS, {'5', '%'} },
+ /* Ctrl-6 generates RS */
+ { '7', NOCAPS, {'7', '&'} },
+ { '8', NOCAPS, {'8', '*'} },
+ { '9', NOCAPS, {'9', '('} },
+ { '0', NOCAPS, {'0', ')'} },
+
+ /* Specials */
+ /* Ctrl-_ generates US */
+ { VK_OEM_PLUS ,NOCAPS, {'=', '+'} },
+ { VK_OEM_1 ,NOCAPS, {';', ':'} },
+ { VK_OEM_7 ,NOCAPS, {'\'','\"'} },
+ { VK_OEM_3 ,NOCAPS, {'`', '~'} },
+ { VK_OEM_COMMA ,NOCAPS, {',', '<'} },
+ { VK_OEM_PERIOD ,NOCAPS, {'.', '>'} },
+ { VK_OEM_2 ,NOCAPS, {'/', '?'} },
+ /* Keys that do not have shift states */
+ { VK_TAB ,NOCAPS, {'\t','\t'} },
+ { VK_ADD ,NOCAPS, {'+', '+'} },
+ { VK_SUBTRACT,NOCAPS, {'-', '-'} },
+ { VK_MULTIPLY,NOCAPS, {'*', '*'} },
+ { VK_DIVIDE ,NOCAPS, {'/', '/'} },
+ { VK_ESCAPE ,NOCAPS, {'\x1b','\x1b'} },
+ { VK_SPACE ,NOCAPS, {' ', ' '} },
{ 0, 0 }
};
ROSDATA VK_TO_WCHARS3 key_to_chars_3mod[] = {
- { '1', NOCAPS, {'1', '!', 0x00ab} },
- { '8', NOCAPS, {'8', 0x00d7, ':' } },
- { 'E', CAPS, {'e', 'E', 0x20ac} },
- { VK_OEM_COMMA, NOCAPS, {',', ';', '<' } },
- { VK_OEM_PERIOD, NOCAPS, {'.', ':', '>' } },
- { 0, 0 }
+ /* Normal, Shifted, Ctrl */
+ /* Legacy (telnet-style) ascii escapes */
+ { VK_OEM_4, 0, {'[', '{', 0x1b /* ESC */} },
+ { VK_OEM_6, 0, {']', '}', 0x1d /* GS */} },
+ { VK_OEM_5, 0, {'\\','|', 0x1c /* FS */} },
+ { VK_OEM_102,0,{'\\','|', 0x1c /* FS */} },
+ { VK_RETURN,0, {'\r', '\r', '\n'} },
+ { 0,0 }
};
ROSDATA VK_TO_WCHARS4 key_to_chars_4mod[] = {
- { '2', NOCAPS, {'2', 0x00ab, WCH_NONE, '@' } },
- { '3', NOCAPS, {'3', 0x00bb, WCH_NONE, '#' } },
- { '4', NOCAPS, {'4', '$', 0x20ac, '$' } },
- { '5', NOCAPS, {'5', '%', '\"', WCH_DEAD} },
- { 0xff, NOCAPS, {WCH_NONE, WCH_NONE, WCH_NONE, '~' } },
- { '7', NOCAPS, {'7', '&', WCH_NONE, 0x00b1 } },
- { 'F', CAPS, {'f', 'F', '=', ';' } },
- { 'Q', CAPS, {0x016b, 0x016a, 'q', 'Q' } },
- { 'G', CAPS, {'g', 'G', 0x0123, 0x0122 } },
- { 'R', CAPS, {'r', 'R', 0x0157, 0x0156 } },
- { 'M', CAPS, {'m', 'M', 'w', 'W' } },
- { 'V', CAPS, {'v', 'V', 'y', 'Y' } },
- { 'Y', CAPS, {0x017e, 0x017d, '[', '{' } },
- { 'H', CAPS, {'h', 'H', ']', '}' } },
- { VK_OEM_7, NOCAPS, {WCH_DEAD, WCH_DEAD, WCH_DEAD, WCH_DEAD} },
- { 0xff, NOCAPS, {0x00b4, 0x00b0, 0x00b4, 0x00a8 } },
- { 'B', CAPS, {'b', 'B', 'x', 'X' } },
- { 'K', CAPS, {'k', 'K', 0x0137, 0x0136 } },
- { 'O', CAPS, {'o', 'O', 0x00f5, 0x00d5 } },
- { 0, 0 }
-};
+ /* Normal, Shifted, Ctrl, C-S-x */
-ROSDATA VK_TO_WCHARS5 key_to_chars_5mod[] = {
- { VK_OEM_5, CAPS, {0x0137, 0x0136, WCH_NONE, WCH_NONE, 0x001c} },
- { VK_OEM_4, CAPS, {0x0146, 0x0145, WCH_NONE, WCH_NONE, 0x001b} },
- { VK_OEM_6, CAPS, {0x012b, 0x012a, WCH_NONE, WCH_NONE, 0x001d} },
- { VK_OEM_102, CAPS, {0x0123, 0x0122, '\\', '|', 0x001c} },
- { VK_BACK, NOCAPS, {'\b', '\b', WCH_NONE, WCH_NONE, 0x007f} },
- { VK_ESCAPE, NOCAPS, {0x001b, 0x001b, WCH_NONE, WCH_NONE, 0x001b} },
- { VK_RETURN, NOCAPS, {'\r', '\r', WCH_NONE, WCH_NONE, '\n' } },
- { VK_SPACE, NOCAPS, {' ', ' ', WCH_NONE, WCH_NONE, ' ' } },
- { VK_CANCEL, NOCAPS, {0x0003, 0x0003, WCH_NONE, WCH_NONE, 0x0003} },
- { 0, 0 }
-};
+ /* The alphabet */
+ { 'A', CAPS, {'a', 'A', 0x101, 0x100} },
+ { 'B', CAPS, {'b', 'B', 0x02, 0x02} },
+ { 'C', CAPS, {'c', 'C', 0x10d, 0x10c} },
+ { 'D', CAPS, {'d', 'D', 0x04, 0x04} },
+ { 'E', CAPS, {'e', 'E', 0x113, 0x112} },
+ { 'F', CAPS, {'f', 'F', 0x06, 0x06} },
+ { 'G', CAPS, {'g', 'G', 0x123, 0x122} },
+ { 'H', CAPS, {'h', 'H', 0x08, 0x08} },
+ { 'I', CAPS, {'i', 'I', 0x12b, 0x12a} },
+ { 'J', CAPS, {'j', 'J', 0x0a, 0x0a} },
+ { 'K', CAPS, {'k', 'K', 0x137, 0x136} },
+ { 'L', CAPS, {'l', 'L', 0x13c, 0x13b} },
+ { 'M', CAPS, {'m', 'M', 0x0d, 0x0d} },
+ { 'N', CAPS, {'n', 'N', 0x146, 0x145} },
+ { 'O', CAPS, {'o', 'O', 0x0f, 0x0f} },
+ { 'P', CAPS, {'p', 'P', 0x10, 0x10} },
+ { 'Q', CAPS, {'q', 'Q', 0x11, 0x11} },
+ { 'R', CAPS, {'r', 'R', 0x12, 0x12} },
+ { 'S', CAPS, {'s', 'S', 0x161, 0x160} },
+ { 'T', CAPS, {'t', 'T', 0x14, 0x14} },
+ { 'U', CAPS, {'u', 'U', 0x16b, 0x16a} },
+ { 'V', CAPS, {'v', 'V', 0x16, 0x16} },
+ { 'W', CAPS, {'w', 'W', 0x17, 0x17} },
+ { 'X', CAPS, {'x', 'X', 0x18, 0x18} },
+ { 'Y', CAPS, {'y', 'Y', 0x19, 0x19} },
+ { 'Z', CAPS, {'z', 'Z', 0x17e, 0x17d} },
-ROSDATA VK_TO_WCHARS6 key_to_chars_6mod[] = {
- { '6', NOCAPS, {'6', '/', 0x2019, '^', WCH_NONE, 0x001e} },
- { VK_OEM_MINUS, NOCAPS, {'-', '_', 0x2013, 0x2014, WCH_NONE, 0x001f} },
+ /* Legacy Ascii generators */
+ { '2', NOCAPS, {'2', '@', WCH_NONE, 0} },
+ { '6', NOCAPS, {'6', '^', WCH_NONE, 0x1e /* RS */} },
+ { VK_OEM_MINUS, NOCAPS, {'-', '_', WCH_NONE, 0x1f /* US */} },
{ 0, 0 }
};
@@ -264,22 +225,23 @@ ROSDATA VK_TO_WCHARS1 keypad_numbers[] = {
{ VK_NUMPAD7, 0, {'7'} },
{ VK_NUMPAD8, 0, {'8'} },
{ VK_NUMPAD9, 0, {'9'} },
- { 0, 0 }
+ { VK_DECIMAL, 0, {'.'} },
+ { VK_BACK, 0, {'\010'} },
+ { 0,0 }
};
#define vk_master(n,x) { (PVK_TO_WCHARS1)x, n, sizeof(x[0]) }
ROSDATA VK_TO_WCHAR_TABLE vk_to_wchar_master_table[] = {
+ vk_master(1,keypad_numbers),
+ vk_master(2,key_to_chars_2mod),
vk_master(3,key_to_chars_3mod),
vk_master(4,key_to_chars_4mod),
- vk_master(5,key_to_chars_5mod),
- vk_master(6,key_to_chars_6mod),
- vk_master(2,key_to_chars_2mod),
- vk_master(1,keypad_numbers),
{ 0,0,0 }
};
ROSDATA VSC_LPWSTR key_names[] = {
+ { 0x00, L"" },
{ 0x01, L"Esc" },
{ 0x0e, L"Backspace" },
{ 0x0f, L"Tab" },
@@ -331,12 +293,12 @@ ROSDATA VSC_LPWSTR key_names[] = {
{ 0x85, L"F22" },
{ 0x86, L"F23" },
{ 0x87, L"F24" },
- { 0, NULL }
+ { 0, NULL },
};
ROSDATA VSC_LPWSTR extended_key_names[] = {
{ 0x1c, L"Num Enter" },
- { 0x1d, L"Right Control" },
+ { 0x1d, L"Right Ctrl" },
{ 0x35, L"Num /" },
{ 0x37, L"Prnt Scrn" },
{ 0x38, L"Right Alt" },
@@ -345,7 +307,8 @@ ROSDATA VSC_LPWSTR extended_key_names[] = {
{ 0x47, L"Home" },
{ 0x48, L"Up" },
{ 0x49, L"Page Up" },
- { 0x4b, L"Left" },
+ { 0x4a, L"Left" },
+ { 0x4c, L"Center" },
{ 0x4d, L"Right" },
{ 0x4f, L"End" },
{ 0x50, L"Down" },
@@ -353,60 +316,10 @@ ROSDATA VSC_LPWSTR extended_key_names[] = {
{ 0x52, L"Insert" },
{ 0x53, L"Delete" },
{ 0x54, L"" },
- { 0x56, L"Help" },
- { 0x5b, L"Left " },
- { 0x5c, L"Right " },
- { 0x5d, L"Application" },
- { 0, NULL }
-};
-
-ROSDATA DEADKEY_LPWSTR dead_key_names[] = {
- L"\x00b4" L"ACUTE",
- L"\x00a8" L"DIAERESIS",
- L"\x00b0" L"RING",
- L"~" L"TILDE",
- NULL
-};
-
-#define DEADTRANS(ch, accent, comp, flags) MAKELONG(ch, accent), comp, flags
-
-ROSDATA DEADKEY dead_key[] = {
- { DEADTRANS(L'n', 0x00b4, 0x0144, 0x0000) },
- { DEADTRANS(L'c', 0x00b4, 0x0107, 0x0000) },
- { DEADTRANS(L'o', 0x00b4, 0x00f3, 0x0000) },
- { DEADTRANS(L'e', 0x00b4, 0x00e9, 0x0000) },
- { DEADTRANS(L's', 0x00b4, 0x015b, 0x0000) },
- { DEADTRANS(L'z', 0x00b4, 0x017a, 0x0000) },
- { DEADTRANS(L'N', 0x00b4, 0x0143, 0x0000) },
- { DEADTRANS(L'C', 0x00b4, 0x0106, 0x0000) },
- { DEADTRANS(L'O', 0x00b4, 0x00d3, 0x0000) },
- { DEADTRANS(L'E', 0x00b4, 0x00c9, 0x0000) },
- { DEADTRANS(L'S', 0x00b4, 0x015a, 0x0000) },
- { DEADTRANS(L'Z', 0x00b4, 0x0179, 0x0000) },
- { DEADTRANS(L' ', 0x00b4, 0x00b4, 0x0000) },
-
- { DEADTRANS(L'a', 0x00a8, 0x00e4, 0x0000) },
- { DEADTRANS(L'u', 0x00a8, 0x00fc, 0x0000) },
- { DEADTRANS(L'o', 0x00a8, 0x00f6, 0x0000) },
- { DEADTRANS(L'A', 0x00a8, 0x00c4, 0x0000) },
- { DEADTRANS(L'U', 0x00a8, 0x00dc, 0x0000) },
- { DEADTRANS(L'O', 0x00a8, 0x00d6, 0x0000) },
- { DEADTRANS(L' ', 0x00a8, 0x00a8, 0x0000) },
-
- { DEADTRANS(L'a', 0x00b0, 0x00e5, 0x0000) },
- { DEADTRANS(L'A', 0x00b0, 0x00c5, 0x0000) },
- { DEADTRANS(L'e', 0x00b0, 0x0117, 0x0000) },
- { DEADTRANS(L'E', 0x00b0, 0x0116, 0x0000) },
- { DEADTRANS(L'z', 0x00b0, 0x017c, 0x0000) },
- { DEADTRANS(L'Z', 0x00b0, 0x017b, 0x0000) },
- { DEADTRANS(L'g', 0x00b0, 0x0121, 0x0000) },
- { DEADTRANS(L' ', 0x00b0, 0x00b0, 0x0000) },
-
- { DEADTRANS(L'o', L'~', 0x00f5, 0x0000) },
- { DEADTRANS(L'O', L'~', 0x00d5, 0x0000) },
- { DEADTRANS(L' ', L'~', L'~', 0x0000) },
-
- {0, 0}
+ { 0x55, L"Help" },
+ { 0x56, L"Left Windows" },
+ { 0x5b, L"Right Windows" },
+ { 0, NULL },
};
/* Finally, the master table */
@@ -417,13 +330,13 @@ ROSDATA KBDTABLES keyboard_layout_table = {
/* character from vk tables */
vk_to_wchar_master_table,
- /* diacritical marks */
- dead_key,
+ /* diacritical marks -- currently implemented by wine code */
+ NULL,
/* Key names */
(VSC_LPWSTR *)key_names,
(VSC_LPWSTR *)extended_key_names,
- dead_key_names, /* Dead key names */
+ NULL, /* Dead key names */
/* scan code to virtual key maps */
scancode_to_vk,
@@ -431,9 +344,9 @@ ROSDATA KBDTABLES keyboard_layout_table = {
extcode0_to_vk,
extcode1_to_vk,
- MAKELONG(1,1), /* Version 1.0 */
+ MAKELONG(0,1), /* Version 1.0 */
- /* Ligatures */
+ /* Ligatures -- Latvian doesn't have any */
0,
0,
NULL
@@ -443,12 +356,3 @@ PKBDTABLES WINAPI KbdLayerDescriptor(VOID) {
return &keyboard_layout_table;
}
-INT WINAPI
-DllMain(
- PVOID hinstDll,
- ULONG dwReason,
- PVOID reserved)
-{
- return 1;
-}
-
diff --git a/dll/shellext/slayer/lang/cs-CZ.rc b/dll/shellext/slayer/lang/cs-CZ.rc
index 063bad46de8..13eed0328fe 100644
--- a/dll/shellext/slayer/lang/cs-CZ.rc
+++ b/dll/shellext/slayer/lang/cs-CZ.rc
@@ -1,6 +1,6 @@
/* FILE: dll/shellext/slayer/lang/cs-CZ.rc
* TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com)
- * UPDATED: 2008-07-27
+ * UPDATED: 2010-05-25
*/
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
@@ -32,7 +32,7 @@ BEGIN
PUSHBUTTON "&Upravit...", IDC_EDIT, 162,24,60,14, WS_DISABLED
PUSHBUTTON "S&mazat", IDC_DELETE, 162,42,60,14, WS_DISABLED
PUSHBUTTON "&OK", IDOK, 95,116,60,14
- PUSHBUTTON "&Storno", IDCANCEL, 162,116,60,14
+ PUSHBUTTON "Storno", IDCANCEL, 162,116,60,14
END
STRINGTABLE
diff --git a/dll/win32/avifil32/avifil32.rbuild b/dll/win32/avifil32/avifil32.rbuild
index 1741f2a481d..da4f495711d 100644
--- a/dll/win32/avifil32/avifil32.rbuild
+++ b/dll/win32/avifil32/avifil32.rbuild
@@ -1,7 +1,7 @@
-
+
.
diff --git a/dll/win32/browseui/internettoolbar.cpp b/dll/win32/browseui/internettoolbar.cpp
index c4f6bd004af..bfad8a5bd9c 100644
--- a/dll/win32/browseui/internettoolbar.cpp
+++ b/dll/win32/browseui/internettoolbar.cpp
@@ -414,10 +414,16 @@ HRESULT STDMETHODCALLTYPE CMenuCallback::CallbackSM(LPSMDATA psmd, UINT uMsg, WP
{
SMINFO *infoPtr = (SMINFO *)lParam;
if ((infoPtr->dwMask & SMIM_FLAGS) != 0)
+ {
if (psmd->uId == FCIDM_MENU_FAVORITES)
+ {
infoPtr->dwFlags |= SMIF_DROPCASCADE;
- else{
- infoPtr->dwFlags |= SMIF_TRACKPOPUP;}
+ }
+ else
+ {
+ infoPtr->dwFlags |= SMIF_TRACKPOPUP;
+ }
+ }
if ((infoPtr->dwMask & SMIM_ICON) != 0)
infoPtr->iIcon = -1;
}
@@ -1213,7 +1219,7 @@ LRESULT CInternetToolbar::OnSearch(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOO
CComPtr objectWithSite;
CComPtr contextMenu;
CMINVOKECOMMANDINFO commandInfo;
- char *searchGUID = "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
+ const char *searchGUID = "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
HRESULT hResult;
// TODO: Query shell if this command is enabled first
diff --git a/dll/win32/browseui/shellbrowser.cpp b/dll/win32/browseui/shellbrowser.cpp
index 3a27a1137d8..50e00d656cb 100644
--- a/dll/win32/browseui/shellbrowser.cpp
+++ b/dll/win32/browseui/shellbrowser.cpp
@@ -282,7 +282,7 @@ void CToolbarProxy::Initialize(HWND parent, IUnknown *explorerToolbar)
LRESULT CToolbarProxy::OnAddBitmap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
- LRESULT result;
+ long int result;
HRESULT hResult;
result = 0;
diff --git a/dll/win32/comctl32/comctl32.rbuild b/dll/win32/comctl32/comctl32.rbuild
index 3cc1ce2c0ad..150241f9440 100644
--- a/dll/win32/comctl32/comctl32.rbuild
+++ b/dll/win32/comctl32/comctl32.rbuild
@@ -1,7 +1,7 @@
-
+
.
diff --git a/dll/win32/comctl32/listview.c b/dll/win32/comctl32/listview.c
index 1c0f58bbd69..4e13577b48f 100644
--- a/dll/win32/comctl32/listview.c
+++ b/dll/win32/comctl32/listview.c
@@ -7,6 +7,7 @@
* Copyright 2001 CodeWeavers Inc.
* Copyright 2002 Dimitrie O. Paun
* Copyright 2009 Nikolay Sivov
+ * Copyright 2009 Owen Rudge for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -73,7 +74,6 @@
*
* States
* -- LVIS_ACTIVATING (not currently supported by comctl32.dll version 6.0)
- * -- LVIS_CUT
* -- LVIS_DROPHILITED
* -- LVIS_OVERLAYMASK
*
@@ -98,9 +98,7 @@
* -- LVN_BEGINSCROLL, LVN_ENDSCROLL
* -- LVN_GETINFOTIP
* -- LVN_HOTTRACK
- * -- LVN_MARQUEEBEGIN
* -- LVN_SETDISPINFO
- * -- NM_HOVER
* -- LVN_BEGINRDRAG
*
* Messages:
@@ -170,9 +168,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(listview);
-/* make sure you set this to 0 for production use! */
-#define DEBUG_RANGES 1
-
typedef struct tagCOLUMN_INFO
{
RECT rcHeader; /* tracks the header's rectangle */
@@ -237,81 +232,120 @@ typedef struct tagDELAYED_ITEM_EDIT
typedef struct tagLISTVIEW_INFO
{
+ /* control window */
HWND hwndSelf;
- HBRUSH hBkBrush;
- COLORREF clrBk;
- COLORREF clrText;
- COLORREF clrTextBk;
- HIMAGELIST himlNormal;
- HIMAGELIST himlSmall;
- HIMAGELIST himlState;
- BOOL bLButtonDown;
- BOOL bRButtonDown;
- BOOL bDragging;
- POINT ptClickPos; /* point where the user clicked */
- BOOL bNoItemMetrics; /* flags if item metrics are not yet computed */
- INT nItemHeight;
- INT nItemWidth;
- RANGES selectionRanges;
- INT nSelectionMark;
- INT nHotItem;
- SHORT notifyFormat;
- HWND hwndNotify;
RECT rcList; /* This rectangle is really the window
* client rectangle possibly reduced by the
* horizontal scroll bar and/or header - see
* LISTVIEW_UpdateSize. This rectangle offset
* by the LISTVIEW_GetOrigin value is in
* client coordinates */
- SIZE iconSize;
- SIZE iconSpacing;
- SIZE iconStateSize;
- UINT uCallbackMask;
- HWND hwndHeader;
- HCURSOR hHotCursor;
- HFONT hDefaultFont;
- HFONT hFont;
- INT ntmHeight; /* Some cached metrics of the font used */
- INT ntmMaxCharWidth; /* by the listview to draw items */
- INT nEllipsisWidth;
- BOOL bRedraw; /* Turns on/off repaints & invalidations */
- BOOL bAutoarrange; /* Autoarrange flag when NOT in LVS_AUTOARRANGE */
- BOOL bFocus;
+
+ /* notification window */
+ SHORT notifyFormat;
+ HWND hwndNotify;
BOOL bDoChangeNotify; /* send change notification messages? */
- INT nFocusedItem;
- RECT rcFocus;
- DWORD dwStyle; /* the cached window GWL_STYLE */
- DWORD dwLvExStyle; /* extended listview style */
- DWORD uView; /* current view available through LVM_[G,S]ETVIEW */
+ UINT uCallbackMask;
+
+ /* tooltips */
+ HWND hwndToolTip;
+
+ /* items */
INT nItemCount; /* the number of items in the list */
HDPA hdpaItems; /* array ITEM_INFO pointers */
HDPA hdpaItemIds; /* array of ITEM_ID pointers */
HDPA hdpaPosX; /* maintains the (X, Y) coordinates of the */
HDPA hdpaPosY; /* items in LVS_ICON, and LVS_SMALLICON modes */
+ RANGES selectionRanges;
+ INT nSelectionMark; /* item to start next multiselection from */
+ INT nHotItem;
+ BOOL bAutoarrange; /* Autoarrange flag when NOT in LVS_AUTOARRANGE */
+
+ /* columns */
HDPA hdpaColumns; /* array of COLUMN_INFO pointers */
BOOL colRectsDirty; /* trigger column rectangles requery from header */
- POINT currIconPos; /* this is the position next icon will be placed */
- PFNLVCOMPARE pfnCompare;
+
+ /* item metrics */
+ BOOL bNoItemMetrics; /* flags if item metrics are not yet computed */
+ INT nItemHeight;
+ INT nItemWidth;
+
+ /* sorting */
+ PFNLVCOMPARE pfnCompare; /* sorting callback pointer */
LPARAM lParamSort;
+
+ /* style */
+ DWORD dwStyle; /* the cached window GWL_STYLE */
+ DWORD dwLvExStyle; /* extended listview style */
+ DWORD uView; /* current view available through LVM_[G,S]ETVIEW */
+
+ /* edit item */
HWND hwndEdit;
WNDPROC EditWndProc;
INT nEditLabelItem;
- INT nLButtonDownItem; /* tracks item to reset multiselection on WM_LBUTTONUP */
+ DELAYED_ITEM_EDIT itemEdit; /* Pointer to this structure will be the timer ID */
+
+ /* icons */
+ HIMAGELIST himlNormal;
+ HIMAGELIST himlSmall;
+ HIMAGELIST himlState;
+ SIZE iconSize;
+ SIZE iconSpacing;
+ SIZE iconStateSize;
+ POINT currIconPos; /* this is the position next icon will be placed */
+
+ /* header */
+ HWND hwndHeader;
+ INT xTrackLine; /* The x coefficient of the track line or -1 if none */
+
+ /* marquee selection */
+ BOOL bMarqueeSelect; /* marquee selection/highlight underway */
+ BOOL bScrolling;
+ RECT marqueeRect; /* absolute coordinates of marquee selection */
+ RECT marqueeDrawRect; /* relative coordinates for drawing marquee */
+ POINT marqueeOrigin; /* absolute coordinates of marquee click origin */
+
+ /* focus drawing */
+ BOOL bFocus; /* control has focus */
+ INT nFocusedItem;
+ RECT rcFocus; /* focus bounds */
+
+ /* colors */
+ HBRUSH hBkBrush;
+ COLORREF clrBk;
+ COLORREF clrText;
+ COLORREF clrTextBk;
+
+ /* font */
+ HFONT hDefaultFont;
+ HFONT hFont;
+ INT ntmHeight; /* Some cached metrics of the font used */
+ INT ntmMaxCharWidth; /* by the listview to draw items */
+ INT nEllipsisWidth;
+
+ /* mouse operation */
+ BOOL bLButtonDown;
+ BOOL bRButtonDown;
+ BOOL bDragging;
+ POINT ptClickPos; /* point where the user clicked */
+ INT nLButtonDownItem; /* tracks item to reset multiselection on WM_LBUTTONUP */
DWORD dwHoverTime;
- HWND hwndToolTip;
-
- DWORD cditemmode; /* Keep the custom draw flags for an item/row */
+ HCURSOR hHotCursor;
+ /* keyboard operation */
DWORD lastKeyPressTimestamp;
WPARAM charCode;
INT nSearchParamLength;
WCHAR szSearchParam[ MAX_PATH ];
- BOOL bIsDrawing;
- INT nMeasureItemHeight;
- INT xTrackLine; /* The x coefficient of the track line or -1 if none */
- DELAYED_ITEM_EDIT itemEdit; /* Pointer to this structure will be the timer ID */
- DWORD iVersion; /* CCM_[G,S]ETVERSION */
+ /* painting */
+ DWORD cditemmode; /* Keep the custom draw flags for an item/row */
+ BOOL bIsDrawing; /* Drawing in progress */
+ INT nMeasureItemHeight; /* WM_MEASUREITEM result */
+ BOOL bRedraw; /* WM_SETREDRAW switch */
+
+ /* misc */
+ DWORD iVersion; /* CCM_[G,S]ETVERSION */
} LISTVIEW_INFO;
/*
@@ -414,7 +448,6 @@ static void LISTVIEW_GetItemBox(const LISTVIEW_INFO *, INT, LPRECT);
static void LISTVIEW_GetItemOrigin(const LISTVIEW_INFO *, INT, LPPOINT);
static BOOL LISTVIEW_GetItemPosition(const LISTVIEW_INFO *, INT, LPPOINT);
static BOOL LISTVIEW_GetItemRect(const LISTVIEW_INFO *, INT, LPRECT);
-static INT LISTVIEW_GetLabelWidth(const LISTVIEW_INFO *, INT);
static void LISTVIEW_GetOrigin(const LISTVIEW_INFO *, LPPOINT);
static BOOL LISTVIEW_GetViewRect(const LISTVIEW_INFO *, LPRECT);
static void LISTVIEW_UpdateSize(LISTVIEW_INFO *);
@@ -426,10 +459,10 @@ static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *, INT, const LVITEMW *);
static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *, INT, INT, HWND);
static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *, INT, INT, HWND);
static BOOL LISTVIEW_EnsureVisible(LISTVIEW_INFO *, INT, BOOL);
-static HWND CreateEditLabelT(LISTVIEW_INFO *, LPCWSTR, DWORD, BOOL);
static HIMAGELIST LISTVIEW_SetImageList(LISTVIEW_INFO *, INT, HIMAGELIST);
static INT LISTVIEW_HitTest(const LISTVIEW_INFO *, LPLVHITTESTINFO, BOOL, BOOL);
static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *, BOOL, BOOL);
+static BOOL LISTVIEW_Scroll(LISTVIEW_INFO *, INT, INT);
/******** Text handling functions *************************************/
@@ -716,25 +749,37 @@ static int get_ansi_notification(UINT unicodeNotificationCode)
{
switch (unicodeNotificationCode)
{
+ case LVN_BEGINLABELEDITA:
case LVN_BEGINLABELEDITW: return LVN_BEGINLABELEDITA;
+ case LVN_ENDLABELEDITA:
case LVN_ENDLABELEDITW: return LVN_ENDLABELEDITA;
+ case LVN_GETDISPINFOA:
case LVN_GETDISPINFOW: return LVN_GETDISPINFOA;
+ case LVN_SETDISPINFOA:
case LVN_SETDISPINFOW: return LVN_SETDISPINFOA;
+ case LVN_ODFINDITEMA:
case LVN_ODFINDITEMW: return LVN_ODFINDITEMA;
+ case LVN_GETINFOTIPA:
case LVN_GETINFOTIPW: return LVN_GETINFOTIPA;
/* header forwards */
+ case HDN_TRACKA:
case HDN_TRACKW: return HDN_TRACKA;
+ case HDN_ENDTRACKA:
case HDN_ENDTRACKW: return HDN_ENDTRACKA;
case HDN_BEGINDRAG: return HDN_BEGINDRAG;
case HDN_ENDDRAG: return HDN_ENDDRAG;
+ case HDN_ITEMCHANGINGA:
case HDN_ITEMCHANGINGW: return HDN_ITEMCHANGINGA;
+ case HDN_ITEMCHANGEDA:
case HDN_ITEMCHANGEDW: return HDN_ITEMCHANGEDA;
+ case HDN_ITEMCLICKA:
case HDN_ITEMCLICKW: return HDN_ITEMCLICKA;
+ case HDN_DIVIDERDBLCLICKA:
case HDN_DIVIDERDBLCLICKW: return HDN_DIVIDERDBLCLICKA;
+ default: break;
}
- ERR("unknown notification %x\n", unicodeNotificationCode);
- assert(FALSE);
- return 0;
+ FIXME("unknown notification %x\n", unicodeNotificationCode);
+ return unicodeNotificationCode;
}
/* forwards header notifications to listview parent */
@@ -748,12 +793,12 @@ static LRESULT notify_forward_header(const LISTVIEW_INFO *infoPtr, const NMHEADE
/* on unicode format exit earlier */
if (infoPtr->notifyFormat == NFR_UNICODE)
- return SendMessageW(infoPtr->hwndNotify, WM_NOTIFY,
- (WPARAM)lpnmh->hdr.idFrom, (LPARAM)lpnmh);
+ return SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, lpnmh->hdr.idFrom,
+ (LPARAM)lpnmh);
/* header always supplies unicode notifications,
all we have to do is to convert strings to ANSI */
- nmhA = *(NMHEADERA*)lpnmh;
+ nmhA = *(const NMHEADERA*)lpnmh;
if (lpnmh->pitem)
{
hditema = *(HDITEMA*)lpnmh->pitem;
@@ -778,8 +823,8 @@ static LRESULT notify_forward_header(const LISTVIEW_INFO *infoPtr, const NMHEADE
}
nmhA.hdr.code = get_ansi_notification(lpnmh->hdr.code);
- ret = SendMessageW(infoPtr->hwndNotify, WM_NOTIFY,
- (WPARAM)nmhA.hdr.idFrom, (LPARAM)&nmhA);
+ ret = SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmhA.hdr.idFrom,
+ (LPARAM)&nmhA);
/* cleanup */
Free(text);
@@ -1266,20 +1311,17 @@ static inline BOOL iterator_rangesitems(ITERATOR* i, RANGES ranges)
}
/***
- * Creates an iterator over the items which intersect lprc.
+ * Creates an iterator over the items which intersect frame.
+ * Uses absolute coordinates rather than compensating for the current offset.
*/
-static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, const RECT *lprc)
+static BOOL iterator_frameditems_absolute(ITERATOR* i, const LISTVIEW_INFO* infoPtr, const RECT *frame)
{
- RECT frame = *lprc, rcItem, rcTemp;
- POINT Origin;
+ RECT rcItem, rcTemp;
/* in case we fail, we want to return an empty iterator */
if (!iterator_empty(i)) return FALSE;
- LISTVIEW_GetOrigin(infoPtr, &Origin);
-
- TRACE("(lprc=%s)\n", wine_dbgstr_rect(lprc));
- OffsetRect(&frame, -Origin.x, -Origin.y);
+ TRACE("(frame=%s)\n", wine_dbgstr_rect(frame));
if (infoPtr->uView == LV_VIEW_ICON || infoPtr->uView == LV_VIEW_SMALLICON)
{
@@ -1288,7 +1330,7 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons
if (infoPtr->uView == LV_VIEW_ICON && infoPtr->nFocusedItem != -1)
{
LISTVIEW_GetItemBox(infoPtr, infoPtr->nFocusedItem, &rcItem);
- if (IntersectRect(&rcTemp, &rcItem, lprc))
+ if (IntersectRect(&rcTemp, &rcItem, frame))
i->nSpecial = infoPtr->nFocusedItem;
}
if (!(iterator_rangesitems(i, ranges_create(50)))) return FALSE;
@@ -1300,7 +1342,7 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons
rcItem.top = (LONG_PTR)DPA_GetPtr(infoPtr->hdpaPosY, nItem);
rcItem.right = rcItem.left + infoPtr->nItemWidth;
rcItem.bottom = rcItem.top + infoPtr->nItemHeight;
- if (IntersectRect(&rcTemp, &rcItem, &frame))
+ if (IntersectRect(&rcTemp, &rcItem, frame))
ranges_additem(i->ranges, nItem);
}
return TRUE;
@@ -1309,11 +1351,11 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons
{
RANGE range;
- if (frame.left >= infoPtr->nItemWidth) return TRUE;
- if (frame.top >= infoPtr->nItemHeight * infoPtr->nItemCount) return TRUE;
+ if (frame->left >= infoPtr->nItemWidth) return TRUE;
+ if (frame->top >= infoPtr->nItemHeight * infoPtr->nItemCount) return TRUE;
- range.lower = max(frame.top / infoPtr->nItemHeight, 0);
- range.upper = min((frame.bottom - 1) / infoPtr->nItemHeight, infoPtr->nItemCount - 1) + 1;
+ range.lower = max(frame->top / infoPtr->nItemHeight, 0);
+ range.upper = min((frame->bottom - 1) / infoPtr->nItemHeight, infoPtr->nItemCount - 1) + 1;
if (range.upper <= range.lower) return TRUE;
if (!iterator_rangeitems(i, range)) return FALSE;
TRACE(" report=%s\n", debugrange(&i->range));
@@ -1321,8 +1363,8 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons
else
{
INT nPerCol = max((infoPtr->rcList.bottom - infoPtr->rcList.top) / infoPtr->nItemHeight, 1);
- INT nFirstRow = max(frame.top / infoPtr->nItemHeight, 0);
- INT nLastRow = min((frame.bottom - 1) / infoPtr->nItemHeight, nPerCol - 1);
+ INT nFirstRow = max(frame->top / infoPtr->nItemHeight, 0);
+ INT nLastRow = min((frame->bottom - 1) / infoPtr->nItemHeight, nPerCol - 1);
INT nFirstCol;
INT nLastCol;
INT lower;
@@ -1331,13 +1373,13 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons
if (infoPtr->nItemWidth)
{
- nFirstCol = max(frame.left / infoPtr->nItemWidth, 0);
- nLastCol = min((frame.right - 1) / infoPtr->nItemWidth, (infoPtr->nItemCount + nPerCol - 1) / nPerCol);
+ nFirstCol = max(frame->left / infoPtr->nItemWidth, 0);
+ nLastCol = min((frame->right - 1) / infoPtr->nItemWidth, (infoPtr->nItemCount + nPerCol - 1) / nPerCol);
}
else
{
- nFirstCol = max(frame.left, 0);
- nLastCol = min(frame.right - 1, (infoPtr->nItemCount + nPerCol - 1) / nPerCol);
+ nFirstCol = max(frame->left, 0);
+ nLastCol = min(frame->right - 1, (infoPtr->nItemCount + nPerCol - 1) / nPerCol);
}
lower = nFirstCol * nPerCol + nFirstRow;
@@ -1362,6 +1404,22 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons
return TRUE;
}
+/***
+ * Creates an iterator over the items which intersect lprc.
+ */
+static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, const RECT *lprc)
+{
+ RECT frame = *lprc;
+ POINT Origin;
+
+ TRACE("(lprc=%s)\n", wine_dbgstr_rect(lprc));
+
+ LISTVIEW_GetOrigin(infoPtr, &Origin);
+ OffsetRect(&frame, -Origin.x, -Origin.y);
+
+ return iterator_frameditems_absolute(i, infoPtr, &frame);
+}
+
/***
* Creates an iterator over the items which intersect the visible region of hdc.
*/
@@ -1525,7 +1583,7 @@ static INT LISTVIEW_CreateHeader(LISTVIEW_INFO *infoPtr)
SendMessageW(infoPtr->hwndHeader, HDM_SETUNICODEFORMAT, TRUE, 0);
/* set header font */
- SendMessageW(infoPtr->hwndHeader, WM_SETFONT, (WPARAM)infoPtr->hFont, (LPARAM)TRUE);
+ SendMessageW(infoPtr->hwndHeader, WM_SETFONT, (WPARAM)infoPtr->hFont, TRUE);
LISTVIEW_UpdateSize(infoPtr);
@@ -1536,6 +1594,13 @@ static inline void LISTVIEW_GetHeaderRect(const LISTVIEW_INFO *infoPtr, INT nSub
{
*lprc = LISTVIEW_GetColumnInfo(infoPtr, nSubItem)->rcHeader;
}
+
+static inline BOOL LISTVIEW_IsHeaderEnabled(const LISTVIEW_INFO *infoPtr)
+{
+ return (infoPtr->uView == LV_VIEW_DETAILS ||
+ infoPtr->dwLvExStyle & LVS_EX_HEADERINALLVIEWS) &&
+ !(infoPtr->dwStyle & LVS_NOCOLUMNHEADER);
+}
static inline BOOL LISTVIEW_GetItemW(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem)
{
@@ -1683,14 +1748,15 @@ static inline INT LISTVIEW_GetCountPerColumn(const LISTVIEW_INFO *infoPtr)
*/
static INT LISTVIEW_ProcessLetterKeys(LISTVIEW_INFO *infoPtr, WPARAM charCode, LPARAM keyData)
{
- INT nItem;
- INT endidx,idx;
- LVITEMW item;
WCHAR buffer[MAX_PATH];
- DWORD lastKeyPressTimestamp = infoPtr->lastKeyPressTimestamp;
+ INT endidx, startidx;
+ DWORD prevTime;
+ LVITEMW item;
+ INT nItem;
+ INT diff;
/* simple parameter checking */
- if (!charCode || !keyData) return 0;
+ if (!charCode || !keyData || infoPtr->nItemCount == 0) return 0;
/* only allow the valid WM_CHARs through */
if (!isalnumW(charCode) &&
@@ -1705,86 +1771,95 @@ static INT LISTVIEW_ProcessLetterKeys(LISTVIEW_INFO *infoPtr, WPARAM charCode, L
charCode != '<' && charCode != ',' && charCode != '~')
return 0;
- /* if there's one item or less, there is no where to go */
- if (infoPtr->nItemCount <= 1) return 0;
-
/* update the search parameters */
+ prevTime = infoPtr->lastKeyPressTimestamp;
infoPtr->lastKeyPressTimestamp = GetTickCount();
- if (infoPtr->lastKeyPressTimestamp - lastKeyPressTimestamp < KEY_DELAY) {
- if (infoPtr->nSearchParamLength < MAX_PATH-1)
- infoPtr->szSearchParam[infoPtr->nSearchParamLength++]=charCode;
+ diff = infoPtr->lastKeyPressTimestamp - prevTime;
+
+ if (diff >= 0 && diff < KEY_DELAY)
+ {
+ if (infoPtr->nSearchParamLength < MAX_PATH - 1)
+ infoPtr->szSearchParam[infoPtr->nSearchParamLength++] = charCode;
+
if (infoPtr->charCode != charCode)
infoPtr->charCode = charCode = 0;
- } else {
- infoPtr->charCode=charCode;
- infoPtr->szSearchParam[0]=charCode;
- infoPtr->nSearchParamLength=1;
- /* Redundant with the 1 char string */
- charCode=0;
+ }
+ else
+ {
+ infoPtr->charCode = charCode;
+ infoPtr->szSearchParam[0] = charCode;
+ infoPtr->nSearchParamLength = 1;
+ /* redundant with the 1 char string */
+ charCode = 0;
}
/* and search from the current position */
- nItem=-1;
- if (infoPtr->nFocusedItem >= 0) {
- endidx=infoPtr->nFocusedItem;
- idx=endidx;
- /* if looking for single character match,
- * then we must always move forward
- */
- if (infoPtr->nSearchParamLength == 1)
- idx++;
- } else {
- endidx=infoPtr->nItemCount;
- idx=0;
- }
+ nItem = -1;
+ endidx = infoPtr->nItemCount;
- /* Let application handle this for virtual listview */
+ /* should start from next after focused item, so next item that matches
+ will be selected, if there isn't any and focused matches it will be selected
+ on second search stage from beginning of the list */
+ if (infoPtr->nFocusedItem >= 0 && infoPtr->nItemCount > 1)
+ startidx = infoPtr->nFocusedItem + 1;
+ else
+ startidx = 0;
+
+ /* let application handle this for virtual listview */
if (infoPtr->dwStyle & LVS_OWNERDATA)
{
NMLVFINDITEMW nmlv;
- LVFINDINFOW lvfi;
- ZeroMemory(&lvfi, sizeof(lvfi));
- lvfi.flags = (LVFI_WRAP | LVFI_PARTIAL);
- infoPtr->szSearchParam[infoPtr->nSearchParamLength] = '\0';
- lvfi.psz = infoPtr->szSearchParam;
- nmlv.iStart = idx;
- nmlv.lvfi = lvfi;
+ memset(&nmlv.lvfi, 0, sizeof(nmlv.lvfi));
+ nmlv.lvfi.flags = (LVFI_WRAP | LVFI_PARTIAL);
+ nmlv.lvfi.psz = infoPtr->szSearchParam;
+ nmlv.iStart = startidx;
+
+ infoPtr->szSearchParam[infoPtr->nSearchParamLength] = 0;
nItem = notify_hdr(infoPtr, LVN_ODFINDITEMW, (LPNMHDR)&nmlv.hdr);
-
- if (nItem != -1)
- LISTVIEW_KeySelection(infoPtr, nItem, FALSE);
-
- return 0;
}
+ else
+ {
+ INT i = startidx;
- do {
- if (idx == infoPtr->nItemCount) {
- if (endidx == infoPtr->nItemCount || endidx == 0)
+ /* first search in [startidx, endidx), on failure continue in [0, startidx) */
+ while (1)
+ {
+ /* start from first item if not found with >= startidx */
+ if (i == infoPtr->nItemCount && startidx > 0)
+ {
+ endidx = startidx;
+ startidx = 0;
+ }
+
+ for (i = startidx; i < endidx; i++)
+ {
+ /* retrieve text */
+ item.mask = LVIF_TEXT;
+ item.iItem = i;
+ item.iSubItem = 0;
+ item.pszText = buffer;
+ item.cchTextMax = MAX_PATH;
+ if (!LISTVIEW_GetItemW(infoPtr, &item)) return 0;
+
+ if (lstrncmpiW(item.pszText, infoPtr->szSearchParam, infoPtr->nSearchParamLength) == 0)
+ {
+ nItem = i;
+ break;
+ }
+ else if (nItem == -1 && lstrncmpiW(item.pszText, infoPtr->szSearchParam, 1) == 0)
+ {
+ /* this would work but we must keep looking for a longer match */
+ nItem = i;
+ }
+ }
+
+ /* found something or second search completed with any result */
+ if (nItem != -1 || endidx != infoPtr->nItemCount)
break;
- idx=0;
- }
-
- /* get item */
- item.mask = LVIF_TEXT;
- item.iItem = idx;
- item.iSubItem = 0;
- item.pszText = buffer;
- item.cchTextMax = MAX_PATH;
- if (!LISTVIEW_GetItemW(infoPtr, &item)) return 0;
-
- /* check for a match */
- if (lstrncmpiW(item.pszText,infoPtr->szSearchParam,infoPtr->nSearchParamLength) == 0) {
- nItem=idx;
- break;
- } else if ( (charCode != 0) && (nItem == -1) && (nItem != infoPtr->nFocusedItem) &&
- (lstrncmpiW(item.pszText,infoPtr->szSearchParam,1) == 0) ) {
- /* This would work but we must keep looking for a longer match */
- nItem=idx;
- }
- idx++;
- } while (idx != endidx);
+ };
+ }
if (nItem != -1)
LISTVIEW_KeySelection(infoPtr, nItem, FALSE);
@@ -1874,7 +1949,23 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr)
if (LISTVIEW_GetViewRect(infoPtr, &rcView)) horzInfo.nMax = rcView.right - rcView.left;
}
-
+
+ if (LISTVIEW_IsHeaderEnabled(infoPtr))
+ {
+ if (DPA_GetPtrCount(infoPtr->hdpaColumns))
+ {
+ RECT rcHeader;
+ INT index;
+
+ index = SendMessageW(infoPtr->hwndHeader, HDM_ORDERTOINDEX,
+ DPA_GetPtrCount(infoPtr->hdpaColumns) - 1, 0);
+
+ LISTVIEW_GetHeaderRect(infoPtr, index, &rcHeader);
+ horzInfo.nMax = rcHeader.right;
+ TRACE("horzInfo.nMax=%d\n", horzInfo.nMax);
+ }
+ }
+
horzInfo.fMask = SIF_RANGE | SIF_PAGE;
horzInfo.nMax = max(horzInfo.nMax - 1, 0);
dx = GetScrollPos(infoPtr->hwndSelf, SB_HORZ);
@@ -1924,7 +2015,7 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr)
}
/* Update the Header Control */
- if (infoPtr->uView == LV_VIEW_DETAILS)
+ if (infoPtr->hwndHeader)
{
horzInfo.fMask = SIF_POS;
GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &horzInfo);
@@ -2733,15 +2824,27 @@ static INT LISTVIEW_CalculateItemWidth(const LISTVIEW_INFO *infoPtr)
}
else /* LV_VIEW_SMALLICON, or LV_VIEW_LIST */
{
+ WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
+ LVITEMW lvItem;
INT i;
-
+
+ lvItem.mask = LVIF_TEXT;
+ lvItem.iSubItem = 0;
+
for (i = 0; i < infoPtr->nItemCount; i++)
- nItemWidth = max(LISTVIEW_GetLabelWidth(infoPtr, i), nItemWidth);
+ {
+ lvItem.iItem = i;
+ lvItem.pszText = szDispText;
+ lvItem.cchTextMax = DISP_TEXT_SIZE;
+ if (LISTVIEW_GetItemW(infoPtr, &lvItem))
+ nItemWidth = max(LISTVIEW_GetStringWidthT(infoPtr, lvItem.pszText, TRUE),
+ nItemWidth);
+ }
if (infoPtr->himlSmall) nItemWidth += infoPtr->iconSize.cx;
if (infoPtr->himlState) nItemWidth += infoPtr->iconStateSize.cx;
- nItemWidth = max(DEFAULT_COLUMN_WIDTH, nItemWidth + WIDTH_PADDING);
+ nItemWidth = max(DEFAULT_COLUMN_WIDTH, nItemWidth + WIDTH_PADDING);
}
return nItemWidth;
@@ -2862,11 +2965,7 @@ static INT CALLBACK ranges_cmp(LPVOID range1, LPVOID range2, LPARAM flags)
return cmp;
}
-#if DEBUG_RANGES
-#define ranges_check(ranges, desc) ranges_assert(ranges, desc, __FUNCTION__, __LINE__)
-#else
-#define ranges_check(ranges, desc) do { } while(0)
-#endif
+#define ranges_check(ranges, desc) if (TRACE_ON(listview)) ranges_assert(ranges, desc, __FUNCTION__, __LINE__)
static void ranges_assert(RANGES ranges, LPCSTR desc, const char *func, int line)
{
@@ -3091,28 +3190,30 @@ static BOOL ranges_del(RANGES ranges, RANGE range)
TRACE("(%s)\n", debugrange(&range));
ranges_check(ranges, "before del");
-
+
/* we don't use DPAS_SORTED here, since we need *
* to find the first overlapping range */
index = DPA_Search(ranges->hdpa, &range, 0, ranges_cmp, 0, 0);
- while(index != -1)
+ while(index != -1)
{
chkrgn = DPA_GetPtr(ranges->hdpa, index);
-
- TRACE("Matches range %s @%d\n", debugrange(chkrgn), index);
+
+ TRACE("Matches range %s @%d\n", debugrange(chkrgn), index);
/* case 1: Same range */
if ( (chkrgn->upper == range.upper) &&
(chkrgn->lower == range.lower) )
{
DPA_DeletePtr(ranges->hdpa, index);
+ Free(chkrgn);
break;
}
/* case 2: engulf */
else if ( (chkrgn->upper <= range.upper) &&
- (chkrgn->lower >= range.lower) )
+ (chkrgn->lower >= range.lower) )
{
DPA_DeletePtr(ranges->hdpa, index);
+ Free(chkrgn);
}
/* case 3: overlap upper */
else if ( (chkrgn->upper <= range.upper) &&
@@ -3536,7 +3637,7 @@ static BOOL LISTVIEW_GetItemAtPt(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVIte
return LISTVIEW_GetItemT(infoPtr, lpLVItem, TRUE);
}
-static inline BOOL LISTVIEW_isHotTracking(const LISTVIEW_INFO *infoPtr)
+static inline BOOL LISTVIEW_IsHotTracking(const LISTVIEW_INFO *infoPtr)
{
return ((infoPtr->dwLvExStyle & LVS_EX_TRACKSELECT) ||
(infoPtr->dwLvExStyle & LVS_EX_ONECLICKACTIVATE) ||
@@ -3561,9 +3662,13 @@ static inline BOOL LISTVIEW_isHotTracking(const LISTVIEW_INFO *infoPtr)
* over the item for a certain period of time.
*
*/
-static LRESULT LISTVIEW_MouseHover(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, INT y)
+static LRESULT LISTVIEW_MouseHover(LISTVIEW_INFO *infoPtr, INT x, INT y)
{
- if (LISTVIEW_isHotTracking(infoPtr))
+ NMHDR hdr;
+
+ if (notify_hdr(infoPtr, NM_HOVER, &hdr)) return 0;
+
+ if (LISTVIEW_IsHotTracking(infoPtr))
{
LVITEMW item;
POINT pt;
@@ -3573,11 +3678,204 @@ static LRESULT LISTVIEW_MouseHover(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, I
if (LISTVIEW_GetItemAtPt(infoPtr, &item, pt))
LISTVIEW_SetSelection(infoPtr, item.iItem);
+
+ SetFocus(infoPtr->hwndSelf);
}
return 0;
}
+#define SCROLL_LEFT 0x1
+#define SCROLL_RIGHT 0x2
+#define SCROLL_UP 0x4
+#define SCROLL_DOWN 0x8
+
+/***
+ * DESCRIPTION:
+ * Utility routine to draw and highlight items within a marquee selection rectangle.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ * [I] coords_orig : original co-ordinates of the cursor
+ * [I] coords_offs : offsetted coordinates of the cursor
+ * [I] offset : offset amount
+ * [I] scroll : Bitmask of which directions we should scroll, if at all
+ *
+ * RETURN:
+ * None.
+ */
+static void LISTVIEW_MarqueeHighlight(LISTVIEW_INFO *infoPtr, LPPOINT coords_orig, LPPOINT coords_offs, LPPOINT offset, INT scroll)
+{
+ BOOL controlDown = FALSE;
+ LVITEMW item;
+ ITERATOR i;
+ RECT rect;
+
+ if (coords_offs->x > infoPtr->marqueeOrigin.x)
+ {
+ rect.left = infoPtr->marqueeOrigin.x;
+ rect.right = coords_offs->x;
+ }
+ else
+ {
+ rect.left = coords_offs->x;
+ rect.right = infoPtr->marqueeOrigin.x;
+ }
+
+ if (coords_offs->y > infoPtr->marqueeOrigin.y)
+ {
+ rect.top = infoPtr->marqueeOrigin.y;
+ rect.bottom = coords_offs->y;
+ }
+ else
+ {
+ rect.top = coords_offs->y;
+ rect.bottom = infoPtr->marqueeOrigin.y;
+ }
+
+ /* Cancel out the old marquee rectangle and draw the new one */
+ LISTVIEW_InvalidateRect(infoPtr, &infoPtr->marqueeDrawRect);
+
+ /* Scroll by the appropriate distance if applicable - speed up scrolling as
+ the cursor is further away */
+
+ if ((scroll & SCROLL_LEFT) && (coords_orig->x <= 0))
+ LISTVIEW_Scroll(infoPtr, coords_orig->x, 0);
+
+ if ((scroll & SCROLL_RIGHT) && (coords_orig->x >= infoPtr->rcList.right))
+ LISTVIEW_Scroll(infoPtr, (coords_orig->x - infoPtr->rcList.right), 0);
+
+ if ((scroll & SCROLL_UP) && (coords_orig->y <= 0))
+ LISTVIEW_Scroll(infoPtr, 0, coords_orig->y);
+
+ if ((scroll & SCROLL_DOWN) && (coords_orig->y >= infoPtr->rcList.bottom))
+ LISTVIEW_Scroll(infoPtr, 0, (coords_orig->y - infoPtr->rcList.bottom));
+
+ /* Invert the items in the old marquee rectangle */
+ iterator_frameditems_absolute(&i, infoPtr, &infoPtr->marqueeRect);
+
+ while (iterator_next(&i))
+ {
+ if (i.nItem > -1)
+ {
+ if (LISTVIEW_GetItemState(infoPtr, i.nItem, LVIS_SELECTED) == LVIS_SELECTED)
+ item.state = 0;
+ else
+ item.state = LVIS_SELECTED;
+
+ item.stateMask = LVIS_SELECTED;
+
+ LISTVIEW_SetItemState(infoPtr, i.nItem, &item);
+ }
+ }
+
+ iterator_destroy(&i);
+
+ CopyRect(&infoPtr->marqueeRect, &rect);
+
+ CopyRect(&infoPtr->marqueeDrawRect, &rect);
+ OffsetRect(&infoPtr->marqueeDrawRect, offset->x, offset->y);
+
+ /* Iterate over the items within our marquee rectangle */
+ iterator_frameditems_absolute(&i, infoPtr, &infoPtr->marqueeRect);
+
+ if (GetKeyState(VK_CONTROL) & 0x8000)
+ controlDown = TRUE;
+
+ while (iterator_next(&i))
+ {
+ if (i.nItem > -1)
+ {
+ /* If CTRL is pressed, invert. If not, always select the item. */
+ if ((controlDown) && (LISTVIEW_GetItemState(infoPtr, i.nItem, LVIS_SELECTED)))
+ item.state = 0;
+ else
+ item.state = LVIS_SELECTED;
+
+ item.stateMask = LVIS_SELECTED;
+
+ LISTVIEW_SetItemState(infoPtr, i.nItem, &item);
+ }
+ }
+
+ iterator_destroy(&i);
+ LISTVIEW_InvalidateRect(infoPtr, &rect);
+}
+
+/***
+ * DESCRIPTION:
+ * Called when we are in a marquee selection that involves scrolling the listview (ie,
+ * the cursor is outside the bounds of the client area). This is a TIMERPROC.
+ *
+ * PARAMETER(S):
+ * [I] hwnd : Handle to the listview
+ * [I] uMsg : WM_TIMER (ignored)
+ * [I] idEvent : The timer ID interpreted as a pointer to a LISTVIEW_INFO struct
+ * [I] dwTimer : The elapsed time (ignored)
+ *
+ * RETURN:
+ * None.
+ */
+static VOID CALLBACK LISTVIEW_ScrollTimer(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
+{
+ LISTVIEW_INFO *infoPtr;
+ SCROLLINFO scrollInfo;
+ POINT coords_orig;
+ POINT coords_offs;
+ POINT offset;
+ INT scroll = 0;
+
+ infoPtr = (LISTVIEW_INFO *) idEvent;
+
+ if (!infoPtr)
+ return;
+
+ /* Get the current cursor position and convert to client coordinates */
+ GetCursorPos(&coords_orig);
+ ScreenToClient(hWnd, &coords_orig);
+
+ /* Ensure coordinates are within client bounds */
+ coords_offs.x = max(min(coords_orig.x, infoPtr->rcList.right), 0);
+ coords_offs.y = max(min(coords_orig.y, infoPtr->rcList.bottom), 0);
+
+ /* Get offset */
+ LISTVIEW_GetOrigin(infoPtr, &offset);
+
+ /* Offset coordinates by the appropriate amount */
+ coords_offs.x -= offset.x;
+ coords_offs.y -= offset.y;
+
+ scrollInfo.cbSize = sizeof(SCROLLINFO);
+ scrollInfo.fMask = SIF_ALL;
+
+ /* Work out in which directions we can scroll */
+ if (GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo))
+ {
+ if (scrollInfo.nPos != scrollInfo.nMin)
+ scroll |= SCROLL_UP;
+
+ if (((scrollInfo.nPage + scrollInfo.nPos) - 1) != scrollInfo.nMax)
+ scroll |= SCROLL_DOWN;
+ }
+
+ if (GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo))
+ {
+ if (scrollInfo.nPos != scrollInfo.nMin)
+ scroll |= SCROLL_LEFT;
+
+ if (((scrollInfo.nPage + scrollInfo.nPos) - 1) != scrollInfo.nMax)
+ scroll |= SCROLL_RIGHT;
+ }
+
+ if (((coords_orig.x <= 0) && (scroll & SCROLL_LEFT)) ||
+ ((coords_orig.y <= 0) && (scroll & SCROLL_UP)) ||
+ ((coords_orig.x >= infoPtr->rcList.right) && (scroll & SCROLL_RIGHT)) ||
+ ((coords_orig.y >= infoPtr->rcList.bottom) && (scroll & SCROLL_DOWN)))
+ {
+ LISTVIEW_MarqueeHighlight(infoPtr, &coords_orig, &coords_offs, &offset, scroll);
+ }
+}
+
/***
* DESCRIPTION:
* Called whenever WM_MOUSEMOVE is received.
@@ -3592,8 +3890,6 @@ static LRESULT LISTVIEW_MouseHover(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, I
*/
static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, INT y)
{
- TRACKMOUSEEVENT trackinfo;
-
if (!(fwKeys & MK_LBUTTON))
infoPtr->bLButtonDown = FALSE;
@@ -3605,6 +3901,48 @@ static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, IN
WORD wDragWidth = GetSystemMetrics(SM_CXDRAG);
WORD wDragHeight= GetSystemMetrics(SM_CYDRAG);
+ if (infoPtr->bMarqueeSelect)
+ {
+ POINT coords_orig;
+ POINT coords_offs;
+ POINT offset;
+
+ coords_orig.x = x;
+ coords_orig.y = y;
+
+ /* Get offset */
+ LISTVIEW_GetOrigin(infoPtr, &offset);
+
+ /* Ensure coordinates are within client bounds */
+ coords_offs.x = max(min(x, infoPtr->rcList.right), 0);
+ coords_offs.y = max(min(y, infoPtr->rcList.bottom), 0);
+
+ /* Offset coordinates by the appropriate amount */
+ coords_offs.x -= offset.x;
+ coords_offs.y -= offset.y;
+
+ /* Enable the timer if we're going outside our bounds, in case the user doesn't
+ move the mouse again */
+
+ if ((x <= 0) || (y <= 0) || (x >= infoPtr->rcList.right) ||
+ (y >= infoPtr->rcList.bottom))
+ {
+ if (!infoPtr->bScrolling)
+ {
+ infoPtr->bScrolling = TRUE;
+ SetTimer(infoPtr->hwndSelf, (UINT_PTR) infoPtr, 1, LISTVIEW_ScrollTimer);
+ }
+ }
+ else
+ {
+ infoPtr->bScrolling = FALSE;
+ KillTimer(infoPtr->hwndSelf, (UINT_PTR) infoPtr);
+ }
+
+ LISTVIEW_MarqueeHighlight(infoPtr, &coords_orig, &coords_offs, &offset, 0);
+ return 0;
+ }
+
rect.left = infoPtr->ptClickPos.x - wDragWidth;
rect.right = infoPtr->ptClickPos.x + wDragWidth;
rect.top = infoPtr->ptClickPos.y - wDragHeight;
@@ -3640,17 +3978,42 @@ static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, IN
if (!infoPtr->bDragging)
{
- NMLISTVIEW nmlv;
-
lvHitTestInfo.pt = infoPtr->ptClickPos;
LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE, TRUE);
- ZeroMemory(&nmlv, sizeof(nmlv));
- nmlv.iItem = lvHitTestInfo.iItem;
- nmlv.ptAction = infoPtr->ptClickPos;
+ /* If the click is outside the range of an item, begin a
+ highlight. If not, begin an item drag. */
+ if (lvHitTestInfo.iItem == -1)
+ {
+ NMHDR hdr;
- notify_listview(infoPtr, LVN_BEGINDRAG, &nmlv);
- infoPtr->bDragging = TRUE;
+ /* If we're allowing multiple selections, send notification.
+ If return value is non-zero, cancel. */
+ if (!(infoPtr->dwStyle & LVS_SINGLESEL) && (notify_hdr(infoPtr, LVN_MARQUEEBEGIN, &hdr) == 0))
+ {
+ /* Store the absolute coordinates of the click */
+ POINT offset;
+ LISTVIEW_GetOrigin(infoPtr, &offset);
+
+ infoPtr->marqueeOrigin.x = infoPtr->ptClickPos.x - offset.x;
+ infoPtr->marqueeOrigin.y = infoPtr->ptClickPos.y - offset.y;
+
+ /* Begin selection and capture mouse */
+ infoPtr->bMarqueeSelect = TRUE;
+ SetCapture(infoPtr->hwndSelf);
+ }
+ }
+ else
+ {
+ NMLISTVIEW nmlv;
+
+ ZeroMemory(&nmlv, sizeof(nmlv));
+ nmlv.iItem = lvHitTestInfo.iItem;
+ nmlv.ptAction = infoPtr->ptClickPos;
+
+ notify_listview(infoPtr, LVN_BEGINDRAG, &nmlv);
+ infoPtr->bDragging = TRUE;
+ }
}
return 0;
@@ -3658,18 +4021,19 @@ static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, IN
}
/* see if we are supposed to be tracking mouse hovering */
- if (LISTVIEW_isHotTracking(infoPtr)) {
- /* fill in the trackinfo struct */
+ if (LISTVIEW_IsHotTracking(infoPtr)) {
+ TRACKMOUSEEVENT trackinfo;
+
trackinfo.cbSize = sizeof(TRACKMOUSEEVENT);
trackinfo.dwFlags = TME_QUERY;
- trackinfo.hwndTrack = infoPtr->hwndSelf;
- trackinfo.dwHoverTime = infoPtr->dwHoverTime;
/* see if we are already tracking this hwnd */
_TrackMouseEvent(&trackinfo);
- if(!(trackinfo.dwFlags & TME_HOVER)) {
- trackinfo.dwFlags = TME_HOVER;
+ if(!(trackinfo.dwFlags & TME_HOVER) || trackinfo.hwndTrack != infoPtr->hwndSelf) {
+ trackinfo.dwFlags = TME_HOVER;
+ trackinfo.dwHoverTime = infoPtr->dwHoverTime;
+ trackinfo.hwndTrack = infoPtr->hwndSelf;
/* call TRACKMOUSEEVENT so we receive WM_MOUSEHOVER messages */
_TrackMouseEvent(&trackinfo);
@@ -3914,12 +4278,11 @@ static BOOL set_sub_item(const LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem,
*bChanged = TRUE;
}
- if (lpLVItem->mask & LVIF_IMAGE)
- if (lpSubItem->hdr.iImage != lpLVItem->iImage)
- {
- lpSubItem->hdr.iImage = lpLVItem->iImage;
- *bChanged = TRUE;
- }
+ if ((lpLVItem->mask & LVIF_IMAGE) && (lpSubItem->hdr.iImage != lpLVItem->iImage))
+ {
+ lpSubItem->hdr.iImage = lpLVItem->iImage;
+ *bChanged = TRUE;
+ }
if ((lpLVItem->mask & LVIF_TEXT) && textcmpWT(lpSubItem->hdr.pszText, lpLVItem->pszText, isW))
{
@@ -4089,7 +4452,7 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nS
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
if (nSubItem == 0) lvItem.mask |= LVIF_STATE;
if (infoPtr->uView == LV_VIEW_DETAILS) lvItem.mask |= LVIF_INDENT;
- lvItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED | LVIS_STATEIMAGEMASK;
+ lvItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED | LVIS_STATEIMAGEMASK | LVIS_CUT;
lvItem.iItem = nItem;
lvItem.iSubItem = nSubItem;
lvItem.state = 0;
@@ -4192,14 +4555,23 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nS
}
}
- /* small icons */
+ /* item icons */
himl = (infoPtr->uView == LV_VIEW_ICON ? infoPtr->himlNormal : infoPtr->himlSmall);
if (himl && lvItem.iImage >= 0 && !IsRectEmpty(&rcIcon))
{
+ UINT style;
+
TRACE("iImage=%d\n", lvItem.iImage);
+
+ if (lvItem.state & (LVIS_SELECTED | LVIS_CUT) && infoPtr->bFocus)
+ style = ILD_SELECTED;
+ else
+ style = ILD_NORMAL;
+
ImageList_DrawEx(himl, lvItem.iImage, hdc, rcIcon.left, rcIcon.top,
- rcIcon.right - rcIcon.left, rcIcon.bottom - rcIcon.top, infoPtr->clrBk, CLR_DEFAULT,
- (lvItem.state & LVIS_SELECTED) && (infoPtr->bFocus) ? ILD_SELECTED : ILD_NORMAL);
+ rcIcon.right - rcIcon.left, rcIcon.bottom - rcIcon.top, infoPtr->clrBk,
+ lvItem.state & LVIS_CUT ? RGB(255, 255, 255) : CLR_DEFAULT,
+ style);
}
/* Don't bother painting item being edited */
@@ -4643,6 +5015,10 @@ enddraw:
if ((infoPtr->uView == LV_VIEW_DETAILS) && infoPtr->dwLvExStyle & LVS_EX_GRIDLINES)
LISTVIEW_RefreshReportGrid(infoPtr, hdc);
+ /* Draw marquee rectangle if appropriate */
+ if (infoPtr->bMarqueeSelect)
+ DrawFocusRect(hdc, &infoPtr->marqueeDrawRect);
+
if (cdmode & CDRF_NOTIFYPOSTPAINT)
notify_postpaint(infoPtr, &nmlvcd);
@@ -4744,10 +5120,46 @@ static DWORD LISTVIEW_ApproximateViewRect(const LISTVIEW_INFO *infoPtr, INT nIte
dwViewRect = MAKELONG(wWidth, wHeight);
}
+ else if (infoPtr->uView == LV_VIEW_ICON)
+ {
+ UINT rows,cols;
+ UINT nItemWidth;
+ UINT nItemHeight;
+
+ nItemWidth = infoPtr->iconSpacing.cx;
+ nItemHeight = infoPtr->iconSpacing.cy;
+
+ if (nItemCount == -1)
+ nItemCount = infoPtr->nItemCount;
+
+ if (wWidth == 0xffff)
+ wWidth = infoPtr->rcList.right - infoPtr->rcList.left;
+
+ if (wWidth < nItemWidth)
+ wWidth = nItemWidth;
+
+ cols = wWidth / nItemWidth;
+ if (cols > nItemCount)
+ cols = nItemCount;
+ if (cols < 1)
+ cols = 1;
+
+ if (nItemCount)
+ {
+ rows = nItemCount / cols;
+ if (nItemCount % cols)
+ rows++;
+ }
+ else
+ rows = 0;
+
+ wHeight = (nItemHeight * rows)+2;
+ wWidth = (nItemWidth * cols)+2;
+
+ dwViewRect = MAKELONG(wWidth, wHeight);
+ }
else if (infoPtr->uView == LV_VIEW_SMALLICON)
FIXME("uView == LV_VIEW_SMALLICON: not implemented\n");
- else if (infoPtr->uView == LV_VIEW_ICON)
- FIXME("uView == LV_VIEW_ICON: not implemented\n");
return dwViewRect;
}
@@ -4764,11 +5176,14 @@ static DWORD LISTVIEW_ApproximateViewRect(const LISTVIEW_INFO *infoPtr, INT nIte
*/
static LRESULT LISTVIEW_CancelEditLabel(LISTVIEW_INFO *infoPtr)
{
- /* handle value will be lost after LISTVIEW_EndEditLabelT */
- HWND edit = infoPtr->hwndEdit;
+ if (infoPtr->hwndEdit)
+ {
+ /* handle value will be lost after LISTVIEW_EndEditLabelT */
+ HWND edit = infoPtr->hwndEdit;
- LISTVIEW_EndEditLabelT(infoPtr, TRUE, IsWindowUnicode(infoPtr->hwndEdit));
- SendMessageW(edit, WM_CLOSE, 0, 0);
+ LISTVIEW_EndEditLabelT(infoPtr, TRUE, IsWindowUnicode(infoPtr->hwndEdit));
+ SendMessageW(edit, WM_CLOSE, 0, 0);
+ }
return TRUE;
}
@@ -4795,7 +5210,7 @@ static HIMAGELIST LISTVIEW_CreateDragImage(LISTVIEW_INFO *infoPtr, INT iItem, LP
HIMAGELIST dragList = 0;
TRACE("iItem=%d Count=%d\n", iItem, infoPtr->nItemCount);
- if (iItem < 0 || iItem >= infoPtr->nItemCount)
+ if (iItem < 0 || iItem >= infoPtr->nItemCount || !lppt)
return 0;
rcItem.left = LVIR_BOUNDS;
@@ -4855,6 +5270,8 @@ static BOOL LISTVIEW_DeleteAllItems(LISTVIEW_INFO *infoPtr, BOOL destroy)
HDPA hdpaSubItems = NULL;
BOOL bSuppress;
ITEMHDR *hdrItem;
+ ITEM_INFO *lpItem;
+ ITEM_ID *lpID;
INT i, j;
TRACE("()\n");
@@ -4876,13 +5293,20 @@ static BOOL LISTVIEW_DeleteAllItems(LISTVIEW_INFO *infoPtr, BOOL destroy)
{
if (!(infoPtr->dwStyle & LVS_OWNERDATA))
{
- /* send LVN_DELETEITEM notification, if not suppressed
- and if it is not a virtual listview */
- if (!bSuppress) notify_deleteitem(infoPtr, i);
- hdpaSubItems = DPA_GetPtr(infoPtr->hdpaItems, i);
+ /* send LVN_DELETEITEM notification, if not suppressed
+ and if it is not a virtual listview */
+ if (!bSuppress) notify_deleteitem(infoPtr, i);
+ hdpaSubItems = DPA_GetPtr(infoPtr->hdpaItems, i);
+ lpItem = DPA_GetPtr(hdpaSubItems, 0);
+ /* free id struct */
+ j = DPA_GetPtrIndex(infoPtr->hdpaItemIds, lpItem->id);
+ lpID = DPA_GetPtr(infoPtr->hdpaItemIds, j);
+ DPA_DeletePtr(infoPtr->hdpaItemIds, j);
+ Free(lpID);
+ /* both item and subitem start with ITEMHDR header */
for (j = 0; j < DPA_GetPtrCount(hdpaSubItems); j++)
{
- hdrItem = DPA_GetPtr(hdpaSubItems, j);
+ hdrItem = DPA_GetPtr(hdpaSubItems, j);
if (is_textW(hdrItem->pszText)) Free(hdrItem->pszText);
Free(hdrItem);
}
@@ -5212,6 +5636,7 @@ static BOOL LISTVIEW_DeleteItem(LISTVIEW_INFO *infoPtr, INT nItem)
static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, BOOL storeText, BOOL isW)
{
HWND hwndSelf = infoPtr->hwndSelf;
+ WCHAR szDispText[DISP_TEXT_SIZE] = { 0 };
NMLVDISPINFOW dispInfo;
INT editedItem = infoPtr->nEditLabelItem;
BOOL bSame;
@@ -5242,7 +5667,9 @@ static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, BOOL storeText, BOOL
dispInfo.item.iItem = editedItem;
dispInfo.item.iSubItem = 0;
dispInfo.item.stateMask = ~0;
- if (!LISTVIEW_GetItemW(infoPtr, &dispInfo.item))
+ dispInfo.item.pszText = szDispText;
+ dispInfo.item.cchTextMax = DISP_TEXT_SIZE;
+ if (!LISTVIEW_GetItemT(infoPtr, &dispInfo.item, isW))
{
res = FALSE;
goto cleanup;
@@ -5256,16 +5683,11 @@ static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, BOOL storeText, BOOL
bSame = (lstrcmpW(dispInfo.item.pszText, tmp) == 0);
textfreeT(tmp, FALSE);
}
- if (bSame)
- {
- res = TRUE;
- goto cleanup;
- }
/* add the text from the edit in */
dispInfo.item.mask |= LVIF_TEXT;
- dispInfo.item.pszText = pszText;
- dispInfo.item.cchTextMax = textlenT(pszText, isW);
+ dispInfo.item.pszText = bSame ? NULL : pszText;
+ dispInfo.item.cchTextMax = bSame ? 0 : textlenT(pszText, isW);
/* Do we need to update the Item Text */
if (!notify_dispinfoT(infoPtr, LVN_ENDLABELEDITW, &dispInfo, isW))
@@ -5279,6 +5701,11 @@ static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, BOOL storeText, BOOL
goto cleanup;
}
if (!pszText) return TRUE;
+ if (bSame)
+ {
+ res = TRUE;
+ goto cleanup;
+ }
if (!(infoPtr->dwStyle & LVS_OWNERDATA))
{
@@ -5306,6 +5733,133 @@ cleanup:
return res;
}
+/***
+ * DESCRIPTION:
+ * Subclassed edit control windproc function
+ *
+ * PARAMETER(S):
+ * [I] hwnd : the edit window handle
+ * [I] uMsg : the message that is to be processed
+ * [I] wParam : first message parameter
+ * [I] lParam : second message parameter
+ * [I] isW : TRUE if input is Unicode
+ *
+ * RETURN:
+ * Zero.
+ */
+static LRESULT EditLblWndProcT(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL isW)
+{
+ LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongPtrW(GetParent(hwnd), 0);
+ BOOL save = TRUE;
+
+ TRACE("(hwnd=%p, uMsg=%x, wParam=%lx, lParam=%lx, isW=%d)\n",
+ hwnd, uMsg, wParam, lParam, isW);
+
+ switch (uMsg)
+ {
+ case WM_GETDLGCODE:
+ return DLGC_WANTARROWS | DLGC_WANTALLKEYS;
+
+ case WM_DESTROY:
+ {
+ WNDPROC editProc = infoPtr->EditWndProc;
+ infoPtr->EditWndProc = 0;
+ SetWindowLongPtrW(hwnd, GWLP_WNDPROC, (DWORD_PTR)editProc);
+ return CallWindowProcT(editProc, hwnd, uMsg, wParam, lParam, isW);
+ }
+
+ case WM_KEYDOWN:
+ if (VK_ESCAPE == (INT)wParam)
+ {
+ save = FALSE;
+ break;
+ }
+ else if (VK_RETURN == (INT)wParam)
+ break;
+
+ default:
+ return CallWindowProcT(infoPtr->EditWndProc, hwnd, uMsg, wParam, lParam, isW);
+ }
+
+ /* kill the edit */
+ if (infoPtr->hwndEdit)
+ LISTVIEW_EndEditLabelT(infoPtr, save, isW);
+
+ SendMessageW(hwnd, WM_CLOSE, 0, 0);
+ return 0;
+}
+
+/***
+ * DESCRIPTION:
+ * Subclassed edit control Unicode windproc function
+ *
+ * PARAMETER(S):
+ * [I] hwnd : the edit window handle
+ * [I] uMsg : the message that is to be processed
+ * [I] wParam : first message parameter
+ * [I] lParam : second message parameter
+ *
+ * RETURN:
+ */
+static LRESULT CALLBACK EditLblWndProcW(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ return EditLblWndProcT(hwnd, uMsg, wParam, lParam, TRUE);
+}
+
+/***
+ * DESCRIPTION:
+ * Subclassed edit control ANSI windproc function
+ *
+ * PARAMETER(S):
+ * [I] hwnd : the edit window handle
+ * [I] uMsg : the message that is to be processed
+ * [I] wParam : first message parameter
+ * [I] lParam : second message parameter
+ *
+ * RETURN:
+ */
+static LRESULT CALLBACK EditLblWndProcA(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ return EditLblWndProcT(hwnd, uMsg, wParam, lParam, FALSE);
+}
+
+/***
+ * DESCRIPTION:
+ * Creates a subclassed edit control
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ * [I] text : initial text for the edit
+ * [I] style : the window style
+ * [I] isW : TRUE if input is Unicode
+ *
+ * RETURN:
+ */
+static HWND CreateEditLabelT(LISTVIEW_INFO *infoPtr, LPCWSTR text, BOOL isW)
+{
+ static const DWORD style = WS_CHILDWINDOW|WS_CLIPSIBLINGS|ES_LEFT|ES_AUTOHSCROLL|WS_BORDER|WS_VISIBLE;
+ HINSTANCE hinst = (HINSTANCE)GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_HINSTANCE);
+ HWND hedit;
+
+ TRACE("(%p, text=%s, isW=%d)\n", infoPtr, debugtext_t(text, isW), isW);
+
+ /* Window will be resized and positioned after LVN_BEGINLABELEDIT */
+ if (isW)
+ hedit = CreateWindowW(WC_EDITW, text, style, 0, 0, 0, 0, infoPtr->hwndSelf, 0, hinst, 0);
+ else
+ hedit = CreateWindowA(WC_EDITA, (LPCSTR)text, style, 0, 0, 0, 0, infoPtr->hwndSelf, 0, hinst, 0);
+
+ if (!hedit) return 0;
+
+ infoPtr->EditWndProc = (WNDPROC)
+ (isW ? SetWindowLongPtrW(hedit, GWLP_WNDPROC, (DWORD_PTR)EditLblWndProcW) :
+ SetWindowLongPtrA(hedit, GWLP_WNDPROC, (DWORD_PTR)EditLblWndProcA) );
+
+ SendMessageW(hedit, WM_SETFONT, (WPARAM)infoPtr->hFont, FALSE);
+
+ return hedit;
+}
+
/***
* DESCRIPTION:
* Begin in place editing of specified list view item
@@ -5361,7 +5915,7 @@ static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *infoPtr, INT nItem, BOOL isW)
dispInfo.item.cchTextMax = DISP_TEXT_SIZE;
if (!LISTVIEW_GetItemT(infoPtr, &dispInfo.item, isW)) return 0;
- infoPtr->hwndEdit = CreateEditLabelT(infoPtr, dispInfo.item.pszText, WS_VISIBLE, isW);
+ infoPtr->hwndEdit = CreateEditLabelT(infoPtr, dispInfo.item.pszText, isW);
if (!infoPtr->hwndEdit) return 0;
if (notify_dispinfoT(infoPtr, LVN_BEGINLABELEDITW, &dispInfo, isW))
@@ -5525,7 +6079,8 @@ static INT LISTVIEW_FindItemW(const LISTVIEW_INFO *infoPtr, INT nStart,
if (!lpFindInfo || nItem < 0) return -1;
lvItem.mask = 0;
- if (lpFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL))
+ if (lpFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL) ||
+ lpFindInfo->flags & LVFI_SUBSTRING)
{
lvItem.mask |= LVIF_TEXT;
lvItem.pszText = szDispText;
@@ -5586,12 +6141,13 @@ again:
else
continue;
}
-
+
if (lvItem.mask & LVIF_TEXT)
{
- if (lpFindInfo->flags & LVFI_PARTIAL)
+ if (lpFindInfo->flags & (LVFI_PARTIAL | LVFI_SUBSTRING))
{
- if (strstrW(lvItem.pszText, lpFindInfo->psz) == NULL) continue;
+ WCHAR *p = strstrW(lvItem.pszText, lpFindInfo->psz);
+ if (!p || p != lvItem.pszText) continue;
}
else
{
@@ -5600,7 +6156,7 @@ again:
}
if (!bNearest) return nItem;
-
+
/* This is very inefficient. To do a good job here,
* we need a sorted array of (x,y) item positions */
LISTVIEW_GetItemOrigin(infoPtr, nItem, &Position);
@@ -5645,7 +6201,8 @@ again:
static INT LISTVIEW_FindItemA(const LISTVIEW_INFO *infoPtr, INT nStart,
const LVFINDINFOA *lpFindInfo)
{
- BOOL hasText = lpFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL);
+ BOOL hasText = lpFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL) ||
+ lpFindInfo->flags & LVFI_SUBSTRING;
LVFINDINFOW fiw;
INT res;
LPWSTR strW = NULL;
@@ -5842,8 +6399,13 @@ static HIMAGELIST LISTVIEW_GetImageList(const LISTVIEW_INFO *infoPtr, INT nImage
switch (nImageList)
{
case LVSIL_NORMAL: return infoPtr->himlNormal;
- case LVSIL_SMALL: return infoPtr->himlSmall;
- case LVSIL_STATE: return infoPtr->himlState;
+ case LVSIL_SMALL: return infoPtr->himlSmall;
+ case LVSIL_STATE: return infoPtr->himlState;
+ case LVSIL_GROUPHEADER:
+ FIXME("LVSIL_GROUPHEADER not supported\n");
+ break;
+ default:
+ WARN("got unknown imagelist index - %d\n", nImageList);
}
return NULL;
}
@@ -6000,7 +6562,7 @@ static BOOL LISTVIEW_GetItemT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
if (isubitem)
{
- SUBITEM_INFO *lpSubItem = LISTVIEW_GetSubItemPtr(hdpaSubItems, isubitem);
+ SUBITEM_INFO *lpSubItem = LISTVIEW_GetSubItemPtr(hdpaSubItems, isubitem);
pItemHdr = lpSubItem ? &lpSubItem->hdr : &callbackHdr;
if (!lpSubItem)
{
@@ -6384,7 +6946,7 @@ static BOOL LISTVIEW_GetItemRect(const LISTVIEW_INFO *infoPtr, INT nItem, LPRECT
*/
static BOOL LISTVIEW_GetSubItemRect(const LISTVIEW_INFO *infoPtr, INT nItem, LPRECT lprc)
{
- POINT Position;
+ POINT Position, Origin;
LVITEMW lvItem;
INT nColumn;
@@ -6392,7 +6954,7 @@ static BOOL LISTVIEW_GetSubItemRect(const LISTVIEW_INFO *infoPtr, INT nItem, LPR
nColumn = lprc->top;
- TRACE("(nItem=%d, nSubItem=%d)\n", nItem, lprc->top);
+ TRACE("(nItem=%d, nSubItem=%d, type=%d)\n", nItem, lprc->top, lprc->left);
/* On WinNT, a subitem of '0' calls LISTVIEW_GetItemRect */
if (lprc->top == 0)
return LISTVIEW_GetItemRect(infoPtr, nItem, lprc);
@@ -6418,6 +6980,7 @@ static BOOL LISTVIEW_GetSubItemRect(const LISTVIEW_INFO *infoPtr, INT nItem, LPR
}
if (!LISTVIEW_GetItemPosition(infoPtr, nItem, &Position)) return FALSE;
+ LISTVIEW_GetOrigin(infoPtr, &Origin);
if (nColumn < 0 || nColumn >= DPA_GetPtrCount(infoPtr->hdpaColumns)) return FALSE;
@@ -6425,7 +6988,6 @@ static BOOL LISTVIEW_GetSubItemRect(const LISTVIEW_INFO *infoPtr, INT nItem, LPR
lvItem.iItem = nItem;
lvItem.iSubItem = nColumn;
- if (lvItem.mask && !LISTVIEW_GetItemW(infoPtr, &lvItem)) return FALSE;
switch(lprc->left)
{
case LVIR_ICON:
@@ -6442,39 +7004,12 @@ static BOOL LISTVIEW_GetSubItemRect(const LISTVIEW_INFO *infoPtr, INT nItem, LPR
return FALSE;
}
- OffsetRect(lprc, 0, Position.y);
+ OffsetRect(lprc, Origin.x, Position.y);
+ TRACE("return rect %s\n", wine_dbgstr_rect(lprc));
+
return TRUE;
}
-
-/***
- * DESCRIPTION:
- * Retrieves the width of a label.
- *
- * PARAMETER(S):
- * [I] infoPtr : valid pointer to the listview structure
- *
- * RETURN:
- * SUCCESS : string width (in pixels)
- * FAILURE : zero
- */
-static INT LISTVIEW_GetLabelWidth(const LISTVIEW_INFO *infoPtr, INT nItem)
-{
- WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
- LVITEMW lvItem;
-
- TRACE("(nItem=%d)\n", nItem);
-
- lvItem.mask = LVIF_TEXT;
- lvItem.iItem = nItem;
- lvItem.iSubItem = 0;
- lvItem.pszText = szDispText;
- lvItem.cchTextMax = DISP_TEXT_SIZE;
- if (!LISTVIEW_GetItemW(infoPtr, &lvItem)) return 0;
-
- return LISTVIEW_GetStringWidthT(infoPtr, lvItem.pszText, TRUE);
-}
-
/***
* DESCRIPTION:
* Retrieves the spacing between listview control items.
@@ -6918,6 +7453,14 @@ static INT LISTVIEW_HitTest(const LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht,
}
}
TRACE("lpht->iSubItem=%d\n", lpht->iSubItem);
+
+ /* if we're outside horizontal columns bounds there's nothing to test further */
+ if (lpht->iSubItem == -1)
+ {
+ lpht->iItem = -1;
+ lpht->flags = LVHT_NOWHERE;
+ return -1;
+ }
}
TRACE("lpht->flags=0x%x\n", lpht->flags);
@@ -7067,9 +7610,9 @@ static INT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem,
while (i < infoPtr->nItemCount)
{
hItem = DPA_GetPtr( infoPtr->hdpaItems, i);
- item_s = (ITEM_INFO*)DPA_GetPtr(hItem, 0);
+ item_s = DPA_GetPtr(hItem, 0);
- cmpv = textcmpWT(item_s->hdr.pszText, lpLVItem->pszText, TRUE);
+ cmpv = textcmpWT(item_s->hdr.pszText, lpLVItem->pszText, isW);
if (infoPtr->dwStyle & LVS_SORTDESCENDING) cmpv *= -1;
if (cmpv >= 0) break;
@@ -7451,7 +7994,7 @@ static INT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
/* insert item in header control */
nNewColumn = SendMessageW(infoPtr->hwndHeader,
isW ? HDM_INSERTITEMW : HDM_INSERTITEMA,
- (WPARAM)nColumn, (LPARAM)&hdi);
+ nColumn, (LPARAM)&hdi);
if (nNewColumn == -1) return -1;
if (nNewColumn != nColumn) ERR("nColumn=%d, nNewColumn=%d\n", nColumn, nNewColumn);
@@ -7470,7 +8013,14 @@ static INT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
SUBITEM_INFO *lpSubItem;
HDPA hdpaSubItems;
INT nItem, i;
-
+ LVITEMW item;
+ BOOL changed;
+
+ item.iSubItem = nNewColumn;
+ item.mask = LVIF_TEXT | LVIF_IMAGE;
+ item.iImage = I_IMAGECALLBACK;
+ item.pszText = LPSTR_TEXTCALLBACKW;
+
for (nItem = 0; nItem < infoPtr->nItemCount; nItem++)
{
hdpaSubItems = DPA_GetPtr(infoPtr->hdpaItems, nItem);
@@ -7480,6 +8030,10 @@ static INT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
if (lpSubItem->iSubItem >= nNewColumn)
lpSubItem->iSubItem++;
}
+
+ /* add new subitem for each item */
+ item.iItem = nItem;
+ set_sub_item(infoPtr, &item, isW, &changed);
}
}
@@ -7534,7 +8088,7 @@ static BOOL LISTVIEW_SetColumnT(const LISTVIEW_INFO *infoPtr, INT nColumn,
column_fill_hditem(infoPtr, &hdi, nColumn, lpColumn, isW);
/* set header item attributes */
- bResult = SendMessageW(infoPtr->hwndHeader, isW ? HDM_SETITEMW : HDM_SETITEMA, (WPARAM)nColumn, (LPARAM)&hdi);
+ bResult = SendMessageW(infoPtr->hwndHeader, isW ? HDM_SETITEMW : HDM_SETITEMA, nColumn, (LPARAM)&hdi);
if (!bResult) return FALSE;
if (lpColumn->mask & LVCF_FMT)
@@ -7774,10 +8328,18 @@ static DWORD LISTVIEW_SetExtendedListViewStyle(LISTVIEW_INFO *infoPtr, DWORD dwM
LISTVIEW_SetItemState(infoPtr, -1, &item);
himl = LISTVIEW_CreateCheckBoxIL(infoPtr);
+ if(!(infoPtr->dwStyle & LVS_SHAREIMAGELISTS))
+ ImageList_Destroy(infoPtr->himlState);
}
- LISTVIEW_SetImageList(infoPtr, LVSIL_STATE, himl);
+ himl = LISTVIEW_SetImageList(infoPtr, LVSIL_STATE, himl);
+ /* checkbox list replaces prevous custom list or... */
+ if(((infoPtr->dwLvExStyle & LVS_EX_CHECKBOXES) &&
+ !(infoPtr->dwStyle & LVS_SHAREIMAGELISTS)) ||
+ /* ...previous was checkbox list */
+ (dwOldExStyle & LVS_EX_CHECKBOXES))
+ ImageList_Destroy(himl);
}
-
+
if((infoPtr->dwLvExStyle ^ dwOldExStyle) & LVS_EX_HEADERDRAGDROP)
{
DWORD dwStyle;
@@ -7805,6 +8367,16 @@ static DWORD LISTVIEW_SetExtendedListViewStyle(LISTVIEW_INFO *infoPtr, DWORD dwM
LISTVIEW_SetBkColor(infoPtr, CLR_NONE);
}
+ if((infoPtr->dwLvExStyle ^ dwOldExStyle) & LVS_EX_HEADERINALLVIEWS)
+ {
+ if (infoPtr->dwLvExStyle & LVS_EX_HEADERINALLVIEWS)
+ LISTVIEW_CreateHeader(infoPtr);
+ else
+ ShowWindow(infoPtr->hwndHeader, SW_HIDE);
+ LISTVIEW_UpdateSize(infoPtr);
+ LISTVIEW_UpdateScroll(infoPtr);
+ }
+
LISTVIEW_InvalidateList(infoPtr);
return dwOldExStyle;
}
@@ -8105,34 +8677,35 @@ static BOOL LISTVIEW_SetItemCount(LISTVIEW_INFO *infoPtr, INT nItems, DWORD dwFl
* SUCCESS : TRUE
* FAILURE : FALSE
*/
-static BOOL LISTVIEW_SetItemPosition(LISTVIEW_INFO *infoPtr, INT nItem, POINT pt)
+static BOOL LISTVIEW_SetItemPosition(LISTVIEW_INFO *infoPtr, INT nItem, POINT *pt)
{
- POINT Origin;
+ POINT Origin, Pt;
- TRACE("(nItem=%d, &pt=%s\n", nItem, wine_dbgstr_point(&pt));
+ TRACE("(nItem=%d, pt=%s\n", nItem, wine_dbgstr_point(pt));
- if (nItem < 0 || nItem >= infoPtr->nItemCount ||
+ if (!pt || nItem < 0 || nItem >= infoPtr->nItemCount ||
!(infoPtr->uView == LV_VIEW_ICON || infoPtr->uView == LV_VIEW_SMALLICON)) return FALSE;
+ Pt = *pt;
LISTVIEW_GetOrigin(infoPtr, &Origin);
/* This point value seems to be an undocumented feature.
* The best guess is that it means either at the origin,
* or at true beginning of the list. I will assume the origin. */
- if ((pt.x == -1) && (pt.y == -1))
- pt = Origin;
+ if ((Pt.x == -1) && (Pt.y == -1))
+ Pt = Origin;
if (infoPtr->uView == LV_VIEW_ICON)
{
- pt.x -= (infoPtr->nItemWidth - infoPtr->iconSize.cx) / 2;
- pt.y -= ICON_TOP_PADDING;
+ Pt.x -= (infoPtr->nItemWidth - infoPtr->iconSize.cx) / 2;
+ Pt.y -= ICON_TOP_PADDING;
}
- pt.x -= Origin.x;
- pt.y -= Origin.y;
+ Pt.x -= Origin.x;
+ Pt.y -= Origin.y;
infoPtr->bAutoarrange = FALSE;
- return LISTVIEW_MoveIconTo(infoPtr, nItem, &pt, FALSE);
+ return LISTVIEW_MoveIconTo(infoPtr, nItem, &Pt, FALSE);
}
/***
@@ -8671,7 +9244,7 @@ static LRESULT LISTVIEW_NCCreate(HWND hwnd, const CREATESTRUCTW *lpcs)
infoPtr->iconSpacing.cy = GetSystemMetrics(SM_CYICONSPACING);
infoPtr->nEditLabelItem = -1;
infoPtr->nLButtonDownItem = -1;
- infoPtr->dwHoverTime = -1; /* default system hover time */
+ infoPtr->dwHoverTime = HOVER_DEFAULT; /* default system hover time */
infoPtr->nMeasureItemHeight = 0;
infoPtr->xTrackLine = -1; /* no track line */
infoPtr->itemEdit.fEnabled = FALSE;
@@ -8728,7 +9301,7 @@ static LRESULT LISTVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs)
map_style_view(infoPtr);
infoPtr->notifyFormat = SendMessageW(infoPtr->hwndNotify, WM_NOTIFYFORMAT,
- (WPARAM)infoPtr->hwndSelf, (LPARAM)NF_QUERY);
+ (WPARAM)infoPtr->hwndSelf, NF_QUERY);
/* on error defaulting to ANSI notifications */
if (infoPtr->notifyFormat == 0) infoPtr->notifyFormat = NFR_ANSI;
@@ -8772,10 +9345,14 @@ static LRESULT LISTVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs)
* Success: 0
* Failure: -1
*/
-static LRESULT LISTVIEW_Destroy(const LISTVIEW_INFO *infoPtr)
+static LRESULT LISTVIEW_Destroy(LISTVIEW_INFO *infoPtr)
{
HTHEME theme = GetWindowTheme(infoPtr->hwndSelf);
CloseThemeData(theme);
+
+ /* delete all items */
+ LISTVIEW_DeleteAllItems(infoPtr, TRUE);
+
return 0;
}
@@ -8791,7 +9368,7 @@ static LRESULT LISTVIEW_Destroy(const LISTVIEW_INFO *infoPtr)
* SUCCESS : TRUE
* FAILURE : FALSE
*/
-static BOOL LISTVIEW_Enable(const LISTVIEW_INFO *infoPtr, BOOL bEnable)
+static BOOL LISTVIEW_Enable(const LISTVIEW_INFO *infoPtr)
{
if (infoPtr->dwStyle & LVS_OWNERDRAWFIXED)
InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
@@ -9045,37 +9622,32 @@ static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *infoPtr, INT nScrollCode,
scrollInfo.fMask = SIF_POS;
scrollInfo.nPos = nNewScrollPos;
nNewScrollPos = SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo, TRUE);
-
+
/* carry on only if it really changed */
if (nNewScrollPos == nOldScrollPos) return 0;
-
- if (infoPtr->uView == LV_VIEW_DETAILS)
- LISTVIEW_UpdateHeaderSize(infoPtr, nNewScrollPos);
-
+
+ if (infoPtr->hwndHeader) LISTVIEW_UpdateHeaderSize(infoPtr, nNewScrollPos);
+
/* now adjust to client coordinates */
nScrollDiff = nOldScrollPos - nNewScrollPos;
if (infoPtr->uView == LV_VIEW_LIST) nScrollDiff *= infoPtr->nItemWidth;
-
+
/* and scroll the window */
scroll_list(infoPtr, nScrollDiff, 0);
- return 0;
+ return 0;
}
static LRESULT LISTVIEW_MouseWheel(LISTVIEW_INFO *infoPtr, INT wheelDelta)
{
INT gcWheelDelta = 0;
INT pulScrollLines = 3;
- SCROLLINFO scrollInfo;
TRACE("(wheelDelta=%d)\n", wheelDelta);
SystemParametersInfoW(SPI_GETWHEELSCROLLLINES,0, &pulScrollLines, 0);
gcWheelDelta -= wheelDelta;
- scrollInfo.cbSize = sizeof(SCROLLINFO);
- scrollInfo.fMask = SIF_POS;
-
switch(infoPtr->uView)
{
case LV_VIEW_ICON:
@@ -9233,7 +9805,21 @@ static LRESULT LISTVIEW_KillFocus(LISTVIEW_INFO *infoPtr)
/* if we have a focus rectangle, get rid of it */
LISTVIEW_ShowFocusRect(infoPtr, FALSE);
-
+
+ /* if have a marquee selection, stop it */
+ if (infoPtr->bMarqueeSelect)
+ {
+ /* Remove the marquee rectangle and release our mouse capture */
+ LISTVIEW_InvalidateRect(infoPtr, &infoPtr->marqueeRect);
+ ReleaseCapture();
+
+ SetRect(&infoPtr->marqueeRect, 0, 0, 0, 0);
+
+ infoPtr->bMarqueeSelect = FALSE;
+ infoPtr->bScrolling = FALSE;
+ KillTimer(infoPtr->hwndSelf, (UINT_PTR) infoPtr);
+ }
+
/* set window focus flag */
infoPtr->bFocus = FALSE;
@@ -9312,6 +9898,8 @@ static LRESULT LISTVIEW_LButtonDown(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, IN
infoPtr->bLButtonDown = TRUE;
infoPtr->ptClickPos = pt;
infoPtr->bDragging = FALSE;
+ infoPtr->bMarqueeSelect = FALSE;
+ infoPtr->bScrolling = FALSE;
lvHitTestInfo.pt.x = x;
lvHitTestInfo.pt.y = y;
@@ -9389,6 +9977,9 @@ static LRESULT LISTVIEW_LButtonDown(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, IN
}
else
{
+ if (!infoPtr->bFocus)
+ SetFocus(infoPtr->hwndSelf);
+
/* remove all selections */
if (!(wKey & MK_CONTROL) && !(wKey & MK_SHIFT))
LISTVIEW_DeselectAll(infoPtr);
@@ -9433,9 +10024,23 @@ static LRESULT LISTVIEW_LButtonUp(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, INT
LISTVIEW_SetSelection(infoPtr, infoPtr->nLButtonDownItem);
infoPtr->nLButtonDownItem = -1;
- if (infoPtr->bDragging)
+ if (infoPtr->bDragging || infoPtr->bMarqueeSelect)
{
+ /* Remove the marquee rectangle and release our mouse capture */
+ if (infoPtr->bMarqueeSelect)
+ {
+ LISTVIEW_InvalidateRect(infoPtr, &infoPtr->marqueeDrawRect);
+ ReleaseCapture();
+ }
+
+ SetRect(&infoPtr->marqueeRect, 0, 0, 0, 0);
+ SetRect(&infoPtr->marqueeDrawRect, 0, 0, 0, 0);
+
infoPtr->bDragging = FALSE;
+ infoPtr->bMarqueeSelect = FALSE;
+ infoPtr->bScrolling = FALSE;
+
+ KillTimer(infoPtr->hwndSelf, (UINT_PTR) infoPtr);
return 0;
}
@@ -9471,28 +10076,27 @@ static LRESULT LISTVIEW_LButtonUp(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, INT
*/
static LRESULT LISTVIEW_NCDestroy(LISTVIEW_INFO *infoPtr)
{
- TRACE("()\n");
+ INT i;
- /* delete all items */
- LISTVIEW_DeleteAllItems(infoPtr, TRUE);
+ TRACE("()\n");
/* destroy data structure */
DPA_Destroy(infoPtr->hdpaItems);
DPA_Destroy(infoPtr->hdpaItemIds);
DPA_Destroy(infoPtr->hdpaPosX);
DPA_Destroy(infoPtr->hdpaPosY);
+ /* columns */
+ for (i = 0; i < DPA_GetPtrCount(infoPtr->hdpaColumns); i++)
+ Free(DPA_GetPtr(infoPtr->hdpaColumns, i));
DPA_Destroy(infoPtr->hdpaColumns);
ranges_destroy(infoPtr->selectionRanges);
/* destroy image lists */
if (!(infoPtr->dwStyle & LVS_SHAREIMAGELISTS))
{
- if (infoPtr->himlNormal)
- ImageList_Destroy(infoPtr->himlNormal);
- if (infoPtr->himlSmall)
- ImageList_Destroy(infoPtr->himlSmall);
- if (infoPtr->himlState)
- ImageList_Destroy(infoPtr->himlState);
+ ImageList_Destroy(infoPtr->himlNormal);
+ ImageList_Destroy(infoPtr->himlSmall);
+ ImageList_Destroy(infoPtr->himlState);
}
/* destroy font, bkgnd brush */
@@ -9675,6 +10279,9 @@ static LRESULT LISTVIEW_HeaderNotification(LISTVIEW_INFO *infoPtr, const NMHEADE
case HDN_DIVIDERDBLCLICKW:
case HDN_DIVIDERDBLCLICKA:
+ /* FIXME: for LVS_EX_HEADERINALLVIEWS and not LV_VIEW_DETAILS
+ we should use LVSCW_AUTOSIZE_USEHEADER, helper rework or
+ split needed for that */
LISTVIEW_SetColumnWidth(infoPtr, lpnmh->iItem, LVSCW_AUTOSIZE);
notify_forward_header(infoPtr, lpnmh);
break;
@@ -9704,7 +10311,8 @@ static BOOL LISTVIEW_NCPaint(const LISTVIEW_INFO *infoPtr, HRGN region)
int cxEdge = GetSystemMetrics (SM_CXEDGE),
cyEdge = GetSystemMetrics (SM_CYEDGE);
- if (!theme) return FALSE;
+ if (!theme)
+ return DefWindowProcW (infoPtr->hwndSelf, WM_NCPAINT, (WPARAM)region, 0);
GetWindowRect(infoPtr->hwndSelf, &r);
@@ -9725,7 +10333,7 @@ static BOOL LISTVIEW_NCPaint(const LISTVIEW_INFO *infoPtr, HRGN region)
/* Call default proc to get the scrollbars etc. painted */
DefWindowProcW (infoPtr->hwndSelf, WM_NCPAINT, (WPARAM)cliprgn, 0);
- return TRUE;
+ return FALSE;
}
/***
@@ -9975,20 +10583,24 @@ static LRESULT LISTVIEW_RButtonUp(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, INT
* TRUE if cursor is set
* FALSE otherwise
*/
-static BOOL LISTVIEW_SetCursor(const LISTVIEW_INFO *infoPtr, HWND hwnd, UINT nHittest, UINT wMouseMsg)
+static BOOL LISTVIEW_SetCursor(const LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
{
LVHITTESTINFO lvHitTestInfo;
- if(!(LISTVIEW_isHotTracking(infoPtr))) return FALSE;
+ if (!LISTVIEW_IsHotTracking(infoPtr)) goto forward;
- if(!infoPtr->hHotCursor) return FALSE;
+ if (!infoPtr->hHotCursor) goto forward;
GetCursorPos(&lvHitTestInfo.pt);
- if (LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, FALSE, FALSE) < 0) return FALSE;
+ if (LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, FALSE, FALSE) < 0) goto forward;
SetCursor(infoPtr->hHotCursor);
return TRUE;
+
+forward:
+
+ return DefWindowProcW(infoPtr->hwndSelf, WM_SETCURSOR, wParam, lParam);
}
/***
@@ -10161,7 +10773,9 @@ static void LISTVIEW_UpdateSize(LISTVIEW_INFO *infoPtr)
infoPtr->rcList.bottom -= GetSystemMetrics(SM_CYHSCROLL);
infoPtr->rcList.bottom = max (infoPtr->rcList.bottom - 2, 0);
}
- else if (infoPtr->uView == LV_VIEW_DETAILS)
+
+ /* if control created invisible header isn't created */
+ if (infoPtr->hwndHeader)
{
HDLAYOUT hl;
WINDOWPOS wp;
@@ -10169,15 +10783,24 @@ static void LISTVIEW_UpdateSize(LISTVIEW_INFO *infoPtr)
hl.prc = &infoPtr->rcList;
hl.pwpos = ℘
SendMessageW( infoPtr->hwndHeader, HDM_LAYOUT, 0, (LPARAM)&hl );
- TRACE(" wp.flags=0x%08x, wp=%d,%d (%dx%d)\n", wp.flags, wp.x, wp.y, wp.cx, wp.cy);
- SetWindowPos(wp.hwnd, wp.hwndInsertAfter, wp.x, wp.y, wp.cx, wp.cy,
- wp.flags | ((infoPtr->dwStyle & LVS_NOCOLUMNHEADER)
- ? SWP_HIDEWINDOW : SWP_SHOWWINDOW));
- TRACE(" after SWP wp=%d,%d (%dx%d)\n", wp.x, wp.y, wp.cx, wp.cy);
+ TRACE(" wp.flags=0x%08x, wp=%d,%d (%dx%d)\n", wp.flags, wp.x, wp.y, wp.cx, wp.cy);
+
+ if (LISTVIEW_IsHeaderEnabled(infoPtr))
+ wp.flags |= SWP_SHOWWINDOW;
+ else
+ {
+ wp.flags |= SWP_HIDEWINDOW;
+ wp.cy = 0;
+ }
+
+ SetWindowPos(wp.hwnd, wp.hwndInsertAfter, wp.x, wp.y, wp.cx, wp.cy, wp.flags);
+ TRACE(" after SWP wp=%d,%d (%dx%d)\n", wp.x, wp.y, wp.cx, wp.cy);
infoPtr->rcList.top = max(wp.cy, 0);
- infoPtr->rcList.top += (infoPtr->dwLvExStyle & LVS_EX_GRIDLINES) ? 2 : 0;
}
+ /* extra padding for grid */
+ if (infoPtr->uView == LV_VIEW_DETAILS && infoPtr->dwLvExStyle & LVS_EX_GRIDLINES)
+ infoPtr->rcList.top += 2;
TRACE(" rcList=%s\n", wine_dbgstr_rect(&infoPtr->rcList));
}
@@ -10258,7 +10881,7 @@ static INT LISTVIEW_StyleChanged(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
LISTVIEW_UpdateItemSize(infoPtr);
}
- if (uNewView == LVS_REPORT)
+ if (uNewView == LVS_REPORT || infoPtr->dwLvExStyle & LVS_EX_HEADERINALLVIEWS)
{
if ((lpss->styleOld ^ lpss->styleNew) & LVS_NOCOLUMNHEADER)
{
@@ -10300,14 +10923,13 @@ static INT LISTVIEW_StyleChanged(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
* Processes WM_STYLECHANGING messages.
*
* PARAMETER(S):
- * [I] infoPtr : valid pointer to the listview structure
* [I] wStyleType : window style type (normal or extended)
* [I0] lpss : window style information
*
* RETURN:
* Zero
*/
-static INT LISTVIEW_StyleChanging(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
+static INT LISTVIEW_StyleChanging(WPARAM wStyleType,
STYLESTRUCT *lpss)
{
TRACE("(styletype=%lx, styleOld=0x%08x, styleNew=0x%08x)\n",
@@ -10337,7 +10959,7 @@ static INT LISTVIEW_StyleChanging(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
* RETURN:
* Zero
*/
-static LRESULT LISTVIEW_ShowWindow(LISTVIEW_INFO *infoPtr, BOOL bShown, INT iStatus)
+static LRESULT LISTVIEW_ShowWindow(LISTVIEW_INFO *infoPtr, WPARAM bShown, LPARAM iStatus)
{
/* header delayed creation */
if ((infoPtr->uView == LV_VIEW_DETAILS) && bShown)
@@ -10348,7 +10970,7 @@ static LRESULT LISTVIEW_ShowWindow(LISTVIEW_INFO *infoPtr, BOOL bShown, INT iSta
ShowWindow(infoPtr->hwndHeader, SW_SHOWNORMAL);
}
- return 0;
+ return DefWindowProcW(infoPtr->hwndSelf, WM_SHOWWINDOW, bShown, iStatus);
}
/***
@@ -10402,7 +11024,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongPtrW(hwnd, 0);
- TRACE("(uMsg=%x wParam=%lx lParam=%lx)\n", uMsg, wParam, lParam);
+ TRACE("(hwnd=%p uMsg=%x wParam=%lx lParam=%lx)\n", hwnd, uMsg, wParam, lParam);
if (!infoPtr && (uMsg != WM_NCCREATE))
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
@@ -10430,12 +11052,10 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case LVM_DELETEITEM:
return LISTVIEW_DeleteItem(infoPtr, (INT)wParam);
- case LVM_EDITLABELW:
- return (LRESULT)LISTVIEW_EditLabelT(infoPtr, (INT)wParam, TRUE);
-
case LVM_EDITLABELA:
- return (LRESULT)LISTVIEW_EditLabelT(infoPtr, (INT)wParam, FALSE);
-
+ case LVM_EDITLABELW:
+ return (LRESULT)LISTVIEW_EditLabelT(infoPtr, (INT)wParam,
+ uMsg == LVM_EDITLABELW);
/* case LVM_ENABLEGROUPVIEW: */
case LVM_ENSUREVISIBLE:
@@ -10456,10 +11076,9 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return infoPtr->uCallbackMask;
case LVM_GETCOLUMNA:
- return LISTVIEW_GetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
-
case LVM_GETCOLUMNW:
- return LISTVIEW_GetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, TRUE);
+ return LISTVIEW_GetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam,
+ uMsg == LVM_GETCOLUMNW);
case LVM_GETCOLUMNORDERARRAY:
return LISTVIEW_GetColumnOrderArray(infoPtr, (INT)wParam, (LPINT)lParam);
@@ -10507,10 +11126,8 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return FALSE;
case LVM_GETITEMA:
- return LISTVIEW_GetItemExtT(infoPtr, (LPLVITEMW)lParam, FALSE);
-
case LVM_GETITEMW:
- return LISTVIEW_GetItemExtT(infoPtr, (LPLVITEMW)lParam, TRUE);
+ return LISTVIEW_GetItemExtT(infoPtr, (LPLVITEMW)lParam, uMsg == LVM_GETITEMW);
case LVM_GETITEMCOUNT:
return infoPtr->nItemCount;
@@ -10528,10 +11145,9 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_GetItemState(infoPtr, (INT)wParam, (UINT)lParam);
case LVM_GETITEMTEXTA:
- return LISTVIEW_GetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam, FALSE);
-
case LVM_GETITEMTEXTW:
- return LISTVIEW_GetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam, TRUE);
+ return LISTVIEW_GetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam,
+ uMsg == LVM_GETITEMTEXTW);
case LVM_GETNEXTITEM:
return LISTVIEW_GetNextItem(infoPtr, (INT)wParam, LOWORD(lParam));
@@ -10558,10 +11174,9 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return infoPtr->nSelectionMark;
case LVM_GETSTRINGWIDTHA:
- return LISTVIEW_GetStringWidthT(infoPtr, (LPCWSTR)lParam, FALSE);
-
case LVM_GETSTRINGWIDTHW:
- return LISTVIEW_GetStringWidthT(infoPtr, (LPCWSTR)lParam, TRUE);
+ return LISTVIEW_GetStringWidthT(infoPtr, (LPCWSTR)lParam,
+ uMsg == LVM_GETSTRINGWIDTHW);
case LVM_GETSUBITEMRECT:
return LISTVIEW_GetSubItemRect(infoPtr, (UINT)wParam, (LPRECT)lParam);
@@ -10603,20 +11218,17 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_HitTest(infoPtr, (LPLVHITTESTINFO)lParam, FALSE, TRUE);
case LVM_INSERTCOLUMNA:
- return LISTVIEW_InsertColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
-
case LVM_INSERTCOLUMNW:
- return LISTVIEW_InsertColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, TRUE);
+ return LISTVIEW_InsertColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam,
+ uMsg == LVM_INSERTCOLUMNW);
/* case LVM_INSERTGROUP: */
/* case LVM_INSERTGROUPSORTED: */
case LVM_INSERTITEMA:
- return LISTVIEW_InsertItemT(infoPtr, (LPLVITEMW)lParam, FALSE);
-
case LVM_INSERTITEMW:
- return LISTVIEW_InsertItemT(infoPtr, (LPLVITEMW)lParam, TRUE);
+ return LISTVIEW_InsertItemT(infoPtr, (LPLVITEMW)lParam, uMsg == LVM_INSERTITEMW);
/* case LVM_INSERTMARKHITTEST: */
@@ -10655,10 +11267,9 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TRUE;
case LVM_SETCOLUMNA:
- return LISTVIEW_SetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
-
case LVM_SETCOLUMNW:
- return LISTVIEW_SetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, TRUE);
+ return LISTVIEW_SetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam,
+ uMsg == LVM_SETCOLUMNW);
case LVM_SETCOLUMNORDERARRAY:
return LISTVIEW_SetColumnOrderArray(infoPtr, (INT)wParam, (LPINT)lParam);
@@ -10680,7 +11291,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_SetHotItem(infoPtr, (INT)wParam);
case LVM_SETHOVERTIME:
- return LISTVIEW_SetHoverTime(infoPtr, (DWORD)wParam);
+ return LISTVIEW_SetHoverTime(infoPtr, (DWORD)lParam);
case LVM_SETICONSPACING:
return LISTVIEW_SetIconSpacing(infoPtr, (short)LOWORD(lParam), (short)HIWORD(lParam));
@@ -10709,22 +11320,20 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
POINT pt;
pt.x = (short)LOWORD(lParam);
pt.y = (short)HIWORD(lParam);
- return LISTVIEW_SetItemPosition(infoPtr, (INT)wParam, pt);
+ return LISTVIEW_SetItemPosition(infoPtr, (INT)wParam, &pt);
}
case LVM_SETITEMPOSITION32:
- if (lParam == 0) return FALSE;
- return LISTVIEW_SetItemPosition(infoPtr, (INT)wParam, *((POINT*)lParam));
+ return LISTVIEW_SetItemPosition(infoPtr, (INT)wParam, (POINT*)lParam);
case LVM_SETITEMSTATE:
if (lParam == 0) return FALSE;
return LISTVIEW_SetItemState(infoPtr, (INT)wParam, (LPLVITEMW)lParam);
case LVM_SETITEMTEXTA:
- return LISTVIEW_SetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam, FALSE);
-
case LVM_SETITEMTEXTW:
- return LISTVIEW_SetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam, TRUE);
+ return LISTVIEW_SetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam,
+ uMsg == LVM_SETITEMTEXTW);
/* case LVM_SETOUTLINECOLOR: */
@@ -10759,11 +11368,9 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/* case LVM_SORTGROUPS: */
case LVM_SORTITEMS:
- return LISTVIEW_SortItems(infoPtr, (PFNLVCOMPARE)lParam, (LPARAM)wParam, FALSE);
-
case LVM_SORTITEMSEX:
- return LISTVIEW_SortItems(infoPtr, (PFNLVCOMPARE)lParam, (LPARAM)wParam, TRUE);
-
+ return LISTVIEW_SortItems(infoPtr, (PFNLVCOMPARE)lParam, wParam,
+ uMsg == LVM_SORTITEMSEX);
case LVM_SUBITEMHITTEST:
return LISTVIEW_HitTest(infoPtr, (LPLVHITTESTINFO)lParam, TRUE, FALSE);
@@ -10792,7 +11399,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_Destroy(infoPtr);
case WM_ENABLE:
- return LISTVIEW_Enable(infoPtr, (BOOL)wParam);
+ return LISTVIEW_Enable(infoPtr);
case WM_ERASEBKGND:
return LISTVIEW_EraseBkgnd(infoPtr, (HDC)wParam);
@@ -10825,15 +11432,13 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_MouseMove (infoPtr, (WORD)wParam, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam));
case WM_MOUSEHOVER:
- return LISTVIEW_MouseHover(infoPtr, (WORD)wParam, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam));
+ return LISTVIEW_MouseHover(infoPtr, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam));
case WM_NCDESTROY:
return LISTVIEW_NCDestroy(infoPtr);
case WM_NCPAINT:
- if (LISTVIEW_NCPaint(infoPtr, (HRGN)wParam))
- return 0;
- goto fwd_msg;
+ return LISTVIEW_NCPaint(infoPtr, (HRGN)wParam);
case WM_NOTIFY:
if (lParam && ((LPNMHDR)lParam)->hwndFrom == infoPtr->hwndHeader)
@@ -10859,9 +11464,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_RButtonUp(infoPtr, (WORD)wParam, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam));
case WM_SETCURSOR:
- if(LISTVIEW_SetCursor(infoPtr, (HWND)wParam, LOWORD(lParam), HIWORD(lParam)))
- return TRUE;
- goto fwd_msg;
+ return LISTVIEW_SetCursor(infoPtr, wParam, lParam);
case WM_SETFOCUS:
return LISTVIEW_SetFocus(infoPtr, (HWND)wParam);
@@ -10873,8 +11476,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_SetRedraw(infoPtr, (BOOL)wParam);
case WM_SHOWWINDOW:
- LISTVIEW_ShowWindow(infoPtr, (BOOL)wParam, (INT)lParam);
- return DefWindowProcW(hwnd, uMsg, wParam, lParam);
+ return LISTVIEW_ShowWindow(infoPtr, wParam, lParam);
case WM_SIZE:
return LISTVIEW_Size(infoPtr, (short)LOWORD(lParam), (short)HIWORD(lParam));
@@ -10883,7 +11485,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_StyleChanged(infoPtr, wParam, (LPSTYLESTRUCT)lParam);
case WM_STYLECHANGING:
- return LISTVIEW_StyleChanging(infoPtr, wParam, (LPSTYLESTRUCT)lParam);
+ return LISTVIEW_StyleChanging(wParam, (LPSTYLESTRUCT)lParam);
case WM_SYSCOLORCHANGE:
COMCTL32_RefreshSysColors();
@@ -10923,8 +11525,6 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
if ((uMsg >= WM_USER) && (uMsg < WM_APP) && !COMCTL32_IsReflectedMessage(uMsg))
ERR("unknown msg %04x wp=%08lx lp=%08lx\n", uMsg, wParam, lParam);
- fwd_msg:
- /* call default window procedure */
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}
@@ -10984,6 +11584,11 @@ void LISTVIEW_Unregister(void)
*/
static LRESULT LISTVIEW_Command(LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
{
+
+ TRACE("(%p %x %x %lx)\n", infoPtr, HIWORD(wParam), LOWORD(wParam), lParam);
+
+ if (!infoPtr->hwndEdit) return 0;
+
switch (HIWORD(wParam))
{
case EN_UPDATE:
@@ -11003,7 +11608,7 @@ static LRESULT LISTVIEW_Command(LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lP
/* Select font to get the right dimension of the string */
hFont = (HFONT)SendMessageW(infoPtr->hwndEdit, WM_GETFONT, 0, 0);
- if(hFont != 0)
+ if (hFont)
{
hOldFont = SelectObject(hdc, hFont);
}
@@ -11016,16 +11621,10 @@ static LRESULT LISTVIEW_Command(LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lP
GetTextMetricsW(hdc, &textMetric);
sz.cx += (textMetric.tmMaxCharWidth * 2);
- SetWindowPos (
- infoPtr->hwndEdit,
- HWND_TOP,
- 0,
- 0,
- sz.cx,
- rect.bottom - rect.top,
- SWP_DRAWFRAME|SWP_NOMOVE);
+ SetWindowPos(infoPtr->hwndEdit, NULL, 0, 0, sz.cx,
+ rect.bottom - rect.top, SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOZORDER);
}
- if(hFont != 0)
+ if (hFont)
SelectObject(hdc, hOldFont);
ReleaseDC(infoPtr->hwndEdit, hdc);
@@ -11035,6 +11634,7 @@ static LRESULT LISTVIEW_Command(LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lP
case EN_KILLFOCUS:
{
LISTVIEW_CancelEditLabel(infoPtr);
+ break;
}
default:
@@ -11043,133 +11643,3 @@ static LRESULT LISTVIEW_Command(LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lP
return 0;
}
-
-
-/***
- * DESCRIPTION:
- * Subclassed edit control windproc function
- *
- * PARAMETER(S):
- * [I] hwnd : the edit window handle
- * [I] uMsg : the message that is to be processed
- * [I] wParam : first message parameter
- * [I] lParam : second message parameter
- * [I] isW : TRUE if input is Unicode
- *
- * RETURN:
- * Zero.
- */
-static LRESULT EditLblWndProcT(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL isW)
-{
- LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongPtrW(GetParent(hwnd), 0);
- BOOL save = TRUE;
-
- TRACE("(hwnd=%p, uMsg=%x, wParam=%lx, lParam=%lx, isW=%d)\n",
- hwnd, uMsg, wParam, lParam, isW);
-
- switch (uMsg)
- {
- case WM_GETDLGCODE:
- return DLGC_WANTARROWS | DLGC_WANTALLKEYS;
-
- case WM_DESTROY:
- {
- WNDPROC editProc = infoPtr->EditWndProc;
- infoPtr->EditWndProc = 0;
- SetWindowLongPtrW(hwnd, GWLP_WNDPROC, (DWORD_PTR)editProc);
- return CallWindowProcT(editProc, hwnd, uMsg, wParam, lParam, isW);
- }
-
- case WM_KEYDOWN:
- if (VK_ESCAPE == (INT)wParam)
- {
- save = FALSE;
- break;
- }
- else if (VK_RETURN == (INT)wParam)
- break;
-
- default:
- return CallWindowProcT(infoPtr->EditWndProc, hwnd, uMsg, wParam, lParam, isW);
- }
-
- /* kill the edit */
- if (infoPtr->hwndEdit)
- LISTVIEW_EndEditLabelT(infoPtr, save, isW);
-
- SendMessageW(hwnd, WM_CLOSE, 0, 0);
- return 0;
-}
-
-/***
- * DESCRIPTION:
- * Subclassed edit control Unicode windproc function
- *
- * PARAMETER(S):
- * [I] hwnd : the edit window handle
- * [I] uMsg : the message that is to be processed
- * [I] wParam : first message parameter
- * [I] lParam : second message parameter
- *
- * RETURN:
- */
-static LRESULT CALLBACK EditLblWndProcW(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
- return EditLblWndProcT(hwnd, uMsg, wParam, lParam, TRUE);
-}
-
-/***
- * DESCRIPTION:
- * Subclassed edit control ANSI windproc function
- *
- * PARAMETER(S):
- * [I] hwnd : the edit window handle
- * [I] uMsg : the message that is to be processed
- * [I] wParam : first message parameter
- * [I] lParam : second message parameter
- *
- * RETURN:
- */
-static LRESULT CALLBACK EditLblWndProcA(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
- return EditLblWndProcT(hwnd, uMsg, wParam, lParam, FALSE);
-}
-
-/***
- * DESCRIPTION:
- * Creates a subclassed edit control
- *
- * PARAMETER(S):
- * [I] infoPtr : valid pointer to the listview structure
- * [I] text : initial text for the edit
- * [I] style : the window style
- * [I] isW : TRUE if input is Unicode
- *
- * RETURN:
- */
-static HWND CreateEditLabelT(LISTVIEW_INFO *infoPtr, LPCWSTR text, DWORD style, BOOL isW)
-{
- WCHAR editName[5] = { 'E', 'd', 'i', 't', '\0' };
- HWND hedit;
- HINSTANCE hinst = (HINSTANCE)GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_HINSTANCE);
-
- TRACE("(text=%s, ..., isW=%d)\n", debugtext_t(text, isW), isW);
-
- style |= WS_CHILDWINDOW|WS_CLIPSIBLINGS|ES_LEFT|ES_AUTOHSCROLL|WS_BORDER;
-
- /* Window will be resized and positioned after LVN_BEGINLABELEDIT */
- if (isW)
- hedit = CreateWindowW(editName, text, style, 0, 0, 0, 0, infoPtr->hwndSelf, 0, hinst, 0);
- else
- hedit = CreateWindowA("Edit", (LPCSTR)text, style, 0, 0, 0, 0, infoPtr->hwndSelf, 0, hinst, 0);
-
- if (!hedit) return 0;
-
- infoPtr->EditWndProc = (WNDPROC)
- (isW ? SetWindowLongPtrW(hedit, GWLP_WNDPROC, (DWORD_PTR)EditLblWndProcW) :
- SetWindowLongPtrA(hedit, GWLP_WNDPROC, (DWORD_PTR)EditLblWndProcA) );
-
- SendMessageW(hedit, WM_SETFONT, (WPARAM)infoPtr->hFont, FALSE);
-
- return hedit;
-}
diff --git a/dll/win32/comdlg32/comdlg32.rbuild b/dll/win32/comdlg32/comdlg32.rbuild
index d9ea84d9e28..70c0322000f 100644
--- a/dll/win32/comdlg32/comdlg32.rbuild
+++ b/dll/win32/comdlg32/comdlg32.rbuild
@@ -1,7 +1,7 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/crypt32/cert.c b/dll/win32/crypt32/cert.c
index c25e612574f..12c013e7a4a 100644
--- a/dll/win32/crypt32/cert.c
+++ b/dll/win32/crypt32/cert.c
@@ -113,9 +113,21 @@ BOOL WINAPI CertAddCertificateLinkToStore(HCERTSTORE hCertStore,
PCCERT_CONTEXT pCertContext, DWORD dwAddDisposition,
PCCERT_CONTEXT *ppCertContext)
{
- FIXME("(%p, %p, %08x, %p)\n", hCertStore, pCertContext, dwAddDisposition,
- ppCertContext);
- return FALSE;
+ static int calls;
+ PWINECRYPT_CERTSTORE store = (PWINECRYPT_CERTSTORE)hCertStore;
+
+ if (!(calls++))
+ FIXME("(%p, %p, %08x, %p): semi-stub\n", hCertStore, pCertContext,
+ dwAddDisposition, ppCertContext);
+ if (store->dwMagic != WINE_CRYPTCERTSTORE_MAGIC)
+ return FALSE;
+ if (store->type == StoreTypeCollection)
+ {
+ SetLastError(E_INVALIDARG);
+ return FALSE;
+ }
+ return CertAddCertificateContextToStore(hCertStore, pCertContext,
+ dwAddDisposition, ppCertContext);
}
PCCERT_CONTEXT WINAPI CertCreateCertificateContext(DWORD dwCertEncodingType,
diff --git a/dll/win32/crypt32/chain.c b/dll/win32/crypt32/chain.c
index 1724f4254fe..e951ef8e9c5 100644
--- a/dll/win32/crypt32/chain.c
+++ b/dll/win32/crypt32/chain.c
@@ -152,6 +152,20 @@ HCERTCHAINENGINE CRYPT_CreateChainEngine(HCERTSTORE root,
return engine;
}
+typedef struct _CERT_CHAIN_ENGINE_CONFIG_NO_EXCLUSIVE_ROOT
+{
+ DWORD cbSize;
+ HCERTSTORE hRestrictedRoot;
+ HCERTSTORE hRestrictedTrust;
+ HCERTSTORE hRestrictedOther;
+ DWORD cAdditionalStore;
+ HCERTSTORE *rghAdditionalStore;
+ DWORD dwFlags;
+ DWORD dwUrlRetrievalTimeout;
+ DWORD MaximumCachedCertificates;
+ DWORD CycleDetectionModulus;
+} CERT_CHAIN_ENGINE_CONFIG_NO_EXCLUSIVE_ROOT;
+
BOOL WINAPI CertCreateCertificateChainEngine(PCERT_CHAIN_ENGINE_CONFIG pConfig,
HCERTCHAINENGINE *phChainEngine)
{
@@ -159,7 +173,8 @@ BOOL WINAPI CertCreateCertificateChainEngine(PCERT_CHAIN_ENGINE_CONFIG pConfig,
TRACE("(%p, %p)\n", pConfig, phChainEngine);
- if (pConfig->cbSize != sizeof(*pConfig))
+ if (pConfig->cbSize != sizeof(CERT_CHAIN_ENGINE_CONFIG_NO_EXCLUSIVE_ROOT)
+ && pConfig->cbSize != sizeof(CERT_CHAIN_ENGINE_CONFIG))
{
SetLastError(E_INVALIDARG);
return FALSE;
@@ -171,7 +186,10 @@ BOOL WINAPI CertCreateCertificateChainEngine(PCERT_CHAIN_ENGINE_CONFIG pConfig,
HCERTSTORE root;
HCERTCHAINENGINE engine;
- if (pConfig->hRestrictedRoot)
+ if (pConfig->cbSize >= sizeof(CERT_CHAIN_ENGINE_CONFIG) &&
+ pConfig->hExclusiveRoot)
+ root = CertDuplicateStore(pConfig->hExclusiveRoot);
+ else if (pConfig->hRestrictedRoot)
root = CertDuplicateStore(pConfig->hRestrictedRoot);
else
root = CertOpenSystemStoreW(0, rootW);
@@ -3017,7 +3035,31 @@ static BOOL match_dns_to_subject_alt_name(PCERT_EXTENSION ext,
{
TRACE_(chain)("dNSName: %s\n", debugstr_w(
subjectName->rgAltEntry[i].u.pwszDNSName));
- if (!strcmpiW(server_name,
+ if (subjectName->rgAltEntry[i].u.pwszDNSName[0] == '*')
+ {
+ LPCWSTR server_name_dot;
+
+ /* Matching a wildcard: a wildcard matches a single name
+ * component, which is terminated by a dot. RFC 1034
+ * doesn't define whether multiple wildcards are allowed,
+ * but I will assume that they are not until proven
+ * otherwise. RFC 1034 also states that 'the "*" label
+ * always matches at least one whole label and sometimes
+ * more, but always whole labels.' Native crypt32 does not
+ * match more than one label with a wildcard, so I do the
+ * same here. Thus, a wildcard only accepts the first
+ * label, then requires an exact match of the remaining
+ * string.
+ */
+ server_name_dot = strchrW(server_name, '.');
+ if (server_name_dot)
+ {
+ if (!strcmpiW(server_name_dot,
+ subjectName->rgAltEntry[i].u.pwszDNSName + 1))
+ matches = TRUE;
+ }
+ }
+ else if (!strcmpiW(server_name,
subjectName->rgAltEntry[i].u.pwszDNSName))
matches = TRUE;
}
diff --git a/dll/win32/crypt32/regstore.c b/dll/win32/crypt32/regstore.c
index 296b0c9a5b9..f4b4295835a 100644
--- a/dll/win32/crypt32/regstore.c
+++ b/dll/win32/crypt32/regstore.c
@@ -479,6 +479,10 @@ static BOOL WINAPI CRYPT_RegControl(HCERTSTORE hCertStore, DWORD dwFlags,
ret = CRYPT_RegFlushStore(store,
dwFlags & CERT_STORE_CTRL_COMMIT_FORCE_FLAG);
break;
+ case CERT_STORE_CTRL_AUTO_RESYNC:
+ FIXME("CERT_STORE_CTRL_AUTO_RESYNC: stub\n");
+ ret = TRUE;
+ break;
default:
FIXME("%d: stub\n", dwCtrlType);
ret = FALSE;
diff --git a/dll/win32/crypt32/store.c b/dll/win32/crypt32/store.c
index a8923949974..da3de5650db 100644
--- a/dll/win32/crypt32/store.c
+++ b/dll/win32/crypt32/store.c
@@ -855,7 +855,16 @@ BOOL WINAPI CertAddCertificateContextToStore(HCERTSTORE hCertStore,
TRACE("(%p, %p, %08x, %p)\n", hCertStore, pCertContext,
dwAddDisposition, ppStoreContext);
- if (dwAddDisposition != CERT_STORE_ADD_ALWAYS)
+ switch (dwAddDisposition)
+ {
+ case CERT_STORE_ADD_ALWAYS:
+ break;
+ case CERT_STORE_ADD_NEW:
+ case CERT_STORE_ADD_REPLACE_EXISTING:
+ case CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES:
+ case CERT_STORE_ADD_USE_EXISTING:
+ case CERT_STORE_ADD_NEWER:
+ case CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES:
{
BYTE hashToAdd[20];
DWORD size = sizeof(hashToAdd);
@@ -870,6 +879,12 @@ BOOL WINAPI CertAddCertificateContextToStore(HCERTSTORE hCertStore,
pCertContext->dwCertEncodingType, 0, CERT_FIND_SHA1_HASH, &blob,
NULL);
}
+ break;
+ }
+ default:
+ FIXME("Unimplemented add disposition %d\n", dwAddDisposition);
+ SetLastError(E_INVALIDARG);
+ ret = FALSE;
}
switch (dwAddDisposition)
@@ -940,10 +955,6 @@ BOOL WINAPI CertAddCertificateContextToStore(HCERTSTORE hCertStore,
else
toAdd = CertDuplicateCertificateContext(pCertContext);
break;
- default:
- FIXME("Unimplemented add disposition %d\n", dwAddDisposition);
- SetLastError(E_INVALIDARG);
- ret = FALSE;
}
if (toAdd)
diff --git a/dll/win32/devmgr/advprop.c b/dll/win32/devmgr/advprop.c
index b7c38678769..b7af67e9dc1 100644
--- a/dll/win32/devmgr/advprop.c
+++ b/dll/win32/devmgr/advprop.c
@@ -165,26 +165,6 @@ UpdateDriverDetailsDlg(IN HWND hwndDlg,
&DriverInfoData))
{
HSPFILEQ queueHandle;
- DWORD HiVal, LoVal;
- WCHAR szTime[25];
-
- HiVal = (DriverInfoData.DriverVersion >> 32);
- if (HiVal)
- {
- swprintf (szTime, L"%d.%d", HIWORD(HiVal), LOWORD(HiVal));
- LoVal = (DriverInfoData.DriverVersion & 0xFFFFFFFF);
- if (HIWORD(LoVal))
- {
- swprintf(&szTime[wcslen(szTime)], L".%d", HIWORD(LoVal));
- if (LOWORD(LoVal))
- {
- swprintf(&szTime[wcslen(szTime)], L".%d", LOWORD(LoVal));
- }
- }
- SetDlgItemTextW(hwndDlg, IDC_FILEVERSION, szTime);
- }
- SetDlgItemText(hwndDlg, IDC_FILEPROVIDER, DriverInfoData.ProviderName);
-
queueHandle = SetupOpenFileQueue();
if (queueHandle != (HSPFILEQ)INVALID_HANDLE_VALUE)
@@ -225,6 +205,15 @@ UpdateDriverDetailsDlg(IN HWND hwndDlg,
(void)ListView_SetColumn(hDriversListView,
0,
&lvc);
+
+ /* highlight the first item from list */
+ if (ListView_GetSelectedCount(hDriversListView) != 0)
+ {
+ ListView_SetItemState(hDriversListView,
+ 0,
+ LVIS_FOCUSED | LVIS_SELECTED,
+ LVIS_FOCUSED | LVIS_SELECTED);
+ }
}
}
@@ -234,6 +223,124 @@ UpdateDriverDetailsDlg(IN HWND hwndDlg,
}
+static VOID
+UpdateDriverVersionInfoDetails(IN HWND hwndDlg,
+ IN LPCWSTR lpszDriverPath)
+{
+ DWORD dwHandle;
+ DWORD dwVerInfoSize;
+ LPVOID lpData = NULL;
+ LPVOID lpInfo;
+ UINT uInfoLen;
+ DWORD dwLangId;
+ WCHAR szLangInfo[255];
+ WCHAR szLangPath[MAX_PATH];
+ LPWSTR lpCompanyName = NULL;
+ LPWSTR lpFileVersion = NULL;
+ LPWSTR lpLegalCopyright = NULL;
+ LPWSTR lpDigitalSigner = NULL;
+ UINT uBufLen;
+ WCHAR szNotAvailable[255];
+
+ /* extract version info from selected file */
+ dwVerInfoSize = GetFileVersionInfoSize(lpszDriverPath,
+ &dwHandle);
+ if (!dwVerInfoSize)
+ goto done;
+
+ lpData = HeapAlloc(GetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ dwVerInfoSize);
+ if (!lpData)
+ goto done;
+
+ if (!GetFileVersionInfo(lpszDriverPath,
+ dwHandle,
+ dwVerInfoSize,
+ lpData))
+ goto done;
+
+ if (!VerQueryValue(lpData,
+ L"\\VarFileInfo\\Translation",
+ &lpInfo,
+ &uInfoLen))
+ goto done;
+
+ dwLangId = *(LPDWORD)lpInfo;
+ swprintf(szLangInfo, L"\\StringFileInfo\\%04x%04x\\",
+ LOWORD(dwLangId), HIWORD(dwLangId));
+
+ /* read CompanyName */
+ wcscpy(szLangPath, szLangInfo);
+ wcscat(szLangPath, L"CompanyName");
+
+ VerQueryValue(lpData,
+ szLangPath,
+ (void **)&lpCompanyName,
+ (PUINT)&uBufLen);
+
+ /* read FileVersion */
+ wcscpy(szLangPath, szLangInfo);
+ wcscat(szLangPath, L"FileVersion");
+
+ VerQueryValue(lpData,
+ szLangPath,
+ (void **)&lpFileVersion,
+ (PUINT)&uBufLen);
+
+ /* read LegalTrademarks */
+ wcscpy(szLangPath, szLangInfo);
+ wcscat(szLangPath, L"LegalCopyright");
+
+ VerQueryValue(lpData,
+ szLangPath,
+ (void **)&lpLegalCopyright,
+ (PUINT)&uBufLen);
+
+ /* TODO: read digital signer info */
+
+done:
+ if (!LoadString(hDllInstance,
+ IDS_NOTAVAILABLE,
+ szNotAvailable,
+ sizeof(szNotAvailable) / sizeof(WCHAR)))
+ {
+ wcscpy(szNotAvailable, L"n/a");
+ }
+
+ /* update labels */
+ if (!lpCompanyName)
+ lpCompanyName = szNotAvailable;
+ SetDlgItemText(hwndDlg,
+ IDC_FILEPROVIDER,
+ lpCompanyName);
+
+ if (!lpFileVersion)
+ lpFileVersion = szNotAvailable;
+ SetDlgItemText(hwndDlg,
+ IDC_FILEVERSION,
+ lpFileVersion);
+
+ if (!lpLegalCopyright)
+ lpLegalCopyright = szNotAvailable;
+ SetDlgItemText(hwndDlg,
+ IDC_FILECOPYRIGHT,
+ lpLegalCopyright);
+
+ if (!lpDigitalSigner)
+ lpDigitalSigner = szNotAvailable;
+ SetDlgItemText(hwndDlg,
+ IDC_DIGITALSIGNER,
+ lpDigitalSigner);
+
+ /* release version info */
+ if (lpData)
+ HeapFree(GetProcessHeap(),
+ 0,
+ lpData);
+}
+
+
static INT_PTR
CALLBACK
DriverDetailsDlgProc(IN HWND hwndDlg,
@@ -256,6 +363,7 @@ DriverDetailsDlgProc(IN HWND hwndDlg,
switch (LOWORD(wParam))
{
case IDOK:
+ case IDCANCEL:
{
EndDialog(hwndDlg,
IDOK);
@@ -303,6 +411,53 @@ DriverDetailsDlgProc(IN HWND hwndDlg,
Ret = TRUE;
break;
}
+
+ case WM_NOTIFY:
+ {
+ LPNMHDR pnmhdr = (LPNMHDR)lParam;
+
+ switch (pnmhdr->code)
+ {
+ case LVN_ITEMCHANGED:
+ {
+ LPNMLISTVIEW pnmv = (LPNMLISTVIEW)lParam;
+ HWND hDriversListView = GetDlgItem(hwndDlg,
+ IDC_DRIVERFILES);
+
+ if (ListView_GetSelectedCount(hDriversListView) == 0)
+ {
+ /* nothing is selected - empty the labels */
+ SetDlgItemText(hwndDlg,
+ IDC_FILEPROVIDER,
+ NULL);
+ SetDlgItemText(hwndDlg,
+ IDC_FILEVERSION,
+ NULL);
+ SetDlgItemText(hwndDlg,
+ IDC_FILECOPYRIGHT,
+ NULL);
+ SetDlgItemText(hwndDlg,
+ IDC_DIGITALSIGNER,
+ NULL);
+ }
+ else if (pnmv->uNewState != 0)
+ {
+ /* extract version info and update the labels */
+ WCHAR szDriverPath[MAX_PATH];
+
+ ListView_GetItemText(hDriversListView,
+ pnmv->iItem,
+ pnmv->iSubItem,
+ szDriverPath,
+ MAX_PATH);
+
+ UpdateDriverVersionInfoDetails(hwndDlg,
+ szDriverPath);
+ }
+ }
+ }
+ break;
+ }
}
}
diff --git a/dll/win32/devmgr/devmgr.rbuild b/dll/win32/devmgr/devmgr.rbuild
index b746bd39b9c..fafa15fb898 100644
--- a/dll/win32/devmgr/devmgr.rbuild
+++ b/dll/win32/devmgr/devmgr.rbuild
@@ -5,6 +5,7 @@
setupapi
advapi32
user32
+ version
devmgr.rc
advprop.c
devprblm.c
diff --git a/dll/win32/devmgr/lang/bg-BG.rc b/dll/win32/devmgr/lang/bg-BG.rc
index 7ade5f18be8..ec278d57810 100644
--- a/dll/win32/devmgr/lang/bg-BG.rc
+++ b/dll/win32/devmgr/lang/bg-BG.rc
@@ -175,7 +175,7 @@ BEGIN
LTEXT "Ďîęŕçâŕíĺ íŕ ďîäđîáíîńňč çŕ ôŕéëîâĺňĺ íŕ âîäŕ÷ŕ.", -1, 105, 110, 141, 17, SS_NOPREFIX
END
-IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
CAPTION "Ďîäđîáíîńňčňĺ çŕ ôŕéëîâĺňĺ íŕ âîäŕ÷ŕ"
FONT 8, "MS Shell Dlg"
@@ -186,15 +186,15 @@ BEGIN
CONTROL "", IDC_DRIVERFILES, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER |
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
- LTEXT "Äîńňŕâ÷čę:", -1, 14, 134, 50, 8
- LTEXT "", IDC_FILEPROVIDER, 82, 134, 140, 8
- LTEXT "Ôŕéëîâŕ âĺđńč˙:", -1, 14, 150, 70, 16
- LTEXT "", IDC_FILEVERSION, 82, 150, 140, 8
- LTEXT "Âúçďđîčçâîäńňâĺíč ďđŕâŕ:", -1, 14, 166, 70, 16
- LTEXT "", IDC_FILECOPYRIGHT, 82, 166, 140, 8
- LTEXT "Ďîäďčńŕë öčôđîâî:", -1, 14, 182, 70, 16
- LTEXT "", IDC_DIGITALSIGNER, 82, 182, 140, 8
- PUSHBUTTON "Äîáđĺ", IDOK, 167, 228, 50, 14
+ LTEXT "Äîńňŕâ÷čę:", -1, 14, 134, 66, 8
+ EDITTEXT IDC_FILEPROVIDER, 82, 134, 140, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "Ôŕéëîâŕ âĺđńč˙:", -1, 14, 150, 66, 16
+ EDITTEXT IDC_FILEVERSION, 82, 150, 140, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "Âúçďđîčçâîäńňâĺíč ďđŕâŕ:", -1, 14, 166, 66, 16
+ EDITTEXT IDC_FILECOPYRIGHT, 82, 166, 140, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "Ďîäďčńŕë öčôđîâî:", -1, 14, 182, 66, 16
+ EDITTEXT IDC_DIGITALSIGNER, 82, 182, 140, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "Äîáđĺ", IDOK, 167, 208, 50, 14
END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
diff --git a/dll/win32/devmgr/lang/cs-CZ.rc b/dll/win32/devmgr/lang/cs-CZ.rc
index aa7a56e21c5..3716d97803d 100644
--- a/dll/win32/devmgr/lang/cs-CZ.rc
+++ b/dll/win32/devmgr/lang/cs-CZ.rc
@@ -16,7 +16,7 @@ BEGIN
IDS_LOCATIONSTR "Umístění %1!u! (%2)"
IDS_DEVCODE " (Kód %1!u!)"
IDS_DEVCODE2 " (Kód %2!u!)"
- IDS_ENABLEDEVICE "Použít toto zařízení (zapnout)"
+ IDS_ENABLEDEVICE "Používat toto zařízení (zapnout)"
IDS_DISABLEDEVICE "Nepoužívat toto zařízení (vypnout)"
IDS_UNKNOWNDEVICE "Neznámé zařízení"
IDS_NODRIVERLOADED "Pro toto zařízení nejsou nainstalovány žádné ovladače."
@@ -166,7 +166,7 @@ FONT 8, "MS Shell Dlg"
BEGIN
ICON "", IDC_DEVICON, 7, 7, 20, 20
LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
- LTEXT "Poskytovatel ovladače:", -1, 37, 39, 60, 8, SS_NOPREFIX
+ LTEXT "Zprostředkovatel:", -1, 37, 39, 60, 8, SS_NOPREFIX
EDITTEXT IDC_DRVPROVIDER, 100, 39, 146, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Datum ovladače:", -1, 37, 53, 60, 8, SS_NOPREFIX
EDITTEXT IDC_DRVDATE, 100, 53, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
@@ -178,7 +178,7 @@ BEGIN
LTEXT "Zobrazí detaily souborů ovladače.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
-IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
CAPTION "Detaily souborů ovladače"
FONT 8, "MS Shell Dlg"
@@ -189,15 +189,15 @@ BEGIN
CONTROL "", IDC_DRIVERFILES, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER |
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
- LTEXT "Poskytovatel:", -1, 14, 134, 50, 8
- LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
- LTEXT "Verze souboru:", -1, 14, 150, 50, 8
- LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
- LTEXT "Copyright:", -1, 14, 166, 50, 8
- LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
- LTEXT "Digitální podpis:", -1, 14, 182, 50, 8
- LTEXT "", IDC_DIGITALSIGNER, 66, 182, 155, 8
- PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
+ LTEXT "Zprostředkovatel:", -1, 14, 134, 66, 8
+ EDITTEXT IDC_FILEPROVIDER, 80, 134, 137, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "Verze souboru:", -1, 14, 150, 66, 8
+ EDITTEXT IDC_FILEVERSION, 80, 150, 137, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "Autorská práva:", -1, 14, 166, 66, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 80, 166, 137, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "Digitální podpis:", -1, 14, 182, 66, 8
+ EDITTEXT IDC_DIGITALSIGNER, 80, 182, 137, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "OK", IDOK, 167, 208, 50, 14
END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
diff --git a/dll/win32/devmgr/lang/de-DE.rc b/dll/win32/devmgr/lang/de-DE.rc
index 91769ff11f5..a027c814c63 100644
--- a/dll/win32/devmgr/lang/de-DE.rc
+++ b/dll/win32/devmgr/lang/de-DE.rc
@@ -176,7 +176,7 @@ BEGIN
LTEXT "Einzelheiten über die Treiberdateien anzeigen.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
-IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
CAPTION "Treiberdateidetails"
FONT 8, "MS Shell Dlg"
@@ -188,14 +188,14 @@ BEGIN
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
LTEXT "Anbieter:", -1, 14, 134, 50, 8
- LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
+ EDITTEXT IDC_FILEPROVIDER, 66, 134, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Dateiversion:", -1, 14, 150, 50, 8
- LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
+ EDITTEXT IDC_FILEVERSION, 66, 150, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Copyright:", -1, 14, 166, 50, 8
- LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 66, 166, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Signaturgeber:", -1, 14, 182, 50, 8
- LTEXT "", IDC_DIGITALSIGNER, 66, 182, 155, 8
- PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
+ EDITTEXT IDC_DIGITALSIGNER, 66, 182, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "OK", IDOK, 167, 208, 50, 14
END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
diff --git a/dll/win32/devmgr/lang/el-GR.rc b/dll/win32/devmgr/lang/el-GR.rc
index 9ccb338000f..e51db8729ed 100644
--- a/dll/win32/devmgr/lang/el-GR.rc
+++ b/dll/win32/devmgr/lang/el-GR.rc
@@ -175,7 +175,7 @@ BEGIN
LTEXT "To view details about the driver files.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
-IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
CAPTION "ËĺđôďěÝńĺéĺň Áń÷ĺßůí Ďäçăďý"
FONT 8, "MS Shell Dlg"
@@ -187,14 +187,14 @@ BEGIN
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
LTEXT "ĐńďěçčĺőôŢň:", -1, 14, 134, 50, 8
- LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
+ EDITTEXT IDC_FILEPROVIDER, 66, 134, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "¸ęäďóç áń÷ĺßďő:", -1, 14, 150, 50, 8
- LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
+ EDITTEXT IDC_FILEVERSION, 66, 150, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Äéęáéţěáôá:", -1, 14, 166, 50, 8
- LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 66, 166, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Digital Signer:", -1, 14, 182, 50, 8
- LTEXT "", IDC_DIGITALSIGNER, 66, 182, 155, 8
- PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
+ EDITTEXT IDC_DIGITALSIGNER, 66, 182, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "OK", IDOK, 167, 208, 50, 14
END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
diff --git a/dll/win32/devmgr/lang/en-US.rc b/dll/win32/devmgr/lang/en-US.rc
index 64b44f2e0af..27009dddb78 100644
--- a/dll/win32/devmgr/lang/en-US.rc
+++ b/dll/win32/devmgr/lang/en-US.rc
@@ -176,7 +176,7 @@ BEGIN
LTEXT "To view details about the driver files.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
-IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
CAPTION "Driver File Details"
FONT 8, "MS Shell Dlg"
@@ -188,14 +188,14 @@ BEGIN
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
LTEXT "Provider:", -1, 14, 134, 50, 8
- LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
+ EDITTEXT IDC_FILEPROVIDER, 66, 134, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "File version:", -1, 14, 150, 50, 8
- LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
+ EDITTEXT IDC_FILEVERSION, 66, 150, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Copyright:", -1, 14, 166, 50, 8
- LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 66, 166, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Digital Signer:", -1, 14, 182, 50, 8
- LTEXT "", IDC_DIGITALSIGNER, 66, 182, 155, 8
- PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
+ EDITTEXT IDC_DIGITALSIGNER, 66, 182, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "OK", IDOK, 167, 208, 50, 14
END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
diff --git a/dll/win32/devmgr/lang/es-ES.rc b/dll/win32/devmgr/lang/es-ES.rc
index 2b728c199e8..d3e80b4950a 100644
--- a/dll/win32/devmgr/lang/es-ES.rc
+++ b/dll/win32/devmgr/lang/es-ES.rc
@@ -94,30 +94,30 @@ END
STRINGTABLE
BEGIN
- IDS_PROP_DEVICEID "Device Instance ID"
- IDS_PROP_HARDWAREIDS "Hardware IDs"
- IDS_PROP_COMPATIBLEIDS "Compatible IDs"
- IDS_PROP_MATCHINGDEVICEID "Matching Device ID"
- IDS_PROP_SERVICE "Service"
- IDS_PROP_ENUMERATOR "Enumerator"
- IDS_PROP_CAPABILITIES "Capabilities"
- IDS_PROP_DEVNODEFLAGS "Devnode Flags"
- IDS_PROP_CONFIGFLAGS "Config Flags"
- IDS_PROP_CSCONFIGFLAGS "CSConfig Flags"
- IDS_PROP_EJECTIONRELATIONS "Ejection Relations"
- IDS_PROP_REMOVALRELATIONS "Removal Relations"
- IDS_PROP_BUSRELATIONS "Bus Relations"
- IDS_PROP_DEVUPPERFILTERS "Device Upper Filters"
- IDS_PROP_DEVLOWERFILTERS "Device Lower Filters"
- IDS_PROP_CLASSUPPERFILTERS "Class Upper Filters"
- IDS_PROP_CLASSLOWERFILTERS "Class Lower Filters"
- IDS_PROP_CLASSINSTALLER "Class Installers"
- IDS_PROP_CLASSCOINSTALLER "Class Coinstallers"
- IDS_PROP_DEVICECOINSTALLER "Device Coinstallers"
- IDS_PROP_FIRMWAREREVISION "Firmware Revision"
- IDS_PROP_CURRENTPOWERSTATE "Current Power State"
- IDS_PROP_POWERCAPABILITIES "Power Capabilities"
- IDS_PROP_POWERSTATEMAPPINGS "Power State Mappings"
+ IDS_PROP_DEVICEID "Id. de instancia de dispositivo"
+ IDS_PROP_HARDWAREIDS "Identificadores de hardware"
+ IDS_PROP_COMPATIBLEIDS "Identificadores compatibles"
+ IDS_PROP_MATCHINGDEVICEID "Id. de dispositivo coincidente"
+ IDS_PROP_SERVICE "Servicio"
+ IDS_PROP_ENUMERATOR "Enumerador"
+ IDS_PROP_CAPABILITIES "Recursos"
+ IDS_PROP_DEVNODEFLAGS "Marcadores Devnode"
+ IDS_PROP_CONFIGFLAGS "Marcadores Config"
+ IDS_PROP_CSCONFIGFLAGS "Marcadores CSConfig"
+ IDS_PROP_EJECTIONRELATIONS "Relaciones de extracción"
+ IDS_PROP_REMOVALRELATIONS "Relaciones de eliminación"
+ IDS_PROP_BUSRELATIONS "Relaciones de bus"
+ IDS_PROP_DEVUPPERFILTERS "Filtros superiores de dispositivo"
+ IDS_PROP_DEVLOWERFILTERS "Filtros inferiores de dispositivo"
+ IDS_PROP_CLASSUPPERFILTERS "Filtros superiores de clase"
+ IDS_PROP_CLASSLOWERFILTERS "Filtros inferiores de clase"
+ IDS_PROP_CLASSINSTALLER "Instaladores de clase"
+ IDS_PROP_CLASSCOINSTALLER "Coinstaladores de clase"
+ IDS_PROP_DEVICECOINSTALLER "Coinstaladores de dispositivo"
+ IDS_PROP_FIRMWAREREVISION "Revisión de firmware"
+ IDS_PROP_CURRENTPOWERSTATE "Estado actual de energía"
+ IDS_PROP_POWERCAPABILITIES "Capacidad de energía"
+ IDS_PROP_POWERSTATEMAPPINGS "Asignaciones de estado de energía"
END
IDD_HARDWARE DIALOGEX DISCARDABLE 0, 0, 300, 400
@@ -176,7 +176,7 @@ BEGIN
LTEXT "Ver detalles de los archivos del controlador.", -1, 100, 110, 150, 17, SS_NOPREFIX
END
-IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
CAPTION "Detalles de archivo de controlador"
FONT 8, "MS Shell Dlg"
@@ -188,19 +188,19 @@ BEGIN
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
LTEXT "Proveedor:", -1, 10, 134, 50, 8
- LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
+ EDITTEXT IDC_FILEPROVIDER, 66, 134, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Versión:", -1, 10, 150, 50, 8
- LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
+ EDITTEXT IDC_FILEVERSION, 66, 150, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Copyright:", -1, 10, 166, 50, 8
- LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 66, 166, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Firmante Digital:", -1, 10, 182, 60, 8
- LTEXT "", IDC_DIGITALSIGNER, 66, 182, 155, 8
- PUSHBUTTON "Aceptar", IDOK, 167, 228, 50, 14
+ EDITTEXT IDC_DIGITALSIGNER, 66, 182, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "Aceptar", IDOK, 167, 208, 50, 14
END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Details"
+CAPTION "Detalles"
FONT 8, "MS Shell Dlg"
BEGIN
ICON "", IDC_DEVICON, 7, 7, 20, 20
@@ -213,7 +213,7 @@ END
IDD_DEVICERESOURCES DIALOGEX DISCARDABLE 0, 0, 252, 218
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Resources"
+CAPTION "Recursos"
FONT 8, "MS Shell Dlg"
BEGIN
ICON "", IDC_DEVICON, 7, 7, 20, 20
@@ -222,7 +222,7 @@ END
IDD_DEVICEPOWER DIALOGEX DISCARDABLE 0, 0, 252, 218
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Power"
+CAPTION "Administración de energía"
FONT 8, "MS Shell Dlg"
BEGIN
ICON "", IDC_DEVICON, 7, 7, 20, 20
diff --git a/dll/win32/devmgr/lang/fr-FR.rc b/dll/win32/devmgr/lang/fr-FR.rc
index 1d1e580b314..697998f32bc 100644
--- a/dll/win32/devmgr/lang/fr-FR.rc
+++ b/dll/win32/devmgr/lang/fr-FR.rc
@@ -174,7 +174,7 @@ BEGIN
LTEXT "Voir les détails ŕ propos des fichiers du Pilote.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
-IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
CAPTION "Fichiers du Pilote"
FONT 8, "MS Shell Dlg"
@@ -186,14 +186,14 @@ BEGIN
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
LTEXT "Fournisseur :", -1, 14, 134, 50, 8
- LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
+ EDITTEXT IDC_FILEPROVIDER, 66, 134, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Version :", -1, 14, 150, 50, 8
- LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
+ EDITTEXT IDC_FILEVERSION, 66, 150, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Copyright :", -1, 14, 166, 50, 8
- LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 66, 166, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Signature numérique :", -1, 14, 182, 80, 8
- LTEXT "", IDC_DIGITALSIGNER, 96, 182, 125, 8
- PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
+ EDITTEXT IDC_DIGITALSIGNER, 96, 182, 125, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "OK", IDOK, 167, 208, 50, 14
END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
diff --git a/dll/win32/devmgr/lang/hu-HU.rc b/dll/win32/devmgr/lang/hu-HU.rc
index 23180c63b5c..daf66ad14ee 100644
--- a/dll/win32/devmgr/lang/hu-HU.rc
+++ b/dll/win32/devmgr/lang/hu-HU.rc
@@ -174,6 +174,28 @@ BEGIN
LTEXT "To view details about the driver files.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
+CAPTION "Driver File Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ ICON "", IDC_DEVICON, 7, 7, 20, 20
+ LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+ LTEXT "&Driver files:", -1, 7, 36, 204, 8
+ CONTROL "", IDC_DRIVERFILES, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
+ LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
+ LTEXT "Provider:", -1, 14, 134, 50, 8
+ EDITTEXT IDC_FILEPROVIDER, 66, 134, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "File version:", -1, 14, 150, 50, 8
+ EDITTEXT IDC_FILEVERSION, 66, 150, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "Copyright:", -1, 14, 166, 50, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 66, 166, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "Digital Signer:", -1, 14, 182, 50, 8
+ EDITTEXT IDC_DIGITALSIGNER, 66, 182, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "OK", IDOK, 167, 208, 50, 14
+END
+
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Details"
diff --git a/dll/win32/devmgr/lang/id-ID.rc b/dll/win32/devmgr/lang/id-ID.rc
index 3f4dc520f77..5c69016780f 100644
--- a/dll/win32/devmgr/lang/id-ID.rc
+++ b/dll/win32/devmgr/lang/id-ID.rc
@@ -175,7 +175,7 @@ BEGIN
LTEXT "Untuk melihat rincian tetang file driver.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
-IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
CAPTION "Rincian File Driver"
FONT 8, "MS Shell Dlg"
@@ -187,14 +187,14 @@ BEGIN
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
LTEXT "Penyedia:", -1, 14, 134, 50, 8
- LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
+ EDITTEXT IDC_FILEPROVIDER, 66, 134, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Versi File:", -1, 14, 150, 50, 8
- LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
+ EDITTEXT IDC_FILEVERSION, 66, 150, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Hak Cipta:", -1, 14, 166, 50, 8
- LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 66, 166, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Penanda tangan Digital:", -1, 14, 182, 50, 8
- LTEXT "", IDC_DIGITALSIGNER, 66, 182, 155, 8
- PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
+ EDITTEXT IDC_DIGITALSIGNER, 66, 182, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "OK", IDOK, 167, 208, 50, 14
END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
diff --git a/dll/win32/devmgr/lang/it-IT.rc b/dll/win32/devmgr/lang/it-IT.rc
index f024abf10d9..239ac83a5ec 100644
--- a/dll/win32/devmgr/lang/it-IT.rc
+++ b/dll/win32/devmgr/lang/it-IT.rc
@@ -175,7 +175,7 @@ BEGIN
LTEXT "Per vedere i dettagli sui file del driver.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
-IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
CAPTION "Dettagli sui file del driver"
FONT 8, "MS Shell Dlg"
@@ -187,14 +187,14 @@ BEGIN
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
LTEXT "Fornitore del Driver:", -1, 14, 134, 50, 8
- LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
+ EDITTEXT IDC_FILEPROVIDER, 66, 134, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Versione:", -1, 14, 150, 50, 8
- LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
+ EDITTEXT IDC_FILEVERSION, 66, 150, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Copyright:", -1, 14, 166, 50, 8
- LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 66, 166, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Firmatario digitale:", -1, 14, 182, 50, 8
- LTEXT "", IDC_DIGITALSIGNER, 66, 182, 155, 8
- PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
+ EDITTEXT IDC_DIGITALSIGNER, 66, 182, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "OK", IDOK, 167, 208, 50, 14
END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
diff --git a/dll/win32/devmgr/lang/no-NO.rc b/dll/win32/devmgr/lang/no-NO.rc
index a7a5a7b8a66..c46fe017818 100644
--- a/dll/win32/devmgr/lang/no-NO.rc
+++ b/dll/win32/devmgr/lang/no-NO.rc
@@ -175,7 +175,7 @@ BEGIN
LTEXT "For ĺ vise detaljer om driver filene.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
-IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
CAPTION "Driver fil detaljer"
FONT 8, "MS Shell Dlg"
@@ -187,14 +187,14 @@ BEGIN
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
LTEXT "Produsent:", -1, 14, 134, 50, 8
- LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
+ EDITTEXT IDC_FILEPROVIDER, 66, 134, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Filversjon:", -1, 14, 150, 50, 8
- LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
+ EDITTEXT IDC_FILEVERSION, 66, 150, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Opphavsrett:", -1, 14, 166, 50, 8
- LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 66, 166, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Digital signert:", -1, 14, 182, 50, 8
- LTEXT "", IDC_DIGITALSIGNER, 66, 182, 155, 8
- PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
+ EDITTEXT IDC_DIGITALSIGNER, 66, 182, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "OK", IDOK, 167, 208, 50, 14
END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
diff --git a/dll/win32/devmgr/lang/pl-PL.rc b/dll/win32/devmgr/lang/pl-PL.rc
index 59bd6ae2c09..3f71bb18ec4 100644
--- a/dll/win32/devmgr/lang/pl-PL.rc
+++ b/dll/win32/devmgr/lang/pl-PL.rc
@@ -182,6 +182,28 @@ BEGIN
LTEXT "Wyświetla informacje szczegółowe.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
+CAPTION "Driver File Details"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ ICON "", IDC_DEVICON, 7, 7, 20, 20
+ LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
+ LTEXT "&Driver files:", -1, 7, 36, 204, 8
+ CONTROL "", IDC_DRIVERFILES, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER |
+ LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
+ LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
+ LTEXT "Provider:", -1, 14, 134, 50, 8
+ EDITTEXT IDC_FILEPROVIDER, 66, 134, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "File version:", -1, 14, 150, 50, 8
+ EDITTEXT IDC_FILEVERSION, 66, 150, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "Copyright:", -1, 14, 166, 50, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 66, 166, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "Digital Signer:", -1, 14, 182, 50, 8
+ EDITTEXT IDC_DIGITALSIGNER, 66, 182, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "OK", IDOK, 167, 208, 50, 14
+END
+
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Szczegóły"
diff --git a/dll/win32/devmgr/lang/pt-BR.rc b/dll/win32/devmgr/lang/pt-BR.rc
index 5b0c477b2c0..ea9e4cc2938 100644
--- a/dll/win32/devmgr/lang/pt-BR.rc
+++ b/dll/win32/devmgr/lang/pt-BR.rc
@@ -175,7 +175,7 @@ BEGIN
LTEXT "Exibir detalhes sobre os arquivos de driver.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
-IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
CAPTION "Detalhes sobre os arquivos de driver"
FONT 8, "MS Shell Dlg"
@@ -187,14 +187,14 @@ BEGIN
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
LTEXT "Fornecedor:", -1, 14, 134, 50, 8
- LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
+ EDITTEXT IDC_FILEPROVIDER, 66, 134, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Versăo do arquivo:", -1, 14, 150, 50, 8
- LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
+ EDITTEXT IDC_FILEVERSION, 66, 150, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Direitos autorais:", -1, 14, 166, 50, 8
- LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 66, 166, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Signatário digital:", -1, 14, 182, 50, 8
- LTEXT "", IDC_DIGITALSIGNER, 66, 182, 155, 8
- PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
+ EDITTEXT IDC_DIGITALSIGNER, 66, 182, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "OK", IDOK, 167, 208, 50, 14
END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
diff --git a/dll/win32/devmgr/lang/ro-RO.rc b/dll/win32/devmgr/lang/ro-RO.rc
index 4e18c3a212a..b7b578c4e31 100644
--- a/dll/win32/devmgr/lang/ro-RO.rc
+++ b/dll/win32/devmgr/lang/ro-RO.rc
@@ -1,4 +1,4 @@
-// Romanian language resource file (Petru Dimitriu, 2009-07-15)
+// Romanian language resource file (Petru Dimitriu, 2009-07-15)
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
@@ -177,7 +177,7 @@ BEGIN
LTEXT "Pentru a vedea detalii despre fi?ierele driver.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
-IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
CAPTION "Detalii fi?iere driver"
FONT 8, "MS Shell Dlg"
@@ -189,14 +189,14 @@ BEGIN
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
LTEXT "Furnizor:", -1, 14, 134, 50, 8
- LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
+ EDITTEXT IDC_FILEPROVIDER, 66, 134, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Versiune fi?ier:", -1, 14, 150, 50, 8
- LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
+ EDITTEXT IDC_FILEVERSION, 66, 150, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Drept de autor:", -1, 14, 166, 50, 8
- LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 66, 166, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Semnatar digital:", -1, 14, 182, 50, 8
- LTEXT "", IDC_DIGITALSIGNER, 66, 182, 155, 8
- PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
+ EDITTEXT IDC_DIGITALSIGNER, 66, 182, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "OK", IDOK, 167, 208, 50, 14
END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
diff --git a/dll/win32/devmgr/lang/ru-RU.rc b/dll/win32/devmgr/lang/ru-RU.rc
index 9a417930515..8c3839826c1 100644
--- a/dll/win32/devmgr/lang/ru-RU.rc
+++ b/dll/win32/devmgr/lang/ru-RU.rc
@@ -173,7 +173,7 @@ BEGIN
LTEXT "Ďđîńěîňđ ńâĺäĺíčé î ôŕéëŕő äđŕéâĺđîâ.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
-IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
CAPTION "Ńâĺäĺíč˙ î ôŕéëŕő äđŕéâĺđîâ"
FONT 8, "MS Shell Dlg"
@@ -185,14 +185,14 @@ BEGIN
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
LTEXT "Ďîńňŕâůčę:", -1, 7, 134, 50, 8
- LTEXT "", IDC_FILEPROVIDER, 137, 134, 155, 8
+ EDITTEXT IDC_FILEPROVIDER, 137, 134, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Âĺđńč˙ ôŕéëŕ:", -1, 7, 150, 80, 8
- LTEXT "", IDC_FILEVERSION, 137, 150, 155, 8
+ EDITTEXT IDC_FILEVERSION, 137, 150, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Ŕâňîđńęčĺ ďđŕâŕ:", -1, 7, 166, 112, 8
- LTEXT "", IDC_FILECOPYRIGHT, 137, 166, 155, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 137, 166, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Öčôđîâŕ˙ ďîäďčńü:", -1, 7, 182, 125, 8
- LTEXT "", IDC_DIGITALSIGNER, 137, 182, 155, 8
- PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
+ EDITTEXT IDC_DIGITALSIGNER, 137, 182, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "OK", IDOK, 167, 208, 50, 14
END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
diff --git a/dll/win32/devmgr/lang/sk-SK.rc b/dll/win32/devmgr/lang/sk-SK.rc
index 7be94acfeb1..ae4f1bebfd7 100644
--- a/dll/win32/devmgr/lang/sk-SK.rc
+++ b/dll/win32/devmgr/lang/sk-SK.rc
@@ -16,8 +16,8 @@ BEGIN
IDS_LOCATIONSTR "Umiestnenie %1!u! (%2)"
IDS_DEVCODE " (Kód %1!u!)"
IDS_DEVCODE2 " (Kód %2!u!)"
- IDS_ENABLEDEVICE "Použiť toto zariadenie (povolené)"
- IDS_DISABLEDEVICE "Nepoužiť toto zariadenie (zakázané)"
+ IDS_ENABLEDEVICE "Používať toto zariadenie (povolené)"
+ IDS_DISABLEDEVICE "Nepoužívať toto zariadenie (zakázané)"
IDS_UNKNOWNDEVICE "Neznáme zariadenie"
IDS_NODRIVERLOADED "Pre toto zariadenie nie sú nainštalované žiadne ovládače."
IDS_DEVONPARENT "na %1"
@@ -166,19 +166,19 @@ FONT 8, "MS Shell Dlg"
BEGIN
ICON "", IDC_DEVICON, 7, 7, 20, 20
LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
- LTEXT "Poskytovateľ ovládača:", -1, 37, 39, 60, 8, SS_NOPREFIX
+ LTEXT "Sprostredkovateľ:", -1, 34, 39, 60, 8, SS_NOPREFIX
EDITTEXT IDC_DRVPROVIDER, 100, 39, 146, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
- LTEXT "Dátum ovládača:", -1, 37, 53, 60, 8, SS_NOPREFIX
+ LTEXT "Dátum ovládača:", -1, 34, 53, 60, 8, SS_NOPREFIX
EDITTEXT IDC_DRVDATE, 100, 53, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
- LTEXT "Verzia ovládača:", -1, 37, 67, 60, 8, SS_NOPREFIX
+ LTEXT "Verzia ovládača:", -1, 34, 67, 60, 8, SS_NOPREFIX
EDITTEXT IDC_DRVVERSION, 100, 67, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
- LTEXT "Digitálne podpísal:", -1, 37, 81, 60, 8, SS_NOPREFIX
+ LTEXT "Digitálne podpísal:", -1, 34, 81, 60, 8, SS_NOPREFIX
EDITTEXT IDC_DIGITALSIGNER, 100, 81, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
PUSHBUTTON "&Driver Details...", IDC_DRIVERDETAILS, 7, 106, 70, 15
LTEXT "To view details about the driver files.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
-IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
CAPTION "Detaily o súboroch ovládača"
FONT 8, "MS Shell Dlg"
@@ -189,15 +189,15 @@ BEGIN
CONTROL "", IDC_DRIVERFILES, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER |
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
- LTEXT "Poskytovateľ:", -1, 14, 134, 50, 8
- LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
- LTEXT "Verzia súboru:", -1, 14, 150, 50, 8
- LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
- LTEXT "Autorské práva:", -1, 14, 166, 50, 8
- LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
- LTEXT "Digitálne podpísal:", -1, 14, 182, 50, 8 //Digital Signer
- LTEXT "", IDC_DIGITALSIGNER, 66, 182, 155, 8
- PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
+ LTEXT "Sprostredkovateľ:", -1, 14, 134, 66, 8
+ EDITTEXT IDC_FILEPROVIDER, 80, 134, 137, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "Verzia súboru:", -1, 14, 150, 66, 8
+ EDITTEXT IDC_FILEVERSION, 80, 150, 137, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "Autorské práva:", -1, 14, 166, 66, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 80, 166, 137, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "Digitálne podpísal:", -1, 14, 182, 66, 8
+ EDITTEXT IDC_DIGITALSIGNER, 80, 182, 137, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "OK", IDOK, 167, 208, 50, 14
END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
diff --git a/dll/win32/devmgr/lang/uk-UA.rc b/dll/win32/devmgr/lang/uk-UA.rc
index 050e5207fad..2d553038c1b 100644
--- a/dll/win32/devmgr/lang/uk-UA.rc
+++ b/dll/win32/devmgr/lang/uk-UA.rc
@@ -181,7 +181,7 @@ BEGIN
LTEXT "Ďĺđĺăë˙ä âłäîěîńňĺé ďđî ôŕéëč äđŕéâĺđŕ.", -1, 91, 110, 154, 17, SS_NOPREFIX
END
-IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 250
+IDD_DRIVERDETAILS DIALOGEX DISCARDABLE 0, 0, 224, 230
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_DLGFRAME
CAPTION "Âłäîěîńňł ďđî ôŕéëč äđŕéâĺđŕ"
FONT 8, "MS Shell Dlg"
@@ -193,14 +193,14 @@ BEGIN
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
LTEXT "Ďîńňŕ÷ŕëüíčę:", -1, 14, 134, 50, 8
- LTEXT "", IDC_FILEPROVIDER, 66, 134, 155, 8
+ EDITTEXT IDC_FILEPROVIDER, 66, 134, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Âĺđńł˙ ôŕéëó:", -1, 14, 150, 50, 8
- LTEXT "", IDC_FILEVERSION, 66, 150, 155, 8
+ EDITTEXT IDC_FILEVERSION, 66, 150, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Ŕâňîđńüęł ďđŕâŕ:", -1, 14, 166, 50, 8
- LTEXT "", IDC_FILECOPYRIGHT, 66, 166, 155, 8
+ EDITTEXT IDC_FILECOPYRIGHT, 66, 166, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Öčôđîâčé ďłäďčń:", -1, 14, 182, 50, 8
- LTEXT "", IDC_DIGITALSIGNER, 66, 182, 155, 8
- PUSHBUTTON "OK", IDOK, 167, 228, 50, 14
+ EDITTEXT IDC_DIGITALSIGNER, 66, 182, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
+ DEFPUSHBUTTON "OK", IDOK, 167, 208, 50, 14
END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
diff --git a/dll/win32/dhcpcsvc/dhcpcsvc.rbuild b/dll/win32/dhcpcsvc/dhcpcsvc.rbuild
index 773c295b21c..7afd68b4775 100644
--- a/dll/win32/dhcpcsvc/dhcpcsvc.rbuild
+++ b/dll/win32/dhcpcsvc/dhcpcsvc.rbuild
@@ -7,6 +7,10 @@
iphlpapi
advapi32
oldnames
+
+
+ _tzset
+
adapter.c
alloc.c
diff --git a/dll/win32/imaadp32.acm/imaadp32.acm.rbuild b/dll/win32/imaadp32.acm/imaadp32.acm.rbuild
index f2b04bb6914..073f714f979 100644
--- a/dll/win32/imaadp32.acm/imaadp32.acm.rbuild
+++ b/dll/win32/imaadp32.acm/imaadp32.acm.rbuild
@@ -1,4 +1,4 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/inetmib1/inetmib1.rbuild b/dll/win32/inetmib1/inetmib1.rbuild
index 77c39b582a1..27079b19c05 100644
--- a/dll/win32/inetmib1/inetmib1.rbuild
+++ b/dll/win32/inetmib1/inetmib1.rbuild
@@ -1,7 +1,7 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/iphlpapi/iphlpapi_main.c b/dll/win32/iphlpapi/iphlpapi_main.c
index 3fd68560c17..8508d2d416a 100644
--- a/dll/win32/iphlpapi/iphlpapi_main.c
+++ b/dll/win32/iphlpapi/iphlpapi_main.c
@@ -63,7 +63,6 @@ typedef struct _NAME_SERVER_LIST_CONTEXT {
BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
- DWORD Version;
switch (fdwReason) {
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls( hinstDLL );
diff --git a/dll/win32/jscript/dispex.c b/dll/win32/jscript/dispex.c
index 6894eae0515..07880bcff5b 100644
--- a/dll/win32/jscript/dispex.c
+++ b/dll/win32/jscript/dispex.c
@@ -358,6 +358,9 @@ static HRESULT prop_put(DispatchEx *This, dispex_prop_t *prop, VARIANT *val,
{
HRESULT hres;
+ if(prop->flags & PROPF_CONST)
+ return S_OK;
+
switch(prop->type) {
case PROP_BUILTIN:
if(!(prop->flags & PROPF_METHOD)) {
@@ -974,6 +977,18 @@ HRESULT jsdisp_propput_name(DispatchEx *obj, const WCHAR *name, VARIANT *val, js
return prop_put(obj, prop, val, ei, caller);
}
+HRESULT jsdisp_propput_const(DispatchEx *obj, const WCHAR *name, VARIANT *val)
+{
+ dispex_prop_t *prop;
+ HRESULT hres;
+
+ hres = ensure_prop_name(obj, name, FALSE, PROPF_ENUM|PROPF_CONST, &prop);
+ if(FAILED(hres))
+ return hres;
+
+ return VariantCopy(&prop->u.var, val);
+}
+
HRESULT jsdisp_propput_idx(DispatchEx *obj, DWORD idx, VARIANT *val, jsexcept_t *ei, IServiceProvider *caller)
{
WCHAR buf[12];
diff --git a/dll/win32/jscript/function.c b/dll/win32/jscript/function.c
index c7494cfce6c..df46f1d996d 100644
--- a/dll/win32/jscript/function.c
+++ b/dll/win32/jscript/function.c
@@ -606,7 +606,16 @@ HRESULT create_builtin_function(script_ctx_t *ctx, builtin_invoke_t value_proc,
if(FAILED(hres))
return hres;
- hres = set_prototype(ctx, &function->dispex, prototype);
+ if(builtin_info) {
+ VARIANT var;
+
+ V_VT(&var) = VT_I4;
+ V_I4(&var) = function->length;
+ hres = jsdisp_propput_const(&function->dispex, lengthW, &var);
+ }
+
+ if(SUCCEEDED(hres))
+ hres = set_prototype(ctx, &function->dispex, prototype);
if(FAILED(hres)) {
jsdisp_release(&function->dispex);
return hres;
diff --git a/dll/win32/jscript/global.c b/dll/win32/jscript/global.c
index af142ed4db3..92a0cbecd61 100644
--- a/dll/win32/jscript/global.c
+++ b/dll/win32/jscript/global.c
@@ -550,7 +550,7 @@ static HRESULT JSGlobal_parseFloat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
LONGLONG d = 0, hlp;
- int exp = 0, length;
+ int exp = 0;
VARIANT *arg;
WCHAR *str;
BSTR val_str = NULL;
@@ -569,7 +569,6 @@ static HRESULT JSGlobal_parseFloat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag
return hres;
str = val_str;
- length = SysStringLen(val_str);
while(isspaceW(*str)) str++;
diff --git a/dll/win32/jscript/jscript.c b/dll/win32/jscript/jscript.c
index 9a516aa5d71..c7c77e3aa39 100644
--- a/dll/win32/jscript/jscript.c
+++ b/dll/win32/jscript/jscript.c
@@ -71,6 +71,7 @@ void script_release(script_ctx_t *ctx)
return;
jsheap_free(&ctx->tmp_heap);
+ SysFreeString(ctx->last_match);
heap_free(ctx);
}
diff --git a/dll/win32/jscript/jscript.h b/dll/win32/jscript/jscript.h
index c1c8e60f35b..901f25d8b08 100644
--- a/dll/win32/jscript/jscript.h
+++ b/dll/win32/jscript/jscript.h
@@ -68,6 +68,7 @@ extern HINSTANCE jscript_hinstance;
#define PROPF_METHOD 0x0100
#define PROPF_ENUM 0x0200
#define PROPF_CONSTR 0x0400
+#define PROPF_CONST 0x0800
/* NOTE: Keep in sync with names in Object.toString implementation */
typedef enum {
@@ -203,6 +204,7 @@ HRESULT disp_propget(script_ctx_t*,IDispatch*,DISPID,VARIANT*,jsexcept_t*,IServi
HRESULT disp_propput(script_ctx_t*,IDispatch*,DISPID,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_propget(DispatchEx*,DISPID,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_propput_name(DispatchEx*,const WCHAR*,VARIANT*,jsexcept_t*,IServiceProvider*);
+HRESULT jsdisp_propput_const(DispatchEx*,const WCHAR*,VARIANT*);
HRESULT jsdisp_propput_idx(DispatchEx*,DWORD,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_propget_name(DispatchEx*,LPCWSTR,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_get_idx(DispatchEx*,DWORD,VARIANT*,jsexcept_t*,IServiceProvider*);
@@ -270,6 +272,10 @@ struct _script_ctx_t {
IDispatch *host_global;
+ BSTR last_match;
+ DWORD last_match_index;
+ DWORD last_match_length;
+
DispatchEx *global;
DispatchEx *function_constr;
DispatchEx *activex_constr;
@@ -318,8 +324,9 @@ typedef struct {
DWORD len;
} match_result_t;
-#define REM_CHECK_GLOBAL 0x0001
-#define REM_RESET_INDEX 0x0002
+#define REM_CHECK_GLOBAL 0x0001
+#define REM_RESET_INDEX 0x0002
+#define REM_NO_CTX_UPDATE 0x0004
HRESULT regexp_match_next(script_ctx_t*,DispatchEx*,DWORD,const WCHAR*,DWORD,const WCHAR**,match_result_t**,
DWORD*,DWORD*,match_result_t*);
HRESULT regexp_match(script_ctx_t*,DispatchEx*,const WCHAR*,DWORD,BOOL,match_result_t**,DWORD*);
diff --git a/dll/win32/jscript/jscript_Nl.rc b/dll/win32/jscript/jscript_Nl.rc
index c4f761a3922..fec11a08000 100644
--- a/dll/win32/jscript/jscript_Nl.rc
+++ b/dll/win32/jscript/jscript_Nl.rc
@@ -20,10 +20,13 @@
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
STRINGTABLE DISCARDABLE
{
IDS_TO_PRIMITIVE "Fout bij het omzetten van het object naar een primitief type"
IDS_INVALID_CALL_ARG "Ongeldige procedure-aanroep of argument"
+ IDS_CREATE_OBJ_ERROR "Automatiseringsserver kan het object niet creëren"
IDS_NO_PROPERTY "Dit object ondersteunt deze eigenschap of methode niet"
IDS_ARG_NOT_OPT "Argument is niet optioneel"
IDS_SYNTAX_ERROR "Syntax fout"
@@ -40,6 +43,7 @@ STRINGTABLE DISCARDABLE
IDS_NOT_BOOL "Boolean object verwacht"
IDS_JSCRIPT_EXPECTED "JScript object verwacht"
IDS_REGEXP_SYNTAX_ERROR "Syntax fout in reguliere expressie"
+ IDS_URI_INVALID_CHAR "De te coderen URI bevat ongeldige tekens"
IDS_INVALID_LENGTH "Array lengte moet een eindig, positief geheel getal zijn"
IDS_ARRAY_EXPECTED "Array object verwacht"
}
diff --git a/dll/win32/jscript/jscript_Si.rc b/dll/win32/jscript/jscript_Si.rc
new file mode 100644
index 00000000000..0ddeab117e6
--- /dev/null
+++ b/dll/win32/jscript/jscript_Si.rc
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2010 Matej Spindler
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "resource.h"
+
+#pragma code_page(65001)
+
+LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_TO_PRIMITIVE "Napaka med spreminjanjem v primitivni tip"
+ IDS_INVALID_CALL_ARG "NapaÄŤen klic postopka ali argument"
+ IDS_CREATE_OBJ_ERROR "Avtomatizacijski server ne more ustvariti objekta"
+ IDS_NO_PROPERTY "Objekt ne podpira atributa ali metode"
+ IDS_ARG_NOT_OPT "Argument je obvezen"
+ IDS_SYNTAX_ERROR "NapaÄŤna sintaksa"
+ IDS_SEMICOLON "PriÄŤakujem ';'"
+ IDS_LBRACKET "PriÄŤakujem '('"
+ IDS_RBRACKET "PriÄŤakujem ')'"
+ IDS_UNTERMINATED_STR "NezakljuÄŤen niz"
+ IDS_NOT_FUNC "PriÄŤakujem funkcijo"
+ IDS_NOT_DATE "'[object]' ni date objekt"
+ IDS_NOT_NUM "Pričakujem število"
+ IDS_OBJECT_EXPECTED "PriÄŤakujem objekt"
+ IDS_ILLEGAL_ASSIGN "NapaÄŤna prireditev"
+ IDS_UNDEFINED "'|' je nedifiniran"
+ IDS_NOT_BOOL "PriÄŤakujem Boolean objekt"
+ IDS_JSCRIPT_EXPECTED "PriÄŤakujem JScript objekt"
+ IDS_REGEXP_SYNTAX_ERROR "NapaÄŤna sintaksa v regularnem izrazu"
+ IDS_URI_INVALID_CHAR "URI vsebuje neveljavne znake"
+ IDS_INVALID_LENGTH "Dožina polja mora bit pozitivno celo število"
+ IDS_ARRAY_EXPECTED "PriÄŤakujem Array objekt"
+}
diff --git a/dll/win32/jscript/regexp.c b/dll/win32/jscript/regexp.c
index 7861d229826..fb541891a56 100644
--- a/dll/win32/jscript/regexp.c
+++ b/dll/win32/jscript/regexp.c
@@ -96,6 +96,12 @@ static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
static const WCHAR execW[] = {'e','x','e','c',0};
static const WCHAR testW[] = {'t','e','s','t',0};
+static const WCHAR leftContextW[] =
+ {'l','e','f','t','C','o','n','t','e','x','t',0};
+static const WCHAR rightContextW[] =
+ {'r','i','g','h','t','C','o','n','t','e','x','t',0};
+
+static const WCHAR undefinedW[] = {'u','n','d','e','f','i','n','e','d',0};
static const WCHAR emptyW[] = {0};
/* FIXME: Better error handling */
@@ -1977,7 +1983,7 @@ PushBackTrackState(REGlobalData *gData, REOp op,
ptrdiff_t btincr = ((char *)result + sz) -
((char *)gData->backTrackStack + btsize);
- TRACE("\tBT_Push: %lu,%lu\n", (unsigned long) parenIndex, (unsigned long) parenCount);
+ TRACE("\tBT_Push: %lu,%lu\n", (ULONG_PTR)parenIndex, (ULONG_PTR)parenCount);
JS_COUNT_OPERATION(gData->cx, JSOW_JUMP * (1 + parenCount));
if (btincr > 0) {
@@ -2729,7 +2735,7 @@ ExecuteREBytecode(REGlobalData *gData, REMatchState *x)
case REOP_LPAREN:
pc = ReadCompactIndex(pc, &parenIndex);
- TRACE("[ %lu ]\n", (unsigned long) parenIndex);
+ TRACE("[ %lu ]\n", (ULONG_PTR)parenIndex);
assert(parenIndex < gData->regexp->parenCount);
if (parenIndex + 1 > parenSoFar)
parenSoFar = parenIndex + 1;
@@ -3093,8 +3099,8 @@ ExecuteREBytecode(REGlobalData *gData, REMatchState *x)
}
TRACE("\tBT_Pop: %ld,%ld\n",
- (unsigned long) backTrackData->parenIndex,
- (unsigned long) backTrackData->parenCount);
+ (ULONG_PTR)backTrackData->parenIndex,
+ (ULONG_PTR)backTrackData->parenCount);
continue;
}
x = result;
@@ -3342,8 +3348,6 @@ static HRESULT do_regexp_match_next(script_ctx_t *ctx, RegExpInstance *regexp, D
}
if(parens) {
- DWORD i;
-
if(regexp->jsregexp->parenCount > *parens_size) {
match_result_t *new_parens;
@@ -3356,6 +3360,22 @@ static HRESULT do_regexp_match_next(script_ctx_t *ctx, RegExpInstance *regexp, D
*parens = new_parens;
}
+ }
+
+ /* FIXME: We often already have a copy of input string that we could use to store last match */
+ if(!(rem_flags & REM_NO_CTX_UPDATE) &&
+ (!ctx->last_match || len != SysStringLen(ctx->last_match) || strncmpW(ctx->last_match, str, len))) {
+ BSTR last_match;
+
+ last_match = SysAllocStringLen(str, len);
+ if(!last_match)
+ return E_OUTOFMEMORY;
+ SysFreeString(ctx->last_match);
+ ctx->last_match = last_match;
+ }
+
+ if(parens) {
+ DWORD i;
*parens_cnt = regexp->jsregexp->parenCount;
@@ -3376,6 +3396,11 @@ static HRESULT do_regexp_match_next(script_ctx_t *ctx, RegExpInstance *regexp, D
ret->len = matchlen;
set_last_index(regexp, result->cp-str);
+ if(!(rem_flags & REM_NO_CTX_UPDATE)) {
+ ctx->last_match_index = ret->str-str;
+ ctx->last_match_length = matchlen;
+ }
+
return S_OK;
}
@@ -3712,12 +3737,24 @@ static HRESULT RegExp_test(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPP
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
match_result_t match;
+ VARIANT undef_var;
VARIANT_BOOL b;
+ DWORD argc;
HRESULT hres;
TRACE("\n");
- hres = run_exec(ctx, jsthis, arg_cnt(dp) ? get_arg(dp,0) : NULL, ei, NULL, &match, NULL, NULL, &b);
+ argc = arg_cnt(dp);
+ if(!argc) {
+ V_VT(&undef_var) = VT_BSTR;
+ V_BSTR(&undef_var) = SysAllocString(undefinedW);
+ if(!V_BSTR(&undef_var))
+ return E_OUTOFMEMORY;
+ }
+
+ hres = run_exec(ctx, jsthis, argc ? get_arg(dp,0) : &undef_var, ei, NULL, &match, NULL, NULL, &b);
+ if(!argc)
+ SysFreeString(V_BSTR(&undef_var));
if(FAILED(hres))
return hres;
@@ -3959,6 +3996,58 @@ HRESULT regexp_string_match(script_ctx_t *ctx, DispatchEx *re, BSTR str,
return hres;
}
+static HRESULT RegExpConstr_leftContext(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+
+ switch(flags) {
+ case DISPATCH_PROPERTYGET: {
+ BSTR ret;
+
+ ret = SysAllocStringLen(ctx->last_match, ctx->last_match_index);
+ if(!ret)
+ return E_OUTOFMEMORY;
+
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = ret;
+ }
+ case DISPATCH_PROPERTYPUT:
+ return S_OK;
+ default:
+ FIXME("unsupported flags\n");
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
+}
+
+static HRESULT RegExpConstr_rightContext(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+
+ switch(flags) {
+ case DISPATCH_PROPERTYGET: {
+ BSTR ret;
+
+ ret = SysAllocString(ctx->last_match+ctx->last_match_index+ctx->last_match_length);
+ if(!ret)
+ return E_OUTOFMEMORY;
+
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = ret;
+ }
+ case DISPATCH_PROPERTYPUT:
+ return S_OK;
+ default:
+ FIXME("unsupported flags\n");
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
+}
+
static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
@@ -4019,6 +4108,20 @@ static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
return S_OK;
}
+static const builtin_prop_t RegExpConstr_props[] = {
+ {leftContextW, RegExpConstr_leftContext, 0},
+ {rightContextW, RegExpConstr_rightContext, 0}
+};
+
+static const builtin_info_t RegExpConstr_info = {
+ JSCLASS_FUNCTION,
+ {NULL, Function_value, 0},
+ sizeof(RegExpConstr_props)/sizeof(*RegExpConstr_props),
+ RegExpConstr_props,
+ NULL,
+ NULL
+};
+
HRESULT create_regexp_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret)
{
RegExpInstance *regexp;
@@ -4030,7 +4133,7 @@ HRESULT create_regexp_constr(script_ctx_t *ctx, DispatchEx *object_prototype, Di
if(FAILED(hres))
return hres;
- hres = create_builtin_function(ctx, RegExpConstr_value, RegExpW, NULL,
+ hres = create_builtin_function(ctx, RegExpConstr_value, RegExpW, &RegExpConstr_info,
PROPF_CONSTR|2, ®exp->dispex, ret);
jsdisp_release(®exp->dispex);
diff --git a/dll/win32/jscript/rsrc.rc b/dll/win32/jscript/rsrc.rc
index d23ea33a2f3..db7e0ff2fa3 100644
--- a/dll/win32/jscript/rsrc.rc
+++ b/dll/win32/jscript/rsrc.rc
@@ -30,3 +30,4 @@ REGINST REGINST jscript.inf
#include "jscript_Nl.rc"
#include "jscript_Pt.rc"
#include "jscript_Ru.rc"
+#include "jscript_Si.rc"
diff --git a/dll/win32/jscript/string.c b/dll/win32/jscript/string.c
index 510dcc272c6..05b9eba26e1 100644
--- a/dll/win32/jscript/string.c
+++ b/dll/win32/jscript/string.c
@@ -779,9 +779,9 @@ static HRESULT String_replace(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DI
DWORD parens_cnt = 0, parens_size=0, rep_len=0, length;
BSTR rep_str = NULL, match_str = NULL, ret_str, val_str;
DispatchEx *rep_func = NULL, *regexp = NULL;
- match_result_t *parens = NULL, match, **parens_ptr = &parens;
+ match_result_t *parens = NULL, match = {NULL,0}, **parens_ptr = &parens;
strbuf_t ret = {NULL,0,0};
- DWORD re_flags = 0;
+ DWORD re_flags = REM_NO_CTX_UPDATE;
VARIANT *arg_var;
HRESULT hres = S_OK;
@@ -860,7 +860,7 @@ static HRESULT String_replace(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DI
if(regexp) {
hres = regexp_match_next(ctx, regexp, re_flags, str, length, &cp, parens_ptr,
&parens_size, &parens_cnt, &match);
- re_flags = REM_CHECK_GLOBAL;
+ re_flags |= REM_CHECK_GLOBAL;
if(hres == S_FALSE) {
hres = S_OK;
@@ -969,13 +969,28 @@ static HRESULT String_replace(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DI
if(rep_func)
jsdisp_release(rep_func);
- if(regexp)
- jsdisp_release(regexp);
- SysFreeString(val_str);
SysFreeString(rep_str);
SysFreeString(match_str);
heap_free(parens);
+ if(SUCCEEDED(hres) && match.str && regexp) {
+ if(!val_str)
+ val_str = SysAllocStringLen(str, length);
+ if(val_str) {
+ SysFreeString(ctx->last_match);
+ ctx->last_match = val_str;
+ val_str = NULL;
+ ctx->last_match_index = match.str-str;
+ ctx->last_match_length = match.len;
+ }else {
+ hres = E_OUTOFMEMORY;
+ }
+ }
+
+ if(regexp)
+ jsdisp_release(regexp);
+ SysFreeString(val_str);
+
if(SUCCEEDED(hres) && retv) {
ret_str = SysAllocStringLen(ret.buf, ret.len);
if(!ret_str)
diff --git a/dll/win32/kernel32/file/file.c b/dll/win32/kernel32/file/file.c
index 66046621821..cdbafd08839 100644
--- a/dll/win32/kernel32/file/file.c
+++ b/dll/win32/kernel32/file/file.c
@@ -1906,7 +1906,8 @@ ReplaceFileW(
)
{
HANDLE hReplaced = NULL, hReplacement = NULL;
- UNICODE_STRING NtReplacedName, NtReplacementName;
+ UNICODE_STRING NtReplacedName = { 0, 0, NULL };
+ UNICODE_STRING NtReplacementName = { 0, 0, NULL };
DWORD Error = ERROR_SUCCESS;
NTSTATUS Status;
BOOL Ret = FALSE;
@@ -2029,8 +2030,10 @@ Cleanup:
if (hReplacement) NtClose(hReplacement);
if (Buffer) RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- RtlFreeUnicodeString(&NtReplacementName);
- RtlFreeUnicodeString(&NtReplacedName);
+ if (NtReplacementName.Buffer)
+ RtlFreeHeap(GetProcessHeap(), 0, NtReplacementName.Buffer);
+ if (NtReplacedName.Buffer)
+ RtlFreeHeap(GetProcessHeap(), 0, NtReplacedName.Buffer);
/* If there was an error, set the error code */
if(!Ret)
diff --git a/dll/win32/kernel32/file/find.c b/dll/win32/kernel32/file/find.c
index ef2346a598c..df245232e0e 100644
--- a/dll/win32/kernel32/file/find.c
+++ b/dll/win32/kernel32/file/find.c
@@ -54,7 +54,7 @@ typedef struct _KERNEL32_FIND_DATA_HEADER
/* FUNCTIONS ****************************************************************/
-static HANDLE
+static VOID
InternalCopyDeviceFindDataW(LPWIN32_FIND_DATAW lpFindFileData,
LPCWSTR lpFileName,
ULONG DeviceNameInfo)
@@ -71,11 +71,9 @@ InternalCopyDeviceFindDataW(LPWIN32_FIND_DATAW lpFindFileData,
RtlCopyMemory(lpFindFileData->cFileName,
DeviceName.Buffer,
DeviceName.Length);
-
- return FIND_DEVICE_HANDLE;
}
-static HANDLE
+static VOID
InternalCopyDeviceFindDataA(LPWIN32_FIND_DATAA lpFindFileData,
PUNICODE_STRING FileName,
ULONG DeviceNameInfo)
@@ -101,8 +99,6 @@ InternalCopyDeviceFindDataA(LPWIN32_FIND_DATAA lpFindFileData,
RtlCopyMemory(lpFindFileData->cFileName,
BufferA.Buffer,
BufferA.Length);
-
- return FIND_DEVICE_HANDLE;
}
static VOID
diff --git a/dll/win32/kernel32/file/npipe.c b/dll/win32/kernel32/file/npipe.c
index d62527e12a5..55aeed952fc 100644
--- a/dll/win32/kernel32/file/npipe.c
+++ b/dll/win32/kernel32/file/npipe.c
@@ -496,6 +496,7 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
+ RtlFreeUnicodeString(&NamedPipeName);
return FALSE;
}
@@ -538,9 +539,11 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
+ RtlFreeUnicodeString(&NamedPipeName);
return FALSE;
}
+ RtlFreeUnicodeString(&NamedPipeName);
return TRUE;
}
#endif
diff --git a/dll/win32/kernel32/include/kernel32.h b/dll/win32/kernel32/include/kernel32.h
index 19731210435..59669780806 100755
--- a/dll/win32/kernel32/include/kernel32.h
+++ b/dll/win32/kernel32/include/kernel32.h
@@ -85,6 +85,8 @@ HANDLE WINAPI OpenConsoleW (LPCWSTR wsName,
BOOL bInheritHandle,
DWORD dwShareMode);
+BOOL WINAPI SetConsoleInputExeNameW(LPCWSTR lpInputExeName);
+
PTEB GetTeb(VOID);
HANDLE FASTCALL TranslateStdHandle(HANDLE hHandle);
diff --git a/dll/win32/kernel32/kernel32.pspec b/dll/win32/kernel32/kernel32.pspec
index cba32d9f29d..3c09b07cc44 100644
--- a/dll/win32/kernel32/kernel32.pspec
+++ b/dll/win32/kernel32/kernel32.pspec
@@ -316,6 +316,7 @@
@ stdcall GetConsoleFontInfo(long long long ptr)
@ stdcall GetConsoleFontSize(long long)
@ stdcall GetConsoleHardwareState(long long ptr)
+@ stdcall GetConsoleHistoryInfo(ptr)
@ stdcall GetConsoleInputExeNameA(long ptr)
@ stdcall GetConsoleInputExeNameW(long ptr)
@ stdcall GetConsoleInputWaitHandle()
@@ -796,7 +797,6 @@
@ stdcall SetComputerNameW(wstr)
@ stdcall SetConsoleActiveScreenBuffer(long)
@ stdcall SetConsoleCP(long)
-@ stdcall SetConsoleCommandHistoryMode(long)
@ stdcall SetConsoleCtrlHandler(ptr long)
@ stdcall SetConsoleCursor(long long)
@ stdcall SetConsoleCursorInfo(long ptr)
@@ -805,6 +805,7 @@
@ stdcall SetConsoleDisplayMode(long long ptr)
@ stdcall SetConsoleFont(long long)
@ stdcall SetConsoleHardwareState(long long long)
+@ stdcall SetConsoleHistoryInfo(ptr)
@ stdcall SetConsoleIcon(ptr)
@ stdcall SetConsoleInputExeNameA(ptr)
@ stdcall SetConsoleInputExeNameW(ptr)
diff --git a/dll/win32/kernel32/misc/console.c b/dll/win32/kernel32/misc/console.c
index 594b8ac2abb..34b1e84a6aa 100644
--- a/dll/win32/kernel32/misc/console.c
+++ b/dll/win32/kernel32/misc/console.c
@@ -178,6 +178,37 @@ ConsoleControlDispatcher(DWORD CodeAndFlag)
ExitThread(nExitCode);
}
+/* Get the size needed to copy a string to a capture buffer, including alignment */
+static ULONG
+IntStringSize(LPCVOID String,
+ BOOL Unicode)
+{
+ ULONG Size = (Unicode ? wcslen(String) : strlen(String)) * sizeof(WCHAR);
+ return (Size + 3) & -4;
+}
+
+/* Copy a string to a capture buffer */
+static VOID
+IntCaptureMessageString(PCSR_CAPTURE_BUFFER CaptureBuffer,
+ LPCVOID String,
+ BOOL Unicode,
+ PUNICODE_STRING RequestString)
+{
+ ULONG Size;
+ if (Unicode)
+ {
+ Size = wcslen(String) * sizeof(WCHAR);
+ CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)String, Size, (PVOID *)&RequestString->Buffer);
+ }
+ else
+ {
+ Size = strlen(String);
+ CsrAllocateMessagePointer(CaptureBuffer, Size * sizeof(WCHAR), (PVOID *)&RequestString->Buffer);
+ Size = MultiByteToWideChar(CP_ACP, 0, String, Size, RequestString->Buffer, Size * sizeof(WCHAR))
+ * sizeof(WCHAR);
+ }
+ RequestString->Length = RequestString->MaximumLength = Size;
+}
/* FUNCTIONS *****************************************************************/
@@ -336,29 +367,56 @@ DuplicateConsoleHandle(HANDLE hConsole,
}
-/*
- * @unimplemented (Undocumented)
- */
-DWORD
-WINAPI
-ExpungeConsoleCommandHistoryW(DWORD Unknown0)
+static BOOL
+IntExpungeConsoleCommandHistory(LPCVOID lpExeName, BOOL bUnicode)
{
- DPRINT1("ExpungeConsoleCommandHistoryW(0x%x) UNIMPLEMENTED!\n", Unknown0);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ CSR_API_MESSAGE Request;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+ ULONG CsrRequest = MAKE_CSR_API(EXPUNGE_COMMAND_HISTORY, CSR_CONSOLE);
+ NTSTATUS Status;
+
+ if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode));
+ if (!CaptureBuffer)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
+ IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode,
+ &Request.Data.ExpungeCommandHistory.ExeName);
+ Status = CsrClientCallServer(&Request, CaptureBuffer, CsrRequest, sizeof(CSR_API_MESSAGE));
+ CsrFreeCaptureBuffer(CaptureBuffer);
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+ return TRUE;
}
+/*
+ * @implemented (Undocumented)
+ */
+BOOL
+WINAPI
+ExpungeConsoleCommandHistoryW(LPCWSTR lpExeName)
+{
+ return IntExpungeConsoleCommandHistory(lpExeName, TRUE);
+}
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
*/
-DWORD
+BOOL
WINAPI
-ExpungeConsoleCommandHistoryA (DWORD Unknown0)
+ExpungeConsoleCommandHistoryA(LPCSTR lpExeName)
{
- DPRINT1("ExpungeConsoleCommandHistoryW(0x%x) UNIMPLEMENTED!\n", Unknown0);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ return IntExpungeConsoleCommandHistory(lpExeName, FALSE);
}
@@ -772,61 +830,139 @@ GetConsoleAliasesLengthA(LPSTR lpExeName)
}
+static DWORD
+IntGetConsoleCommandHistory(LPVOID lpHistory, DWORD cbHistory, LPCVOID lpExeName, BOOL bUnicode)
+{
+ CSR_API_MESSAGE Request;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+ ULONG CsrRequest = MAKE_CSR_API(GET_COMMAND_HISTORY, CSR_CONSOLE);
+ NTSTATUS Status;
+ DWORD HistoryLength = cbHistory * (bUnicode ? 1 : sizeof(WCHAR));
+
+ if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return 0;
+ }
+
+ CaptureBuffer = CsrAllocateCaptureBuffer(2, IntStringSize(lpExeName, bUnicode) +
+ HistoryLength);
+ if (!CaptureBuffer)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return 0;
+ }
+ IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode,
+ &Request.Data.GetCommandHistory.ExeName);
+ Request.Data.GetCommandHistory.Length = HistoryLength;
+ CsrAllocateMessagePointer(CaptureBuffer, HistoryLength,
+ (PVOID*)&Request.Data.GetCommandHistory.History);
+
+ Status = CsrClientCallServer(&Request, CaptureBuffer, CsrRequest, sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ CsrFreeCaptureBuffer(CaptureBuffer);
+ SetLastErrorByStatus(Status);
+ return 0;
+ }
+
+ if (bUnicode)
+ {
+ memcpy(lpHistory,
+ Request.Data.GetCommandHistory.History,
+ Request.Data.GetCommandHistory.Length);
+ }
+ else
+ {
+ WideCharToMultiByte(CP_ACP, 0,
+ Request.Data.GetCommandHistory.History,
+ Request.Data.GetCommandHistory.Length / sizeof(WCHAR),
+ lpHistory,
+ cbHistory,
+ NULL, NULL);
+ }
+ CsrFreeCaptureBuffer(CaptureBuffer);
+ return Request.Data.GetCommandHistory.Length;
+}
+
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
*/
DWORD
WINAPI
-GetConsoleCommandHistoryW(DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2)
+GetConsoleCommandHistoryW(LPWSTR lpHistory,
+ DWORD cbHistory,
+ LPCWSTR lpExeName)
{
- DPRINT1("GetConsoleCommandHistoryW(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ return IntGetConsoleCommandHistory(lpHistory, cbHistory, lpExeName, TRUE);
}
-
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
*/
DWORD
WINAPI
-GetConsoleCommandHistoryA(DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2)
+GetConsoleCommandHistoryA(LPSTR lpHistory,
+ DWORD cbHistory,
+ LPCSTR lpExeName)
{
- DPRINT1("GetConsoleCommandHistoryA(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ return IntGetConsoleCommandHistory(lpHistory, cbHistory, lpExeName, FALSE);
}
+static DWORD
+IntGetConsoleCommandHistoryLength(LPCVOID lpExeName, BOOL bUnicode)
+{
+ CSR_API_MESSAGE Request;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+ ULONG CsrRequest = MAKE_CSR_API(GET_COMMAND_HISTORY_LENGTH, CSR_CONSOLE);
+ NTSTATUS Status;
+
+ if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return 0;
+ }
+
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode));
+ if (!CaptureBuffer)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return 0;
+ }
+ IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode,
+ &Request.Data.GetCommandHistoryLength.ExeName);
+ Status = CsrClientCallServer(&Request, CaptureBuffer, CsrRequest, sizeof(CSR_API_MESSAGE));
+ CsrFreeCaptureBuffer(CaptureBuffer);
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return 0;
+ }
+ return Request.Data.GetCommandHistoryLength.Length;
+}
+
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
*/
DWORD
WINAPI
-GetConsoleCommandHistoryLengthW(DWORD Unknown0)
+GetConsoleCommandHistoryLengthW(LPCWSTR lpExeName)
{
- DPRINT1("GetConsoleCommandHistoryLengthW(0x%x) UNIMPLEMENTED!\n", Unknown0);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ return IntGetConsoleCommandHistoryLength(lpExeName, TRUE);
}
-
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
*/
DWORD
WINAPI
-GetConsoleCommandHistoryLengthA(DWORD Unknown0)
+GetConsoleCommandHistoryLengthA(LPCSTR lpExeName)
{
- DPRINT1("GetConsoleCommandHistoryLengthA(0x%x) UNIMPLEMENTED!\n", Unknown0);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ return IntGetConsoleCommandHistoryLength(lpExeName, FALSE) / sizeof(WCHAR);
}
+
/*
* @unimplemented
*/
@@ -1022,6 +1158,7 @@ OpenConsoleW(LPCWSTR wsName,
/* Structures for GET_INPUT_HANDLE and GET_OUTPUT_HANDLE requests are identical */
Request.Data.GetInputHandleRequest.Access = dwDesiredAccess;
Request.Data.GetInputHandleRequest.Inheritable = bInheritHandle;
+ Request.Data.GetInputHandleRequest.ShareMode = dwShareMode;
Status = CsrClientCallServer(&Request,
NULL,
@@ -1033,20 +1170,7 @@ OpenConsoleW(LPCWSTR wsName,
return INVALID_HANDLE_VALUE;
}
- return Request.Data.GetInputHandleRequest.InputHandle;
-}
-
-
-/*
- * @unimplemented (Undocumented)
- */
-BOOL
-WINAPI
-SetConsoleCommandHistoryMode(DWORD dwMode)
-{
- DPRINT1("SetConsoleCommandHistoryMode(0x%x) UNIMPLEMENTED!\n", dwMode);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ return Request.Data.GetInputHandleRequest.Handle;
}
@@ -1175,31 +1299,61 @@ SetConsoleMenuClose(DWORD Unknown0)
}
-/*
- * @unimplemented (Undocumented)
- */
-BOOL
-WINAPI
-SetConsoleNumberOfCommandsA(DWORD Unknown0,
- DWORD Unknown1)
+static BOOL
+IntSetConsoleNumberOfCommands(DWORD dwNumCommands,
+ LPCVOID lpExeName,
+ BOOL bUnicode)
{
- DPRINT1("SetConsoleNumberOfCommandsA(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ CSR_API_MESSAGE Request;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+ ULONG CsrRequest = MAKE_CSR_API(SET_HISTORY_NUMBER_COMMANDS, CSR_CONSOLE);
+ NTSTATUS Status;
+
+ if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode));
+ if (!CaptureBuffer)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
+ IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode,
+ &Request.Data.SetHistoryNumberCommands.ExeName);
+ Request.Data.SetHistoryNumberCommands.NumCommands = dwNumCommands;
+ Status = CsrClientCallServer(&Request, CaptureBuffer, CsrRequest, sizeof(CSR_API_MESSAGE));
+ CsrFreeCaptureBuffer(CaptureBuffer);
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+ return TRUE;
}
-
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
*/
BOOL
WINAPI
-SetConsoleNumberOfCommandsW(DWORD Unknown0,
- DWORD Unknown1)
+SetConsoleNumberOfCommandsA(DWORD dwNumCommands,
+ LPCWSTR lpExeName)
{
- DPRINT1("SetConsoleNumberOfCommandsW(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ return IntSetConsoleNumberOfCommands(dwNumCommands, lpExeName, FALSE);
+}
+
+/*
+ * @implemented (Undocumented)
+ */
+BOOL
+WINAPI
+SetConsoleNumberOfCommandsW(DWORD dwNumCommands,
+ LPCSTR lpExeName)
+{
+ return IntSetConsoleNumberOfCommands(dwNumCommands, lpExeName, TRUE);
}
@@ -1466,6 +1620,12 @@ IntWriteConsole(HANDLE hConsoleOutput,
max(sizeof(CSR_API_MESSAGE),
CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE) + SizeBytes));
+ if (Status == STATUS_PENDING)
+ {
+ WaitForSingleObject(Request->Data.WriteConsoleRequest.UnpauseEvent, INFINITE);
+ CloseHandle(Request->Data.WriteConsoleRequest.UnpauseEvent);
+ continue;
+ }
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
{
RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
@@ -1559,6 +1719,9 @@ IntReadConsole(HANDLE hConsoleInput,
}
Request->Status = STATUS_SUCCESS;
+ Request->Data.ReadConsoleRequest.ConsoleHandle = hConsoleInput;
+ Request->Data.ReadConsoleRequest.Unicode = bUnicode;
+ Request->Data.ReadConsoleRequest.FullReadSize = (WORD)nNumberOfCharsToRead;
CsrRequest = MAKE_CSR_API(READ_CONSOLE, CSR_CONSOLE);
do
@@ -1575,10 +1738,7 @@ IntReadConsole(HANDLE hConsoleInput,
}
}
- Request->Data.ReadConsoleRequest.ConsoleHandle = hConsoleInput;
- Request->Data.ReadConsoleRequest.Unicode = bUnicode;
Request->Data.ReadConsoleRequest.NrCharactersToRead = (WORD)min(nNumberOfCharsToRead, CSRSS_MAX_READ_CONSOLE / CharSize);
- Request->Data.ReadConsoleRequest.nCharsCanBeDeleted = (WORD)CharsRead;
Status = CsrClientCallServer(Request,
NULL,
@@ -1600,16 +1760,6 @@ IntReadConsole(HANDLE hConsoleInput,
Request->Data.ReadConsoleRequest.Buffer,
Request->Data.ReadConsoleRequest.NrCharactersRead * CharSize);
CharsRead += Request->Data.ReadConsoleRequest.NrCharactersRead;
-
- if (Request->Status == STATUS_NOTIFY_CLEANUP)
- {
- if(CharsRead > 0)
- {
- CharsRead--;
- nNumberOfCharsToRead++;
- }
- Request->Status = STATUS_PENDING;
- }
}
while (Request->Status == STATUS_PENDING && nNumberOfCharsToRead > 0);
@@ -1691,6 +1841,7 @@ AllocConsole(VOID)
Request.Data.AllocConsoleRequest.CtrlDispatcher = ConsoleControlDispatcher;
Request.Data.AllocConsoleRequest.ConsoleNeeded = TRUE;
+ Request.Data.AllocConsoleRequest.Visible = TRUE;
CsrRequest = MAKE_CSR_API(ALLOC_CONSOLE, CSR_CONSOLE);
@@ -3410,6 +3561,64 @@ GenerateConsoleCtrlEvent(DWORD dwCtrlEvent,
}
+static DWORD
+IntGetConsoleTitle(LPVOID lpConsoleTitle, DWORD nSize, BOOL bUnicode)
+{
+ CSR_API_MESSAGE Request;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+ ULONG CsrRequest = MAKE_CSR_API(GET_TITLE, CSR_CONSOLE);
+ NTSTATUS Status;
+
+ if (nSize == 0)
+ return 0;
+
+ Request.Data.GetTitleRequest.Length = nSize * (bUnicode ? 1 : sizeof(WCHAR));
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, Request.Data.GetTitleRequest.Length);
+ if (CaptureBuffer == NULL)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return 0;
+ }
+
+ CsrAllocateMessagePointer(CaptureBuffer,
+ Request.Data.GetTitleRequest.Length,
+ (PVOID*)&Request.Data.GetTitleRequest.Title);
+
+ Status = CsrClientCallServer(&Request, CaptureBuffer, CsrRequest, sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request.Status)))
+ {
+ CsrFreeCaptureBuffer(CaptureBuffer);
+ SetLastErrorByStatus(Status);
+ return 0;
+ }
+
+ if (bUnicode)
+ {
+ if (nSize >= sizeof(WCHAR))
+ wcscpy((LPWSTR)lpConsoleTitle, Request.Data.GetTitleRequest.Title);
+ }
+ else
+ {
+ if (nSize < Request.Data.GetTitleRequest.Length / sizeof(WCHAR) ||
+ !WideCharToMultiByte(CP_ACP, // ANSI code page
+ 0, // performance and mapping flags
+ Request.Data.GetTitleRequest.Title, // address of wide-character string
+ -1, // number of characters in string
+ (LPSTR)lpConsoleTitle, // address of buffer for new string
+ nSize, // size of buffer
+ NULL, // FAST
+ NULL))
+ {
+ /* Yes, if the buffer isn't big enough, it returns 0... Bad API */
+ *(LPSTR)lpConsoleTitle = '\0';
+ Request.Data.GetTitleRequest.Length = 0;
+ }
+ }
+ CsrFreeCaptureBuffer(CaptureBuffer);
+
+ return Request.Data.GetTitleRequest.Length / sizeof(WCHAR);
+}
+
/*--------------------------------------------------------------
* GetConsoleTitleW
*
@@ -3420,49 +3629,9 @@ WINAPI
GetConsoleTitleW(LPWSTR lpConsoleTitle,
DWORD nSize)
{
- PCSR_API_MESSAGE Request;
- ULONG CsrRequest;
- NTSTATUS Status;
-
- Request = RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE) + CSRSS_MAX_TITLE_LENGTH * sizeof(WCHAR));
- if (Request == NULL)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- CsrRequest = MAKE_CSR_API(GET_TITLE, CSR_CONSOLE);
-
- Status = CsrClientCallServer(Request,
- NULL,
- CsrRequest,
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE) + CSRSS_MAX_TITLE_LENGTH * sizeof(WCHAR));
- if (!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request->Status)))
- {
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
- SetLastErrorByStatus(Status);
- return 0;
- }
-
- if (nSize * sizeof(WCHAR) <= Request->Data.GetTitleRequest.Length)
- {
- nSize--;
- }
- else
- {
- nSize = Request->Data.GetTitleRequest.Length / sizeof (WCHAR);
- }
- memcpy(lpConsoleTitle, Request->Data.GetTitleRequest.Title, nSize * sizeof(WCHAR));
- lpConsoleTitle[nSize] = L'\0';
-
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
-
- return nSize;
+ return IntGetConsoleTitle(lpConsoleTitle, nSize, TRUE);
}
-
/*--------------------------------------------------------------
* GetConsoleTitleA
*
@@ -3475,28 +3644,7 @@ WINAPI
GetConsoleTitleA(LPSTR lpConsoleTitle,
DWORD nSize)
{
- WCHAR WideTitle [CSRSS_MAX_TITLE_LENGTH + 1];
- DWORD nWideTitle = CSRSS_MAX_TITLE_LENGTH + 1;
- DWORD nWritten;
-
- if (!lpConsoleTitle || !nSize) return 0;
- nWideTitle = GetConsoleTitleW((LPWSTR) WideTitle, nWideTitle);
- if (!nWideTitle) return 0;
-
- if ((nWritten = WideCharToMultiByte(CP_ACP, // ANSI code page
- 0, // performance and mapping flags
- (LPWSTR) WideTitle, // address of wide-character string
- nWideTitle, // number of characters in string
- lpConsoleTitle, // address of buffer for new string
- nSize - 1, // size of buffer
- NULL, // FAST
- NULL))) // FAST
- {
- lpConsoleTitle[nWritten] = '\0';
- return nWritten;
- }
-
- return 0;
+ return IntGetConsoleTitle(lpConsoleTitle, nSize, FALSE);
}
@@ -3509,41 +3657,33 @@ BOOL
WINAPI
SetConsoleTitleW(LPCWSTR lpConsoleTitle)
{
- PCSR_API_MESSAGE Request;
- ULONG CsrRequest;
+ CSR_API_MESSAGE Request;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+ ULONG CsrRequest = MAKE_CSR_API(SET_TITLE, CSR_CONSOLE);
NTSTATUS Status;
- unsigned int c;
- Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) +
- min(wcslen(lpConsoleTitle), CSRSS_MAX_TITLE_LENGTH) * sizeof(WCHAR)));
- if (Request == NULL)
+ Request.Data.SetTitleRequest.Length = wcslen(lpConsoleTitle) * sizeof(WCHAR);
+
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, Request.Data.SetTitleRequest.Length);
+ if (CaptureBuffer == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
- CsrRequest = MAKE_CSR_API(SET_TITLE, CSR_CONSOLE);
+ CsrCaptureMessageBuffer(CaptureBuffer,
+ (PVOID)lpConsoleTitle,
+ Request.Data.SetTitleRequest.Length,
+ (PVOID*)&Request.Data.SetTitleRequest.Title);
- for (c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++)
- Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
-
- Request->Data.SetTitleRequest.Length = c * sizeof(WCHAR);
- Status = CsrClientCallServer(Request,
- NULL,
- CsrRequest,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + c * sizeof(WCHAR)));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
+ Status = CsrClientCallServer(&Request, CaptureBuffer, CsrRequest, sizeof(CSR_API_MESSAGE));
+ CsrFreeCaptureBuffer(CaptureBuffer);
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
{
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
SetLastErrorByStatus(Status);
- return(FALSE);
+ return FALSE;
}
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
-
return TRUE;
}
@@ -3559,43 +3699,18 @@ BOOL
WINAPI
SetConsoleTitleA(LPCSTR lpConsoleTitle)
{
- PCSR_API_MESSAGE Request;
- ULONG CsrRequest;
- NTSTATUS Status;
- unsigned int c;
-
- Request = RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) +
- min(strlen(lpConsoleTitle), CSRSS_MAX_TITLE_LENGTH) * sizeof(WCHAR)));
- if (Request == NULL)
+ ULONG Length = strlen(lpConsoleTitle) + 1;
+ LPWSTR WideTitle = HeapAlloc(GetProcessHeap(), 0, Length * sizeof(WCHAR));
+ BOOL Ret;
+ if (!WideTitle)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
-
- CsrRequest = MAKE_CSR_API(SET_TITLE, CSR_CONSOLE);
-
- for (c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++)
- Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
-
- Request->Data.SetTitleRequest.Length = c * sizeof(WCHAR);
- Status = CsrClientCallServer(Request,
- NULL,
- CsrRequest,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + c * sizeof(WCHAR)));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
- {
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
- SetLastErrorByStatus(Status);
- return(FALSE);
- }
-
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
-
- return TRUE;
+ MultiByteToWideChar(CP_ACP, 0, lpConsoleTitle, -1, WideTitle, Length);
+ Ret = SetConsoleTitleW(WideTitle);
+ HeapFree(GetProcessHeap(), 0, WideTitle);
+ return Ret;
}
@@ -3751,7 +3866,8 @@ WINAPI
GetConsoleProcessList(LPDWORD lpdwProcessList,
DWORD dwProcessCount)
{
- PCSR_API_MESSAGE Request;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+ CSR_API_MESSAGE Request;
ULONG CsrRequest;
ULONG nProcesses;
NTSTATUS Status;
@@ -3762,43 +3878,38 @@ GetConsoleProcessList(LPDWORD lpdwProcessList,
return 0;
}
- Request = RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST)
- + min (dwProcessCount, CSRSS_MAX_GET_PROCESS_LIST / sizeof(DWORD)) * sizeof(DWORD)));
- if (Request == NULL)
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, dwProcessCount * sizeof(DWORD));
+ if (CaptureBuffer == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
CsrRequest = MAKE_CSR_API(GET_PROCESS_LIST, CSR_CONSOLE);
- Request->Data.GetProcessListRequest.nMaxIds = min (dwProcessCount, CSRSS_MAX_GET_PROCESS_LIST / sizeof(DWORD));
+ Request.Data.GetProcessListRequest.nMaxIds = dwProcessCount;
+ CsrAllocateMessagePointer(CaptureBuffer,
+ dwProcessCount * sizeof(DWORD),
+ (PVOID*)&Request.Data.GetProcessListRequest.ProcessId);
- Status = CsrClientCallServer(Request,
- NULL,
+ Status = CsrClientCallServer(&Request,
+ CaptureBuffer,
CsrRequest,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST)
- + Request->Data.GetProcessListRequest.nMaxIds * sizeof(DWORD)));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
+ sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
{
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
SetLastErrorByStatus (Status);
nProcesses = 0;
}
else
{
- nProcesses = Request->Data.GetProcessListRequest.nProcessIdsCopied;
+ nProcesses = Request.Data.GetProcessListRequest.nProcessIdsTotal;
if (dwProcessCount >= nProcesses)
{
- memcpy(lpdwProcessList, Request->Data.GetProcessListRequest.ProcessId, nProcesses * sizeof(DWORD));
+ memcpy(lpdwProcessList, Request.Data.GetProcessListRequest.ProcessId, nProcesses * sizeof(DWORD));
}
}
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
-
+ CsrFreeCaptureBuffer(CaptureBuffer);
return nProcesses;
}
@@ -3807,15 +3918,23 @@ GetConsoleProcessList(LPDWORD lpdwProcessList,
/*--------------------------------------------------------------
* GetConsoleSelectionInfo
*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo)
{
- DPRINT1("GetConsoleSelectionInfo(0x%x) UNIMPLEMENTED!\n", lpConsoleSelectionInfo);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ CSR_API_MESSAGE Request;
+ ULONG CsrRequest = MAKE_CSR_API(GET_CONSOLE_SELECTION_INFO, CSR_CONSOLE);
+ NTSTATUS Status = CsrClientCallServer(&Request, NULL, CsrRequest, sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ *lpConsoleSelectionInfo = Request.Data.GetConsoleSelectionInfo.Info;
+ return TRUE;
}
@@ -4061,30 +4180,60 @@ GetConsoleInputExeNameA(DWORD nBufferLength, LPSTR lpBuffer)
/*--------------------------------------------------------------
* GetConsoleHistoryInfo
*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo)
{
- DPRINT1("GetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ CSR_API_MESSAGE Request;
+ ULONG CsrRequest = MAKE_CSR_API(GET_HISTORY_INFO, CSR_CONSOLE);
+ NTSTATUS Status;
+ if (lpConsoleHistoryInfo->cbSize != sizeof(CONSOLE_HISTORY_INFO))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+ Status = CsrClientCallServer(&Request, NULL, CsrRequest, sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+ lpConsoleHistoryInfo->HistoryBufferSize = Request.Data.GetHistoryInfo.HistoryBufferSize;
+ lpConsoleHistoryInfo->NumberOfHistoryBuffers = Request.Data.GetHistoryInfo.NumberOfHistoryBuffers;
+ lpConsoleHistoryInfo->dwFlags = Request.Data.GetHistoryInfo.dwFlags;
+ return TRUE;
}
/*--------------------------------------------------------------
* SetConsoleHistoryInfo
*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo)
{
- DPRINT1("SetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ CSR_API_MESSAGE Request;
+ ULONG CsrRequest = MAKE_CSR_API(GET_HISTORY_INFO, CSR_CONSOLE);
+ NTSTATUS Status;
+ if (lpConsoleHistoryInfo->cbSize != sizeof(CONSOLE_HISTORY_INFO))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+ Request.Data.SetHistoryInfo.HistoryBufferSize = lpConsoleHistoryInfo->HistoryBufferSize;
+ Request.Data.SetHistoryInfo.NumberOfHistoryBuffers = lpConsoleHistoryInfo->NumberOfHistoryBuffers;
+ Request.Data.SetHistoryInfo.dwFlags = lpConsoleHistoryInfo->dwFlags;
+ Status = CsrClientCallServer(&Request, NULL, CsrRequest, sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+ return TRUE;
}
diff --git a/dll/win32/kernel32/misc/dllmain.c b/dll/win32/kernel32/misc/dllmain.c
index ef47c4d538f..5247b649501 100644
--- a/dll/win32/kernel32/misc/dllmain.c
+++ b/dll/win32/kernel32/misc/dllmain.c
@@ -130,6 +130,7 @@ BasepInitConsole(VOID)
NTSTATUS Status;
BOOLEAN NotConsole = FALSE;
PRTL_USER_PROCESS_PARAMETERS Parameters = NtCurrentPeb()->ProcessParameters;
+ LPCWSTR ExeName;
WCHAR lpTest[MAX_PATH];
GetModuleFileNameW(NULL, lpTest, MAX_PATH);
@@ -150,6 +151,7 @@ BasepInitConsole(VOID)
{
/* Assume one is needed */
Request.Data.AllocConsoleRequest.ConsoleNeeded = TRUE;
+ Request.Data.AllocConsoleRequest.Visible = TRUE;
/* Handle the special flags given to us by BasepInitializeEnvironment */
if (Parameters->ConsoleHandle == HANDLE_DETACHED_PROCESS)
@@ -168,8 +170,9 @@ BasepInitConsole(VOID)
else if (Parameters->ConsoleHandle == HANDLE_CREATE_NO_WINDOW)
{
/* We'll get the real one soon */
- DPRINT1("NOT SUPPORTED: HANDLE_CREATE_NO_WINDOW\n");
+ DPRINT("Creating new invisible console\n");
Parameters->ConsoleHandle = NULL;
+ Request.Data.AllocConsoleRequest.Visible = FALSE;
}
else
{
@@ -181,13 +184,17 @@ BasepInitConsole(VOID)
}
}
- /* Initialize Console Ctrl Handler */
+ /* Initialize Console Ctrl Handler and input EXE name */
ConsoleInitialized = TRUE;
RtlInitializeCriticalSection(&ConsoleLock);
NrAllocatedHandlers = 1;
NrCtrlHandlers = 1;
CtrlHandlers = InitialHandler;
CtrlHandlers[0] = DefaultConsoleCtrlHandler;
+
+ ExeName = wcsrchr(Parameters->ImagePathName.Buffer, L'\\');
+ if (ExeName)
+ SetConsoleInputExeNameW(ExeName + 1);
/* Now use the proper console handle */
Request.Data.AllocConsoleRequest.Console = Parameters->ConsoleHandle;
diff --git a/dll/win32/mciwave/mciwave.rbuild b/dll/win32/mciwave/mciwave.rbuild
index be21c0711ed..69e3c094388 100644
--- a/dll/win32/mciwave/mciwave.rbuild
+++ b/dll/win32/mciwave/mciwave.rbuild
@@ -1,4 +1,4 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/msacm32/msacm32.rbuild b/dll/win32/msacm32/msacm32.rbuild
index b6f802ee5bb..e32845920d7 100644
--- a/dll/win32/msacm32/msacm32.rbuild
+++ b/dll/win32/msacm32/msacm32.rbuild
@@ -1,7 +1,7 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/msadp32.acm/msadp32.acm.rbuild b/dll/win32/msadp32.acm/msadp32.acm.rbuild
index 89911f484c5..3dcc1c96085 100644
--- a/dll/win32/msadp32.acm/msadp32.acm.rbuild
+++ b/dll/win32/msadp32.acm/msadp32.acm.rbuild
@@ -1,4 +1,4 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/msafd/misc/dllmain.c b/dll/win32/msafd/misc/dllmain.c
index c832a856fdd..b0b1f317159 100644
--- a/dll/win32/msafd/misc/dllmain.c
+++ b/dll/win32/msafd/misc/dllmain.c
@@ -22,8 +22,7 @@ DWORD DebugTraceLevel = 0;
HANDLE GlobalHeap;
WSPUPCALLTABLE Upcalls;
LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest;
-ULONG SocketCount = 0;
-PSOCKET_INFORMATION *Sockets = NULL;
+PSOCKET_INFORMATION SocketListHead = NULL;
LIST_ENTRY SockHelpersListHead = { NULL, NULL };
ULONG SockAsyncThreadRefCount;
HANDLE SockAsyncHelperAfdHandle;
@@ -61,7 +60,7 @@ WSPSocket(int AddressFamily,
ULONG SizeOfEA;
PAFD_CREATE_PACKET AfdPacket;
HANDLE Sock;
- PSOCKET_INFORMATION Socket = NULL, PrevSocket = NULL;
+ PSOCKET_INFORMATION Socket = NULL;
PFILE_FULL_EA_INFORMATION EABuffer = NULL;
PHELPER_DATA HelperData;
PVOID HelperDLLContext;
@@ -261,17 +260,6 @@ WSPSocket(int AddressFamily,
/* Save Handle */
Socket->Handle = (SOCKET)Sock;
- /* XXX See if there's a structure we can reuse -- We need to do this
- * more properly. */
- PrevSocket = GetSocketStructure( (SOCKET)Sock );
-
- if( PrevSocket )
- {
- RtlCopyMemory( PrevSocket, Socket, sizeof(*Socket) );
- RtlFreeHeap( GlobalHeap, 0, Socket );
- Socket = PrevSocket;
- }
-
/* Save Group Info */
if (g != 0)
{
@@ -292,8 +280,8 @@ WSPSocket(int AddressFamily,
NULL);
/* Save in Process Sockets List */
- Sockets[SocketCount] = Socket;
- SocketCount ++;
+ Socket->NextSocket = SocketListHead;
+ SocketListHead = Socket;
/* Create the Socket Context */
CreateContext(Socket);
@@ -318,79 +306,95 @@ error:
return INVALID_SOCKET;
}
+INT
+TranslateNtStatusError(NTSTATUS Status)
+{
+ switch (Status)
+ {
+ case STATUS_CANT_WAIT:
+ return WSAEWOULDBLOCK;
+
+ case STATUS_TIMEOUT:
+ return WSAETIMEDOUT;
+
+ case STATUS_SUCCESS:
+ return NO_ERROR;
+
+ case STATUS_FILE_CLOSED:
+ case STATUS_END_OF_FILE:
+ return WSAESHUTDOWN;
+
+ case STATUS_PENDING:
+ return WSA_IO_PENDING;
+
+ case STATUS_BUFFER_TOO_SMALL:
+ case STATUS_BUFFER_OVERFLOW:
+ DbgPrint("MSAFD: STATUS_BUFFER_TOO_SMALL/STATUS_BUFFER_OVERFLOW\n");
+ return WSAEMSGSIZE;
+
+ case STATUS_NO_MEMORY:
+ case STATUS_INSUFFICIENT_RESOURCES:
+ DbgPrint("MSAFD: STATUS_NO_MEMORY/STATUS_INSUFFICIENT_RESOURCES\n");
+ return WSAENOBUFS;
+
+ case STATUS_INVALID_CONNECTION:
+ DbgPrint("MSAFD: STATUS_INVALID_CONNECTION\n");
+ return WSAEAFNOSUPPORT;
+
+ case STATUS_INVALID_ADDRESS:
+ DbgPrint("MSAFD: STATUS_INVALID_ADDRESS\n");
+ return WSAEADDRNOTAVAIL;
+
+ case STATUS_REMOTE_NOT_LISTENING:
+ DbgPrint("MSAFD: STATUS_REMOTE_NOT_LISTENING\n");
+ return WSAECONNREFUSED;
+
+ case STATUS_NETWORK_UNREACHABLE:
+ DbgPrint("MSAFD: STATUS_NETWORK_UNREACHABLE\n");
+ return WSAENETUNREACH;
+
+ case STATUS_INVALID_PARAMETER:
+ DbgPrint("MSAFD: STATUS_INVALID_PARAMETER\n");
+ return WSAEINVAL;
+
+ case STATUS_CANCELLED:
+ DbgPrint("MSAFD: STATUS_CANCELLED\n");
+ return WSA_OPERATION_ABORTED;
+
+ case STATUS_ADDRESS_ALREADY_EXISTS:
+ DbgPrint("MSAFD: STATUS_ADDRESS_ALREADY_EXISTS\n");
+ return WSAEADDRINUSE;
+
+ case STATUS_LOCAL_DISCONNECT:
+ DbgPrint("MSAFD: STATUS_LOCAL_DISCONNECT\n");
+ return WSAECONNABORTED;
+
+ case STATUS_REMOTE_DISCONNECT:
+ DbgPrint("MSAFD: STATUS_REMOTE_DISCONNECT\n");
+ return WSAECONNRESET;
+
+ default:
+ DbgPrint("MSAFD: Unhandled NTSTATUS value: 0x%x\n", Status);
+ return WSAENETDOWN;
+ }
+}
DWORD MsafdReturnWithErrno(NTSTATUS Status,
LPINT Errno,
DWORD Received,
LPDWORD ReturnedBytes)
{
- if( ReturnedBytes )
- *ReturnedBytes = 0;
- if( Errno )
+ *Errno = TranslateNtStatusError(Status);
+
+ if (ReturnedBytes)
{
- switch (Status)
- {
- case STATUS_CANT_WAIT:
- *Errno = WSAEWOULDBLOCK;
- break;
- case STATUS_TIMEOUT:
- *Errno = WSAETIMEDOUT;
- break;
- case STATUS_SUCCESS:
- /* Return Number of bytes Read */
- if( ReturnedBytes )
- *ReturnedBytes = Received;
- break;
- case STATUS_FILE_CLOSED:
- case STATUS_END_OF_FILE:
- *Errno = WSAESHUTDOWN;
- break;
- case STATUS_PENDING:
- *Errno = WSA_IO_PENDING;
- break;
- case STATUS_BUFFER_TOO_SMALL:
- case STATUS_BUFFER_OVERFLOW:
- DbgPrint("MSAFD: STATUS_BUFFER_TOO_SMALL/STATUS_BUFFER_OVERFLOW\n");
- *Errno = WSAEMSGSIZE;
- break;
- case STATUS_NO_MEMORY: /* Fall through to STATUS_INSUFFICIENT_RESOURCES */
- case STATUS_INSUFFICIENT_RESOURCES:
- DbgPrint("MSAFD: STATUS_NO_MEMORY/STATUS_INSUFFICIENT_RESOURCES\n");
- *Errno = WSAENOBUFS;
- break;
- case STATUS_INVALID_CONNECTION:
- DbgPrint("MSAFD: STATUS_INVALID_CONNECTION\n");
- *Errno = WSAEAFNOSUPPORT;
- break;
- case STATUS_INVALID_ADDRESS:
- DbgPrint("MSAFD: STATUS_INVALID_ADDRESS\n");
- *Errno = WSAEADDRNOTAVAIL;
- break;
- case STATUS_REMOTE_NOT_LISTENING:
- DbgPrint("MSAFD: STATUS_REMOTE_NOT_LISTENING\n");
- *Errno = WSAECONNREFUSED;
- break;
- case STATUS_NETWORK_UNREACHABLE:
- DbgPrint("MSAFD: STATUS_NETWORK_UNREACHABLE\n");
- *Errno = WSAENETUNREACH;
- break;
- case STATUS_INVALID_PARAMETER:
- DbgPrint("MSAFD: STATUS_INVALID_PARAMETER\n");
- *Errno = WSAEINVAL;
- break;
- case STATUS_CANCELLED:
- DbgPrint("MSAFD: STATUS_CANCELLED\n");
- *Errno = WSA_OPERATION_ABORTED;
- break;
- default:
- DbgPrint("MSAFD: Error %x is unknown\n", Status);
- *Errno = WSAEINVAL;
- break;
- }
+ if (!*Errno)
+ *ReturnedBytes = Received;
+ else
+ *ReturnedBytes = 0;
}
- /* Success */
- return Status == STATUS_SUCCESS ? 0 : SOCKET_ERROR;
+ return *Errno ? SOCKET_ERROR : 0;
}
/*
@@ -407,7 +411,7 @@ WSPCloseSocket(IN SOCKET Handle,
OUT LPINT lpErrno)
{
IO_STATUS_BLOCK IoStatusBlock;
- PSOCKET_INFORMATION Socket = NULL;
+ PSOCKET_INFORMATION Socket = NULL, CurrentSocket;
NTSTATUS Status;
HANDLE SockEvent;
AFD_DISCONNECT_INFO DisconnectInfo;
@@ -425,6 +429,12 @@ WSPCloseSocket(IN SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
if (Socket->HelperEvents & WSH_NOTIFY_CLOSE)
{
@@ -546,11 +556,32 @@ WSPCloseSocket(IN SOCKET Handle,
NtClose(Socket->TdiConnectionHandle);
Socket->TdiConnectionHandle = NULL;
+ if (SocketListHead == Socket)
+ {
+ SocketListHead = SocketListHead->NextSocket;
+ }
+ else
+ {
+ CurrentSocket = SocketListHead;
+ while (CurrentSocket->NextSocket)
+ {
+ if (CurrentSocket->NextSocket == Socket)
+ {
+ CurrentSocket->NextSocket = CurrentSocket->NextSocket->NextSocket;
+ break;
+ }
+
+ CurrentSocket = CurrentSocket->NextSocket;
+ }
+ }
+
+ HeapFree(GlobalHeap, 0, Socket);
+
/* Close the handle */
NtClose((HANDLE)Handle);
NtClose(SockEvent);
- return NO_ERROR;
+ return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
}
@@ -599,6 +630,12 @@ WSPBind(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ HeapFree(GlobalHeap, 0, BindData);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Set up Address in TDI Format */
BindData->Address.TAAddressCount = 1;
@@ -650,13 +687,17 @@ WSPBind(SOCKET Handle,
Status = IOSB.Status;
}
+ NtClose( SockEvent );
+ HeapFree(GlobalHeap, 0, BindData);
+
+ if (Status != STATUS_SUCCESS)
+ return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL );
+
/* Set up Socket Data */
Socket->SharedData.State = SocketBound;
Socket->TdiAddressHandle = (HANDLE)IOSB.Information;
- NtClose( SockEvent );
- HeapFree(GlobalHeap, 0, BindData);
- if (Status == STATUS_SUCCESS && (Socket->HelperEvents & WSH_NOTIFY_BIND))
+ if (Socket->HelperEvents & WSH_NOTIFY_BIND)
{
Status = Socket->HelperData->WSHNotify(Socket->HelperContext,
Socket->Handle,
@@ -688,6 +729,11 @@ WSPListen(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
if (Socket->SharedData.Listening)
return 0;
@@ -723,14 +769,17 @@ WSPListen(SOCKET Handle,
{
WaitForSingleObject(SockEvent, INFINITE);
Status = IOSB.Status;
- }
+ }
+
+ NtClose( SockEvent );
+
+ if (Status != STATUS_SUCCESS)
+ return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL );
/* Set to Listening */
Socket->SharedData.Listening = TRUE;
- NtClose( SockEvent );
-
- if (Status == STATUS_SUCCESS && (Socket->HelperEvents & WSH_NOTIFY_LISTEN))
+ if (Socket->HelperEvents & WSH_NOTIFY_LISTEN)
{
Status = Socket->HelperData->WSHNotify(Socket->HelperContext,
Socket->Handle,
@@ -891,6 +940,7 @@ WSPSelect(IN int nfds,
if (Status == STATUS_PENDING)
{
WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
}
/* Clear the Structures */
@@ -1028,6 +1078,12 @@ WSPAccept(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return INVALID_SOCKET;
+ }
/* If this is non-blocking, make sure there's something for us to accept */
FD_ZERO(&ReadSet);
@@ -1035,12 +1091,17 @@ WSPAccept(SOCKET Handle,
Timeout.tv_sec=0;
Timeout.tv_usec=0;
- WSPSelect(0, &ReadSet, NULL, NULL, &Timeout, NULL);
+ if (WSPSelect(0, &ReadSet, NULL, NULL, &Timeout, lpErrno) == SOCKET_ERROR)
+ {
+ NtClose(SockEvent);
+ return INVALID_SOCKET;
+ }
if (ReadSet.fd_array[0] != Socket->Handle)
{
NtClose(SockEvent);
- return 0;
+ *lpErrno = WSAEWOULDBLOCK;
+ return INVALID_SOCKET;
}
/* Send IOCTL */
@@ -1278,7 +1339,9 @@ WSPAccept(SOCKET Handle,
&ProtocolInfo,
GroupID,
Socket->SharedData.CreateFlags,
- NULL);
+ lpErrno);
+ if (AcceptSocket == INVALID_SOCKET)
+ return INVALID_SOCKET;
/* Set up the Accept Structure */
AcceptData.ListenHandle = (HANDLE)AcceptSocket;
@@ -1384,6 +1447,12 @@ WSPConnect(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Bind us First */
if (Socket->SharedData.State == SocketOpen)
@@ -1400,7 +1469,8 @@ WSPConnect(SOCKET Handle,
BindAddress,
&BindAddressLength);
/* Bind it */
- WSPBind(Handle, BindAddress, BindAddressLength, NULL);
+ if (WSPBind(Handle, BindAddress, BindAddressLength, lpErrno) == SOCKET_ERROR)
+ return INVALID_SOCKET;
}
/* Set the Connect Data */
@@ -1423,6 +1493,9 @@ WSPConnect(SOCKET Handle,
WaitForSingleObject(SockEvent, INFINITE);
Status = IOSB.Status;
}
+
+ if (Status != STATUS_SUCCESS)
+ goto notify;
}
/* Dynamic Structure...ugh */
@@ -1468,6 +1541,9 @@ WSPConnect(SOCKET Handle,
WaitForSingleObject(SockEvent, INFINITE);
Status = IOSB.Status;
}
+
+ if (Status != STATUS_SUCCESS)
+ goto notify;
}
/* AFD doesn't seem to care if these are invalid, but let's 0 them anyways */
@@ -1499,6 +1575,9 @@ WSPConnect(SOCKET Handle,
Status = IOSB.Status;
}
+ if (Status != STATUS_SUCCESS)
+ goto notify;
+
Socket->TdiConnectionHandle = (HANDLE)IOSB.Information;
/* Get any pending connect data */
@@ -1522,14 +1601,15 @@ WSPConnect(SOCKET Handle,
}
}
+ AFD_DbgPrint(MID_TRACE,("Ending\n"));
+
+notify:
/* Re-enable Async Event */
SockReenableAsyncSelectEvent(Socket, FD_WRITE);
/* FIXME: THIS IS NOT RIGHT!!! HACK HACK HACK! */
SockReenableAsyncSelectEvent(Socket, FD_CONNECT);
- AFD_DbgPrint(MID_TRACE,("Ending\n"));
-
NtClose( SockEvent );
if (Status == STATUS_SUCCESS && (Socket->HelperEvents & WSH_NOTIFY_CONNECT))
@@ -1589,6 +1669,12 @@ WSPShutdown(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Set AFD Disconnect Type */
switch (HowTo)
@@ -1663,6 +1749,12 @@ WSPGetSockName(IN SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Allocate a buffer for the address */
TdiAddressSize =
@@ -1751,6 +1843,12 @@ WSPGetPeerName(IN SOCKET s,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(s);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Allocate a buffer for the address */
TdiAddressSize = sizeof(TRANSPORT_ADDRESS) + *NameLength;
@@ -1828,6 +1926,11 @@ WSPIoctl(IN SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
switch( dwIoControlCode )
{
@@ -2122,8 +2225,12 @@ GetSocketInformation(PSOCKET_INFORMATION Socket,
if (Status == STATUS_PENDING)
{
WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
}
+ if (Status != STATUS_SUCCESS)
+ return -1;
+
/* Return Information */
if (Ulong != NULL)
{
@@ -2193,27 +2300,30 @@ SetSocketInformation(PSOCKET_INFORMATION Socket,
if (Status == STATUS_PENDING)
{
WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
}
NtClose( SockEvent );
- return 0;
+ return Status == STATUS_SUCCESS ? 0 : -1;
}
PSOCKET_INFORMATION
GetSocketStructure(SOCKET Handle)
{
- ULONG i;
+ PSOCKET_INFORMATION CurrentSocket;
- for (i=0; iHandle == Handle)
- {
- return Sockets[i];
- }
+ if (CurrentSocket->Handle == Handle)
+ return CurrentSocket;
+
+ CurrentSocket = CurrentSocket->NextSocket;
}
- return 0;
+
+ return NULL;
}
int CreateContext(PSOCKET_INFORMATION Socket)
@@ -2258,11 +2368,12 @@ int CreateContext(PSOCKET_INFORMATION Socket)
if (Status == STATUS_PENDING)
{
WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
}
NtClose( SockEvent );
- return 0;
+ return Status == STATUS_SUCCESS ? 0 : -1;
}
BOOLEAN SockCreateOrReferenceAsyncThread(VOID)
@@ -2730,10 +2841,6 @@ DllMain(HANDLE hInstDll,
/* Heap to use when allocating */
GlobalHeap = GetProcessHeap();
- /* Allocate Heap for 1024 Sockets, can be expanded later */
- Sockets = HeapAlloc(GetProcessHeap(), 0, sizeof(PSOCKET_INFORMATION) * 1024);
- if (!Sockets) return FALSE;
-
AFD_DbgPrint(MAX_TRACE, ("MSAFD.DLL has been loaded\n"));
break;
diff --git a/dll/win32/msafd/misc/event.c b/dll/win32/msafd/misc/event.c
index 9a49e31b282..a1dc8766148 100644
--- a/dll/win32/msafd/misc/event.c
+++ b/dll/win32/msafd/misc/event.c
@@ -36,6 +36,12 @@ WSPEventSelect(
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Set Socket to Non-Blocking */
BlockMode = 1;
@@ -104,12 +110,16 @@ WSPEventSelect(
/* Wait for return */
if (Status == STATUS_PENDING) {
WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
}
AFD_DbgPrint(MID_TRACE,("Waited\n"));
NtClose( SockEvent );
+ if (Status != STATUS_SUCCESS)
+ return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
+
AFD_DbgPrint(MID_TRACE,("Closed event\n"));
/* Set Socket Data*/
@@ -148,6 +158,12 @@ WSPEnumNetworkEvents(
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
EnumReq.Event = hEventObject;
@@ -168,13 +184,16 @@ WSPEnumNetworkEvents(
/* Wait for return */
if (Status == STATUS_PENDING) {
WaitForSingleObject(SockEvent, INFINITE);
- Status = STATUS_SUCCESS;
+ Status = IOSB.Status;
}
AFD_DbgPrint(MID_TRACE,("Waited\n"));
NtClose( SockEvent );
+ if (Status != STATUS_SUCCESS)
+ return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
+
AFD_DbgPrint(MID_TRACE,("Closed event\n"));
AFD_DbgPrint(MID_TRACE,("About to touch struct at %x (%d)\n",
lpNetworkEvents, sizeof(*lpNetworkEvents)));
@@ -186,44 +205,49 @@ WSPEnumNetworkEvents(
/* Set Events to wait for */
if (EnumReq.PollEvents & AFD_EVENT_RECEIVE) {
lpNetworkEvents->lNetworkEvents |= FD_READ;
+ lpNetworkEvents->iErrorCode[FD_READ_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_READ_BIT]);
}
if (EnumReq.PollEvents & AFD_EVENT_SEND) {
lpNetworkEvents->lNetworkEvents |= FD_WRITE;
+ lpNetworkEvents->iErrorCode[FD_WRITE_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_WRITE_BIT]);
}
if (EnumReq.PollEvents & AFD_EVENT_OOB_RECEIVE) {
lpNetworkEvents->lNetworkEvents |= FD_OOB;
+ lpNetworkEvents->iErrorCode[FD_OOB_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_OOB_BIT]);
}
if (EnumReq.PollEvents & AFD_EVENT_ACCEPT) {
lpNetworkEvents->lNetworkEvents |= FD_ACCEPT;
+ lpNetworkEvents->iErrorCode[FD_ACCEPT_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_ACCEPT_BIT]);
}
if (EnumReq.PollEvents &
(AFD_EVENT_CONNECT | AFD_EVENT_CONNECT_FAIL)) {
lpNetworkEvents->lNetworkEvents |= FD_CONNECT;
+ lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_CONNECT_BIT]);
}
if (EnumReq.PollEvents &
(AFD_EVENT_DISCONNECT | AFD_EVENT_ABORT | AFD_EVENT_CLOSE)) {
lpNetworkEvents->lNetworkEvents |= FD_CLOSE;
+ lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_CLOSE_BIT]);
}
if (EnumReq.PollEvents & AFD_EVENT_QOS) {
lpNetworkEvents->lNetworkEvents |= FD_QOS;
+ lpNetworkEvents->iErrorCode[FD_QOS_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_QOS_BIT]);
}
if (EnumReq.PollEvents & AFD_EVENT_GROUP_QOS) {
lpNetworkEvents->lNetworkEvents |= FD_GROUP_QOS;
+ lpNetworkEvents->iErrorCode[FD_GROUP_QOS_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_GROUP_QOS_BIT]);
}
- if( NT_SUCCESS(Status) ) *lpErrno = 0;
- else *lpErrno = WSAEINVAL;
-
AFD_DbgPrint(MID_TRACE,("Leaving\n"));
- return 0;
+ return MsafdReturnWithErrno(STATUS_SUCCESS, lpErrno, 0, NULL);
}
/* EOF */
diff --git a/dll/win32/msafd/misc/sndrcv.c b/dll/win32/msafd/misc/sndrcv.c
index 212b4fc25ca..557fdae910e 100644
--- a/dll/win32/msafd/misc/sndrcv.c
+++ b/dll/win32/msafd/misc/sndrcv.c
@@ -29,6 +29,11 @@ WSPAsyncSelect(IN SOCKET Handle,
/* Get the Socket Structure associated to this Socket */
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Allocate the Async Data Structure to pass on to the Thread later */
AsyncData = HeapAlloc(GetProcessHeap(), 0, sizeof(*AsyncData));
@@ -46,7 +51,11 @@ WSPAsyncSelect(IN SOCKET Handle,
/* Deactive WSPEventSelect */
if (Socket->SharedData.AsyncEvents)
{
- WSPEventSelect(Handle, NULL, 0, NULL);
+ if (WSPEventSelect(Handle, NULL, 0, lpErrno) == SOCKET_ERROR)
+ {
+ HeapFree(GetProcessHeap(), 0, AsyncData);
+ return SOCKET_ERROR;
+ }
}
/* Create the Asynch Thread if Needed */
@@ -111,6 +120,11 @@ WSPRecv(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
NULL, 1, FALSE );
@@ -182,7 +196,7 @@ WSPRecv(SOCKET Handle,
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
- Event ? Event : SockEvent,
+ Event,
APCFunction,
APCContext,
IOSB,
@@ -223,7 +237,7 @@ WSPRecv(SOCKET Handle,
}
/* Re-enable Async Event */
- if (*ReceiveFlags == MSG_OOB)
+ if (*ReceiveFlags & MSG_OOB)
{
SockReenableAsyncSelectEvent(Socket, FD_OOB);
}
@@ -261,6 +275,11 @@ WSPRecvFrom(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
NULL, 1, FALSE );
@@ -334,7 +353,7 @@ WSPRecvFrom(SOCKET Handle,
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
- Event ? Event : SockEvent,
+ Event,
APCFunction,
APCContext,
IOSB,
@@ -399,6 +418,11 @@ WSPSend(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
NULL, 1, FALSE );
@@ -461,7 +485,7 @@ WSPSend(SOCKET Handle,
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
- Event ? Event : SockEvent,
+ Event,
APCFunction,
APCContext,
IOSB,
@@ -483,7 +507,7 @@ WSPSend(SOCKET Handle,
if (Status == STATUS_PENDING)
{
AFD_DbgPrint(MID_TRACE,("Leaving (Pending)\n"));
- return WSA_IO_PENDING;
+ return MsafdReturnWithErrno(Status, lpErrno, IOSB->Information, lpNumberOfBytesSent);
}
/* Re-enable Async Event */
@@ -523,6 +547,11 @@ WSPSendTo(SOCKET Handle,
/* Get the Socket Structure associate to this Socket */
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Bind us First */
if (Socket->SharedData.State == SocketOpen)
@@ -540,7 +569,8 @@ WSPSendTo(SOCKET Handle,
BindAddress,
&BindAddressLength);
/* Bind it */
- WSPBind(Handle, BindAddress, BindAddressLength, NULL);
+ if (WSPBind(Handle, BindAddress, BindAddressLength, lpErrno) == SOCKET_ERROR)
+ return SOCKET_ERROR;
}
RemoteAddress = HeapAlloc(GlobalHeap, 0, 0x6 + SocketAddressLength);
@@ -612,7 +642,7 @@ WSPSendTo(SOCKET Handle,
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
- Event ? Event : SockEvent,
+ Event,
APCFunction,
APCContext,
IOSB,
@@ -637,11 +667,8 @@ WSPSendTo(SOCKET Handle,
HeapFree(GlobalHeap, 0, BindAddress);
}
- if (Status == STATUS_PENDING)
- return WSA_IO_PENDING;
-
- /* Re-enable Async Event */
- SockReenableAsyncSelectEvent(Socket, FD_WRITE);
+ if (Status != STATUS_PENDING)
+ SockReenableAsyncSelectEvent(Socket, FD_WRITE);
return MsafdReturnWithErrno(Status, lpErrno, IOSB->Information, lpNumberOfBytesSent);
}
diff --git a/dll/win32/msafd/msafd.h b/dll/win32/msafd/msafd.h
index d0423b71ee6..f5795152f12 100755
--- a/dll/win32/msafd/msafd.h
+++ b/dll/win32/msafd/msafd.h
@@ -100,6 +100,7 @@ typedef struct _SOCKET_INFORMATION {
BOOL TrySAN;
SOCKADDR WSLocalAddress;
SOCKADDR WSRemoteAddress;
+ struct _SOCKET_INFORMATION *NextSocket;
} SOCKET_INFORMATION, *PSOCKET_INFORMATION;
@@ -409,6 +410,8 @@ PSOCKET_INFORMATION GetSocketStructure(
SOCKET Handle
);
+INT TranslateNtStatusError( NTSTATUS Status );
+
VOID DeleteSocketStructure( SOCKET Handle );
int GetSocketInformation(
diff --git a/dll/win32/msg711.acm/msg711.acm.rbuild b/dll/win32/msg711.acm/msg711.acm.rbuild
index 468d9927b2f..88e87f98add 100644
--- a/dll/win32/msg711.acm/msg711.acm.rbuild
+++ b/dll/win32/msg711.acm/msg711.acm.rbuild
@@ -1,4 +1,4 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/mshtml/Nl.rc b/dll/win32/mshtml/Nl.rc
index 33baf39b518..d32980ba9fb 100644
--- a/dll/win32/mshtml/Nl.rc
+++ b/dll/win32/mshtml/Nl.rc
@@ -35,9 +35,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN
CAPTION "Wine-Gecko-Installatie"
FONT 8, "MS Shell Dlg"
{
- LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \
- "to work correctly. Wine can automatically download and install it for you.\n\n" \
- "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.",
+ LTEXT "Wine kon geen Gecko pakket vinden. Gecko is nodig voor programma's die gebruik maken " \
+ "van embedded HTML. Wine kan het automatisch voor u downloaden en installeren.\n\n" \
+ "Noot: het is aanbevolen om distro pakketten te gebruiken. Zie http://wiki.winehq.org/Gecko voor details.",
ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT
CONTROL "Voortgang", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12
DEFPUSHBUTTON "&Installeren", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP
diff --git a/dll/win32/mshtml/Ru.rc b/dll/win32/mshtml/Ru.rc
index 8d3a4c3cc0a..6722ddc5dfc 100644
--- a/dll/win32/mshtml/Ru.rc
+++ b/dll/win32/mshtml/Ru.rc
@@ -36,10 +36,12 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN
CAPTION "ĐŁŃтановка Wine Gecko"
FONT 8, "MS Shell Dlg"
{
- LTEXT "Wine не может найти пакет Gecko который Đ˝Ńжен для приложений ŃĐľ вŃтроенным HTML " \
- "для корректной работы. Wine может автоматичеŃки загрŃзить и ŃŃтановить его для ВаŃ.\n\n" \
- "Примечание: Рекомендовано иŃпользовать пакет из ВаŃего диŃтрибŃтива. ПоŃетите http://wiki.winehq.org/Gecko для деталей.",
- ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT
+ LTEXT "Wine не может найти пакет Gecko, который необходим для корректной работы приложений"\
+ "Ń ĐżĐľĐ´Đ´ĐµŃ€Đ¶ĐşĐľĐą HTML. " \
+ "Wine может автоматичеŃки загрŃзить и ŃŃтановить его для ваŃ.\n\n" \
+ "Примечание: рекомендŃетŃŃŹ иŃпользовать пакет, предоŃтавляемый ваŃим диŃтрибŃтивом. "\
+ "ПоŃетите http://wiki.winehq.org/Gecko для полŃчения более подробной информации.",
+ ID_DWL_STATUS, 10, 10, 240, 70, SS_LEFT
CONTROL "ПрогреŃŃ", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 65, 240, 12
DEFPUSHBUTTON "&ĐŁŃтановить", ID_DWL_INSTALL, 180, 85, 70, 15, WS_GROUP | WS_TABSTOP
PUSHBUTTON "&Отмена", IDCANCEL, 100, 85, 70, 15, WS_GROUP | WS_TABSTOP
diff --git a/dll/win32/mshtml/htmlbody.c b/dll/win32/mshtml/htmlbody.c
index 5c66e65a44a..18a60418cee 100644
--- a/dll/win32/mshtml/htmlbody.c
+++ b/dll/win32/mshtml/htmlbody.c
@@ -434,6 +434,10 @@ static HRESULT WINAPI HTMLBodyElement_put_text(IHTMLBodyElement *iface, VARIANT
nsres = nsIDOMHTMLBodyElement_SetText(This->nsbody, &text);
nsAString_Finish(&text);
+ if(NS_FAILED(nsres)) {
+ ERR("SetText failed: %08x\n", nsres);
+ return E_FAIL;
+ }
return S_OK;
}
@@ -462,7 +466,7 @@ static HRESULT WINAPI HTMLBodyElement_get_text(IHTMLBodyElement *iface, VARIANT
nsAString_Finish(&text);
- return S_OK;
+ return hres;
}
static HRESULT WINAPI HTMLBodyElement_put_link(IHTMLBodyElement *iface, VARIANT v)
diff --git a/dll/win32/mshtml/htmldoc.c b/dll/win32/mshtml/htmldoc.c
index 12aa8c002dc..61476328dd1 100644
--- a/dll/win32/mshtml/htmldoc.c
+++ b/dll/win32/mshtml/htmldoc.c
@@ -889,8 +889,25 @@ static HRESULT WINAPI HTMLDocument_close(IHTMLDocument2 *iface)
static HRESULT WINAPI HTMLDocument_clear(IHTMLDocument2 *iface)
{
HTMLDocument *This = HTMLDOC_THIS(iface);
- FIXME("(%p)\n", This);
- return E_NOTIMPL;
+ nsIDOMNSHTMLDocument *nsdoc;
+ nsresult nsres;
+
+ TRACE("(%p)\n", This);
+
+ nsres = nsIDOMHTMLDocument_QueryInterface(This->doc_node->nsdoc, &IID_nsIDOMNSHTMLDocument, (void**)&nsdoc);
+ if(NS_FAILED(nsres)) {
+ ERR("Could not get nsIDOMNSHTMLDocument iface: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ nsres = nsIDOMNSHTMLDocument_Clear(nsdoc);
+ nsIDOMNSHTMLDocument_Release(nsdoc);
+ if(NS_FAILED(nsres)) {
+ ERR("Clear failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI HTMLDocument_queryCommandSupported(IHTMLDocument2 *iface, BSTR cmdID,
diff --git a/dll/win32/mshtml/htmldoc3.c b/dll/win32/mshtml/htmldoc3.c
index e28297fce14..f4ea0962cee 100644
--- a/dll/win32/mshtml/htmldoc3.c
+++ b/dll/win32/mshtml/htmldoc3.c
@@ -308,15 +308,19 @@ static HRESULT WINAPI HTMLDocument3_get_dir(IHTMLDocument3 *iface, BSTR *p)
static HRESULT WINAPI HTMLDocument3_put_oncontextmenu(IHTMLDocument3 *iface, VARIANT v)
{
HTMLDocument *This = HTMLDOC3_THIS(iface);
- FIXME("(%p)->()\n", This);
- return E_NOTIMPL;
+
+ TRACE("(%p)->()\n", This);
+
+ return set_doc_event(This, EVENTID_CONTEXTMENU, &v);
}
static HRESULT WINAPI HTMLDocument3_get_oncontextmenu(IHTMLDocument3 *iface, VARIANT *p)
{
HTMLDocument *This = HTMLDOC3_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ return get_doc_event(This, EVENTID_CONTEXTMENU, p);
}
static HRESULT WINAPI HTMLDocument3_put_onstop(IHTMLDocument3 *iface, VARIANT v)
diff --git a/dll/win32/mshtml/htmlelem.c b/dll/win32/mshtml/htmlelem.c
index b0cb791a1e8..5bf29159aed 100644
--- a/dll/win32/mshtml/htmlelem.c
+++ b/dll/win32/mshtml/htmlelem.c
@@ -1803,13 +1803,11 @@ static HRESULT WINAPI HTMLFiltersCollection_get_length(IHTMLFiltersCollection *i
{
HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface);
+ if(!p)
+ return E_POINTER;
+
FIXME("(%p)->(%p) Always returning 0\n", This, p);
-
- if(!p)
- return E_POINTER;
-
- if(p)
- *p = 0;
+ *p = 0;
return S_OK;
}
diff --git a/dll/win32/mshtml/htmlevent.c b/dll/win32/mshtml/htmlevent.c
index eef006c962c..6925a0cf2ac 100644
--- a/dll/win32/mshtml/htmlevent.c
+++ b/dll/win32/mshtml/htmlevent.c
@@ -56,6 +56,9 @@ static const WCHAR onchangeW[] = {'o','n','c','h','a','n','g','e',0};
static const WCHAR clickW[] = {'c','l','i','c','k',0};
static const WCHAR onclickW[] = {'o','n','c','l','i','c','k',0};
+static const WCHAR contextmenuW[] = {'c','o','n','t','e','x','t','m','e','n','u',0};
+static const WCHAR oncontextmenuW[] = {'o','n','c','o','n','t','e','x','t','m','e','n','u',0};
+
static const WCHAR dblclickW[] = {'d','b','l','c','l','i','c','k',0};
static const WCHAR ondblclickW[] = {'o','n','d','b','l','c','l','i','c','k',0};
@@ -141,6 +144,8 @@ static const event_info_t event_info[] = {
EVENT_DEFAULTLISTENER|EVENT_BUBBLE},
{clickW, onclickW, EVENTT_MOUSE, DISPID_EVMETH_ONCLICK,
EVENT_DEFAULTLISTENER|EVENT_BUBBLE},
+ {contextmenuW, oncontextmenuW, EVENTT_MOUSE, DISPID_EVMETH_ONCONTEXTMENU,
+ EVENT_BUBBLE},
{dblclickW, ondblclickW, EVENTT_MOUSE, DISPID_EVMETH_ONDBLCLICK,
EVENT_DEFAULTLISTENER|EVENT_BUBBLE},
{dragW, ondragW, EVENTT_MOUSE, DISPID_EVMETH_ONDRAG,
@@ -283,16 +288,14 @@ static ULONG WINAPI HTMLEventObj_Release(IHTMLEventObj *iface)
static HRESULT WINAPI HTMLEventObj_GetTypeInfoCount(IHTMLEventObj *iface, UINT *pctinfo)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
- FIXME("(%p)->(%p)\n", This, pctinfo);
- return E_NOTIMPL;
+ return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->dispex), pctinfo);
}
static HRESULT WINAPI HTMLEventObj_GetTypeInfo(IHTMLEventObj *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
- FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
- return E_NOTIMPL;
+ return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->dispex), iTInfo, lcid, ppTInfo);
}
static HRESULT WINAPI HTMLEventObj_GetIDsOfNames(IHTMLEventObj *iface, REFIID riid,
@@ -300,9 +303,7 @@ static HRESULT WINAPI HTMLEventObj_GetIDsOfNames(IHTMLEventObj *iface, REFIID ri
LCID lcid, DISPID *rgDispId)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
- FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
- lcid, rgDispId);
- return E_NOTIMPL;
+ return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->dispex), riid, rgszNames, cNames, lcid, rgDispId);
}
static HRESULT WINAPI HTMLEventObj_Invoke(IHTMLEventObj *iface, DISPID dispIdMember,
@@ -310,9 +311,8 @@ static HRESULT WINAPI HTMLEventObj_Invoke(IHTMLEventObj *iface, DISPID dispIdMem
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
- FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
- lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
- return E_NOTIMPL;
+ return IDispatchEx_Invoke(DISPATCHEX(&This->dispex), dispIdMember, riid, lcid,
+ wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
}
static HRESULT WINAPI HTMLEventObj_get_srcElement(IHTMLEventObj *iface, IHTMLElement **p)
diff --git a/dll/win32/mshtml/htmlevent.h b/dll/win32/mshtml/htmlevent.h
index 6ba2fe29dc7..3a8619a068f 100644
--- a/dll/win32/mshtml/htmlevent.h
+++ b/dll/win32/mshtml/htmlevent.h
@@ -21,6 +21,7 @@ typedef enum {
EVENTID_BLUR,
EVENTID_CHANGE,
EVENTID_CLICK,
+ EVENTID_CONTEXTMENU,
EVENTID_DBLCLICK,
EVENTID_DRAG,
EVENTID_DRAGSTART,
diff --git a/dll/win32/mshtml/htmlform.c b/dll/win32/mshtml/htmlform.c
index 68860560148..8e169170a4b 100644
--- a/dll/win32/mshtml/htmlform.c
+++ b/dll/win32/mshtml/htmlform.c
@@ -41,6 +41,41 @@ struct HTMLFormElement {
#define HTMLFORM(x) (&(x)->lpHTMLFormElementVtbl)
+static HRESULT htmlform_item(HTMLFormElement *This, int i, IDispatch **ret)
+{
+ nsIDOMHTMLCollection *elements;
+ nsIDOMNode *item;
+ HTMLDOMNode *node;
+ nsresult nsres;
+
+ nsres = nsIDOMHTMLFormElement_GetElements(This->nsform, &elements);
+ if(NS_FAILED(nsres)) {
+ FIXME("GetElements failed: 0x%08x\n", nsres);
+ return E_FAIL;
+ }
+
+ nsres = nsIDOMHTMLCollection_Item(elements, i, &item);
+ nsIDOMHTMLCollection_Release(elements);
+ if(NS_FAILED(nsres)) {
+ FIXME("Item failed: 0x%08x\n", nsres);
+ return E_FAIL;
+ }
+
+ if(item) {
+ node = get_node(This->element.node.doc, item, TRUE);
+ if(!node)
+ return E_OUTOFMEMORY;
+
+ IHTMLDOMNode_AddRef(HTMLDOMNODE(node));
+ nsIDOMNode_Release(item);
+ *ret = (IDispatch*)HTMLDOMNODE(node);
+ }else {
+ *ret = NULL;
+ }
+
+ return S_OK;
+}
+
#define HTMLFORM_THIS(iface) DEFINE_THIS(HTMLFormElement, HTMLFormElement, iface)
static HRESULT WINAPI HTMLFormElement_QueryInterface(IHTMLFormElement *iface,
@@ -98,15 +133,43 @@ static HRESULT WINAPI HTMLFormElement_Invoke(IHTMLFormElement *iface, DISPID dis
static HRESULT WINAPI HTMLFormElement_put_action(IHTMLFormElement *iface, BSTR v)
{
HTMLFormElement *This = HTMLFORM_THIS(iface);
- FIXME("(%p)->(%s)\n", This, wine_dbgstr_w(v));
- return E_NOTIMPL;
+ nsAString action_str;
+ nsresult nsres;
+
+ TRACE("(%p)->(%s)\n", This, wine_dbgstr_w(v));
+
+ nsAString_InitDepend(&action_str, v);
+ nsres = nsIDOMHTMLFormElement_SetAction(This->nsform, &action_str);
+ nsAString_Finish(&action_str);
+ if(NS_FAILED(nsres)) {
+ ERR("SetAction failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI HTMLFormElement_get_action(IHTMLFormElement *iface, BSTR *p)
{
HTMLFormElement *This = HTMLFORM_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ nsAString action_str;
+ nsresult nsres;
+ HRESULT hres;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ nsAString_Init(&action_str, NULL);
+ nsres = nsIDOMHTMLFormElement_GetAction(This->nsform, &action_str);
+ if(NS_SUCCEEDED(nsres)) {
+ const PRUnichar *action;
+ nsAString_GetData(&action_str, &action);
+ hres = nsuri_to_url(action, FALSE, p);
+ }else {
+ ERR("GetAction failed: %08x\n", nsres);
+ hres = E_FAIL;
+ }
+
+ return hres;
}
static HRESULT WINAPI HTMLFormElement_put_dir(IHTMLFormElement *iface, BSTR v)
@@ -238,8 +301,19 @@ static HRESULT WINAPI HTMLFormElement_put_length(IHTMLFormElement *iface, LONG v
static HRESULT WINAPI HTMLFormElement_get_length(IHTMLFormElement *iface, LONG *p)
{
HTMLFormElement *This = HTMLFORM_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ PRInt32 length;
+ nsresult nsres;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ nsres = nsIDOMHTMLFormElement_GetLength(This->nsform, &length);
+ if(NS_FAILED(nsres)) {
+ ERR("GetLength failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ *p = length;
+ return S_OK;
}
static HRESULT WINAPI HTMLFormElement__newEnum(IHTMLFormElement *iface, IUnknown **p)
@@ -253,7 +327,20 @@ static HRESULT WINAPI HTMLFormElement_item(IHTMLFormElement *iface, VARIANT name
VARIANT index, IDispatch **pdisp)
{
HTMLFormElement *This = HTMLFORM_THIS(iface);
- FIXME("(%p)->(v v %p)\n", This, pdisp);
+
+ TRACE("(%p)->(%s %s %p)\n", This, debugstr_variant(&name), debugstr_variant(&index), pdisp);
+
+ if(!pdisp)
+ return E_INVALIDARG;
+ *pdisp = NULL;
+
+ if(V_VT(&name) == VT_I4) {
+ if(V_I4(&name) < 0)
+ return E_INVALIDARG;
+ return htmlform_item(This, V_I4(&name), pdisp);
+ }
+
+ FIXME("Unsupported args\n");
return E_NOTIMPL;
}
@@ -428,34 +515,21 @@ static HRESULT HTMLFormElement_invoke(HTMLDOMNode *iface,
EXCEPINFO *ei, IServiceProvider *caller)
{
HTMLFormElement *This = HTMLFORM_NODE_THIS(iface);
- nsIDOMHTMLCollection *elements;
- nsIDOMNode *item;
- HTMLDOMNode *node;
- nsresult nsres;
+ IDispatch *ret;
+ HRESULT hres;
TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, flags, params, res, ei, caller);
- nsres = nsIDOMHTMLFormElement_GetElements(This->nsform, &elements);
- if(NS_FAILED(nsres)) {
- FIXME("GetElements failed: 0x%08x\n", nsres);
- return E_FAIL;
+ hres = htmlform_item(This, id - MSHTML_DISPID_CUSTOM_MIN, &ret);
+ if(FAILED(hres))
+ return hres;
+
+ if(ret) {
+ V_VT(res) = VT_DISPATCH;
+ V_DISPATCH(res) = ret;
+ }else {
+ V_VT(res) = VT_NULL;
}
-
- nsres = nsIDOMHTMLCollection_Item(elements, id - MSHTML_DISPID_CUSTOM_MIN, &item);
- nsIDOMHTMLCollection_Release(elements);
- if(NS_FAILED(nsres)) {
- FIXME("Item failed: 0x%08x\n", nsres);
- return E_FAIL;
- }
-
- node = get_node(This->element.node.doc, item, TRUE);
-
- V_VT(res) = VT_DISPATCH;
- V_DISPATCH(res) = (IDispatch*)node;
-
- IHTMLDOMNode_AddRef(HTMLDOMNODE(node));
- nsIDOMNode_Release(item);
-
return S_OK;
}
diff --git a/dll/win32/mshtml/htmlinput.c b/dll/win32/mshtml/htmlinput.c
index 1b8d1c5413f..76a5063bc2e 100644
--- a/dll/win32/mshtml/htmlinput.c
+++ b/dll/win32/mshtml/htmlinput.c
@@ -106,8 +106,24 @@ static HRESULT WINAPI HTMLInputElement_Invoke(IHTMLInputElement *iface, DISPID d
static HRESULT WINAPI HTMLInputElement_put_type(IHTMLInputElement *iface, BSTR v)
{
HTMLInputElement *This = HTMLINPUT_THIS(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_w(v));
- return E_NOTIMPL;
+ nsAString type_str;
+ nsresult nsres;
+
+ TRACE("(%p)->(%s)\n", This, debugstr_w(v));
+
+ /*
+ * FIXME:
+ * On IE setting type works only on dynamically created elements before adding them to DOM tree.
+ */
+ nsAString_InitDepend(&type_str, v);
+ nsres = nsIDOMHTMLInputElement_SetType(This->nsinput, &type_str);
+ nsAString_Finish(&type_str);
+ if(NS_FAILED(nsres)) {
+ ERR("SetType failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI HTMLInputElement_get_type(IHTMLInputElement *iface, BSTR *p)
@@ -180,8 +196,20 @@ static HRESULT WINAPI HTMLInputElement_get_value(IHTMLInputElement *iface, BSTR
static HRESULT WINAPI HTMLInputElement_put_name(IHTMLInputElement *iface, BSTR v)
{
HTMLInputElement *This = HTMLINPUT_THIS(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_w(v));
- return E_NOTIMPL;
+ nsAString name_str;
+ nsresult nsres;
+
+ TRACE("(%p)->(%s)\n", This, debugstr_w(v));
+
+ nsAString_InitDepend(&name_str, v);
+ nsres = nsIDOMHTMLInputElement_SetName(This->nsinput, &name_str);
+ nsAString_Finish(&name_str);
+ if(NS_FAILED(nsres)) {
+ ERR("SetName failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI HTMLInputElement_get_name(IHTMLInputElement *iface, BSTR *p)
@@ -190,6 +218,7 @@ static HRESULT WINAPI HTMLInputElement_get_name(IHTMLInputElement *iface, BSTR *
nsAString name_str;
const PRUnichar *name;
nsresult nsres;
+ HRESULT hres = S_OK;
TRACE("(%p)->(%p)\n", This, p);
@@ -198,16 +227,14 @@ static HRESULT WINAPI HTMLInputElement_get_name(IHTMLInputElement *iface, BSTR *
nsres = nsIDOMHTMLInputElement_GetName(This->nsinput, &name_str);
if(NS_SUCCEEDED(nsres)) {
nsAString_GetData(&name_str, &name);
- *p = SysAllocString(name);
+ *p = *name ? SysAllocString(name) : NULL;
}else {
ERR("GetName failed: %08x\n", nsres);
- return E_FAIL;
+ hres = E_FAIL;
}
nsAString_Finish(&name_str);
-
- TRACE("name=%s\n", debugstr_w(*p));
- return S_OK;
+ return hres;
}
static HRESULT WINAPI HTMLInputElement_put_status(IHTMLInputElement *iface, VARIANT_BOOL v)
diff --git a/dll/win32/mshtml/htmloption.c b/dll/win32/mshtml/htmloption.c
index 3e037627bf1..b8166341bd4 100644
--- a/dll/win32/mshtml/htmloption.c
+++ b/dll/win32/mshtml/htmloption.c
@@ -98,15 +98,35 @@ static HRESULT WINAPI HTMLOptionElement_Invoke(IHTMLOptionElement *iface, DISPID
static HRESULT WINAPI HTMLOptionElement_put_selected(IHTMLOptionElement *iface, VARIANT_BOOL v)
{
HTMLOptionElement *This = HTMLOPTION_THIS(iface);
- FIXME("(%p)->(%x)\n", This, v);
- return E_NOTIMPL;
+ nsresult nsres;
+
+ TRACE("(%p)->(%x)\n", This, v);
+
+ nsres = nsIDOMHTMLOptionElement_SetSelected(This->nsoption, v != VARIANT_FALSE);
+ if(NS_FAILED(nsres)) {
+ ERR("SetSelected failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI HTMLOptionElement_get_selected(IHTMLOptionElement *iface, VARIANT_BOOL *p)
{
HTMLOptionElement *This = HTMLOPTION_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ PRBool selected;
+ nsresult nsres;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ nsres = nsIDOMHTMLOptionElement_GetSelected(This->nsoption, &selected);
+ if(NS_FAILED(nsres)) {
+ ERR("GetSelected failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ *p = selected ? VARIANT_TRUE : VARIANT_FALSE;
+ return S_OK;
}
static HRESULT WINAPI HTMLOptionElement_put_value(IHTMLOptionElement *iface, BSTR v)
diff --git a/dll/win32/mshtml/htmlselect.c b/dll/win32/mshtml/htmlselect.c
index 6698606a4c4..f3aa36f650f 100644
--- a/dll/win32/mshtml/htmlselect.c
+++ b/dll/win32/mshtml/htmlselect.c
@@ -42,6 +42,43 @@ typedef struct {
#define HTMLSELECT(x) ((IHTMLSelectElement*) &(x)->lpHTMLSelectElementVtbl)
+static HRESULT htmlselect_item(HTMLSelectElement *This, int i, IDispatch **ret)
+{
+ nsIDOMHTMLOptionsCollection *nscol;
+ nsIDOMNode *nsnode;
+ nsresult nsres;
+
+ nsres = nsIDOMHTMLSelectElement_GetOptions(This->nsselect, &nscol);
+ if(NS_FAILED(nsres)) {
+ ERR("GetOptions failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ nsres = nsIDOMHTMLOptionsCollection_Item(nscol, i, &nsnode);
+ nsIDOMHTMLOptionsCollection_Release(nscol);
+ if(NS_FAILED(nsres)) {
+ ERR("Item failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ if(nsnode) {
+ HTMLDOMNode *node;
+
+ node = get_node(This->element.node.doc, nsnode, TRUE);
+ nsIDOMNode_Release(nsnode);
+ if(!node) {
+ ERR("Could not find node\n");
+ return E_FAIL;
+ }
+
+ IHTMLDOMNode_AddRef(HTMLDOMNODE(node));
+ *ret = (IDispatch*)HTMLDOMNODE(node);
+ }else {
+ *ret = NULL;
+ }
+ return S_OK;
+}
+
#define HTMLSELECT_THIS(iface) DEFINE_THIS(HTMLSelectElement, HTMLSelectElement, iface)
static HRESULT WINAPI HTMLSelectElement_QueryInterface(IHTMLSelectElement *iface,
@@ -170,8 +207,12 @@ static HRESULT WINAPI HTMLSelectElement_get_name(IHTMLSelectElement *iface, BSTR
static HRESULT WINAPI HTMLSelectElement_get_options(IHTMLSelectElement *iface, IDispatch **p)
{
HTMLSelectElement *This = HTMLSELECT_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ *p = (IDispatch*)HTMLSELECT(This);
+ IDispatch_AddRef(*p);
+ return S_OK;
}
static HRESULT WINAPI HTMLSelectElement_put_onchange(IHTMLSelectElement *iface, VARIANT v)
@@ -364,8 +405,15 @@ static HRESULT WINAPI HTMLSelectElement_remove(IHTMLSelectElement *iface, LONG i
static HRESULT WINAPI HTMLSelectElement_put_length(IHTMLSelectElement *iface, LONG v)
{
HTMLSelectElement *This = HTMLSELECT_THIS(iface);
- FIXME("(%p)->(%d)\n", This, v);
- return E_NOTIMPL;
+ nsresult nsres;
+
+ TRACE("(%p)->(%d)\n", This, v);
+
+ nsres = nsIDOMHTMLSelectElement_SetLength(This->nsselect, v);
+ if(NS_FAILED(nsres))
+ ERR("SetLength failed: %08x\n", nsres);
+
+ return S_OK;
}
static HRESULT WINAPI HTMLSelectElement_get_length(IHTMLSelectElement *iface, LONG *p)
@@ -397,7 +445,20 @@ static HRESULT WINAPI HTMLSelectElement_item(IHTMLSelectElement *iface, VARIANT
VARIANT index, IDispatch **pdisp)
{
HTMLSelectElement *This = HTMLSELECT_THIS(iface);
- FIXME("(%p)->(v v %p)\n", This, pdisp);
+
+ TRACE("(%p)->(%s %s %p)\n", This, debugstr_variant(&name), debugstr_variant(&index), pdisp);
+
+ if(!pdisp)
+ return E_POINTER;
+ *pdisp = NULL;
+
+ if(V_VT(&name) == VT_I4) {
+ if(V_I4(&name) < 0)
+ return E_INVALIDARG;
+ return htmlselect_item(This, V_I4(&name), pdisp);
+ }
+
+ FIXME("Unsupported args\n");
return E_NOTIMPL;
}
@@ -493,6 +554,60 @@ static HRESULT HTMLSelectElementImpl_get_disabled(HTMLDOMNode *iface, VARIANT_BO
return IHTMLSelectElement_get_disabled(HTMLSELECT(This), p);
}
+#define DISPID_OPTIONCOL_0 MSHTML_DISPID_CUSTOM_MIN
+
+static HRESULT HTMLSelectElement_get_dispid(HTMLDOMNode *iface, BSTR name, DWORD flags, DISPID *dispid)
+{
+ const WCHAR *ptr;
+ DWORD idx = 0;
+
+ for(ptr = name; *ptr && isdigitW(*ptr); ptr++) {
+ idx = idx*10 + (*ptr-'0');
+ if(idx > MSHTML_CUSTOM_DISPID_CNT) {
+ WARN("too big idx\n");
+ return DISP_E_UNKNOWNNAME;
+ }
+ }
+ if(*ptr)
+ return DISP_E_UNKNOWNNAME;
+
+ *dispid = DISPID_OPTIONCOL_0 + idx;
+ return S_OK;
+}
+
+static HRESULT HTMLSelectElement_invoke(HTMLDOMNode *iface, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
+ VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
+{
+ HTMLSelectElement *This = HTMLSELECT_NODE_THIS(iface);
+
+ TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, flags, params, res, ei, caller);
+
+ switch(flags) {
+ case DISPATCH_PROPERTYGET: {
+ IDispatch *ret;
+ HRESULT hres;
+
+ hres = htmlselect_item(This, id-DISPID_OPTIONCOL_0, &ret);
+ if(FAILED(hres))
+ return hres;
+
+ if(ret) {
+ V_VT(res) = VT_DISPATCH;
+ V_DISPATCH(res) = ret;
+ }else {
+ V_VT(res) = VT_NULL;
+ }
+ break;
+ }
+
+ default:
+ FIXME("unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
+}
+
#undef HTMLSELECT_NODE_THIS
static const NodeImplVtbl HTMLSelectElementImplVtbl = {
@@ -501,7 +616,11 @@ static const NodeImplVtbl HTMLSelectElementImplVtbl = {
NULL,
NULL,
HTMLSelectElementImpl_put_disabled,
- HTMLSelectElementImpl_get_disabled
+ HTMLSelectElementImpl_get_disabled,
+ NULL,
+ NULL,
+ HTMLSelectElement_get_dispid,
+ HTMLSelectElement_invoke
};
static const tid_t HTMLSelectElement_tids[] = {
diff --git a/dll/win32/mshtml/htmltextarea.c b/dll/win32/mshtml/htmltextarea.c
index 9ded8ac6e12..dd33c72df21 100644
--- a/dll/win32/mshtml/htmltextarea.c
+++ b/dll/win32/mshtml/htmltextarea.c
@@ -105,8 +105,20 @@ static HRESULT WINAPI HTMLTextAreaElement_get_type(IHTMLTextAreaElement *iface,
static HRESULT WINAPI HTMLTextAreaElement_put_value(IHTMLTextAreaElement *iface, BSTR v)
{
HTMLTextAreaElement *This = HTMLTXTAREA_THIS(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_w(v));
- return E_NOTIMPL;
+ nsAString value_str;
+ nsresult nsres;
+
+ TRACE("(%p)->(%s)\n", This, debugstr_w(v));
+
+ nsAString_InitDepend(&value_str, v);
+ nsres = nsIDOMHTMLTextAreaElement_SetValue(This->nstextarea, &value_str);
+ nsAString_Finish(&value_str);
+ if(NS_FAILED(nsres)) {
+ ERR("SetValue failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI HTMLTextAreaElement_get_value(IHTMLTextAreaElement *iface, BSTR *p)
@@ -115,6 +127,7 @@ static HRESULT WINAPI HTMLTextAreaElement_get_value(IHTMLTextAreaElement *iface,
nsAString value_str;
const PRUnichar *value;
nsresult nsres;
+ HRESULT hres = S_OK;
TRACE("(%p)->(%p)\n", This, p);
@@ -123,15 +136,14 @@ static HRESULT WINAPI HTMLTextAreaElement_get_value(IHTMLTextAreaElement *iface,
nsres = nsIDOMHTMLTextAreaElement_GetValue(This->nstextarea, &value_str);
if(NS_SUCCEEDED(nsres)) {
nsAString_GetData(&value_str, &value);
- *p = SysAllocString(value);
+ *p = *value ? SysAllocString(value) : NULL;
}else {
ERR("GetValue failed: %08x\n", nsres);
+ hres = E_FAIL;
}
nsAString_Finish(&value_str);
-
- TRACE("%s\n", debugstr_w(*p));
- return S_OK;
+ return hres;
}
static HRESULT WINAPI HTMLTextAreaElement_put_name(IHTMLTextAreaElement *iface, BSTR v)
@@ -253,15 +265,35 @@ static HRESULT WINAPI HTMLTextAreaElement_get_onselect(IHTMLTextAreaElement *ifa
static HRESULT WINAPI HTMLTextAreaElement_put_readOnly(IHTMLTextAreaElement *iface, VARIANT_BOOL v)
{
HTMLTextAreaElement *This = HTMLTXTAREA_THIS(iface);
- FIXME("(%p)->(%x)\n", This, v);
- return E_NOTIMPL;
+ nsresult nsres;
+
+ TRACE("(%p)->(%x)\n", This, v);
+
+ nsres = nsIDOMHTMLTextAreaElement_SetReadOnly(This->nstextarea, v != VARIANT_FALSE);
+ if(NS_FAILED(nsres)) {
+ ERR("SetReadOnly failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI HTMLTextAreaElement_get_readOnly(IHTMLTextAreaElement *iface, VARIANT_BOOL *p)
{
HTMLTextAreaElement *This = HTMLTXTAREA_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ PRBool b;
+ nsresult nsres;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ nsres = nsIDOMHTMLTextAreaElement_GetReadOnly(This->nstextarea, &b);
+ if(NS_FAILED(nsres)) {
+ ERR("GetReadOnly failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ *p = b ? VARIANT_TRUE : VARIANT_FALSE;
+ return S_OK;
}
static HRESULT WINAPI HTMLTextAreaElement_put_rows(IHTMLTextAreaElement *iface, LONG v)
diff --git a/dll/win32/mshtml/htmlwindow.c b/dll/win32/mshtml/htmlwindow.c
index 5dbea55905c..1701b533288 100644
--- a/dll/win32/mshtml/htmlwindow.c
+++ b/dll/win32/mshtml/htmlwindow.c
@@ -511,20 +511,34 @@ static HRESULT WINAPI HTMLWindow2_clearTimeout(IHTMLWindow2 *iface, LONG timerID
return clear_task_timer(&This->doc->basedoc, FALSE, timerID);
}
+#define MAX_MESSAGE_LEN 2000
+
static HRESULT WINAPI HTMLWindow2_alert(IHTMLWindow2 *iface, BSTR message)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
- WCHAR wszTitle[100];
+ WCHAR title[100], *msg = message;
+ DWORD len;
TRACE("(%p)->(%s)\n", This, debugstr_w(message));
- if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, wszTitle,
- sizeof(wszTitle)/sizeof(WCHAR))) {
+ if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, title,
+ sizeof(title)/sizeof(WCHAR))) {
WARN("Could not load message box title: %d\n", GetLastError());
return S_OK;
}
- MessageBoxW(This->doc_obj->hwnd, message, wszTitle, MB_ICONWARNING);
+ len = SysStringLen(message);
+ if(len > MAX_MESSAGE_LEN) {
+ msg = heap_alloc((MAX_MESSAGE_LEN+1)*sizeof(WCHAR));
+ if(!msg)
+ return E_OUTOFMEMORY;
+ memcpy(msg, message, MAX_MESSAGE_LEN*sizeof(WCHAR));
+ msg[MAX_MESSAGE_LEN] = 0;
+ }
+
+ MessageBoxW(This->doc_obj->hwnd, msg, title, MB_ICONWARNING);
+ if(msg != message)
+ heap_free(msg);
return S_OK;
}
diff --git a/dll/win32/mshtml/install.c b/dll/win32/mshtml/install.c
index 4122194a7cc..e47c28423d0 100644
--- a/dll/win32/mshtml/install.c
+++ b/dll/win32/mshtml/install.c
@@ -60,6 +60,11 @@ static const WCHAR mshtml_keyW[] =
'\\','W','i','n','e',
'\\','M','S','H','T','M','L',0};
+static const CHAR mshtml_keyA[] =
+ {'S','o','f','t','w','a','r','e',
+ '\\','W','i','n','e',
+ '\\','M','S','H','T','M','L',0};
+
static HWND install_dialog = NULL;
static LPWSTR tmp_file_name = NULL;
static HANDLE tmp_file = INVALID_HANDLE_VALUE;
@@ -225,23 +230,18 @@ static BOOL install_from_unix_file(const char *file_name)
static BOOL install_from_registered_dir(void)
{
char *file_name;
- HKEY hkey;
DWORD res, type, size = MAX_PATH;
BOOL ret;
- /* @@ Wine registry key: HKCU\Software\Wine\MSHTML */
- res = RegOpenKeyW(HKEY_CURRENT_USER, mshtml_keyW, &hkey);
- if(res != ERROR_SUCCESS)
- return FALSE;
-
file_name = heap_alloc(size+sizeof(GECKO_FILE_NAME));
- res = RegQueryValueExA(hkey, "GeckoCabDir", NULL, &type, (PBYTE)file_name, &size);
+ /* @@ Wine registry key: HKCU\Software\Wine\MSHTML */
+ res = RegGetValueA(HKEY_CURRENT_USER, mshtml_keyA, "GeckoCabDir", RRF_RT_ANY, &type, (PBYTE)file_name, &size);
if(res == ERROR_MORE_DATA) {
file_name = heap_realloc(file_name, size+sizeof(GECKO_FILE_NAME));
- res = RegQueryValueExA(hkey, "GeckoCabDir", NULL, &type, (PBYTE)file_name, &size);
+ res = RegGetValueA(HKEY_CURRENT_USER, mshtml_keyA, "GeckoCabDir", RRF_RT_ANY, &type, (PBYTE)file_name, &size);
}
- RegCloseKey(hkey);
- if(res != ERROR_SUCCESS || type != REG_SZ) {
+
+ if(res != ERROR_SUCCESS || (type != REG_SZ && type != REG_EXPAND_SZ)) {
heap_free(file_name);
return FALSE;
}
diff --git a/dll/win32/mshtml/mshtml_private.h b/dll/win32/mshtml/mshtml_private.h
index 3db8d791e48..4deb4d6357d 100644
--- a/dll/win32/mshtml/mshtml_private.h
+++ b/dll/win32/mshtml/mshtml_private.h
@@ -144,6 +144,7 @@ typedef struct dispex_dynamic_data_t dispex_dynamic_data_t;
#define MSHTML_DISPID_CUSTOM_MIN 0x60000000
#define MSHTML_DISPID_CUSTOM_MAX 0x6fffffff
+#define MSHTML_CUSTOM_DISPID_CNT (MSHTML_DISPID_CUSTOM_MAX-MSHTML_DISPID_CUSTOM_MIN)
typedef struct {
HRESULT (*value)(IUnknown*,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
@@ -727,8 +728,10 @@ HRESULT call_set_active_object(IOleInPlaceUIWindow*,IOleInPlaceActiveObject*);
void *nsalloc(size_t) __WINE_ALLOC_SIZE(1);
void nsfree(void*);
+void nsACString_InitDepend(nsACString*,const char*);
void nsACString_SetData(nsACString*,const char*);
PRUint32 nsACString_GetData(const nsACString*,const char**);
+void nsACString_Finish(nsACString*);
BOOL nsAString_Init(nsAString*,const PRUnichar*);
void nsAString_InitDepend(nsAString*,const PRUnichar*);
diff --git a/dll/win32/mshtml/nsembed.c b/dll/win32/mshtml/nsembed.c
index 8a590079278..56c5d945618 100644
--- a/dll/win32/mshtml/nsembed.c
+++ b/dll/win32/mshtml/nsembed.c
@@ -32,6 +32,7 @@
#include "wine/unicode.h"
#include "mshtml_private.h"
+#include "htmlevent.h"
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
WINE_DECLARE_DEBUG_CHANNEL(gecko);
@@ -48,20 +49,14 @@ WINE_DECLARE_DEBUG_CHANNEL(gecko);
#define PR_UINT32_MAX 0xffffffff
-struct nsCStringContainer {
- void *v;
- void *d1;
- PRUint32 d2;
- PRUint32 d3;
-};
-
#define NS_STRING_CONTAINER_INIT_DEPEND 0x0002
+#define NS_CSTRING_CONTAINER_INIT_DEPEND 0x0002
static nsresult (*NS_InitXPCOM2)(nsIServiceManager**,void*,void*);
static nsresult (*NS_ShutdownXPCOM)(nsIServiceManager*);
static nsresult (*NS_GetComponentRegistrar)(nsIComponentRegistrar**);
static nsresult (*NS_StringContainerInit2)(nsStringContainer*,const PRUnichar*,PRUint32,PRUint32);
-static nsresult (*NS_CStringContainerInit)(nsCStringContainer*);
+static nsresult (*NS_CStringContainerInit2)(nsCStringContainer*,const char*,PRUint32,PRUint32);
static nsresult (*NS_StringContainerFinish)(nsStringContainer*);
static nsresult (*NS_CStringContainerFinish)(nsCStringContainer*);
static nsresult (*NS_StringSetData)(nsAString*,const PRUnichar*,PRUint32);
@@ -188,7 +183,7 @@ static BOOL load_xpcom(const PRUnichar *gre_path)
NS_DLSYM(NS_ShutdownXPCOM);
NS_DLSYM(NS_GetComponentRegistrar);
NS_DLSYM(NS_StringContainerInit2);
- NS_DLSYM(NS_CStringContainerInit);
+ NS_DLSYM(NS_CStringContainerInit2);
NS_DLSYM(NS_StringContainerFinish);
NS_DLSYM(NS_CStringContainerFinish);
NS_DLSYM(NS_StringSetData);
@@ -526,11 +521,18 @@ void nsfree(void *mem)
nsIMemory_Free(nsmem, mem);
}
-static void nsACString_Init(nsACString *str, const char *data)
+static BOOL nsACString_Init(nsACString *str, const char *data)
{
- NS_CStringContainerInit(str);
- if(data)
- nsACString_SetData(str, data);
+ return NS_SUCCEEDED(NS_CStringContainerInit2(str, data, PR_UINT32_MAX, 0));
+}
+
+/*
+ * Initializes nsACString with data owned by caller.
+ * Caller must ensure that data is valid during lifetime of string object.
+ */
+void nsACString_InitDepend(nsACString *str, const char *data)
+{
+ NS_CStringContainerInit2(str, data, PR_UINT32_MAX, NS_CSTRING_CONTAINER_INIT_DEPEND);
}
void nsACString_SetData(nsACString *str, const char *data)
@@ -543,7 +545,7 @@ PRUint32 nsACString_GetData(const nsACString *str, const char **data)
return NS_CStringGetData(str, data, NULL);
}
-static void nsACString_Finish(nsACString *str)
+void nsACString_Finish(nsACString *str)
{
NS_CStringContainerFinish(str);
}
@@ -1006,6 +1008,8 @@ static nsresult NSAPI nsContextMenuListener_OnShowContextMenu(nsIContextMenuList
TRACE("(%p)->(%08x %p %p)\n", This, aContextFlags, aEvent, aNode);
+ fire_event(This->doc->basedoc.doc_node /* FIXME */, EVENTID_CONTEXTMENU, TRUE, aNode, aEvent);
+
nsres = nsIDOMEvent_QueryInterface(aEvent, &IID_nsIDOMMouseEvent, (void**)&event);
if(NS_FAILED(nsres)) {
ERR("Could not get nsIDOMMouseEvent interface: %08x\n", nsres);
diff --git a/dll/win32/mshtml/nsiface.idl b/dll/win32/mshtml/nsiface.idl
index 66ab8e6a49b..4ccc64a7c02 100644
--- a/dll/win32/mshtml/nsiface.idl
+++ b/dll/win32/mshtml/nsiface.idl
@@ -119,7 +119,6 @@ typedef nsISupports nsIDOMDOMImplementation;
typedef nsISupports nsIDOMCDATASection;
typedef nsISupports nsIDOMProcessingInstruction;
typedef nsISupports nsIDOMEntityReference;
-typedef nsISupports nsIDOMHTMLOptionsCollection;
typedef nsISupports nsIWebProgressListener;
typedef nsISupports nsIDOMCSSValue;
typedef nsISupports nsIPrintSession;
@@ -1319,6 +1318,20 @@ interface nsIDOMHTMLOptionElement : nsIDOMHTMLElement
nsresult SetValue(const nsAString *aValue);
}
+[
+ object,
+ uuid(bce0213c-f70f-488f-b93f-688acca55d63),
+ local
+ /* FROZEN */
+]
+interface nsIDOMHTMLOptionsCollection : nsISupports
+{
+ nsresult GetLength(PRUint32 *aLength);
+ nsresult SetLength(PRUint32 aLength);
+ nsresult Item(PRUint32 index, nsIDOMNode **_retval);
+ nsresult NamedItem(const nsAString *name, nsIDOMNode **_retval);
+}
+
[
object,
uuid(a6cf9090-15b3-11d2-932e-00805f8add32),
diff --git a/dll/win32/mshtml/nsio.c b/dll/win32/mshtml/nsio.c
index 0c8e45704d7..63c9a6a3d6a 100644
--- a/dll/win32/mshtml/nsio.c
+++ b/dll/win32/mshtml/nsio.c
@@ -196,16 +196,15 @@ static BOOL translate_url(HTMLDocumentObj *doc, nsWineURI *uri)
url = heap_strdupW(uri->wine_url);
hres = IDocHostUIHandler_TranslateUrl(doc->hostui, 0, url, &new_url);
- heap_free(url);
- if(hres != S_OK || !new_url)
- return FALSE;
-
- if(strcmpW(url, new_url)) {
- FIXME("TranslateUrl returned new URL %s -> %s\n", debugstr_w(url), debugstr_w(new_url));
- ret = TRUE;
+ if(hres == S_OK && new_url) {
+ if(strcmpW(url, new_url)) {
+ FIXME("TranslateUrl returned new URL %s -> %s\n", debugstr_w(url), debugstr_w(new_url));
+ ret = TRUE;
+ }
+ CoTaskMemFree(new_url);
}
- CoTaskMemFree(new_url);
+ heap_free(url);
return ret;
}
@@ -229,7 +228,7 @@ nsresult on_start_uri_open(NSContainer *nscontainer, nsIURI *uri, PRBool *_retva
}
wine_uri->is_doc_uri = TRUE;
- *_retval = translate_url(nscontainer->doc->basedoc.doc_obj, wine_uri);
+ *_retval = translate_url(nscontainer->doc, wine_uri);
}
nsIURI_Release(NSURI(wine_uri));
@@ -2453,6 +2452,7 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString *
HTMLWindow *window = NULL;
nsIURI *uri = NULL;
LPCWSTR base_wine_url = NULL;
+ nsACString spec_str;
nsresult nsres;
nsACString_GetData(aSpec, &spec);
@@ -2485,7 +2485,9 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString *
}
}
+ nsACString_InitDepend(&spec_str, spec);
nsres = nsIIOService_NewURI(nsio, aSpec, aOriginCharset, aBaseURI, &uri);
+ nsACString_Finish(&spec_str);
if(NS_FAILED(nsres))
TRACE("NewURI failed: %08x\n", nsres);
diff --git a/dll/win32/mshtml/ros_diff.patch b/dll/win32/mshtml/ros_diff.patch
new file mode 100644
index 00000000000..51add30a06c
--- /dev/null
+++ b/dll/win32/mshtml/ros_diff.patch
@@ -0,0 +1,43 @@
+--- C:/Users/CHRIST~1/AppData/Local/Temp/install.-rev47414.svn001.tmp.c Sa Mai 29 16:46:40 2010
++++ C:/Users/Christoph/Desktop/Projekte/ReactOS/dll/win32/mshtml/install.c Sa Mai 29 16:43:49 2010
+@@ -60,6 +60,11 @@
+ '\\','W','i','n','e',
+ '\\','M','S','H','T','M','L',0};
+
++static const CHAR mshtml_keyA[] =
++ {'S','o','f','t','w','a','r','e',
++ '\\','W','i','n','e',
++ '\\','M','S','H','T','M','L',0};
++
+ static HWND install_dialog = NULL;
+ static LPWSTR tmp_file_name = NULL;
+ static HANDLE tmp_file = INVALID_HANDLE_VALUE;
+@@ -225,23 +230,18 @@
+ static BOOL install_from_registered_dir(void)
+ {
+ char *file_name;
+- HKEY hkey;
+ DWORD res, type, size = MAX_PATH;
+ BOOL ret;
+
++ file_name = heap_alloc(size+sizeof(GECKO_FILE_NAME));
+ /* @@ Wine registry key: HKCU\Software\Wine\MSHTML */
+- res = RegOpenKeyW(HKEY_CURRENT_USER, mshtml_keyW, &hkey);
+- if(res != ERROR_SUCCESS)
+- return FALSE;
+-
+- file_name = heap_alloc(size+sizeof(GECKO_FILE_NAME));
+- res = RegQueryValueExA(hkey, "GeckoCabDir", NULL, &type, (PBYTE)file_name, &size);
++ res = RegGetValueA(HKEY_CURRENT_USER, mshtml_keyA, "GeckoCabDir", RRF_RT_ANY, &type, (PBYTE)file_name, &size);
+ if(res == ERROR_MORE_DATA) {
+ file_name = heap_realloc(file_name, size+sizeof(GECKO_FILE_NAME));
+- res = RegQueryValueExA(hkey, "GeckoCabDir", NULL, &type, (PBYTE)file_name, &size);
++ res = RegGetValueA(HKEY_CURRENT_USER, mshtml_keyA, "GeckoCabDir", RRF_RT_ANY, &type, (PBYTE)file_name, &size);
+ }
+- RegCloseKey(hkey);
+- if(res != ERROR_SUCCESS || type != REG_SZ) {
++
++ if(res != ERROR_SUCCESS || (type != REG_SZ && type != REG_EXPAND_SZ)) {
+ heap_free(file_name);
+ return FALSE;
+ }
diff --git a/dll/win32/mshtml/secmgr.c b/dll/win32/mshtml/secmgr.c
index e35a83b5c29..c74e19fd93b 100644
--- a/dll/win32/mshtml/secmgr.c
+++ b/dll/win32/mshtml/secmgr.c
@@ -90,6 +90,8 @@ static HRESULT confirm_safety(HTMLDocumentNode *This, const WCHAR *url, struct C
IObjectSafety *obj_safety;
HRESULT hres;
+ TRACE("%s %p %s\n", debugstr_w(url), cs->pUnk, debugstr_guid(&cs->clsid));
+
/* FIXME: Check URLACTION_ACTIVEX_OVERRIDE_SCRIPT_SAFETY */
hres = IInternetSecurityManager_ProcessUrlAction(This->secmgr, url, URLACTION_SCRIPT_SAFE_ACTIVEX,
@@ -119,11 +121,17 @@ static HRESULT confirm_safety(HTMLDocumentNode *This, const WCHAR *url, struct C
}
hres = IObjectSafety_GetInterfaceSafetyOptions(obj_safety, &IID_IDispatchEx, &supported_opts, &enabled_opts);
- if(SUCCEEDED(hres)) {
- enabled_opts = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
- if(supported_opts & INTERFACE_USES_SECURITY_MANAGER)
- enabled_opts |= INTERFACE_USES_SECURITY_MANAGER;
- hres = IObjectSafety_SetInterfaceSafetyOptions(obj_safety, &IID_IDispatchEx, enabled_opts, enabled_opts);
+ if(FAILED(hres))
+ supported_opts = 0;
+
+ enabled_opts = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
+ if(supported_opts & INTERFACE_USES_SECURITY_MANAGER)
+ enabled_opts |= INTERFACE_USES_SECURITY_MANAGER;
+
+ hres = IObjectSafety_SetInterfaceSafetyOptions(obj_safety, &IID_IDispatchEx, enabled_opts, enabled_opts);
+ if(FAILED(hres)) {
+ enabled_opts &= ~INTERFACE_USES_SECURITY_MANAGER;
+ hres = IObjectSafety_SetInterfaceSafetyOptions(obj_safety, &IID_IDispatch, enabled_opts, enabled_opts);
}
IObjectSafety_Release(obj_safety);
@@ -175,6 +183,7 @@ static HRESULT WINAPI InternetHostSecurityManager_QueryCustomPolicy(IInternetHos
*(DWORD*)*ppPolicy = policy;
*pcbPolicy = sizeof(policy);
+ TRACE("policy %x\n", policy);
return S_OK;
}
diff --git a/dll/win32/mshtml/task.c b/dll/win32/mshtml/task.c
index eae51cacd15..c896179715b 100644
--- a/dll/win32/mshtml/task.c
+++ b/dll/win32/mshtml/task.c
@@ -222,7 +222,6 @@ static void call_timer_disp(IDispatch *disp)
static LRESULT process_timer(void)
{
thread_data_t *thread_data = get_thread_data(TRUE);
- HTMLDocument *doc;
IDispatch *disp;
DWORD tc;
task_timer_t *timer;
@@ -238,7 +237,6 @@ static LRESULT process_timer(void)
return 0;
}
- doc = timer->doc;
disp = timer->disp;
IDispatch_AddRef(disp);
diff --git a/dll/win32/msi/action.c b/dll/win32/msi/action.c
index 81dcba43ae9..4c5597279ab 100644
--- a/dll/win32/msi/action.c
+++ b/dll/win32/msi/action.c
@@ -96,8 +96,6 @@ static const WCHAR szAllocateRegistrySpace[] =
{'A','l','l','o','c','a','t','e','R','e','g','i','s','t','r','y','S','p','a','c','e',0};
static const WCHAR szBindImage[] =
{'B','i','n','d','I','m','a','g','e',0};
-static const WCHAR szCCPSearch[] =
- {'C','C','P','S','e','a','r','c','h',0};
static const WCHAR szDeleteServices[] =
{'D','e','l','e','t','e','S','e','r','v','i','c','e','s',0};
static const WCHAR szDisableRollback[] =
@@ -126,8 +124,6 @@ static const WCHAR szPublishComponents[] =
{'P','u','b','l','i','s','h','C','o','m','p','o','n','e','n','t','s',0};
static const WCHAR szRegisterComPlus[] =
{'R','e','g','i','s','t','e','r','C','o','m','P','l','u','s',0};
-static const WCHAR szRegisterFonts[] =
- {'R','e','g','i','s','t','e','r','F','o','n','t','s',0};
static const WCHAR szRegisterUser[] =
{'R','e','g','i','s','t','e','r','U','s','e','r',0};
static const WCHAR szRemoveEnvironmentStrings[] =
@@ -160,18 +156,8 @@ static const WCHAR szUnpublishComponents[] =
{'U','n','p','u','b','l','i','s','h', 'C','o','m','p','o','n','e','n','t','s',0};
static const WCHAR szUnpublishFeatures[] =
{'U','n','p','u','b','l','i','s','h','F','e','a','t','u','r','e','s',0};
-static const WCHAR szUnregisterClassInfo[] =
- {'U','n','r','e','g','i','s','t','e','r','C','l','a','s','s','I','n','f','o',0};
static const WCHAR szUnregisterComPlus[] =
{'U','n','r','e','g','i','s','t','e','r','C','o','m','P','l','u','s',0};
-static const WCHAR szUnregisterExtensionInfo[] =
- {'U','n','r','e','g','i','s','t','e','r','E','x','t','e','n','s','i','o','n','I','n','f','o',0};
-static const WCHAR szUnregisterFonts[] =
- {'U','n','r','e','g','i','s','t','e','r','F','o','n','t','s',0};
-static const WCHAR szUnregisterMIMEInfo[] =
- {'U','n','r','e','g','i','s','t','e','r','M','I','M','E','I','n','f','o',0};
-static const WCHAR szUnregisterProgIdInfo[] =
- {'U','n','r','e','g','i','s','t','e','r','P','r','o','g','I','d','I','n','f','o',0};
static const WCHAR szUnregisterTypeLibraries[] =
{'U','n','r','e','g','i','s','t','e','r','T','y','p','e','L','i','b','r','a','r','i','e','s',0};
static const WCHAR szValidateProductID[] =
@@ -291,9 +277,13 @@ UINT msi_parse_command_line( MSIPACKAGE *package, LPCWSTR szCommandLine,
if (lstrlenW(prop) > 0)
{
+ UINT r = msi_set_property( package->db, prop, val );
+
TRACE("Found commandline property (%s) = (%s)\n",
debugstr_w(prop), debugstr_w(val));
- MSI_SetPropertyW(package,prop,val);
+
+ if (r == ERROR_SUCCESS && !strcmpW( prop, cszSourceDir ))
+ msi_reset_folders( package, TRUE );
}
msi_free(val);
msi_free(prop);
@@ -347,7 +337,7 @@ static UINT msi_check_transform_applicable( MSIPACKAGE *package, IStorage *patch
LPWSTR prod_code, patch_product, langid = NULL, template = NULL;
UINT ret = ERROR_FUNCTION_FAILED;
- prod_code = msi_dup_property( package, szProductCode );
+ prod_code = msi_dup_property( package->db, szProductCode );
patch_product = msi_get_suminfo_product( patch );
TRACE("db = %s patch = %s\n", debugstr_w(prod_code), debugstr_w(patch_product));
@@ -379,7 +369,7 @@ static UINT msi_check_transform_applicable( MSIPACKAGE *package, IStorage *patch
goto end;
}
- langid = msi_dup_property( package, szSystemLanguageID );
+ langid = msi_dup_property( package->db, szSystemLanguageID );
if (!langid)
{
msiobj_release( &si->hdr );
@@ -443,7 +433,7 @@ UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si )
LPWSTR guid_list, *guids, product_code;
UINT i, ret = ERROR_FUNCTION_FAILED;
- product_code = msi_dup_property( package, szProductCode );
+ product_code = msi_dup_property( package->db, szProductCode );
if (!product_code)
{
/* FIXME: the property ProductCode should be written into the DB somewhere */
@@ -490,8 +480,8 @@ static UINT msi_set_media_source_prop(MSIPACKAGE *package)
if (MSI_ViewFetch(view, &rec) == ERROR_SUCCESS)
{
prop = MSI_RecordGetString(rec, 1);
- patch = msi_dup_property(package, szPatch);
- MSI_SetPropertyW(package, prop, patch);
+ patch = msi_dup_property(package->db, szPatch);
+ msi_set_property(package->db, prop, patch);
msi_free(patch);
}
@@ -502,76 +492,130 @@ done:
return r;
}
-static UINT msi_parse_patch_summary( MSIPACKAGE *package, MSIDATABASE *patch_db )
+UINT msi_parse_patch_summary( MSISUMMARYINFO *si, MSIPATCHINFO **patch )
{
- MSISUMMARYINFO *si;
- LPWSTR str, *substorage;
- UINT i, r = ERROR_SUCCESS;
+ MSIPATCHINFO *pi;
+ UINT r = ERROR_SUCCESS;
- si = MSI_GetSummaryInformationW( patch_db->storage, 0 );
- if (!si)
- return ERROR_FUNCTION_FAILED;
+ pi = msi_alloc_zero( sizeof(MSIPATCHINFO) );
+ if (!pi)
+ return ERROR_OUTOFMEMORY;
- if (msi_check_patch_applicable( package, si ) != ERROR_SUCCESS)
+ pi->patchcode = msi_suminfo_dup_string( si, PID_REVNUMBER );
+ if (!pi->patchcode)
{
- TRACE("Patch not applicable\n");
- return ERROR_SUCCESS;
+ msi_free( pi );
+ return ERROR_OUTOFMEMORY;
}
- package->patch = msi_alloc(sizeof(MSIPATCHINFO));
- if (!package->patch)
+ pi->transforms = msi_suminfo_dup_string( si, PID_LASTAUTHOR );
+ if (!pi->transforms)
+ {
+ msi_free( pi->patchcode );
+ msi_free( pi );
return ERROR_OUTOFMEMORY;
+ }
- package->patch->patchcode = msi_suminfo_dup_string(si, PID_REVNUMBER);
- if (!package->patch->patchcode)
- return ERROR_OUTOFMEMORY;
+ *patch = pi;
+ return r;
+}
- /* enumerate the substorage */
- str = msi_suminfo_dup_string( si, PID_LASTAUTHOR );
- package->patch->transforms = str;
+UINT msi_apply_patch_db( MSIPACKAGE *package, MSIDATABASE *patch_db, MSIPATCHINFO *patch )
+{
+ UINT i, r = ERROR_SUCCESS;
+ WCHAR **substorage;
- substorage = msi_split_string( str, ';' );
- for ( i = 0; substorage && substorage[i] && r == ERROR_SUCCESS; i++ )
+ /* apply substorage transforms */
+ substorage = msi_split_string( patch->transforms, ';' );
+ for (i = 0; substorage && substorage[i] && r == ERROR_SUCCESS; i++)
r = msi_apply_substorage_transform( package, patch_db, substorage[i] );
msi_free( substorage );
- msiobj_release( &si->hdr );
+ if (r != ERROR_SUCCESS)
+ return r;
- msi_set_media_source_prop(package);
+ msi_set_media_source_prop( package );
- return r;
+ /*
+ * There might be a CAB file in the patch package,
+ * so append it to the list of storages to search for streams.
+ */
+ append_storage_to_db( package->db, patch_db->storage );
+
+ list_add_tail( &package->patches, &patch->entry );
+ return ERROR_SUCCESS;
}
static UINT msi_apply_patch_package( MSIPACKAGE *package, LPCWSTR file )
{
+ static const WCHAR dotmsp[] = {'.','m','s','p',0};
MSIDATABASE *patch_db = NULL;
- UINT r;
+ WCHAR localfile[MAX_PATH];
+ MSISUMMARYINFO *si;
+ MSIPATCHINFO *patch = NULL;
+ UINT r = ERROR_SUCCESS;
TRACE("%p %s\n", package, debugstr_w( file ) );
- /* FIXME:
- * We probably want to make sure we only open a patch collection here.
- * Patch collections (.msp) and databases (.msi) have different GUIDs
- * but currently MSI_OpenDatabaseW will accept both.
- */
- r = MSI_OpenDatabaseW( file, MSIDBOPEN_READONLY, &patch_db );
+ r = MSI_OpenDatabaseW( file, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &patch_db );
if ( r != ERROR_SUCCESS )
{
ERR("failed to open patch collection %s\n", debugstr_w( file ) );
return r;
}
- msi_parse_patch_summary( package, patch_db );
+ si = MSI_GetSummaryInformationW( patch_db->storage, 0 );
+ if (!si)
+ {
+ msiobj_release( &patch_db->hdr );
+ return ERROR_FUNCTION_FAILED;
+ }
- /*
- * There might be a CAB file in the patch package,
- * so append it to the list of storage to search for streams.
- */
- append_storage_to_db( package->db, patch_db->storage );
+ r = msi_check_patch_applicable( package, si );
+ if (r != ERROR_SUCCESS)
+ {
+ TRACE("patch not applicable\n");
+ r = ERROR_SUCCESS;
+ goto done;
+ }
+ r = msi_parse_patch_summary( si, &patch );
+ if ( r != ERROR_SUCCESS )
+ goto done;
+
+ r = msi_get_local_package_name( localfile, dotmsp );
+ if ( r != ERROR_SUCCESS )
+ goto done;
+
+ TRACE("copying to local package %s\n", debugstr_w(localfile));
+
+ if (!CopyFileW( file, localfile, FALSE ))
+ {
+ ERR("Unable to copy package (%s -> %s) (error %u)\n",
+ debugstr_w(file), debugstr_w(localfile), GetLastError());
+ r = GetLastError();
+ goto done;
+ }
+ patch->localfile = strdupW( localfile );
+
+ r = msi_apply_patch_db( package, patch_db, patch );
+ if ( r != ERROR_SUCCESS )
+ WARN("patch failed to apply %u\n", r);
+
+done:
+ msiobj_release( &si->hdr );
msiobj_release( &patch_db->hdr );
+ if (patch && r != ERROR_SUCCESS)
+ {
+ if (patch->localfile)
+ DeleteFileW( patch->localfile );
- return ERROR_SUCCESS;
+ msi_free( patch->patchcode );
+ msi_free( patch->transforms );
+ msi_free( patch->localfile );
+ msi_free( patch );
+ }
+ return r;
}
/* get the PATCH property, and apply all the patches it specifies */
@@ -580,7 +624,7 @@ static UINT msi_apply_patches( MSIPACKAGE *package )
LPWSTR patch_list, *patches;
UINT i, r = ERROR_SUCCESS;
- patch_list = msi_dup_property( package, szPatch );
+ patch_list = msi_dup_property( package->db, szPatch );
TRACE("patches to be applied: %s\n", debugstr_w( patch_list ) );
@@ -601,7 +645,7 @@ static UINT msi_apply_transforms( MSIPACKAGE *package )
LPWSTR xform_list, *xforms;
UINT i, r = ERROR_SUCCESS;
- xform_list = msi_dup_property( package, szTransforms );
+ xform_list = msi_dup_property( package->db, szTransforms );
xforms = msi_split_string( xform_list, ';' );
for( i=0; xforms && xforms[i] && r == ERROR_SUCCESS; i++ )
@@ -644,71 +688,76 @@ static BOOL ui_sequence_exists( MSIPACKAGE *package )
static UINT msi_set_sourcedir_props(MSIPACKAGE *package, BOOL replace)
{
- LPWSTR p, db;
LPWSTR source, check;
- DWORD len;
- static const WCHAR szOriginalDatabase[] =
- {'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0};
-
- db = msi_dup_property( package, szOriginalDatabase );
- if (!db)
- return ERROR_OUTOFMEMORY;
-
- p = strrchrW( db, '\\' );
- if (!p)
+ if (msi_get_property_int( package->db, szInstalled, 0 ))
{
- p = strrchrW( db, '/' );
+ HKEY hkey;
+
+ MSIREG_OpenInstallProps( package->ProductCode, package->Context, NULL, &hkey, FALSE );
+ source = msi_reg_get_val_str( hkey, INSTALLPROPERTY_INSTALLSOURCEW );
+ RegCloseKey( hkey );
+ }
+ else
+ {
+ LPWSTR p, db;
+ DWORD len;
+
+ db = msi_dup_property( package->db, szOriginalDatabase );
+ if (!db)
+ return ERROR_OUTOFMEMORY;
+
+ p = strrchrW( db, '\\' );
if (!p)
{
- msi_free(db);
- return ERROR_SUCCESS;
+ p = strrchrW( db, '/' );
+ if (!p)
+ {
+ msi_free(db);
+ return ERROR_SUCCESS;
+ }
}
+
+ len = p - db + 2;
+ source = msi_alloc( len * sizeof(WCHAR) );
+ lstrcpynW( source, db, len );
+ msi_free( db );
}
- len = p - db + 2;
- source = msi_alloc( len * sizeof(WCHAR) );
- lstrcpynW( source, db, len );
-
- check = msi_dup_property( package, cszSourceDir );
+ check = msi_dup_property( package->db, cszSourceDir );
if (!check || replace)
- MSI_SetPropertyW( package, cszSourceDir, source );
-
+ {
+ UINT r = msi_set_property( package->db, cszSourceDir, source );
+ if (r == ERROR_SUCCESS)
+ msi_reset_folders( package, TRUE );
+ }
msi_free( check );
- check = msi_dup_property( package, cszSOURCEDIR );
+ check = msi_dup_property( package->db, cszSOURCEDIR );
if (!check || replace)
- MSI_SetPropertyW( package, cszSOURCEDIR, source );
+ msi_set_property( package->db, cszSOURCEDIR, source );
msi_free( check );
msi_free( source );
- msi_free( db );
return ERROR_SUCCESS;
}
static BOOL needs_ui_sequence(MSIPACKAGE *package)
{
- INT level = msi_get_property_int(package, szUILevel, 0);
+ INT level = msi_get_property_int(package->db, szUILevel, 0);
return (level & INSTALLUILEVEL_MASK) >= INSTALLUILEVEL_REDUCED;
}
-static UINT msi_set_context(MSIPACKAGE *package)
+UINT msi_set_context(MSIPACKAGE *package)
{
- WCHAR val[10];
- DWORD sz = 10;
- DWORD num;
- UINT r;
+ int num;
package->Context = MSIINSTALLCONTEXT_USERUNMANAGED;
- r = MSI_GetPropertyW(package, szAllUsers, val, &sz);
- if (r == ERROR_SUCCESS)
- {
- num = atolW(val);
- if (num == 1 || num == 2)
- package->Context = MSIINSTALLCONTEXT_MACHINE;
- }
+ num = msi_get_property_int(package->db, szAllUsers, 0);
+ if (num == 1 || num == 2)
+ package->Context = MSIINSTALLCONTEXT_MACHINE;
return ERROR_SUCCESS;
}
@@ -1325,6 +1374,26 @@ done:
return r;
}
+static UINT load_file_disk_id( MSIPACKAGE *package, MSIFILE *file )
+{
+ MSIRECORD *row;
+ static const WCHAR query[] = {
+ 'S','E','L','E','C','T',' ','`','D','i','s','k','I','d','`',' ', 'F','R','O','M',' ',
+ '`','M','e','d','i','a','`',' ','W','H','E','R','E',' ',
+ '`','L','a','s','t','S','e','q','u','e','n','c','e','`',' ','>','=',' ','%','i',0};
+
+ row = MSI_QueryGetRecord( package->db, query, file->Sequence );
+ if (!row)
+ {
+ WARN("query failed\n");
+ return ERROR_FUNCTION_FAILED;
+ }
+
+ file->disk_id = MSI_RecordGetInteger( row, 1 );
+ msiobj_release( &row->hdr );
+ return ERROR_SUCCESS;
+}
+
static UINT load_file(MSIRECORD *row, LPVOID param)
{
MSIPACKAGE* package = param;
@@ -1386,6 +1455,7 @@ static UINT load_file(MSIRECORD *row, LPVOID param)
}
load_file_hash(package, file);
+ load_file_disk_id(package, file);
TRACE("File Loaded (%s)\n",debugstr_w(file->File));
@@ -1470,7 +1540,7 @@ static UINT load_folder( MSIRECORD *row, LPVOID param )
folder->Parent = msi_dup_record_field( row, 2 );
- folder->Property = msi_dup_property( package, folder->Directory );
+ folder->Property = msi_dup_property( package->db, folder->Directory );
list_add_tail( &package->folders, &folder->entry );
@@ -1517,8 +1587,8 @@ static UINT ACTION_CostInitialize(MSIPACKAGE *package)
static const WCHAR szCosting[] =
{'C','o','s','t','i','n','g','C','o','m','p','l','e','t','e',0 };
- MSI_SetPropertyW(package, szCosting, szZero);
- MSI_SetPropertyW(package, cszRootDrive, c_colon);
+ msi_set_property( package->db, szCosting, szZero );
+ msi_set_property( package->db, cszRootDrive, c_colon );
load_all_folders( package );
load_all_components( package );
@@ -1611,7 +1681,7 @@ static BOOL process_state_property(MSIPACKAGE* package, int level,
LPWSTR override;
MSIFEATURE *feature;
- override = msi_dup_property( package, property );
+ override = msi_dup_property( package->db, property );
if (!override)
return FALSE;
@@ -1688,7 +1758,7 @@ static BOOL process_overrides( MSIPACKAGE *package, int level )
ret |= process_state_property( package, level, szAdvertise, INSTALLSTATE_ADVERTISED );
if (ret)
- MSI_SetPropertyW( package, szPreselected, szOne );
+ msi_set_property( package->db, szPreselected, szOne );
return ret;
}
@@ -1703,9 +1773,9 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
TRACE("Checking Install Level\n");
- level = msi_get_property_int(package, szlevel, 1);
+ level = msi_get_property_int(package->db, szlevel, 1);
- if (!msi_get_property_int( package, szPreselected, 0 ))
+ if (!msi_get_property_int( package->db, szPreselected, 0 ))
{
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
{
@@ -1906,7 +1976,7 @@ static UINT ITERATE_CostFinalizeConditions(MSIRECORD *row, LPVOID param)
return ERROR_SUCCESS;
}
-static LPWSTR msi_get_disk_file_version( LPCWSTR filename )
+static LPWSTR get_disk_file_version( LPCWSTR filename )
{
static const WCHAR name_fmt[] =
{'%','u','.','%','u','.','%','u','.','%','u',0};
@@ -1944,7 +2014,36 @@ static LPWSTR msi_get_disk_file_version( LPCWSTR filename )
return strdupW( filever );
}
-static UINT msi_check_file_install_states( MSIPACKAGE *package )
+static DWORD get_disk_file_size( LPCWSTR filename )
+{
+ HANDLE file;
+ DWORD size;
+
+ TRACE("%s\n", debugstr_w(filename));
+
+ file = CreateFileW( filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL );
+ if (file == INVALID_HANDLE_VALUE)
+ return INVALID_FILE_SIZE;
+
+ size = GetFileSize( file, NULL );
+ CloseHandle( file );
+ return size;
+}
+
+static BOOL hash_matches( MSIFILE *file )
+{
+ UINT r;
+ MSIFILEHASHINFO hash;
+
+ hash.dwFileHashInfoSize = sizeof(MSIFILEHASHINFO);
+ r = MsiGetFileHashW( file->TargetPath, 0, &hash );
+ if (r != ERROR_SUCCESS)
+ return FALSE;
+
+ return !memcmp( &hash, &file->hash, sizeof(MSIFILEHASHINFO) );
+}
+
+static UINT set_file_install_states( MSIPACKAGE *package )
{
LPWSTR file_version;
MSIFILE *file;
@@ -1952,6 +2051,7 @@ static UINT msi_check_file_install_states( MSIPACKAGE *package )
LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry )
{
MSICOMPONENT* comp = file->Component;
+ DWORD file_size;
LPWSTR p;
if (!comp)
@@ -1975,38 +2075,43 @@ static UINT msi_check_file_install_states( MSIPACKAGE *package )
TRACE("file %s resolves to %s\n",
debugstr_w(file->File), debugstr_w(file->TargetPath));
- /* don't check files of components that aren't installed */
- if (comp->Installed == INSTALLSTATE_UNKNOWN ||
- comp->Installed == INSTALLSTATE_ABSENT)
- {
- file->state = msifs_missing; /* assume files are missing */
- continue;
- }
-
if (GetFileAttributesW(file->TargetPath) == INVALID_FILE_ATTRIBUTES)
{
file->state = msifs_missing;
comp->Cost += file->FileSize;
continue;
}
-
- if (file->Version &&
- (file_version = msi_get_disk_file_version( file->TargetPath )))
+ if (file->Version && (file_version = get_disk_file_version( file->TargetPath )))
{
- TRACE("new %s old %s\n", debugstr_w(file->Version),
- debugstr_w(file_version));
- /* FIXME: seems like a bad way to compare version numbers */
- if (lstrcmpiW(file_version, file->Version)<0)
+ TRACE("new %s old %s\n", debugstr_w(file->Version), debugstr_w(file_version));
+
+ if (strcmpiW(file_version, file->Version) < 0)
{
file->state = msifs_overwrite;
comp->Cost += file->FileSize;
}
else
+ {
+ TRACE("Destination file version equal or greater, not overwriting\n");
file->state = msifs_present;
+ }
msi_free( file_version );
+ continue;
}
- else
+ if ((file_size = get_disk_file_size( file->TargetPath )) != file->FileSize)
+ {
+ file->state = msifs_overwrite;
+ comp->Cost += file->FileSize - file_size;
+ continue;
+ }
+ if (file->hash.dwFileHashInfoSize && hash_matches( file ))
+ {
+ TRACE("File hashes match, not overwriting\n");
file->state = msifs_present;
+ continue;
+ }
+ file->state = msifs_overwrite;
+ comp->Cost += file->FileSize - file_size;
}
return ERROR_SUCCESS;
@@ -2051,12 +2156,12 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
ACTION_GetComponentInstallStates(package);
ACTION_GetFeatureInstallStates(package);
- TRACE("File calculations\n");
- msi_check_file_install_states( package );
+ TRACE("Calculating file install states\n");
+ set_file_install_states( package );
- if (!process_overrides( package, msi_get_property_int( package, szlevel, 1 ) ))
+ if (!process_overrides( package, msi_get_property_int( package->db, szlevel, 1 ) ))
{
- TRACE("Evaluating Condition Table\n");
+ TRACE("Evaluating feature conditions\n");
rc = MSI_DatabaseOpenViewW( package->db, ConditionQuery, &view );
if (rc == ERROR_SUCCESS)
@@ -2064,29 +2169,29 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
rc = MSI_IterateRecords( view, NULL, ITERATE_CostFinalizeConditions, package );
msiobj_release( &view->hdr );
}
+ }
+ TRACE("Evaluating component conditions\n");
- TRACE("Enabling or Disabling Components\n");
- LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry )
+ LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry )
+ {
+ if (MSI_EvaluateConditionW( package, comp->Condition ) == MSICONDITION_FALSE)
{
- if (MSI_EvaluateConditionW( package, comp->Condition ) == MSICONDITION_FALSE)
- {
- TRACE("Disabling component %s\n", debugstr_w(comp->Component));
- comp->Enabled = FALSE;
- }
- else
- comp->Enabled = TRUE;
+ TRACE("Disabling component %s\n", debugstr_w(comp->Component));
+ comp->Enabled = FALSE;
}
+ else
+ comp->Enabled = TRUE;
}
- MSI_SetPropertyW(package,szCosting,szOne);
+ msi_set_property( package->db, szCosting, szOne );
/* set default run level if not set */
- level = msi_dup_property( package, szlevel );
+ level = msi_dup_property( package->db, szlevel );
if (!level)
- MSI_SetPropertyW(package,szlevel, szOne);
+ msi_set_property( package->db, szlevel, szOne );
msi_free(level);
/* FIXME: check volume disk space */
- MSI_SetPropertyW(package, szOutOfDiskSpace, szZero);
+ msi_set_property( package->db, szOutOfDiskSpace, szZero );
return MSI_SetFeatureStates(package);
}
@@ -2220,7 +2325,7 @@ static const WCHAR *get_root_key( MSIPACKAGE *package, INT root, HKEY *root_key
switch (root)
{
case -1:
- if (msi_get_property_int( package, szAllUsers, 0 ))
+ if (msi_get_property_int( package->db, szAllUsers, 0 ))
{
*root_key = HKEY_LOCAL_MACHINE;
ret = szHLM;
@@ -2364,12 +2469,8 @@ static UINT ITERATE_WriteRegistryValues(MSIRECORD *row, LPVOID param)
uirow = MSI_CreateRecord(3);
MSI_RecordSetStringW(uirow,2,deformated);
MSI_RecordSetStringW(uirow,1,uikey);
-
- if (type == REG_SZ)
+ if (type == REG_SZ || type == REG_EXPAND_SZ)
MSI_RecordSetStringW(uirow,3,(LPWSTR)value_data);
- else
- MSI_RecordSetStringW(uirow,3,value);
-
ui_actiondata(package,szWriteRegistryValues,uirow);
msiobj_release( &uirow->hdr );
@@ -2995,6 +3096,7 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
else
MSIREG_DeleteUserDataComponentKey(comp->ComponentId, NULL);
}
+ comp->Action = comp->ActionRequest;
/* UI stuff */
uirow = MSI_CreateRecord(3);
@@ -3103,7 +3205,7 @@ static UINT ITERATE_RegisterTypeLibraries(MSIRECORD *row, LPVOID param)
{
LPCWSTR guid;
guid = MSI_RecordGetString(row,1);
- CLSIDFromString((LPWSTR)guid, &tl_struct.clsid);
+ CLSIDFromString((LPCWSTR)guid, &tl_struct.clsid);
tl_struct.source = strdupW( file->TargetPath );
tl_struct.path = NULL;
@@ -3204,7 +3306,7 @@ static UINT ITERATE_UnregisterTypeLibraries( MSIRECORD *row, LPVOID param )
ui_actiondata( package, szUnregisterTypeLibraries, row );
guid = MSI_RecordGetString( row, 1 );
- CLSIDFromString( (LPWSTR)guid, &libid );
+ CLSIDFromString( (LPCWSTR)guid, &libid );
version = MSI_RecordGetInteger( row, 4 );
language = MSI_RecordGetInteger( row, 2 );
@@ -3610,17 +3712,17 @@ static UINT msi_publish_product_properties(MSIPACKAGE *package, HKEY hkey)
{'C','l','i','e','n','t','s',0};
static const WCHAR szColon[] = {':',0};
- buffer = msi_dup_property(package, INSTALLPROPERTY_PRODUCTNAMEW);
+ buffer = msi_dup_property(package->db, INSTALLPROPERTY_PRODUCTNAMEW);
msi_reg_set_val_str(hkey, INSTALLPROPERTY_PRODUCTNAMEW, buffer);
msi_free(buffer);
- langid = msi_get_property_int(package, szProductLanguage, 0);
+ langid = msi_get_property_int(package->db, szProductLanguage, 0);
msi_reg_set_val_dword(hkey, INSTALLPROPERTY_LANGUAGEW, langid);
/* FIXME */
msi_reg_set_val_dword(hkey, INSTALLPROPERTY_AUTHORIZED_LUA_APPW, 0);
- buffer = msi_dup_property(package, szARPProductIcon);
+ buffer = msi_dup_property(package->db, szARPProductIcon);
if (buffer)
{
LPWSTR path = build_icon_path(package,buffer);
@@ -3629,7 +3731,7 @@ static UINT msi_publish_product_properties(MSIPACKAGE *package, HKEY hkey)
msi_free(buffer);
}
- buffer = msi_dup_property(package, szProductVersion);
+ buffer = msi_dup_property(package->db, szProductVersion);
if (buffer)
{
DWORD verdword = msi_version_str_to_dword(buffer);
@@ -3677,7 +3779,7 @@ static UINT msi_publish_upgrade_code(MSIPACKAGE *package)
static const WCHAR szUpgradeCode[] =
{'U','p','g','r','a','d','e','C','o','d','e',0};
- upgrade = msi_dup_property(package, szUpgradeCode);
+ upgrade = msi_dup_property(package->db, szUpgradeCode);
if (!upgrade)
return ERROR_SUCCESS;
@@ -3730,34 +3832,80 @@ static BOOL msi_check_unpublish(MSIPACKAGE *package)
return TRUE;
}
-static UINT msi_publish_patch(MSIPACKAGE *package, HKEY prodkey, HKEY hudkey)
+static UINT msi_publish_patches( MSIPACKAGE *package, HKEY prodkey )
{
+ static const WCHAR szAllPatches[] = {'A','l','l','P','a','t','c','h','e','s',0};
WCHAR patch_squashed[GUID_SIZE];
- HKEY patches;
+ HKEY patches_key = NULL, product_patches_key;
LONG res;
- UINT r = ERROR_FUNCTION_FAILED;
+ MSIPATCHINFO *patch;
+ UINT r;
+ WCHAR *p, *all_patches = NULL;
+ DWORD len = 0;
- res = RegCreateKeyExW(prodkey, szPatches, 0, NULL, 0, KEY_ALL_ACCESS, NULL,
- &patches, NULL);
+ res = RegCreateKeyExW( prodkey, szPatches, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &patches_key, NULL );
if (res != ERROR_SUCCESS)
return ERROR_FUNCTION_FAILED;
- squash_guid(package->patch->patchcode, patch_squashed);
+ r = MSIREG_OpenUserDataProductPatchesKey( package->ProductCode, package->Context, &product_patches_key, TRUE );
+ if (r != ERROR_SUCCESS)
+ goto done;
- res = RegSetValueExW(patches, szPatches, 0, REG_MULTI_SZ,
- (const BYTE *)patch_squashed,
- (lstrlenW(patch_squashed) + 1) * sizeof(WCHAR));
+ LIST_FOR_EACH_ENTRY( patch, &package->patches, MSIPATCHINFO, entry )
+ {
+ squash_guid( patch->patchcode, patch_squashed );
+ len += strlenW( patch_squashed ) + 1;
+ }
+
+ p = all_patches = msi_alloc( (len + 1) * sizeof(WCHAR) );
+ if (!all_patches)
+ goto done;
+
+ LIST_FOR_EACH_ENTRY( patch, &package->patches, MSIPATCHINFO, entry )
+ {
+ HKEY patch_key;
+
+ squash_guid( patch->patchcode, p );
+ p += strlenW( p ) + 1;
+
+ res = RegSetValueExW( patches_key, patch_squashed, 0, REG_SZ,
+ (const BYTE *)patch->transforms,
+ (strlenW(patch->transforms) + 1) * sizeof(WCHAR) );
+ if (res != ERROR_SUCCESS)
+ goto done;
+
+ r = MSIREG_OpenUserDataPatchKey( patch->patchcode, package->Context, &patch_key, TRUE );
+ if (r != ERROR_SUCCESS)
+ goto done;
+
+ res = RegSetValueExW( patch_key, szLocalPackage, 0, REG_SZ,
+ (const BYTE *)patch->localfile,
+ (strlenW(patch->localfile) + 1) * sizeof(WCHAR) );
+ RegCloseKey( patch_key );
+ if (res != ERROR_SUCCESS)
+ goto done;
+
+ res = RegCreateKeyExW( product_patches_key, patch_squashed, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &patch_key, NULL );
+ RegCloseKey( patch_key );
+ if (res != ERROR_SUCCESS)
+ goto done;
+ }
+
+ all_patches[len] = 0;
+ res = RegSetValueExW( patches_key, szPatches, 0, REG_MULTI_SZ,
+ (const BYTE *)all_patches, (len + 1) * sizeof(WCHAR) );
if (res != ERROR_SUCCESS)
goto done;
- res = RegSetValueExW(patches, patch_squashed, 0, REG_SZ,
- (const BYTE *)package->patch->transforms,
- (lstrlenW(package->patch->transforms) + 1) * sizeof(WCHAR));
- if (res == ERROR_SUCCESS)
- r = ERROR_SUCCESS;
+ res = RegSetValueExW( product_patches_key, szAllPatches, 0, REG_MULTI_SZ,
+ (const BYTE *)all_patches, (len + 1) * sizeof(WCHAR) );
+ if (res != ERROR_SUCCESS)
+ r = ERROR_FUNCTION_FAILED;
done:
- RegCloseKey(patches);
+ RegCloseKey( product_patches_key );
+ RegCloseKey( patches_key );
+ msi_free( all_patches );
return r;
}
@@ -3791,9 +3939,9 @@ static UINT ACTION_PublishProduct(MSIPACKAGE *package)
if (rc != ERROR_SUCCESS)
goto end;
- if (package->patch)
+ if (!list_empty(&package->patches))
{
- rc = msi_publish_patch(package, hukey, hudkey);
+ rc = msi_publish_patches(package, hukey);
if (rc != ERROR_SUCCESS)
goto end;
}
@@ -3836,10 +3984,10 @@ static WCHAR *get_ini_file_name( MSIPACKAGE *package, MSIRECORD *row )
{
folder = resolve_folder( package, dirprop, FALSE, FALSE, TRUE, NULL );
if (!folder)
- folder = msi_dup_property( package, dirprop );
+ folder = msi_dup_property( package->db, dirprop );
}
else
- folder = msi_dup_property( package, szWindowsFolder );
+ folder = msi_dup_property( package->db, szWindowsFolder );
if (!folder)
{
@@ -4152,21 +4300,16 @@ static UINT ITERATE_SelfRegModules(MSIRECORD *row, LPVOID param)
CloseHandle(info.hProcess);
}
- msi_free(FullName);
-
- /* the UI chunk */
uirow = MSI_CreateRecord( 2 );
+ MSI_RecordSetStringW( uirow, 1, filename );
uipath = strdupW( file->TargetPath );
- p = strrchrW(uipath,'\\');
- if (p)
- p[0]=0;
- MSI_RecordSetStringW( uirow, 1, &p[1] );
- MSI_RecordSetStringW( uirow, 2, uipath);
- ui_actiondata( package, szSelfRegModules, uirow);
+ if ((p = strrchrW( uipath,'\\' ))) *p = 0;
+ MSI_RecordSetStringW( uirow, 2, uipath );
+ ui_actiondata( package, szSelfRegModules, uirow );
msiobj_release( &uirow->hdr );
- msi_free( uipath );
- /* FIXME: call ui_progress? */
+ msi_free( FullName );
+ msi_free( uipath );
return ERROR_SUCCESS;
}
@@ -4235,21 +4378,16 @@ static UINT ITERATE_SelfUnregModules( MSIRECORD *row, LPVOID param )
CloseHandle( pi.hProcess );
}
- msi_free( cmdline );
-
uirow = MSI_CreateRecord( 2 );
+ MSI_RecordSetStringW( uirow, 1, filename );
uipath = strdupW( file->TargetPath );
- if ((p = strrchrW( uipath, '\\' )))
- {
- *p = 0;
- MSI_RecordSetStringW( uirow, 1, ++p );
- }
+ if ((p = strrchrW( uipath,'\\' ))) *p = 0;
MSI_RecordSetStringW( uirow, 2, uipath );
ui_actiondata( package, szSelfUnregModules, uirow );
msiobj_release( &uirow->hdr );
- msi_free( uipath );
- /* FIXME call ui_progress? */
+ msi_free( cmdline );
+ msi_free( uipath );
return ERROR_SUCCESS;
}
@@ -4351,7 +4489,7 @@ static UINT ACTION_PublishFeatures(MSIPACKAGE *package)
{
size += sizeof(WCHAR);
RegSetValueExW(hkey,feature->Feature,0,REG_SZ,
- (LPBYTE)(feature->Feature_Parent ? feature->Feature_Parent : szEmpty),size);
+ (const BYTE*)(feature->Feature_Parent ? feature->Feature_Parent : szEmpty),size);
}
else
{
@@ -4384,6 +4522,7 @@ static UINT msi_unpublish_feature(MSIPACKAGE *package, MSIFEATURE *feature)
{
UINT r;
HKEY hkey;
+ MSIRECORD *uirow;
TRACE("unpublishing feature %s\n", debugstr_w(feature->Feature));
@@ -4403,6 +4542,11 @@ static UINT msi_unpublish_feature(MSIPACKAGE *package, MSIFEATURE *feature)
RegCloseKey(hkey);
}
+ uirow = MSI_CreateRecord( 1 );
+ MSI_RecordSetStringW( uirow, 1, feature->Feature );
+ ui_actiondata( package, szUnpublishFeatures, uirow );
+ msiobj_release( &uirow->hdr );
+
return ERROR_SUCCESS;
}
@@ -4423,11 +4567,10 @@ static UINT ACTION_UnpublishFeatures(MSIPACKAGE *package)
static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey)
{
- LPWSTR prop, val, key;
SYSTEMTIME systime;
DWORD size, langid;
- WCHAR date[9];
- LPWSTR buffer;
+ WCHAR date[9], *val, *buffer;
+ const WCHAR *prop, *key;
static const WCHAR date_fmt[] = {'%','i','%','0','2','i','%','0','2','i',0};
static const WCHAR szWindowsInstaller[] =
@@ -4445,43 +4588,84 @@ static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey)
{'P','r','o','d','u','c','t','L','a','n','g','u','a','g','e',0};
static const WCHAR szProductVersion[] =
{'P','r','o','d','u','c','t','V','e','r','s','i','o','n',0};
+ static const WCHAR szDisplayVersion[] =
+ {'D','i','s','p','l','a','y','V','e','r','s','i','o','n',0};
+ static const WCHAR szInstallSource[] =
+ {'I','n','s','t','a','l','l','S','o','u','r','c','e',0};
+ static const WCHAR szARPAUTHORIZEDCDFPREFIX[] =
+ {'A','R','P','A','U','T','H','O','R','I','Z','E','D','C','D','F','P','R','E','F','I','X',0};
+ static const WCHAR szAuthorizedCDFPrefix[] =
+ {'A','u','t','h','o','r','i','z','e','d','C','D','F','P','r','e','f','i','x',0};
+ static const WCHAR szARPCONTACT[] =
+ {'A','R','P','C','O','N','T','A','C','T',0};
+ static const WCHAR szContact[] =
+ {'C','o','n','t','a','c','t',0};
+ static const WCHAR szARPCOMMENTS[] =
+ {'A','R','P','C','O','M','M','E','N','T','S',0};
+ static const WCHAR szComments[] =
+ {'C','o','m','m','e','n','t','s',0};
static const WCHAR szProductName[] =
{'P','r','o','d','u','c','t','N','a','m','e',0};
static const WCHAR szDisplayName[] =
{'D','i','s','p','l','a','y','N','a','m','e',0};
- static const WCHAR szDisplayVersion[] =
- {'D','i','s','p','l','a','y','V','e','r','s','i','o','n',0};
+ static const WCHAR szARPHELPLINK[] =
+ {'A','R','P','H','E','L','P','L','I','N','K',0};
+ static const WCHAR szHelpLink[] =
+ {'H','e','l','p','L','i','n','k',0};
+ static const WCHAR szARPHELPTELEPHONE[] =
+ {'A','R','P','H','E','L','P','T','E','L','E','P','H','O','N','E',0};
+ static const WCHAR szHelpTelephone[] =
+ {'H','e','l','p','T','e','l','e','p','h','o','n','e',0};
+ static const WCHAR szARPINSTALLLOCATION[] =
+ {'A','R','P','I','N','S','T','A','L','L','L','O','C','A','T','I','O','N',0};
+ static const WCHAR szInstallLocation[] =
+ {'I','n','s','t','a','l','l','L','o','c','a','t','i','o','n',0};
static const WCHAR szManufacturer[] =
{'M','a','n','u','f','a','c','t','u','r','e','r',0};
+ static const WCHAR szPublisher[] =
+ {'P','u','b','l','i','s','h','e','r',0};
+ static const WCHAR szARPREADME[] =
+ {'A','R','P','R','E','A','D','M','E',0};
+ static const WCHAR szReadme[] =
+ {'R','e','a','d','M','e',0};
+ static const WCHAR szARPSIZE[] =
+ {'A','R','P','S','I','Z','E',0};
+ static const WCHAR szSize[] =
+ {'S','i','z','e',0};
+ static const WCHAR szARPURLINFOABOUT[] =
+ {'A','R','P','U','R','L','I','N','F','O','A','B','O','U','T',0};
+ static const WCHAR szURLInfoAbout[] =
+ {'U','R','L','I','n','f','o','A','b','o','u','t',0};
+ static const WCHAR szARPURLUPDATEINFO[] =
+ {'A','R','P','U','R','L','U','P','D','A','T','E','I','N','F','O',0};
+ static const WCHAR szURLUpdateInfo[] =
+ {'U','R','L','U','p','d','a','t','e','I','n','f','o',0};
- static const LPCSTR propval[] = {
- "ARPAUTHORIZEDCDFPREFIX", "AuthorizedCDFPrefix",
- "ARPCONTACT", "Contact",
- "ARPCOMMENTS", "Comments",
- "ProductName", "DisplayName",
- "ProductVersion", "DisplayVersion",
- "ARPHELPLINK", "HelpLink",
- "ARPHELPTELEPHONE", "HelpTelephone",
- "ARPINSTALLLOCATION", "InstallLocation",
- "SourceDir", "InstallSource",
- "Manufacturer", "Publisher",
- "ARPREADME", "Readme",
- "ARPSIZE", "Size",
- "ARPURLINFOABOUT", "URLInfoAbout",
- "ARPURLUPDATEINFO", "URLUpdateInfo",
- NULL,
+ static const WCHAR *propval[] = {
+ szARPAUTHORIZEDCDFPREFIX, szAuthorizedCDFPrefix,
+ szARPCONTACT, szContact,
+ szARPCOMMENTS, szComments,
+ szProductName, szDisplayName,
+ szARPHELPLINK, szHelpLink,
+ szARPHELPTELEPHONE, szHelpTelephone,
+ szARPINSTALLLOCATION, szInstallLocation,
+ cszSourceDir, szInstallSource,
+ szManufacturer, szPublisher,
+ szARPREADME, szReadme,
+ szARPSIZE, szSize,
+ szARPURLINFOABOUT, szURLInfoAbout,
+ szARPURLUPDATEINFO, szURLUpdateInfo,
+ NULL
};
- const LPCSTR *p = propval;
+ const WCHAR **p = propval;
while (*p)
{
- prop = strdupAtoW(*p++);
- key = strdupAtoW(*p++);
- val = msi_dup_property(package, prop);
+ prop = *p++;
+ key = *p++;
+ val = msi_dup_property(package->db, prop);
msi_reg_set_val_str(hkey, key, val);
msi_free(val);
- msi_free(key);
- msi_free(prop);
}
msi_reg_set_val_dword(hkey, szWindowsInstaller, 1);
@@ -4494,26 +4678,14 @@ static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey)
/* FIXME: Write real Estimated Size when we have it */
msi_reg_set_val_dword(hkey, szEstimatedSize, 0);
- buffer = msi_dup_property(package, szProductName);
- msi_reg_set_val_str(hkey, szDisplayName, buffer);
- msi_free(buffer);
-
- buffer = msi_dup_property(package, cszSourceDir);
- msi_reg_set_val_str(hkey, INSTALLPROPERTY_INSTALLSOURCEW, buffer);
- msi_free(buffer);
-
- buffer = msi_dup_property(package, szManufacturer);
- msi_reg_set_val_str(hkey, INSTALLPROPERTY_PUBLISHERW, buffer);
- msi_free(buffer);
-
GetLocalTime(&systime);
sprintfW(date, date_fmt, systime.wYear, systime.wMonth, systime.wDay);
msi_reg_set_val_str(hkey, INSTALLPROPERTY_INSTALLDATEW, date);
- langid = msi_get_property_int(package, szProductLanguage, 0);
+ langid = msi_get_property_int(package->db, szProductLanguage, 0);
msi_reg_set_val_dword(hkey, INSTALLPROPERTY_LANGUAGEW, langid);
- buffer = msi_dup_property(package, szProductVersion);
+ buffer = msi_dup_property(package->db, szProductVersion);
msi_reg_set_val_str(hkey, szDisplayVersion, buffer);
if (buffer)
{
@@ -4565,7 +4737,7 @@ static UINT ACTION_RegisterProduct(MSIPACKAGE *package)
if (rc != ERROR_SUCCESS)
goto done;
- upgrade_code = msi_dup_property(package, szUpgradeCode);
+ upgrade_code = msi_dup_property(package->db, szUpgradeCode);
if (upgrade_code)
{
MSIREG_OpenUpgradeCodesKey(upgrade_code, &upgrade, TRUE);
@@ -4597,11 +4769,12 @@ static UINT msi_unpublish_product(MSIPACKAGE *package)
LPWSTR *features = NULL;
BOOL full_uninstall = TRUE;
MSIFEATURE *feature;
+ MSIPATCHINFO *patch;
static const WCHAR szUpgradeCode[] =
{'U','p','g','r','a','d','e','C','o','d','e',0};
- remove = msi_dup_property(package, szRemove);
+ remove = msi_dup_property(package->db, szRemove);
if (!remove)
return ERROR_SUCCESS;
@@ -4642,13 +4815,18 @@ static UINT msi_unpublish_product(MSIPACKAGE *package)
MSIREG_DeleteUserFeaturesKey(package->ProductCode);
}
- upgrade = msi_dup_property(package, szUpgradeCode);
+ upgrade = msi_dup_property(package->db, szUpgradeCode);
if (upgrade)
{
MSIREG_DeleteUserUpgradeCodesKey(upgrade);
msi_free(upgrade);
}
+ LIST_FOR_EACH_ENTRY(patch, &package->patches, MSIPATCHINFO, entry)
+ {
+ MSIREG_DeleteUserDataPatchKey(patch->patchcode, package->Context);
+ }
+
done:
msi_free(remove);
msi_free(features);
@@ -4809,7 +4987,7 @@ static UINT ACTION_RegisterUser(MSIPACKAGE *package)
goto end;
}
- productid = msi_dup_property( package, INSTALLPROPERTY_PRODUCTIDW );
+ productid = msi_dup_property( package->db, INSTALLPROPERTY_PRODUCTIDW );
if (!productid)
goto end;
@@ -4820,7 +4998,7 @@ static UINT ACTION_RegisterUser(MSIPACKAGE *package)
for( i = 0; szPropKeys[i][0]; i++ )
{
- buffer = msi_dup_property( package, szPropKeys[i] );
+ buffer = msi_dup_property( package->db, szPropKeys[i] );
msi_reg_set_val_str( hkey, szRegKeys[i], buffer );
msi_free( buffer );
}
@@ -5162,10 +5340,11 @@ static UINT ITERATE_StartService(MSIRECORD *rec, LPVOID param)
{
MSIPACKAGE *package = param;
MSICOMPONENT *comp;
+ MSIRECORD *uirow;
SC_HANDLE scm = NULL, service = NULL;
LPCWSTR component, *vector = NULL;
- LPWSTR name, args;
- DWORD event, numargs;
+ LPWSTR name, args, display_name = NULL;
+ DWORD event, numargs, len;
UINT r = ERROR_FUNCTION_FAILED;
component = MSI_RecordGetString(rec, 6);
@@ -5198,6 +5377,14 @@ static UINT ITERATE_StartService(MSIRECORD *rec, LPVOID param)
goto done;
}
+ len = 0;
+ if (!GetServiceDisplayNameW( scm, name, NULL, &len ) &&
+ GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+ {
+ if ((display_name = msi_alloc( ++len * sizeof(WCHAR ))))
+ GetServiceDisplayNameW( scm, name, display_name, &len );
+ }
+
service = OpenServiceW(scm, name, SERVICE_START);
if (!service)
{
@@ -5217,12 +5404,19 @@ static UINT ITERATE_StartService(MSIRECORD *rec, LPVOID param)
r = ERROR_SUCCESS;
done:
+ uirow = MSI_CreateRecord( 2 );
+ MSI_RecordSetStringW( uirow, 1, display_name );
+ MSI_RecordSetStringW( uirow, 2, name );
+ ui_actiondata( package, szStartServices, uirow );
+ msiobj_release( &uirow->hdr );
+
CloseServiceHandle(service);
CloseServiceHandle(scm);
msi_free(name);
msi_free(args);
msi_free(vector);
+ msi_free(display_name);
return r;
}
@@ -5335,9 +5529,11 @@ static UINT ITERATE_StopService( MSIRECORD *rec, LPVOID param )
{
MSIPACKAGE *package = param;
MSICOMPONENT *comp;
+ MSIRECORD *uirow;
LPCWSTR component;
- LPWSTR name;
- DWORD event;
+ LPWSTR name = NULL, display_name = NULL;
+ DWORD event, len;
+ SC_HANDLE scm;
event = MSI_RecordGetInteger( rec, 3 );
if (!(event & msidbServiceControlEventStop))
@@ -5356,10 +5552,34 @@ static UINT ITERATE_StopService( MSIRECORD *rec, LPVOID param )
}
comp->Action = INSTALLSTATE_ABSENT;
+ scm = OpenSCManagerW( NULL, NULL, SC_MANAGER_CONNECT );
+ if (!scm)
+ {
+ ERR("Failed to open the service control manager\n");
+ goto done;
+ }
+
+ len = 0;
+ if (!GetServiceDisplayNameW( scm, name, NULL, &len ) &&
+ GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+ {
+ if ((display_name = msi_alloc( ++len * sizeof(WCHAR ))))
+ GetServiceDisplayNameW( scm, name, display_name, &len );
+ }
+ CloseServiceHandle( scm );
+
deformat_string( package, MSI_RecordGetString( rec, 2 ), &name );
stop_service( name );
- msi_free( name );
+done:
+ uirow = MSI_CreateRecord( 2 );
+ MSI_RecordSetStringW( uirow, 1, display_name );
+ MSI_RecordSetStringW( uirow, 2, name );
+ ui_actiondata( package, szStopServices, uirow );
+ msiobj_release( &uirow->hdr );
+
+ msi_free( name );
+ msi_free( display_name );
return ERROR_SUCCESS;
}
@@ -6749,19 +6969,19 @@ static UINT ACTION_ValidateProductID( MSIPACKAGE *package )
LPWSTR key, template, id;
UINT r = ERROR_SUCCESS;
- id = msi_dup_property( package, szProductID );
+ id = msi_dup_property( package->db, szProductID );
if (id)
{
msi_free( id );
return ERROR_SUCCESS;
}
- template = msi_dup_property( package, szPIDTemplate );
- key = msi_dup_property( package, szPIDKEY );
+ template = msi_dup_property( package->db, szPIDTemplate );
+ key = msi_dup_property( package->db, szPIDKEY );
if (key && template)
{
FIXME( "partial stub: template %s key %s\n", debugstr_w(template), debugstr_w(key) );
- r = MSI_SetPropertyW( package, szProductID, key );
+ r = msi_set_property( package->db, szProductID, key );
}
msi_free( template );
msi_free( key );
@@ -6780,7 +7000,7 @@ static UINT ACTION_AllocateRegistrySpace( MSIPACKAGE *package )
static const WCHAR szAvailableFreeReg[] =
{'A','V','A','I','L','A','B','L','E','F','R','E','E','R','E','G',0};
MSIRECORD *uirow;
- int space = msi_get_property_int( package, szAvailableFreeReg, 0 );
+ int space = msi_get_property_int( package->db, szAvailableFreeReg, 0 );
TRACE("%p %d kilobytes\n", package, space);
@@ -6804,6 +7024,40 @@ static UINT ACTION_InstallAdminPackage( MSIPACKAGE *package )
return ERROR_SUCCESS;
}
+static UINT ACTION_SetODBCFolders( MSIPACKAGE *package )
+{
+ UINT r, count;
+ MSIQUERY *view;
+
+ static const WCHAR driver_query[] = {
+ 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
+ 'O','D','B','C','D','r','i','v','e','r',0 };
+
+ static const WCHAR translator_query[] = {
+ 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
+ 'O','D','B','C','T','r','a','n','s','l','a','t','o','r',0 };
+
+ r = MSI_DatabaseOpenViewW( package->db, driver_query, &view );
+ if (r == ERROR_SUCCESS)
+ {
+ count = 0;
+ r = MSI_IterateRecords( view, &count, NULL, package );
+ msiobj_release( &view->hdr );
+ if (count) FIXME("ignored %u rows in ODBCDriver table\n", count);
+ }
+
+ r = MSI_DatabaseOpenViewW( package->db, translator_query, &view );
+ if (r == ERROR_SUCCESS)
+ {
+ count = 0;
+ r = MSI_IterateRecords( view, &count, NULL, package );
+ msiobj_release( &view->hdr );
+ if (count) FIXME("ignored %u rows in ODBCTranslator table\n", count);
+ }
+
+ return ERROR_SUCCESS;
+}
+
static UINT msi_unimplemented_action_stub( MSIPACKAGE *package,
LPCSTR action, LPCWSTR table )
{
@@ -6890,36 +7144,6 @@ static UINT ACTION_RemoveExistingProducts( MSIPACKAGE *package )
return msi_unimplemented_action_stub( package, "RemoveExistingProducts", table );
}
-static UINT ACTION_SetODBCFolders( MSIPACKAGE *package )
-{
- static const WCHAR table[] = { 'D','i','r','e','c','t','o','r','y',0 };
- return msi_unimplemented_action_stub( package, "SetODBCFolders", table );
-}
-
-static UINT ACTION_UnregisterClassInfo( MSIPACKAGE *package )
-{
- static const WCHAR table[] = { 'A','p','p','I','d',0 };
- return msi_unimplemented_action_stub( package, "UnregisterClassInfo", table );
-}
-
-static UINT ACTION_UnregisterExtensionInfo( MSIPACKAGE *package )
-{
- static const WCHAR table[] = { 'E','x','t','e','n','s','i','o','n',0 };
- return msi_unimplemented_action_stub( package, "UnregisterExtensionInfo", table );
-}
-
-static UINT ACTION_UnregisterMIMEInfo( MSIPACKAGE *package )
-{
- static const WCHAR table[] = { 'M','I','M','E',0 };
- return msi_unimplemented_action_stub( package, "UnregisterMIMEInfo", table );
-}
-
-static UINT ACTION_UnregisterProgIdInfo( MSIPACKAGE *package )
-{
- static const WCHAR table[] = { 'P','r','o','g','I','d',0 };
- return msi_unimplemented_action_stub( package, "UnregisterProgIdInfo", table );
-}
-
typedef UINT (*STANDARDACTIONHANDLER)(MSIPACKAGE*);
static const struct
@@ -7171,7 +7395,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
static const WCHAR szAction[] = {'A','C','T','I','O','N',0};
static const WCHAR szInstall[] = {'I','N','S','T','A','L','L',0};
- MSI_SetPropertyW(package, szAction, szInstall);
+ msi_set_property( package->db, szAction, szInstall );
package->script->InWhatSequence = SEQUENCE_INSTALL;
@@ -7216,10 +7440,10 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
msi_apply_transforms( package );
msi_apply_patches( package );
- if (!szCommandLine && msi_get_property_int( package, szInstalled, 0 ))
+ if (!szCommandLine && msi_get_property_int( package->db, szInstalled, 0 ))
{
TRACE("setting reinstall property\n");
- MSI_SetPropertyW( package, szReinstall, szAll );
+ msi_set_property( package->db, szReinstall, szAll );
}
/* properties may have been added by a transform */
diff --git a/dll/win32/msi/appsearch.c b/dll/win32/msi/appsearch.c
index 12c741178e3..336bfcae0f8 100644
--- a/dll/win32/msi/appsearch.c
+++ b/dll/win32/msi/appsearch.c
@@ -929,7 +929,8 @@ static UINT ACTION_AppSearchDr(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNATU
'D','r','L','o','c','a','t','o','r',' ',
'w','h','e','r','e',' ',
'S','i','g','n','a','t','u','r','e','_',' ','=',' ', '\'','%','s','\'',0};
- LPWSTR parentName = NULL, parent = NULL;
+ LPWSTR parent = NULL;
+ LPCWSTR parentName;
WCHAR path[MAX_PATH];
WCHAR expanded[MAX_PATH];
MSIRECORD *row;
@@ -949,14 +950,15 @@ static UINT ACTION_AppSearchDr(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNATU
}
/* check whether parent is set */
- parentName = msi_dup_record_field(row,2);
+ parentName = MSI_RecordGetString(row, 2);
if (parentName)
{
MSISIGNATURE parentSig;
rc = ACTION_AppSearchSigName(package, parentName, &parentSig, &parent);
ACTION_FreeSignature(&parentSig);
- msi_free(parentName);
+ if (!parent)
+ return ERROR_SUCCESS;
}
sz = MAX_PATH;
@@ -1041,7 +1043,10 @@ static UINT iterate_appsearch(MSIRECORD *row, LPVOID param)
r = ACTION_AppSearchSigName(package, sigName, &sig, &value);
if (value)
{
- MSI_SetPropertyW(package, propName, value);
+ r = msi_set_property( package->db, propName, value );
+ if (r == ERROR_SUCCESS && !strcmpW( propName, cszSourceDir ))
+ msi_reset_folders( package, TRUE );
+
msi_free(value);
}
ACTION_FreeSignature(&sig);
@@ -1064,6 +1069,14 @@ UINT ACTION_AppSearch(MSIPACKAGE *package)
MSIQUERY *view = NULL;
UINT r;
+ if (check_unique_action(package, szAppSearch))
+ {
+ TRACE("Skipping AppSearch action: already done in UI sequence\n");
+ return ERROR_SUCCESS;
+ }
+ else
+ register_unique_action(package, szAppSearch);
+
r = MSI_OpenQuery( package->db, &view, query );
if (r != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -1092,7 +1105,7 @@ static UINT ITERATE_CCPSearch(MSIRECORD *row, LPVOID param)
if (value)
{
TRACE("Found signature %s\n", debugstr_w(signature));
- MSI_SetPropertyW(package, success, szOne);
+ msi_set_property(package->db, success, szOne);
msi_free(value);
r = ERROR_NO_MORE_ITEMS;
}
@@ -1111,6 +1124,14 @@ UINT ACTION_CCPSearch(MSIPACKAGE *package)
MSIQUERY *view = NULL;
UINT r;
+ if (check_unique_action(package, szCCPSearch))
+ {
+ TRACE("Skipping AppSearch action: already done in UI sequence\n");
+ return ERROR_SUCCESS;
+ }
+ else
+ register_unique_action(package, szCCPSearch);
+
r = MSI_OpenQuery(package->db, &view, query);
if (r != ERROR_SUCCESS)
return ERROR_SUCCESS;
diff --git a/dll/win32/msi/automation.c b/dll/win32/msi/automation.c
index f935a64397d..d6ef5c98781 100644
--- a/dll/win32/msi/automation.c
+++ b/dll/win32/msi/automation.c
@@ -167,7 +167,7 @@ static HRESULT create_automation_object(MSIHANDLE msiHandle, IUnknown *pUnkOuter
if( pUnkOuter )
return CLASS_E_NOAGGREGATION;
- object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(AutomationObject)+sizetPrivateData);
+ object = msi_alloc_zero( sizeof(AutomationObject) + sizetPrivateData );
/* Set all the VTable references */
object->lpVtbl = &AutomationObject_Vtbl;
@@ -184,7 +184,7 @@ static HRESULT create_automation_object(MSIHANDLE msiHandle, IUnknown *pUnkOuter
object->iTypeInfo = NULL;
hr = load_type_info((IDispatch *)object, &object->iTypeInfo, clsid, 0x0);
if (FAILED(hr)) {
- HeapFree(GetProcessHeap(), 0, object);
+ msi_free( object );
return hr;
}
@@ -203,7 +203,7 @@ static HRESULT create_list_enumerator(IUnknown *pUnkOuter, LPVOID *ppObj, Automa
if( pUnkOuter )
return CLASS_E_NOAGGREGATION;
- object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ListEnumerator));
+ object = msi_alloc_zero( sizeof(ListEnumerator) );
/* Set all the VTable references */
object->lpVtbl = &ListEnumerator_Vtbl;
@@ -288,7 +288,7 @@ static ULONG WINAPI AutomationObject_Release(IDispatch* iface)
if (This->funcFree) This->funcFree(This);
ITypeInfo_Release(This->iTypeInfo);
MsiCloseHandle(This->msiHandle);
- HeapFree(GetProcessHeap(), 0, This);
+ msi_free(This);
}
return ref;
@@ -607,7 +607,7 @@ static ULONG WINAPI ListEnumerator_Release(IEnumVARIANT* iface)
if (!ref)
{
if (This->pObj) IDispatch_Release((IDispatch *)This->pObj);
- HeapFree(GetProcessHeap(), 0, This);
+ msi_free(This);
}
return ref;
@@ -1043,7 +1043,7 @@ static void WINAPI ListImpl_Free(AutomationObject *This)
for (idx=0; idxulCount; idx++)
VariantClear(&data->pVars[idx]);
- HeapFree(GetProcessHeap(), 0, data->pVars);
+ msi_free(data->pVars);
}
static HRESULT WINAPI ViewImpl_Invoke(
diff --git a/dll/win32/msi/classes.c b/dll/win32/msi/classes.c
index acd8429bec4..22d11c1441c 100644
--- a/dll/win32/msi/classes.c
+++ b/dll/win32/msi/classes.c
@@ -18,15 +18,16 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-/* actions handled in this module
+/* Actions handled in this module:
+ *
* RegisterClassInfo
* RegisterProgIdInfo
* RegisterExtensionInfo
* RegisterMIMEInfo
- * UnRegisterClassInfo (TODO)
- * UnRegisterProgIdInfo (TODO)
- * UnRegisterExtensionInfo (TODO)
- * UnRegisterMIMEInfo (TODO)
+ * UnregisterClassInfo
+ * UnregisterProgIdInfo
+ * UnregisterExtensionInfo
+ * UnregisterMIMEInfo
*/
#include
@@ -343,7 +344,7 @@ static MSIEXTENSION *load_given_extension( MSIPACKAGE *package, LPCWSTR extensio
static MSIMIME *load_mime( MSIPACKAGE* package, MSIRECORD *row )
{
- LPCWSTR buffer;
+ LPCWSTR extension;
MSIMIME *mt;
/* fill in the data */
@@ -355,8 +356,9 @@ static MSIMIME *load_mime( MSIPACKAGE* package, MSIRECORD *row )
mt->ContentType = msi_dup_record_field( row, 1 );
TRACE("loading mime %s\n", debugstr_w(mt->ContentType));
- buffer = MSI_RecordGetString( row, 2 );
- mt->Extension = load_given_extension( package, buffer );
+ extension = MSI_RecordGetString( row, 2 );
+ mt->Extension = load_given_extension( package, extension );
+ mt->suffix = strdupW( extension );
mt->clsid = msi_dup_record_field( row, 3 );
mt->Class = load_given_class( package, mt->clsid );
@@ -720,6 +722,25 @@ static void mark_progid_for_install( MSIPACKAGE* package, MSIPROGID *progid )
}
}
+static void mark_progid_for_uninstall( MSIPACKAGE *package, MSIPROGID *progid )
+{
+ MSIPROGID *child;
+
+ if (!progid)
+ return;
+
+ if (!progid->InstallMe)
+ return;
+
+ progid->InstallMe = FALSE;
+
+ LIST_FOR_EACH_ENTRY( child, &package->progids, MSIPROGID, entry )
+ {
+ if (child->Parent == progid)
+ mark_progid_for_uninstall( package, child );
+ }
+}
+
static void mark_mime_for_install( MSIMIME *mime )
{
if (!mime)
@@ -727,9 +748,15 @@ static void mark_mime_for_install( MSIMIME *mime )
mime->InstallMe = TRUE;
}
+static void mark_mime_for_uninstall( MSIMIME *mime )
+{
+ if (!mime)
+ return;
+ mime->InstallMe = FALSE;
+}
+
static UINT register_appid(const MSIAPPID *appid, LPCWSTR app )
{
- static const WCHAR szAppID[] = { 'A','p','p','I','D',0 };
static const WCHAR szRemoteServerName[] =
{'R','e','m','o','t','e','S','e','r','v','e','r','N','a','m','e',0};
static const WCHAR szLocalService[] =
@@ -776,24 +803,13 @@ static UINT register_appid(const MSIAPPID *appid, LPCWSTR app )
UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
{
- /*
- * Again I am assuming the words, "Whose key file represents" when referring
- * to a Component as to meaning that Components KeyPath file
- */
-
- UINT rc;
- MSIRECORD *uirow;
- static const WCHAR szCLSID[] = { 'C','L','S','I','D',0 };
- static const WCHAR szProgID[] = { 'P','r','o','g','I','D',0 };
- static const WCHAR szVIProgID[] = { 'V','e','r','s','i','o','n','I','n','d','e','p','e','n','d','e','n','t','P','r','o','g','I','D',0 };
- static const WCHAR szAppID[] = { 'A','p','p','I','D',0 };
static const WCHAR szFileType_fmt[] = {'F','i','l','e','T','y','p','e','\\','%','s','\\','%','i',0};
+ MSIRECORD *uirow;
HKEY hkey,hkey2,hkey3;
MSICLASS *cls;
load_classes_and_such(package);
- rc = RegCreateKeyW(HKEY_CLASSES_ROOT,szCLSID,&hkey);
- if (rc != ERROR_SUCCESS)
+ if (RegCreateKeyW(HKEY_CLASSES_ROOT, szCLSID, &hkey) != ERROR_SUCCESS)
return ERROR_FUNCTION_FAILED;
LIST_FOR_EACH_ENTRY( cls, &package->classes, MSICLASS, entry )
@@ -812,16 +828,21 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
if (!feature)
continue;
- /*
- * MSDN says that these are based on Feature not on Component.
- */
if (feature->ActionRequest != INSTALLSTATE_LOCAL &&
feature->ActionRequest != INSTALLSTATE_ADVERTISED )
{
- TRACE("Feature %s not scheduled for installation, skipping regstration of class %s\n",
+ TRACE("Feature %s not scheduled for installation, skipping registration of class %s\n",
debugstr_w(feature->Feature), debugstr_w(cls->clsid));
continue;
}
+ feature->Action = feature->ActionRequest;
+
+ file = get_loaded_file( package, comp->KeyPath );
+ if (!file)
+ {
+ TRACE("COM server not provided, skipping class %s\n", debugstr_w(cls->clsid));
+ continue;
+ }
TRACE("Registering class %s (%p)\n", debugstr_w(cls->clsid), cls);
@@ -834,12 +855,6 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
msi_reg_set_val_str( hkey2, NULL, cls->Description );
RegCreateKeyW( hkey2, cls->Context, &hkey3 );
- file = get_loaded_file( package, comp->KeyPath );
- if (!file)
- {
- TRACE("COM server not provided, skipping class %s\n", debugstr_w(cls->clsid));
- continue;
- }
/*
* FIXME: Implement install on demand (advertised components).
@@ -887,35 +902,18 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
if (cls->AppID)
{
MSIAPPID *appid = cls->AppID;
-
msi_reg_set_val_str( hkey2, szAppID, appid->AppID );
-
register_appid( appid, cls->Description );
}
if (cls->IconPath)
- {
- static const WCHAR szDefaultIcon[] =
- {'D','e','f','a','u','l','t','I','c','o','n',0};
-
msi_reg_set_subkey_val( hkey2, szDefaultIcon, NULL, cls->IconPath );
- }
if (cls->DefInprocHandler)
- {
- static const WCHAR szInproc[] =
- {'I','n','p','r','o','c','H','a','n','d','l','e','r',0};
-
- msi_reg_set_subkey_val( hkey2, szInproc, NULL, cls->DefInprocHandler );
- }
+ msi_reg_set_subkey_val( hkey2, szInprocHandler, NULL, cls->DefInprocHandler );
if (cls->DefInprocHandler32)
- {
- static const WCHAR szInproc32[] =
- {'I','n','p','r','o','c','H','a','n','d','l','e','r','3','2',0};
-
- msi_reg_set_subkey_val( hkey2, szInproc32, NULL, cls->DefInprocHandler32 );
- }
+ msi_reg_set_subkey_val( hkey2, szInprocHandler32, NULL, cls->DefInprocHandler32 );
RegCloseKey(hkey2);
@@ -947,14 +945,92 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
}
uirow = MSI_CreateRecord(1);
-
MSI_RecordSetStringW( uirow, 1, cls->clsid );
ui_actiondata(package,szRegisterClassInfo,uirow);
msiobj_release(&uirow->hdr);
}
RegCloseKey(hkey);
- return rc;
+ return ERROR_SUCCESS;
+}
+
+UINT ACTION_UnregisterClassInfo( MSIPACKAGE *package )
+{
+ static const WCHAR szFileType[] = {'F','i','l','e','T','y','p','e','\\',0};
+ MSIRECORD *uirow;
+ MSICLASS *cls;
+ HKEY hkey, hkey2;
+
+ load_classes_and_such( package );
+ if (RegOpenKeyW( HKEY_CLASSES_ROOT, szCLSID, &hkey ) != ERROR_SUCCESS)
+ return ERROR_SUCCESS;
+
+ LIST_FOR_EACH_ENTRY( cls, &package->classes, MSICLASS, entry )
+ {
+ MSIFEATURE *feature;
+ MSICOMPONENT *comp;
+ LPWSTR filetype;
+ LONG res;
+
+ comp = cls->Component;
+ if (!comp)
+ continue;
+
+ feature = cls->Feature;
+ if (!feature)
+ continue;
+
+ if (feature->ActionRequest != INSTALLSTATE_ABSENT)
+ {
+ TRACE("Feature %s not scheduled for removal, skipping unregistration of class %s\n",
+ debugstr_w(feature->Feature), debugstr_w(cls->clsid));
+ continue;
+ }
+ feature->Action = feature->ActionRequest;
+
+ TRACE("Unregistering class %s (%p)\n", debugstr_w(cls->clsid), cls);
+
+ cls->Installed = FALSE;
+ mark_progid_for_uninstall( package, cls->ProgID );
+
+ res = RegDeleteTreeW( hkey, cls->clsid );
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to delete class key %d\n", res);
+
+ if (cls->AppID)
+ {
+ res = RegOpenKeyW( HKEY_CLASSES_ROOT, szAppID, &hkey2 );
+ if (res == ERROR_SUCCESS)
+ {
+ res = RegDeleteKeyW( hkey2, cls->AppID->AppID );
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to delete appid key %d\n", res);
+ RegCloseKey( hkey2 );
+ }
+ }
+ if (cls->FileTypeMask)
+ {
+ filetype = msi_alloc( (strlenW( szFileType ) + strlenW( cls->clsid ) + 1) * sizeof(WCHAR) );
+ if (filetype)
+ {
+ strcpyW( filetype, szFileType );
+ strcatW( filetype, cls->clsid );
+ res = RegDeleteTreeW( HKEY_CLASSES_ROOT, filetype );
+ msi_free( filetype );
+
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to delete file type %d\n", res);
+ }
+ }
+
+ uirow = MSI_CreateRecord( 1 );
+ MSI_RecordSetStringW( uirow, 1, cls->clsid );
+ ui_actiondata( package, szUnregisterClassInfo, uirow );
+ msiobj_release( &uirow->hdr );
+ }
+
+ RegCloseKey( hkey );
+ return ERROR_SUCCESS;
}
static LPCWSTR get_clsid_of_progid( const MSIPROGID *progid )
@@ -972,11 +1048,7 @@ static LPCWSTR get_clsid_of_progid( const MSIPROGID *progid )
static UINT register_progid( const MSIPROGID* progid )
{
- static const WCHAR szCLSID[] = { 'C','L','S','I','D',0 };
- static const WCHAR szDefaultIcon[] =
- {'D','e','f','a','u','l','t','I','c','o','n',0};
- static const WCHAR szCurVer[] =
- {'C','u','r','V','e','r',0};
+ static const WCHAR szCurVer[] = {'C','u','r','V','e','r',0};
HKEY hkey = 0;
UINT rc;
@@ -1041,6 +1113,41 @@ UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package)
return ERROR_SUCCESS;
}
+UINT ACTION_UnregisterProgIdInfo( MSIPACKAGE *package )
+{
+ MSIPROGID *progid;
+ MSIRECORD *uirow;
+ LONG res;
+
+ load_classes_and_such( package );
+
+ LIST_FOR_EACH_ENTRY( progid, &package->progids, MSIPROGID, entry )
+ {
+ /* check if this progid is to be removed */
+ if (progid->Class && !progid->Class->Installed)
+ progid->InstallMe = FALSE;
+
+ if (progid->InstallMe)
+ {
+ TRACE("progid %s not scheduled to be removed\n", debugstr_w(progid->ProgID));
+ continue;
+ }
+
+ TRACE("Unregistering progid %s\n", debugstr_w(progid->ProgID));
+
+ res = RegDeleteTreeW( HKEY_CLASSES_ROOT, progid->ProgID );
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to delete progid key %d\n", res);
+
+ uirow = MSI_CreateRecord( 1 );
+ MSI_RecordSetStringW( uirow, 1, progid->ProgID );
+ ui_actiondata( package, szUnregisterProgIdInfo, uirow );
+ msiobj_release( &uirow->hdr );
+ }
+
+ return ERROR_SUCCESS;
+}
+
static UINT register_verb(MSIPACKAGE *package, LPCWSTR progid,
MSICOMPONENT* component, const MSIEXTENSION* extension,
MSIVERB* verb, INT* Sequence )
@@ -1122,10 +1229,11 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
{
static const WCHAR szContentType[] =
{'C','o','n','t','e','n','t',' ','T','y','p','e',0 };
- HKEY hkey;
+ HKEY hkey = NULL;
MSIEXTENSION *ext;
MSIRECORD *uirow;
BOOL install_on_demand = TRUE;
+ LONG res;
load_classes_and_such(package);
@@ -1157,6 +1265,7 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
debugstr_w(feature->Feature), debugstr_w(ext->Extension));
continue;
}
+ feature->Action = feature->ActionRequest;
TRACE("Registering extension %s (%p)\n", debugstr_w(ext->Extension), ext);
@@ -1170,12 +1279,16 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
mark_mime_for_install(ext->Mime);
- extension = msi_alloc( (lstrlenW( ext->Extension ) + 2)*sizeof(WCHAR) );
- extension[0] = '.';
- lstrcpyW(extension+1,ext->Extension);
-
- RegCreateKeyW(HKEY_CLASSES_ROOT,extension,&hkey);
- msi_free( extension );
+ extension = msi_alloc( (strlenW( ext->Extension ) + 2) * sizeof(WCHAR) );
+ if (extension)
+ {
+ extension[0] = '.';
+ strcpyW( extension + 1, ext->Extension );
+ res = RegCreateKeyW( HKEY_CLASSES_ROOT, extension, &hkey );
+ msi_free( extension );
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to create extension key %d\n", res);
+ }
if (ext->Mime)
msi_reg_set_val_str( hkey, szContentType, ext->Mime->ContentType );
@@ -1225,6 +1338,86 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
return ERROR_SUCCESS;
}
+UINT ACTION_UnregisterExtensionInfo( MSIPACKAGE *package )
+{
+ MSIEXTENSION *ext;
+ MSIRECORD *uirow;
+ LONG res;
+
+ load_classes_and_such( package );
+
+ LIST_FOR_EACH_ENTRY( ext, &package->extensions, MSIEXTENSION, entry )
+ {
+ LPWSTR extension;
+ MSIFEATURE *feature;
+
+ if (!ext->Component)
+ continue;
+
+ feature = ext->Feature;
+ if (!feature)
+ continue;
+
+ if (feature->ActionRequest != INSTALLSTATE_ABSENT)
+ {
+ TRACE("Feature %s not scheduled for removal, skipping unregistration of extension %s\n",
+ debugstr_w(feature->Feature), debugstr_w(ext->Extension));
+ continue;
+ }
+
+ TRACE("Unregistering extension %s\n", debugstr_w(ext->Extension));
+
+ ext->Installed = FALSE;
+
+ if (ext->ProgID && !list_empty( &ext->verbs ))
+ mark_progid_for_uninstall( package, ext->ProgID );
+
+ mark_mime_for_uninstall( ext->Mime );
+
+ extension = msi_alloc( (strlenW( ext->Extension ) + 2) * sizeof(WCHAR) );
+ if (extension)
+ {
+ extension[0] = '.';
+ strcpyW( extension + 1, ext->Extension );
+ res = RegDeleteTreeW( HKEY_CLASSES_ROOT, extension );
+ msi_free( extension );
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to delete extension key %d\n", res);
+ }
+
+ if (ext->ProgID || ext->ProgIDText)
+ {
+ static const WCHAR shellW[] = {'\\','s','h','e','l','l',0};
+ LPCWSTR progid;
+ LPWSTR progid_shell;
+
+ if (ext->ProgID)
+ progid = ext->ProgID->ProgID;
+ else
+ progid = ext->ProgIDText;
+
+ progid_shell = msi_alloc( (strlenW( progid ) + strlenW( shellW ) + 1) * sizeof(WCHAR) );
+ if (progid_shell)
+ {
+ strcpyW( progid_shell, progid );
+ strcatW( progid_shell, shellW );
+ res = RegDeleteTreeW( HKEY_CLASSES_ROOT, progid_shell );
+ msi_free( progid_shell );
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to delete shell key %d\n", res);
+ RegDeleteKeyW( HKEY_CLASSES_ROOT, progid );
+ }
+ }
+
+ uirow = MSI_CreateRecord( 1 );
+ MSI_RecordSetStringW( uirow, 1, ext->Extension );
+ ui_actiondata( package, szUnregisterExtensionInfo, uirow );
+ msiobj_release( &uirow->hdr );
+ }
+
+ return ERROR_SUCCESS;
+}
+
UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
{
static const WCHAR szExten[] =
@@ -1237,11 +1430,6 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
LIST_FOR_EACH_ENTRY( mt, &package->mimes, MSIMIME, entry )
{
LPWSTR extension;
- LPCWSTR exten;
- LPCWSTR mime;
- static const WCHAR fmt[] =
- {'M','I','M','E','\\','D','a','t','a','b','a','s','e','\\',
- 'C','o','n','t','e','n','t',' ','T','y','p','e','\\', '%','s',0};
LPWSTR key;
/*
@@ -1254,33 +1442,80 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
if (!mt->InstallMe)
{
- TRACE("MIME %s not scheduled to be installed\n",
- debugstr_w(mt->ContentType));
+ TRACE("MIME %s not scheduled to be installed\n", debugstr_w(mt->ContentType));
continue;
}
-
- mime = mt->ContentType;
- exten = mt->Extension->Extension;
- extension = msi_alloc( (lstrlenW( exten ) + 2)*sizeof(WCHAR) );
- extension[0] = '.';
- lstrcpyW(extension+1,exten);
+ TRACE("Registering MIME type %s\n", debugstr_w(mt->ContentType));
- key = msi_alloc( (strlenW(mime)+strlenW(fmt)+1) * sizeof(WCHAR) );
- sprintfW(key,fmt,mime);
- msi_reg_set_subkey_val( HKEY_CLASSES_ROOT, key, szExten, extension );
+ extension = msi_alloc( (strlenW( mt->Extension->Extension ) + 2) * sizeof(WCHAR) );
+ key = msi_alloc( (strlenW( mt->ContentType ) + strlenW( szMIMEDatabase ) + 1) * sizeof(WCHAR) );
- msi_free(extension);
- msi_free(key);
+ if (extension && key)
+ {
+ extension[0] = '.';
+ strcpyW( extension + 1, mt->Extension->Extension );
- if (mt->clsid)
- FIXME("Handle non null for field 3\n");
+ strcpyW( key, szMIMEDatabase );
+ strcatW( key, mt->ContentType );
+ msi_reg_set_subkey_val( HKEY_CLASSES_ROOT, key, szExten, extension );
- uirow = MSI_CreateRecord(2);
- MSI_RecordSetStringW(uirow,1,mt->ContentType);
- MSI_RecordSetStringW(uirow,2,exten);
- ui_actiondata(package,szRegisterMIMEInfo,uirow);
- msiobj_release(&uirow->hdr);
+ if (mt->clsid)
+ msi_reg_set_subkey_val( HKEY_CLASSES_ROOT, key, szCLSID, mt->clsid );
+ }
+ msi_free( extension );
+ msi_free( key );
+
+ uirow = MSI_CreateRecord( 2 );
+ MSI_RecordSetStringW( uirow, 1, mt->ContentType );
+ MSI_RecordSetStringW( uirow, 2, mt->suffix );
+ ui_actiondata( package, szRegisterMIMEInfo, uirow );
+ msiobj_release( &uirow->hdr );
+ }
+
+ return ERROR_SUCCESS;
+}
+
+UINT ACTION_UnregisterMIMEInfo( MSIPACKAGE *package )
+{
+ MSIRECORD *uirow;
+ MSIMIME *mime;
+
+ load_classes_and_such( package );
+
+ LIST_FOR_EACH_ENTRY( mime, &package->mimes, MSIMIME, entry )
+ {
+ LONG res;
+ LPWSTR mime_key;
+
+ mime->InstallMe = (mime->InstallMe ||
+ (mime->Class && mime->Class->Installed) ||
+ (mime->Extension && mime->Extension->Installed));
+
+ if (mime->InstallMe)
+ {
+ TRACE("MIME %s not scheduled to be removed\n", debugstr_w(mime->ContentType));
+ continue;
+ }
+
+ TRACE("Unregistering MIME type %s\n", debugstr_w(mime->ContentType));
+
+ mime_key = msi_alloc( (strlenW( szMIMEDatabase ) + strlenW( mime->ContentType ) + 1) * sizeof(WCHAR) );
+ if (mime_key)
+ {
+ strcpyW( mime_key, szMIMEDatabase );
+ strcatW( mime_key, mime->ContentType );
+ res = RegDeleteKeyW( HKEY_CLASSES_ROOT, mime_key );
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to delete MIME key %d\n", res);
+ msi_free( mime_key );
+ }
+
+ uirow = MSI_CreateRecord( 2 );
+ MSI_RecordSetStringW( uirow, 1, mime->ContentType );
+ MSI_RecordSetStringW( uirow, 2, mime->suffix );
+ ui_actiondata( package, szUnregisterMIMEInfo, uirow );
+ msiobj_release( &uirow->hdr );
}
return ERROR_SUCCESS;
diff --git a/dll/win32/msi/cond.tab.c b/dll/win32/msi/cond.tab.c
index 5449d99fdab..2b10d209be6 100644
--- a/dll/win32/msi/cond.tab.c
+++ b/dll/win32/msi/cond.tab.c
@@ -1989,7 +1989,7 @@ yyreduce:
COND_input* cond = (COND_input*) info;
UINT len;
- (yyval.string) = msi_dup_property( cond->package, (yyvsp[(1) - (1)].string) );
+ (yyval.string) = msi_dup_property( cond->package->db, (yyvsp[(1) - (1)].string) );
if ((yyval.string))
{
len = (lstrlenW((yyval.string)) + 1) * sizeof (WCHAR);
diff --git a/dll/win32/msi/cond.y b/dll/win32/msi/cond.y
index f3db635a10a..9a7a16d67df 100644
--- a/dll/win32/msi/cond.y
+++ b/dll/win32/msi/cond.y
@@ -347,7 +347,7 @@ symbol_s:
COND_input* cond = (COND_input*) info;
UINT len;
- $$ = msi_dup_property( cond->package, $1 );
+ $$ = msi_dup_property( cond->package->db, $1 );
if ($$)
{
len = (lstrlenW($$) + 1) * sizeof (WCHAR);
diff --git a/dll/win32/msi/custom.c b/dll/win32/msi/custom.c
index 584c0507c53..5a1787f7d15 100644
--- a/dll/win32/msi/custom.c
+++ b/dll/win32/msi/custom.c
@@ -163,17 +163,17 @@ static void set_deferred_action_props(MSIPACKAGE *package, LPWSTR deferred_data)
end = strstrW(beg, sep);
*end = '\0';
- MSI_SetPropertyW(package, szCustomActionData, beg);
+ msi_set_property(package->db, szCustomActionData, beg);
beg = end + 3;
end = strstrW(beg, sep);
*end = '\0';
- MSI_SetPropertyW(package, szUserSID, beg);
+ msi_set_property(package->db, szUserSID, beg);
beg = end + 3;
end = strchrW(beg, ']');
*end = '\0';
- MSI_SetPropertyW(package, szProductCode, beg);
+ msi_set_property(package->db, szProductCode, beg);
}
UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL execute)
@@ -231,9 +231,9 @@ UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL
}
if (!execute)
{
- LPWSTR actiondata = msi_dup_property(package, action);
- LPWSTR usersid = msi_dup_property(package, szUserSID);
- LPWSTR prodcode = msi_dup_property(package, szProductCode);
+ LPWSTR actiondata = msi_dup_property(package->db, action);
+ LPWSTR usersid = msi_dup_property(package->db, szUserSID);
+ LPWSTR prodcode = msi_dup_property(package->db, szProductCode);
LPWSTR deferred = msi_get_deferred_action(action, actiondata, usersid, prodcode);
if (type & msidbCustomActionTypeCommit)
@@ -256,7 +256,7 @@ UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL
}
else
{
- LPWSTR actiondata = msi_dup_property( package, action );
+ LPWSTR actiondata = msi_dup_property( package->db, action );
switch (script)
{
@@ -276,9 +276,9 @@ UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL
if (deferred_data)
set_deferred_action_props(package, deferred_data);
else if (actiondata)
- MSI_SetPropertyW(package, szCustomActionData, actiondata);
+ msi_set_property(package->db, szCustomActionData, actiondata);
else
- MSI_SetPropertyW(package, szCustomActionData, szEmpty);
+ msi_set_property(package->db, szCustomActionData, szEmpty);
msi_free(actiondata);
}
@@ -327,7 +327,9 @@ UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL
break;
deformat_string(package,target,&deformated);
- rc = MSI_SetPropertyW(package,source,deformated);
+ rc = msi_set_property( package->db, source, deformated );
+ if (rc == ERROR_SUCCESS && !strcmpW( source, cszSourceDir ))
+ msi_reset_folders( package, TRUE );
msi_free(deformated);
break;
case 37: /* JScript/VBScript text stored in target column. */
@@ -376,7 +378,7 @@ static UINT store_binary_to_temp(MSIPACKAGE *package, LPCWSTR source,
DWORD sz = MAX_PATH;
UINT r;
- if (MSI_GetPropertyW(package, cszTempFolder, fmt, &sz) != ERROR_SUCCESS)
+ if (msi_get_property(package->db, cszTempFolder, fmt, &sz) != ERROR_SUCCESS)
GetTempPathW(MAX_PATH, fmt);
if (GetTempFileNameW(fmt, szMsi, 0, tmp_file) == 0)
@@ -864,7 +866,7 @@ static UINT HANDLE_CustomType23(MSIPACKAGE *package, LPCWSTR source,
UINT r;
size = MAX_PATH;
- MSI_GetPropertyW(package, cszSourceDir, package_path, &size);
+ msi_get_property(package->db, cszSourceDir, package_path, &size);
lstrcatW(package_path, szBackSlash);
lstrcatW(package_path, source);
@@ -1078,7 +1080,7 @@ static UINT HANDLE_CustomType50(MSIPACKAGE *package, LPCWSTR source,
memset(&si,0,sizeof(STARTUPINFOW));
memset(&info,0,sizeof(PROCESS_INFORMATION));
- prop = msi_dup_property( package, source );
+ prop = msi_dup_property( package->db, source );
if (!prop)
return ERROR_SUCCESS;
@@ -1380,7 +1382,7 @@ static UINT HANDLE_CustomType53_54(MSIPACKAGE *package, LPCWSTR source,
TRACE("%s %s\n", debugstr_w(source), debugstr_w(target));
- prop = msi_dup_property(package,source);
+ prop = msi_dup_property( package->db, source );
if (!prop)
return ERROR_SUCCESS;
@@ -1415,7 +1417,7 @@ void ACTION_FinishCustomActions(const MSIPACKAGE* package)
EnterCriticalSection( &msi_custom_action_cs );
handle_count = list_count( &msi_pending_custom_actions );
- wait_handles = HeapAlloc( GetProcessHeap(), 0, handle_count * sizeof(HANDLE) );
+ wait_handles = msi_alloc( handle_count * sizeof(HANDLE) );
handle_count = 0;
LIST_FOR_EACH_ENTRY_SAFE( info, cursor, &msi_pending_custom_actions, msi_custom_action_info, entry )
@@ -1435,7 +1437,7 @@ void ACTION_FinishCustomActions(const MSIPACKAGE* package)
CloseHandle( wait_handles[i] );
}
- HeapFree( GetProcessHeap(), 0, wait_handles );
+ msi_free( wait_handles );
}
typedef struct _msi_custom_remote_impl {
diff --git a/dll/win32/msi/database.c b/dll/win32/msi/database.c
index cfa11e97ed5..3e577926340 100644
--- a/dll/win32/msi/database.c
+++ b/dll/win32/msi/database.c
@@ -164,64 +164,6 @@ UINT db_get_raw_stream( MSIDATABASE *db, LPCWSTR stname, IStream **stm )
return SUCCEEDED(r) ? ERROR_SUCCESS : ERROR_FUNCTION_FAILED;
}
-UINT read_raw_stream_data( MSIDATABASE *db, LPCWSTR stname,
- USHORT **pdata, UINT *psz )
-{
- HRESULT r;
- UINT ret = ERROR_FUNCTION_FAILED;
- VOID *data;
- ULONG sz, count;
- IStream *stm = NULL;
- STATSTG stat;
- LPWSTR encname;
-
- encname = encode_streamname( FALSE, stname );
- r = db_get_raw_stream( db, encname, &stm );
- msi_free( encname );
-
- if( r != ERROR_SUCCESS)
- return ret;
-
- r = IStream_Stat(stm, &stat, STATFLAG_NONAME );
- if( FAILED( r ) )
- {
- WARN("open stream failed r = %08x!\n", r);
- goto end;
- }
-
- if( stat.cbSize.QuadPart >> 32 )
- {
- WARN("Too big!\n");
- goto end;
- }
-
- sz = stat.cbSize.QuadPart;
- data = msi_alloc( sz );
- if( !data )
- {
- WARN("couldn't allocate memory r=%08x!\n", r);
- ret = ERROR_NOT_ENOUGH_MEMORY;
- goto end;
- }
-
- r = IStream_Read(stm, data, sz, &count );
- if( FAILED( r ) || ( count != sz ) )
- {
- msi_free( data );
- WARN("read stream failed r = %08x!\n", r);
- goto end;
- }
-
- *pdata = data;
- *psz = sz;
- ret = ERROR_SUCCESS;
-
-end:
- IStream_Release( stm );
-
- return ret;
-}
-
static void free_transforms( MSIDATABASE *db )
{
while( !list_empty( &db->transforms ) )
@@ -234,6 +176,37 @@ static void free_transforms( MSIDATABASE *db )
}
}
+void db_destroy_stream( MSIDATABASE *db, LPCWSTR stname )
+{
+ MSISTREAM *stream, *stream2;
+
+ LIST_FOR_EACH_ENTRY_SAFE( stream, stream2, &db->streams, MSISTREAM, entry )
+ {
+ HRESULT r;
+ STATSTG stat;
+
+ r = IStream_Stat( stream->stm, &stat, 0 );
+ if (FAILED(r))
+ {
+ WARN("failed to stat stream r = %08x\n", r);
+ continue;
+ }
+
+ if (!strcmpW( stname, stat.pwcsName ))
+ {
+ TRACE("destroying %s\n", debugstr_w(stname));
+
+ list_remove( &stream->entry );
+ IStream_Release( stream->stm );
+ msi_free( stream );
+ IStorage_DestroyElement( db->storage, stname );
+ CoTaskMemFree( stat.pwcsName );
+ break;
+ }
+ CoTaskMemFree( stat.pwcsName );
+ }
+}
+
static void free_streams( MSIDATABASE *db )
{
while( !list_empty( &db->streams ) )
@@ -289,7 +262,7 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
UINT ret = ERROR_FUNCTION_FAILED;
LPCWSTR szMode, save_path;
STATSTG stat;
- BOOL created = FALSE;
+ BOOL created = FALSE, patch = FALSE;
WCHAR path[MAX_PATH];
static const WCHAR szTables[] = { '_','T','a','b','l','e','s',0 };
@@ -304,6 +277,7 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
{
TRACE("Database is a patch\n");
szPersist -= MSIDBOPEN_PATCHFILE;
+ patch = TRUE;
}
save_path = szDBPath;
@@ -331,7 +305,7 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
STGM_CREATE|STGM_DIRECT|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, &stg);
if( r == ERROR_SUCCESS )
{
- IStorage_SetClass( stg, &CLSID_MsiDatabase );
+ IStorage_SetClass( stg, patch ? &CLSID_MsiPatch : &CLSID_MsiDatabase );
/* create the _Tables stream */
r = write_stream_data(stg, szTables, NULL, 0, TRUE);
if (SUCCEEDED(r))
@@ -379,6 +353,14 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
goto end;
}
+ if ( patch && !IsEqualGUID( &stat.clsid, &CLSID_MsiPatch ) )
+ {
+ ERR("storage GUID is not the MSI patch GUID %s\n",
+ debugstr_guid(&stat.clsid) );
+ ret = ERROR_OPEN_FAILED;
+ goto end;
+ }
+
db = alloc_msiobject( MSIHANDLETYPE_DATABASE, sizeof (MSIDATABASE),
MSI_CloseDatabase );
if( !db )
diff --git a/dll/win32/msi/dialog.c b/dll/win32/msi/dialog.c
index ac2e95af91f..2a00aa7cdeb 100644
--- a/dll/win32/msi/dialog.c
+++ b/dll/win32/msi/dialog.c
@@ -171,6 +171,8 @@ static MSIFEATURE *msi_seltree_get_selected_feature( msi_control *control );
static DWORD uiThreadId;
static HWND hMsiHiddenWindow;
+static LPWSTR msi_get_window_text( HWND hwnd );
+
static INT msi_dialog_scale_unit( msi_dialog *dialog, INT val )
{
return MulDiv( val, dialog->scale, 12 );
@@ -234,7 +236,7 @@ static LPWSTR msi_dialog_dup_property( msi_dialog *dialog, LPCWSTR property, BOO
return NULL;
if (indirect)
- prop = msi_dup_property( dialog->package, property );
+ prop = msi_dup_property( dialog->package->db, property );
if (!prop)
prop = strdupW( property );
@@ -581,6 +583,13 @@ static void msi_dialog_update_controls( msi_dialog *dialog, LPCWSTR property )
}
}
+static void msi_dialog_set_property( MSIPACKAGE *package, LPCWSTR property, LPCWSTR value )
+{
+ UINT r = msi_set_property( package->db, property, value );
+ if (r == ERROR_SUCCESS && !strcmpW( property, cszSourceDir ))
+ msi_reset_folders( package, TRUE );
+}
+
/* called from the Control Event subscription code */
void msi_dialog_handle_event( msi_dialog* dialog, LPCWSTR control,
LPCWSTR attribute, MSIRECORD *rec )
@@ -634,14 +643,14 @@ void msi_dialog_handle_event( msi_dialog* dialog, LPCWSTR control,
else if ( !lstrcmpW(attribute, szProperty) )
{
MSIFEATURE *feature = msi_seltree_get_selected_feature( ctrl );
- MSI_SetPropertyW( dialog->package, ctrl->property, feature->Directory );
+ msi_dialog_set_property( dialog->package, ctrl->property, feature->Directory );
}
else if ( !lstrcmpW(attribute, szSelectionPath) )
{
LPWSTR prop = msi_dialog_dup_property( dialog, ctrl->property, TRUE );
LPWSTR path;
if (!prop) return;
- path = msi_dup_property( dialog->package, prop );
+ path = msi_dup_property( dialog->package->db, prop );
SetWindowTextW( ctrl->hwnd, path );
msi_free(prop);
msi_free(path);
@@ -884,7 +893,7 @@ static LPWSTR msi_get_checkbox_value( msi_dialog *dialog, LPCWSTR prop )
if (ret)
return ret;
- ret = msi_dup_property( dialog->package, prop );
+ ret = msi_dup_property( dialog->package->db, prop );
if( ret && !ret[0] )
{
msi_free( ret );
@@ -1222,10 +1231,167 @@ static UINT msi_dialog_icon_control( msi_dialog *dialog, MSIRECORD *rec )
return ERROR_SUCCESS;
}
+/******************** Combo Box ***************************************/
+
+struct msi_combobox_info
+{
+ msi_dialog *dialog;
+ HWND hwnd;
+ WNDPROC oldproc;
+ DWORD num_items;
+ DWORD addpos_items;
+ LPWSTR *items;
+};
+
+static LRESULT WINAPI MSIComboBox_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ struct msi_combobox_info *info;
+ LRESULT r;
+ DWORD j;
+
+ TRACE("%p %04x %08lx %08lx\n", hWnd, msg, wParam, lParam);
+
+ info = GetPropW( hWnd, szButtonData );
+ if (!info)
+ return 0;
+
+ r = CallWindowProcW( info->oldproc, hWnd, msg, wParam, lParam );
+
+ switch (msg)
+ {
+ case WM_NCDESTROY:
+ for (j = 0; j < info->num_items; j++)
+ msi_free( info->items[j] );
+ msi_free( info->items );
+ msi_free( info );
+ RemovePropW( hWnd, szButtonData );
+ break;
+ }
+
+ return r;
+}
+
+static UINT msi_combobox_add_item( MSIRECORD *rec, LPVOID param )
+{
+ struct msi_combobox_info *info = param;
+ LPCWSTR value, text;
+ int pos;
+
+ value = MSI_RecordGetString( rec, 3 );
+ text = MSI_RecordGetString( rec, 4 );
+
+ info->items[info->addpos_items] = strdupW( value );
+
+ pos = SendMessageW( info->hwnd, CB_ADDSTRING, 0, (LPARAM)text );
+ SendMessageW( info->hwnd, CB_SETITEMDATA, pos, (LPARAM)info->items[info->addpos_items] );
+ info->addpos_items++;
+
+ return ERROR_SUCCESS;
+}
+
+static UINT msi_combobox_add_items( struct msi_combobox_info *info, LPCWSTR property )
+{
+ UINT r;
+ MSIQUERY *view = NULL;
+ DWORD count;
+
+ static const WCHAR query[] = {
+ 'S','E','L','E','C','T',' ','*',' ',
+ 'F','R','O','M',' ','`','C','o','m','b','o','B','o','x','`',' ',
+ 'W','H','E','R','E',' ',
+ '`','P','r','o','p','e','r','t','y','`',' ','=',' ','\'','%','s','\'',' ',
+ 'O','R','D','E','R',' ','B','Y',' ','`','O','r','d','e','r','`',0
+ };
+
+ r = MSI_OpenQuery( info->dialog->package->db, &view, query, property );
+ if (r != ERROR_SUCCESS)
+ return r;
+
+ /* just get the number of records */
+ count = 0;
+ r = MSI_IterateRecords( view, &count, NULL, NULL );
+
+ info->num_items = count;
+ info->items = msi_alloc( sizeof(*info->items) * count );
+
+ r = MSI_IterateRecords( view, NULL, msi_combobox_add_item, info );
+ msiobj_release( &view->hdr );
+
+ return r;
+}
+
+static UINT msi_dialog_combobox_handler( msi_dialog *dialog,
+ msi_control *control, WPARAM param )
+{
+ struct msi_combobox_info *info;
+ int index;
+ LPWSTR value;
+
+ if (HIWORD(param) != CBN_SELCHANGE && HIWORD(param) != CBN_EDITCHANGE)
+ return ERROR_SUCCESS;
+
+ info = GetPropW( control->hwnd, szButtonData );
+ index = SendMessageW( control->hwnd, CB_GETCURSEL, 0, 0 );
+ if (index == CB_ERR)
+ value = msi_get_window_text( control->hwnd );
+ else
+ value = (LPWSTR) SendMessageW( control->hwnd, CB_GETITEMDATA, index, 0 );
+
+ msi_dialog_set_property( info->dialog->package, control->property, value );
+ msi_dialog_evaluate_control_conditions( info->dialog );
+
+ if (index == CB_ERR)
+ msi_free( value );
+
+ return ERROR_SUCCESS;
+}
+
+static void msi_dialog_combobox_update( msi_dialog *dialog,
+ msi_control *control )
+{
+ struct msi_combobox_info *info;
+ LPWSTR value, tmp;
+ DWORD j;
+
+ info = GetPropW( control->hwnd, szButtonData );
+
+ value = msi_dup_property( dialog->package->db, control->property );
+ if (!value)
+ {
+ SendMessageW( control->hwnd, CB_SETCURSEL, -1, 0 );
+ return;
+ }
+
+ for (j = 0; j < info->num_items; j++)
+ {
+ tmp = (LPWSTR) SendMessageW( control->hwnd, CB_GETITEMDATA, j, 0 );
+ if (!lstrcmpW( value, tmp ))
+ break;
+ }
+
+ if (j < info->num_items)
+ {
+ SendMessageW( control->hwnd, CB_SETCURSEL, j, 0 );
+ }
+ else
+ {
+ SendMessageW( control->hwnd, CB_SETCURSEL, -1, 0 );
+ SetWindowTextW( control->hwnd, value );
+ }
+
+ msi_free(value);
+}
+
static UINT msi_dialog_combo_control( msi_dialog *dialog, MSIRECORD *rec )
{
- static const WCHAR szCombo[] = { 'C','O','M','B','O','B','O','X',0 };
+ struct msi_combobox_info *info;
+ msi_control *control;
DWORD attributes, style;
+ LPCWSTR prop;
+
+ info = msi_alloc( sizeof *info );
+ if (!info)
+ return ERROR_FUNCTION_FAILED;
style = CBS_AUTOHSCROLL | WS_TABSTOP | WS_GROUP | WS_CHILD;
attributes = MSI_RecordGetInteger( rec, 8 );
@@ -1236,7 +1402,33 @@ static UINT msi_dialog_combo_control( msi_dialog *dialog, MSIRECORD *rec )
else
style |= CBS_DROPDOWN;
- msi_dialog_add_control( dialog, rec, szCombo, style );
+ control = msi_dialog_add_control( dialog, rec, WC_COMBOBOXW, style );
+ if (!control)
+ {
+ msi_free( info );
+ return ERROR_FUNCTION_FAILED;
+ }
+
+ control->handler = msi_dialog_combobox_handler;
+ control->update = msi_dialog_combobox_update;
+
+ prop = MSI_RecordGetString( rec, 9 );
+ control->property = msi_dialog_dup_property( dialog, prop, FALSE );
+
+ /* subclass */
+ info->dialog = dialog;
+ info->hwnd = control->hwnd;
+ info->items = NULL;
+ info->addpos_items = 0;
+ info->oldproc = (WNDPROC)SetWindowLongPtrW( control->hwnd, GWLP_WNDPROC,
+ (LONG_PTR)MSIComboBox_WndProc );
+ SetPropW( control->hwnd, szButtonData, info );
+
+ if (control->property)
+ msi_combobox_add_items( info, control->property );
+
+ msi_dialog_combobox_update( dialog, control );
+
return ERROR_SUCCESS;
}
@@ -1276,7 +1468,7 @@ static UINT msi_dialog_edit_control( msi_dialog *dialog, MSIRECORD *rec )
if( prop )
control->property = strdupW( prop );
- val = msi_dup_property( dialog->package, control->property );
+ val = msi_dup_property( dialog->package->db, control->property );
SetWindowTextW( control->hwnd, val );
msi_free( val );
return ERROR_SUCCESS;
@@ -1352,10 +1544,9 @@ static void msi_mask_control_change( struct msi_maskedit_info *info )
if( i == info->num_groups )
{
- TRACE("Set property %s to %s\n",
- debugstr_w(info->prop), debugstr_w(val) );
+ TRACE("Set property %s to %s\n", debugstr_w(info->prop), debugstr_w(val));
CharUpperBuffW( val, info->num_chars );
- MSI_SetPropertyW( info->dialog->package, info->prop, val );
+ msi_dialog_set_property( info->dialog->package, info->prop, val );
msi_dialog_evaluate_control_conditions( info->dialog );
}
msi_free( val );
@@ -1587,7 +1778,7 @@ static UINT msi_dialog_maskedit_control( msi_dialog *dialog, MSIRECORD *rec )
if( prop )
{
- val = msi_dup_property( dialog->package, prop );
+ val = msi_dup_property( dialog->package->db, prop );
if( val )
{
msi_maskedit_set_text( info, val );
@@ -1705,7 +1896,7 @@ static BOOL msi_dialog_onkillfocus( msi_dialog *dialog, msi_control *control )
else
{
valid = TRUE;
- MSI_SetPropertyW( dialog->package, prop, buf );
+ msi_dialog_set_property( dialog->package, prop, buf );
}
msi_dialog_update_pathedit( dialog, control );
@@ -1855,7 +2046,7 @@ static UINT msi_dialog_radiogroup_control( msi_dialog *dialog, MSIRECORD *rec )
group.dialog = dialog;
group.parent = control;
group.attributes = MSI_RecordGetInteger( rec, 8 );
- group.propval = msi_dup_property( dialog->package, control->property );
+ group.propval = msi_dup_property( dialog->package->db, control->property );
r = MSI_IterateRecords( view, 0, msi_dialog_create_radiobutton, &group );
msiobj_release( &view->hdr );
@@ -2357,8 +2548,7 @@ static UINT msi_dialog_listbox_handler( msi_dialog *dialog,
index = SendMessageW( control->hwnd, LB_GETCURSEL, 0, 0 );
value = (LPCWSTR) SendMessageW( control->hwnd, LB_GETITEMDATA, index, 0 );
- MSI_SetPropertyW( info->dialog->package,
- control->property, value );
+ msi_dialog_set_property( info->dialog->package, control->property, value );
msi_dialog_evaluate_control_conditions( info->dialog );
return ERROR_SUCCESS;
@@ -2521,7 +2711,7 @@ UINT msi_dialog_directorylist_up( msi_dialog *dialog )
if (ptr != path) *(ptr - 1) = '\0';
PathAddBackslashW( path );
- MSI_SetPropertyW( dialog->package, prop, path );
+ msi_dialog_set_property( dialog->package, prop, path );
msi_dialog_update_directory_list( dialog, NULL );
msi_dialog_update_directory_combo( dialog, NULL );
@@ -2567,7 +2757,7 @@ static UINT msi_dialog_dirlist_handler( msi_dialog *dialog,
lstrcatW( new_path, text );
lstrcatW( new_path, szBackSlash );
- MSI_SetPropertyW( dialog->package, prop, new_path );
+ msi_dialog_set_property( dialog->package, prop, new_path );
msi_dialog_update_directory_list( dialog, NULL );
msi_dialog_update_directory_combo( dialog, NULL );
@@ -2810,7 +3000,7 @@ static UINT msi_dialog_volsel_handler( msi_dialog *dialog,
indirect = control->attributes & msidbControlAttributesIndirect;
prop = msi_dialog_dup_property( dialog, control->property, indirect );
- MSI_SetPropertyW( dialog->package, prop, text );
+ msi_dialog_set_property( dialog->package, prop, text );
msi_free( prop );
return ERROR_SUCCESS;
@@ -3078,8 +3268,8 @@ static void msi_dialog_adjust_dialog_pos( msi_dialog *dialog, MSIRECORD *rec, LP
sz.cx = msi_dialog_scale_unit( dialog, sz.cx );
sz.cy = msi_dialog_scale_unit( dialog, sz.cy );
- xres = msi_get_property_int( dialog->package, szScreenX, 0 );
- yres = msi_get_property_int( dialog->package, szScreenY, 0 );
+ xres = msi_get_property_int( dialog->package->db, szScreenX, 0 );
+ yres = msi_get_property_int( dialog->package->db, szScreenY, 0 );
center.x = MulDiv( center.x, xres, 100 );
center.y = MulDiv( center.y, yres, 100 );
@@ -3172,7 +3362,7 @@ static LRESULT msi_dialog_oncreate( HWND hwnd, LPCREATESTRUCTW cs )
dialog->attributes = MSI_RecordGetInteger( rec, 6 );
- dialog->default_font = msi_dup_property( dialog->package, df );
+ dialog->default_font = msi_dup_property( dialog->package->db, df );
if (!dialog->default_font)
{
dialog->default_font = strdupW(dfv);
@@ -3213,7 +3403,7 @@ static UINT msi_dialog_send_event( msi_dialog *dialog, LPCWSTR event, LPCWSTR ar
return ERROR_SUCCESS;
}
-static UINT msi_dialog_set_property( msi_dialog *dialog, LPCWSTR event, LPCWSTR arg )
+static UINT msi_dialog_set_property_event( msi_dialog *dialog, LPCWSTR event, LPCWSTR arg )
{
static const WCHAR szNullArg[] = { '{','}',0 };
LPWSTR p, prop, arg_fmt = NULL;
@@ -3228,7 +3418,7 @@ static UINT msi_dialog_set_property( msi_dialog *dialog, LPCWSTR event, LPCWSTR
*p = 0;
if( strcmpW( szNullArg, arg ) )
deformat_string( dialog->package, arg, &arg_fmt );
- MSI_SetPropertyW( dialog->package, prop, arg_fmt );
+ msi_dialog_set_property( dialog->package, prop, arg_fmt );
msi_dialog_update_controls( dialog, prop );
msi_free( arg_fmt );
}
@@ -3251,7 +3441,7 @@ static UINT msi_dialog_control_event( MSIRECORD *rec, LPVOID param )
event = MSI_RecordGetString( rec, 3 );
arg = MSI_RecordGetString( rec, 4 );
if( event[0] == '[' )
- msi_dialog_set_property( dialog, event, arg );
+ msi_dialog_set_property_event( dialog, event, arg );
else
msi_dialog_send_event( dialog, event, arg );
}
@@ -3366,7 +3556,7 @@ static UINT msi_dialog_get_checkbox_state( msi_dialog *dialog,
WCHAR state[2] = { 0 };
DWORD sz = 2;
- MSI_GetPropertyW( dialog->package, control->property, state, &sz );
+ msi_get_property( dialog->package->db, control->property, state, &sz );
return state[0] ? 1 : 0;
}
@@ -3379,7 +3569,7 @@ static void msi_dialog_set_checkbox_state( msi_dialog *dialog,
/* if uncheck then the property is set to NULL */
if (!state)
{
- MSI_SetPropertyW( dialog->package, control->property, NULL );
+ msi_dialog_set_property( dialog->package, control->property, NULL );
return;
}
@@ -3389,7 +3579,7 @@ static void msi_dialog_set_checkbox_state( msi_dialog *dialog,
else
val = szState;
- MSI_SetPropertyW( dialog->package, control->property, val );
+ msi_dialog_set_property( dialog->package, control->property, val );
}
static void msi_dialog_checkbox_sync_state( msi_dialog *dialog,
@@ -3433,8 +3623,7 @@ static UINT msi_dialog_edit_handler( msi_dialog *dialog,
debugstr_w(control->property));
buf = msi_get_window_text( control->hwnd );
- MSI_SetPropertyW( dialog->package, control->property, buf );
-
+ msi_dialog_set_property( dialog->package, control->property, buf );
msi_free( buf );
return ERROR_SUCCESS;
@@ -3449,7 +3638,7 @@ static UINT msi_dialog_radiogroup_handler( msi_dialog *dialog,
TRACE("clicked radio button %s, set %s\n", debugstr_w(control->name),
debugstr_w(control->property));
- MSI_SetPropertyW( dialog->package, control->property, control->name );
+ msi_dialog_set_property( dialog->package, control->property, control->name );
return msi_dialog_button_handler( dialog, control, param );
}
@@ -3835,7 +4024,7 @@ static UINT error_dialog_handler(MSIPACKAGE *package, LPCWSTR event,
if ( !lstrcmpW( argument, error_abort ) || !lstrcmpW( argument, error_cancel ) ||
!lstrcmpW( argument, error_no ) )
{
- MSI_SetPropertyW( package, result_prop, error_abort );
+ msi_set_property( package->db, result_prop, error_abort );
}
ControlEvent_CleanupSubscriptions(package);
@@ -3878,12 +4067,12 @@ UINT msi_spawn_error_dialog( MSIPACKAGE *package, LPWSTR error_dialog, LPWSTR er
'M','S','I','E','r','r','o','r','D','i','a','l','o','g','R','e','s','u','l','t',0
};
- if ( (msi_get_property_int(package, szUILevel, 0) & INSTALLUILEVEL_MASK) == INSTALLUILEVEL_NONE )
+ if ( (msi_get_property_int( package->db, szUILevel, 0 ) & INSTALLUILEVEL_MASK) == INSTALLUILEVEL_NONE )
return ERROR_SUCCESS;
if ( !error_dialog )
{
- LPWSTR product_name = msi_dup_property( package, pn_prop );
+ LPWSTR product_name = msi_dup_property( package->db, pn_prop );
WCHAR title[MAX_PATH];
sprintfW( title, title_fmt, product_name );
@@ -3911,7 +4100,7 @@ UINT msi_spawn_error_dialog( MSIPACKAGE *package, LPWSTR error_dialog, LPWSTR er
if ( r != ERROR_SUCCESS )
goto done;
- r = MSI_GetPropertyW( package, result_prop, result, &size );
+ r = msi_get_property( package->db, result_prop, result, &size );
if ( r != ERROR_SUCCESS)
r = ERROR_SUCCESS;
diff --git a/dll/win32/msi/events.c b/dll/win32/msi/events.c
index e8f22975594..4ed395bbc59 100644
--- a/dll/win32/msi/events.c
+++ b/dll/win32/msi/events.c
@@ -226,7 +226,7 @@ static UINT ControlEvent_AddSource(MSIPACKAGE* package, LPCWSTR argument,
static UINT ControlEvent_SetTargetPath(MSIPACKAGE* package, LPCWSTR argument,
msi_dialog* dialog)
{
- LPWSTR path = msi_dup_property( package, argument );
+ LPWSTR path = msi_dup_property( package->db, argument );
MSIRECORD *rec = MSI_CreateRecord( 1 );
UINT r;
@@ -380,7 +380,13 @@ static UINT ControlEvent_DirectoryListUp(MSIPACKAGE *package, LPCWSTR argument,
static UINT ControlEvent_ReinstallMode(MSIPACKAGE *package, LPCWSTR argument,
msi_dialog *dialog)
{
- return MSI_SetPropertyW( package, szReinstallMode, argument );
+ return msi_set_property( package->db, szReinstallMode, argument );
+}
+
+static UINT ControlEvent_Reinstall( MSIPACKAGE *package, LPCWSTR argument,
+ msi_dialog *dialog )
+{
+ return msi_set_property( package->db, szReinstall, argument );
}
static UINT ControlEvent_ValidateProductID(MSIPACKAGE *package, LPCWSTR argument,
@@ -389,13 +395,13 @@ static UINT ControlEvent_ValidateProductID(MSIPACKAGE *package, LPCWSTR argument
LPWSTR key, template;
UINT ret = ERROR_SUCCESS;
- template = msi_dup_property( package, szPIDTemplate );
- key = msi_dup_property( package, szPIDKEY );
+ template = msi_dup_property( package->db, szPIDTemplate );
+ key = msi_dup_property( package->db, szPIDKEY );
if (key && template)
{
FIXME( "partial stub: template %s key %s\n", debugstr_w(template), debugstr_w(key) );
- ret = MSI_SetPropertyW( package, szProductID, key );
+ ret = msi_set_property( package->db, szProductID, key );
}
msi_free( template );
msi_free( key );
@@ -417,6 +423,7 @@ static const struct _events Events[] = {
{ "DirectoryListUp",ControlEvent_DirectoryListUp },
{ "SelectionBrowse",ControlEvent_SpawnDialog },
{ "ReinstallMode",ControlEvent_ReinstallMode },
+ { "Reinstall",ControlEvent_Reinstall },
{ "ValidateProductID",ControlEvent_ValidateProductID },
{ NULL,NULL },
};
diff --git a/dll/win32/msi/files.c b/dll/win32/msi/files.c
index 40501636af2..052a1588e2e 100644
--- a/dll/win32/msi/files.c
+++ b/dll/win32/msi/files.c
@@ -98,6 +98,8 @@ static void schedule_install_files(MSIPACKAGE *package)
ui_progress(package,2,file->FileSize,0,0);
file->state = msifs_skipped;
}
+ else
+ file->Component->Action = INSTALLSTATE_LOCAL;
}
}
@@ -119,8 +121,7 @@ static UINT copy_install_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR source)
{
UINT gle;
- TRACE("Copying %s to %s\n", debugstr_w(source),
- debugstr_w(file->TargetPath));
+ TRACE("Copying %s to %s\n", debugstr_w(source), debugstr_w(file->TargetPath));
gle = copy_file(file, source);
if (gle == ERROR_SUCCESS)
@@ -147,7 +148,7 @@ static UINT copy_install_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR source)
GetTempFileNameW(szBackSlash, szMsi, 0, tmpfileW);
len = strlenW(file->TargetPath) + strlenW(tmpfileW) + 1;
- if (!(pathW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR))))
+ if (!(pathW = msi_alloc(len * sizeof(WCHAR))))
return ERROR_OUTOFMEMORY;
strcpyW(pathW, file->TargetPath);
@@ -167,32 +168,17 @@ static UINT copy_install_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR source)
gle = GetLastError();
WARN("failed to schedule rename operation: %d)\n", gle);
}
- HeapFree(GetProcessHeap(), 0, pathW);
+ msi_free(pathW);
}
return gle;
}
-static BOOL check_dest_hash_matches(MSIFILE *file)
-{
- MSIFILEHASHINFO hash;
- UINT r;
-
- if (!file->hash.dwFileHashInfoSize)
- return FALSE;
-
- hash.dwFileHashInfoSize = sizeof(MSIFILEHASHINFO);
- r = MsiGetFileHashW(file->TargetPath, 0, &hash);
- if (r != ERROR_SUCCESS)
- return FALSE;
-
- return !memcmp(&hash, &file->hash, sizeof(MSIFILEHASHINFO));
-}
-
static BOOL installfiles_cb(MSIPACKAGE *package, LPCWSTR file, DWORD action,
LPWSTR *path, DWORD *attrs, PVOID user)
{
static MSIFILE *f = NULL;
+ MSIMEDIAINFO *mi = user;
if (action == MSICABEXTRACT_BEGINEXTRACT)
{
@@ -203,11 +189,8 @@ static BOOL installfiles_cb(MSIPACKAGE *package, LPCWSTR file, DWORD action,
return FALSE;
}
- if (f->state != msifs_missing && f->state != msifs_overwrite)
- {
- TRACE("Skipping extraction of %s\n", debugstr_w(file));
+ if (f->disk_id != mi->disk_id || (f->state != msifs_missing && f->state != msifs_overwrite))
return FALSE;
- }
msi_file_update_ui(package, f, szInstallFiles);
@@ -256,19 +239,6 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
if (file->state != msifs_missing && !mi->is_continuous && file->state != msifs_overwrite)
continue;
- if (check_dest_hash_matches(file))
- {
- TRACE("File hashes match, not overwriting\n");
- continue;
- }
-
- if (MsiGetFileVersionW(file->TargetPath, NULL, NULL, NULL, NULL) == ERROR_SUCCESS &&
- msi_compare_file_version(file) >= 0)
- {
- TRACE("Destination file version greater, not overwriting\n");
- continue;
- }
-
if (file->Sequence > mi->last_sequence || mi->is_continuous ||
(file->IsCompressed && !mi->is_extracted))
{
@@ -277,20 +247,20 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
rc = ready_media(package, file, mi);
if (rc != ERROR_SUCCESS)
{
- ERR("Failed to ready media\n");
+ ERR("Failed to ready media for %s\n", debugstr_w(file->File));
break;
}
data.mi = mi;
data.package = package;
data.cb = installfiles_cb;
- data.user = NULL;
+ data.user = mi;
if (file->IsCompressed &&
!msi_cabextract(package, mi, &data))
{
ERR("Failed to extract cabinet: %s\n", debugstr_w(mi->cabinet));
- rc = ERROR_FUNCTION_FAILED;
+ rc = ERROR_INSTALL_FAILURE;
break;
}
}
@@ -317,8 +287,7 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
}
else if (file->state != msifs_installed)
{
- ERR("compressed file wasn't extracted (%s)\n",
- debugstr_w(file->TargetPath));
+ ERR("compressed file wasn't installed (%s)\n", debugstr_w(file->TargetPath));
rc = ERROR_INSTALL_FAILURE;
break;
}
@@ -555,11 +524,11 @@ static UINT ITERATE_MoveFiles( MSIRECORD *rec, LPVOID param )
sourcename = MSI_RecordGetString(rec, 3);
options = MSI_RecordGetInteger(rec, 7);
- sourcedir = msi_dup_property(package, MSI_RecordGetString(rec, 5));
+ sourcedir = msi_dup_property(package->db, MSI_RecordGetString(rec, 5));
if (!sourcedir)
goto done;
- destdir = msi_dup_property(package, MSI_RecordGetString(rec, 6));
+ destdir = msi_dup_property(package->db, MSI_RecordGetString(rec, 6));
if (!destdir)
goto done;
@@ -704,7 +673,7 @@ static WCHAR *get_duplicate_filename( MSIPACKAGE *package, MSIRECORD *row, const
if (!dst_path)
{
/* try a property */
- dst_path = msi_dup_property( package, dst_key );
+ dst_path = msi_dup_property( package->db, dst_key );
if (!dst_path)
{
FIXME("Unable to get destination folder, try AppSearch properties\n");
@@ -917,7 +886,7 @@ static UINT ITERATE_RemoveFiles(MSIRECORD *row, LPVOID param)
UINT install_mode;
LPWSTR dir = NULL, path = NULL;
DWORD size;
- UINT r;
+ UINT ret = ERROR_SUCCESS;
component = MSI_RecordGetString(row, 2);
filename = MSI_RecordGetString(row, 3);
@@ -938,7 +907,7 @@ static UINT ITERATE_RemoveFiles(MSIRECORD *row, LPVOID param)
return ERROR_SUCCESS;
}
- dir = msi_dup_property(package, dirprop);
+ dir = msi_dup_property(package->db, dirprop);
if (!dir)
return ERROR_OUTOFMEMORY;
@@ -947,7 +916,7 @@ static UINT ITERATE_RemoveFiles(MSIRECORD *row, LPVOID param)
path = msi_alloc(size * sizeof(WCHAR));
if (!path)
{
- r = ERROR_OUTOFMEMORY;
+ ret = ERROR_OUTOFMEMORY;
goto done;
}
@@ -975,7 +944,7 @@ done:
msi_free(path);
msi_free(dir);
- return ERROR_SUCCESS;
+ return ret;
}
UINT ACTION_RemoveFiles( MSIPACKAGE *package )
diff --git a/dll/win32/msi/font.c b/dll/win32/msi/font.c
index 1b2c3c729dd..1d99a4c0d3a 100644
--- a/dll/win32/msi/font.c
+++ b/dll/win32/msi/font.c
@@ -64,11 +64,6 @@ typedef struct _tagTT_NAME_RECORD {
#define SWAPWORD(x) MAKEWORD(HIBYTE(x), LOBYTE(x))
#define SWAPLONG(x) MAKELONG(SWAPWORD(HIWORD(x)), SWAPWORD(LOWORD(x)))
-static const WCHAR szRegisterFonts[] =
- {'R','e','g','i','s','t','e','r','F','o','n','t','s',0};
-static const WCHAR szUnregisterFonts[] =
- {'U','n','r','e','g','i','s','t','e','r','F','o','n','t','s',0};
-
static const WCHAR regfont1[] =
{'S','o','f','t','w','a','r','e','\\',
'M','i','c','r','o','s','o','f','t','\\',
diff --git a/dll/win32/msi/format.c b/dll/win32/msi/format.c
index f59024abf86..c4ff30f4111 100644
--- a/dll/win32/msi/format.c
+++ b/dll/win32/msi/format.c
@@ -175,7 +175,7 @@ static LPWSTR deformat_property(FORMAT *format, FORMSTR *str)
val = msi_alloc((str->len + 1) * sizeof(WCHAR));
lstrcpynW(val, get_formstr_data(format, str), str->len + 1);
- ret = msi_dup_property(format->package, val);
+ ret = msi_dup_property(format->package->db, val);
msi_free(val);
return ret;
@@ -805,12 +805,12 @@ static DWORD deformat_string_internal(MSIPACKAGE *package, LPCWSTR ptr,
format.deformatted = *data;
format.len = *len;
- stack = create_stack();
- temp = create_stack();
-
if (!verify_format(*data))
return ERROR_SUCCESS;
+ stack = create_stack();
+ temp = create_stack();
+
while ((type = format_lex(&format, &str)) != FORMAT_NULL)
{
if (type == FORMAT_LBRACK || type == FORMAT_LBRACE ||
diff --git a/dll/win32/msi/helpers.c b/dll/win32/msi/helpers.c
index c45ba236d50..54d21994a6d 100644
--- a/dll/win32/msi/helpers.c
+++ b/dll/win32/msi/helpers.c
@@ -47,7 +47,7 @@ LPWSTR build_icon_path(MSIPACKAGE *package, LPCWSTR icon_name )
static const WCHAR szFolder[] =
{'A','p','p','D','a','t','a','F','o','l','d','e','r',0};
- SystemFolder = msi_dup_property( package, szFolder );
+ SystemFolder = msi_dup_property( package->db, szFolder );
dest = build_directory_name(3, SystemFolder, szInstaller, package->ProductCode);
@@ -160,11 +160,11 @@ static LPWSTR get_source_root( MSIPACKAGE *package )
{
LPWSTR path, p;
- path = msi_dup_property( package, cszSourceDir );
+ path = msi_dup_property( package->db, cszSourceDir );
if (path)
return path;
- path = msi_dup_property( package, cszDatabase );
+ path = msi_dup_property( package->db, cszDatabase );
if (path)
{
p = strrchrW(path,'\\');
@@ -265,19 +265,19 @@ LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
if (!f->ResolvedTarget && !f->Property)
{
LPWSTR check_path;
- check_path = msi_dup_property( package, cszTargetDir );
+ check_path = msi_dup_property( package->db, cszTargetDir );
if (!check_path)
{
- check_path = msi_dup_property( package, cszRootDrive );
+ check_path = msi_dup_property( package->db, cszRootDrive );
if (set_prop)
- MSI_SetPropertyW(package,cszTargetDir,check_path);
+ msi_set_property( package->db, cszTargetDir, check_path );
}
/* correct misbuilt target dir */
path = build_directory_name(2, check_path, NULL);
clean_spaces_from_path( path );
if (strcmpiW(path,check_path)!=0)
- MSI_SetPropertyW(package,cszTargetDir,path);
+ msi_set_property( package->db, cszTargetDir, path );
msi_free(check_path);
f->ResolvedTarget = path;
@@ -310,11 +310,11 @@ LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
TRACE(" internally set to %s\n",debugstr_w(path));
if (set_prop)
- MSI_SetPropertyW( package, name, path );
+ msi_set_property( package->db, name, path );
return path;
}
- if (!source && load_prop && (path = msi_dup_property( package, name )))
+ if (!source && load_prop && (path = msi_dup_property( package->db, name )))
{
f->ResolvedTarget = strdupW( path );
TRACE(" property set to %s\n", debugstr_w(path));
@@ -338,7 +338,7 @@ LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
f->ResolvedTarget = strdupW( path );
TRACE("target -> %s\n", debugstr_w(path));
if (set_prop)
- MSI_SetPropertyW(package,name,path);
+ msi_set_property( package->db, name, path );
}
else
{
diff --git a/dll/win32/msi/install.c b/dll/win32/msi/install.c
index c23075d61d3..fda49b90d8d 100644
--- a/dll/win32/msi/install.c
+++ b/dll/win32/msi/install.c
@@ -709,7 +709,7 @@ BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode)
break;
case MSIRUNMODE_MAINTENANCE:
- r = msi_get_property_int( package, szInstalled, 0 ) != 0;
+ r = msi_get_property_int( package->db, szInstalled, 0 ) != 0;
break;
case MSIRUNMODE_REBOOTATEND:
@@ -721,6 +721,7 @@ BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode)
r = TRUE;
}
+ msiobj_release( &package->hdr );
return r;
}
@@ -774,6 +775,7 @@ UINT WINAPI MsiSetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode, BOOL fState)
r = ERROR_ACCESS_DENIED;
}
+ msiobj_release( &package->hdr );
return r;
}
@@ -1262,7 +1264,7 @@ LANGID WINAPI MsiGetLanguage(MSIHANDLE hInstall)
return 0;
}
- langid = msi_get_property_int( package, szProductLanguage, 0 );
+ langid = msi_get_property_int( package->db, szProductLanguage, 0 );
msiobj_release( &package->hdr );
return langid;
}
@@ -1284,7 +1286,7 @@ UINT MSI_SetInstallLevel( MSIPACKAGE *package, int iInstallLevel )
return MSI_SetFeatureStates( package );
sprintfW( level, fmt, iInstallLevel );
- r = MSI_SetPropertyW( package, szInstallLevel, level );
+ r = msi_set_property( package->db, szInstallLevel, level );
if ( r == ERROR_SUCCESS )
r = MSI_SetFeatureStates( package );
diff --git a/dll/win32/msi/media.c b/dll/win32/msi/media.c
index 0a6c4314fbc..49bc199cc36 100644
--- a/dll/win32/msi/media.c
+++ b/dll/win32/msi/media.c
@@ -20,6 +20,8 @@
#include
+#define COBJMACROS
+
#include "windef.h"
#include "winerror.h"
#include "wine/debug.h"
@@ -28,6 +30,7 @@
#include "winuser.h"
#include "winreg.h"
#include "shlwapi.h"
+#include "objidl.h"
#include "wine/unicode.h"
WINE_DEFAULT_DEBUG_CHANNEL(msi);
@@ -76,13 +79,13 @@ static UINT msi_change_media(MSIPACKAGE *package, MSIMEDIAINFO *mi)
static const WCHAR error_prop[] = {'E','r','r','o','r','D','i','a','l','o','g',0};
- if ((msi_get_property_int(package, szUILevel, 0) & INSTALLUILEVEL_MASK) ==
+ if ((msi_get_property_int(package->db, szUILevel, 0) & INSTALLUILEVEL_MASK) ==
INSTALLUILEVEL_NONE && !gUIHandlerA && !gUIHandlerW && !gUIHandlerRecord)
return ERROR_SUCCESS;
error = generate_error_string(package, 1302, 1, mi->disk_prompt);
- error_dialog = msi_dup_property(package, error_prop);
- source_dir = msi_dup_property(package, cszSourceDir);
+ error_dialog = msi_dup_property(package->db, error_prop);
+ source_dir = msi_dup_property(package->db, cszSourceDir);
while (r == ERROR_SUCCESS && !source_matches_volume(mi, source_dir))
{
@@ -114,49 +117,6 @@ static UINT msi_change_media(MSIPACKAGE *package, MSIMEDIAINFO *mi)
return r;
}
-static UINT writeout_cabinet_stream(MSIPACKAGE *package, LPCWSTR stream,
- WCHAR* source)
-{
- UINT rc;
- USHORT* data;
- UINT size;
- DWORD write;
- HANDLE hfile;
- WCHAR tmp[MAX_PATH];
-
- static const WCHAR cszTempFolder[]= {
- 'T','e','m','p','F','o','l','d','e','r',0};
-
- rc = read_raw_stream_data(package->db, stream, &data, &size);
- if (rc != ERROR_SUCCESS)
- return rc;
-
- write = MAX_PATH;
- if (MSI_GetPropertyW(package, cszTempFolder, tmp, &write))
- GetTempPathW(MAX_PATH, tmp);
-
- GetTempFileNameW(tmp, stream, 0, source);
-
- track_tempfile(package, source);
- hfile = CreateFileW(source, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
- FILE_ATTRIBUTE_NORMAL, NULL);
-
- if (hfile == INVALID_HANDLE_VALUE)
- {
- ERR("Unable to create file %s\n", debugstr_w(source));
- rc = ERROR_FUNCTION_FAILED;
- goto end;
- }
-
- WriteFile(hfile, data, size, &write, NULL);
- CloseHandle(hfile);
- TRACE("wrote %i bytes to %s\n", write, debugstr_w(source));
-
-end:
- msi_free(data);
- return rc;
-}
-
static void * CDECL cabinet_alloc(ULONG cb)
{
return msi_alloc(cb);
@@ -238,10 +198,72 @@ static LONG CDECL cabinet_seek(INT_PTR hf, LONG dist, int seektype)
return SetFilePointer(handle, dist, NULL, seektype);
}
+struct cab_stream
+{
+ MSIDATABASE *db;
+ WCHAR *name;
+};
+
+static struct cab_stream cab_stream;
+
+static INT_PTR CDECL cabinet_open_stream( char *pszFile, int oflag, int pmode )
+{
+ UINT r;
+ IStream *stm;
+
+ if (oflag)
+ WARN("ignoring open flags 0x%08x\n", oflag);
+
+ r = db_get_raw_stream( cab_stream.db, cab_stream.name, &stm );
+ if (r != ERROR_SUCCESS)
+ {
+ WARN("Failed to get cabinet stream %u\n", r);
+ return 0;
+ }
+
+ return (INT_PTR)stm;
+}
+
+static UINT CDECL cabinet_read_stream( INT_PTR hf, void *pv, UINT cb )
+{
+ IStream *stm = (IStream *)hf;
+ DWORD read;
+ HRESULT hr;
+
+ hr = IStream_Read( stm, pv, cb, &read );
+ if (hr == S_OK || hr == S_FALSE)
+ return read;
+
+ return 0;
+}
+
+static int CDECL cabinet_close_stream( INT_PTR hf )
+{
+ IStream *stm = (IStream *)hf;
+ IStream_Release( stm );
+ return 0;
+}
+
+static LONG CDECL cabinet_seek_stream( INT_PTR hf, LONG dist, int seektype )
+{
+ IStream *stm = (IStream *)hf;
+ LARGE_INTEGER move;
+ ULARGE_INTEGER newpos;
+ HRESULT hr;
+
+ move.QuadPart = dist;
+ hr = IStream_Seek( stm, move, seektype, &newpos );
+ if (SUCCEEDED(hr))
+ {
+ if (newpos.QuadPart <= MAXLONG) return newpos.QuadPart;
+ ERR("Too big!\n");
+ }
+ return -1;
+}
+
static UINT CDECL msi_media_get_disk_info(MSIPACKAGE *package, MSIMEDIAINFO *mi)
{
MSIRECORD *row;
- LPWSTR ptr;
static const WCHAR query[] = {
'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
@@ -262,10 +284,7 @@ static UINT CDECL msi_media_get_disk_info(MSIPACKAGE *package, MSIMEDIAINFO *mi)
if (!mi->first_volume)
mi->first_volume = strdupW(mi->volume_label);
- ptr = strrchrW(mi->source, '\\') + 1;
- lstrcpyW(ptr, mi->cabinet);
msiobj_release(&row->hdr);
-
return ERROR_SUCCESS;
}
@@ -277,12 +296,24 @@ static INT_PTR cabinet_partial_file(FDINOTIFICATIONTYPE fdint,
return 0;
}
+static WCHAR *get_cabinet_filename(MSIMEDIAINFO *mi)
+{
+ int len;
+ WCHAR *ret;
+
+ len = strlenW(mi->sourcedir) + strlenW(mi->cabinet) + 1;
+ if (!(ret = msi_alloc(len * sizeof(WCHAR)))) return NULL;
+ strcpyW(ret, mi->sourcedir);
+ strcatW(ret, mi->cabinet);
+ return ret;
+}
+
static INT_PTR cabinet_next_cabinet(FDINOTIFICATIONTYPE fdint,
PFDINOTIFICATION pfdin)
{
MSICABDATA *data = pfdin->pv;
MSIMEDIAINFO *mi = data->mi;
- LPWSTR cab = strdupAtoW(pfdin->psz1);
+ LPWSTR cabinet_file = NULL, cab = strdupAtoW(pfdin->psz1);
INT_PTR res = -1;
UINT rc;
@@ -309,10 +340,13 @@ static INT_PTR cabinet_next_cabinet(FDINOTIFICATIONTYPE fdint,
goto done;
}
- TRACE("Searching for %s\n", debugstr_w(mi->source));
+ if (!(cabinet_file = get_cabinet_filename(mi)))
+ goto done;
+
+ TRACE("Searching for %s\n", debugstr_w(cabinet_file));
res = 0;
- if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES)
+ if (GetFileAttributesW(cabinet_file) == INVALID_FILE_ATTRIBUTES)
{
if (msi_change_media(data->package, mi) != ERROR_SUCCESS)
res = -1;
@@ -320,6 +354,7 @@ static INT_PTR cabinet_next_cabinet(FDINOTIFICATIONTYPE fdint,
done:
msi_free(cab);
+ msi_free(cabinet_file);
return res;
}
@@ -376,7 +411,7 @@ static INT_PTR cabinet_copy_file(FDINOTIFICATIONTYPE fdint,
GetTempFileNameW(szBackSlash, szMsi, 0, tmpfileW);
len = strlenW(path) + strlenW(tmpfileW) + 1;
- if (!(tmppathW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR))))
+ if (!(tmppathW = msi_alloc(len * sizeof(WCHAR))))
return ERROR_OUTOFMEMORY;
strcpyW(tmppathW, path);
@@ -394,7 +429,7 @@ static INT_PTR cabinet_copy_file(FDINOTIFICATIONTYPE fdint,
else
WARN("failed to schedule rename operation %s (error %d)\n", debugstr_w(path), GetLastError());
- HeapFree(GetProcessHeap(), 0, tmppathW);
+ msi_free(tmppathW);
}
else
WARN("failed to create %s (error %d)\n", debugstr_w(path), err);
@@ -436,8 +471,6 @@ static INT_PTR cabinet_close_file_info(FDINOTIFICATIONTYPE fdint,
static INT_PTR CDECL cabinet_notify(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin)
{
- TRACE("(%d)\n", fdint);
-
switch (fdint)
{
case fdintPARTIAL_FILE:
@@ -457,48 +490,58 @@ static INT_PTR CDECL cabinet_notify(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION
}
}
-/***********************************************************************
- * msi_cabextract
- *
- * Extract files from a cab file.
- */
-BOOL msi_cabextract(MSIPACKAGE* package, MSIMEDIAINFO *mi, LPVOID data)
+static INT_PTR CDECL cabinet_notify_stream( FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin )
+{
+ switch (fdint)
+ {
+ case fdintCOPY_FILE:
+ return cabinet_copy_file( fdint, pfdin );
+
+ case fdintCLOSE_FILE_INFO:
+ return cabinet_close_file_info( fdint, pfdin );
+
+ case fdintCABINET_INFO:
+ return 0;
+
+ default:
+ ERR("Unexpected notification %d\n", fdint);
+ return 0;
+ }
+}
+
+static BOOL extract_cabinet( MSIPACKAGE* package, MSIMEDIAINFO *mi, LPVOID data )
{
LPSTR cabinet, cab_path = NULL;
- LPWSTR ptr;
HFDI hfdi;
ERF erf;
BOOL ret = FALSE;
- TRACE("Extracting %s\n", debugstr_w(mi->source));
+ TRACE("Extracting %s\n", debugstr_w(mi->cabinet));
- hfdi = FDICreate(cabinet_alloc, cabinet_free, cabinet_open, cabinet_read,
- cabinet_write, cabinet_close, cabinet_seek, 0, &erf);
+ hfdi = FDICreate( cabinet_alloc, cabinet_free, cabinet_open, cabinet_read,
+ cabinet_write, cabinet_close, cabinet_seek, 0, &erf );
if (!hfdi)
{
ERR("FDICreate failed\n");
return FALSE;
}
- ptr = strrchrW(mi->source, '\\') + 1;
- cabinet = strdupWtoA(ptr);
+ cabinet = strdupWtoA( mi->cabinet );
if (!cabinet)
goto done;
- cab_path = strdupWtoA(mi->source);
+ cab_path = strdupWtoA( mi->sourcedir );
if (!cab_path)
goto done;
- cab_path[ptr - mi->source] = '\0';
-
- ret = FDICopy(hfdi, cabinet, cab_path, 0, cabinet_notify, NULL, data);
+ ret = FDICopy( hfdi, cabinet, cab_path, 0, cabinet_notify, NULL, data );
if (!ret)
ERR("FDICopy failed\n");
done:
- FDIDestroy(hfdi);
- msi_free(cabinet);
- msi_free(cab_path);
+ FDIDestroy( hfdi );
+ msi_free(cabinet );
+ msi_free( cab_path );
if (ret)
mi->is_extracted = TRUE;
@@ -506,6 +549,56 @@ done:
return ret;
}
+static BOOL extract_cabinet_stream( MSIPACKAGE *package, MSIMEDIAINFO *mi, LPVOID data )
+{
+ static char filename[] = {'<','S','T','R','E','A','M','>',0};
+ HFDI hfdi;
+ ERF erf;
+ BOOL ret = FALSE;
+
+ TRACE("Extracting %s\n", debugstr_w(mi->cabinet));
+
+ hfdi = FDICreate( cabinet_alloc, cabinet_free, cabinet_open_stream, cabinet_read_stream,
+ cabinet_write, cabinet_close_stream, cabinet_seek_stream, 0, &erf );
+ if (!hfdi)
+ {
+ ERR("FDICreate failed\n");
+ return FALSE;
+ }
+
+ cab_stream.db = package->db;
+ cab_stream.name = encode_streamname( FALSE, mi->cabinet + 1 );
+ if (!cab_stream.name)
+ goto done;
+
+ ret = FDICopy( hfdi, filename, NULL, 0, cabinet_notify_stream, NULL, data );
+ if (!ret)
+ ERR("FDICopy failed\n");
+
+done:
+ FDIDestroy( hfdi );
+ msi_free( cab_stream.name );
+
+ if (ret)
+ mi->is_extracted = TRUE;
+
+ return ret;
+}
+
+/***********************************************************************
+ * msi_cabextract
+ *
+ * Extract files from a cabinet file or stream.
+ */
+BOOL msi_cabextract(MSIPACKAGE* package, MSIMEDIAINFO *mi, LPVOID data)
+{
+ if (mi->cabinet[0] == '#')
+ {
+ return extract_cabinet_stream( package, mi, data );
+ }
+ return extract_cabinet( package, mi, data );
+}
+
void msi_free_media_info(MSIMEDIAINFO *mi)
{
msi_free(mi->disk_prompt);
@@ -532,7 +625,6 @@ static UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO
LPWSTR source_dir;
LPWSTR source;
DWORD options;
- UINT r;
static const WCHAR query[] = {
'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
@@ -563,25 +655,10 @@ static UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO
if (!mi->first_volume)
mi->first_volume = strdupW(mi->volume_label);
- source_dir = msi_dup_property(package, cszSourceDir);
- lstrcpyW(mi->source, source_dir);
+ source_dir = msi_dup_property(package->db, cszSourceDir);
+ lstrcpyW(mi->sourcedir, source_dir);
mi->type = get_drive_type(source_dir);
- if (file->IsCompressed && mi->cabinet)
- {
- if (mi->cabinet[0] == '#')
- {
- r = writeout_cabinet_stream(package, &mi->cabinet[1], mi->source);
- if (r != ERROR_SUCCESS)
- {
- ERR("Failed to extract cabinet stream\n");
- return ERROR_FUNCTION_FAILED;
- }
- }
- else
- lstrcatW(mi->source, mi->cabinet);
- }
-
options = MSICODE_PRODUCT;
if (mi->type == DRIVE_CDROM || mi->type == DRIVE_REMOVABLE)
{
@@ -595,7 +672,7 @@ static UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO
}
else
{
- source = mi->source;
+ source = mi->sourcedir;
options |= MSISOURCETYPE_NETWORK;
}
@@ -610,7 +687,7 @@ static UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO
return ERROR_SUCCESS;
}
-/* FIXME: search NETWORK and URL sources as well */
+/* FIXME: search URL sources as well */
static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
{
WCHAR source[MAX_PATH];
@@ -618,8 +695,16 @@ static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
WCHAR prompt[MAX_PATH];
DWORD volumesz, promptsz;
DWORD index, size, id;
+ WCHAR last_type[2];
UINT r;
+ size = 2;
+ r = MsiSourceListGetInfoW(package->ProductCode, NULL,
+ package->Context, MSICODE_PRODUCT,
+ INSTALLPROPERTY_LASTUSEDTYPEW, last_type, &size);
+ if (r != ERROR_SUCCESS)
+ return r;
+
size = MAX_PATH;
r = MsiSourceListGetInfoW(package->ProductCode, NULL,
package->Context, MSICODE_PRODUCT,
@@ -627,6 +712,26 @@ static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
if (r != ERROR_SUCCESS)
return r;
+ index = 0;
+ volumesz = MAX_PATH;
+ promptsz = MAX_PATH;
+
+ if (last_type[0] == 'n')
+ {
+ while (MsiSourceListEnumSourcesW(package->ProductCode, NULL,
+ package->Context,
+ MSISOURCETYPE_NETWORK, index++,
+ volume, &volumesz) == ERROR_SUCCESS)
+ {
+ if (!strncmpiW(source, volume, strlenW(source)))
+ {
+ lstrcpyW(mi->sourcedir, source);
+ TRACE("Found network source %s\n", debugstr_w(mi->sourcedir));
+ return ERROR_SUCCESS;
+ }
+ }
+ }
+
index = 0;
volumesz = MAX_PATH;
promptsz = MAX_PATH;
@@ -644,7 +749,8 @@ static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
if (source_matches_volume(mi, source))
{
/* FIXME: what about SourceDir */
- lstrcpyW(mi->source, source);
+ lstrcpyW(mi->sourcedir, source);
+ TRACE("Found disk source %s\n", debugstr_w(mi->sourcedir));
return ERROR_SUCCESS;
}
}
@@ -655,6 +761,7 @@ static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
UINT ready_media(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi)
{
UINT rc = ERROR_SUCCESS;
+ WCHAR *cabinet_file;
/* media info for continuous cabinet is already loaded */
if (mi->is_continuous)
@@ -663,7 +770,7 @@ UINT ready_media(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi)
rc = msi_load_media_info(package, file, mi);
if (rc != ERROR_SUCCESS)
{
- ERR("Unable to load media info\n");
+ ERR("Unable to load media info %u\n", rc);
return ERROR_FUNCTION_FAILED;
}
@@ -671,15 +778,24 @@ UINT ready_media(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi)
if (!mi->cabinet || mi->cabinet[0] == '#')
return ERROR_SUCCESS;
+ cabinet_file = get_cabinet_filename(mi);
+
/* package should be downloaded */
if (file->IsCompressed &&
- GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES &&
+ GetFileAttributesW(cabinet_file) == INVALID_FILE_ATTRIBUTES &&
package->BaseURL && UrlIsW(package->BaseURL, URLIS_URL))
{
- WCHAR temppath[MAX_PATH];
+ WCHAR temppath[MAX_PATH], *p;
- msi_download_file(mi->source, temppath);
- lstrcpyW(mi->source, temppath);
+ msi_download_file(cabinet_file, temppath);
+ if ((p = strrchrW(temppath, '\\'))) *p = 0;
+
+ msi_free(mi->sourcedir);
+ strcpyW(mi->sourcedir, temppath);
+ msi_free(mi->cabinet);
+ strcpyW(mi->cabinet, p + 1);
+
+ msi_free(cabinet_file);
return ERROR_SUCCESS;
}
@@ -687,7 +803,7 @@ UINT ready_media(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi)
if (mi->volume_label && mi->disk_id > 1 &&
lstrcmpW(mi->first_volume, mi->volume_label))
{
- LPWSTR source = msi_dup_property(package, cszSourceDir);
+ LPWSTR source = msi_dup_property(package->db, cszSourceDir);
BOOL matches;
matches = source_matches_volume(mi, source);
@@ -697,20 +813,25 @@ UINT ready_media(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi)
{
rc = msi_change_media(package, mi);
if (rc != ERROR_SUCCESS)
+ {
+ msi_free(cabinet_file);
return rc;
+ }
}
}
if (file->IsCompressed &&
- GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES)
+ GetFileAttributesW(cabinet_file) == INVALID_FILE_ATTRIBUTES)
{
rc = find_published_source(package, mi);
if (rc != ERROR_SUCCESS)
{
- ERR("Cabinet not found: %s\n", debugstr_w(mi->source));
+ ERR("Cabinet not found: %s\n", debugstr_w(cabinet_file));
+ msi_free(cabinet_file);
return ERROR_INSTALL_FAILURE;
}
}
+ msi_free(cabinet_file);
return ERROR_SUCCESS;
}
diff --git a/dll/win32/msi/msi.c b/dll/win32/msi/msi.c
index 07356405718..9d8a88a48fe 100644
--- a/dll/win32/msi/msi.c
+++ b/dll/win32/msi/msi.c
@@ -305,9 +305,8 @@ static UINT MSI_ApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szProductCode, LPCWS
UINT r = ERROR_SUCCESS, type;
DWORD size = 0;
LPCWSTR cmd_ptr = szCommandLine;
- LPCWSTR product_code = szProductCode;
- LPWSTR beg, end;
- LPWSTR cmd = NULL, codes = NULL;
+ LPWSTR beg, end, cmd = NULL, codes = NULL;
+ BOOL succeeded = FALSE;
static const WCHAR patcheq[] = {'P','A','T','C','H','=',0};
static WCHAR empty[] = {0};
@@ -342,8 +341,6 @@ static UINT MSI_ApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szProductCode, LPCWS
r = MsiSummaryInfoGetPropertyW(info, PID_TEMPLATE, &type, NULL, NULL, codes, &size);
if (r != ERROR_SUCCESS)
goto done;
-
- product_code = codes;
}
if (!szCommandLine)
@@ -362,16 +359,25 @@ static UINT MSI_ApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szProductCode, LPCWS
lstrcatW(cmd, patcheq);
lstrcatW(cmd, szPatchPackage);
- beg = codes;
- while ((end = strchrW(beg, '}')))
+ if (szProductCode)
+ r = MsiConfigureProductExW(szProductCode, INSTALLLEVEL_DEFAULT, INSTALLSTATE_DEFAULT, cmd);
+ else
{
- *(end + 1) = '\0';
+ beg = codes;
+ while ((end = strchrW(beg, '}')))
+ {
+ *(end + 1) = '\0';
+ r = MsiConfigureProductExW(beg, INSTALLLEVEL_DEFAULT, INSTALLSTATE_DEFAULT, cmd);
+ if (r == ERROR_SUCCESS)
+ {
+ TRACE("patch applied\n");
+ succeeded = TRUE;
+ }
+ beg = end + 2;
+ }
- r = MsiConfigureProductExW(beg, INSTALLLEVEL_DEFAULT, INSTALLSTATE_DEFAULT, cmd);
- if (r != ERROR_SUCCESS)
- goto done;
-
- beg = end + 2;
+ if (succeeded)
+ r = ERROR_SUCCESS;
}
done:
@@ -480,10 +486,43 @@ UINT WINAPI MsiApplyMultiplePatchesW(LPCWSTR szPatchPackages,
UINT WINAPI MsiDetermineApplicablePatchesA(LPCSTR szProductPackagePath,
DWORD cPatchInfo, PMSIPATCHSEQUENCEINFOA pPatchInfo)
{
- FIXME("(%s, %d, %p): stub!\n", debugstr_a(szProductPackagePath),
- cPatchInfo, pPatchInfo);
+ UINT i, r;
+ WCHAR *package_path = NULL;
+ MSIPATCHSEQUENCEINFOW *psi;
- return ERROR_CALL_NOT_IMPLEMENTED;
+ TRACE("(%s, %d, %p)\n", debugstr_a(szProductPackagePath), cPatchInfo, pPatchInfo);
+
+ if (szProductPackagePath && !(package_path = strdupAtoW( szProductPackagePath )))
+ return ERROR_OUTOFMEMORY;
+
+ psi = msi_alloc( cPatchInfo * sizeof(*psi) );
+ if (!psi)
+ {
+ msi_free( package_path );
+ return ERROR_OUTOFMEMORY;
+ }
+
+ for (i = 0; i < cPatchInfo; i++)
+ {
+ psi[i].szPatchData = strdupAtoW( pPatchInfo[i].szPatchData );
+ psi[i].ePatchDataType = pPatchInfo[i].ePatchDataType;
+ }
+
+ r = MsiDetermineApplicablePatchesW( package_path, cPatchInfo, psi );
+ if (r == ERROR_SUCCESS)
+ {
+ for (i = 0; i < cPatchInfo; i++)
+ {
+ pPatchInfo[i].dwOrder = psi[i].dwOrder;
+ pPatchInfo[i].uStatus = psi[i].uStatus;
+ }
+ }
+
+ msi_free( package_path );
+ for (i = 0; i < cPatchInfo; i++)
+ msi_free( (WCHAR *)psi[i].szPatchData );
+ msi_free( psi );
+ return r;
}
static UINT MSI_ApplicablePatchW( MSIPACKAGE *package, LPCWSTR patch )
@@ -502,15 +541,14 @@ static UINT MSI_ApplicablePatchW( MSIPACKAGE *package, LPCWSTR patch )
si = MSI_GetSummaryInformationW( patch_db->storage, 0 );
if (!si)
{
- r = ERROR_FUNCTION_FAILED;
- goto done;
+ msiobj_release( &patch_db->hdr );
+ return ERROR_FUNCTION_FAILED;
}
r = msi_check_patch_applicable( package, si );
if (r != ERROR_SUCCESS)
TRACE("patch not applicable\n");
-done:
msiobj_release( &patch_db->hdr );
msiobj_release( &si->hdr );
return r;
@@ -596,10 +634,6 @@ static UINT msi_open_package(LPCWSTR product, MSIINSTALLCONTEXT context,
WCHAR sourcepath[MAX_PATH];
WCHAR filename[MAX_PATH];
- static const WCHAR szLocalPackage[] = {
- 'L','o','c','a','l','P','a','c','k','a','g','e',0};
-
-
r = MSIREG_OpenInstallProps(product, context, NULL, &props, FALSE);
if (r != ERROR_SUCCESS)
return ERROR_BAD_CONFIGURATION;
@@ -1181,7 +1215,7 @@ done:
static UINT msi_copy_outval(LPWSTR val, LPWSTR out, LPDWORD size)
{
- UINT r;
+ UINT r = ERROR_SUCCESS;
if (!val)
return ERROR_UNKNOWN_PROPERTY;
@@ -1201,7 +1235,7 @@ static UINT msi_copy_outval(LPWSTR val, LPWSTR out, LPDWORD size)
if (size)
*size = lstrlenW(val);
- return ERROR_SUCCESS;
+ return r;
}
UINT WINAPI MsiGetProductInfoExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
@@ -2149,6 +2183,22 @@ UINT WINAPI MsiMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uT
return MessageBoxExW(hWnd,lpText,lpCaption,uType,wLanguageId);
}
+UINT WINAPI MsiMessageBoxExA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType,
+ DWORD unknown, WORD wLanguageId, DWORD f)
+{
+ FIXME("(%p, %s, %s, %u, 0x%08x, 0x%08x, 0x%08x): semi-stub\n", hWnd, debugstr_a(lpText),
+ debugstr_a(lpCaption), uType, unknown, wLanguageId, f);
+ return MessageBoxExA(hWnd, lpText, lpCaption, uType, wLanguageId);
+}
+
+UINT WINAPI MsiMessageBoxExW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType,
+ DWORD unknown, WORD wLanguageId, DWORD f)
+{
+ FIXME("(%p, %s, %s, %u, 0x%08x, 0x%08x, 0x%08x): semi-stub\n", hWnd, debugstr_w(lpText),
+ debugstr_w(lpCaption), uType, unknown, wLanguageId, f);
+ return MessageBoxExW(hWnd, lpText, lpCaption, uType, wLanguageId);
+}
+
UINT WINAPI MsiProvideAssemblyA( LPCSTR szAssemblyName, LPCSTR szAppContext,
DWORD dwInstallMode, DWORD dwAssemblyInfo, LPSTR lpPathBuf,
LPDWORD pcchPathBuf )
@@ -2337,6 +2387,7 @@ done:
r = ERROR_SUCCESS;
}
+ msiobj_release(&package->hdr);
return r;
}
@@ -3519,10 +3570,10 @@ UINT WINAPI MsiReinstallFeatureW( LPCWSTR szProduct, LPCWSTR szFeature,
if (r != ERROR_SUCCESS)
return r;
- MSI_SetPropertyW( package, szReinstallMode, reinstallmode );
- MSI_SetPropertyW( package, szInstalled, szOne );
- MSI_SetPropertyW( package, szLogVerbose, szOne );
- MSI_SetPropertyW( package, szReinstall, szFeature );
+ msi_set_property( package->db, szReinstallMode, reinstallmode );
+ msi_set_property( package->db, szInstalled, szOne );
+ msi_set_property( package->db, szLogVerbose, szOne );
+ msi_set_property( package->db, szReinstall, szFeature );
r = MSI_InstallPackage( package, sourcepath, NULL );
diff --git a/dll/win32/msi/msi.spec b/dll/win32/msi/msi.spec
index 30daec931a6..94e3ed3cb23 100644
--- a/dll/win32/msi/msi.spec
+++ b/dll/win32/msi/msi.spec
@@ -272,8 +272,8 @@
276 stub MsiSourceListClearMediaDiskW
277 stdcall MsiDetermineApplicablePatchesA(str long ptr)
278 stdcall MsiDetermineApplicablePatchesW(wstr long ptr)
-279 stub MsiMessageBoxExA
-280 stub MsiMessageBoxExW
+279 stdcall MsiMessageBoxExA(long str str long long long long)
+280 stdcall MsiMessageBoxExW(long wstr wstr long long long long)
281 stdcall MsiSetExternalUIRecord(ptr long ptr ptr)
@ stdcall -private DllCanUnloadNow()
diff --git a/dll/win32/msi/msi_Bg.rc b/dll/win32/msi/msi_Bg.rc
index d3b8ca84abb..8aea16940f3 100644
--- a/dll/win32/msi/msi_Bg.rc
+++ b/dll/win32/msi/msi_Bg.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "ďúň˙ň %s íĺ ĺ íŕěĺđĺí"
9 "ďîńňŕâĺňĺ äčńę %s"
- 10 "íĺęîđĺęňíč ďŕđŕěĺňđč"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "âúâĺäĺňĺ ďŕďęŕňŕ, ęî˙ňî ńúäúđćŕ %s"
12 "čçňî÷íčęŕ çŕ číńňŕëŕöč˙ íŕ ôóíęöčîíŕëíîńňňŕ ëčďńâŕ"
13 "ěđĺćîâîňî óńňđîéńňâŕ íóćíî çŕ ôóíęöčîíŕëíîńňňŕ ëčďńâŕ "
diff --git a/dll/win32/msi/msi_Da.rc b/dll/win32/msi/msi_Da.rc
index beee42765ee..fa7e1c43c39 100644
--- a/dll/win32/msi/msi_Da.rc
+++ b/dll/win32/msi/msi_Da.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "Kunne ikke ĺbne den specificerede installationspakke. Kontroller stien og prřv igen."
5 "kunne ikke finden stien '%s'."
9 "indsćt disk '%s'"
- 10 "forkerte parametere."
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "angiv kataloget som indeholder '%s'."
12 "featurens installationskilde mangler."
13 "featurens netvćrksdrev mangler."
diff --git a/dll/win32/msi/msi_De.rc b/dll/win32/msi/msi_De.rc
index e0cccf07806..e07b5efd127 100644
--- a/dll/win32/msi/msi_De.rc
+++ b/dll/win32/msi/msi_De.rc
@@ -2,6 +2,7 @@
* German resources for MSI
*
* Copyright 2005 Henning Gerhardt
+ * Copyright 2010 Detlef Riekenberg
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -29,7 +30,33 @@ STRINGTABLE DISCARDABLE
4 "Das angegebene Installationspaket konnte nicht geöffnet werden. Bitte überprüfen Sie den Pfadnamen und versuchen Sie es noch einmal."
5 "Der Pfad %s wurde nicht gefunden."
9 "Bitte Disk %s einlegen."
- 10 "Falsche Parameter"
+ 10 "Windows Installer %s\n\n" \
+ "Benutzung:\n" \
+ "msiexec Befehl {Parameter} [Zusätzliche Parammeter]\n\n" \
+ "Produkt installieren:\n" \
+ "\t/i {Paket|Produktcode} [Eigenschaft]\n" \
+ "\t/package {Paket|Produktcode} [Eigenschaft]\n" \
+ "\t/a Paket [Eigenschaft]\n" \
+ "Installation reparieren:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {Paket|Produktcode}\n" \
+ "Produkt deinstallieren:\n" \
+ "\t/uninstall {Paket|Produktcode} [Eigenschaft]\n" \
+ "\t/x {Paket|Produktcode} [Eigenschaft]\n" \
+ "Produkt ankĂĽndigen:\n" \
+ "\t/j[u|m] Paket [/t Transformationspaket] [/g Sprachkennung]\n" \
+ "Patch integrieren:\n" \
+ "\t/p Patchpaket [Eigenschaft]\n" \
+ "\t/p Patchpaket /a Paket [Eigenschaft]\n" \
+ "Protokollierung und Benutzeroberfläche für die oberen Befehle anpassen:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] Protokolldatei\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "MSI Service registrieren:\n" \
+ "\t/y\n" \
+ "Registrierung des MSI Service aufheben:\n" \
+ "\t/z\n" \
+ "Hilfe anzeigen:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "Geben Sie das Verzeichnis ein, dass %s enthält."
12 "Die Installationsquelle fĂĽr das Feature fehlt."
13 "Das Netzwerklaufwerk fĂĽr das Feature fehlt."
diff --git a/dll/win32/msi/msi_En.rc b/dll/win32/msi/msi_En.rc
index 74fc5c14a85..c506e003445 100644
--- a/dll/win32/msi/msi_En.rc
+++ b/dll/win32/msi/msi_En.rc
@@ -2,6 +2,7 @@
* English resources for MSI
*
* Copyright 2005 Mike McCormack
+ * Copyright 2010 Detlef Riekenberg
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,7 +28,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "path %s not found"
9 "insert disk %s"
- 10 "bad parameters"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parameter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "enter which folder contains %s"
12 "install source for feature missing"
13 "network drive for feature missing"
diff --git a/dll/win32/msi/msi_Eo.rc b/dll/win32/msi/msi_Eo.rc
index 7579bdc65cb..8b8c8d36fbd 100644
--- a/dll/win32/msi/msi_Eo.rc
+++ b/dll/win32/msi/msi_Eo.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "Mi ne trovis la vojon %s"
9 "enţovu la diskon %s"
- 10 "nekorektaj parametroj"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "enigu la nomon de dosierujo kiu enhavas %s"
12 "instalad-fonto por mankanta taýgeco"
13 "retdrajvo por mankanta taýgeco"
diff --git a/dll/win32/msi/msi_Es.rc b/dll/win32/msi/msi_Es.rc
index 781be071802..f5425dbb654 100644
--- a/dll/win32/msi/msi_Es.rc
+++ b/dll/win32/msi/msi_Es.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "No se ha podido abrir el paquete de instalación especificado. Por favor, compruebe la ruta del archivo y vuelva a intentarlo."
5 "ruta %s no encontrada"
9 "inserte el disco %s"
- 10 "parámetros incorrectos"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "introduzca qué carpeta contiene %s"
12 "instalar fuente para característica ausente"
13 "unidad de red para característica ausente"
diff --git a/dll/win32/msi/msi_Fi.rc b/dll/win32/msi/msi_Fi.rc
index 17721aa4b01..f3d58bff2bc 100644
--- a/dll/win32/msi/msi_Fi.rc
+++ b/dll/win32/msi/msi_Fi.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "Polkua %s ei löydy."
9 "Anna levy %s"
- 10 "Virheelliset parametrit."
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "Anna kansio, joka sisältää %s"
12 "Ominaisuuden asennuslähde puuttuu."
13 "Ominaisuuden verkkolevy puuttuu."
diff --git a/dll/win32/msi/msi_Fr.rc b/dll/win32/msi/msi_Fr.rc
index f7f733803bc..6cd1fc5ca21 100644
--- a/dll/win32/msi/msi_Fr.rc
+++ b/dll/win32/msi/msi_Fr.rc
@@ -2,6 +2,7 @@
* French resources for MSI
*
* Copyright 2005 Jonathan Ernst
+ * Copyright 2009-2010 Frédéric Delanoy
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -30,7 +31,33 @@ STRINGTABLE DISCARDABLE
4 "Le paquet d'installation spécifié n'a pu être ouvert. Veuillez vérifier le chemin du fichier et réessayer."
5 "Le chemin %s est introuvable"
9 "insérez le disque %s"
- 10 "mauvais paramètres"
+ 10 "Programme d'installation Windows %s\n\n" \
+ "Usage :\n" \
+ "msiexec commande {paramètre obligatoire} [paramètre optionnel]\n\n" \
+ "Installer un produit :\n" \
+ "\t/i {paquet|code_produit} [propriété]\n" \
+ "\t/package {paquet|code_produit} [propriété]\n" \
+ "\t/a paquet [propriété]\n" \
+ "Réparer une installation :\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {paquet|code_produit}\n" \
+ "Désinstaller un produit :\n" \
+ "\t/uninstall {paquet|code_produit} [propriété]\n" \
+ "\t/x {paquet|code_produit} [propriété]\n" \
+ "Publier un produit :\n" \
+ "\t/j[u|m] paquet [/t transformation] [/g id_langue]\n" \
+ "Appliquer un patch :\n" \
+ "\t/p paquet_patch [propriété]\n" \
+ "\t/p paquet_patch /a paquet [propriété]\n" \
+ "Modificateurs de journalisation et d'interface utilisateur pour les commandes ci-dessus :\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] fichier_journal\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Enregistrer le service MSI :\n" \
+ "\t/y\n" \
+ "Annuler l'enregistrement du service MSI :\n" \
+ "\t/z\n" \
+ "Afficher cette aide :\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "saisissez le nom du dossier contenant %s"
12 "source d'installation pour la fonctionnalité manquante"
13 "lecteur réseau pour la fonctionnalité manquante"
diff --git a/dll/win32/msi/msi_Hu.rc b/dll/win32/msi/msi_Hu.rc
index 21ba5cf30c1..846de4ccada 100644
--- a/dll/win32/msi/msi_Hu.rc
+++ b/dll/win32/msi/msi_Hu.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "%s útvonal nem található"
9 "helyezze be a lemezt: %s"
- 10 "rossz paraméterek"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "adja meg melyik mappa tartalmazza ezt: %s"
12 "hiányzó tulajdonság a telepítési forráshoz"
13 "hiányzó tulajdonság a hálózati meghajtóhoz"
diff --git a/dll/win32/msi/msi_It.rc b/dll/win32/msi/msi_It.rc
index a40a7303425..0586bb4bab5 100644
--- a/dll/win32/msi/msi_It.rc
+++ b/dll/win32/msi/msi_It.rc
@@ -30,7 +30,33 @@ STRINGTABLE DISCARDABLE
4 "Impossibile aprire il pacchetto di installazione specificato. Per favore controlla l'indirizzo del file e riprova."
5 "percorso %s non trovato"
9 "inserire disco %s"
- 10 "parametri incorretti"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "immettere il nome della cartella che contiene %s"
12 "sorgente di installazione per la funzionalitĂ mancante"
13 "periferica di rete per la funzionalitĂ mancante"
diff --git a/dll/win32/msi/msi_Ko.rc b/dll/win32/msi/msi_Ko.rc
index ca14253307d..17ab488ce2f 100644
--- a/dll/win32/msi/msi_Ko.rc
+++ b/dll/win32/msi/msi_Ko.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 " ÁöÁ¤ÇŃ ĽłÄˇ ĆĐŰÁö¸¦ ż Ľö ľř˝Ŕ´Ď´Ů. ĆÄŔĎ °ć·Î¸¦ Č®ŔÎÇĎ°í ´Ů˝Ă ˝ĂµµÇϽʽÿŔ."
5 "%s °ć·Î¸¦ ĂŁŔ»Ľö ľř˝Ŕ´Ď´Ů"
9 "µđ˝şĹ© %s »đŔÔ"
- 10 "Ŕ߸řµČ ¸Ĺ°łşŻĽö"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "%s¸¦ Ć÷ÇÔÇĎ´Â Ćú´ő¸¦ ŔÔ·ÂÇĎĽĽż©"
12 "şüÁř şÎşĐ(feature)Ŕ» Ŕ§ÇŃ ĽłÄˇ żřş»"
13 "şüÁř şÎşĐ(feature)Ŕ» Ŕ§ÇŃ ł×Ć®żöĹ© µĺ¶óŔĚşę"
diff --git a/dll/win32/msi/msi_Lt.rc b/dll/win32/msi/msi_Lt.rc
index 1cf1c52924e..c88592c49bc 100644
--- a/dll/win32/msi/msi_Lt.rc
+++ b/dll/win32/msi/msi_Lt.rc
@@ -30,7 +30,33 @@ STRINGTABLE DISCARDABLE
4 "Nepavyko atverti nurodyto diegimo paketo. Patikrinkite failo keliÄ… ir mÄ—ginkite dar kartÄ…."
5 "kelias %s nerastas"
9 "ÄŻdÄ—kite diskÄ… %s"
- 10 "blogi parametrai"
+ 10 "Windows diegimo programa %s\n\n" \
+ "Naudojimas:\n" \
+ "msiexec komanda {būtinas parametras} [nebūtinas parametras]\n\n" \
+ "Įdiegti produktą:\n" \
+ "\t/i {paketas|produkto_kodas} [savybÄ—]\n" \
+ "\t/package {paketas|produkto_kodas} [savybÄ—]\n" \
+ "\t/a paketas [savybÄ—]\n" \
+ "Taisyti ÄŻdiegimÄ…:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {paketas|produkto_kodas}\n" \
+ "Pašalinti produktą:\n" \
+ "\t/uninstall {paketas|produkto_kodas} [savybÄ—]\n" \
+ "\t/x {paketas|produkto_kodas} [savybÄ—]\n" \
+ "Skelbti produktÄ…:\n" \
+ "\t/j[u|m] paketas [/t pakeitimas] [/g kalbos_identifikatorius]\n" \
+ "Pritaikyti pataisÄ…:\n" \
+ "\t/p pataisos_paketas [savybÄ—]\n" \
+ "\t/p pataisos_paketas /a paketas [savybÄ—]\n" \
+ "Žurnalo ir sąsajos modifikatoriai aukščiau išvardintoms komandoms:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] Ĺľurnalo_failas\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Registruoti MSI tarnybÄ…:\n" \
+ "\t/y\n" \
+ "Išregistruoti MSI tarnybą:\n" \
+ "\t/z\n" \
+ "Parodyti šią pagalbą:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "ÄŻveskite aplankÄ…, kuris turi %s"
12 "trūksta diegimo šaltinio komponentui"
13 "trūksta tinklo disko komponentui"
diff --git a/dll/win32/msi/msi_Nl.rc b/dll/win32/msi/msi_Nl.rc
index da304304ed3..306cfd7e30a 100644
--- a/dll/win32/msi/msi_Nl.rc
+++ b/dll/win32/msi/msi_Nl.rc
@@ -1,5 +1,5 @@
/*
- * Durch resources for MSI
+ * Dutch resources for MSI
*
* Copyright 2005 Hans Leidekker
*
@@ -24,13 +24,39 @@ LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
{
- 4 "The specified installation package could not be opened. Please check the file path and try again."
+ 4 "Het opgegeven installatie pakket kon niet worden geopend. Verifieer het bestandspad en probeer opnieuw."
5 "Pad %s niet gevonden"
9 "Plaats disk %s"
- 10 "Ongeldige parameters"
+ 10 "Windows Installer %s\n\n" \
+ "Gebruik:\n" \
+ "msiexec commando {vereiste parameter} [optionele parameter]\n\n" \
+ "Installeer een product:\n" \
+ "\t/i {pakket|productcode} [eigenschap]\n" \
+ "\t/package {pakket|productcode} [eigenschap]\n" \
+ "\t/a pakket [eigenschap]\n" \
+ "Herstel een installatie:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {pakket|productcode}\n" \
+ "Verwijder een product:\n" \
+ "\t/uninstall {pakket|productcode} [eigenschap]\n" \
+ "\t/x {pakket|productcode} [eigenschap]\n" \
+ "Adverteer een product:\n" \
+ "\t/j[u|m] pakket [/t transform] [/g languageid]\n" \
+ "Pas een patch toe:\n" \
+ "\t/p patchpakket [eigenschap]\n" \
+ "\t/p patchpakket /a pakket [eigenschap]\n" \
+ "Log en UI Modifiers voor bovenstaande commando's:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logbestand\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Registreer MSI Service:\n" \
+ "\t/y\n" \
+ "Maak registratie MSI Service ongedaan:\n" \
+ "\t/z\n" \
+ "Laat dit helpvenster zien:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "Voer de map in die %s bevat"
- 12 "De installatiebron van het feature ontbreekt"
- 13 "De netwerkschijf met het feature ontbreekt"
+ 12 "De installatiebron van de feature ontbreekt"
+ 13 "De netwerkschijf met de feature ontbreekt"
14 "Feature van:"
15 "Kies de map die %s bevat"
}
diff --git a/dll/win32/msi/msi_No.rc b/dll/win32/msi/msi_No.rc
index e885f5adbda..93e26c67211 100644
--- a/dll/win32/msi/msi_No.rc
+++ b/dll/win32/msi/msi_No.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "Klarte ikke ĺpne den oppgitte installasjonspakken. Kontroller filbanen og prřv igjen."
5 "Fant ikke stien '%s'."
9 "Sett i disk '%s'"
- 10 "Gale parametere."
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "Oppgi katalogen som inneholder '%s'."
12 "Egenskapens installasjonskilde mangler."
13 "Egenskapens nettverksstasjon mangler."
diff --git a/dll/win32/msi/msi_Pl.rc b/dll/win32/msi/msi_Pl.rc
index c31311ebf7e..ceb64dd9c8c 100644
--- a/dll/win32/msi/msi_Pl.rc
+++ b/dll/win32/msi/msi_Pl.rc
@@ -28,7 +28,33 @@ STRINGTABLE DISCARDABLE
4 "Nie udało się otworzyć wybranego pakietu instalacyjnego. Sprawdź czy ścieżka jest poprawna i spróbuj ponownie."
5 "ścieżka '%s' nie została odnaleziona"
9 "włóż dysk '%s'"
- 10 "złe parametry"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "wprowadź siceżkę do folderu zawierającego '%s'"
12 "źródło danych zawierające żądanę funkcję jest niedostępne"
13 "dysk siecowy zawierający żądaną funckje jest niedostępny"
diff --git a/dll/win32/msi/msi_Pt.rc b/dll/win32/msi/msi_Pt.rc
index 64ab16348d4..94cc6330e0c 100644
--- a/dll/win32/msi/msi_Pt.rc
+++ b/dll/win32/msi/msi_Pt.rc
@@ -28,7 +28,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "caminho %s năo encontrado"
9 "insira disco %s"
- 10 "parâmetros inválidos"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "entre qual pasta contém %s"
12 "instalar fonte para característica faltando"
13 "drive de rede para característica faltando"
@@ -43,7 +69,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "localizaçăo %s năo encontrada"
9 "insira o disco %s"
- 10 "parâmetros inválidos"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "indique que pasta contém %s"
12 "instalar fonte para a opçăo em falta"
13 "controlador de rede para a opçăo em falta"
diff --git a/dll/win32/msi/msi_Ro.rc b/dll/win32/msi/msi_Ro.rc
index b877b42a34e..ffd9c5e08d7 100644
--- a/dll/win32/msi/msi_Ro.rc
+++ b/dll/win32/msi/msi_Ro.rc
@@ -28,7 +28,33 @@ STRINGTABLE DISCARDABLE
4 "Pachetul de instalare menționat nu a putut fi deschis. Verificați calea și încercați din nou."
5 "calea %s nu a fost gÄsitÄ"
9 "inserați discul %s"
- 10 "parameteri greșiți"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "introduceți fișierul care conține %s"
12 "lipseČ™te sursa de instalare pentru aceastÄ caracteristicÄ"
13 "lipseČ™te unitatea de reČ›ea pentru aceastÄ caracteristicÄ"
diff --git a/dll/win32/msi/msi_Ru.rc b/dll/win32/msi/msi_Ru.rc
index 8e7aafdda31..7cd4a2b0737 100644
--- a/dll/win32/msi/msi_Ru.rc
+++ b/dll/win32/msi/msi_Ru.rc
@@ -30,7 +30,33 @@ STRINGTABLE DISCARDABLE
4 "Указанный пакет не может быть открыт. Проверьте файл и повторите попыткŃ."
5 "ĐżŃть %s не найден"
9 "вŃтавьте диŃĐş %s"
- 10 "неверные параметры"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "Ńкажите каталог, Ńодержащий %s"
12 "иŃточник ŃŃтановки данной возможноŃти не Ńказан"
13 "Ńетевой диŃĐş для данной возможноŃти не Ńказан"
diff --git a/dll/win32/msi/msi_Si.rc b/dll/win32/msi/msi_Si.rc
index 75823390635..3477f1ba6e5 100644
--- a/dll/win32/msi/msi_Si.rc
+++ b/dll/win32/msi/msi_Si.rc
@@ -29,7 +29,33 @@ STRINGTABLE DISCARDABLE
4 "Navedenega namestitvenega paketa ni mogoÄŤe odpreti. Preverite ime datoteke in poskusite znova."
5 "pot %s ne obstaja"
9 "vnesite disk %s"
- 10 "neveljavni parametri"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "vnesite ime mape, ki vsebuje %s"
12 "manjkajoÄŤ namestitveni vir za namestitev funkcije"
13 "manjkajoÄŤ omreĹľni pogon za namestitev funkcijo"
diff --git a/dll/win32/msi/msi_Sv.rc b/dll/win32/msi/msi_Sv.rc
index 47bf09b00c4..4c37cfc475b 100644
--- a/dll/win32/msi/msi_Sv.rc
+++ b/dll/win32/msi/msi_Sv.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "Det angivna installationspaketet kunde inte öppnas. Kontrollera filsökvägen och försök igen."
5 "sökvägen %s hittades inte"
9 "mata in %s"
- 10 "felaktiga parametrar"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "ange vilken mapp som innehĺller %s"
12 "installationskälla för funktion saknar"
13 "nätverksenhet för funktion saknar"
diff --git a/dll/win32/msi/msi_Tr.rc b/dll/win32/msi/msi_Tr.rc
index a8e0f369666..c6a12c1ae07 100644
--- a/dll/win32/msi/msi_Tr.rc
+++ b/dll/win32/msi/msi_Tr.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "%s yolu bulunamadý"
9 "%s nolu diski yerleţtirin"
- 10 "bozuk parametreler"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "%s öđesini içeren dizini girin"
12 "eksik özellik için kurulum kaynađý"
13 "eksik özellik için ađ sürücüsü"
diff --git a/dll/win32/msi/msi_Uk.rc b/dll/win32/msi/msi_Uk.rc
index 4b7173e8d4a..2407bbe6e6d 100644
--- a/dll/win32/msi/msi_Uk.rc
+++ b/dll/win32/msi/msi_Uk.rc
@@ -32,7 +32,33 @@ STRINGTABLE DISCARDABLE
4 "Не вдалоŃŃŹ відкрити вказаний пакет Ń–Đ˝Ńталяції. Перевірте Ńлях Đ´Đľ Ń„Đ°ĐąĐ»Ń Ń‚Đ° ŃпробŃйте знов."
5 "Ńлях %s не знайдено"
9 "вŃтавте диŃĐş %s"
- 10 "невірні параметри"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "вкажіть папкŃ, що ĐĽŃ–Ńтить %s"
12 "джерело вŃтановлення даної можливоŃті не вказане"
13 "мережевий диŃĐş для даної можливоŃті не вказаний"
diff --git a/dll/win32/msi/msi_Zh.rc b/dll/win32/msi/msi_Zh.rc
index a6d5cd1eff6..91fd5400258 100644
--- a/dll/win32/msi/msi_Zh.rc
+++ b/dll/win32/msi/msi_Zh.rc
@@ -30,7 +30,33 @@ STRINGTABLE DISCARDABLE
4 "不č˝ć‰“开所指定的安装软件包. 请检查文件路径ĺŽĺ†ŤčŻ•."
5 "č·Żĺľ„ %s 没找ĺ°"
9 "ćŹ’ĺ…Ąč˝Żç› %s"
- 10 "错误参数"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "čľ“ĺ…ĄĺŚ…ĺ« %s 的文件夹"
12 "本功č˝çš„安装ćşä¸Ťĺ在"
13 "本功č˝çš„网络驱动器不ĺ在"
@@ -45,7 +71,33 @@ STRINGTABLE DISCARDABLE
4 "不č˝é–‹ĺ•źć‰€ćŚ‡ĺ®šçš„ĺ®‰čŁťč»źä»¶ĺŚ…. 請檢查檔ćˇč·Żĺľ‘後再試."
5 "č·Żĺľ‘ %s 沒找ĺ°"
9 "插入軟碟 %s"
- 10 "錯誤ĺŹć•¸"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "čĽ¸ĺ…ĄĺŚ…ĺ« %s 的檔ćˇĺ¤ľ"
12 "本功č˝çš„安裝ćşä¸Ťĺ在"
13 "本功č˝çš„網路儲ĺ槽不ĺ在"
diff --git a/dll/win32/msi/msi_ros.diff b/dll/win32/msi/msi_ros.diff
deleted file mode 100644
index 1e88f29fb3f..00000000000
--- a/dll/win32/msi/msi_ros.diff
+++ /dev/null
@@ -1,5400 +0,0 @@
-Index: cond.tab.c
-===================================================================
---- cond.tab.c (revision 31639)
-+++ cond.tab.c (working copy)
-@@ -0,0 +1,2439 @@
-+/* A Bison parser, made by GNU Bison 2.1. */
-+
-+/* Skeleton parser for Yacc-like parsing with Bison,
-+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2, or (at your option)
-+ any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
-+ Boston, MA 02110-1301, USA. */
-+
-+/* As a special exception, when this file is copied by Bison into a
-+ Bison output file, you may use that output file without restriction.
-+ This special exception was added by the Free Software Foundation
-+ in version 1.24 of Bison. */
-+
-+/* Written by Richard Stallman by simplifying the original so called
-+ ``semantic'' parser. */
-+
-+/* All symbols defined below should begin with yy or YY, to avoid
-+ infringing on user name space. This should be done even for local
-+ variables, as they might otherwise be expanded by user macros.
-+ There are some unavoidable exceptions within include files to
-+ define necessary library symbols; they are noted "INFRINGES ON
-+ USER NAME SPACE" below. */
-+
-+/* Identify Bison output. */
-+#define YYBISON 1
-+
-+/* Bison version. */
-+#define YYBISON_VERSION "2.1"
-+
-+/* Skeleton name. */
-+#define YYSKELETON_NAME "yacc.c"
-+
-+/* Pure parsers. */
-+#define YYPURE 1
-+
-+/* Using locations. */
-+#define YYLSP_NEEDED 0
-+
-+/* Substitute the variable and function names. */
-+#define yyparse cond_parse
-+#define yylex cond_lex
-+#define yyerror cond_error
-+#define yylval cond_lval
-+#define yychar cond_char
-+#define yydebug cond_debug
-+#define yynerrs cond_nerrs
-+
-+
-+/* Tokens. */
-+#ifndef YYTOKENTYPE
-+# define YYTOKENTYPE
-+ /* Put the tokens into the symbol table, so that GDB and other debuggers
-+ know about them. */
-+ enum yytokentype {
-+ COND_SPACE = 258,
-+ COND_EOF = 259,
-+ COND_OR = 260,
-+ COND_AND = 261,
-+ COND_NOT = 262,
-+ COND_XOR = 263,
-+ COND_IMP = 264,
-+ COND_EQV = 265,
-+ COND_LT = 266,
-+ COND_GT = 267,
-+ COND_EQ = 268,
-+ COND_NE = 269,
-+ COND_GE = 270,
-+ COND_LE = 271,
-+ COND_ILT = 272,
-+ COND_IGT = 273,
-+ COND_IEQ = 274,
-+ COND_INE = 275,
-+ COND_IGE = 276,
-+ COND_ILE = 277,
-+ COND_LPAR = 278,
-+ COND_RPAR = 279,
-+ COND_TILDA = 280,
-+ COND_SS = 281,
-+ COND_ISS = 282,
-+ COND_ILHS = 283,
-+ COND_IRHS = 284,
-+ COND_LHS = 285,
-+ COND_RHS = 286,
-+ COND_PERCENT = 287,
-+ COND_DOLLARS = 288,
-+ COND_QUESTION = 289,
-+ COND_AMPER = 290,
-+ COND_EXCLAM = 291,
-+ COND_IDENT = 292,
-+ COND_NUMBER = 293,
-+ COND_LITER = 294,
-+ COND_ERROR = 295
-+ };
-+#endif
-+/* Tokens. */
-+#define COND_SPACE 258
-+#define COND_EOF 259
-+#define COND_OR 260
-+#define COND_AND 261
-+#define COND_NOT 262
-+#define COND_XOR 263
-+#define COND_IMP 264
-+#define COND_EQV 265
-+#define COND_LT 266
-+#define COND_GT 267
-+#define COND_EQ 268
-+#define COND_NE 269
-+#define COND_GE 270
-+#define COND_LE 271
-+#define COND_ILT 272
-+#define COND_IGT 273
-+#define COND_IEQ 274
-+#define COND_INE 275
-+#define COND_IGE 276
-+#define COND_ILE 277
-+#define COND_LPAR 278
-+#define COND_RPAR 279
-+#define COND_TILDA 280
-+#define COND_SS 281
-+#define COND_ISS 282
-+#define COND_ILHS 283
-+#define COND_IRHS 284
-+#define COND_LHS 285
-+#define COND_RHS 286
-+#define COND_PERCENT 287
-+#define COND_DOLLARS 288
-+#define COND_QUESTION 289
-+#define COND_AMPER 290
-+#define COND_EXCLAM 291
-+#define COND_IDENT 292
-+#define COND_NUMBER 293
-+#define COND_LITER 294
-+#define COND_ERROR 295
-+
-+
-+
-+
-+/* Copy the first part of user declarations. */
-+#line 1 "cond.y"
-+
-+
-+/*
-+ * Implementation of the Microsoft Installer (msi.dll)
-+ *
-+ * Copyright 2003 Mike McCormack for CodeWeavers
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
-+ */
-+
-+#define COBJMACROS
-+
-+#include "config.h"
-+
-+#include
-+#include
-+#include
-+
-+#include "windef.h"
-+#include "winbase.h"
-+#include "winuser.h"
-+#include "msi.h"
-+#include "msiquery.h"
-+#include "objbase.h"
-+#include "oleauto.h"
-+
-+#include "msipriv.h"
-+#include "msiserver.h"
-+#include "wine/debug.h"
-+#include "wine/unicode.h"
-+
-+#define YYLEX_PARAM info
-+#define YYPARSE_PARAM info
-+
-+static int cond_error(const char *str);
-+
-+WINE_DEFAULT_DEBUG_CHANNEL(msi);
-+
-+typedef struct tag_yyinput
-+{
-+ MSIPACKAGE *package;
-+ LPCWSTR str;
-+ INT n;
-+ MSICONDITION result;
-+} COND_input;
-+
-+struct cond_str {
-+ LPCWSTR data;
-+ INT len;
-+};
-+
-+static LPWSTR COND_GetString( const struct cond_str *str );
-+static LPWSTR COND_GetLiteral( const struct cond_str *str );
-+static int cond_lex( void *COND_lval, COND_input *info);
-+static const WCHAR szEmpty[] = { 0 };
-+
-+static INT compare_int( INT a, INT operator, INT b );
-+static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert );
-+
-+static INT compare_and_free_strings( LPWSTR a, INT op, LPWSTR b, BOOL convert )
-+{
-+ INT r;
-+
-+ r = compare_string( a, op, b, convert );
-+ msi_free( a );
-+ msi_free( b );
-+ return r;
-+}
-+
-+static BOOL num_from_prop( LPCWSTR p, INT *val )
-+{
-+ INT ret = 0, sign = 1;
-+
-+ if (!p)
-+ return FALSE;
-+ if (*p == '-')
-+ {
-+ sign = -1;
-+ p++;
-+ }
-+ if (!*p)
-+ return FALSE;
-+ while (*p)
-+ {
-+ if( *p < '0' || *p > '9' )
-+ return FALSE;
-+ ret = ret*10 + (*p - '0');
-+ p++;
-+ }
-+ *val = ret*sign;
-+ return TRUE;
-+}
-+
-+
-+
-+/* Enabling traces. */
-+#ifndef YYDEBUG
-+# define YYDEBUG 0
-+#endif
-+
-+/* Enabling verbose error messages. */
-+#ifdef YYERROR_VERBOSE
-+# undef YYERROR_VERBOSE
-+# define YYERROR_VERBOSE 1
-+#else
-+# define YYERROR_VERBOSE 0
-+#endif
-+
-+/* Enabling the token table. */
-+#ifndef YYTOKEN_TABLE
-+# define YYTOKEN_TABLE 0
-+#endif
-+
-+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-+#line 111 "cond.y"
-+typedef union YYSTYPE {
-+ struct cond_str str;
-+ LPWSTR string;
-+ INT value;
-+} YYSTYPE;
-+/* Line 196 of yacc.c. */
-+#line 286 "cond.tab.c"
-+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-+# define YYSTYPE_IS_DECLARED 1
-+# define YYSTYPE_IS_TRIVIAL 1
-+#endif
-+
-+
-+
-+/* Copy the second part of user declarations. */
-+
-+
-+/* Line 219 of yacc.c. */
-+#line 298 "cond.tab.c"
-+
-+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
-+# define YYSIZE_T __SIZE_TYPE__
-+#endif
-+#if ! defined (YYSIZE_T) && defined (size_t)
-+# define YYSIZE_T size_t
-+#endif
-+#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus))
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YYSIZE_T size_t
-+#endif
-+#if ! defined (YYSIZE_T)
-+# define YYSIZE_T unsigned int
-+#endif
-+
-+#ifndef YY_
-+# if YYENABLE_NLS
-+# if ENABLE_NLS
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YY_(msgid) dgettext ("bison-runtime", msgid)
-+# endif
-+# endif
-+# ifndef YY_
-+# define YY_(msgid) msgid
-+# endif
-+#endif
-+
-+#if ! defined (yyoverflow) || YYERROR_VERBOSE
-+
-+/* The parser invokes alloca or malloc; define the necessary symbols. */
-+
-+# ifdef YYSTACK_USE_ALLOCA
-+# if YYSTACK_USE_ALLOCA
-+# ifdef __GNUC__
-+# define YYSTACK_ALLOC __builtin_alloca
-+# else
-+# define YYSTACK_ALLOC alloca
-+# if defined (__STDC__) || defined (__cplusplus)
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YYINCLUDED_STDLIB_H
-+# endif
-+# endif
-+# endif
-+# endif
-+
-+# ifdef YYSTACK_ALLOC
-+ /* Pacify GCC's `empty if-body' warning. */
-+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
-+# ifndef YYSTACK_ALLOC_MAXIMUM
-+ /* The OS might guarantee only one guard page at the bottom of the stack,
-+ and a page size can be as small as 4096 bytes. So we cannot safely
-+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
-+ to allow for a few compiler-allocated temporary stack slots. */
-+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */
-+# endif
-+# else
-+# define YYSTACK_ALLOC YYMALLOC
-+# define YYSTACK_FREE YYFREE
-+# ifndef YYSTACK_ALLOC_MAXIMUM
-+# define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1)
-+# endif
-+# ifdef __cplusplus
-+extern "C" {
-+# endif
-+# ifndef YYMALLOC
-+# define YYMALLOC malloc
-+# if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \
-+ && (defined (__STDC__) || defined (__cplusplus)))
-+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-+# endif
-+# endif
-+# ifndef YYFREE
-+# define YYFREE free
-+# if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \
-+ && (defined (__STDC__) || defined (__cplusplus)))
-+void free (void *); /* INFRINGES ON USER NAME SPACE */
-+# endif
-+# endif
-+# ifdef __cplusplus
-+}
-+# endif
-+# endif
-+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
-+
-+
-+#if (! defined (yyoverflow) \
-+ && (! defined (__cplusplus) \
-+ || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
-+
-+/* A type that is properly aligned for any stack member. */
-+union yyalloc
-+{
-+ short int yyss;
-+ YYSTYPE yyvs;
-+ };
-+
-+/* The size of the maximum gap between one aligned stack and the next. */
-+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-+
-+/* The size of an array large to enough to hold all stacks, each with
-+ N elements. */
-+# define YYSTACK_BYTES(N) \
-+ ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \
-+ + YYSTACK_GAP_MAXIMUM)
-+
-+/* Copy COUNT objects from FROM to TO. The source and destination do
-+ not overlap. */
-+# ifndef YYCOPY
-+# if defined (__GNUC__) && 1 < __GNUC__
-+# define YYCOPY(To, From, Count) \
-+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-+# else
-+# define YYCOPY(To, From, Count) \
-+ do \
-+ { \
-+ YYSIZE_T yyi; \
-+ for (yyi = 0; yyi < (Count); yyi++) \
-+ (To)[yyi] = (From)[yyi]; \
-+ } \
-+ while (0)
-+# endif
-+# endif
-+
-+/* Relocate STACK from its old location to the new one. The
-+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
-+ elements in the stack, and YYPTR gives the new location of the
-+ stack. Advance YYPTR to a properly aligned location for the next
-+ stack. */
-+# define YYSTACK_RELOCATE(Stack) \
-+ do \
-+ { \
-+ YYSIZE_T yynewbytes; \
-+ YYCOPY (&yyptr->Stack, Stack, yysize); \
-+ Stack = &yyptr->Stack; \
-+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-+ yyptr += yynewbytes / sizeof (*yyptr); \
-+ } \
-+ while (0)
-+
-+#endif
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+ typedef signed char yysigned_char;
-+#else
-+ typedef short int yysigned_char;
-+#endif
-+
-+/* YYFINAL -- State number of the termination state. */
-+#define YYFINAL 28
-+/* YYLAST -- Last index in YYTABLE. */
-+#define YYLAST 71
-+
-+/* YYNTOKENS -- Number of terminals. */
-+#define YYNTOKENS 41
-+/* YYNNTS -- Number of nonterminals. */
-+#define YYNNTS 12
-+/* YYNRULES -- Number of rules. */
-+#define YYNRULES 53
-+/* YYNRULES -- Number of states. */
-+#define YYNSTATES 70
-+
-+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
-+#define YYUNDEFTOK 2
-+#define YYMAXUTOK 295
-+
-+#define YYTRANSLATE(YYX) \
-+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-+
-+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
-+static const unsigned char yytranslate[] =
-+{
-+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
-+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
-+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
-+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
-+ 35, 36, 37, 38, 39, 40
-+};
-+
-+#if YYDEBUG
-+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
-+ YYRHS. */
-+static const unsigned char yyprhs[] =
-+{
-+ 0, 0, 3, 5, 6, 8, 12, 16, 20, 24,
-+ 26, 30, 33, 35, 37, 41, 45, 49, 53, 57,
-+ 61, 65, 69, 73, 77, 79, 81, 83, 85, 87,
-+ 89, 91, 93, 95, 97, 99, 101, 103, 105, 107,
-+ 109, 111, 113, 115, 117, 119, 121, 124, 127, 130,
-+ 133, 135, 138, 140
-+};
-+
-+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-+static const yysigned_char yyrhs[] =
-+{
-+ 42, 0, -1, 43, -1, -1, 44, -1, 43, 5,
-+ 44, -1, 43, 9, 44, -1, 43, 8, 44, -1,
-+ 43, 10, 44, -1, 45, -1, 44, 6, 45, -1,
-+ 7, 45, -1, 49, -1, 47, -1, 49, 46, 49,
-+ -1, 50, 46, 49, -1, 49, 46, 50, -1, 50,
-+ 46, 50, -1, 50, 46, 48, -1, 48, 46, 50,
-+ -1, 48, 46, 48, -1, 48, 46, 49, -1, 49,
-+ 46, 48, -1, 23, 43, 24, -1, 13, -1, 14,
-+ -1, 11, -1, 12, -1, 16, -1, 15, -1, 26,
-+ -1, 19, -1, 20, -1, 17, -1, 18, -1, 22,
-+ -1, 21, -1, 27, -1, 30, -1, 31, -1, 28,
-+ -1, 29, -1, 50, -1, 48, -1, 39, -1, 52,
-+ -1, 33, 51, -1, 34, 51, -1, 35, 51, -1,
-+ 36, 51, -1, 51, -1, 32, 51, -1, 37, -1,
-+ 38, -1
-+};
-+
-+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
-+static const unsigned short int yyrline[] =
-+{
-+ 0, 135, 135, 141, 148, 152, 156, 160, 164, 171,
-+ 175, 182, 186, 190, 195, 199, 208, 217, 221, 225,
-+ 229, 233, 238, 243, 251, 252, 253, 254, 255, 256,
-+ 257, 258, 259, 260, 261, 262, 263, 264, 265, 266,
-+ 267, 268, 272, 276, 283, 292, 296, 305, 314, 327,
-+ 339, 346, 360, 369
-+};
-+#endif
-+
-+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
-+static const char *const yytname[] =
-+{
-+ "$end", "error", "$undefined", "COND_SPACE", "COND_EOF", "COND_OR",
-+ "COND_AND", "COND_NOT", "COND_XOR", "COND_IMP", "COND_EQV", "COND_LT",
-+ "COND_GT", "COND_EQ", "COND_NE", "COND_GE", "COND_LE", "COND_ILT",
-+ "COND_IGT", "COND_IEQ", "COND_INE", "COND_IGE", "COND_ILE", "COND_LPAR",
-+ "COND_RPAR", "COND_TILDA", "COND_SS", "COND_ISS", "COND_ILHS",
-+ "COND_IRHS", "COND_LHS", "COND_RHS", "COND_PERCENT", "COND_DOLLARS",
-+ "COND_QUESTION", "COND_AMPER", "COND_EXCLAM", "COND_IDENT",
-+ "COND_NUMBER", "COND_LITER", "COND_ERROR", "$accept", "condition",
-+ "expression", "boolean_term", "boolean_factor", "operator", "value_s",
-+ "literal", "value_i", "symbol_s", "identifier", "integer", 0
-+};
-+#endif
-+
-+# ifdef YYPRINT
-+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
-+ token YYLEX-NUM. */
-+static const unsigned short int yytoknum[] =
-+{
-+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
-+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
-+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
-+ 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
-+ 295
-+};
-+# endif
-+
-+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-+static const unsigned char yyr1[] =
-+{
-+ 0, 41, 42, 42, 43, 43, 43, 43, 43, 44,
-+ 44, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-+ 45, 45, 45, 45, 46, 46, 46, 46, 46, 46,
-+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
-+ 46, 46, 47, 47, 48, 49, 49, 49, 49, 49,
-+ 50, 50, 51, 52
-+};
-+
-+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
-+static const unsigned char yyr2[] =
-+{
-+ 0, 2, 1, 0, 1, 3, 3, 3, 3, 1,
-+ 3, 2, 1, 1, 3, 3, 3, 3, 3, 3,
-+ 3, 3, 3, 3, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
-+ 1, 2, 1, 1
-+};
-+
-+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
-+ STATE-NUM when YYTABLE doesn't specify something else to do. Zero
-+ means the default is an error. */
-+static const unsigned char yydefact[] =
-+{
-+ 3, 0, 0, 0, 0, 0, 0, 0, 52, 53,
-+ 44, 0, 2, 4, 9, 13, 43, 12, 42, 50,
-+ 45, 11, 0, 51, 46, 47, 48, 49, 1, 0,
-+ 0, 0, 0, 0, 26, 27, 24, 25, 29, 28,
-+ 33, 34, 31, 32, 36, 35, 30, 37, 40, 41,
-+ 38, 39, 0, 0, 0, 23, 5, 7, 6, 8,
-+ 10, 20, 21, 19, 22, 14, 16, 18, 15, 17
-+};
-+
-+/* YYDEFGOTO[NTERM-NUM]. */
-+static const yysigned_char yydefgoto[] =
-+{
-+ -1, 11, 12, 13, 14, 52, 15, 16, 17, 18,
-+ 19, 20
-+};
-+
-+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-+ STATE-NUM. */
-+#define YYPACT_NINF -15
-+static const yysigned_char yypact[] =
-+{
-+ -7, -7, -7, -14, -14, -14, -14, -14, -15, -15,
-+ -15, 24, 46, 30, -15, -15, -9, -9, -9, -15,
-+ -15, -15, 29, -15, -15, -15, -15, -15, -15, -7,
-+ -7, -7, -7, -7, -15, -15, -15, -15, -15, -15,
-+ -15, -15, -15, -15, -15, -15, -15, -15, -15, -15,
-+ -15, -15, 8, 8, 8, -15, 30, 30, 30, 30,
-+ -15, -15, -15, -15, -15, -15, -15, -15, -15, -15
-+};
-+
-+/* YYPGOTO[NTERM-NUM]. */
-+static const yysigned_char yypgoto[] =
-+{
-+ -15, -15, 50, 33, 0, -3, -15, -4, 14, 17,
-+ 54, -15
-+};
-+
-+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
-+ positive, shift that token. If negative, reduce the rule which
-+ number is the opposite. If zero, do what YYDEFACT says.
-+ If YYTABLE_NINF, syntax error. */
-+#define YYTABLE_NINF -1
-+static const unsigned char yytable[] =
-+{
-+ 1, 21, 34, 35, 36, 37, 38, 39, 40, 41,
-+ 42, 43, 44, 45, 53, 54, 2, 46, 47, 48,
-+ 49, 50, 51, 8, 28, 3, 4, 5, 6, 7,
-+ 8, 9, 10, 60, 29, 0, 33, 30, 31, 32,
-+ 3, 4, 5, 6, 7, 8, 9, 10, 61, 64,
-+ 67, 29, 22, 55, 30, 31, 32, 23, 24, 25,
-+ 26, 27, 56, 57, 58, 59, 62, 65, 68, 63,
-+ 66, 69
-+};
-+
-+static const yysigned_char yycheck[] =
-+{
-+ 7, 1, 11, 12, 13, 14, 15, 16, 17, 18,
-+ 19, 20, 21, 22, 17, 18, 23, 26, 27, 28,
-+ 29, 30, 31, 37, 0, 32, 33, 34, 35, 36,
-+ 37, 38, 39, 33, 5, -1, 6, 8, 9, 10,
-+ 32, 33, 34, 35, 36, 37, 38, 39, 52, 53,
-+ 54, 5, 2, 24, 8, 9, 10, 3, 4, 5,
-+ 6, 7, 29, 30, 31, 32, 52, 53, 54, 52,
-+ 53, 54
-+};
-+
-+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-+ symbol of state STATE-NUM. */
-+static const unsigned char yystos[] =
-+{
-+ 0, 7, 23, 32, 33, 34, 35, 36, 37, 38,
-+ 39, 42, 43, 44, 45, 47, 48, 49, 50, 51,
-+ 52, 45, 43, 51, 51, 51, 51, 51, 0, 5,
-+ 8, 9, 10, 6, 11, 12, 13, 14, 15, 16,
-+ 17, 18, 19, 20, 21, 22, 26, 27, 28, 29,
-+ 30, 31, 46, 46, 46, 24, 44, 44, 44, 44,
-+ 45, 48, 49, 50, 48, 49, 50, 48, 49, 50
-+};
-+
-+#define yyerrok (yyerrstatus = 0)
-+#define yyclearin (yychar = YYEMPTY)
-+#define YYEMPTY (-2)
-+#define YYEOF 0
-+
-+#define YYACCEPT goto yyacceptlab
-+#define YYABORT goto yyabortlab
-+#define YYERROR goto yyerrorlab
-+
-+
-+/* Like YYERROR except do call yyerror. This remains here temporarily
-+ to ease the transition to the new meaning of YYERROR, for GCC.
-+ Once GCC version 2 has supplanted version 1, this can go. */
-+
-+#define YYFAIL goto yyerrlab
-+
-+#define YYRECOVERING() (!!yyerrstatus)
-+
-+#define YYBACKUP(Token, Value) \
-+do \
-+ if (yychar == YYEMPTY && yylen == 1) \
-+ { \
-+ yychar = (Token); \
-+ yylval = (Value); \
-+ yytoken = YYTRANSLATE (yychar); \
-+ YYPOPSTACK; \
-+ goto yybackup; \
-+ } \
-+ else \
-+ { \
-+ yyerror (YY_("syntax error: cannot back up")); \
-+ YYERROR; \
-+ } \
-+while (0)
-+
-+
-+#define YYTERROR 1
-+#define YYERRCODE 256
-+
-+
-+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-+ If N is 0, then set CURRENT to the empty location which ends
-+ the previous symbol: RHS[0] (always defined). */
-+
-+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-+#ifndef YYLLOC_DEFAULT
-+# define YYLLOC_DEFAULT(Current, Rhs, N) \
-+ do \
-+ if (N) \
-+ { \
-+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
-+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
-+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
-+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
-+ } \
-+ else \
-+ { \
-+ (Current).first_line = (Current).last_line = \
-+ YYRHSLOC (Rhs, 0).last_line; \
-+ (Current).first_column = (Current).last_column = \
-+ YYRHSLOC (Rhs, 0).last_column; \
-+ } \
-+ while (0)
-+#endif
-+
-+
-+/* YY_LOCATION_PRINT -- Print the location on the stream.
-+ This macro was not mandated originally: define only if we know
-+ we won't break user code: when these are the locations we know. */
-+
-+#ifndef YY_LOCATION_PRINT
-+# if YYLTYPE_IS_TRIVIAL
-+# define YY_LOCATION_PRINT(File, Loc) \
-+ fprintf (File, "%d.%d-%d.%d", \
-+ (Loc).first_line, (Loc).first_column, \
-+ (Loc).last_line, (Loc).last_column)
-+# else
-+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-+# endif
-+#endif
-+
-+
-+/* YYLEX -- calling `yylex' with the right arguments. */
-+
-+#ifdef YYLEX_PARAM
-+# define YYLEX yylex (&yylval, YYLEX_PARAM)
-+#else
-+# define YYLEX yylex (&yylval)
-+#endif
-+
-+/* Enable debugging if requested. */
-+#if YYDEBUG
-+
-+# ifndef YYFPRINTF
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YYFPRINTF fprintf
-+# endif
-+
-+# define YYDPRINTF(Args) \
-+do { \
-+ if (yydebug) \
-+ YYFPRINTF Args; \
-+} while (0)
-+
-+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
-+do { \
-+ if (yydebug) \
-+ { \
-+ YYFPRINTF (stderr, "%s ", Title); \
-+ yysymprint (stderr, \
-+ Type, Value); \
-+ YYFPRINTF (stderr, "\n"); \
-+ } \
-+} while (0)
-+
-+/*------------------------------------------------------------------.
-+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-+| TOP (included). |
-+`------------------------------------------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yy_stack_print (short int *bottom, short int *top)
-+#else
-+static void
-+yy_stack_print (bottom, top)
-+ short int *bottom;
-+ short int *top;
-+#endif
-+{
-+ YYFPRINTF (stderr, "Stack now");
-+ for (/* Nothing. */; bottom <= top; ++bottom)
-+ YYFPRINTF (stderr, " %d", *bottom);
-+ YYFPRINTF (stderr, "\n");
-+}
-+
-+# define YY_STACK_PRINT(Bottom, Top) \
-+do { \
-+ if (yydebug) \
-+ yy_stack_print ((Bottom), (Top)); \
-+} while (0)
-+
-+
-+/*------------------------------------------------.
-+| Report that the YYRULE is going to be reduced. |
-+`------------------------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yy_reduce_print (int yyrule)
-+#else
-+static void
-+yy_reduce_print (yyrule)
-+ int yyrule;
-+#endif
-+{
-+ int yyi;
-+ unsigned long int yylno = yyrline[yyrule];
-+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ",
-+ yyrule - 1, yylno);
-+ /* Print the symbols being reduced, and their result. */
-+ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
-+ YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
-+ YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]);
-+}
-+
-+# define YY_REDUCE_PRINT(Rule) \
-+do { \
-+ if (yydebug) \
-+ yy_reduce_print (Rule); \
-+} while (0)
-+
-+/* Nonzero means print parse trace. It is left uninitialized so that
-+ multiple parsers can coexist. */
-+int yydebug;
-+#else /* !YYDEBUG */
-+# define YYDPRINTF(Args)
-+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-+# define YY_STACK_PRINT(Bottom, Top)
-+# define YY_REDUCE_PRINT(Rule)
-+#endif /* !YYDEBUG */
-+
-+
-+/* YYINITDEPTH -- initial size of the parser's stacks. */
-+#ifndef YYINITDEPTH
-+# define YYINITDEPTH 200
-+#endif
-+
-+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
-+ if the built-in stack extension method is used).
-+
-+ Do not make this value too large; the results are undefined if
-+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
-+ evaluated with infinite-precision integer arithmetic. */
-+
-+#ifndef YYMAXDEPTH
-+# define YYMAXDEPTH 10000
-+#endif
-+
-+
-+
-+#if YYERROR_VERBOSE
-+
-+# ifndef yystrlen
-+# if defined (__GLIBC__) && defined (_STRING_H)
-+# define yystrlen strlen
-+# else
-+/* Return the length of YYSTR. */
-+static YYSIZE_T
-+# if defined (__STDC__) || defined (__cplusplus)
-+yystrlen (const char *yystr)
-+# else
-+yystrlen (yystr)
-+ const char *yystr;
-+# endif
-+{
-+ const char *yys = yystr;
-+
-+ while (*yys++ != '\0')
-+ continue;
-+
-+ return yys - yystr - 1;
-+}
-+# endif
-+# endif
-+
-+# ifndef yystpcpy
-+# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
-+# define yystpcpy stpcpy
-+# else
-+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
-+ YYDEST. */
-+static char *
-+# if defined (__STDC__) || defined (__cplusplus)
-+yystpcpy (char *yydest, const char *yysrc)
-+# else
-+yystpcpy (yydest, yysrc)
-+ char *yydest;
-+ const char *yysrc;
-+# endif
-+{
-+ char *yyd = yydest;
-+ const char *yys = yysrc;
-+
-+ while ((*yyd++ = *yys++) != '\0')
-+ continue;
-+
-+ return yyd - 1;
-+}
-+# endif
-+# endif
-+
-+# ifndef yytnamerr
-+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
-+ quotes and backslashes, so that it's suitable for yyerror. The
-+ heuristic is that double-quoting is unnecessary unless the string
-+ contains an apostrophe, a comma, or backslash (other than
-+ backslash-backslash). YYSTR is taken from yytname. If YYRES is
-+ null, do not copy; instead, return the length of what the result
-+ would have been. */
-+static YYSIZE_T
-+yytnamerr (char *yyres, const char *yystr)
-+{
-+ if (*yystr == '"')
-+ {
-+ size_t yyn = 0;
-+ char const *yyp = yystr;
-+
-+ for (;;)
-+ switch (*++yyp)
-+ {
-+ case '\'':
-+ case ',':
-+ goto do_not_strip_quotes;
-+
-+ case '\\':
-+ if (*++yyp != '\\')
-+ goto do_not_strip_quotes;
-+ /* Fall through. */
-+ default:
-+ if (yyres)
-+ yyres[yyn] = *yyp;
-+ yyn++;
-+ break;
-+
-+ case '"':
-+ if (yyres)
-+ yyres[yyn] = '\0';
-+ return yyn;
-+ }
-+ do_not_strip_quotes: ;
-+ }
-+
-+ if (! yyres)
-+ return yystrlen (yystr);
-+
-+ return yystpcpy (yyres, yystr) - yyres;
-+}
-+# endif
-+
-+#endif /* YYERROR_VERBOSE */
-+
-+
-+
-+#if YYDEBUG
-+/*--------------------------------.
-+| Print this symbol on YYOUTPUT. |
-+`--------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
-+#else
-+static void
-+yysymprint (yyoutput, yytype, yyvaluep)
-+ FILE *yyoutput;
-+ int yytype;
-+ YYSTYPE *yyvaluep;
-+#endif
-+{
-+ /* Pacify ``unused variable'' warnings. */
-+ (void) yyvaluep;
-+
-+ if (yytype < YYNTOKENS)
-+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-+ else
-+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-+
-+
-+# ifdef YYPRINT
-+ if (yytype < YYNTOKENS)
-+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-+# endif
-+ switch (yytype)
-+ {
-+ default:
-+ break;
-+ }
-+ YYFPRINTF (yyoutput, ")");
-+}
-+
-+#endif /* ! YYDEBUG */
-+/*-----------------------------------------------.
-+| Release the memory associated to this symbol. |
-+`-----------------------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
-+#else
-+static void
-+yydestruct (yymsg, yytype, yyvaluep)
-+ const char *yymsg;
-+ int yytype;
-+ YYSTYPE *yyvaluep;
-+#endif
-+{
-+ /* Pacify ``unused variable'' warnings. */
-+ (void) yyvaluep;
-+
-+ if (!yymsg)
-+ yymsg = "Deleting";
-+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-+
-+ switch (yytype)
-+ {
-+
-+ default:
-+ break;
-+ }
-+}
-+
-+
-+/* Prevent warnings from -Wmissing-prototypes. */
-+
-+#ifdef YYPARSE_PARAM
-+# if defined (__STDC__) || defined (__cplusplus)
-+int yyparse (void *YYPARSE_PARAM);
-+# else
-+int yyparse ();
-+# endif
-+#else /* ! YYPARSE_PARAM */
-+#if defined (__STDC__) || defined (__cplusplus)
-+int yyparse (void);
-+#else
-+int yyparse ();
-+#endif
-+#endif /* ! YYPARSE_PARAM */
-+
-+
-+
-+
-+
-+
-+/*----------.
-+| yyparse. |
-+`----------*/
-+
-+#ifdef YYPARSE_PARAM
-+# if defined (__STDC__) || defined (__cplusplus)
-+int yyparse (void *YYPARSE_PARAM)
-+# else
-+int yyparse (YYPARSE_PARAM)
-+ void *YYPARSE_PARAM;
-+# endif
-+#else /* ! YYPARSE_PARAM */
-+#if defined (__STDC__) || defined (__cplusplus)
-+int
-+yyparse (void)
-+#else
-+int
-+yyparse ()
-+ ;
-+#endif
-+#endif
-+{
-+ /* The look-ahead symbol. */
-+int yychar;
-+
-+/* The semantic value of the look-ahead symbol. */
-+YYSTYPE yylval;
-+
-+/* Number of syntax errors so far. */
-+int yynerrs;
-+
-+ int yystate;
-+ int yyn;
-+ int yyresult;
-+ /* Number of tokens to shift before error messages enabled. */
-+ int yyerrstatus;
-+ /* Look-ahead token as an internal (translated) token number. */
-+ int yytoken = 0;
-+
-+ /* Three stacks and their tools:
-+ `yyss': related to states,
-+ `yyvs': related to semantic values,
-+ `yyls': related to locations.
-+
-+ Refer to the stacks thru separate pointers, to allow yyoverflow
-+ to reallocate them elsewhere. */
-+
-+ /* The state stack. */
-+ short int yyssa[YYINITDEPTH];
-+ short int *yyss = yyssa;
-+ short int *yyssp;
-+
-+ /* The semantic value stack. */
-+ YYSTYPE yyvsa[YYINITDEPTH];
-+ YYSTYPE *yyvs = yyvsa;
-+ YYSTYPE *yyvsp;
-+
-+
-+
-+#define YYPOPSTACK (yyvsp--, yyssp--)
-+
-+ YYSIZE_T yystacksize = YYINITDEPTH;
-+
-+ /* The variables used to return semantic value and location from the
-+ action routines. */
-+ YYSTYPE yyval;
-+
-+
-+ /* When reducing, the number of symbols on the RHS of the reduced
-+ rule. */
-+ int yylen;
-+
-+ YYDPRINTF ((stderr, "Starting parse\n"));
-+
-+ yystate = 0;
-+ yyerrstatus = 0;
-+ yynerrs = 0;
-+ yychar = YYEMPTY; /* Cause a token to be read. */
-+
-+ /* Initialize stack pointers.
-+ Waste one element of value and location stack
-+ so that they stay on the same level as the state stack.
-+ The wasted elements are never initialized. */
-+
-+ yyssp = yyss;
-+ yyvsp = yyvs;
-+
-+ goto yysetstate;
-+
-+/*------------------------------------------------------------.
-+| yynewstate -- Push a new state, which is found in yystate. |
-+`------------------------------------------------------------*/
-+ yynewstate:
-+ /* In all cases, when you get here, the value and location stacks
-+ have just been pushed. so pushing a state here evens the stacks.
-+ */
-+ yyssp++;
-+
-+ yysetstate:
-+ *yyssp = yystate;
-+
-+ if (yyss + yystacksize - 1 <= yyssp)
-+ {
-+ /* Get the current used size of the three stacks, in elements. */
-+ YYSIZE_T yysize = yyssp - yyss + 1;
-+
-+#ifdef yyoverflow
-+ {
-+ /* Give user a chance to reallocate the stack. Use copies of
-+ these so that the &'s don't force the real ones into
-+ memory. */
-+ YYSTYPE *yyvs1 = yyvs;
-+ short int *yyss1 = yyss;
-+
-+
-+ /* Each stack pointer address is followed by the size of the
-+ data in use in that stack, in bytes. This used to be a
-+ conditional around just the two extra args, but that might
-+ be undefined if yyoverflow is a macro. */
-+ yyoverflow (YY_("memory exhausted"),
-+ &yyss1, yysize * sizeof (*yyssp),
-+ &yyvs1, yysize * sizeof (*yyvsp),
-+
-+ &yystacksize);
-+
-+ yyss = yyss1;
-+ yyvs = yyvs1;
-+ }
-+#else /* no yyoverflow */
-+# ifndef YYSTACK_RELOCATE
-+ goto yyexhaustedlab;
-+# else
-+ /* Extend the stack our own way. */
-+ if (YYMAXDEPTH <= yystacksize)
-+ goto yyexhaustedlab;
-+ yystacksize *= 2;
-+ if (YYMAXDEPTH < yystacksize)
-+ yystacksize = YYMAXDEPTH;
-+
-+ {
-+ short int *yyss1 = yyss;
-+ union yyalloc *yyptr =
-+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
-+ if (! yyptr)
-+ goto yyexhaustedlab;
-+ YYSTACK_RELOCATE (yyss);
-+ YYSTACK_RELOCATE (yyvs);
-+
-+# undef YYSTACK_RELOCATE
-+ if (yyss1 != yyssa)
-+ YYSTACK_FREE (yyss1);
-+ }
-+# endif
-+#endif /* no yyoverflow */
-+
-+ yyssp = yyss + yysize - 1;
-+ yyvsp = yyvs + yysize - 1;
-+
-+
-+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-+ (unsigned long int) yystacksize));
-+
-+ if (yyss + yystacksize - 1 <= yyssp)
-+ YYABORT;
-+ }
-+
-+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-+
-+ goto yybackup;
-+
-+/*-----------.
-+| yybackup. |
-+`-----------*/
-+yybackup:
-+
-+/* Do appropriate processing given the current state. */
-+/* Read a look-ahead token if we need one and don't already have one. */
-+/* yyresume: */
-+
-+ /* First try to decide what to do without reference to look-ahead token. */
-+
-+ yyn = yypact[yystate];
-+ if (yyn == YYPACT_NINF)
-+ goto yydefault;
-+
-+ /* Not known => get a look-ahead token if don't already have one. */
-+
-+ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
-+ if (yychar == YYEMPTY)
-+ {
-+ YYDPRINTF ((stderr, "Reading a token: "));
-+ yychar = YYLEX;
-+ }
-+
-+ if (yychar <= YYEOF)
-+ {
-+ yychar = yytoken = YYEOF;
-+ YYDPRINTF ((stderr, "Now at end of input.\n"));
-+ }
-+ else
-+ {
-+ yytoken = YYTRANSLATE (yychar);
-+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
-+ }
-+
-+ /* If the proper action on seeing token YYTOKEN is to reduce or to
-+ detect an error, take that action. */
-+ yyn += yytoken;
-+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
-+ goto yydefault;
-+ yyn = yytable[yyn];
-+ if (yyn <= 0)
-+ {
-+ if (yyn == 0 || yyn == YYTABLE_NINF)
-+ goto yyerrlab;
-+ yyn = -yyn;
-+ goto yyreduce;
-+ }
-+
-+ if (yyn == YYFINAL)
-+ YYACCEPT;
-+
-+ /* Shift the look-ahead token. */
-+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-+
-+ /* Discard the token being shifted unless it is eof. */
-+ if (yychar != YYEOF)
-+ yychar = YYEMPTY;
-+
-+ *++yyvsp = yylval;
-+
-+
-+ /* Count tokens shifted since error; after three, turn off error
-+ status. */
-+ if (yyerrstatus)
-+ yyerrstatus--;
-+
-+ yystate = yyn;
-+ goto yynewstate;
-+
-+
-+/*-----------------------------------------------------------.
-+| yydefault -- do the default action for the current state. |
-+`-----------------------------------------------------------*/
-+yydefault:
-+ yyn = yydefact[yystate];
-+ if (yyn == 0)
-+ goto yyerrlab;
-+ goto yyreduce;
-+
-+
-+/*-----------------------------.
-+| yyreduce -- Do a reduction. |
-+`-----------------------------*/
-+yyreduce:
-+ /* yyn is the number of a rule to reduce with. */
-+ yylen = yyr2[yyn];
-+
-+ /* If YYLEN is nonzero, implement the default value of the action:
-+ `$$ = $1'.
-+
-+ Otherwise, the following line sets YYVAL to garbage.
-+ This behavior is undocumented and Bison
-+ users should not rely upon it. Assigning to YYVAL
-+ unconditionally makes the parser a bit smaller, and it avoids a
-+ GCC warning that YYVAL may be used uninitialized. */
-+ yyval = yyvsp[1-yylen];
-+
-+
-+ YY_REDUCE_PRINT (yyn);
-+ switch (yyn)
-+ {
-+ case 2:
-+#line 136 "cond.y"
-+ {
-+ COND_input* cond = (COND_input*) info;
-+ cond->result = (yyvsp[0].value);
-+ ;}
-+ break;
-+
-+ case 3:
-+#line 141 "cond.y"
-+ {
-+ COND_input* cond = (COND_input*) info;
-+ cond->result = MSICONDITION_NONE;
-+ ;}
-+ break;
-+
-+ case 4:
-+#line 149 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[0].value);
-+ ;}
-+ break;
-+
-+ case 5:
-+#line 153 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[-2].value) || (yyvsp[0].value);
-+ ;}
-+ break;
-+
-+ case 6:
-+#line 157 "cond.y"
-+ {
-+ (yyval.value) = !(yyvsp[-2].value) || (yyvsp[0].value);
-+ ;}
-+ break;
-+
-+ case 7:
-+#line 161 "cond.y"
-+ {
-+ (yyval.value) = ( (yyvsp[-2].value) || (yyvsp[0].value) ) && !( (yyvsp[-2].value) && (yyvsp[0].value) );
-+ ;}
-+ break;
-+
-+ case 8:
-+#line 165 "cond.y"
-+ {
-+ (yyval.value) = ( (yyvsp[-2].value) && (yyvsp[0].value) ) || ( !(yyvsp[-2].value) && !(yyvsp[0].value) );
-+ ;}
-+ break;
-+
-+ case 9:
-+#line 172 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[0].value);
-+ ;}
-+ break;
-+
-+ case 10:
-+#line 176 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[-2].value) && (yyvsp[0].value);
-+ ;}
-+ break;
-+
-+ case 11:
-+#line 183 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[0].value) ? 0 : 1;
-+ ;}
-+ break;
-+
-+ case 12:
-+#line 187 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[0].value) ? 1 : 0;
-+ ;}
-+ break;
-+
-+ case 13:
-+#line 191 "cond.y"
-+ {
-+ (yyval.value) = ((yyvsp[0].string) && (yyvsp[0].string)[0]) ? 1 : 0;
-+ msi_free((yyvsp[0].string));
-+ ;}
-+ break;
-+
-+ case 14:
-+#line 196 "cond.y"
-+ {
-+ (yyval.value) = compare_int( (yyvsp[-2].value), (yyvsp[-1].value), (yyvsp[0].value) );
-+ ;}
-+ break;
-+
-+ case 15:
-+#line 200 "cond.y"
-+ {
-+ int num;
-+ if (num_from_prop( (yyvsp[-2].string), &num ))
-+ (yyval.value) = compare_int( num, (yyvsp[-1].value), (yyvsp[0].value) );
-+ else
-+ (yyval.value) = ((yyvsp[-1].value) == COND_NE || (yyvsp[-1].value) == COND_INE );
-+ msi_free((yyvsp[-2].string));
-+ ;}
-+ break;
-+
-+ case 16:
-+#line 209 "cond.y"
-+ {
-+ int num;
-+ if (num_from_prop( (yyvsp[0].string), &num ))
-+ (yyval.value) = compare_int( (yyvsp[-2].value), (yyvsp[-1].value), num );
-+ else
-+ (yyval.value) = ((yyvsp[-1].value) == COND_NE || (yyvsp[-1].value) == COND_INE );
-+ msi_free((yyvsp[0].string));
-+ ;}
-+ break;
-+
-+ case 17:
-+#line 218 "cond.y"
-+ {
-+ (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), TRUE );
-+ ;}
-+ break;
-+
-+ case 18:
-+#line 222 "cond.y"
-+ {
-+ (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), TRUE );
-+ ;}
-+ break;
-+
-+ case 19:
-+#line 226 "cond.y"
-+ {
-+ (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), TRUE );
-+ ;}
-+ break;
-+
-+ case 20:
-+#line 230 "cond.y"
-+ {
-+ (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), FALSE );
-+ ;}
-+ break;
-+
-+ case 21:
-+#line 234 "cond.y"
-+ {
-+ (yyval.value) = 0;
-+ msi_free((yyvsp[-2].string));
-+ ;}
-+ break;
-+
-+ case 22:
-+#line 239 "cond.y"
-+ {
-+ (yyval.value) = 0;
-+ msi_free((yyvsp[0].string));
-+ ;}
-+ break;
-+
-+ case 23:
-+#line 244 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[-1].value);
-+ ;}
-+ break;
-+
-+ case 24:
-+#line 251 "cond.y"
-+ { (yyval.value) = COND_EQ; ;}
-+ break;
-+
-+ case 25:
-+#line 252 "cond.y"
-+ { (yyval.value) = COND_NE; ;}
-+ break;
-+
-+ case 26:
-+#line 253 "cond.y"
-+ { (yyval.value) = COND_LT; ;}
-+ break;
-+
-+ case 27:
-+#line 254 "cond.y"
-+ { (yyval.value) = COND_GT; ;}
-+ break;
-+
-+ case 28:
-+#line 255 "cond.y"
-+ { (yyval.value) = COND_LE; ;}
-+ break;
-+
-+ case 29:
-+#line 256 "cond.y"
-+ { (yyval.value) = COND_GE; ;}
-+ break;
-+
-+ case 30:
-+#line 257 "cond.y"
-+ { (yyval.value) = COND_SS; ;}
-+ break;
-+
-+ case 31:
-+#line 258 "cond.y"
-+ { (yyval.value) = COND_IEQ; ;}
-+ break;
-+
-+ case 32:
-+#line 259 "cond.y"
-+ { (yyval.value) = COND_INE; ;}
-+ break;
-+
-+ case 33:
-+#line 260 "cond.y"
-+ { (yyval.value) = COND_ILT; ;}
-+ break;
-+
-+ case 34:
-+#line 261 "cond.y"
-+ { (yyval.value) = COND_IGT; ;}
-+ break;
-+
-+ case 35:
-+#line 262 "cond.y"
-+ { (yyval.value) = COND_ILE; ;}
-+ break;
-+
-+ case 36:
-+#line 263 "cond.y"
-+ { (yyval.value) = COND_IGE; ;}
-+ break;
-+
-+ case 37:
-+#line 264 "cond.y"
-+ { (yyval.value) = COND_ISS; ;}
-+ break;
-+
-+ case 38:
-+#line 265 "cond.y"
-+ { (yyval.value) = COND_LHS; ;}
-+ break;
-+
-+ case 39:
-+#line 266 "cond.y"
-+ { (yyval.value) = COND_RHS; ;}
-+ break;
-+
-+ case 40:
-+#line 267 "cond.y"
-+ { (yyval.value) = COND_ILHS; ;}
-+ break;
-+
-+ case 41:
-+#line 268 "cond.y"
-+ { (yyval.value) = COND_IRHS; ;}
-+ break;
-+
-+ case 42:
-+#line 273 "cond.y"
-+ {
-+ (yyval.string) = (yyvsp[0].string);
-+ ;}
-+ break;
-+
-+ case 43:
-+#line 277 "cond.y"
-+ {
-+ (yyval.string) = (yyvsp[0].string);
-+ ;}
-+ break;
-+
-+ case 44:
-+#line 284 "cond.y"
-+ {
-+ (yyval.string) = COND_GetLiteral(&(yyvsp[0].str));
-+ if( !(yyval.string) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 45:
-+#line 293 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[0].value);
-+ ;}
-+ break;
-+
-+ case 46:
-+#line 297 "cond.y"
-+ {
-+ COND_input* cond = (COND_input*) info;
-+ INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
-+
-+ MSI_GetComponentStateW(cond->package, (yyvsp[0].string), &install, &action );
-+ (yyval.value) = action;
-+ msi_free( (yyvsp[0].string) );
-+ ;}
-+ break;
-+
-+ case 47:
-+#line 306 "cond.y"
-+ {
-+ COND_input* cond = (COND_input*) info;
-+ INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
-+
-+ MSI_GetComponentStateW(cond->package, (yyvsp[0].string), &install, &action );
-+ (yyval.value) = install;
-+ msi_free( (yyvsp[0].string) );
-+ ;}
-+ break;
-+
-+ case 48:
-+#line 315 "cond.y"
-+ {
-+ COND_input* cond = (COND_input*) info;
-+ INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
-+
-+ MSI_GetFeatureStateW(cond->package, (yyvsp[0].string), &install, &action );
-+ if (action == INSTALLSTATE_UNKNOWN)
-+ (yyval.value) = MSICONDITION_FALSE;
-+ else
-+ (yyval.value) = action;
-+
-+ msi_free( (yyvsp[0].string) );
-+ ;}
-+ break;
-+
-+ case 49:
-+#line 328 "cond.y"
-+ {
-+ COND_input* cond = (COND_input*) info;
-+ INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
-+
-+ MSI_GetFeatureStateW(cond->package, (yyvsp[0].string), &install, &action );
-+ (yyval.value) = install;
-+ msi_free( (yyvsp[0].string) );
-+ ;}
-+ break;
-+
-+ case 50:
-+#line 340 "cond.y"
-+ {
-+ COND_input* cond = (COND_input*) info;
-+
-+ (yyval.string) = msi_dup_property( cond->package, (yyvsp[0].string) );
-+ msi_free( (yyvsp[0].string) );
-+ ;}
-+ break;
-+
-+ case 51:
-+#line 347 "cond.y"
-+ {
-+ UINT len = GetEnvironmentVariableW( (yyvsp[0].string), NULL, 0 );
-+ (yyval.string) = NULL;
-+ if (len++)
-+ {
-+ (yyval.string) = msi_alloc( len*sizeof (WCHAR) );
-+ GetEnvironmentVariableW( (yyvsp[0].string), (yyval.string), len );
-+ }
-+ msi_free( (yyvsp[0].string) );
-+ ;}
-+ break;
-+
-+ case 52:
-+#line 361 "cond.y"
-+ {
-+ (yyval.string) = COND_GetString(&(yyvsp[0].str));
-+ if( !(yyval.string) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 53:
-+#line 370 "cond.y"
-+ {
-+ LPWSTR szNum = COND_GetString(&(yyvsp[0].str));
-+ if( !szNum )
-+ YYABORT;
-+ (yyval.value) = atoiW( szNum );
-+ msi_free( szNum );
-+ ;}
-+ break;
-+
-+
-+ default: break;
-+ }
-+
-+/* Line 1126 of yacc.c. */
-+#line 1740 "cond.tab.c"
-+
-+ yyvsp -= yylen;
-+ yyssp -= yylen;
-+
-+
-+ YY_STACK_PRINT (yyss, yyssp);
-+
-+ *++yyvsp = yyval;
-+
-+
-+ /* Now `shift' the result of the reduction. Determine what state
-+ that goes to, based on the state we popped back to and the rule
-+ number reduced by. */
-+
-+ yyn = yyr1[yyn];
-+
-+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
-+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
-+ yystate = yytable[yystate];
-+ else
-+ yystate = yydefgoto[yyn - YYNTOKENS];
-+
-+ goto yynewstate;
-+
-+
-+/*------------------------------------.
-+| yyerrlab -- here on detecting error |
-+`------------------------------------*/
-+yyerrlab:
-+ /* If not already recovering from an error, report this error. */
-+ if (!yyerrstatus)
-+ {
-+ ++yynerrs;
-+#if YYERROR_VERBOSE
-+ yyn = yypact[yystate];
-+
-+ if (YYPACT_NINF < yyn && yyn < YYLAST)
-+ {
-+ int yytype = YYTRANSLATE (yychar);
-+ YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
-+ YYSIZE_T yysize = yysize0;
-+ YYSIZE_T yysize1;
-+ int yysize_overflow = 0;
-+ char *yymsg = 0;
-+# define YYERROR_VERBOSE_ARGS_MAXIMUM 5
-+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-+ int yyx;
-+
-+#if 0
-+ /* This is so xgettext sees the translatable formats that are
-+ constructed on the fly. */
-+ YY_("syntax error, unexpected %s");
-+ YY_("syntax error, unexpected %s, expecting %s");
-+ YY_("syntax error, unexpected %s, expecting %s or %s");
-+ YY_("syntax error, unexpected %s, expecting %s or %s or %s");
-+ YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-+#endif
-+ char *yyfmt;
-+ char const *yyf;
-+ static char const yyunexpected[] = "syntax error, unexpected %s";
-+ static char const yyexpecting[] = ", expecting %s";
-+ static char const yyor[] = " or %s";
-+ char yyformat[sizeof yyunexpected
-+ + sizeof yyexpecting - 1
-+ + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-+ * (sizeof yyor - 1))];
-+ char const *yyprefix = yyexpecting;
-+
-+ /* Start YYX at -YYN if negative to avoid negative indexes in
-+ YYCHECK. */
-+ int yyxbegin = yyn < 0 ? -yyn : 0;
-+
-+ /* Stay within bounds of both yycheck and yytname. */
-+ int yychecklim = YYLAST - yyn;
-+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-+ int yycount = 1;
-+
-+ yyarg[0] = yytname[yytype];
-+ yyfmt = yystpcpy (yyformat, yyunexpected);
-+
-+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-+ {
-+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-+ {
-+ yycount = 1;
-+ yysize = yysize0;
-+ yyformat[sizeof yyunexpected - 1] = '\0';
-+ break;
-+ }
-+ yyarg[yycount++] = yytname[yyx];
-+ yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-+ yysize_overflow |= yysize1 < yysize;
-+ yysize = yysize1;
-+ yyfmt = yystpcpy (yyfmt, yyprefix);
-+ yyprefix = yyor;
-+ }
-+
-+ yyf = YY_(yyformat);
-+ yysize1 = yysize + yystrlen (yyf);
-+ yysize_overflow |= yysize1 < yysize;
-+ yysize = yysize1;
-+
-+ if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM)
-+ yymsg = (char *) YYSTACK_ALLOC (yysize);
-+ if (yymsg)
-+ {
-+ /* Avoid sprintf, as that infringes on the user's name space.
-+ Don't have undefined behavior even if the translation
-+ produced a string with the wrong number of "%s"s. */
-+ char *yyp = yymsg;
-+ int yyi = 0;
-+ while ((*yyp = *yyf))
-+ {
-+ if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-+ {
-+ yyp += yytnamerr (yyp, yyarg[yyi++]);
-+ yyf += 2;
-+ }
-+ else
-+ {
-+ yyp++;
-+ yyf++;
-+ }
-+ }
-+ yyerror (yymsg);
-+ YYSTACK_FREE (yymsg);
-+ }
-+ else
-+ {
-+ yyerror (YY_("syntax error"));
-+ goto yyexhaustedlab;
-+ }
-+ }
-+ else
-+#endif /* YYERROR_VERBOSE */
-+ yyerror (YY_("syntax error"));
-+ }
-+
-+
-+
-+ if (yyerrstatus == 3)
-+ {
-+ /* If just tried and failed to reuse look-ahead token after an
-+ error, discard it. */
-+
-+ if (yychar <= YYEOF)
-+ {
-+ /* Return failure if at end of input. */
-+ if (yychar == YYEOF)
-+ YYABORT;
-+ }
-+ else
-+ {
-+ yydestruct ("Error: discarding", yytoken, &yylval);
-+ yychar = YYEMPTY;
-+ }
-+ }
-+
-+ /* Else will try to reuse look-ahead token after shifting the error
-+ token. */
-+ goto yyerrlab1;
-+
-+
-+/*---------------------------------------------------.
-+| yyerrorlab -- error raised explicitly by YYERROR. |
-+`---------------------------------------------------*/
-+yyerrorlab:
-+
-+ /* Pacify compilers like GCC when the user code never invokes
-+ YYERROR and the label yyerrorlab therefore never appears in user
-+ code. */
-+ if (0)
-+ goto yyerrorlab;
-+
-+yyvsp -= yylen;
-+ yyssp -= yylen;
-+ yystate = *yyssp;
-+ goto yyerrlab1;
-+
-+
-+/*-------------------------------------------------------------.
-+| yyerrlab1 -- common code for both syntax error and YYERROR. |
-+`-------------------------------------------------------------*/
-+yyerrlab1:
-+ yyerrstatus = 3; /* Each real token shifted decrements this. */
-+
-+ for (;;)
-+ {
-+ yyn = yypact[yystate];
-+ if (yyn != YYPACT_NINF)
-+ {
-+ yyn += YYTERROR;
-+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
-+ {
-+ yyn = yytable[yyn];
-+ if (0 < yyn)
-+ break;
-+ }
-+ }
-+
-+ /* Pop the current state because it cannot handle the error token. */
-+ if (yyssp == yyss)
-+ YYABORT;
-+
-+
-+ yydestruct ("Error: popping", yystos[yystate], yyvsp);
-+ YYPOPSTACK;
-+ yystate = *yyssp;
-+ YY_STACK_PRINT (yyss, yyssp);
-+ }
-+
-+ if (yyn == YYFINAL)
-+ YYACCEPT;
-+
-+ *++yyvsp = yylval;
-+
-+
-+ /* Shift the error token. */
-+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-+
-+ yystate = yyn;
-+ goto yynewstate;
-+
-+
-+/*-------------------------------------.
-+| yyacceptlab -- YYACCEPT comes here. |
-+`-------------------------------------*/
-+yyacceptlab:
-+ yyresult = 0;
-+ goto yyreturn;
-+
-+/*-----------------------------------.
-+| yyabortlab -- YYABORT comes here. |
-+`-----------------------------------*/
-+yyabortlab:
-+ yyresult = 1;
-+ goto yyreturn;
-+
-+#ifndef yyoverflow
-+/*-------------------------------------------------.
-+| yyexhaustedlab -- memory exhaustion comes here. |
-+`-------------------------------------------------*/
-+yyexhaustedlab:
-+ yyerror (YY_("memory exhausted"));
-+ yyresult = 2;
-+ /* Fall through. */
-+#endif
-+
-+yyreturn:
-+ if (yychar != YYEOF && yychar != YYEMPTY)
-+ yydestruct ("Cleanup: discarding lookahead",
-+ yytoken, &yylval);
-+ while (yyssp != yyss)
-+ {
-+ yydestruct ("Cleanup: popping",
-+ yystos[*yyssp], yyvsp);
-+ YYPOPSTACK;
-+ }
-+#ifndef yyoverflow
-+ if (yyss != yyssa)
-+ YYSTACK_FREE (yyss);
-+#endif
-+ return yyresult;
-+}
-+
-+
-+#line 379 "cond.y"
-+
-+
-+
-+static int COND_IsAlpha( WCHAR x )
-+{
-+ return( ( ( x >= 'A' ) && ( x <= 'Z' ) ) ||
-+ ( ( x >= 'a' ) && ( x <= 'z' ) ) ||
-+ ( ( x == '_' ) ) );
-+}
-+
-+static int COND_IsNumber( WCHAR x )
-+{
-+ return( (( x >= '0' ) && ( x <= '9' )) || (x =='-') || (x =='.') );
-+}
-+
-+static WCHAR *strstriW( const WCHAR *str, const WCHAR *sub )
-+{
-+ LPWSTR strlower, sublower, r;
-+ strlower = CharLowerW( strdupW( str ) );
-+ sublower = CharLowerW( strdupW( sub ) );
-+ r = strstrW( strlower, sublower );
-+ if (r)
-+ r = (LPWSTR)str + (r - strlower);
-+ msi_free( strlower );
-+ msi_free( sublower );
-+ return r;
-+}
-+
-+static BOOL str_is_number( LPCWSTR str )
-+{
-+ int i;
-+
-+ if (!*str)
-+ return FALSE;
-+
-+ for (i = 0; i < lstrlenW( str ); i++)
-+ if (!isdigitW(str[i]))
-+ return FALSE;
-+
-+ return TRUE;
-+}
-+
-+static INT compare_substring( LPCWSTR a, INT operator, LPCWSTR b )
-+{
-+ int lhs, rhs;
-+
-+ /* substring operators return 0 if LHS is missing */
-+ if (!a || !*a)
-+ return 0;
-+
-+ /* substring operators return 1 if RHS is missing */
-+ if (!b || !*b)
-+ return 1;
-+
-+ /* if both strings contain only numbers, use integer comparison */
-+ lhs = atoiW(a);
-+ rhs = atoiW(b);
-+ if (str_is_number(a) && str_is_number(b))
-+ return compare_int( lhs, operator, rhs );
-+
-+ switch (operator)
-+ {
-+ case COND_SS:
-+ return strstrW( a, b ) ? 1 : 0;
-+ case COND_ISS:
-+ return strstriW( a, b ) ? 1 : 0;
-+ case COND_LHS:
-+ return 0 == strncmpW( a, b, lstrlenW( b ) );
-+ case COND_RHS:
-+ return 0 == lstrcmpW( a + (lstrlenW( a ) - lstrlenW( b )), b );
-+ case COND_ILHS:
-+ return 0 == strncmpiW( a, b, lstrlenW( b ) );
-+ case COND_IRHS:
-+ return 0 == lstrcmpiW( a + (lstrlenW( a ) - lstrlenW( b )), b );
-+ default:
-+ ERR("invalid substring operator\n");
-+ return 0;
-+ }
-+ return 0;
-+}
-+
-+static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert )
-+{
-+ if (operator >= COND_SS && operator <= COND_RHS)
-+ return compare_substring( a, operator, b );
-+
-+ /* null and empty string are equivalent */
-+ if (!a) a = szEmpty;
-+ if (!b) b = szEmpty;
-+
-+ if (convert && str_is_number(a) && str_is_number(b))
-+ return compare_int( atoiW(a), operator, atoiW(b) );
-+
-+ /* a or b may be NULL */
-+ switch (operator)
-+ {
-+ case COND_LT:
-+ return -1 == lstrcmpW( a, b );
-+ case COND_GT:
-+ return 1 == lstrcmpW( a, b );
-+ case COND_EQ:
-+ return 0 == lstrcmpW( a, b );
-+ case COND_NE:
-+ return 0 != lstrcmpW( a, b );
-+ case COND_GE:
-+ return -1 != lstrcmpW( a, b );
-+ case COND_LE:
-+ return 1 != lstrcmpW( a, b );
-+ case COND_ILT:
-+ return -1 == lstrcmpiW( a, b );
-+ case COND_IGT:
-+ return 1 == lstrcmpiW( a, b );
-+ case COND_IEQ:
-+ return 0 == lstrcmpiW( a, b );
-+ case COND_INE:
-+ return 0 != lstrcmpiW( a, b );
-+ case COND_IGE:
-+ return -1 != lstrcmpiW( a, b );
-+ case COND_ILE:
-+ return 1 != lstrcmpiW( a, b );
-+ default:
-+ ERR("invalid string operator\n");
-+ return 0;
-+ }
-+ return 0;
-+}
-+
-+
-+static INT compare_int( INT a, INT operator, INT b )
-+{
-+ switch (operator)
-+ {
-+ case COND_LT:
-+ case COND_ILT:
-+ return a < b;
-+ case COND_GT:
-+ case COND_IGT:
-+ return a > b;
-+ case COND_EQ:
-+ case COND_IEQ:
-+ return a == b;
-+ case COND_NE:
-+ case COND_INE:
-+ return a != b;
-+ case COND_GE:
-+ case COND_IGE:
-+ return a >= b;
-+ case COND_LE:
-+ case COND_ILE:
-+ return a <= b;
-+ case COND_SS:
-+ case COND_ISS:
-+ return ( a & b ) ? 1 : 0;
-+ case COND_RHS:
-+ return ( ( a & 0xffff ) == b ) ? 1 : 0;
-+ case COND_LHS:
-+ return ( ( (a>>16) & 0xffff ) == b ) ? 1 : 0;
-+ default:
-+ ERR("invalid integer operator\n");
-+ return 0;
-+ }
-+ return 0;
-+}
-+
-+
-+static int COND_IsIdent( WCHAR x )
-+{
-+ return( COND_IsAlpha( x ) || COND_IsNumber( x ) || ( x == '_' )
-+ || ( x == '#' ) || (x == '.') );
-+}
-+
-+static int COND_GetOperator( COND_input *cond )
-+{
-+ static const struct {
-+ const WCHAR str[4];
-+ int id;
-+ } table[] = {
-+ { {'~','=',0}, COND_IEQ },
-+ { {'~','<','=',0}, COND_ILE },
-+ { {'~','>','<',0}, COND_ISS },
-+ { {'~','>','>',0}, COND_IRHS },
-+ { {'~','<','>',0}, COND_INE },
-+ { {'~','<',0}, COND_ILT },
-+ { {'~','>','=',0}, COND_IGE },
-+ { {'~','<','<',0}, COND_ILHS },
-+ { {'~','>',0}, COND_IGT },
-+ { {'>','=',0}, COND_GE },
-+ { {'>','<',0}, COND_SS },
-+ { {'<','<',0}, COND_LHS },
-+ { {'<','>',0}, COND_NE },
-+ { {'<','=',0}, COND_LE },
-+ { {'>','>',0}, COND_RHS },
-+ { {'>',0}, COND_GT },
-+ { {'<',0}, COND_LT },
-+ { {0}, 0 }
-+ };
-+ LPCWSTR p = &cond->str[cond->n];
-+ int i = 0, len;
-+
-+ while ( 1 )
-+ {
-+ len = lstrlenW( table[i].str );
-+ if ( !len || 0 == strncmpW( table[i].str, p, len ) )
-+ break;
-+ i++;
-+ }
-+ cond->n += len;
-+ return table[i].id;
-+}
-+
-+static int COND_GetOne( struct cond_str *str, COND_input *cond )
-+{
-+ int rc, len = 1;
-+ WCHAR ch;
-+
-+ str->data = &cond->str[cond->n];
-+
-+ ch = str->data[0];
-+
-+ switch( ch )
-+ {
-+ case 0: return 0;
-+ case '(': rc = COND_LPAR; break;
-+ case ')': rc = COND_RPAR; break;
-+ case '&': rc = COND_AMPER; break;
-+ case '!': rc = COND_EXCLAM; break;
-+ case '$': rc = COND_DOLLARS; break;
-+ case '?': rc = COND_QUESTION; break;
-+ case '%': rc = COND_PERCENT; break;
-+ case ' ': rc = COND_SPACE; break;
-+ case '=': rc = COND_EQ; break;
-+
-+ case '~':
-+ case '<':
-+ case '>':
-+ rc = COND_GetOperator( cond );
-+ if (!rc)
-+ rc = COND_ERROR;
-+ return rc;
-+ default:
-+ rc = 0;
-+ }
-+
-+ if ( rc )
-+ {
-+ cond->n += len;
-+ return rc;
-+ }
-+
-+ if (ch == '"' )
-+ {
-+ LPCWSTR p = strchrW( str->data + 1, '"' );
-+ if (!p)
-+ return COND_ERROR;
-+ len = p - str->data + 1;
-+ rc = COND_LITER;
-+ }
-+ else if( COND_IsAlpha( ch ) )
-+ {
-+ static const WCHAR szNot[] = {'N','O','T',0};
-+ static const WCHAR szAnd[] = {'A','N','D',0};
-+ static const WCHAR szXor[] = {'X','O','R',0};
-+ static const WCHAR szEqv[] = {'E','Q','V',0};
-+ static const WCHAR szImp[] = {'I','M','P',0};
-+ static const WCHAR szOr[] = {'O','R',0};
-+
-+ while( COND_IsIdent( str->data[len] ) )
-+ len++;
-+ rc = COND_IDENT;
-+
-+ if ( len == 3 )
-+ {
-+ if ( !strncmpiW( str->data, szNot, len ) )
-+ rc = COND_NOT;
-+ else if( !strncmpiW( str->data, szAnd, len ) )
-+ rc = COND_AND;
-+ else if( !strncmpiW( str->data, szXor, len ) )
-+ rc = COND_XOR;
-+ else if( !strncmpiW( str->data, szEqv, len ) )
-+ rc = COND_EQV;
-+ else if( !strncmpiW( str->data, szImp, len ) )
-+ rc = COND_IMP;
-+ }
-+ else if( (len == 2) && !strncmpiW( str->data, szOr, len ) )
-+ rc = COND_OR;
-+ }
-+ else if( COND_IsNumber( ch ) )
-+ {
-+ while( COND_IsNumber( str->data[len] ) )
-+ len++;
-+ rc = COND_NUMBER;
-+ }
-+ else
-+ {
-+ ERR("Got unknown character %c(%x)\n",ch,ch);
-+ return COND_ERROR;
-+ }
-+
-+ cond->n += len;
-+ str->len = len;
-+
-+ return rc;
-+}
-+
-+static int cond_lex( void *COND_lval, COND_input *cond )
-+{
-+ int rc;
-+ struct cond_str *str = COND_lval;
-+
-+ do {
-+ rc = COND_GetOne( str, cond );
-+ } while (rc == COND_SPACE);
-+
-+ return rc;
-+}
-+
-+static LPWSTR COND_GetString( const struct cond_str *str )
-+{
-+ LPWSTR ret;
-+
-+ ret = msi_alloc( (str->len+1) * sizeof (WCHAR) );
-+ if( ret )
-+ {
-+ memcpy( ret, str->data, str->len * sizeof(WCHAR));
-+ ret[str->len]=0;
-+ }
-+ TRACE("Got identifier %s\n",debugstr_w(ret));
-+ return ret;
-+}
-+
-+static LPWSTR COND_GetLiteral( const struct cond_str *str )
-+{
-+ LPWSTR ret;
-+
-+ ret = msi_alloc( (str->len-1) * sizeof (WCHAR) );
-+ if( ret )
-+ {
-+ memcpy( ret, str->data+1, (str->len-2) * sizeof(WCHAR) );
-+ ret[str->len - 2]=0;
-+ }
-+ TRACE("Got literal %s\n",debugstr_w(ret));
-+ return ret;
-+}
-+
-+static int cond_error(const char *str)
-+{
-+ TRACE("%s\n", str );
-+ return 0;
-+}
-+
-+MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *package, LPCWSTR szCondition )
-+{
-+ COND_input cond;
-+ MSICONDITION r;
-+
-+ TRACE("%s\n", debugstr_w( szCondition ) );
-+
-+ if ( szCondition == NULL )
-+ return MSICONDITION_NONE;
-+
-+ cond.package = package;
-+ cond.str = szCondition;
-+ cond.n = 0;
-+ cond.result = MSICONDITION_ERROR;
-+
-+ if ( !cond_parse( &cond ) )
-+ r = cond.result;
-+ else
-+ r = MSICONDITION_ERROR;
-+
-+ TRACE("%i <- %s\n", r, debugstr_w(szCondition));
-+ return r;
-+}
-+
-+MSICONDITION WINAPI MsiEvaluateConditionW( MSIHANDLE hInstall, LPCWSTR szCondition )
-+{
-+ MSIPACKAGE *package;
-+ UINT ret;
-+
-+ package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
-+ if( !package )
-+ {
-+ HRESULT hr;
-+ BSTR condition;
-+ IWineMsiRemotePackage *remote_package;
-+
-+ remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall );
-+ if (!remote_package)
-+ return MSICONDITION_ERROR;
-+
-+ condition = SysAllocString( szCondition );
-+ if (!condition)
-+ {
-+ IWineMsiRemotePackage_Release( remote_package );
-+ return ERROR_OUTOFMEMORY;
-+ }
-+
-+ hr = IWineMsiRemotePackage_EvaluateCondition( remote_package, condition );
-+
-+ SysFreeString( condition );
-+ IWineMsiRemotePackage_Release( remote_package );
-+
-+ if (FAILED(hr))
-+ {
-+ if (HRESULT_FACILITY(hr) == FACILITY_WIN32)
-+ return HRESULT_CODE(hr);
-+
-+ return ERROR_FUNCTION_FAILED;
-+ }
-+
-+ return ERROR_SUCCESS;
-+ }
-+
-+ ret = MSI_EvaluateConditionW( package, szCondition );
-+ msiobj_release( &package->hdr );
-+ return ret;
-+}
-+
-+MSICONDITION WINAPI MsiEvaluateConditionA( MSIHANDLE hInstall, LPCSTR szCondition )
-+{
-+ LPWSTR szwCond = NULL;
-+ MSICONDITION r;
-+
-+ szwCond = strdupAtoW( szCondition );
-+ if( szCondition && !szwCond )
-+ return MSICONDITION_ERROR;
-+
-+ r = MsiEvaluateConditionW( hInstall, szwCond );
-+ msi_free( szwCond );
-+ return r;
-+}
-+
-Index: cond.tab.h
-===================================================================
---- cond.tab.h (revision 31639)
-+++ cond.tab.h (working copy)
-@@ -0,0 +1,132 @@
-+/* A Bison parser, made by GNU Bison 2.1. */
-+
-+/* Skeleton parser for Yacc-like parsing with Bison,
-+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2, or (at your option)
-+ any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
-+ Boston, MA 02110-1301, USA. */
-+
-+/* As a special exception, when this file is copied by Bison into a
-+ Bison output file, you may use that output file without restriction.
-+ This special exception was added by the Free Software Foundation
-+ in version 1.24 of Bison. */
-+
-+/* Tokens. */
-+#ifndef YYTOKENTYPE
-+# define YYTOKENTYPE
-+ /* Put the tokens into the symbol table, so that GDB and other debuggers
-+ know about them. */
-+ enum yytokentype {
-+ COND_SPACE = 258,
-+ COND_EOF = 259,
-+ COND_OR = 260,
-+ COND_AND = 261,
-+ COND_NOT = 262,
-+ COND_XOR = 263,
-+ COND_IMP = 264,
-+ COND_EQV = 265,
-+ COND_LT = 266,
-+ COND_GT = 267,
-+ COND_EQ = 268,
-+ COND_NE = 269,
-+ COND_GE = 270,
-+ COND_LE = 271,
-+ COND_ILT = 272,
-+ COND_IGT = 273,
-+ COND_IEQ = 274,
-+ COND_INE = 275,
-+ COND_IGE = 276,
-+ COND_ILE = 277,
-+ COND_LPAR = 278,
-+ COND_RPAR = 279,
-+ COND_TILDA = 280,
-+ COND_SS = 281,
-+ COND_ISS = 282,
-+ COND_ILHS = 283,
-+ COND_IRHS = 284,
-+ COND_LHS = 285,
-+ COND_RHS = 286,
-+ COND_PERCENT = 287,
-+ COND_DOLLARS = 288,
-+ COND_QUESTION = 289,
-+ COND_AMPER = 290,
-+ COND_EXCLAM = 291,
-+ COND_IDENT = 292,
-+ COND_NUMBER = 293,
-+ COND_LITER = 294,
-+ COND_ERROR = 295
-+ };
-+#endif
-+/* Tokens. */
-+#define COND_SPACE 258
-+#define COND_EOF 259
-+#define COND_OR 260
-+#define COND_AND 261
-+#define COND_NOT 262
-+#define COND_XOR 263
-+#define COND_IMP 264
-+#define COND_EQV 265
-+#define COND_LT 266
-+#define COND_GT 267
-+#define COND_EQ 268
-+#define COND_NE 269
-+#define COND_GE 270
-+#define COND_LE 271
-+#define COND_ILT 272
-+#define COND_IGT 273
-+#define COND_IEQ 274
-+#define COND_INE 275
-+#define COND_IGE 276
-+#define COND_ILE 277
-+#define COND_LPAR 278
-+#define COND_RPAR 279
-+#define COND_TILDA 280
-+#define COND_SS 281
-+#define COND_ISS 282
-+#define COND_ILHS 283
-+#define COND_IRHS 284
-+#define COND_LHS 285
-+#define COND_RHS 286
-+#define COND_PERCENT 287
-+#define COND_DOLLARS 288
-+#define COND_QUESTION 289
-+#define COND_AMPER 290
-+#define COND_EXCLAM 291
-+#define COND_IDENT 292
-+#define COND_NUMBER 293
-+#define COND_LITER 294
-+#define COND_ERROR 295
-+
-+
-+
-+
-+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-+#line 111 "cond.y"
-+typedef union YYSTYPE {
-+ struct cond_str str;
-+ LPWSTR string;
-+ INT value;
-+} YYSTYPE;
-+/* Line 1447 of yacc.c. */
-+#line 124 "cond.tab.h"
-+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-+# define YYSTYPE_IS_DECLARED 1
-+# define YYSTYPE_IS_TRIVIAL 1
-+#endif
-+
-+
-+
-+
-+
-Index: msi.rbuild
-===================================================================
---- msi.rbuild (revision 31639)
-+++ msi.rbuild (working copy)
-@@ -14,6 +14,7 @@
- appsearch.c
- automation.c
- classes.c
-+ cond.tab.c
- create.c
- custom.c
- database.c
-@@ -40,6 +41,7 @@
- script.c
- select.c
- source.c
-+ sql.tab.c
- streams.c
- string.c
- suminfo.c
-Index: msi_Ja.rc
-===================================================================
---- msi_Ja.rc (revision 31639)
-+++ msi_Ja.rc (working copy)
-@@ -0,0 +1,13 @@
-+LANGUAGE LANG_JAPANESE, SUBLANG_NEUTRAL
-+
-+STRINGTABLE DISCARDABLE
-+{
-+ 5 "pX %s ‚Ş‚Ý‚Â‚©‚č‚Ü‚ą‚ń‚Ĺ‚µ‚˝"
-+ 9 "fBXN %s ‚đ‘}“ü‚µ‚Ä‚‚ľ‚ł‚˘"
-+ 10 "–łŚř‚Čp‰[^‚Ĺ‚·"
-+ 11 "%s ‚Ě‚ ‚étH‹_‚đ“ü—Í‚µ‚Ä‚‚ľ‚ł‚˘"
-+ 12 "‹@”\\‚ĚC“Xg[‹Śł‚Ş‚ ‚č‚Ü‚ą‚ń"
-+ 13 "‹@”\\‚Ş‚ ‚élbgŹ[N h‰Cu‚Ş‚ ‚č‚Ü‚ą‚ń"
-+ 14 "‹@”\\‚̏ꏊ:"
-+ 15 "%s ‚Ě‚ ‚étH‹_‚đ‘I‘đ‚µ‚Ä‚‚ľ‚ł‚˘"
-+}
-Index: regsvr.c
-===================================================================
---- regsvr.c (revision 31639)
-+++ regsvr.c (working copy)
-@@ -40,6 +40,7 @@
- #include "msi.h"
- #include "initguid.h"
- #include "msipriv.h"
-+#include "msiserver.h"
-
- WINE_DEFAULT_DEBUG_CHANNEL(msi);
-
-Index: sql.tab.c
-===================================================================
---- sql.tab.c (revision 31639)
-+++ sql.tab.c (working copy)
-@@ -0,0 +1,2579 @@
-+/* A Bison parser, made by GNU Bison 2.1. */
-+
-+/* Skeleton parser for Yacc-like parsing with Bison,
-+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2, or (at your option)
-+ any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
-+ Boston, MA 02110-1301, USA. */
-+
-+/* As a special exception, when this file is copied by Bison into a
-+ Bison output file, you may use that output file without restriction.
-+ This special exception was added by the Free Software Foundation
-+ in version 1.24 of Bison. */
-+
-+/* Written by Richard Stallman by simplifying the original so called
-+ ``semantic'' parser. */
-+
-+/* All symbols defined below should begin with yy or YY, to avoid
-+ infringing on user name space. This should be done even for local
-+ variables, as they might otherwise be expanded by user macros.
-+ There are some unavoidable exceptions within include files to
-+ define necessary library symbols; they are noted "INFRINGES ON
-+ USER NAME SPACE" below. */
-+
-+/* Identify Bison output. */
-+#define YYBISON 1
-+
-+/* Bison version. */
-+#define YYBISON_VERSION "2.1"
-+
-+/* Skeleton name. */
-+#define YYSKELETON_NAME "yacc.c"
-+
-+/* Pure parsers. */
-+#define YYPURE 1
-+
-+/* Using locations. */
-+#define YYLSP_NEEDED 0
-+
-+/* Substitute the variable and function names. */
-+#define yyparse sql_parse
-+#define yylex sql_lex
-+#define yyerror sql_error
-+#define yylval sql_lval
-+#define yychar sql_char
-+#define yydebug sql_debug
-+#define yynerrs sql_nerrs
-+
-+
-+/* Tokens. */
-+#ifndef YYTOKENTYPE
-+# define YYTOKENTYPE
-+ /* Put the tokens into the symbol table, so that GDB and other debuggers
-+ know about them. */
-+ enum yytokentype {
-+ TK_ALTER = 258,
-+ TK_AND = 259,
-+ TK_BY = 260,
-+ TK_CHAR = 261,
-+ TK_COMMA = 262,
-+ TK_CREATE = 263,
-+ TK_DELETE = 264,
-+ TK_DISTINCT = 265,
-+ TK_DOT = 266,
-+ TK_EQ = 267,
-+ TK_FREE = 268,
-+ TK_FROM = 269,
-+ TK_GE = 270,
-+ TK_GT = 271,
-+ TK_HOLD = 272,
-+ TK_ADD = 273,
-+ TK_ID = 274,
-+ TK_ILLEGAL = 275,
-+ TK_INSERT = 276,
-+ TK_INT = 277,
-+ TK_INTEGER = 278,
-+ TK_INTO = 279,
-+ TK_IS = 280,
-+ TK_KEY = 281,
-+ TK_LE = 282,
-+ TK_LONG = 283,
-+ TK_LONGCHAR = 284,
-+ TK_LP = 285,
-+ TK_LT = 286,
-+ TK_LOCALIZABLE = 287,
-+ TK_MINUS = 288,
-+ TK_NE = 289,
-+ TK_NOT = 290,
-+ TK_NULL = 291,
-+ TK_OBJECT = 292,
-+ TK_OR = 293,
-+ TK_ORDER = 294,
-+ TK_PRIMARY = 295,
-+ TK_RP = 296,
-+ TK_SELECT = 297,
-+ TK_SET = 298,
-+ TK_SHORT = 299,
-+ TK_SPACE = 300,
-+ TK_STAR = 301,
-+ TK_STRING = 302,
-+ TK_TABLE = 303,
-+ TK_TEMPORARY = 304,
-+ TK_UPDATE = 305,
-+ TK_VALUES = 306,
-+ TK_WHERE = 307,
-+ TK_WILDCARD = 308,
-+ COLUMN = 310,
-+ FUNCTION = 311,
-+ COMMENT = 312,
-+ UNCLOSED_STRING = 313,
-+ SPACE = 314,
-+ ILLEGAL = 315,
-+ END_OF_FILE = 316,
-+ TK_LIKE = 317,
-+ TK_NEGATION = 318
-+ };
-+#endif
-+/* Tokens. */
-+#define TK_ALTER 258
-+#define TK_AND 259
-+#define TK_BY 260
-+#define TK_CHAR 261
-+#define TK_COMMA 262
-+#define TK_CREATE 263
-+#define TK_DELETE 264
-+#define TK_DISTINCT 265
-+#define TK_DOT 266
-+#define TK_EQ 267
-+#define TK_FREE 268
-+#define TK_FROM 269
-+#define TK_GE 270
-+#define TK_GT 271
-+#define TK_HOLD 272
-+#define TK_ADD 273
-+#define TK_ID 274
-+#define TK_ILLEGAL 275
-+#define TK_INSERT 276
-+#define TK_INT 277
-+#define TK_INTEGER 278
-+#define TK_INTO 279
-+#define TK_IS 280
-+#define TK_KEY 281
-+#define TK_LE 282
-+#define TK_LONG 283
-+#define TK_LONGCHAR 284
-+#define TK_LP 285
-+#define TK_LT 286
-+#define TK_LOCALIZABLE 287
-+#define TK_MINUS 288
-+#define TK_NE 289
-+#define TK_NOT 290
-+#define TK_NULL 291
-+#define TK_OBJECT 292
-+#define TK_OR 293
-+#define TK_ORDER 294
-+#define TK_PRIMARY 295
-+#define TK_RP 296
-+#define TK_SELECT 297
-+#define TK_SET 298
-+#define TK_SHORT 299
-+#define TK_SPACE 300
-+#define TK_STAR 301
-+#define TK_STRING 302
-+#define TK_TABLE 303
-+#define TK_TEMPORARY 304
-+#define TK_UPDATE 305
-+#define TK_VALUES 306
-+#define TK_WHERE 307
-+#define TK_WILDCARD 308
-+#define COLUMN 310
-+#define FUNCTION 311
-+#define COMMENT 312
-+#define UNCLOSED_STRING 313
-+#define SPACE 314
-+#define ILLEGAL 315
-+#define END_OF_FILE 316
-+#define TK_LIKE 317
-+#define TK_NEGATION 318
-+
-+
-+
-+
-+/* Copy the first part of user declarations. */
-+#line 1 "sql.y"
-+
-+
-+/*
-+ * Implementation of the Microsoft Installer (msi.dll)
-+ *
-+ * Copyright 2002-2004 Mike McCormack 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
-+
-+#include "windef.h"
-+#include "winbase.h"
-+#include "query.h"
-+#include "wine/list.h"
-+#include "wine/debug.h"
-+
-+#define YYLEX_PARAM info
-+#define YYPARSE_PARAM info
-+
-+static int sql_error(const char *str);
-+
-+WINE_DEFAULT_DEBUG_CHANNEL(msi);
-+
-+typedef struct tag_SQL_input
-+{
-+ MSIDATABASE *db;
-+ LPCWSTR command;
-+ DWORD n, len;
-+ MSIVIEW **view; /* view structure for the resulting query */
-+ struct list *mem;
-+} SQL_input;
-+
-+static LPWSTR SQL_getstring( void *info, const struct sql_str *str );
-+static INT SQL_getint( void *info );
-+static int sql_lex( void *SQL_lval, SQL_input *info );
-+
-+static LPWSTR parser_add_table( LPWSTR list, LPWSTR table );
-+static void *parser_alloc( void *info, unsigned int sz );
-+static column_info *parser_alloc_column( void *info, LPCWSTR table, LPCWSTR column );
-+
-+static BOOL SQL_MarkPrimaryKeys( column_info *cols, column_info *keys);
-+
-+static struct expr * EXPR_complex( void *info, struct expr *l, UINT op, struct expr *r );
-+static struct expr * EXPR_unary( void *info, struct expr *l, UINT op );
-+static struct expr * EXPR_column( void *info, const column_info *column );
-+static struct expr * EXPR_ival( void *info, int val );
-+static struct expr * EXPR_sval( void *info, const struct sql_str *str );
-+static struct expr * EXPR_wildcard( void *info );
-+
-+
-+
-+/* Enabling traces. */
-+#ifndef YYDEBUG
-+# define YYDEBUG 0
-+#endif
-+
-+/* Enabling verbose error messages. */
-+#ifdef YYERROR_VERBOSE
-+# undef YYERROR_VERBOSE
-+# define YYERROR_VERBOSE 1
-+#else
-+# define YYERROR_VERBOSE 0
-+#endif
-+
-+/* Enabling the token table. */
-+#ifndef YYTOKEN_TABLE
-+# define YYTOKEN_TABLE 0
-+#endif
-+
-+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-+#line 74 "sql.y"
-+typedef union YYSTYPE {
-+ struct sql_str str;
-+ LPWSTR string;
-+ column_info *column_list;
-+ MSIVIEW *query;
-+ struct expr *expr;
-+ USHORT column_type;
-+ int integer;
-+} YYSTYPE;
-+/* Line 196 of yacc.c. */
-+#line 297 "sql.tab.c"
-+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-+# define YYSTYPE_IS_DECLARED 1
-+# define YYSTYPE_IS_TRIVIAL 1
-+#endif
-+
-+
-+
-+/* Copy the second part of user declarations. */
-+
-+
-+/* Line 219 of yacc.c. */
-+#line 309 "sql.tab.c"
-+
-+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
-+# define YYSIZE_T __SIZE_TYPE__
-+#endif
-+#if ! defined (YYSIZE_T) && defined (size_t)
-+# define YYSIZE_T size_t
-+#endif
-+#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus))
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YYSIZE_T size_t
-+#endif
-+#if ! defined (YYSIZE_T)
-+# define YYSIZE_T unsigned int
-+#endif
-+
-+#ifndef YY_
-+# if YYENABLE_NLS
-+# if ENABLE_NLS
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YY_(msgid) dgettext ("bison-runtime", msgid)
-+# endif
-+# endif
-+# ifndef YY_
-+# define YY_(msgid) msgid
-+# endif
-+#endif
-+
-+#if ! defined (yyoverflow) || YYERROR_VERBOSE
-+
-+/* The parser invokes alloca or malloc; define the necessary symbols. */
-+
-+# ifdef YYSTACK_USE_ALLOCA
-+# if YYSTACK_USE_ALLOCA
-+# ifdef __GNUC__
-+# define YYSTACK_ALLOC __builtin_alloca
-+# else
-+# define YYSTACK_ALLOC alloca
-+# if defined (__STDC__) || defined (__cplusplus)
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YYINCLUDED_STDLIB_H
-+# endif
-+# endif
-+# endif
-+# endif
-+
-+# ifdef YYSTACK_ALLOC
-+ /* Pacify GCC's `empty if-body' warning. */
-+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
-+# ifndef YYSTACK_ALLOC_MAXIMUM
-+ /* The OS might guarantee only one guard page at the bottom of the stack,
-+ and a page size can be as small as 4096 bytes. So we cannot safely
-+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
-+ to allow for a few compiler-allocated temporary stack slots. */
-+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */
-+# endif
-+# else
-+# define YYSTACK_ALLOC YYMALLOC
-+# define YYSTACK_FREE YYFREE
-+# ifndef YYSTACK_ALLOC_MAXIMUM
-+# define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1)
-+# endif
-+# ifdef __cplusplus
-+extern "C" {
-+# endif
-+# ifndef YYMALLOC
-+# define YYMALLOC malloc
-+# if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \
-+ && (defined (__STDC__) || defined (__cplusplus)))
-+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-+# endif
-+# endif
-+# ifndef YYFREE
-+# define YYFREE free
-+# if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \
-+ && (defined (__STDC__) || defined (__cplusplus)))
-+void free (void *); /* INFRINGES ON USER NAME SPACE */
-+# endif
-+# endif
-+# ifdef __cplusplus
-+}
-+# endif
-+# endif
-+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
-+
-+
-+#if (! defined (yyoverflow) \
-+ && (! defined (__cplusplus) \
-+ || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
-+
-+/* A type that is properly aligned for any stack member. */
-+union yyalloc
-+{
-+ short int yyss;
-+ YYSTYPE yyvs;
-+ };
-+
-+/* The size of the maximum gap between one aligned stack and the next. */
-+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-+
-+/* The size of an array large to enough to hold all stacks, each with
-+ N elements. */
-+# define YYSTACK_BYTES(N) \
-+ ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \
-+ + YYSTACK_GAP_MAXIMUM)
-+
-+/* Copy COUNT objects from FROM to TO. The source and destination do
-+ not overlap. */
-+# ifndef YYCOPY
-+# if defined (__GNUC__) && 1 < __GNUC__
-+# define YYCOPY(To, From, Count) \
-+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-+# else
-+# define YYCOPY(To, From, Count) \
-+ do \
-+ { \
-+ YYSIZE_T yyi; \
-+ for (yyi = 0; yyi < (Count); yyi++) \
-+ (To)[yyi] = (From)[yyi]; \
-+ } \
-+ while (0)
-+# endif
-+# endif
-+
-+/* Relocate STACK from its old location to the new one. The
-+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
-+ elements in the stack, and YYPTR gives the new location of the
-+ stack. Advance YYPTR to a properly aligned location for the next
-+ stack. */
-+# define YYSTACK_RELOCATE(Stack) \
-+ do \
-+ { \
-+ YYSIZE_T yynewbytes; \
-+ YYCOPY (&yyptr->Stack, Stack, yysize); \
-+ Stack = &yyptr->Stack; \
-+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-+ yyptr += yynewbytes / sizeof (*yyptr); \
-+ } \
-+ while (0)
-+
-+#endif
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+ typedef signed char yysigned_char;
-+#else
-+ typedef short int yysigned_char;
-+#endif
-+
-+/* YYFINAL -- State number of the termination state. */
-+#define YYFINAL 32
-+/* YYLAST -- Last index in YYTABLE. */
-+#define YYLAST 138
-+
-+/* YYNTOKENS -- Number of terminals. */
-+#define YYNTOKENS 64
-+/* YYNNTS -- Number of nonterminals. */
-+#define YYNNTS 34
-+/* YYNRULES -- Number of rules. */
-+#define YYNRULES 79
-+/* YYNRULES -- Number of states. */
-+#define YYNSTATES 141
-+
-+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
-+#define YYUNDEFTOK 2
-+#define YYMAXUTOK 318
-+
-+#define YYTRANSLATE(YYX) \
-+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-+
-+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
-+static const unsigned char yytranslate[] =
-+{
-+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
-+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
-+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
-+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
-+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
-+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
-+ 55, 56, 57, 58, 59, 60, 61, 62, 63
-+};
-+
-+#if YYDEBUG
-+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
-+ YYRHS. */
-+static const unsigned short int yyprhs[] =
-+{
-+ 0, 0, 3, 5, 7, 9, 11, 13, 15, 17,
-+ 28, 40, 47, 55, 62, 67, 70, 75, 81, 88,
-+ 90, 92, 97, 101, 103, 106, 108, 111, 114, 116,
-+ 120, 122, 127, 129, 131, 133, 135, 137, 139, 144,
-+ 146, 149, 153, 156, 158, 162, 164, 166, 170, 173,
-+ 176, 178, 182, 186, 190, 194, 198, 202, 206, 210,
-+ 214, 218, 222, 227, 229, 231, 233, 237, 239, 243,
-+ 247, 249, 252, 254, 256, 258, 262, 264, 266, 268
-+};
-+
-+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-+static const yysigned_char yyrhs[] =
-+{
-+ 65, 0, -1, 66, -1, 80, -1, 68, -1, 67,
-+ -1, 69, -1, 70, -1, 71, -1, 21, 24, 95,
-+ 30, 83, 41, 51, 30, 89, 41, -1, 21, 24,
-+ 95, 30, 83, 41, 51, 30, 89, 41, 49, -1,
-+ 8, 48, 95, 30, 73, 41, -1, 8, 48, 95,
-+ 30, 73, 41, 17, -1, 50, 95, 43, 90, 52,
-+ 87, -1, 50, 95, 43, 90, -1, 9, 84, -1,
-+ 3, 48, 95, 72, -1, 3, 48, 95, 18, 75,
-+ -1, 3, 48, 95, 18, 75, 17, -1, 17, -1,
-+ 13, -1, 74, 40, 26, 83, -1, 74, 7, 75,
-+ -1, 75, -1, 94, 76, -1, 77, -1, 77, 32,
-+ -1, 77, 49, -1, 78, -1, 78, 35, 36, -1,
-+ 6, -1, 6, 30, 79, 41, -1, 29, -1, 44,
-+ -1, 22, -1, 28, -1, 37, -1, 97, -1, 81,
-+ 39, 5, 83, -1, 81, -1, 42, 82, -1, 42,
-+ 10, 82, -1, 83, 84, -1, 94, -1, 94, 7,
-+ 83, -1, 46, -1, 85, -1, 85, 52, 87, -1,
-+ 14, 95, -1, 14, 86, -1, 95, -1, 95, 7,
-+ 86, -1, 30, 87, 41, -1, 87, 4, 87, -1,
-+ 87, 38, 87, -1, 93, 12, 88, -1, 93, 16,
-+ 88, -1, 93, 31, 88, -1, 93, 27, 88, -1,
-+ 93, 15, 88, -1, 93, 34, 88, -1, 93, 25,
-+ 36, -1, 93, 25, 35, 36, -1, 93, -1, 92,
-+ -1, 92, -1, 92, 7, 89, -1, 91, -1, 91,
-+ 7, 90, -1, 94, 12, 92, -1, 97, -1, 33,
-+ 97, -1, 47, -1, 53, -1, 94, -1, 95, 11,
-+ 96, -1, 96, -1, 96, -1, 19, -1, 23, -1
-+};
-+
-+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
-+static const unsigned short int yyrline[] =
-+{
-+ 0, 124, 124, 132, 133, 134, 135, 136, 137, 141,
-+ 151, 164, 176, 191, 201, 214, 227, 237, 247, 260,
-+ 264, 271, 281, 291, 298, 307, 311, 315, 322, 326,
-+ 333, 337, 341, 345, 349, 353, 357, 364, 373, 386,
-+ 390, 394, 410, 431, 432, 436, 443, 444, 460, 470,
-+ 483, 488, 497, 503, 509, 515, 521, 527, 533, 539,
-+ 545, 551, 557, 566, 567, 571, 578, 589, 590, 598,
-+ 606, 612, 618, 624, 633, 642, 648, 657, 664, 673
-+};
-+#endif
-+
-+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
-+static const char *const yytname[] =
-+{
-+ "$end", "error", "$undefined", "TK_ALTER", "TK_AND", "TK_BY", "TK_CHAR",
-+ "TK_COMMA", "TK_CREATE", "TK_DELETE", "TK_DISTINCT", "TK_DOT", "TK_EQ",
-+ "TK_FREE", "TK_FROM", "TK_GE", "TK_GT", "TK_HOLD", "TK_ADD", "TK_ID",
-+ "TK_ILLEGAL", "TK_INSERT", "TK_INT", "TK_INTEGER", "TK_INTO", "TK_IS",
-+ "TK_KEY", "TK_LE", "TK_LONG", "TK_LONGCHAR", "TK_LP", "TK_LT",
-+ "TK_LOCALIZABLE", "TK_MINUS", "TK_NE", "TK_NOT", "TK_NULL", "TK_OBJECT",
-+ "TK_OR", "TK_ORDER", "TK_PRIMARY", "TK_RP", "TK_SELECT", "TK_SET",
-+ "TK_SHORT", "TK_SPACE", "TK_STAR", "TK_STRING", "TK_TABLE",
-+ "TK_TEMPORARY", "TK_UPDATE", "TK_VALUES", "TK_WHERE", "TK_WILDCARD",
-+ "AGG_FUNCTION.", "COLUMN", "FUNCTION", "COMMENT", "UNCLOSED_STRING",
-+ "SPACE", "ILLEGAL", "END_OF_FILE", "TK_LIKE", "TK_NEGATION", "$accept",
-+ "query", "onequery", "oneinsert", "onecreate", "oneupdate", "onedelete",
-+ "onealter", "alterop", "table_def", "column_def", "column_and_type",
-+ "column_type", "data_type_l", "data_type", "data_count", "oneselect",
-+ "unorderedsel", "selectfrom", "selcollist", "from", "fromtable",
-+ "tablelist", "expr", "val", "constlist", "update_assign_list",
-+ "column_assignment", "const_val", "column_val", "column", "table", "id",
-+ "number", 0
-+};
-+#endif
-+
-+# ifdef YYPRINT
-+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
-+ token YYLEX-NUM. */
-+static const unsigned short int yytoknum[] =
-+{
-+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
-+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
-+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
-+ 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
-+ 295, 296, 297, 298, 299, 300, 301, 302, 303, 304,
-+ 305, 306, 307, 308, 309, 310, 311, 312, 313, 314,
-+ 315, 316, 317, 318
-+};
-+# endif
-+
-+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-+static const unsigned char yyr1[] =
-+{
-+ 0, 64, 65, 66, 66, 66, 66, 66, 66, 67,
-+ 67, 68, 68, 69, 69, 70, 71, 71, 71, 72,
-+ 72, 73, 74, 74, 75, 76, 76, 76, 77, 77,
-+ 78, 78, 78, 78, 78, 78, 78, 79, 80, 80,
-+ 81, 81, 82, 83, 83, 83, 84, 84, 85, 85,
-+ 86, 86, 87, 87, 87, 87, 87, 87, 87, 87,
-+ 87, 87, 87, 88, 88, 89, 89, 90, 90, 91,
-+ 92, 92, 92, 92, 93, 94, 94, 95, 96, 97
-+};
-+
-+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
-+static const unsigned char yyr2[] =
-+{
-+ 0, 2, 1, 1, 1, 1, 1, 1, 1, 10,
-+ 11, 6, 7, 6, 4, 2, 4, 5, 6, 1,
-+ 1, 4, 3, 1, 2, 1, 2, 2, 1, 3,
-+ 1, 4, 1, 1, 1, 1, 1, 1, 4, 1,
-+ 2, 3, 2, 1, 3, 1, 1, 3, 2, 2,
-+ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-+ 3, 3, 4, 1, 1, 1, 3, 1, 3, 3,
-+ 1, 2, 1, 1, 1, 3, 1, 1, 1, 1
-+};
-+
-+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
-+ STATE-NUM when YYTABLE doesn't specify something else to do. Zero
-+ means the default is an error. */
-+static const unsigned char yydefact[] =
-+{
-+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 5,
-+ 4, 6, 7, 8, 3, 39, 0, 0, 0, 15,
-+ 46, 0, 0, 78, 45, 40, 0, 43, 0, 76,
-+ 0, 77, 1, 0, 0, 0, 49, 48, 0, 0,
-+ 41, 42, 0, 0, 0, 0, 20, 19, 0, 16,
-+ 0, 0, 0, 47, 0, 74, 0, 44, 75, 14,
-+ 67, 0, 38, 17, 0, 0, 0, 23, 51, 50,
-+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 18, 30, 34, 35, 32, 36,
-+ 33, 24, 25, 28, 11, 0, 0, 52, 53, 54,
-+ 79, 0, 72, 73, 55, 64, 63, 70, 59, 56,
-+ 0, 61, 58, 57, 60, 0, 13, 68, 69, 0,
-+ 26, 27, 0, 12, 22, 0, 71, 62, 0, 0,
-+ 37, 29, 21, 0, 31, 0, 65, 9, 0, 10,
-+ 66
-+};
-+
-+/* YYDEFGOTO[NTERM-NUM]. */
-+static const short int yydefgoto[] =
-+{
-+ -1, 7, 8, 9, 10, 11, 12, 13, 49, 65,
-+ 66, 63, 91, 92, 93, 129, 14, 15, 25, 26,
-+ 19, 20, 36, 53, 104, 135, 59, 60, 105, 106,
-+ 55, 28, 29, 107
-+};
-+
-+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-+ STATE-NUM. */
-+#define YYPACT_NINF -96
-+static const yysigned_char yypact[] =
-+{
-+ 0, -43, -34, 4, 24, 1, 6, 19, -96, -96,
-+ -96, -96, -96, -96, -96, 31, 6, 6, 6, -96,
-+ 30, 6, 35, -96, -96, -96, 4, 67, 47, 65,
-+ 42, -96, -96, 81, 101, 59, -96, 89, 48, 68,
-+ -96, -96, 35, 6, 6, 35, -96, -96, 6, -96,
-+ 6, 6, 48, 3, 76, -96, 35, -96, -96, 45,
-+ 95, 93, -96, 98, 43, 75, 22, -96, -96, 89,
-+ 18, 48, 48, 13, 13, 13, -23, 13, 13, 13,
-+ 80, 48, 6, 46, -96, 87, -96, -96, -96, -96,
-+ -96, -96, 51, 71, 105, 6, 97, -96, -96, 120,
-+ -96, 102, -96, -96, -96, -96, -96, -96, -96, -96,
-+ 90, -96, -96, -96, -96, 77, 3, -96, -96, 102,
-+ -96, -96, 91, -96, -96, 35, -96, -96, 99, 92,
-+ -96, -96, -96, 46, -96, 94, 123, 82, 46, -96,
-+ -96
-+};
-+
-+/* YYPGOTO[NTERM-NUM]. */
-+static const yysigned_char yypgoto[] =
-+{
-+ -96, -96, -96, -96, -96, -96, -96, -96, -96, -96,
-+ -96, -40, -96, -96, -96, -96, -96, -96, 110, -41,
-+ 108, -96, 85, 23, 34, -1, 56, -96, -81, -8,
-+ -5, 17, 10, -95
-+};
-+
-+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
-+ positive, shift that token. If negative, reduce the rule which
-+ number is the opposite. If zero, do what YYDEFACT says.
-+ If YYTABLE_NINF, syntax error. */
-+#define YYTABLE_NINF -78
-+static const short int yytable[] =
-+{
-+ 27, 57, 118, 1, 62, 16, 126, 71, 2, 3,
-+ 67, 22, 110, 111, 17, 80, 31, 27, 18, 32,
-+ 23, 4, 71, 30, 130, 23, 31, 31, 31, 95,
-+ 54, 31, 23, 34, 35, 37, 100, 27, 39, 61,
-+ 27, 72, 5, 64, 54, 64, 101, 24, 21, 85,
-+ 6, 27, 136, 58, 23, 124, 72, 136, 43, 97,
-+ 102, 31, 96, 54, 54, 86, 103, 23, 69, 100,
-+ 33, 87, 88, 54, 42, 70, -77, 61, 52, 101,
-+ 89, 24, 38, 120, 132, 44, 45, 90, 73, 50,
-+ 64, 74, 75, 102, 98, 99, 51, 81, 56, 103,
-+ 121, 76, 82, 77, 116, 83, 122, 78, 108, 109,
-+ 79, 112, 113, 114, 46, 84, 94, 119, 47, 48,
-+ 27, 115, 123, 125, 71, 100, 127, 131, 128, 133,
-+ 138, 139, 40, 134, 41, 137, 68, 140, 117
-+};
-+
-+static const unsigned char yycheck[] =
-+{
-+ 5, 42, 83, 3, 45, 48, 101, 4, 8, 9,
-+ 50, 10, 35, 36, 48, 56, 6, 22, 14, 0,
-+ 19, 21, 4, 6, 119, 19, 16, 17, 18, 7,
-+ 38, 21, 19, 16, 17, 18, 23, 42, 21, 44,
-+ 45, 38, 42, 48, 52, 50, 33, 46, 24, 6,
-+ 50, 56, 133, 43, 19, 95, 38, 138, 11, 41,
-+ 47, 51, 40, 71, 72, 22, 53, 19, 51, 23,
-+ 39, 28, 29, 81, 7, 52, 11, 82, 30, 33,
-+ 37, 46, 52, 32, 125, 43, 5, 44, 12, 30,
-+ 95, 15, 16, 47, 71, 72, 7, 52, 30, 53,
-+ 49, 25, 7, 27, 81, 12, 35, 31, 74, 75,
-+ 34, 77, 78, 79, 13, 17, 41, 30, 17, 18,
-+ 125, 41, 17, 26, 4, 23, 36, 36, 51, 30,
-+ 7, 49, 22, 41, 26, 41, 51, 138, 82
-+};
-+
-+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-+ symbol of state STATE-NUM. */
-+static const unsigned char yystos[] =
-+{
-+ 0, 3, 8, 9, 21, 42, 50, 65, 66, 67,
-+ 68, 69, 70, 71, 80, 81, 48, 48, 14, 84,
-+ 85, 24, 10, 19, 46, 82, 83, 94, 95, 96,
-+ 95, 96, 0, 39, 95, 95, 86, 95, 52, 95,
-+ 82, 84, 7, 11, 43, 5, 13, 17, 18, 72,
-+ 30, 7, 30, 87, 93, 94, 30, 83, 96, 90,
-+ 91, 94, 83, 75, 94, 73, 74, 75, 86, 95,
-+ 87, 4, 38, 12, 15, 16, 25, 27, 31, 34,
-+ 83, 52, 7, 12, 17, 6, 22, 28, 29, 37,
-+ 44, 76, 77, 78, 41, 7, 40, 41, 87, 87,
-+ 23, 33, 47, 53, 88, 92, 93, 97, 88, 88,
-+ 35, 36, 88, 88, 88, 41, 87, 90, 92, 30,
-+ 32, 49, 35, 17, 75, 26, 97, 36, 51, 79,
-+ 97, 36, 83, 30, 41, 89, 92, 41, 7, 49,
-+ 89
-+};
-+
-+#define yyerrok (yyerrstatus = 0)
-+#define yyclearin (yychar = YYEMPTY)
-+#define YYEMPTY (-2)
-+#define YYEOF 0
-+
-+#define YYACCEPT goto yyacceptlab
-+#define YYABORT goto yyabortlab
-+#define YYERROR goto yyerrorlab
-+
-+
-+/* Like YYERROR except do call yyerror. This remains here temporarily
-+ to ease the transition to the new meaning of YYERROR, for GCC.
-+ Once GCC version 2 has supplanted version 1, this can go. */
-+
-+#define YYFAIL goto yyerrlab
-+
-+#define YYRECOVERING() (!!yyerrstatus)
-+
-+#define YYBACKUP(Token, Value) \
-+do \
-+ if (yychar == YYEMPTY && yylen == 1) \
-+ { \
-+ yychar = (Token); \
-+ yylval = (Value); \
-+ yytoken = YYTRANSLATE (yychar); \
-+ YYPOPSTACK; \
-+ goto yybackup; \
-+ } \
-+ else \
-+ { \
-+ yyerror (YY_("syntax error: cannot back up")); \
-+ YYERROR; \
-+ } \
-+while (0)
-+
-+
-+#define YYTERROR 1
-+#define YYERRCODE 256
-+
-+
-+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-+ If N is 0, then set CURRENT to the empty location which ends
-+ the previous symbol: RHS[0] (always defined). */
-+
-+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-+#ifndef YYLLOC_DEFAULT
-+# define YYLLOC_DEFAULT(Current, Rhs, N) \
-+ do \
-+ if (N) \
-+ { \
-+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
-+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
-+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
-+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
-+ } \
-+ else \
-+ { \
-+ (Current).first_line = (Current).last_line = \
-+ YYRHSLOC (Rhs, 0).last_line; \
-+ (Current).first_column = (Current).last_column = \
-+ YYRHSLOC (Rhs, 0).last_column; \
-+ } \
-+ while (0)
-+#endif
-+
-+
-+/* YY_LOCATION_PRINT -- Print the location on the stream.
-+ This macro was not mandated originally: define only if we know
-+ we won't break user code: when these are the locations we know. */
-+
-+#ifndef YY_LOCATION_PRINT
-+# if YYLTYPE_IS_TRIVIAL
-+# define YY_LOCATION_PRINT(File, Loc) \
-+ fprintf (File, "%d.%d-%d.%d", \
-+ (Loc).first_line, (Loc).first_column, \
-+ (Loc).last_line, (Loc).last_column)
-+# else
-+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-+# endif
-+#endif
-+
-+
-+/* YYLEX -- calling `yylex' with the right arguments. */
-+
-+#ifdef YYLEX_PARAM
-+# define YYLEX yylex (&yylval, YYLEX_PARAM)
-+#else
-+# define YYLEX yylex (&yylval)
-+#endif
-+
-+/* Enable debugging if requested. */
-+#if YYDEBUG
-+
-+# ifndef YYFPRINTF
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YYFPRINTF fprintf
-+# endif
-+
-+# define YYDPRINTF(Args) \
-+do { \
-+ if (yydebug) \
-+ YYFPRINTF Args; \
-+} while (0)
-+
-+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
-+do { \
-+ if (yydebug) \
-+ { \
-+ YYFPRINTF (stderr, "%s ", Title); \
-+ yysymprint (stderr, \
-+ Type, Value); \
-+ YYFPRINTF (stderr, "\n"); \
-+ } \
-+} while (0)
-+
-+/*------------------------------------------------------------------.
-+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-+| TOP (included). |
-+`------------------------------------------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yy_stack_print (short int *bottom, short int *top)
-+#else
-+static void
-+yy_stack_print (bottom, top)
-+ short int *bottom;
-+ short int *top;
-+#endif
-+{
-+ YYFPRINTF (stderr, "Stack now");
-+ for (/* Nothing. */; bottom <= top; ++bottom)
-+ YYFPRINTF (stderr, " %d", *bottom);
-+ YYFPRINTF (stderr, "\n");
-+}
-+
-+# define YY_STACK_PRINT(Bottom, Top) \
-+do { \
-+ if (yydebug) \
-+ yy_stack_print ((Bottom), (Top)); \
-+} while (0)
-+
-+
-+/*------------------------------------------------.
-+| Report that the YYRULE is going to be reduced. |
-+`------------------------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yy_reduce_print (int yyrule)
-+#else
-+static void
-+yy_reduce_print (yyrule)
-+ int yyrule;
-+#endif
-+{
-+ int yyi;
-+ unsigned long int yylno = yyrline[yyrule];
-+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ",
-+ yyrule - 1, yylno);
-+ /* Print the symbols being reduced, and their result. */
-+ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
-+ YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
-+ YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]);
-+}
-+
-+# define YY_REDUCE_PRINT(Rule) \
-+do { \
-+ if (yydebug) \
-+ yy_reduce_print (Rule); \
-+} while (0)
-+
-+/* Nonzero means print parse trace. It is left uninitialized so that
-+ multiple parsers can coexist. */
-+int yydebug;
-+#else /* !YYDEBUG */
-+# define YYDPRINTF(Args)
-+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-+# define YY_STACK_PRINT(Bottom, Top)
-+# define YY_REDUCE_PRINT(Rule)
-+#endif /* !YYDEBUG */
-+
-+
-+/* YYINITDEPTH -- initial size of the parser's stacks. */
-+#ifndef YYINITDEPTH
-+# define YYINITDEPTH 200
-+#endif
-+
-+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
-+ if the built-in stack extension method is used).
-+
-+ Do not make this value too large; the results are undefined if
-+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
-+ evaluated with infinite-precision integer arithmetic. */
-+
-+#ifndef YYMAXDEPTH
-+# define YYMAXDEPTH 10000
-+#endif
-+
-+
-+
-+#if YYERROR_VERBOSE
-+
-+# ifndef yystrlen
-+# if defined (__GLIBC__) && defined (_STRING_H)
-+# define yystrlen strlen
-+# else
-+/* Return the length of YYSTR. */
-+static YYSIZE_T
-+# if defined (__STDC__) || defined (__cplusplus)
-+yystrlen (const char *yystr)
-+# else
-+yystrlen (yystr)
-+ const char *yystr;
-+# endif
-+{
-+ const char *yys = yystr;
-+
-+ while (*yys++ != '\0')
-+ continue;
-+
-+ return yys - yystr - 1;
-+}
-+# endif
-+# endif
-+
-+# ifndef yystpcpy
-+# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
-+# define yystpcpy stpcpy
-+# else
-+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
-+ YYDEST. */
-+static char *
-+# if defined (__STDC__) || defined (__cplusplus)
-+yystpcpy (char *yydest, const char *yysrc)
-+# else
-+yystpcpy (yydest, yysrc)
-+ char *yydest;
-+ const char *yysrc;
-+# endif
-+{
-+ char *yyd = yydest;
-+ const char *yys = yysrc;
-+
-+ while ((*yyd++ = *yys++) != '\0')
-+ continue;
-+
-+ return yyd - 1;
-+}
-+# endif
-+# endif
-+
-+# ifndef yytnamerr
-+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
-+ quotes and backslashes, so that it's suitable for yyerror. The
-+ heuristic is that double-quoting is unnecessary unless the string
-+ contains an apostrophe, a comma, or backslash (other than
-+ backslash-backslash). YYSTR is taken from yytname. If YYRES is
-+ null, do not copy; instead, return the length of what the result
-+ would have been. */
-+static YYSIZE_T
-+yytnamerr (char *yyres, const char *yystr)
-+{
-+ if (*yystr == '"')
-+ {
-+ size_t yyn = 0;
-+ char const *yyp = yystr;
-+
-+ for (;;)
-+ switch (*++yyp)
-+ {
-+ case '\'':
-+ case ',':
-+ goto do_not_strip_quotes;
-+
-+ case '\\':
-+ if (*++yyp != '\\')
-+ goto do_not_strip_quotes;
-+ /* Fall through. */
-+ default:
-+ if (yyres)
-+ yyres[yyn] = *yyp;
-+ yyn++;
-+ break;
-+
-+ case '"':
-+ if (yyres)
-+ yyres[yyn] = '\0';
-+ return yyn;
-+ }
-+ do_not_strip_quotes: ;
-+ }
-+
-+ if (! yyres)
-+ return yystrlen (yystr);
-+
-+ return yystpcpy (yyres, yystr) - yyres;
-+}
-+# endif
-+
-+#endif /* YYERROR_VERBOSE */
-+
-+
-+
-+#if YYDEBUG
-+/*--------------------------------.
-+| Print this symbol on YYOUTPUT. |
-+`--------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
-+#else
-+static void
-+yysymprint (yyoutput, yytype, yyvaluep)
-+ FILE *yyoutput;
-+ int yytype;
-+ YYSTYPE *yyvaluep;
-+#endif
-+{
-+ /* Pacify ``unused variable'' warnings. */
-+ (void) yyvaluep;
-+
-+ if (yytype < YYNTOKENS)
-+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-+ else
-+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-+
-+
-+# ifdef YYPRINT
-+ if (yytype < YYNTOKENS)
-+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-+# endif
-+ switch (yytype)
-+ {
-+ default:
-+ break;
-+ }
-+ YYFPRINTF (yyoutput, ")");
-+}
-+
-+#endif /* ! YYDEBUG */
-+/*-----------------------------------------------.
-+| Release the memory associated to this symbol. |
-+`-----------------------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
-+#else
-+static void
-+yydestruct (yymsg, yytype, yyvaluep)
-+ const char *yymsg;
-+ int yytype;
-+ YYSTYPE *yyvaluep;
-+#endif
-+{
-+ /* Pacify ``unused variable'' warnings. */
-+ (void) yyvaluep;
-+
-+ if (!yymsg)
-+ yymsg = "Deleting";
-+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-+
-+ switch (yytype)
-+ {
-+
-+ default:
-+ break;
-+ }
-+}
-+
-+
-+/* Prevent warnings from -Wmissing-prototypes. */
-+
-+#ifdef YYPARSE_PARAM
-+# if defined (__STDC__) || defined (__cplusplus)
-+int yyparse (void *YYPARSE_PARAM);
-+# else
-+int yyparse ();
-+# endif
-+#else /* ! YYPARSE_PARAM */
-+#if defined (__STDC__) || defined (__cplusplus)
-+int yyparse (void);
-+#else
-+int yyparse ();
-+#endif
-+#endif /* ! YYPARSE_PARAM */
-+
-+
-+
-+
-+
-+
-+/*----------.
-+| yyparse. |
-+`----------*/
-+
-+#ifdef YYPARSE_PARAM
-+# if defined (__STDC__) || defined (__cplusplus)
-+int yyparse (void *YYPARSE_PARAM)
-+# else
-+int yyparse (YYPARSE_PARAM)
-+ void *YYPARSE_PARAM;
-+# endif
-+#else /* ! YYPARSE_PARAM */
-+#if defined (__STDC__) || defined (__cplusplus)
-+int
-+yyparse (void)
-+#else
-+int
-+yyparse ()
-+ ;
-+#endif
-+#endif
-+{
-+ /* The look-ahead symbol. */
-+int yychar;
-+
-+/* The semantic value of the look-ahead symbol. */
-+YYSTYPE yylval;
-+
-+/* Number of syntax errors so far. */
-+int yynerrs;
-+
-+ int yystate;
-+ int yyn;
-+ int yyresult;
-+ /* Number of tokens to shift before error messages enabled. */
-+ int yyerrstatus;
-+ /* Look-ahead token as an internal (translated) token number. */
-+ int yytoken = 0;
-+
-+ /* Three stacks and their tools:
-+ `yyss': related to states,
-+ `yyvs': related to semantic values,
-+ `yyls': related to locations.
-+
-+ Refer to the stacks thru separate pointers, to allow yyoverflow
-+ to reallocate them elsewhere. */
-+
-+ /* The state stack. */
-+ short int yyssa[YYINITDEPTH];
-+ short int *yyss = yyssa;
-+ short int *yyssp;
-+
-+ /* The semantic value stack. */
-+ YYSTYPE yyvsa[YYINITDEPTH];
-+ YYSTYPE *yyvs = yyvsa;
-+ YYSTYPE *yyvsp;
-+
-+
-+
-+#define YYPOPSTACK (yyvsp--, yyssp--)
-+
-+ YYSIZE_T yystacksize = YYINITDEPTH;
-+
-+ /* The variables used to return semantic value and location from the
-+ action routines. */
-+ YYSTYPE yyval;
-+
-+
-+ /* When reducing, the number of symbols on the RHS of the reduced
-+ rule. */
-+ int yylen;
-+
-+ YYDPRINTF ((stderr, "Starting parse\n"));
-+
-+ yystate = 0;
-+ yyerrstatus = 0;
-+ yynerrs = 0;
-+ yychar = YYEMPTY; /* Cause a token to be read. */
-+
-+ /* Initialize stack pointers.
-+ Waste one element of value and location stack
-+ so that they stay on the same level as the state stack.
-+ The wasted elements are never initialized. */
-+
-+ yyssp = yyss;
-+ yyvsp = yyvs;
-+
-+ goto yysetstate;
-+
-+/*------------------------------------------------------------.
-+| yynewstate -- Push a new state, which is found in yystate. |
-+`------------------------------------------------------------*/
-+ yynewstate:
-+ /* In all cases, when you get here, the value and location stacks
-+ have just been pushed. so pushing a state here evens the stacks.
-+ */
-+ yyssp++;
-+
-+ yysetstate:
-+ *yyssp = yystate;
-+
-+ if (yyss + yystacksize - 1 <= yyssp)
-+ {
-+ /* Get the current used size of the three stacks, in elements. */
-+ YYSIZE_T yysize = yyssp - yyss + 1;
-+
-+#ifdef yyoverflow
-+ {
-+ /* Give user a chance to reallocate the stack. Use copies of
-+ these so that the &'s don't force the real ones into
-+ memory. */
-+ YYSTYPE *yyvs1 = yyvs;
-+ short int *yyss1 = yyss;
-+
-+
-+ /* Each stack pointer address is followed by the size of the
-+ data in use in that stack, in bytes. This used to be a
-+ conditional around just the two extra args, but that might
-+ be undefined if yyoverflow is a macro. */
-+ yyoverflow (YY_("memory exhausted"),
-+ &yyss1, yysize * sizeof (*yyssp),
-+ &yyvs1, yysize * sizeof (*yyvsp),
-+
-+ &yystacksize);
-+
-+ yyss = yyss1;
-+ yyvs = yyvs1;
-+ }
-+#else /* no yyoverflow */
-+# ifndef YYSTACK_RELOCATE
-+ goto yyexhaustedlab;
-+# else
-+ /* Extend the stack our own way. */
-+ if (YYMAXDEPTH <= yystacksize)
-+ goto yyexhaustedlab;
-+ yystacksize *= 2;
-+ if (YYMAXDEPTH < yystacksize)
-+ yystacksize = YYMAXDEPTH;
-+
-+ {
-+ short int *yyss1 = yyss;
-+ union yyalloc *yyptr =
-+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
-+ if (! yyptr)
-+ goto yyexhaustedlab;
-+ YYSTACK_RELOCATE (yyss);
-+ YYSTACK_RELOCATE (yyvs);
-+
-+# undef YYSTACK_RELOCATE
-+ if (yyss1 != yyssa)
-+ YYSTACK_FREE (yyss1);
-+ }
-+# endif
-+#endif /* no yyoverflow */
-+
-+ yyssp = yyss + yysize - 1;
-+ yyvsp = yyvs + yysize - 1;
-+
-+
-+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-+ (unsigned long int) yystacksize));
-+
-+ if (yyss + yystacksize - 1 <= yyssp)
-+ YYABORT;
-+ }
-+
-+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-+
-+ goto yybackup;
-+
-+/*-----------.
-+| yybackup. |
-+`-----------*/
-+yybackup:
-+
-+/* Do appropriate processing given the current state. */
-+/* Read a look-ahead token if we need one and don't already have one. */
-+/* yyresume: */
-+
-+ /* First try to decide what to do without reference to look-ahead token. */
-+
-+ yyn = yypact[yystate];
-+ if (yyn == YYPACT_NINF)
-+ goto yydefault;
-+
-+ /* Not known => get a look-ahead token if don't already have one. */
-+
-+ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
-+ if (yychar == YYEMPTY)
-+ {
-+ YYDPRINTF ((stderr, "Reading a token: "));
-+ yychar = YYLEX;
-+ }
-+
-+ if (yychar <= YYEOF)
-+ {
-+ yychar = yytoken = YYEOF;
-+ YYDPRINTF ((stderr, "Now at end of input.\n"));
-+ }
-+ else
-+ {
-+ yytoken = YYTRANSLATE (yychar);
-+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
-+ }
-+
-+ /* If the proper action on seeing token YYTOKEN is to reduce or to
-+ detect an error, take that action. */
-+ yyn += yytoken;
-+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
-+ goto yydefault;
-+ yyn = yytable[yyn];
-+ if (yyn <= 0)
-+ {
-+ if (yyn == 0 || yyn == YYTABLE_NINF)
-+ goto yyerrlab;
-+ yyn = -yyn;
-+ goto yyreduce;
-+ }
-+
-+ if (yyn == YYFINAL)
-+ YYACCEPT;
-+
-+ /* Shift the look-ahead token. */
-+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-+
-+ /* Discard the token being shifted unless it is eof. */
-+ if (yychar != YYEOF)
-+ yychar = YYEMPTY;
-+
-+ *++yyvsp = yylval;
-+
-+
-+ /* Count tokens shifted since error; after three, turn off error
-+ status. */
-+ if (yyerrstatus)
-+ yyerrstatus--;
-+
-+ yystate = yyn;
-+ goto yynewstate;
-+
-+
-+/*-----------------------------------------------------------.
-+| yydefault -- do the default action for the current state. |
-+`-----------------------------------------------------------*/
-+yydefault:
-+ yyn = yydefact[yystate];
-+ if (yyn == 0)
-+ goto yyerrlab;
-+ goto yyreduce;
-+
-+
-+/*-----------------------------.
-+| yyreduce -- Do a reduction. |
-+`-----------------------------*/
-+yyreduce:
-+ /* yyn is the number of a rule to reduce with. */
-+ yylen = yyr2[yyn];
-+
-+ /* If YYLEN is nonzero, implement the default value of the action:
-+ `$$ = $1'.
-+
-+ Otherwise, the following line sets YYVAL to garbage.
-+ This behavior is undocumented and Bison
-+ users should not rely upon it. Assigning to YYVAL
-+ unconditionally makes the parser a bit smaller, and it avoids a
-+ GCC warning that YYVAL may be used uninitialized. */
-+ yyval = yyvsp[1-yylen];
-+
-+
-+ YY_REDUCE_PRINT (yyn);
-+ switch (yyn)
-+ {
-+ case 2:
-+#line 125 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ *sql->view = (yyvsp[0].query);
-+ ;}
-+ break;
-+
-+ case 9:
-+#line 142 "sql.y"
-+ {
-+ SQL_input *sql = (SQL_input*) info;
-+ MSIVIEW *insert = NULL;
-+
-+ INSERT_CreateView( sql->db, &insert, (yyvsp[-7].string), (yyvsp[-5].column_list), (yyvsp[-1].column_list), FALSE );
-+ if( !insert )
-+ YYABORT;
-+ (yyval.query) = insert;
-+ ;}
-+ break;
-+
-+ case 10:
-+#line 152 "sql.y"
-+ {
-+ SQL_input *sql = (SQL_input*) info;
-+ MSIVIEW *insert = NULL;
-+
-+ INSERT_CreateView( sql->db, &insert, (yyvsp[-8].string), (yyvsp[-6].column_list), (yyvsp[-2].column_list), TRUE );
-+ if( !insert )
-+ YYABORT;
-+ (yyval.query) = insert;
-+ ;}
-+ break;
-+
-+ case 11:
-+#line 165 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ MSIVIEW *create = NULL;
-+
-+ if( !(yyvsp[-1].column_list) )
-+ YYABORT;
-+ CREATE_CreateView( sql->db, &create, (yyvsp[-3].string), (yyvsp[-1].column_list), FALSE );
-+ if( !create )
-+ YYABORT;
-+ (yyval.query) = create;
-+ ;}
-+ break;
-+
-+ case 12:
-+#line 177 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ MSIVIEW *create = NULL;
-+
-+ if( !(yyvsp[-2].column_list) )
-+ YYABORT;
-+ CREATE_CreateView( sql->db, &create, (yyvsp[-4].string), (yyvsp[-2].column_list), TRUE );
-+ if( !create )
-+ YYABORT;
-+ (yyval.query) = create;
-+ ;}
-+ break;
-+
-+ case 13:
-+#line 192 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ MSIVIEW *update = NULL;
-+
-+ UPDATE_CreateView( sql->db, &update, (yyvsp[-4].string), (yyvsp[-2].column_list), (yyvsp[0].expr) );
-+ if( !update )
-+ YYABORT;
-+ (yyval.query) = update;
-+ ;}
-+ break;
-+
-+ case 14:
-+#line 202 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ MSIVIEW *update = NULL;
-+
-+ UPDATE_CreateView( sql->db, &update, (yyvsp[-2].string), (yyvsp[0].column_list), NULL );
-+ if( !update )
-+ YYABORT;
-+ (yyval.query) = update;
-+ ;}
-+ break;
-+
-+ case 15:
-+#line 215 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ MSIVIEW *delete = NULL;
-+
-+ DELETE_CreateView( sql->db, &delete, (yyvsp[0].query) );
-+ if( !delete )
-+ YYABORT;
-+ (yyval.query) = delete;
-+ ;}
-+ break;
-+
-+ case 16:
-+#line 228 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ MSIVIEW *alter = NULL;
-+
-+ ALTER_CreateView( sql->db, &alter, (yyvsp[-1].string), NULL, (yyvsp[0].integer) );
-+ if( !alter )
-+ YYABORT;
-+ (yyval.query) = alter;
-+ ;}
-+ break;
-+
-+ case 17:
-+#line 238 "sql.y"
-+ {
-+ SQL_input *sql = (SQL_input *)info;
-+ MSIVIEW *alter = NULL;
-+
-+ ALTER_CreateView( sql->db, &alter, (yyvsp[-2].string), (yyvsp[0].column_list), 0 );
-+ if (!alter)
-+ YYABORT;
-+ (yyval.query) = alter;
-+ ;}
-+ break;
-+
-+ case 18:
-+#line 248 "sql.y"
-+ {
-+ SQL_input *sql = (SQL_input *)info;
-+ MSIVIEW *alter = NULL;
-+
-+ ALTER_CreateView( sql->db, &alter, (yyvsp[-3].string), (yyvsp[-1].column_list), 1 );
-+ if (!alter)
-+ YYABORT;
-+ (yyval.query) = alter;
-+ ;}
-+ break;
-+
-+ case 19:
-+#line 261 "sql.y"
-+ {
-+ (yyval.integer) = 1;
-+ ;}
-+ break;
-+
-+ case 20:
-+#line 265 "sql.y"
-+ {
-+ (yyval.integer) = -1;
-+ ;}
-+ break;
-+
-+ case 21:
-+#line 272 "sql.y"
-+ {
-+ if( SQL_MarkPrimaryKeys( (yyvsp[-3].column_list), (yyvsp[0].column_list) ) )
-+ (yyval.column_list) = (yyvsp[-3].column_list);
-+ else
-+ (yyval.column_list) = NULL;
-+ ;}
-+ break;
-+
-+ case 22:
-+#line 282 "sql.y"
-+ {
-+ column_info *ci;
-+
-+ for( ci = (yyvsp[-2].column_list); ci->next; ci = ci->next )
-+ ;
-+
-+ ci->next = (yyvsp[0].column_list);
-+ (yyval.column_list) = (yyvsp[-2].column_list);
-+ ;}
-+ break;
-+
-+ case 23:
-+#line 292 "sql.y"
-+ {
-+ (yyval.column_list) = (yyvsp[0].column_list);
-+ ;}
-+ break;
-+
-+ case 24:
-+#line 299 "sql.y"
-+ {
-+ (yyval.column_list) = (yyvsp[-1].column_list);
-+ (yyval.column_list)->type = ((yyvsp[0].column_type) | MSITYPE_VALID);
-+ (yyval.column_list)->temporary = (yyvsp[0].column_type) & MSITYPE_TEMPORARY ? TRUE : FALSE;
-+ ;}
-+ break;
-+
-+ case 25:
-+#line 308 "sql.y"
-+ {
-+ (yyval.column_type) = (yyvsp[0].column_type);
-+ ;}
-+ break;
-+
-+ case 26:
-+#line 312 "sql.y"
-+ {
-+ (yyval.column_type) = (yyvsp[-1].column_type) | MSITYPE_LOCALIZABLE;
-+ ;}
-+ break;
-+
-+ case 27:
-+#line 316 "sql.y"
-+ {
-+ (yyval.column_type) = (yyvsp[-1].column_type) | MSITYPE_TEMPORARY;
-+ ;}
-+ break;
-+
-+ case 28:
-+#line 323 "sql.y"
-+ {
-+ (yyval.column_type) |= MSITYPE_NULLABLE;
-+ ;}
-+ break;
-+
-+ case 29:
-+#line 327 "sql.y"
-+ {
-+ (yyval.column_type) = (yyvsp[-2].column_type);
-+ ;}
-+ break;
-+
-+ case 30:
-+#line 334 "sql.y"
-+ {
-+ (yyval.column_type) = MSITYPE_STRING | 1;
-+ ;}
-+ break;
-+
-+ case 31:
-+#line 338 "sql.y"
-+ {
-+ (yyval.column_type) = MSITYPE_STRING | 0x400 | (yyvsp[-1].column_type);
-+ ;}
-+ break;
-+
-+ case 32:
-+#line 342 "sql.y"
-+ {
-+ (yyval.column_type) = 2;
-+ ;}
-+ break;
-+
-+ case 33:
-+#line 346 "sql.y"
-+ {
-+ (yyval.column_type) = 2;
-+ ;}
-+ break;
-+
-+ case 34:
-+#line 350 "sql.y"
-+ {
-+ (yyval.column_type) = 2;
-+ ;}
-+ break;
-+
-+ case 35:
-+#line 354 "sql.y"
-+ {
-+ (yyval.column_type) = 4;
-+ ;}
-+ break;
-+
-+ case 36:
-+#line 358 "sql.y"
-+ {
-+ (yyval.column_type) = MSITYPE_STRING | MSITYPE_VALID;
-+ ;}
-+ break;
-+
-+ case 37:
-+#line 365 "sql.y"
-+ {
-+ if( ( (yyvsp[0].integer) > 255 ) || ( (yyvsp[0].integer) < 0 ) )
-+ YYABORT;
-+ (yyval.column_type) = (yyvsp[0].integer);
-+ ;}
-+ break;
-+
-+ case 38:
-+#line 374 "sql.y"
-+ {
-+ UINT r;
-+
-+ if( (yyvsp[0].column_list) )
-+ {
-+ r = (yyvsp[-3].query)->ops->sort( (yyvsp[-3].query), (yyvsp[0].column_list) );
-+ if ( r != ERROR_SUCCESS)
-+ YYABORT;
-+ }
-+
-+ (yyval.query) = (yyvsp[-3].query);
-+ ;}
-+ break;
-+
-+ case 40:
-+#line 391 "sql.y"
-+ {
-+ (yyval.query) = (yyvsp[0].query);
-+ ;}
-+ break;
-+
-+ case 41:
-+#line 395 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ UINT r;
-+
-+ (yyval.query) = NULL;
-+ r = DISTINCT_CreateView( sql->db, &(yyval.query), (yyvsp[0].query) );
-+ if (r != ERROR_SUCCESS)
-+ {
-+ (yyvsp[0].query)->ops->delete((yyvsp[0].query));
-+ YYABORT;
-+ }
-+ ;}
-+ break;
-+
-+ case 42:
-+#line 411 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ UINT r;
-+
-+ (yyval.query) = NULL;
-+ if( (yyvsp[-1].column_list) )
-+ {
-+ r = SELECT_CreateView( sql->db, &(yyval.query), (yyvsp[0].query), (yyvsp[-1].column_list) );
-+ if (r != ERROR_SUCCESS)
-+ {
-+ (yyvsp[0].query)->ops->delete((yyvsp[0].query));
-+ YYABORT;
-+ }
-+ }
-+ else
-+ (yyval.query) = (yyvsp[0].query);
-+ ;}
-+ break;
-+
-+ case 44:
-+#line 433 "sql.y"
-+ {
-+ (yyvsp[-2].column_list)->next = (yyvsp[0].column_list);
-+ ;}
-+ break;
-+
-+ case 45:
-+#line 437 "sql.y"
-+ {
-+ (yyval.column_list) = NULL;
-+ ;}
-+ break;
-+
-+ case 47:
-+#line 445 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ UINT r;
-+
-+ (yyval.query) = NULL;
-+ r = WHERE_CreateView( sql->db, &(yyval.query), (yyvsp[-2].query), (yyvsp[0].expr) );
-+ if( r != ERROR_SUCCESS )
-+ {
-+ (yyvsp[-2].query)->ops->delete( (yyvsp[-2].query) );
-+ YYABORT;
-+ }
-+ ;}
-+ break;
-+
-+ case 48:
-+#line 461 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ UINT r;
-+
-+ (yyval.query) = NULL;
-+ r = TABLE_CreateView( sql->db, (yyvsp[0].string), &(yyval.query) );
-+ if( r != ERROR_SUCCESS || !(yyval.query) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 49:
-+#line 471 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ UINT r;
-+
-+ r = JOIN_CreateView( sql->db, &(yyval.query), (yyvsp[0].string) );
-+ msi_free( (yyvsp[0].string) );
-+ if( r != ERROR_SUCCESS )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 50:
-+#line 484 "sql.y"
-+ {
-+ (yyval.string) = strdupW((yyvsp[0].string));
-+ ;}
-+ break;
-+
-+ case 51:
-+#line 489 "sql.y"
-+ {
-+ (yyval.string) = parser_add_table((yyvsp[0].string), (yyvsp[-2].string));
-+ if (!(yyval.string))
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 52:
-+#line 498 "sql.y"
-+ {
-+ (yyval.expr) = (yyvsp[-1].expr);
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 53:
-+#line 504 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_AND, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 54:
-+#line 510 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_OR, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 55:
-+#line 516 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_EQ, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 56:
-+#line 522 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_GT, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 57:
-+#line 528 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_LT, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 58:
-+#line 534 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_LE, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 59:
-+#line 540 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_GE, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 60:
-+#line 546 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_NE, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 61:
-+#line 552 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_unary( info, (yyvsp[-2].expr), OP_ISNULL );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 62:
-+#line 558 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_unary( info, (yyvsp[-3].expr), OP_NOTNULL );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 65:
-+#line 572 "sql.y"
-+ {
-+ (yyval.column_list) = parser_alloc_column( info, NULL, NULL );
-+ if( !(yyval.column_list) )
-+ YYABORT;
-+ (yyval.column_list)->val = (yyvsp[0].expr);
-+ ;}
-+ break;
-+
-+ case 66:
-+#line 579 "sql.y"
-+ {
-+ (yyval.column_list) = parser_alloc_column( info, NULL, NULL );
-+ if( !(yyval.column_list) )
-+ YYABORT;
-+ (yyval.column_list)->val = (yyvsp[-2].expr);
-+ (yyval.column_list)->next = (yyvsp[0].column_list);
-+ ;}
-+ break;
-+
-+ case 68:
-+#line 591 "sql.y"
-+ {
-+ (yyval.column_list) = (yyvsp[-2].column_list);
-+ (yyval.column_list)->next = (yyvsp[0].column_list);
-+ ;}
-+ break;
-+
-+ case 69:
-+#line 599 "sql.y"
-+ {
-+ (yyval.column_list) = (yyvsp[-2].column_list);
-+ (yyval.column_list)->val = (yyvsp[0].expr);
-+ ;}
-+ break;
-+
-+ case 70:
-+#line 607 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_ival( info, (yyvsp[0].integer) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 71:
-+#line 613 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_ival( info, -(yyvsp[0].integer) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 72:
-+#line 619 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_sval( info, &(yyvsp[0].str) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 73:
-+#line 625 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_wildcard( info );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 74:
-+#line 634 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_column( info, (yyvsp[0].column_list) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 75:
-+#line 643 "sql.y"
-+ {
-+ (yyval.column_list) = parser_alloc_column( info, (yyvsp[-2].string), (yyvsp[0].string) );
-+ if( !(yyval.column_list) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 76:
-+#line 649 "sql.y"
-+ {
-+ (yyval.column_list) = parser_alloc_column( info, NULL, (yyvsp[0].string) );
-+ if( !(yyval.column_list) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 77:
-+#line 658 "sql.y"
-+ {
-+ (yyval.string) = (yyvsp[0].string);
-+ ;}
-+ break;
-+
-+ case 78:
-+#line 665 "sql.y"
-+ {
-+ (yyval.string) = SQL_getstring( info, &(yyvsp[0].str) );
-+ if( !(yyval.string) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 79:
-+#line 674 "sql.y"
-+ {
-+ (yyval.integer) = SQL_getint( info );
-+ ;}
-+ break;
-+
-+
-+ default: break;
-+ }
-+
-+/* Line 1126 of yacc.c. */
-+#line 2080 "sql.tab.c"
-+
-+ yyvsp -= yylen;
-+ yyssp -= yylen;
-+
-+
-+ YY_STACK_PRINT (yyss, yyssp);
-+
-+ *++yyvsp = yyval;
-+
-+
-+ /* Now `shift' the result of the reduction. Determine what state
-+ that goes to, based on the state we popped back to and the rule
-+ number reduced by. */
-+
-+ yyn = yyr1[yyn];
-+
-+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
-+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
-+ yystate = yytable[yystate];
-+ else
-+ yystate = yydefgoto[yyn - YYNTOKENS];
-+
-+ goto yynewstate;
-+
-+
-+/*------------------------------------.
-+| yyerrlab -- here on detecting error |
-+`------------------------------------*/
-+yyerrlab:
-+ /* If not already recovering from an error, report this error. */
-+ if (!yyerrstatus)
-+ {
-+ ++yynerrs;
-+#if YYERROR_VERBOSE
-+ yyn = yypact[yystate];
-+
-+ if (YYPACT_NINF < yyn && yyn < YYLAST)
-+ {
-+ int yytype = YYTRANSLATE (yychar);
-+ YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
-+ YYSIZE_T yysize = yysize0;
-+ YYSIZE_T yysize1;
-+ int yysize_overflow = 0;
-+ char *yymsg = 0;
-+# define YYERROR_VERBOSE_ARGS_MAXIMUM 5
-+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-+ int yyx;
-+
-+#if 0
-+ /* This is so xgettext sees the translatable formats that are
-+ constructed on the fly. */
-+ YY_("syntax error, unexpected %s");
-+ YY_("syntax error, unexpected %s, expecting %s");
-+ YY_("syntax error, unexpected %s, expecting %s or %s");
-+ YY_("syntax error, unexpected %s, expecting %s or %s or %s");
-+ YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-+#endif
-+ char *yyfmt;
-+ char const *yyf;
-+ static char const yyunexpected[] = "syntax error, unexpected %s";
-+ static char const yyexpecting[] = ", expecting %s";
-+ static char const yyor[] = " or %s";
-+ char yyformat[sizeof yyunexpected
-+ + sizeof yyexpecting - 1
-+ + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-+ * (sizeof yyor - 1))];
-+ char const *yyprefix = yyexpecting;
-+
-+ /* Start YYX at -YYN if negative to avoid negative indexes in
-+ YYCHECK. */
-+ int yyxbegin = yyn < 0 ? -yyn : 0;
-+
-+ /* Stay within bounds of both yycheck and yytname. */
-+ int yychecklim = YYLAST - yyn;
-+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-+ int yycount = 1;
-+
-+ yyarg[0] = yytname[yytype];
-+ yyfmt = yystpcpy (yyformat, yyunexpected);
-+
-+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-+ {
-+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-+ {
-+ yycount = 1;
-+ yysize = yysize0;
-+ yyformat[sizeof yyunexpected - 1] = '\0';
-+ break;
-+ }
-+ yyarg[yycount++] = yytname[yyx];
-+ yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-+ yysize_overflow |= yysize1 < yysize;
-+ yysize = yysize1;
-+ yyfmt = yystpcpy (yyfmt, yyprefix);
-+ yyprefix = yyor;
-+ }
-+
-+ yyf = YY_(yyformat);
-+ yysize1 = yysize + yystrlen (yyf);
-+ yysize_overflow |= yysize1 < yysize;
-+ yysize = yysize1;
-+
-+ if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM)
-+ yymsg = (char *) YYSTACK_ALLOC (yysize);
-+ if (yymsg)
-+ {
-+ /* Avoid sprintf, as that infringes on the user's name space.
-+ Don't have undefined behavior even if the translation
-+ produced a string with the wrong number of "%s"s. */
-+ char *yyp = yymsg;
-+ int yyi = 0;
-+ while ((*yyp = *yyf))
-+ {
-+ if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-+ {
-+ yyp += yytnamerr (yyp, yyarg[yyi++]);
-+ yyf += 2;
-+ }
-+ else
-+ {
-+ yyp++;
-+ yyf++;
-+ }
-+ }
-+ yyerror (yymsg);
-+ YYSTACK_FREE (yymsg);
-+ }
-+ else
-+ {
-+ yyerror (YY_("syntax error"));
-+ goto yyexhaustedlab;
-+ }
-+ }
-+ else
-+#endif /* YYERROR_VERBOSE */
-+ yyerror (YY_("syntax error"));
-+ }
-+
-+
-+
-+ if (yyerrstatus == 3)
-+ {
-+ /* If just tried and failed to reuse look-ahead token after an
-+ error, discard it. */
-+
-+ if (yychar <= YYEOF)
-+ {
-+ /* Return failure if at end of input. */
-+ if (yychar == YYEOF)
-+ YYABORT;
-+ }
-+ else
-+ {
-+ yydestruct ("Error: discarding", yytoken, &yylval);
-+ yychar = YYEMPTY;
-+ }
-+ }
-+
-+ /* Else will try to reuse look-ahead token after shifting the error
-+ token. */
-+ goto yyerrlab1;
-+
-+
-+/*---------------------------------------------------.
-+| yyerrorlab -- error raised explicitly by YYERROR. |
-+`---------------------------------------------------*/
-+yyerrorlab:
-+
-+ /* Pacify compilers like GCC when the user code never invokes
-+ YYERROR and the label yyerrorlab therefore never appears in user
-+ code. */
-+ if (0)
-+ goto yyerrorlab;
-+
-+yyvsp -= yylen;
-+ yyssp -= yylen;
-+ yystate = *yyssp;
-+ goto yyerrlab1;
-+
-+
-+/*-------------------------------------------------------------.
-+| yyerrlab1 -- common code for both syntax error and YYERROR. |
-+`-------------------------------------------------------------*/
-+yyerrlab1:
-+ yyerrstatus = 3; /* Each real token shifted decrements this. */
-+
-+ for (;;)
-+ {
-+ yyn = yypact[yystate];
-+ if (yyn != YYPACT_NINF)
-+ {
-+ yyn += YYTERROR;
-+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
-+ {
-+ yyn = yytable[yyn];
-+ if (0 < yyn)
-+ break;
-+ }
-+ }
-+
-+ /* Pop the current state because it cannot handle the error token. */
-+ if (yyssp == yyss)
-+ YYABORT;
-+
-+
-+ yydestruct ("Error: popping", yystos[yystate], yyvsp);
-+ YYPOPSTACK;
-+ yystate = *yyssp;
-+ YY_STACK_PRINT (yyss, yyssp);
-+ }
-+
-+ if (yyn == YYFINAL)
-+ YYACCEPT;
-+
-+ *++yyvsp = yylval;
-+
-+
-+ /* Shift the error token. */
-+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-+
-+ yystate = yyn;
-+ goto yynewstate;
-+
-+
-+/*-------------------------------------.
-+| yyacceptlab -- YYACCEPT comes here. |
-+`-------------------------------------*/
-+yyacceptlab:
-+ yyresult = 0;
-+ goto yyreturn;
-+
-+/*-----------------------------------.
-+| yyabortlab -- YYABORT comes here. |
-+`-----------------------------------*/
-+yyabortlab:
-+ yyresult = 1;
-+ goto yyreturn;
-+
-+#ifndef yyoverflow
-+/*-------------------------------------------------.
-+| yyexhaustedlab -- memory exhaustion comes here. |
-+`-------------------------------------------------*/
-+yyexhaustedlab:
-+ yyerror (YY_("memory exhausted"));
-+ yyresult = 2;
-+ /* Fall through. */
-+#endif
-+
-+yyreturn:
-+ if (yychar != YYEOF && yychar != YYEMPTY)
-+ yydestruct ("Cleanup: discarding lookahead",
-+ yytoken, &yylval);
-+ while (yyssp != yyss)
-+ {
-+ yydestruct ("Cleanup: popping",
-+ yystos[*yyssp], yyvsp);
-+ YYPOPSTACK;
-+ }
-+#ifndef yyoverflow
-+ if (yyss != yyssa)
-+ YYSTACK_FREE (yyss);
-+#endif
-+ return yyresult;
-+}
-+
-+
-+#line 679 "sql.y"
-+
-+
-+static LPWSTR parser_add_table(LPWSTR list, LPWSTR table)
-+{
-+ DWORD size = lstrlenW(list) + lstrlenW(table) + 2;
-+ static const WCHAR space[] = {' ',0};
-+
-+ list = msi_realloc(list, size * sizeof(WCHAR));
-+ if (!list) return NULL;
-+
-+ lstrcatW(list, space);
-+ lstrcatW(list, table);
-+ return list;
-+}
-+
-+static void *parser_alloc( void *info, unsigned int sz )
-+{
-+ SQL_input* sql = (SQL_input*) info;
-+ struct list *mem;
-+
-+ mem = msi_alloc( sizeof (struct list) + sz );
-+ list_add_tail( sql->mem, mem );
-+ return &mem[1];
-+}
-+
-+static column_info *parser_alloc_column( void *info, LPCWSTR table, LPCWSTR column )
-+{
-+ column_info *col;
-+
-+ col = parser_alloc( info, sizeof (*col) );
-+ if( col )
-+ {
-+ col->table = table;
-+ col->column = column;
-+ col->val = NULL;
-+ col->type = 0;
-+ col->next = NULL;
-+ }
-+
-+ return col;
-+}
-+
-+static int sql_lex( void *SQL_lval, SQL_input *sql )
-+{
-+ int token;
-+ struct sql_str * str = SQL_lval;
-+
-+ do
-+ {
-+ sql->n += sql->len;
-+ if( ! sql->command[sql->n] )
-+ return 0; /* end of input */
-+
-+ /* TRACE("string : %s\n", debugstr_w(&sql->command[sql->n])); */
-+ sql->len = sqliteGetToken( &sql->command[sql->n], &token );
-+ if( sql->len==0 )
-+ break;
-+ str->data = &sql->command[sql->n];
-+ str->len = sql->len;
-+ }
-+ while( token == TK_SPACE );
-+
-+ /* TRACE("token : %d (%s)\n", token, debugstr_wn(&sql->command[sql->n], sql->len)); */
-+
-+ return token;
-+}
-+
-+LPWSTR SQL_getstring( void *info, const struct sql_str *strdata )
-+{
-+ LPCWSTR p = strdata->data;
-+ UINT len = strdata->len;
-+ LPWSTR str;
-+
-+ /* if there's quotes, remove them */
-+ if( ( (p[0]=='`') && (p[len-1]=='`') ) ||
-+ ( (p[0]=='\'') && (p[len-1]=='\'') ) )
-+ {
-+ p++;
-+ len -= 2;
-+ }
-+ str = parser_alloc( info, (len + 1)*sizeof(WCHAR) );
-+ if( !str )
-+ return str;
-+ memcpy( str, p, len*sizeof(WCHAR) );
-+ str[len]=0;
-+
-+ return str;
-+}
-+
-+INT SQL_getint( void *info )
-+{
-+ SQL_input* sql = (SQL_input*) info;
-+ LPCWSTR p = &sql->command[sql->n];
-+ INT i, r = 0;
-+
-+ for( i=0; ilen; i++ )
-+ {
-+ if( '0' > p[i] || '9' < p[i] )
-+ {
-+ ERR("should only be numbers here!\n");
-+ break;
-+ }
-+ r = (p[i]-'0') + r*10;
-+ }
-+
-+ return r;
-+}
-+
-+static int sql_error( const char *str )
-+{
-+ return 0;
-+}
-+
-+static struct expr * EXPR_wildcard( void *info )
-+{
-+ struct expr *e = parser_alloc( info, sizeof *e );
-+ if( e )
-+ {
-+ e->type = EXPR_WILDCARD;
-+ }
-+ return e;
-+}
-+
-+static struct expr * EXPR_complex( void *info, struct expr *l, UINT op, struct expr *r )
-+{
-+ struct expr *e = parser_alloc( info, sizeof *e );
-+ if( e )
-+ {
-+ e->type = EXPR_COMPLEX;
-+ e->u.expr.left = l;
-+ e->u.expr.op = op;
-+ e->u.expr.right = r;
-+ }
-+ return e;
-+}
-+
-+static struct expr * EXPR_unary( void *info, struct expr *l, UINT op )
-+{
-+ struct expr *e = parser_alloc( info, sizeof *e );
-+ if( e )
-+ {
-+ e->type = EXPR_UNARY;
-+ e->u.expr.left = l;
-+ e->u.expr.op = op;
-+ e->u.expr.right = NULL;
-+ }
-+ return e;
-+}
-+
-+static struct expr * EXPR_column( void *info, const column_info *column )
-+{
-+ struct expr *e = parser_alloc( info, sizeof *e );
-+ if( e )
-+ {
-+ e->type = EXPR_COLUMN;
-+ e->u.sval = column->column;
-+ }
-+ return e;
-+}
-+
-+static struct expr * EXPR_ival( void *info, int val )
-+{
-+ struct expr *e = parser_alloc( info, sizeof *e );
-+ if( e )
-+ {
-+ e->type = EXPR_IVAL;
-+ e->u.ival = val;
-+ }
-+ return e;
-+}
-+
-+static struct expr * EXPR_sval( void *info, const struct sql_str *str )
-+{
-+ struct expr *e = parser_alloc( info, sizeof *e );
-+ if( e )
-+ {
-+ e->type = EXPR_SVAL;
-+ e->u.sval = SQL_getstring( info, str );
-+ }
-+ return e;
-+}
-+
-+static BOOL SQL_MarkPrimaryKeys( column_info *cols,
-+ column_info *keys )
-+{
-+ column_info *k;
-+ BOOL found = TRUE;
-+
-+ for( k = keys; k && found; k = k->next )
-+ {
-+ column_info *c;
-+
-+ found = FALSE;
-+ for( c = cols; c && !found; c = c->next )
-+ {
-+ if( lstrcmpW( k->column, c->column ) )
-+ continue;
-+ c->type |= MSITYPE_KEY;
-+ found = TRUE;
-+ }
-+ }
-+
-+ return found;
-+}
-+
-+UINT MSI_ParseSQL( MSIDATABASE *db, LPCWSTR command, MSIVIEW **phview,
-+ struct list *mem )
-+{
-+ SQL_input sql;
-+ int r;
-+
-+ *phview = NULL;
-+
-+ sql.db = db;
-+ sql.command = command;
-+ sql.n = 0;
-+ sql.len = 0;
-+ sql.view = phview;
-+ sql.mem = mem;
-+
-+ r = sql_parse(&sql);
-+
-+ TRACE("Parse returned %d\n", r);
-+ if( r )
-+ {
-+ *sql.view = NULL;
-+ return ERROR_BAD_QUERY_SYNTAX;
-+ }
-+
-+ return ERROR_SUCCESS;
-+}
-+
-Index: sql.tab.h
-===================================================================
---- sql.tab.h (revision 31639)
-+++ sql.tab.h (working copy)
-@@ -0,0 +1,180 @@
-+/* A Bison parser, made by GNU Bison 2.1. */
-+
-+/* Skeleton parser for Yacc-like parsing with Bison,
-+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2, or (at your option)
-+ any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
-+ Boston, MA 02110-1301, USA. */
-+
-+/* As a special exception, when this file is copied by Bison into a
-+ Bison output file, you may use that output file without restriction.
-+ This special exception was added by the Free Software Foundation
-+ in version 1.24 of Bison. */
-+
-+/* Tokens. */
-+#ifndef YYTOKENTYPE
-+# define YYTOKENTYPE
-+ /* Put the tokens into the symbol table, so that GDB and other debuggers
-+ know about them. */
-+ enum yytokentype {
-+ TK_ALTER = 258,
-+ TK_AND = 259,
-+ TK_BY = 260,
-+ TK_CHAR = 261,
-+ TK_COMMA = 262,
-+ TK_CREATE = 263,
-+ TK_DELETE = 264,
-+ TK_DISTINCT = 265,
-+ TK_DOT = 266,
-+ TK_EQ = 267,
-+ TK_FREE = 268,
-+ TK_FROM = 269,
-+ TK_GE = 270,
-+ TK_GT = 271,
-+ TK_HOLD = 272,
-+ TK_ADD = 273,
-+ TK_ID = 274,
-+ TK_ILLEGAL = 275,
-+ TK_INSERT = 276,
-+ TK_INT = 277,
-+ TK_INTEGER = 278,
-+ TK_INTO = 279,
-+ TK_IS = 280,
-+ TK_KEY = 281,
-+ TK_LE = 282,
-+ TK_LONG = 283,
-+ TK_LONGCHAR = 284,
-+ TK_LP = 285,
-+ TK_LT = 286,
-+ TK_LOCALIZABLE = 287,
-+ TK_MINUS = 288,
-+ TK_NE = 289,
-+ TK_NOT = 290,
-+ TK_NULL = 291,
-+ TK_OBJECT = 292,
-+ TK_OR = 293,
-+ TK_ORDER = 294,
-+ TK_PRIMARY = 295,
-+ TK_RP = 296,
-+ TK_SELECT = 297,
-+ TK_SET = 298,
-+ TK_SHORT = 299,
-+ TK_SPACE = 300,
-+ TK_STAR = 301,
-+ TK_STRING = 302,
-+ TK_TABLE = 303,
-+ TK_TEMPORARY = 304,
-+ TK_UPDATE = 305,
-+ TK_VALUES = 306,
-+ TK_WHERE = 307,
-+ TK_WILDCARD = 308,
-+ COLUMN = 310,
-+ FUNCTION = 311,
-+ COMMENT = 312,
-+ UNCLOSED_STRING = 313,
-+ SPACE = 314,
-+ ILLEGAL = 315,
-+ END_OF_FILE = 316,
-+ TK_LIKE = 317,
-+ TK_NEGATION = 318
-+ };
-+#endif
-+/* Tokens. */
-+#define TK_ALTER 258
-+#define TK_AND 259
-+#define TK_BY 260
-+#define TK_CHAR 261
-+#define TK_COMMA 262
-+#define TK_CREATE 263
-+#define TK_DELETE 264
-+#define TK_DISTINCT 265
-+#define TK_DOT 266
-+#define TK_EQ 267
-+#define TK_FREE 268
-+#define TK_FROM 269
-+#define TK_GE 270
-+#define TK_GT 271
-+#define TK_HOLD 272
-+#define TK_ADD 273
-+#define TK_ID 274
-+#define TK_ILLEGAL 275
-+#define TK_INSERT 276
-+#define TK_INT 277
-+#define TK_INTEGER 278
-+#define TK_INTO 279
-+#define TK_IS 280
-+#define TK_KEY 281
-+#define TK_LE 282
-+#define TK_LONG 283
-+#define TK_LONGCHAR 284
-+#define TK_LP 285
-+#define TK_LT 286
-+#define TK_LOCALIZABLE 287
-+#define TK_MINUS 288
-+#define TK_NE 289
-+#define TK_NOT 290
-+#define TK_NULL 291
-+#define TK_OBJECT 292
-+#define TK_OR 293
-+#define TK_ORDER 294
-+#define TK_PRIMARY 295
-+#define TK_RP 296
-+#define TK_SELECT 297
-+#define TK_SET 298
-+#define TK_SHORT 299
-+#define TK_SPACE 300
-+#define TK_STAR 301
-+#define TK_STRING 302
-+#define TK_TABLE 303
-+#define TK_TEMPORARY 304
-+#define TK_UPDATE 305
-+#define TK_VALUES 306
-+#define TK_WHERE 307
-+#define TK_WILDCARD 308
-+#define COLUMN 310
-+#define FUNCTION 311
-+#define COMMENT 312
-+#define UNCLOSED_STRING 313
-+#define SPACE 314
-+#define ILLEGAL 315
-+#define END_OF_FILE 316
-+#define TK_LIKE 317
-+#define TK_NEGATION 318
-+
-+
-+
-+
-+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-+#line 74 "sql.y"
-+typedef union YYSTYPE {
-+ struct sql_str str;
-+ LPWSTR string;
-+ column_info *column_list;
-+ MSIVIEW *query;
-+ struct expr *expr;
-+ USHORT column_type;
-+ int integer;
-+} YYSTYPE;
-+/* Line 1447 of yacc.c. */
-+#line 172 "sql.tab.h"
-+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-+# define YYSTYPE_IS_DECLARED 1
-+# define YYSTYPE_IS_TRIVIAL 1
-+#endif
-+
-+
-+
-+
-+
diff --git a/dll/win32/msi/msipriv.h b/dll/win32/msi/msipriv.h
index 0516dd18da7..cf9e6909f5d 100644
--- a/dll/win32/msi/msipriv.h
+++ b/dll/win32/msi/msipriv.h
@@ -143,13 +143,15 @@ typedef struct tagMSIMEDIAINFO
LPWSTR volume_label;
BOOL is_continuous;
BOOL is_extracted;
- WCHAR source[MAX_PATH];
+ WCHAR sourcedir[MAX_PATH];
} MSIMEDIAINFO;
typedef struct tagMSIPATCHINFO
{
+ struct list entry;
LPWSTR patchcode;
LPWSTR transforms;
+ LPWSTR localfile;
} MSIPATCHINFO;
typedef struct _column_info
@@ -302,7 +304,7 @@ typedef struct tagMSIPACKAGE
{
MSIOBJECTHDR hdr;
MSIDATABASE *db;
- MSIPATCHINFO *patch;
+ struct list patches;
struct list components;
struct list features;
struct list files;
@@ -466,6 +468,7 @@ typedef struct tagMSIFILE
LPWSTR TargetPath;
BOOL IsCompressed;
MSIFILEHASHINFO hash;
+ UINT disk_id;
} MSIFILE;
typedef struct tagMSITEMPFILE
@@ -553,6 +556,7 @@ struct tagMSIMIME
struct list entry;
LPWSTR ContentType; /* Primary Key */
MSIEXTENSION *Extension;
+ LPWSTR suffix;
LPWSTR clsid;
MSICLASS *Class;
/* not in the table, set during installation */
@@ -660,8 +664,7 @@ enum StringPersistence
StringNonPersistent = 1
};
-extern BOOL msi_addstringW( string_table *st, UINT string_no, const WCHAR *data, int len, UINT refcount, enum StringPersistence persistence );
-
+extern BOOL msi_addstringW( string_table *st, const WCHAR *data, int len, USHORT refcount, enum StringPersistence persistence );
extern UINT msi_string2idW( const string_table *st, LPCWSTR buffer, UINT *id );
extern VOID msi_destroy_stringtable( string_table *st );
extern const WCHAR *msi_string_lookup_id( const string_table *st, UINT id );
@@ -672,8 +675,6 @@ extern UINT msi_save_string_table( const string_table *st, IStorage *storage );
extern BOOL TABLE_Exists( MSIDATABASE *db, LPCWSTR name );
extern MSICONDITION MSI_DatabaseIsTablePersistent( MSIDATABASE *db, LPCWSTR table );
-extern UINT read_raw_stream_data( MSIDATABASE *db, LPCWSTR stname,
- USHORT **pdata, UINT *psz );
extern UINT read_stream_data( IStorage *stg, LPCWSTR stname, BOOL table,
BYTE **pdata, UINT *psz );
extern UINT write_stream_data( IStorage *stg, LPCWSTR stname,
@@ -685,7 +686,10 @@ extern UINT MSI_DatabaseApplyTransformW( MSIDATABASE *db,
LPCWSTR szTransformFile, int iErrorCond );
extern void append_storage_to_db( MSIDATABASE *db, IStorage *stg );
+/* patch functions */
extern UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si );
+extern UINT msi_parse_patch_summary( MSISUMMARYINFO *si, MSIPATCHINFO **patch );
+extern UINT msi_apply_patch_db( MSIPACKAGE *package, MSIDATABASE *patch_db, MSIPATCHINFO *patch );
/* action internals */
extern UINT MSI_InstallPackage( MSIPACKAGE *, LPCWSTR, LPCWSTR );
@@ -724,6 +728,7 @@ extern BOOL decode_streamname(LPCWSTR in, LPWSTR out);
/* database internals */
extern UINT db_get_raw_stream( MSIDATABASE *, LPCWSTR, IStream ** );
+void db_destroy_stream( MSIDATABASE *, LPCWSTR );
extern UINT MSI_OpenDatabaseW( LPCWSTR, LPCWSTR, MSIDATABASE ** );
extern UINT MSI_DatabaseOpenViewW(MSIDATABASE *, LPCWSTR, MSIQUERY ** );
extern UINT MSI_OpenQuery( MSIDATABASE *, MSIQUERY **, LPCWSTR, ... );
@@ -748,10 +753,7 @@ extern UINT MSI_SetInstallLevel( MSIPACKAGE *package, int iInstallLevel );
extern MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *, LPCWSTR );
extern UINT MSI_OpenPackageW( LPCWSTR szPackage, MSIPACKAGE **pPackage );
extern UINT MSI_SetTargetPathW( MSIPACKAGE *, LPCWSTR, LPCWSTR );
-extern UINT MSI_SetPropertyW( MSIPACKAGE *, LPCWSTR, LPCWSTR );
extern INT MSI_ProcessMessage( MSIPACKAGE *, INSTALLMESSAGE, MSIRECORD * );
-extern UINT MSI_GetPropertyW( MSIPACKAGE *, LPCWSTR, LPWSTR, LPDWORD );
-extern UINT MSI_GetPropertyA(MSIPACKAGE *, LPCSTR, LPSTR, LPDWORD );
extern MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *, LPCWSTR );
extern UINT MSI_GetComponentStateW( MSIPACKAGE *, LPCWSTR, INSTALLSTATE *, INSTALLSTATE * );
extern UINT MSI_GetFeatureStateW( MSIPACKAGE *, LPCWSTR, INSTALLSTATE *, INSTALLSTATE * );
@@ -760,6 +762,7 @@ extern UINT msi_download_file( LPCWSTR szUrl, LPWSTR filename );
extern UINT msi_package_add_info(MSIPACKAGE *, DWORD, DWORD, LPCWSTR, LPWSTR);
extern UINT msi_package_add_media_disk(MSIPACKAGE *, DWORD, DWORD, DWORD, LPWSTR, LPWSTR);
extern UINT msi_clone_properties(MSIPACKAGE *);
+extern UINT msi_set_context(MSIPACKAGE *);
extern UINT MSI_GetFeatureCost(MSIPACKAGE *, MSIFEATURE *, MSICOSTTREE, INSTALLSTATE, LPINT);
/* for deformating */
@@ -787,12 +790,15 @@ extern UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, MSIINSTALLCONTEXT d
LPCWSTR szUserSid, HKEY *key, BOOL create);
extern UINT MSIREG_OpenUserDataPatchKey(LPCWSTR szPatch, MSIINSTALLCONTEXT dwContext,
HKEY *key, BOOL create);
+extern UINT MSIREG_OpenUserDataProductPatchesKey(LPCWSTR product, MSIINSTALLCONTEXT context,
+ HKEY *key, BOOL create);
extern UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext,
LPCWSTR szUserSid, HKEY *key, BOOL create);
extern UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
extern UINT MSIREG_OpenUserUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
extern UINT MSIREG_DeleteProductKey(LPCWSTR szProduct);
extern UINT MSIREG_DeleteUserProductKey(LPCWSTR szProduct);
+extern UINT MSIREG_DeleteUserDataPatchKey(LPCWSTR patch, MSIINSTALLCONTEXT context);
extern UINT MSIREG_DeleteUserDataProductKey(LPCWSTR szProduct);
extern UINT MSIREG_DeleteUserFeaturesKey(LPCWSTR szProduct);
extern UINT MSIREG_DeleteUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid);
@@ -963,16 +969,23 @@ extern UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package);
extern UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package);
extern UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package);
extern UINT ACTION_RegisterFonts(MSIPACKAGE *package);
+extern UINT ACTION_UnregisterClassInfo(MSIPACKAGE *package);
+extern UINT ACTION_UnregisterExtensionInfo(MSIPACKAGE *package);
extern UINT ACTION_UnregisterFonts(MSIPACKAGE *package);
+extern UINT ACTION_UnregisterMIMEInfo(MSIPACKAGE *package);
+extern UINT ACTION_UnregisterProgIdInfo(MSIPACKAGE *package);
/* Helpers */
extern DWORD deformat_string(MSIPACKAGE *package, LPCWSTR ptr, WCHAR** data );
extern LPWSTR msi_dup_record_field(MSIRECORD *row, INT index);
-extern LPWSTR msi_dup_property(MSIPACKAGE *package, LPCWSTR prop);
-extern int msi_get_property_int( MSIPACKAGE *package, LPCWSTR prop, int def );
+extern LPWSTR msi_dup_property( MSIDATABASE *db, LPCWSTR prop );
+extern UINT msi_set_property( MSIDATABASE *, LPCWSTR, LPCWSTR );
+extern UINT msi_get_property( MSIDATABASE *, LPCWSTR, LPWSTR, LPDWORD );
+extern int msi_get_property_int( MSIDATABASE *package, LPCWSTR prop, int def );
extern LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
BOOL set_prop, BOOL load_prop, MSIFOLDER **folder);
extern LPWSTR resolve_file_source(MSIPACKAGE *package, MSIFILE *file);
+extern void msi_reset_folders( MSIPACKAGE *package, BOOL source );
extern MSICOMPONENT *get_loaded_component( MSIPACKAGE* package, LPCWSTR Component );
extern MSIFEATURE *get_loaded_feature( MSIPACKAGE* package, LPCWSTR Feature );
extern MSIFILE *get_loaded_file( MSIPACKAGE* package, LPCWSTR file );
@@ -992,6 +1005,7 @@ extern WCHAR* generate_error_string(MSIPACKAGE *, UINT, DWORD, ... );
extern UINT msi_create_component_directories( MSIPACKAGE *package );
extern UINT msi_set_last_used_source(LPCWSTR product, LPCWSTR usersid,
MSIINSTALLCONTEXT context, DWORD options, LPCWSTR value);
+extern UINT msi_get_local_package_name(LPWSTR path, LPCWSTR suffix);
/* media */
@@ -1084,6 +1098,23 @@ static const WCHAR szHU[] = {'H','K','E','Y','_','U','S','E','R','S','\\',0};
static const WCHAR szWindowsFolder[] = {'W','i','n','d','o','w','s','F','o','l','d','e','r',0};
static const WCHAR szAppSearch[] = {'A','p','p','S','e','a','r','c','h',0};
static const WCHAR szMoveFiles[] = {'M','o','v','e','F','i','l','e','s',0};
+static const WCHAR szCCPSearch[] = {'C','C','P','S','e','a','r','c','h',0};
+static const WCHAR szUnregisterClassInfo[] = {'U','n','r','e','g','i','s','t','e','r','C','l','a','s','s','I','n','f','o',0};
+static const WCHAR szUnregisterExtensionInfo[] = {'U','n','r','e','g','i','s','t','e','r','E','x','t','e','n','s','i','o','n','I','n','f','o',0};
+static const WCHAR szUnregisterMIMEInfo[] = {'U','n','r','e','g','i','s','t','e','r','M','I','M','E','I','n','f','o',0};
+static const WCHAR szUnregisterProgIdInfo[] = {'U','n','r','e','g','i','s','t','e','r','P','r','o','g','I','d','I','n','f','o',0};
+static const WCHAR szRegisterFonts[] = {'R','e','g','i','s','t','e','r','F','o','n','t','s',0};
+static const WCHAR szUnregisterFonts[] = {'U','n','r','e','g','i','s','t','e','r','F','o','n','t','s',0};
+static const WCHAR szCLSID[] = {'C','L','S','I','D',0};
+static const WCHAR szProgID[] = {'P','r','o','g','I','D',0};
+static const WCHAR szVIProgID[] = {'V','e','r','s','i','o','n','I','n','d','e','p','e','n','d','e','n','t','P','r','o','g','I','D',0};
+static const WCHAR szAppID[] = {'A','p','p','I','D',0};
+static const WCHAR szDefaultIcon[] = {'D','e','f','a','u','l','t','I','c','o','n',0};
+static const WCHAR szInprocHandler[] = {'I','n','p','r','o','c','H','a','n','d','l','e','r',0};
+static const WCHAR szInprocHandler32[] = {'I','n','p','r','o','c','H','a','n','d','l','e','r','3','2',0};
+static const WCHAR szMIMEDatabase[] = {'M','I','M','E','\\','D','a','t','a','b','a','s','e','\\','C','o','n','t','e','n','t',' ','T','y','p','e','\\',0};
+static const WCHAR szLocalPackage[] = {'L','o','c','a','l','P','a','c','k','a','g','e',0};
+static const WCHAR szOriginalDatabase[] = {'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0};
/* memory allocation macro functions */
static void *msi_alloc( size_t len ) __WINE_ALLOC_SIZE(1);
diff --git a/dll/win32/msi/package.c b/dll/win32/msi/package.c
index b1741ae87cf..fba722fe55c 100644
--- a/dll/win32/msi/package.c
+++ b/dll/win32/msi/package.c
@@ -214,6 +214,7 @@ static void free_package_structures( MSIPACKAGE *package )
MSIMIME *mt = LIST_ENTRY( item, MSIMIME, entry );
list_remove( &mt->entry );
+ msi_free( mt->suffix );
msi_free( mt->clsid );
msi_free( mt->ContentType );
msi_free( mt );
@@ -263,11 +264,15 @@ static void free_package_structures( MSIPACKAGE *package )
msi_free( package->script );
}
- if (package->patch)
+ LIST_FOR_EACH_SAFE( item, cursor, &package->patches )
{
- msi_free( package->patch->patchcode );
- msi_free( package->patch->transforms );
- msi_free( package->patch );
+ MSIPATCHINFO *patch = LIST_ENTRY( item, MSIPATCHINFO, entry );
+
+ list_remove( &patch->entry );
+ msi_free( patch->patchcode );
+ msi_free( patch->transforms );
+ msi_free( patch->localfile );
+ msi_free( patch );
}
msi_free( package->BaseURL );
@@ -388,7 +393,7 @@ static UINT set_installed_prop( MSIPACKAGE *package )
if (r == ERROR_SUCCESS)
{
RegCloseKey( hkey );
- MSI_SetPropertyW( package, szInstalled, szOne );
+ msi_set_property( package->db, szInstalled, szOne );
}
return r;
@@ -431,7 +436,7 @@ static UINT set_user_sid_prop( MSIPACKAGE *package )
if (!ConvertSidToStringSidW( psid, &sid_str ))
goto done;
- r = MSI_SetPropertyW( package, szUserSID, sid_str );
+ r = msi_set_property( package->db, szUserSID, sid_str );
done:
LocalFree( sid_str );
@@ -563,7 +568,7 @@ static void set_msi_assembly_prop(MSIPACKAGE *package)
if (!val_len || !verstr)
goto done;
- MSI_SetPropertyW(package, netasm, verstr);
+ msi_set_property(package->db, netasm, verstr);
done:
msi_free(fusion);
@@ -689,96 +694,96 @@ static VOID set_installer_properties(MSIPACKAGE *package)
SHGetFolderPathW(NULL,CSIDL_PROGRAM_FILES_COMMON,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, CFF, pth);
+ msi_set_property(package->db, CFF, pth);
SHGetFolderPathW(NULL,CSIDL_PROGRAM_FILES,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, PFF, pth);
+ msi_set_property(package->db, PFF, pth);
SHGetFolderPathW(NULL,CSIDL_COMMON_APPDATA,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, CADF, pth);
+ msi_set_property(package->db, CADF, pth);
SHGetFolderPathW(NULL,CSIDL_FAVORITES,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, FaF, pth);
+ msi_set_property(package->db, FaF, pth);
SHGetFolderPathW(NULL,CSIDL_FONTS,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, FoF, pth);
+ msi_set_property(package->db, FoF, pth);
SHGetFolderPathW(NULL,CSIDL_SENDTO,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, SendTF, pth);
+ msi_set_property(package->db, SendTF, pth);
SHGetFolderPathW(NULL,CSIDL_STARTMENU,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, SMF, pth);
+ msi_set_property(package->db, SMF, pth);
SHGetFolderPathW(NULL,CSIDL_STARTUP,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, StF, pth);
+ msi_set_property(package->db, StF, pth);
SHGetFolderPathW(NULL,CSIDL_TEMPLATES,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, TemplF, pth);
+ msi_set_property(package->db, TemplF, pth);
SHGetFolderPathW(NULL,CSIDL_DESKTOP,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, DF, pth);
+ msi_set_property(package->db, DF, pth);
SHGetFolderPathW(NULL,CSIDL_PROGRAMS,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, PMF, pth);
+ msi_set_property(package->db, PMF, pth);
SHGetFolderPathW(NULL,CSIDL_ADMINTOOLS,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, ATF, pth);
+ msi_set_property(package->db, ATF, pth);
SHGetFolderPathW(NULL,CSIDL_APPDATA,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, ADF, pth);
+ msi_set_property(package->db, ADF, pth);
SHGetFolderPathW(NULL,CSIDL_SYSTEM,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, SF, pth);
- MSI_SetPropertyW(package, SF16, pth);
+ msi_set_property(package->db, SF, pth);
+ msi_set_property(package->db, SF16, pth);
SHGetFolderPathW(NULL,CSIDL_LOCAL_APPDATA,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, LADF, pth);
+ msi_set_property(package->db, LADF, pth);
SHGetFolderPathW(NULL,CSIDL_MYPICTURES,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, MPF, pth);
+ msi_set_property(package->db, MPF, pth);
SHGetFolderPathW(NULL,CSIDL_PERSONAL,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, PF, pth);
+ msi_set_property(package->db, PF, pth);
SHGetFolderPathW(NULL,CSIDL_WINDOWS,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, WF, pth);
+ msi_set_property(package->db, WF, pth);
/* Physical Memory is specified in MB. Using total amount. */
msex.dwLength = sizeof(msex);
GlobalMemoryStatusEx( &msex );
sprintfW( bufstr, szIntFormat, (int)(msex.ullTotalPhys/1024/1024));
- MSI_SetPropertyW(package, szPhysicalMemory, bufstr);
+ msi_set_property(package->db, szPhysicalMemory, bufstr);
SHGetFolderPathW(NULL,CSIDL_WINDOWS,NULL,0,pth);
ptr = strchrW(pth,'\\');
if (ptr)
*(ptr+1) = 0;
- MSI_SetPropertyW(package, WV, pth);
+ msi_set_property(package->db, WV, pth);
GetTempPathW(MAX_PATH,pth);
- MSI_SetPropertyW(package, TF, pth);
+ msi_set_property(package->db, TF, pth);
/* in a wine environment the user is always admin and privileged */
- MSI_SetPropertyW(package,szAdminUser,szOne);
- MSI_SetPropertyW(package,szPriv,szOne);
+ msi_set_property(package->db, szAdminUser, szOne);
+ msi_set_property(package->db, szPriv, szOne);
/* set the os things */
OSVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW);
@@ -788,54 +793,54 @@ static VOID set_installer_properties(MSIPACKAGE *package)
switch (OSVersion.dwPlatformId)
{
case VER_PLATFORM_WIN32_WINDOWS:
- MSI_SetPropertyW(package,v9x,verstr);
+ msi_set_property(package->db, v9x, verstr);
break;
case VER_PLATFORM_WIN32_NT:
- MSI_SetPropertyW(package,vNT,verstr);
+ msi_set_property(package->db, vNT, verstr);
sprintfW(verstr,szFormat,OSVersion.wProductType);
- MSI_SetPropertyW(package,szMsiNTProductType,verstr);
+ msi_set_property(package->db, szMsiNTProductType, verstr);
break;
}
sprintfW(verstr,szFormat,OSVersion.dwBuildNumber);
- MSI_SetPropertyW(package,szWinBuild,verstr);
+ msi_set_property(package->db, szWinBuild, verstr);
/* just fudge this */
- MSI_SetPropertyW(package,szSPL,szSix);
+ msi_set_property(package->db, szSPL, szSix);
sprintfW( bufstr, szFormat2, MSI_MAJORVERSION, MSI_MINORVERSION);
- MSI_SetPropertyW( package, szVersionMsi, bufstr );
+ msi_set_property( package->db, szVersionMsi, bufstr );
sprintfW( bufstr, szFormat, MSI_MAJORVERSION * 100);
- MSI_SetPropertyW( package, szVersionDatabase, bufstr );
+ msi_set_property( package->db, szVersionDatabase, bufstr );
GetSystemInfo( &sys_info );
if (sys_info.u.s.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
{
sprintfW( bufstr, szIntFormat, sys_info.wProcessorLevel );
- MSI_SetPropertyW( package, szIntel, bufstr );
+ msi_set_property( package->db, szIntel, bufstr );
}
/* Screen properties. */
dc = GetDC(0);
sprintfW( bufstr, szIntFormat, GetDeviceCaps( dc, HORZRES ) );
- MSI_SetPropertyW( package, szScreenX, bufstr );
+ msi_set_property( package->db, szScreenX, bufstr );
sprintfW( bufstr, szIntFormat, GetDeviceCaps( dc, VERTRES ));
- MSI_SetPropertyW( package, szScreenY, bufstr );
+ msi_set_property( package->db, szScreenY, bufstr );
sprintfW( bufstr, szIntFormat, GetDeviceCaps( dc, BITSPIXEL ));
- MSI_SetPropertyW( package, szColorBits, bufstr );
+ msi_set_property( package->db, szColorBits, bufstr );
ReleaseDC(0, dc);
/* USERNAME and COMPANYNAME */
- username = msi_dup_property( package, szUSERNAME );
- companyname = msi_dup_property( package, szCOMPANYNAME );
+ username = msi_dup_property( package->db, szUSERNAME );
+ companyname = msi_dup_property( package->db, szCOMPANYNAME );
if ((!username || !companyname) &&
RegOpenKeyW( HKEY_CURRENT_USER, szUserInfo, &hkey ) == ERROR_SUCCESS)
{
if (!username &&
(username = msi_reg_get_val_str( hkey, szDefName )))
- MSI_SetPropertyW( package, szUSERNAME, username );
+ msi_set_property( package->db, szUSERNAME, username );
if (!companyname &&
(companyname = msi_reg_get_val_str( hkey, szDefCompany )))
- MSI_SetPropertyW( package, szCOMPANYNAME, companyname );
+ msi_set_property( package->db, szCOMPANYNAME, companyname );
CloseHandle( hkey );
}
if ((!username || !companyname) &&
@@ -843,10 +848,10 @@ static VOID set_installer_properties(MSIPACKAGE *package)
{
if (!username &&
(username = msi_reg_get_val_str( hkey, szRegisteredUser )))
- MSI_SetPropertyW( package, szUSERNAME, username );
+ msi_set_property( package->db, szUSERNAME, username );
if (!companyname &&
(companyname = msi_reg_get_val_str( hkey, szRegisteredOrg )))
- MSI_SetPropertyW( package, szCOMPANYNAME, companyname );
+ msi_set_property( package->db, szCOMPANYNAME, companyname );
CloseHandle( hkey );
}
msi_free( username );
@@ -859,7 +864,7 @@ static VOID set_installer_properties(MSIPACKAGE *package)
GetSystemTime( &systemtime );
if (GetDateFormatW( LOCALE_USER_DEFAULT, DATE_SHORTDATE, &systemtime,
NULL, bufstr, sizeof(bufstr)/sizeof(bufstr[0]) ))
- MSI_SetPropertyW( package, szDate, bufstr );
+ msi_set_property( package->db, szDate, bufstr );
else
ERR("Couldn't set Date property: GetDateFormat failed with error %d\n", GetLastError());
@@ -867,7 +872,7 @@ static VOID set_installer_properties(MSIPACKAGE *package)
TIME_FORCE24HOURFORMAT | TIME_NOTIMEMARKER,
&systemtime, NULL, bufstr,
sizeof(bufstr)/sizeof(bufstr[0]) ))
- MSI_SetPropertyW( package, szTime, bufstr );
+ msi_set_property( package->db, szTime, bufstr );
else
ERR("Couldn't set Time property: GetTimeFormat failed with error %d\n", GetLastError());
@@ -875,26 +880,24 @@ static VOID set_installer_properties(MSIPACKAGE *package)
langid = GetUserDefaultLangID();
sprintfW(bufstr, szIntFormat, langid);
-
- MSI_SetPropertyW( package, szUserLangID, bufstr );
+ msi_set_property( package->db, szUserLangID, bufstr );
langid = GetSystemDefaultLangID();
sprintfW(bufstr, szIntFormat, langid);
-
- MSI_SetPropertyW( package, szSystemLangID, bufstr );
+ msi_set_property( package->db, szSystemLangID, bufstr );
sprintfW(bufstr, szIntFormat, MsiQueryProductStateW(package->ProductCode));
- MSI_SetPropertyW( package, szProductState, bufstr );
+ msi_set_property( package->db, szProductState, bufstr );
len = 0;
if (!GetUserNameW( NULL, &len ) && GetLastError() == ERROR_MORE_DATA)
{
WCHAR *username;
- if ((username = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
+ if ((username = msi_alloc( len * sizeof(WCHAR) )))
{
if (GetUserNameW( username, &len ))
- MSI_SetPropertyW( package, szLogonUser, username );
- HeapFree( GetProcessHeap(), 0, username );
+ msi_set_property( package->db, szLogonUser, username );
+ msi_free( username );
}
}
}
@@ -952,7 +955,7 @@ static UINT msi_load_summary_properties( MSIPACKAGE *package )
goto done;
}
- MSI_SetPropertyW( package, szPackageCode, package_code );
+ msi_set_property( package->db, szPackageCode, package_code );
msi_free( package_code );
/* load package attributes */
@@ -988,6 +991,7 @@ static MSIPACKAGE *msi_alloc_package( void )
list_init( &package->RunningActions );
list_init( &package->sourcelist_info );
list_init( &package->sourcelist_media );
+ list_init( &package->patches );
}
return package;
@@ -1013,10 +1017,10 @@ static UINT msi_load_admin_properties(MSIPACKAGE *package)
static void adjust_allusers_property( MSIPACKAGE *package )
{
/* FIXME: this should depend on the user's privileges */
- if (msi_get_property_int( package, szAllUsers, 0 ) == 2)
+ if (msi_get_property_int( package->db, szAllUsers, 0 ) == 2)
{
TRACE("resetting ALLUSERS property from 2 to 1\n");
- MSI_SetPropertyW( package, szAllUsers, szOne );
+ msi_set_property( package->db, szAllUsers, szOne );
}
}
@@ -1043,12 +1047,14 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url )
create_temp_property_table( package );
msi_clone_properties( package );
- package->ProductCode = msi_dup_property( package, szProductCode );
+ package->ProductCode = msi_dup_property( package->db, szProductCode );
+ package->script = msi_alloc_zero( sizeof(MSISCRIPT) );
+
set_installed_prop( package );
set_installer_properties( package );
sprintfW(uilevel,szpi,gUILevel);
- MSI_SetPropertyW(package, szLevel, uilevel);
+ msi_set_property(package->db, szLevel, uilevel);
r = msi_load_summary_properties( package );
if (r != ERROR_SUCCESS)
@@ -1107,16 +1113,16 @@ UINT msi_download_file( LPCWSTR szUrl, LPWSTR filename )
GetUrlCacheEntryInfoW( szUrl, NULL, &size );
if ( GetLastError() != ERROR_FILE_NOT_FOUND )
{
- cache_entry = HeapAlloc( GetProcessHeap(), 0, size );
+ cache_entry = msi_alloc( size );
if ( !GetUrlCacheEntryInfoW( szUrl, cache_entry, &size ) )
{
UINT error = GetLastError();
- HeapFree( GetProcessHeap(), 0, cache_entry );
+ msi_free( cache_entry );
return error;
}
lstrcpyW( filename, cache_entry->lpszLocalFileName );
- HeapFree( GetProcessHeap(), 0, cache_entry );
+ msi_free( cache_entry );
return ERROR_SUCCESS;
}
@@ -1130,12 +1136,12 @@ UINT msi_download_file( LPCWSTR szUrl, LPWSTR filename )
return ERROR_SUCCESS;
}
-static UINT msi_get_local_package_name( LPWSTR path )
+UINT msi_get_local_package_name( LPWSTR path, LPCWSTR suffix )
{
static const WCHAR szInstaller[] = {
'\\','I','n','s','t','a','l','l','e','r','\\',0};
- static const WCHAR fmt[] = { '%','x','.','m','s','i',0};
- DWORD time, len, i;
+ static const WCHAR fmt[] = {'%','x',0};
+ DWORD time, len, i, offset;
HANDLE handle;
time = GetTickCount();
@@ -1146,7 +1152,8 @@ static UINT msi_get_local_package_name( LPWSTR path )
len = strlenW(path);
for (i = 0; i < 0x10000; i++)
{
- snprintfW( &path[len], MAX_PATH - len, fmt, (time + i)&0xffff );
+ offset = snprintfW( path + len, MAX_PATH - len, fmt, (time + i) & 0xffff );
+ memcpy( path + len + offset, suffix, (strlenW( suffix ) + 1) * sizeof(WCHAR) );
handle = CreateFileW( path, GENERIC_WRITE, 0, NULL,
CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0 );
if (handle != INVALID_HANDLE_VALUE)
@@ -1162,11 +1169,64 @@ static UINT msi_get_local_package_name( LPWSTR path )
return ERROR_SUCCESS;
}
+static UINT apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code )
+{
+ UINT r;
+ DWORD len;
+ WCHAR patch_file[MAX_PATH];
+ MSIDATABASE *patch_db;
+ MSIPATCHINFO *patch_info;
+ MSISUMMARYINFO *si;
+
+ len = sizeof(patch_file) / sizeof(WCHAR);
+ r = MsiGetPatchInfoExW( patch_code, package->ProductCode, NULL, package->Context,
+ INSTALLPROPERTY_LOCALPACKAGEW, patch_file, &len );
+ if (r != ERROR_SUCCESS)
+ {
+ ERR("failed to get patch filename %u\n", r);
+ return r;
+ }
+
+ r = MSI_OpenDatabaseW( patch_file, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &patch_db );
+ if (r != ERROR_SUCCESS)
+ {
+ ERR("failed to open patch database %s\n", debugstr_w( patch_file ));
+ return r;
+ }
+
+ si = MSI_GetSummaryInformationW( patch_db->storage, 0 );
+ if (!si)
+ {
+ msiobj_release( &patch_db->hdr );
+ return ERROR_FUNCTION_FAILED;
+ }
+
+ r = msi_parse_patch_summary( si, &patch_info );
+ msiobj_release( &si->hdr );
+ if (r != ERROR_SUCCESS)
+ {
+ ERR("failed to parse patch summary %u\n", r);
+ msiobj_release( &patch_db->hdr );
+ return r;
+ }
+
+ r = msi_apply_patch_db( package, patch_db, patch_info );
+ msiobj_release( &patch_db->hdr );
+ if (r != ERROR_SUCCESS)
+ {
+ ERR("failed to apply patch %u\n", r);
+ msi_free( patch_info->patchcode );
+ msi_free( patch_info->transforms );
+ msi_free( patch_info->localfile );
+ msi_free( patch_info );
+ }
+ return r;
+}
+
UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
{
- static const WCHAR OriginalDatabase[] =
- {'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0};
static const WCHAR Database[] = {'D','A','T','A','B','A','S','E',0};
+ static const WCHAR dotmsi[] = {'.','m','s','i',0};
MSIDATABASE *db = NULL;
MSIPACKAGE *package;
MSIHANDLE handle;
@@ -1174,6 +1234,7 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
UINT r;
WCHAR temppath[MAX_PATH], localfile[MAX_PATH], cachefile[MAX_PATH];
LPCWSTR file = szPackage;
+ DWORD index = 0;
TRACE("%s %p\n", debugstr_w(szPackage), pPackage);
@@ -1225,7 +1286,7 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
file = temppath;
}
- r = msi_get_local_package_name( localfile );
+ r = msi_get_local_package_name( localfile, dotmsi );
if (r != ERROR_SUCCESS)
return r;
@@ -1273,23 +1334,44 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
if( file != szPackage )
track_tempfile( package, file );
- MSI_SetPropertyW( package, Database, db->path );
+ msi_set_property( package->db, Database, db->path );
if( UrlIsW( szPackage, URLIS_URL ) )
- MSI_SetPropertyW( package, OriginalDatabase, szPackage );
+ msi_set_property( package->db, szOriginalDatabase, szPackage );
else if( szPackage[0] == '#' )
- MSI_SetPropertyW( package, OriginalDatabase, db->path );
+ msi_set_property( package->db, szOriginalDatabase, db->path );
else
{
WCHAR fullpath[MAX_PATH];
GetFullPathNameW( szPackage, MAX_PATH, fullpath, NULL );
- MSI_SetPropertyW( package, OriginalDatabase, fullpath );
+ msi_set_property( package->db, szOriginalDatabase, fullpath );
}
- package->script = msi_alloc_zero( sizeof(MSISCRIPT) );
- *pPackage = package;
+ msi_set_context( package );
+ while (1)
+ {
+ WCHAR patch_code[GUID_SIZE];
+ r = MsiEnumPatchesExW( package->ProductCode, NULL, package->Context,
+ MSIPATCHSTATE_APPLIED, index, patch_code, NULL, NULL, NULL, NULL );
+ if (r != ERROR_SUCCESS)
+ break;
+
+ TRACE("found registered patch %s\n", debugstr_w(patch_code));
+
+ r = apply_registered_patch( package, patch_code );
+ if (r != ERROR_SUCCESS)
+ {
+ ERR("registered patch failed to apply %u\n", r);
+ MSI_FreePackage( (MSIOBJECTHDR *)package );
+ return r;
+ }
+
+ index++;
+ }
+
+ *pPackage = package;
return ERROR_SUCCESS;
}
@@ -1357,6 +1439,7 @@ MSIHANDLE WINAPI MsiGetActiveDatabase(MSIHANDLE hInstall)
{
MSIPACKAGE *package;
MSIHANDLE handle = 0;
+ IUnknown *remote_unk;
IWineMsiRemotePackage *remote_package;
TRACE("(%d)\n",hInstall);
@@ -1367,10 +1450,19 @@ MSIHANDLE WINAPI MsiGetActiveDatabase(MSIHANDLE hInstall)
handle = alloc_msihandle( &package->db->hdr );
msiobj_release( &package->hdr );
}
- else if ((remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall )))
+ else if ((remote_unk = msi_get_remote(hInstall)))
{
- IWineMsiRemotePackage_GetActiveDatabase(remote_package, &handle);
- IWineMsiRemotePackage_Release(remote_package);
+ if (IUnknown_QueryInterface(remote_unk, &IID_IWineMsiRemotePackage,
+ (LPVOID *)&remote_package) == S_OK)
+ {
+ IWineMsiRemotePackage_GetActiveDatabase(remote_package, &handle);
+ IWineMsiRemotePackage_Release(remote_package);
+ }
+ else
+ {
+ WARN("remote handle %d is not a package\n", hInstall);
+ }
+ IUnknown_Release(remote_unk);
}
return handle;
@@ -1621,7 +1713,7 @@ end:
return r;
}
-static void msi_reset_folders( MSIPACKAGE *package, BOOL source )
+void msi_reset_folders( MSIPACKAGE *package, BOOL source )
{
MSIFOLDER *folder;
@@ -1640,7 +1732,7 @@ static void msi_reset_folders( MSIPACKAGE *package, BOOL source )
}
}
-UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue)
+UINT msi_set_property( MSIDATABASE *db, LPCWSTR szName, LPCWSTR szValue )
{
MSIQUERY *view;
MSIRECORD *row = NULL;
@@ -1664,7 +1756,7 @@ UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue)
'`','_','P','r','o','p','e','r','t','y','`',' ','W','H','E','R','E',' ',
'`','_','P','r','o','p','e','r','t','y','`',' ','=',' ','\'','%','s','\'',0};
- TRACE("%p %s %s\n", package, debugstr_w(szName), debugstr_w(szValue));
+ TRACE("%p %s %s\n", db, debugstr_w(szName), debugstr_w(szValue));
if (!szName)
return ERROR_INVALID_PARAMETER;
@@ -1673,7 +1765,7 @@ UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue)
if (!szName[0])
return szValue ? ERROR_FUNCTION_FAILED : ERROR_SUCCESS;
- rc = MSI_GetPropertyW(package, szName, 0, &sz);
+ rc = msi_get_property(db, szName, 0, &sz);
if (!szValue || !*szValue)
{
sprintfW(Query, Delete, szName);
@@ -1694,7 +1786,7 @@ UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue)
MSI_RecordSetStringW(row, 2, szValue);
}
- rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
+ rc = MSI_DatabaseOpenViewW(db, Query, &view);
if (rc == ERROR_SUCCESS)
{
rc = MSI_ViewExecute(view, row);
@@ -1705,9 +1797,6 @@ UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue)
if (row)
msiobj_release(&row->hdr);
- if (rc == ERROR_SUCCESS && (!lstrcmpW(szName, cszSourceDir)))
- msi_reset_folders(package, TRUE);
-
return rc;
}
@@ -1754,12 +1843,15 @@ UINT WINAPI MsiSetPropertyW( MSIHANDLE hInstall, LPCWSTR szName, LPCWSTR szValue
return ERROR_SUCCESS;
}
- ret = MSI_SetPropertyW( package, szName, szValue);
+ ret = msi_set_property( package->db, szName, szValue );
+ if (ret == ERROR_SUCCESS && !strcmpW( szName, cszSourceDir ))
+ msi_reset_folders( package, TRUE );
+
msiobj_release( &package->hdr );
return ret;
}
-static MSIRECORD *MSI_GetPropertyRow( MSIPACKAGE *package, LPCWSTR name )
+static MSIRECORD *msi_get_property_row( MSIDATABASE *db, LPCWSTR name )
{
MSIQUERY *view;
MSIRECORD *rec, *row = NULL;
@@ -1780,7 +1872,7 @@ static MSIRECORD *MSI_GetPropertyRow( MSIPACKAGE *package, LPCWSTR name )
MSI_RecordSetStringW(rec, 1, name);
- r = MSI_DatabaseOpenViewW(package->db, query, &view);
+ r = MSI_DatabaseOpenViewW(db, query, &view);
if (r == ERROR_SUCCESS)
{
MSI_ViewExecute(view, rec);
@@ -1794,13 +1886,13 @@ static MSIRECORD *MSI_GetPropertyRow( MSIPACKAGE *package, LPCWSTR name )
}
/* internal function, not compatible with MsiGetPropertyW */
-UINT MSI_GetPropertyW( MSIPACKAGE *package, LPCWSTR szName,
+UINT msi_get_property( MSIDATABASE *db, LPCWSTR szName,
LPWSTR szValueBuf, LPDWORD pchValueBuf )
{
MSIRECORD *row;
UINT rc = ERROR_FUNCTION_FAILED;
- row = MSI_GetPropertyRow( package, szName );
+ row = msi_get_property_row( db, szName );
if (*pchValueBuf > 0)
szValueBuf[0] = 0;
@@ -1826,19 +1918,19 @@ UINT MSI_GetPropertyW( MSIPACKAGE *package, LPCWSTR szName,
return rc;
}
-LPWSTR msi_dup_property(MSIPACKAGE *package, LPCWSTR prop)
+LPWSTR msi_dup_property(MSIDATABASE *db, LPCWSTR prop)
{
DWORD sz = 0;
LPWSTR str;
UINT r;
- r = MSI_GetPropertyW(package, prop, NULL, &sz);
+ r = msi_get_property(db, prop, NULL, &sz);
if (r != ERROR_SUCCESS && r != ERROR_MORE_DATA)
return NULL;
sz++;
str = msi_alloc(sz * sizeof(WCHAR));
- r = MSI_GetPropertyW(package, prop, str, &sz);
+ r = msi_get_property(db, prop, str, &sz);
if (r != ERROR_SUCCESS)
{
msi_free(str);
@@ -1848,9 +1940,9 @@ LPWSTR msi_dup_property(MSIPACKAGE *package, LPCWSTR prop)
return str;
}
-int msi_get_property_int(MSIPACKAGE *package, LPCWSTR prop, int def)
+int msi_get_property_int( MSIDATABASE *db, LPCWSTR prop, int def )
{
- LPWSTR str = msi_dup_property(package, prop);
+ LPWSTR str = msi_dup_property( db, prop );
int val = str ? atoiW(str) : def;
msi_free(str);
return val;
@@ -1929,7 +2021,7 @@ done:
return r;
}
- row = MSI_GetPropertyRow( package, name );
+ row = msi_get_property_row( package->db, name );
if (row)
val = MSI_RecordGetString( row, 1 );
diff --git a/dll/win32/msi/registry.c b/dll/win32/msi/registry.c
index 1cbdcc95288..518303f5da0 100644
--- a/dll/win32/msi/registry.c
+++ b/dll/win32/msi/registry.c
@@ -183,6 +183,16 @@ static const WCHAR szUserDataPatch_fmt[] = {
'U','s','e','r','D','a','t','a','\\',
'%','s','\\','P','a','t','c','h','e','s','\\','%','s',0};
+static const WCHAR szUserDataProductPatches_fmt[] = {
+'S','o','f','t','w','a','r','e','\\',
+'M','i','c','r','o','s','o','f','t','\\',
+'W','i','n','d','o','w','s','\\',
+'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+'I','n','s','t','a','l','l','e','r','\\',
+'U','s','e','r','D','a','t','a','\\',
+'%','s','\\','P','r','o','d','u','c','t','s','\\','%','s','\\',
+'P','a','t','c','h','e','s',0};
+
static const WCHAR szInstallProperties_fmt[] = {
'S','o','f','t','w','a','r','e','\\',
'M','i','c','r','o','s','o','f','t','\\',
@@ -286,7 +296,7 @@ BOOL squash_guid(LPCWSTR in, LPWSTR out)
out[0] = 0;
- if (FAILED(CLSIDFromString((LPOLESTR)in, &guid)))
+ if (FAILED(CLSIDFromString((LPCOLESTR)in, &guid)))
return FALSE;
for(i=0; i<8; i++)
@@ -887,6 +897,69 @@ UINT MSIREG_OpenUserDataPatchKey(LPCWSTR szPatch, MSIINSTALLCONTEXT dwContext,
return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
}
+UINT MSIREG_DeleteUserDataPatchKey(LPCWSTR patch, MSIINSTALLCONTEXT context)
+{
+ UINT r;
+ WCHAR squished_patch[GUID_SIZE];
+ WCHAR keypath[0x200];
+ LPWSTR usersid;
+
+ TRACE("%s\n", debugstr_w(patch));
+ if (!squash_guid(patch, squished_patch))
+ return ERROR_FUNCTION_FAILED;
+ TRACE("squished (%s)\n", debugstr_w(squished_patch));
+
+ if (context == MSIINSTALLCONTEXT_MACHINE)
+ sprintfW(keypath, szUserDataPatch_fmt, szLocalSid, squished_patch);
+ else
+ {
+ r = get_user_sid(&usersid);
+ if (r != ERROR_SUCCESS || !usersid)
+ {
+ ERR("Failed to retrieve user SID: %d\n", r);
+ return r;
+ }
+
+ sprintfW(keypath, szUserDataPatch_fmt, usersid, squished_patch);
+ LocalFree(usersid);
+ }
+
+ return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath);
+}
+
+UINT MSIREG_OpenUserDataProductPatchesKey(LPCWSTR product, MSIINSTALLCONTEXT context,
+ HKEY *key, BOOL create)
+{
+ UINT rc;
+ WCHAR squished_product[GUID_SIZE];
+ WCHAR keypath[0x200];
+ LPWSTR usersid;
+
+ TRACE("%s\n", debugstr_w(product));
+ if (!squash_guid(product, squished_product))
+ return ERROR_FUNCTION_FAILED;
+
+ if (context == MSIINSTALLCONTEXT_MACHINE)
+ sprintfW(keypath, szUserDataProductPatches_fmt, szLocalSid, squished_product);
+ else
+ {
+ rc = get_user_sid(&usersid);
+ if (rc != ERROR_SUCCESS || !usersid)
+ {
+ ERR("Failed to retrieve user SID: %d\n", rc);
+ return rc;
+ }
+
+ sprintfW(keypath, szUserDataProductPatches_fmt, usersid, squished_product);
+ LocalFree(usersid);
+ }
+
+ if (create)
+ return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+
+ return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+}
+
UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext,
LPCWSTR szUserSid, HKEY *key, BOOL create)
{
@@ -1156,7 +1229,7 @@ UINT WINAPI MsiDecomposeDescriptorW( LPCWSTR szDescriptor, LPWSTR szProduct,
len = ( &p[21] - szDescriptor );
TRACE("length = %d\n", len);
- *pUsed = len;
+ if (pUsed) *pUsed = len;
return ERROR_SUCCESS;
}
@@ -1236,17 +1309,13 @@ UINT WINAPI MsiEnumProductsW(DWORD index, LPWSTR lpguid)
if (index && index - last_index != 1)
return ERROR_INVALID_PARAMETER;
+ key = 0;
r = RegCreateKeyW(HKEY_LOCAL_MACHINE, szInstaller_LocalClassesProd, &key);
- if( r != ERROR_SUCCESS )
- return ERROR_NO_MORE_ITEMS;
+ if( r != ERROR_SUCCESS ) goto failed;
r = RegQueryInfoKeyW(key, NULL, NULL, NULL, &machine_count, NULL, NULL,
NULL, NULL, NULL, NULL, NULL);
- if( r != ERROR_SUCCESS )
- {
- RegCloseKey(key);
- return ERROR_NO_MORE_ITEMS;
- }
+ if( r != ERROR_SUCCESS ) goto failed;
if (machine_count && index <= machine_count)
{
@@ -1261,26 +1330,23 @@ UINT WINAPI MsiEnumProductsW(DWORD index, LPWSTR lpguid)
}
RegCloseKey(key);
+ key = 0;
r = get_user_sid(&usersid);
if (r != ERROR_SUCCESS || !usersid)
{
ERR("Failed to retrieve user SID: %d\n", r);
+ last_index = 0;
return r;
}
sprintfW(keypath, szInstaller_LocalManaged_fmt, usersid);
LocalFree(usersid);
r = RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, &key);
- if( r != ERROR_SUCCESS )
- return ERROR_NO_MORE_ITEMS;
+ if( r != ERROR_SUCCESS ) goto failed;
r = RegQueryInfoKeyW(key, NULL, NULL, NULL, &managed_count, NULL, NULL,
NULL, NULL, NULL, NULL, NULL);
- if( r != ERROR_SUCCESS )
- {
- RegCloseKey(key);
- return ERROR_NO_MORE_ITEMS;
- }
+ if( r != ERROR_SUCCESS ) goto failed;
if (managed_count && index <= machine_count + managed_count)
{
@@ -1295,17 +1361,13 @@ UINT WINAPI MsiEnumProductsW(DWORD index, LPWSTR lpguid)
}
RegCloseKey(key);
+ key = 0;
r = RegCreateKeyW(HKEY_CURRENT_USER, szUserProduct, &key);
- if( r != ERROR_SUCCESS )
- return ERROR_NO_MORE_ITEMS;
+ if( r != ERROR_SUCCESS ) goto failed;
r = RegQueryInfoKeyW(key, NULL, NULL, NULL, &unmanaged_count, NULL, NULL,
NULL, NULL, NULL, NULL, NULL);
- if( r != ERROR_SUCCESS )
- {
- RegCloseKey(key);
- return ERROR_NO_MORE_ITEMS;
- }
+ if( r != ERROR_SUCCESS ) goto failed;
if (unmanaged_count && index <= machine_count + managed_count + unmanaged_count)
{
@@ -1318,8 +1380,9 @@ UINT WINAPI MsiEnumProductsW(DWORD index, LPWSTR lpguid)
return ERROR_SUCCESS;
}
}
+failed:
RegCloseKey(key);
-
+ last_index = 0;
return ERROR_NO_MORE_ITEMS;
}
@@ -2051,7 +2114,7 @@ UINT WINAPI MsiEnumPatchesExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
DWORD idx = 0;
UINT r;
- static int last_index = 0;
+ static DWORD last_index;
TRACE("(%s, %s, %d, %d, %d, %p, %p, %p, %p, %p)\n",
debugstr_w(szProductCode), debugstr_w(szUserSid), dwContext, dwFilter,
@@ -2087,6 +2150,8 @@ UINT WINAPI MsiEnumPatchesExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
if (r == ERROR_SUCCESS)
last_index = dwIndex;
+ else
+ last_index = 0;
return r;
}
diff --git a/dll/win32/msi/script.c b/dll/win32/msi/script.c
index 8dfa6d2ac05..4f223daa8b0 100644
--- a/dll/win32/msi/script.c
+++ b/dll/win32/msi/script.c
@@ -62,7 +62,7 @@ static HRESULT create_ActiveScriptSite(IUnknown *pUnkOuter, LPVOID *ppObj)
if( pUnkOuter )
return CLASS_E_NOAGGREGATION;
- object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MsiActiveScriptSite));
+ object = msi_alloc_zero( sizeof(MsiActiveScriptSite) );
object->lpVtbl.lpVtbl = &ASS_Vtbl;
object->ref = 1;
@@ -236,7 +236,7 @@ static ULONG WINAPI MsiActiveScriptSite_Release(IActiveScriptSite* iface)
TRACE("(%p/%p)\n", iface, This);
if (!ref)
- HeapFree(GetProcessHeap(), 0, This);
+ msi_free(This);
return ref;
}
diff --git a/dll/win32/msi/storages.c b/dll/win32/msi/storages.c
index 6a8134b5627..3e8887437a7 100644
--- a/dll/win32/msi/storages.c
+++ b/dll/win32/msi/storages.c
@@ -43,7 +43,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(msidb);
typedef struct tabSTORAGE
{
UINT str_index;
- LPWSTR name;
IStorage *storage;
} STORAGE;
@@ -70,7 +69,7 @@ static BOOL storages_set_table_size(MSISTORAGESVIEW *sv, UINT size)
return TRUE;
}
-static STORAGE *create_storage(MSISTORAGESVIEW *sv, LPWSTR name, IStorage *stg)
+static STORAGE *create_storage(MSISTORAGESVIEW *sv, LPCWSTR name, IStorage *stg)
{
STORAGE *storage;
@@ -78,14 +77,7 @@ static STORAGE *create_storage(MSISTORAGESVIEW *sv, LPWSTR name, IStorage *stg)
if (!storage)
return NULL;
- storage->name = strdupW(name);
- if (!storage->name)
- {
- msi_free(storage);
- return NULL;
- }
-
- storage->str_index = msi_addstringW(sv->db->strings, 0, storage->name, -1, 1, StringNonPersistent);
+ storage->str_index = msi_addstringW(sv->db->strings, name, -1, 1, StringNonPersistent);
storage->storage = stg;
if (storage->storage)
@@ -436,8 +428,6 @@ static UINT STORAGES_delete(struct tagMSIVIEW *view)
{
if (sv->storages[i]->storage)
IStorage_Release(sv->storages[i]->storage);
-
- msi_free(sv->storages[i]->name);
msi_free(sv->storages[i]);
}
diff --git a/dll/win32/msi/streams.c b/dll/win32/msi/streams.c
index 66bda767a00..59e845df82d 100644
--- a/dll/win32/msi/streams.c
+++ b/dll/win32/msi/streams.c
@@ -68,7 +68,7 @@ static BOOL streams_set_table_size(MSISTREAMSVIEW *sv, UINT size)
return TRUE;
}
-static STREAM *create_stream(MSISTREAMSVIEW *sv, LPWSTR name, BOOL encoded, IStream *stm)
+static STREAM *create_stream(MSISTREAMSVIEW *sv, LPCWSTR name, BOOL encoded, IStream *stm)
{
STREAM *stream;
WCHAR decoded[MAX_STREAM_NAME_LEN];
@@ -84,7 +84,7 @@ static STREAM *create_stream(MSISTREAMSVIEW *sv, LPWSTR name, BOOL encoded, IStr
name = decoded;
}
- stream->str_index = msi_addstringW(sv->db->strings, 0, name, -1, 1, StringNonPersistent);
+ stream->str_index = msi_addstringW(sv->db->strings, name, -1, 1, StringNonPersistent);
stream->stream = stm;
return stream;
}
@@ -183,7 +183,7 @@ static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, U
}
encname = encode_streamname(FALSE, name);
- IStorage_DestroyElement(sv->db->storage, encname);
+ db_destroy_stream(sv->db, encname);
r = write_stream_data(sv->db->storage, name, data, count, FALSE);
if (r != ERROR_SUCCESS)
diff --git a/dll/win32/msi/string.c b/dll/win32/msi/string.c
index 3bdc4360bd0..21b1db2a405 100644
--- a/dll/win32/msi/string.c
+++ b/dll/win32/msi/string.c
@@ -44,8 +44,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(msidb);
typedef struct _msistring
{
- UINT persistent_refcount;
- UINT nonpersistent_refcount;
+ USHORT persistent_refcount;
+ USHORT nonpersistent_refcount;
LPWSTR str;
} msistring;
@@ -188,7 +188,7 @@ static void insert_string_sorted( string_table *st, UINT string_id )
st->sortcount++;
}
-static void set_st_entry( string_table *st, UINT n, LPWSTR str, UINT refcount, enum StringPersistence persistence )
+static void set_st_entry( string_table *st, UINT n, LPWSTR str, USHORT refcount, enum StringPersistence persistence )
{
if (persistence == StringPersistent)
{
@@ -237,7 +237,7 @@ static UINT msi_string2idA( const string_table *st, LPCSTR buffer, UINT *id )
return r;
}
-static int msi_addstring( string_table *st, UINT n, const CHAR *data, int len, UINT refcount, enum StringPersistence persistence )
+static int msi_addstring( string_table *st, UINT n, const CHAR *data, int len, USHORT refcount, enum StringPersistence persistence )
{
LPWSTR str;
int sz;
@@ -288,42 +288,28 @@ static int msi_addstring( string_table *st, UINT n, const CHAR *data, int len, U
return n;
}
-int msi_addstringW( string_table *st, UINT n, const WCHAR *data, int len, UINT refcount, enum StringPersistence persistence )
+int msi_addstringW( string_table *st, const WCHAR *data, int len, USHORT refcount, enum StringPersistence persistence )
{
+ UINT n;
LPWSTR str;
- /* TRACE("[%2d] = %s\n", string_no, debugstr_an(data,len) ); */
-
if( !data )
return 0;
if( !data[0] )
return 0;
- if( n > 0 )
+
+ if( msi_string2idW( st, data, &n ) == ERROR_SUCCESS )
{
- if( st->strings[n].persistent_refcount ||
- st->strings[n].nonpersistent_refcount )
- return -1;
- }
- else
- {
- if( ERROR_SUCCESS == msi_string2idW( st, data, &n ) )
- {
- if (persistence == StringPersistent)
- st->strings[n].persistent_refcount += refcount;
- else
- st->strings[n].nonpersistent_refcount += refcount;
- return n;
- }
- n = st_find_free_entry( st );
- if( n == -1 )
- return -1;
+ if (persistence == StringPersistent)
+ st->strings[n].persistent_refcount += refcount;
+ else
+ st->strings[n].nonpersistent_refcount += refcount;
+ return n;
}
- if( n < 1 )
- {
- ERR("invalid index adding %s (%d)\n", debugstr_w( data ), n );
+ n = st_find_free_entry( st );
+ if( n == -1 )
return -1;
- }
/* allocate a new string */
if(len<0)
diff --git a/dll/win32/msi/table.c b/dll/win32/msi/table.c
index 6737ac59168..3b117ae53c4 100644
--- a/dll/win32/msi/table.c
+++ b/dll/win32/msi/table.c
@@ -1383,7 +1383,7 @@ static UINT TABLE_set_row( struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UI
if ( r != ERROR_SUCCESS )
{
LPCWSTR sval = MSI_RecordGetString( rec, i + 1 );
- val = msi_addstringW( tv->db->strings, 0, sval, -1, 1,
+ val = msi_addstringW( tv->db->strings, sval, -1, 1,
persistent ? StringPersistent : StringNonPersistent );
}
diff --git a/dll/win32/msi/upgrade.c b/dll/win32/msi/upgrade.c
index a440070a4d8..b131d666fe2 100644
--- a/dll/win32/msi/upgrade.c
+++ b/dll/win32/msi/upgrade.c
@@ -61,8 +61,9 @@ static void append_productcode(MSIPACKAGE* package, LPCWSTR action_property,
LPWSTR prop;
LPWSTR newprop;
DWORD len;
+ UINT r;
- prop = msi_dup_property(package, action_property );
+ prop = msi_dup_property(package->db, action_property );
if (prop)
len = strlenW(prop);
else
@@ -87,9 +88,13 @@ static void append_productcode(MSIPACKAGE* package, LPCWSTR action_property,
newprop[0] = 0;
strcatW(newprop,productid);
- MSI_SetPropertyW(package, action_property, newprop);
- TRACE("Found Related Product... %s now %s\n",debugstr_w(action_property),
- debugstr_w(newprop));
+ r = msi_set_property( package->db, action_property, newprop );
+ if (r == ERROR_SUCCESS && !strcmpW( action_property, cszSourceDir ))
+ msi_reset_folders( package, TRUE );
+
+ TRACE("Found Related Product... %s now %s\n",
+ debugstr_w(action_property), debugstr_w(newprop));
+
msi_free( prop );
msi_free( newprop );
}
@@ -146,26 +151,30 @@ static UINT ITERATE_FindRelatedProducts(MSIRECORD *rec, LPVOID param)
(LPBYTE)&check, &sz);
/* check min */
ver = MSI_RecordGetString(rec,2);
- comp_ver = msi_version_str_to_dword(ver);
- r = check - comp_ver;
- if (r < 0 || (r == 0 && !(attributes &
- msidbUpgradeAttributesVersionMinInclusive)))
+ if (ver)
{
- RegCloseKey(hukey);
- index ++;
- continue;
+ comp_ver = msi_version_str_to_dword(ver);
+ r = check - comp_ver;
+ if (r < 0 || (r == 0 && !(attributes & msidbUpgradeAttributesVersionMinInclusive)))
+ {
+ RegCloseKey(hukey);
+ index ++;
+ continue;
+ }
}
/* check max */
ver = MSI_RecordGetString(rec,3);
- comp_ver = msi_version_str_to_dword(ver);
- r = check - comp_ver;
- if (r > 0 || (r == 0 && !(attributes &
- msidbUpgradeAttributesVersionMaxInclusive)))
+ if (ver)
{
- RegCloseKey(hukey);
- index ++;
- continue;
+ comp_ver = msi_version_str_to_dword(ver);
+ r = check - comp_ver;
+ if (r > 0 || (r == 0 && !(attributes & msidbUpgradeAttributesVersionMaxInclusive)))
+ {
+ RegCloseKey(hukey);
+ index ++;
+ continue;
+ }
}
/* check language*/
@@ -203,19 +212,19 @@ UINT ACTION_FindRelatedProducts(MSIPACKAGE *package)
UINT rc = ERROR_SUCCESS;
MSIQUERY *view;
- if (msi_get_property_int(package, szInstalled, 0))
+ if (msi_get_property_int(package->db, szInstalled, 0))
{
TRACE("Skipping FindRelatedProducts action: product already installed\n");
return ERROR_SUCCESS;
}
- if (check_unique_action(package,szFindRelatedProducts))
+ if (check_unique_action(package, szFindRelatedProducts))
{
- TRACE("Skipping FindRelatedProducts action: already done on client side\n");
+ TRACE("Skipping FindRelatedProducts action: already done in UI sequence\n");
return ERROR_SUCCESS;
}
else
- register_unique_action(package,szFindRelatedProducts);
+ register_unique_action(package, szFindRelatedProducts);
rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
if (rc != ERROR_SUCCESS)
diff --git a/dll/win32/msrle32/msrle32.rbuild b/dll/win32/msrle32/msrle32.rbuild
index 6ef26447334..2b8a6ca4dc6 100644
--- a/dll/win32/msrle32/msrle32.rbuild
+++ b/dll/win32/msrle32/msrle32.rbuild
@@ -1,4 +1,4 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/msxml3/domdoc.c b/dll/win32/msxml3/domdoc.c
index aae8a343500..d72d20be8dc 100644
--- a/dll/win32/msxml3/domdoc.c
+++ b/dll/win32/msxml3/domdoc.c
@@ -2177,8 +2177,7 @@ xmldoc_SetSite( IObjectWithSite *iface, IUnknown *punk )
return S_OK;
}
- if ( punk )
- IUnknown_AddRef( punk );
+ IUnknown_AddRef( punk );
if(This->site)
IUnknown_Release( This->site );
diff --git a/dll/win32/msxml3/regsvr.c b/dll/win32/msxml3/regsvr.c
index d9b47dde89b..415e5af613a 100644
--- a/dll/win32/msxml3/regsvr.c
+++ b/dll/win32/msxml3/regsvr.c
@@ -515,8 +515,23 @@ static struct regsvr_coclass const coclass_list[] = {
"Both",
"Microsoft.FreeThreadedXMLDOM.1.0",
"1.0"
+ },
+ { &CLSID_FreeThreadedDOMDocument26,
+ "Free Threaded XML DOM Document 2.6",
+ NULL,
+ "msxml3.dll",
+ "Both",
+ "Microsoft.FreeThreadedXMLDOM.1.0",
+ "1.0"
+ },
+ { &CLSID_FreeThreadedDOMDocument30,
+ "Free Threaded XML DOM Document 3.0",
+ NULL,
+ "msxml3.dll",
+ "Both",
+ "Microsoft.FreeThreadedDOMDocument.1.0",
+ "1.0"
},
-
{ &CLSID_XMLHTTPRequest,
"XML HTTP Request",
NULL,
@@ -548,6 +563,14 @@ static struct regsvr_coclass const coclass_list[] = {
"Msxml2.XMLSchemaCache",
"3.0"
},
+ { &CLSID_XMLSchemaCache26,
+ "XML Schema Cache 2.6",
+ NULL,
+ "msxml3.dll",
+ "Both",
+ "Msxml2.XMLSchemaCache",
+ "2.6"
+ },
{ &CLSID_XMLSchemaCache30,
"XML Schema Cache 3.0",
NULL,
@@ -588,6 +611,22 @@ static struct regsvr_coclass const coclass_list[] = {
"Msxml2.MXXMLWriter",
"3.0"
},
+ { &CLSID_SAXAttributes,
+ "SAX Attribute",
+ NULL,
+ "msxml3.dll",
+ "Both",
+ "Msxml2.SAXAttributes",
+ NULL
+ },
+ { &CLSID_SAXAttributes30,
+ "SAX Attribute 3.0",
+ NULL,
+ "msxml3.dll",
+ "Both",
+ "Msxml2.SAXAttributes",
+ "3.0"
+ },
{ NULL } /* list terminator */
};
@@ -642,6 +681,16 @@ static struct progid const progid_list[] = {
&CLSID_DOMFreeThreadedDocument,
"Microsoft.FreeThreadedXMLDOM.1.0"
},
+ { "MSXML.FreeThreadedDOMDocument26",
+ "Free threaded XML DOM Document 2.6",
+ &CLSID_FreeThreadedDOMDocument26,
+ NULL
+ },
+ { "MSXML.FreeThreadedDOMDocument30",
+ "Free threaded XML DOM Document 3.0",
+ &CLSID_FreeThreadedDOMDocument30,
+ NULL
+ },
{ "Microsoft.XMLHTTP",
"XML HTTP Request",
&CLSID_XMLHTTPRequest,
@@ -672,6 +721,11 @@ static struct progid const progid_list[] = {
&CLSID_XMLSchemaCache,
"Msxml2.XMLSchemaCache.3.0"
},
+ { "Msxml2.XMLSchemaCache.2.6",
+ "XML Schema Cache 2.6",
+ &CLSID_XMLSchemaCache26,
+ "Msxml2.XMLSchemaCache.2.6"
+ },
{ "Msxml2.XMLSchemaCache.3.0",
"XML Schema Cache 3.0",
&CLSID_XMLSchemaCache30,
@@ -697,7 +751,16 @@ static struct progid const progid_list[] = {
&CLSID_MXXMLWriter30,
NULL
},
-
+ { "Msxml2.SAXAttributes",
+ "SAX Attribute",
+ &CLSID_SAXAttributes,
+ NULL
+ },
+ { "Msxml2.SAXAttributes.3.0",
+ "SAX Attribute 3.0",
+ &CLSID_SAXAttributes30,
+ NULL
+ },
{ NULL } /* list terminator */
};
diff --git a/dll/win32/netshell/res/neterror.ico b/dll/win32/netshell/res/neterror.ico
index c80f6b7c97d..f20a0a4995b 100644
Binary files a/dll/win32/netshell/res/neterror.ico and b/dll/win32/netshell/res/neterror.ico differ
diff --git a/dll/win32/netshell/res/netidle.ico b/dll/win32/netshell/res/netidle.ico
index fbbdd17da96..6c175cc3d3c 100644
Binary files a/dll/win32/netshell/res/netidle.ico and b/dll/win32/netshell/res/netidle.ico differ
diff --git a/dll/win32/netshell/res/netoff.ico b/dll/win32/netshell/res/netoff.ico
index 0d3bb295e2a..9cb3f62e895 100644
Binary files a/dll/win32/netshell/res/netoff.ico and b/dll/win32/netshell/res/netoff.ico differ
diff --git a/dll/win32/netshell/res/netrec.ico b/dll/win32/netshell/res/netrec.ico
index 5aaffe27e6e..3ada0c28d99 100644
Binary files a/dll/win32/netshell/res/netrec.ico and b/dll/win32/netshell/res/netrec.ico differ
diff --git a/dll/win32/netshell/res/nettrans.ico b/dll/win32/netshell/res/nettrans.ico
index b3f647f20e9..cfad0528c99 100644
Binary files a/dll/win32/netshell/res/nettrans.ico and b/dll/win32/netshell/res/nettrans.ico differ
diff --git a/dll/win32/netshell/res/nettrrec.ico b/dll/win32/netshell/res/nettrrec.ico
index 8c7420827c1..27a2c1aaf4d 100644
Binary files a/dll/win32/netshell/res/nettrrec.ico and b/dll/win32/netshell/res/nettrrec.ico differ
diff --git a/dll/win32/odbccp32/odbccp32.rbuild b/dll/win32/odbccp32/odbccp32.rbuild
index 253485a359e..15bb8d84bb4 100644
--- a/dll/win32/odbccp32/odbccp32.rbuild
+++ b/dll/win32/odbccp32/odbccp32.rbuild
@@ -1,7 +1,7 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/ole32/clipboard.c b/dll/win32/ole32/clipboard.c
index 2afc77e35f0..3064bb04156 100644
--- a/dll/win32/ole32/clipboard.c
+++ b/dll/win32/ole32/clipboard.c
@@ -1266,10 +1266,10 @@ static HRESULT WINAPI snapshot_GetDataHere(IDataObject *iface, FORMATETC *fmt,
ole_priv_data_entry *entry;
TYMED supported;
- TRACE("(%p, %p {%s}, %p (tymed %x)\n", iface, fmt, dump_fmtetc(fmt), med, med->tymed);
-
if ( !fmt || !med ) return E_INVALIDARG;
+ TRACE("(%p, %p {%s}, %p (tymed %x)\n", iface, fmt, dump_fmtetc(fmt), med, med->tymed);
+
if ( !OpenClipboard(NULL)) return CLIPBRD_E_CANT_OPEN;
if(!This->data)
diff --git a/dll/win32/ole32/comcat.c b/dll/win32/ole32/comcat.c
index b8060bdefca..fe0f7e5962e 100644
--- a/dll/win32/ole32/comcat.c
+++ b/dll/win32/ole32/comcat.c
@@ -232,18 +232,20 @@ static HRESULT COMCAT_IsClassOfCategories(
LPCWSTR string;
/* Check that every given category is implemented by class. */
- res = RegOpenKeyExW(key, impl_keyname, 0, KEY_READ, &subkey);
- if (res != ERROR_SUCCESS) return S_FALSE;
- for (string = categories->impl_strings; *string; string += 39) {
- HKEY catkey;
- res = RegOpenKeyExW(subkey, string, 0, 0, &catkey);
- if (res != ERROR_SUCCESS) {
- RegCloseKey(subkey);
- return S_FALSE;
+ if (*categories->impl_strings) {
+ res = RegOpenKeyExW(key, impl_keyname, 0, KEY_READ, &subkey);
+ if (res != ERROR_SUCCESS) return S_FALSE;
+ for (string = categories->impl_strings; *string; string += 39) {
+ HKEY catkey;
+ res = RegOpenKeyExW(subkey, string, 0, 0, &catkey);
+ if (res != ERROR_SUCCESS) {
+ RegCloseKey(subkey);
+ return S_FALSE;
+ }
+ RegCloseKey(catkey);
}
- RegCloseKey(catkey);
+ RegCloseKey(subkey);
}
- RegCloseKey(subkey);
/* Check that all categories required by class are given. */
res = RegOpenKeyExW(key, req_keyname, 0, KEY_READ, &subkey);
diff --git a/dll/win32/ole32/compobj.c b/dll/win32/ole32/compobj.c
index 0fb074dc50c..937f3d8a06c 100644
--- a/dll/win32/ole32/compobj.c
+++ b/dll/win32/ole32/compobj.c
@@ -4156,7 +4156,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
break;
case DLL_PROCESS_DETACH:
- OLEDD_UnInitialize();
COMPOBJ_UninitProcess();
RPC_UnregisterAllChannelHooks();
COMPOBJ_DllList_Free();
diff --git a/dll/win32/ole32/compositemoniker.c b/dll/win32/ole32/compositemoniker.c
index 7402b8edbbf..275d875362b 100644
--- a/dll/win32/ole32/compositemoniker.c
+++ b/dll/win32/ole32/compositemoniker.c
@@ -445,7 +445,6 @@ static HRESULT WINAPI
CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar,
IMoniker** ppmkToLeft, IMoniker** ppmkReduced)
{
- HRESULT res;
IMoniker *tempMk,*antiMk,*mostRigthMk,*leftReducedComposedMk,*mostRigthReducedMk;
IEnumMoniker *enumMoniker;
@@ -462,8 +461,8 @@ CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar
IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
IEnumMoniker_Release(enumMoniker);
- res=CreateAntiMoniker(&antiMk);
- res=IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
+ CreateAntiMoniker(&antiMk);
+ IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
IMoniker_Release(antiMk);
return IMoniker_Reduce(mostRigthMk,pbc,dwReduceHowFar,&tempMk, ppmkReduced);
@@ -479,8 +478,8 @@ CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar
IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
IEnumMoniker_Release(enumMoniker);
- res=CreateAntiMoniker(&antiMk);
- res=IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
+ CreateAntiMoniker(&antiMk);
+ IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
IMoniker_Release(antiMk);
/* If any of the components reduces itself, the method returns S_OK and passes back a composite */
diff --git a/dll/win32/ole32/defaulthandler.c b/dll/win32/ole32/defaulthandler.c
index 5130513d57f..d0a871f17c0 100644
--- a/dll/win32/ole32/defaulthandler.c
+++ b/dll/win32/ole32/defaulthandler.c
@@ -365,7 +365,7 @@ static HRESULT WINAPI DefaultHandler_SetClientSite(
if (This->clientSite)
IOleClientSite_AddRef(This->clientSite);
- return S_OK;
+ return hr;
}
/************************************************************************
diff --git a/dll/win32/ole32/hglobalstream.c b/dll/win32/ole32/hglobalstream.c
index 5742f99619a..ef616defec5 100644
--- a/dll/win32/ole32/hglobalstream.c
+++ b/dll/win32/ole32/hglobalstream.c
@@ -371,12 +371,6 @@ static HRESULT WINAPI HGLOBALStreamImpl_Seek(
TRACE("(%p, %x%08x, %d, %p)\n", iface, dlibMove.u.HighPart,
dlibMove.u.LowPart, dwOrigin, plibNewPosition);
- if (dlibMove.u.LowPart >= 0x80000000)
- {
- hr = STG_E_SEEKERROR;
- goto end;
- }
-
/*
* The file pointer is moved depending on the given "function"
* parameter.
@@ -405,10 +399,19 @@ static HRESULT WINAPI HGLOBALStreamImpl_Seek(
newPosition.u.HighPart = 0;
newPosition.u.LowPart += dlibMove.QuadPart;
-end:
- if (plibNewPosition) *plibNewPosition = newPosition;
+ if (dlibMove.u.LowPart >= 0x80000000 &&
+ newPosition.u.LowPart >= dlibMove.u.LowPart)
+ {
+ /* We tried to seek backwards and went past the start. */
+ hr = STG_E_SEEKERROR;
+ goto end;
+ }
+
This->currentPosition = newPosition;
+end:
+ if (plibNewPosition) *plibNewPosition = This->currentPosition;
+
return hr;
}
diff --git a/dll/win32/ole32/ifs.c b/dll/win32/ole32/ifs.c
index c6a6962cd72..1a10c3e1f53 100644
--- a/dll/win32/ole32/ifs.c
+++ b/dll/win32/ole32/ifs.c
@@ -501,7 +501,7 @@ HRESULT WINAPI CoRevokeMallocSpy(void)
}
LeaveCriticalSection(&IMalloc32_SpyCS);
- return S_OK;
+ return hres;
}
/******************************************************************************
diff --git a/dll/win32/ole32/marshal.c b/dll/win32/ole32/marshal.c
index 54a3a87b2b6..d14516f6dec 100644
--- a/dll/win32/ole32/marshal.c
+++ b/dll/win32/ole32/marshal.c
@@ -1214,16 +1214,13 @@ StdMarshalImpl_MarshalInterface(
RPC_StartRemoting(apt);
hres = marshal_object(apt, &stdobjref, riid, pv, mshlflags);
- if (hres)
+ if (hres != S_OK)
{
ERR("Failed to create ifstub, hres=0x%x\n", hres);
return hres;
}
- hres = IStream_Write(pStm, &stdobjref, sizeof(stdobjref), &res);
- if (hres) return hres;
-
- return S_OK;
+ return IStream_Write(pStm, &stdobjref, sizeof(stdobjref), &res);
}
/* helper for StdMarshalImpl_UnmarshalInterface - does the unmarshaling with
@@ -1321,10 +1318,10 @@ StdMarshalImpl_UnmarshalInterface(LPMARSHAL iface, IStream *pStm, REFIID riid, v
/* read STDOBJREF from wire */
hres = IStream_Read(pStm, &stdobjref, sizeof(stdobjref), &res);
- if (hres) return STG_E_READFAULT;
+ if (hres != S_OK) return STG_E_READFAULT;
hres = apartment_getoxid(apt, &oxid);
- if (hres) return hres;
+ if (hres != S_OK) return hres;
/* check if we're marshalling back to ourselves */
if ((oxid == stdobjref.oxid) && (stubmgr = get_stub_manager(apt, stdobjref.oid)))
@@ -1374,7 +1371,7 @@ StdMarshalImpl_UnmarshalInterface(LPMARSHAL iface, IStream *pStm, REFIID riid, v
if (stubmgr) stub_manager_int_release(stubmgr);
if (stub_apt) apartment_release(stub_apt);
- if (hres) WARN("Failed with error 0x%08x\n", hres);
+ if (hres != S_OK) WARN("Failed with error 0x%08x\n", hres);
else TRACE("Successfully created proxy %p\n", *ppv);
return hres;
@@ -1392,7 +1389,7 @@ StdMarshalImpl_ReleaseMarshalData(LPMARSHAL iface, IStream *pStm)
TRACE("iface=%p, pStm=%p\n", iface, pStm);
hres = IStream_Read(pStm, &stdobjref, sizeof(stdobjref), &res);
- if (hres) return STG_E_READFAULT;
+ if (hres != S_OK) return STG_E_READFAULT;
TRACE("oxid = %s, oid = %s, ipid = %s\n",
wine_dbgstr_longlong(stdobjref.oxid),
@@ -1516,7 +1513,7 @@ static HRESULT get_marshaler(REFIID riid, IUnknown *pUnk, DWORD dwDestContext,
if (!pUnk)
return E_POINTER;
hr = IUnknown_QueryInterface(pUnk, &IID_IMarshal, (LPVOID*)pMarshal);
- if (hr)
+ if (hr != S_OK)
hr = CoGetStandardMarshal(riid, pUnk, dwDestContext, pvDestContext,
mshlFlags, pMarshal);
return hr;
@@ -1537,7 +1534,7 @@ static HRESULT get_unmarshaler_from_stream(IStream *stream, IMarshal **marshal,
/* read common OBJREF header */
hr = IStream_Read(stream, &objref, FIELD_OFFSET(OBJREF, u_objref), &res);
- if (hr || (res != FIELD_OFFSET(OBJREF, u_objref)))
+ if (hr != S_OK || (res != FIELD_OFFSET(OBJREF, u_objref)))
{
ERR("Failed to read common OBJREF header, 0x%08x\n", hr);
return STG_E_READFAULT;
@@ -1566,7 +1563,7 @@ static HRESULT get_unmarshaler_from_stream(IStream *stream, IMarshal **marshal,
/* read constant sized OR_CUSTOM data from stream */
hr = IStream_Read(stream, &objref.u_objref.u_custom,
custom_header_size, &res);
- if (hr || (res != custom_header_size))
+ if (hr != S_OK || (res != custom_header_size))
{
ERR("Failed to read OR_CUSTOM header, 0x%08x\n", hr);
return STG_E_READFAULT;
@@ -1583,7 +1580,7 @@ static HRESULT get_unmarshaler_from_stream(IStream *stream, IMarshal **marshal,
return RPC_E_INVALID_OBJREF;
}
- if (hr)
+ if (hr != S_OK)
ERR("Failed to create marshal, 0x%08x\n", hr);
return hr;
@@ -1618,12 +1615,12 @@ HRESULT WINAPI CoGetMarshalSizeMax(ULONG *pulSize, REFIID riid, IUnknown *pUnk,
CLSID marshaler_clsid;
hr = get_marshaler(riid, pUnk, dwDestContext, pvDestContext, mshlFlags, &pMarshal);
- if (hr)
+ if (hr != S_OK)
return hr;
hr = IMarshal_GetUnmarshalClass(pMarshal, riid, pUnk, dwDestContext,
pvDestContext, mshlFlags, &marshaler_clsid);
- if (hr)
+ if (hr != S_OK)
{
ERR("IMarshal::GetUnmarshalClass failed, 0x%08x\n", hr);
IMarshal_Release(pMarshal);
@@ -1711,7 +1708,7 @@ HRESULT WINAPI CoMarshalInterface(IStream *pStream, REFIID riid, IUnknown *pUnk,
/* get the marshaler for the specified interface */
hr = get_marshaler(riid, pUnk, dwDestContext, pvDestContext, mshlFlags, &pMarshal);
- if (hr)
+ if (hr != S_OK)
{
ERR("Failed to get marshaller, 0x%08x\n", hr);
return hr;
@@ -1719,7 +1716,7 @@ HRESULT WINAPI CoMarshalInterface(IStream *pStream, REFIID riid, IUnknown *pUnk,
hr = IMarshal_GetUnmarshalClass(pMarshal, riid, pUnk, dwDestContext,
pvDestContext, mshlFlags, &marshaler_clsid);
- if (hr)
+ if (hr != S_OK)
{
ERR("IMarshal::GetUnmarshalClass failed, 0x%08x\n", hr);
goto cleanup;
@@ -1733,7 +1730,7 @@ HRESULT WINAPI CoMarshalInterface(IStream *pStream, REFIID riid, IUnknown *pUnk,
/* write the common OBJREF header to the stream */
hr = IStream_Write(pStream, &objref, FIELD_OFFSET(OBJREF, u_objref), NULL);
- if (hr)
+ if (hr != S_OK)
{
ERR("Failed to write OBJREF header to stream, 0x%08x\n", hr);
goto cleanup;
@@ -1749,7 +1746,7 @@ HRESULT WINAPI CoMarshalInterface(IStream *pStream, REFIID riid, IUnknown *pUnk,
hr = IMarshal_GetMarshalSizeMax(pMarshal, riid, pUnk, dwDestContext,
pvDestContext, mshlFlags,
&objref.u_objref.u_custom.size);
- if (hr)
+ if (hr != S_OK)
{
ERR("Failed to get max size of marshal data, error 0x%08x\n", hr);
goto cleanup;
@@ -1757,7 +1754,7 @@ HRESULT WINAPI CoMarshalInterface(IStream *pStream, REFIID riid, IUnknown *pUnk,
/* write constant sized common header and OR_CUSTOM data into stream */
hr = IStream_Write(pStream, &objref,
FIELD_OFFSET(OBJREF, u_objref.u_custom.pData), NULL);
- if (hr)
+ if (hr != S_OK)
{
ERR("Failed to write OR_CUSTOM header to stream with 0x%08x\n", hr);
goto cleanup;
@@ -1769,7 +1766,7 @@ HRESULT WINAPI CoMarshalInterface(IStream *pStream, REFIID riid, IUnknown *pUnk,
hr = IMarshal_MarshalInterface(pMarshal, pStream, riid, pUnk, dwDestContext,
pvDestContext, mshlFlags);
- if (hr)
+ if (hr != S_OK)
{
ERR("Failed to marshal the interface %s, %x\n", debugstr_guid(riid), hr);
goto cleanup;
@@ -1821,7 +1818,7 @@ HRESULT WINAPI CoUnmarshalInterface(IStream *pStream, REFIID riid, LPVOID *ppv)
/* call the helper object to do the actual unmarshaling */
hr = IMarshal_UnmarshalInterface(pMarshal, pStream, &iid, (LPVOID*)&object);
- if (hr)
+ if (hr != S_OK)
ERR("IMarshal::UnmarshalInterface failed, 0x%08x\n", hr);
if (hr == S_OK)
@@ -1831,7 +1828,7 @@ HRESULT WINAPI CoUnmarshalInterface(IStream *pStream, REFIID riid, LPVOID *ppv)
{
TRACE("requested interface != marshalled interface, additional QI needed\n");
hr = IUnknown_QueryInterface(object, riid, ppv);
- if (hr)
+ if (hr != S_OK)
ERR("Couldn't query for interface %s, hr = 0x%08x\n",
debugstr_guid(riid), hr);
IUnknown_Release(object);
@@ -1885,7 +1882,7 @@ HRESULT WINAPI CoReleaseMarshalData(IStream *pStream)
/* call the helper object to do the releasing of marshal data */
hr = IMarshal_ReleaseMarshalData(pMarshal, pStream);
- if (hr)
+ if (hr != S_OK)
ERR("IMarshal::ReleaseMarshalData failed with error 0x%08x\n", hr);
IMarshal_Release(pMarshal);
diff --git a/dll/win32/ole32/moniker.c b/dll/win32/ole32/moniker.c
index 2fb03ae6650..b0030dee59b 100644
--- a/dll/win32/ole32/moniker.c
+++ b/dll/win32/ole32/moniker.c
@@ -1109,7 +1109,13 @@ HRESULT WINAPI MkParseDisplayName(LPBC pbc, LPCOLESTR szDisplayName,
TRACE("(%p, %s, %p, %p)\n", pbc, debugstr_w(szDisplayName), pchEaten, ppmk);
- if (!(IsValidInterface((LPUNKNOWN) pbc)))
+ if (!pbc || !IsValidInterface((LPUNKNOWN) pbc))
+ return E_INVALIDARG;
+
+ if (!szDisplayName || !*szDisplayName)
+ return E_INVALIDARG;
+
+ if (!pchEaten || !ppmk)
return E_INVALIDARG;
*pchEaten = 0;
diff --git a/dll/win32/ole32/ole2.c b/dll/win32/ole32/ole2.c
index 6bf79fdb507..41989f3331b 100644
--- a/dll/win32/ole32/ole2.c
+++ b/dll/win32/ole32/ole2.c
@@ -57,13 +57,6 @@ WINE_DECLARE_DEBUG_CHANNEL(accel);
* These are static/global variables and internal data structures that the
* OLE module uses to maintain it's state.
*/
-typedef struct tagDropTargetNode
-{
- HWND hwndTarget;
- IDropTarget* dropTarget;
- struct list entry;
-} DropTargetNode;
-
typedef struct tagTrackerWindowInfo
{
IDataObject* dataObject;
@@ -110,12 +103,25 @@ static LONG OLE_moduleLockCount = 0;
/*
* Name of our registered window class.
*/
-static const char OLEDD_DRAGTRACKERCLASS[] = "WineDragDropTracker32";
+static const WCHAR OLEDD_DRAGTRACKERCLASS[] =
+ {'W','i','n','e','D','r','a','g','D','r','o','p','T','r','a','c','k','e','r','3','2',0};
/*
- * This is the head of the Drop target container.
+ * Name of menu descriptor property.
*/
-static struct list targetListHead = LIST_INIT(targetListHead);
+static const WCHAR prop_olemenuW[] =
+ {'P','R','O','P','_','O','L','E','M','e','n','u','D','e','s','c','r','i','p','t','o','r',0};
+
+/* property to store IDropTarget pointer */
+static const WCHAR prop_oledroptarget[] =
+ {'O','l','e','D','r','o','p','T','a','r','g','e','t','I','n','t','e','r','f','a','c','e',0};
+
+static const WCHAR clsidfmtW[] =
+ {'C','L','S','I','D','\\','{','%','0','8','x','-','%','0','4','x','-','%','0','4','x','-',
+ '%','0','2','x','%','0','2','x','-','%','0','2','x','%','0','2','x','%','0','2','x','%','0','2','x',
+ '%','0','2','x','%','0','2','x','}','\\',0};
+
+static const WCHAR emptyW[] = { 0 };
/******************************************************************************
* These are the prototypes of miscellaneous utility methods
@@ -144,22 +150,12 @@ extern void OLEClipbrd_Initialize(void);
/******************************************************************************
* These are the prototypes of the utility methods used for OLE Drag n Drop
*/
-static void OLEDD_Initialize(void);
-static DropTargetNode* OLEDD_FindDropTarget(
- HWND hwndOfTarget);
-static void OLEDD_FreeDropTarget(DropTargetNode*, BOOL);
-static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
- HWND hwnd,
- UINT uMsg,
- WPARAM wParam,
- LPARAM lParam);
-static void OLEDD_TrackMouseMove(
- TrackerWindowInfo* trackerInfo);
-static void OLEDD_TrackStateChange(
- TrackerWindowInfo* trackerInfo);
+static void OLEDD_Initialize(void);
+static LRESULT WINAPI OLEDD_DragTrackerWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+static void OLEDD_TrackMouseMove(TrackerWindowInfo* trackerInfo);
+static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo);
static DWORD OLEDD_GetButtonState(void);
-
/******************************************************************************
* OleBuildVersion [OLE32.@]
*/
@@ -270,14 +266,22 @@ HRESULT WINAPI OleInitializeWOW(DWORD x, DWORD y) {
return 0;
}
+/***
+ * OLEDD_FindDropTarget()
+ *
+ * Returns IDropTarget pointer registered for this window.
+ */
+static inline IDropTarget* OLEDD_FindDropTarget(HWND hwnd)
+{
+ return GetPropW(hwnd, prop_oledroptarget);
+}
+
/***********************************************************************
* RegisterDragDrop (OLE32.@)
*/
-HRESULT WINAPI RegisterDragDrop(
- HWND hwnd,
- LPDROPTARGET pDropTarget)
+HRESULT WINAPI RegisterDragDrop(HWND hwnd, LPDROPTARGET pDropTarget)
{
- DropTargetNode* dropTargetInfo;
+ DWORD pid = 0;
TRACE("(%p,%p)\n", hwnd, pDropTarget);
@@ -296,32 +300,20 @@ HRESULT WINAPI RegisterDragDrop(
return DRAGDROP_E_INVALIDHWND;
}
- /*
- * First, check if the window is already registered.
- */
- dropTargetInfo = OLEDD_FindDropTarget(hwnd);
+ /* block register for other processes windows */
+ GetWindowThreadProcessId(hwnd, &pid);
+ if (pid != GetCurrentProcessId())
+ {
+ FIXME("register for another process windows is disabled\n");
+ return DRAGDROP_E_INVALIDHWND;
+ }
- if (dropTargetInfo!=NULL)
+ /* check if the window is already registered */
+ if (OLEDD_FindDropTarget(hwnd))
return DRAGDROP_E_ALREADYREGISTERED;
- /*
- * If it's not there, we can add it. We first create a node for it.
- */
- dropTargetInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(DropTargetNode));
-
- if (dropTargetInfo==NULL)
- return E_OUTOFMEMORY;
-
- dropTargetInfo->hwndTarget = hwnd;
-
- /*
- * Don't forget that this is an interface pointer, need to nail it down since
- * we keep a copy of it.
- */
IDropTarget_AddRef(pDropTarget);
- dropTargetInfo->dropTarget = pDropTarget;
-
- list_add_tail(&targetListHead, &dropTargetInfo->entry);
+ SetPropW(hwnd, prop_oledroptarget, pDropTarget);
return S_OK;
}
@@ -329,10 +321,9 @@ HRESULT WINAPI RegisterDragDrop(
/***********************************************************************
* RevokeDragDrop (OLE32.@)
*/
-HRESULT WINAPI RevokeDragDrop(
- HWND hwnd)
+HRESULT WINAPI RevokeDragDrop(HWND hwnd)
{
- DropTargetNode* dropTargetInfo;
+ IDropTarget* droptarget;
TRACE("(%p)\n", hwnd);
@@ -342,18 +333,12 @@ HRESULT WINAPI RevokeDragDrop(
return DRAGDROP_E_INVALIDHWND;
}
- /*
- * First, check if the window is already registered.
- */
- dropTargetInfo = OLEDD_FindDropTarget(hwnd);
-
- /*
- * If it ain't in there, it's an error.
- */
- if (dropTargetInfo==NULL)
+ /* no registration data */
+ if (!(droptarget = OLEDD_FindDropTarget(hwnd)))
return DRAGDROP_E_NOTREGISTERED;
- OLEDD_FreeDropTarget(dropTargetInfo, TRUE);
+ IDropTarget_Release(droptarget);
+ RemovePropW(hwnd, prop_oledroptarget);
return S_OK;
}
@@ -371,13 +356,12 @@ HRESULT WINAPI OleRegGetUserType(
DWORD dwFormOfType,
LPOLESTR* pszUserType)
{
- char keyName[60];
+ WCHAR keyName[60];
DWORD dwKeyType;
DWORD cbData;
HKEY clsidKey;
LONG hres;
- LPSTR buffer;
- HRESULT retVal;
+
/*
* Initialize the out parameter.
*/
@@ -386,17 +370,17 @@ HRESULT WINAPI OleRegGetUserType(
/*
* Build the key name we're looking for
*/
- sprintf( keyName, "CLSID\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\",
- clsid->Data1, clsid->Data2, clsid->Data3,
- clsid->Data4[0], clsid->Data4[1], clsid->Data4[2], clsid->Data4[3],
- clsid->Data4[4], clsid->Data4[5], clsid->Data4[6], clsid->Data4[7] );
+ sprintfW( keyName, clsidfmtW,
+ clsid->Data1, clsid->Data2, clsid->Data3,
+ clsid->Data4[0], clsid->Data4[1], clsid->Data4[2], clsid->Data4[3],
+ clsid->Data4[4], clsid->Data4[5], clsid->Data4[6], clsid->Data4[7] );
- TRACE("(%s, %d, %p)\n", keyName, dwFormOfType, pszUserType);
+ TRACE("(%s, %d, %p)\n", debugstr_w(keyName), dwFormOfType, pszUserType);
/*
* Open the class id Key
*/
- hres = RegOpenKeyA(HKEY_CLASSES_ROOT,
+ hres = RegOpenKeyW(HKEY_CLASSES_ROOT,
keyName,
&clsidKey);
@@ -408,8 +392,8 @@ HRESULT WINAPI OleRegGetUserType(
*/
cbData = 0;
- hres = RegQueryValueExA(clsidKey,
- "",
+ hres = RegQueryValueExW(clsidKey,
+ emptyW,
NULL,
&dwKeyType,
NULL,
@@ -424,7 +408,7 @@ HRESULT WINAPI OleRegGetUserType(
/*
* Allocate a buffer for the registry value.
*/
- *pszUserType = CoTaskMemAlloc(cbData*2);
+ *pszUserType = CoTaskMemAlloc(cbData);
if (*pszUserType==NULL)
{
@@ -432,41 +416,24 @@ HRESULT WINAPI OleRegGetUserType(
return E_OUTOFMEMORY;
}
- buffer = HeapAlloc(GetProcessHeap(), 0, cbData);
-
- if (buffer == NULL)
- {
- RegCloseKey(clsidKey);
- CoTaskMemFree(*pszUserType);
- *pszUserType=NULL;
- return E_OUTOFMEMORY;
- }
-
- hres = RegQueryValueExA(clsidKey,
- "",
+ hres = RegQueryValueExW(clsidKey,
+ emptyW,
NULL,
&dwKeyType,
- (LPBYTE) buffer,
+ (LPBYTE) *pszUserType,
&cbData);
RegCloseKey(clsidKey);
-
- if (hres!=ERROR_SUCCESS)
+ if (hres != ERROR_SUCCESS)
{
CoTaskMemFree(*pszUserType);
- *pszUserType=NULL;
+ *pszUserType = NULL;
- retVal = REGDB_E_READREGDB;
+ return REGDB_E_READREGDB;
}
- else
- {
- MultiByteToWideChar( CP_ACP, 0, buffer, -1, *pszUserType, cbData /*FIXME*/ );
- retVal = S_OK;
- }
- HeapFree(GetProcessHeap(), 0, buffer);
- return retVal;
+ return S_OK;
}
/***********************************************************************
@@ -478,17 +445,19 @@ HRESULT WINAPI DoDragDrop (
DWORD dwOKEffect, /* [in] effects allowed by the source */
DWORD *pdwEffect) /* [out] ptr to effects of the source */
{
+ static const WCHAR trackerW[] = {'T','r','a','c','k','e','r','W','i','n','d','o','w',0};
TrackerWindowInfo trackerInfo;
HWND hwndTrackWindow;
MSG msg;
- TRACE("(DataObject %p, DropSource %p)\n", pDataObject, pDropSource);
+ TRACE("(%p, %p, %d, %p)\n", pDataObject, pDropSource, dwOKEffect, pdwEffect);
+
+ if (!pDataObject || !pDropSource || !pdwEffect)
+ return E_INVALIDARG;
/*
* Setup the drag n drop tracking window.
*/
- if (!IsValidInterface((LPUNKNOWN)pDropSource))
- return E_INVALIDARG;
trackerInfo.dataObject = pDataObject;
trackerInfo.dropSource = pDropSource;
@@ -500,12 +469,12 @@ HRESULT WINAPI DoDragDrop (
trackerInfo.curTargetHWND = 0;
trackerInfo.curDragTarget = 0;
- hwndTrackWindow = CreateWindowA(OLEDD_DRAGTRACKERCLASS, "TrackerWindow",
+ hwndTrackWindow = CreateWindowW(OLEDD_DRAGTRACKERCLASS, trackerW,
WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, 0,
&trackerInfo);
- if (hwndTrackWindow!=0)
+ if (hwndTrackWindow)
{
/*
* Capture the mouse input
@@ -517,7 +486,7 @@ HRESULT WINAPI DoDragDrop (
/*
* Pump messages. All mouse input should go to the capture window.
*/
- while (!trackerInfo.trackingDone && GetMessageA(&msg, 0, 0, 0) )
+ while (!trackerInfo.trackingDone && GetMessageW(&msg, 0, 0, 0) )
{
trackerInfo.curMousePos.x = msg.pt.x;
trackerInfo.curMousePos.y = msg.pt.y;
@@ -548,7 +517,7 @@ HRESULT WINAPI DoDragDrop (
/*
* Dispatch the messages only when it's not a keyboard message.
*/
- DispatchMessageA(&msg);
+ DispatchMessageW(&msg);
}
}
@@ -584,7 +553,9 @@ HRESULT WINAPI OleRegGetMiscStatus(
DWORD dwAspect,
DWORD* pdwStatus)
{
- char keyName[60];
+ static const WCHAR miscstatusW[] = {'M','i','s','c','S','t','a','t','u','s',0};
+ static const WCHAR dfmtW[] = {'%','d',0};
+ WCHAR keyName[60];
HKEY clsidKey;
HKEY miscStatusKey;
HKEY aspectKey;
@@ -598,17 +569,17 @@ HRESULT WINAPI OleRegGetMiscStatus(
/*
* Build the key name we're looking for
*/
- sprintf( keyName, "CLSID\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\",
- clsid->Data1, clsid->Data2, clsid->Data3,
- clsid->Data4[0], clsid->Data4[1], clsid->Data4[2], clsid->Data4[3],
- clsid->Data4[4], clsid->Data4[5], clsid->Data4[6], clsid->Data4[7] );
+ sprintfW( keyName, clsidfmtW,
+ clsid->Data1, clsid->Data2, clsid->Data3,
+ clsid->Data4[0], clsid->Data4[1], clsid->Data4[2], clsid->Data4[3],
+ clsid->Data4[4], clsid->Data4[5], clsid->Data4[6], clsid->Data4[7] );
- TRACE("(%s, %d, %p)\n", keyName, dwAspect, pdwStatus);
+ TRACE("(%s, %d, %p)\n", debugstr_w(keyName), dwAspect, pdwStatus);
/*
* Open the class id Key
*/
- result = RegOpenKeyA(HKEY_CLASSES_ROOT,
+ result = RegOpenKeyW(HKEY_CLASSES_ROOT,
keyName,
&clsidKey);
@@ -618,8 +589,8 @@ HRESULT WINAPI OleRegGetMiscStatus(
/*
* Get the MiscStatus
*/
- result = RegOpenKeyA(clsidKey,
- "MiscStatus",
+ result = RegOpenKeyW(clsidKey,
+ miscstatusW,
&miscStatusKey);
@@ -637,9 +608,9 @@ HRESULT WINAPI OleRegGetMiscStatus(
/*
* Open the key specific to the requested aspect.
*/
- sprintf(keyName, "%d", dwAspect);
+ sprintfW(keyName, dfmtW, dwAspect);
- result = RegOpenKeyA(miscStatusKey,
+ result = RegOpenKeyW(miscStatusKey,
keyName,
&aspectKey);
@@ -1180,7 +1151,7 @@ static void OLEMenu_UnInitialize(void)
*/
static BOOL OLEMenu_InstallHooks( DWORD tid )
{
- OleMenuHookItem *pHookItem = NULL;
+ OleMenuHookItem *pHookItem;
/* Create an entry for the hook table */
if ( !(pHookItem = HeapAlloc(GetProcessHeap(), 0,
@@ -1189,15 +1160,16 @@ static BOOL OLEMenu_InstallHooks( DWORD tid )
pHookItem->tid = tid;
pHookItem->hHeap = GetProcessHeap();
+ pHookItem->CallWndProc_hHook = NULL;
/* Install a thread scope message hook for WH_GETMESSAGE */
- pHookItem->GetMsg_hHook = SetWindowsHookExA( WH_GETMESSAGE, OLEMenu_GetMsgProc,
+ pHookItem->GetMsg_hHook = SetWindowsHookExW( WH_GETMESSAGE, OLEMenu_GetMsgProc,
0, GetCurrentThreadId() );
if ( !pHookItem->GetMsg_hHook )
goto CLEANUP;
/* Install a thread scope message hook for WH_CALLWNDPROC */
- pHookItem->CallWndProc_hHook = SetWindowsHookExA( WH_CALLWNDPROC, OLEMenu_CallWndProc,
+ pHookItem->CallWndProc_hHook = SetWindowsHookExW( WH_CALLWNDPROC, OLEMenu_CallWndProc,
0, GetCurrentThreadId() );
if ( !pHookItem->CallWndProc_hHook )
goto CLEANUP;
@@ -1271,7 +1243,7 @@ CLEANUP:
*/
static OleMenuHookItem * OLEMenu_IsHookInstalled( DWORD tid )
{
- OleMenuHookItem *pHookItem = NULL;
+ OleMenuHookItem *pHookItem;
/* Do a simple linear search for an entry whose tid matches ours.
* We really need a map but efficiency is not a concern here. */
@@ -1376,7 +1348,7 @@ static BOOL OLEMenu_SetIsServerMenu( HMENU hmenu, OleMenuDescriptor *pOleMenuDes
*/
static LRESULT CALLBACK OLEMenu_CallWndProc(INT code, WPARAM wParam, LPARAM lParam)
{
- LPCWPSTRUCT pMsg = NULL;
+ LPCWPSTRUCT pMsg;
HOLEMENU hOleMenu = 0;
OleMenuDescriptor *pOleMenuDescriptor = NULL;
OleMenuHookItem *pHookItem = NULL;
@@ -1395,7 +1367,7 @@ static LRESULT CALLBACK OLEMenu_CallWndProc(INT code, WPARAM wParam, LPARAM lPar
* If the window has an OLEMenu property we may need to dispatch
* the menu message to its active objects window instead. */
- hOleMenu = GetPropA( pMsg->hwnd, "PROP_OLEMenuDescriptor" );
+ hOleMenu = GetPropW( pMsg->hwnd, prop_olemenuW );
if ( !hOleMenu )
goto NEXTHOOK;
@@ -1413,7 +1385,7 @@ static LRESULT CALLBACK OLEMenu_CallWndProc(INT code, WPARAM wParam, LPARAM lPar
pOleMenuDescriptor->bIsServerItem = FALSE;
/* Send this message to the server as well */
- SendMessageA( pOleMenuDescriptor->hwndActiveObject,
+ SendMessageW( pOleMenuDescriptor->hwndActiveObject,
pMsg->message, pMsg->wParam, pMsg->lParam );
goto NEXTHOOK;
}
@@ -1454,7 +1426,7 @@ static LRESULT CALLBACK OLEMenu_CallWndProc(INT code, WPARAM wParam, LPARAM lPar
/* If the message was for the server dispatch it accordingly */
if ( pOleMenuDescriptor->bIsServerItem )
{
- SendMessageA( pOleMenuDescriptor->hwndActiveObject,
+ SendMessageW( pOleMenuDescriptor->hwndActiveObject,
pMsg->message, pMsg->wParam, pMsg->lParam );
}
@@ -1481,7 +1453,7 @@ NEXTHOOK:
*/
static LRESULT CALLBACK OLEMenu_GetMsgProc(INT code, WPARAM wParam, LPARAM lParam)
{
- LPMSG pMsg = NULL;
+ LPMSG pMsg;
HOLEMENU hOleMenu = 0;
OleMenuDescriptor *pOleMenuDescriptor = NULL;
OleMenuHookItem *pHookItem = NULL;
@@ -1500,7 +1472,7 @@ static LRESULT CALLBACK OLEMenu_GetMsgProc(INT code, WPARAM wParam, LPARAM lPara
* If the window has an OLEMenu property we may need to dispatch
* the menu message to its active objects window instead. */
- hOleMenu = GetPropA( pMsg->hwnd, "PROP_OLEMenuDescriptor" );
+ hOleMenu = GetPropW( pMsg->hwnd, prop_olemenuW );
if ( !hOleMenu )
goto NEXTHOOK;
@@ -1671,7 +1643,7 @@ HRESULT WINAPI OleSetMenuDescriptor(
pOleMenuDescriptor = NULL;
/* Add a menu descriptor windows property to the frame window */
- SetPropA( hwndFrame, "PROP_OLEMenuDescriptor", hOleMenu );
+ SetPropW( hwndFrame, prop_olemenuW, hOleMenu );
/* Install thread scope message hooks for WH_GETMESSAGE and WH_CALLWNDPROC */
if ( !OLEMenu_InstallHooks( GetCurrentThreadId() ) )
@@ -1684,7 +1656,7 @@ HRESULT WINAPI OleSetMenuDescriptor(
return E_FAIL;
/* Remove the menu descriptor property from the frame window */
- RemovePropA( hwndFrame, "PROP_OLEMenuDescriptor" );
+ RemovePropW( hwndFrame, prop_olemenuW );
}
return S_OK;
@@ -1870,9 +1842,9 @@ void WINAPI ReleaseStgMedium(
*/
static void OLEDD_Initialize(void)
{
- WNDCLASSA wndClass;
+ WNDCLASSW wndClass;
- ZeroMemory (&wndClass, sizeof(WNDCLASSA));
+ ZeroMemory (&wndClass, sizeof(WNDCLASSW));
wndClass.style = CS_GLOBALCLASS;
wndClass.lpfnWndProc = OLEDD_DragTrackerWindowProc;
wndClass.cbClsExtra = 0;
@@ -1881,58 +1853,7 @@ static void OLEDD_Initialize(void)
wndClass.hbrBackground = 0;
wndClass.lpszClassName = OLEDD_DRAGTRACKERCLASS;
- RegisterClassA (&wndClass);
-}
-
-/***
- * OLEDD_FreeDropTarget()
- *
- * Frees the drag and drop data structure
- */
-static void OLEDD_FreeDropTarget(DropTargetNode *dropTargetInfo, BOOL release_drop_target)
-{
- list_remove(&dropTargetInfo->entry);
- if (release_drop_target) IDropTarget_Release(dropTargetInfo->dropTarget);
- HeapFree(GetProcessHeap(), 0, dropTargetInfo);
-}
-
-/***
- * OLEDD_UnInitialize()
- *
- * Releases the OLE drag and drop data structures.
- */
-void OLEDD_UnInitialize(void)
-{
- /*
- * Simply empty the list.
- */
- while (!list_empty(&targetListHead))
- {
- DropTargetNode* curNode = LIST_ENTRY(list_head(&targetListHead), DropTargetNode, entry);
- OLEDD_FreeDropTarget(curNode, FALSE);
- }
-}
-
-/***
- * OLEDD_FindDropTarget()
- *
- * Finds information about the drop target.
- */
-static DropTargetNode* OLEDD_FindDropTarget(HWND hwndOfTarget)
-{
- DropTargetNode* curNode;
-
- /*
- * Iterate the list to find the HWND value.
- */
- LIST_FOR_EACH_ENTRY(curNode, &targetListHead, DropTargetNode, entry)
- if (hwndOfTarget==curNode->hwndTarget)
- return curNode;
-
- /*
- * If we get here, the item is not in the list
- */
- return NULL;
+ RegisterClassW (&wndClass);
}
/***
@@ -1958,7 +1879,7 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
{
LPCREATESTRUCTA createStruct = (LPCREATESTRUCTA)lParam;
- SetWindowLongPtrA(hwnd, 0, (LONG_PTR)createStruct->lpCreateParams);
+ SetWindowLongPtrW(hwnd, 0, (LONG_PTR)createStruct->lpCreateParams);
SetTimer(hwnd, DRAG_TIMER_ID, 50, NULL);
break;
@@ -1989,7 +1910,7 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
/*
* This is a window proc after all. Let's call the default.
*/
- return DefWindowProcA (hwnd, uMsg, wParam, lParam);
+ return DefWindowProcW (hwnd, uMsg, wParam, lParam);
}
/***
@@ -2038,46 +1959,65 @@ static void OLEDD_TrackMouseMove(TrackerWindowInfo* trackerInfo)
}
else
{
- DropTargetNode* newDropTargetNode = 0;
-
/*
* If we changed window, we have to notify our old target and check for
* the new one.
*/
- if (trackerInfo->curDragTarget!=0)
- {
+ if (trackerInfo->curDragTarget)
IDropTarget_DragLeave(trackerInfo->curDragTarget);
- }
/*
* Make sure we're hovering over a window.
*/
- if (hwndNewTarget!=0)
+ if (hwndNewTarget)
{
/*
* Find-out if there is a drag target under the mouse
*/
- HWND nexttar = hwndNewTarget;
+ HWND next_target_wnd = hwndNewTarget;
+ IDropTarget *new_target;
+ DWORD pid;
+
trackerInfo->curTargetHWND = hwndNewTarget;
do {
- newDropTargetNode = OLEDD_FindDropTarget(nexttar);
- } while (!newDropTargetNode && (nexttar = GetParent(nexttar)) != 0);
- if(nexttar) hwndNewTarget = nexttar;
+ new_target = OLEDD_FindDropTarget(next_target_wnd);
+ } while (!new_target && (next_target_wnd = GetParent(next_target_wnd)));
- trackerInfo->curDragTargetHWND = hwndNewTarget;
- trackerInfo->curDragTarget = newDropTargetNode ? newDropTargetNode->dropTarget : 0;
+ if (next_target_wnd) hwndNewTarget = next_target_wnd;
+
+ GetWindowThreadProcessId(hwndNewTarget, &pid);
+ if (pid != GetCurrentProcessId())
+ {
+ FIXME("drop to another process window is unsupported\n");
+ trackerInfo->curDragTargetHWND = 0;
+ trackerInfo->curTargetHWND = 0;
+ trackerInfo->curDragTarget = 0;
+ }
+ else
+ {
+ trackerInfo->curDragTargetHWND = hwndNewTarget;
+ trackerInfo->curDragTarget = new_target;
+ }
/*
* If there is, notify it that we just dragged-in
*/
- if (trackerInfo->curDragTarget!=0)
+ if (trackerInfo->curDragTarget)
{
- IDropTarget_DragEnter(trackerInfo->curDragTarget,
- trackerInfo->dataObject,
- trackerInfo->dwKeyState,
- trackerInfo->curMousePos,
- trackerInfo->pdwEffect);
+ hr = IDropTarget_DragEnter(trackerInfo->curDragTarget,
+ trackerInfo->dataObject,
+ trackerInfo->dwKeyState,
+ trackerInfo->curMousePos,
+ trackerInfo->pdwEffect);
+
+ /* failed DragEnter() means invalid target */
+ if (hr != S_OK)
+ {
+ trackerInfo->curDragTargetHWND = 0;
+ trackerInfo->curTargetHWND = 0;
+ trackerInfo->curDragTarget = 0;
+ }
}
}
else
@@ -2110,24 +2050,28 @@ static void OLEDD_TrackMouseMove(TrackerWindowInfo* trackerInfo)
* when that's the case, we must display the standard drag and drop
* cursors.
*/
- if (hr==DRAGDROP_S_USEDEFAULTCURSORS)
+ if (hr == DRAGDROP_S_USEDEFAULTCURSORS)
{
+ HCURSOR hCur;
+
if (*trackerInfo->pdwEffect & DROPEFFECT_MOVE)
{
- SetCursor(LoadCursorA(hProxyDll, MAKEINTRESOURCEA(1)));
+ hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(1));
}
else if (*trackerInfo->pdwEffect & DROPEFFECT_COPY)
{
- SetCursor(LoadCursorA(hProxyDll, MAKEINTRESOURCEA(2)));
+ hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(2));
}
else if (*trackerInfo->pdwEffect & DROPEFFECT_LINK)
{
- SetCursor(LoadCursorA(hProxyDll, MAKEINTRESOURCEA(3)));
+ hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(3));
}
else
{
- SetCursor(LoadCursorA(hProxyDll, MAKEINTRESOURCEA(0)));
+ hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(0));
}
+
+ SetCursor(hCur);
}
}
@@ -2174,7 +2118,7 @@ static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
* If we end-up over a target, drop the object in the target or
* inform the target that the operation was cancelled.
*/
- if (trackerInfo->curDragTarget!=0)
+ if (trackerInfo->curDragTarget)
{
switch (trackerInfo->returnValue)
{
@@ -2183,14 +2127,16 @@ static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
* the drop target that we just dropped the object in it.
*/
case DRAGDROP_S_DROP:
- {
- IDropTarget_Drop(trackerInfo->curDragTarget,
- trackerInfo->dataObject,
- trackerInfo->dwKeyState,
- trackerInfo->curMousePos,
- trackerInfo->pdwEffect);
- break;
- }
+ if (*trackerInfo->pdwEffect != DROPEFFECT_NONE)
+ IDropTarget_Drop(trackerInfo->curDragTarget,
+ trackerInfo->dataObject,
+ trackerInfo->dwKeyState,
+ trackerInfo->curMousePos,
+ trackerInfo->pdwEffect);
+ else
+ IDropTarget_DragLeave(trackerInfo->curDragTarget);
+ break;
+
/*
* If the source told us that we should cancel, fool the drop
* target by telling it that the mouse left it's window.
@@ -2256,13 +2202,13 @@ static void OLEUTL_ReadRegistryDWORDValue(
HKEY regKey,
DWORD* pdwValue)
{
- char buffer[20];
+ WCHAR buffer[20];
+ DWORD cbData = sizeof(buffer);
DWORD dwKeyType;
- DWORD cbData = 20;
LONG lres;
- lres = RegQueryValueExA(regKey,
- "",
+ lres = RegQueryValueExW(regKey,
+ emptyW,
NULL,
&dwKeyType,
(LPBYTE)buffer,
@@ -2278,7 +2224,7 @@ static void OLEUTL_ReadRegistryDWORDValue(
case REG_EXPAND_SZ:
case REG_MULTI_SZ:
case REG_SZ:
- *pdwValue = (DWORD)strtoul(buffer, NULL, 10);
+ *pdwValue = (DWORD)strtoulW(buffer, NULL, 10);
break;
}
}
diff --git a/dll/win32/ole32/ole32.rbuild b/dll/win32/ole32/ole32.rbuild
index 85710a6b20f..57c6b9f64a6 100644
--- a/dll/win32/ole32/ole32.rbuild
+++ b/dll/win32/ole32/ole32.rbuild
@@ -1,7 +1,7 @@
-
+
.
diff --git a/dll/win32/ole32/stg_prop.c b/dll/win32/ole32/stg_prop.c
index b3362bc21de..f887d10c0cf 100644
--- a/dll/win32/ole32/stg_prop.c
+++ b/dll/win32/ole32/stg_prop.c
@@ -1314,6 +1314,13 @@ static HRESULT PropertyStorage_ReadFromStream(PropertyStorage_impl *This)
hr = PropertyStorage_ReadFmtIdOffsetFromStream(This->stm, &fmtOffset);
if (FAILED(hr))
goto end;
+ if (!IsEqualGUID(&fmtOffset.fmtid, &FMTID_DocSummaryInformation) &&
+ !IsEqualGUID(&fmtOffset.fmtid, &FMTID_SummaryInformation))
+ {
+ WARN("not reading unknown fmtid %s\n", debugstr_guid(&fmtOffset.fmtid));
+ hr = S_FALSE;
+ goto end;
+ }
if (fmtOffset.dwOffset > stat.cbSize.u.LowPart)
{
WARN("invalid offset %d (stream length is %d)\n", fmtOffset.dwOffset,
diff --git a/dll/win32/ole32/storage32.c b/dll/win32/ole32/storage32.c
index 434d8b24606..98df144976c 100644
--- a/dll/win32/ole32/storage32.c
+++ b/dll/win32/ole32/storage32.c
@@ -118,17 +118,61 @@ static BOOL StorageImpl_ReadDWordFromBigBlock( StorageImpl* This,
static BOOL StorageBaseImpl_IsStreamOpen(StorageBaseImpl * stg, DirRef streamEntry);
static BOOL StorageBaseImpl_IsStorageOpen(StorageBaseImpl * stg, DirRef storageEntry);
+typedef struct TransactedDirEntry
+{
+ /* If applicable, a reference to the original DirEntry in the transacted
+ * parent. If this is a newly-created entry, DIRENTRY_NULL. */
+ DirRef transactedParentEntry;
+
+ /* True if this entry is being used. */
+ int inuse;
+
+ /* True if data is up to date. */
+ int read;
+
+ /* True if this entry has been modified. */
+ int dirty;
+
+ /* True if this entry's stream has been modified. */
+ int stream_dirty;
+
+ /* True if this entry has been deleted in the transacted storage, but the
+ * delete has not yet been committed. */
+ int deleted;
+
+ /* If this entry's stream has been modified, a reference to where the stream
+ * is stored in the snapshot file. */
+ DirRef stream_entry;
+
+ /* This directory entry's data, including any changes that have been made. */
+ DirEntry data;
+
+ /* A reference to the parent of this node. This is only valid while we are
+ * committing changes. */
+ DirRef parent;
+
+ /* A reference to a newly-created entry in the transacted parent. This is
+ * always equal to transactedParentEntry except when committing changes. */
+ DirRef newTransactedParentEntry;
+} TransactedDirEntry;
+
/****************************************************************************
- * Transacted storage object that reads/writes a snapshot file.
+ * Transacted storage object.
*/
typedef struct TransactedSnapshotImpl
{
struct StorageBaseImpl base;
/*
- * Changes are temporarily saved to the snapshot.
+ * Modified streams are temporarily saved to the scratch file.
*/
- StorageBaseImpl *snapshot;
+ StorageBaseImpl *scratch;
+
+ /* The directory structure is kept here, so that we can track how these
+ * entries relate to those in the parent storage. */
+ TransactedDirEntry *entries;
+ ULONG entries_size;
+ ULONG firstFreeEntry;
/*
* Changes are committed to the transacted parent.
@@ -1296,46 +1340,6 @@ static HRESULT StorageImpl_DestroyDirEntry(
}
-/***************************************************************************
- *
- * Internal Method
- *
- * Destroy an entry, its attached data, and all entries reachable from it.
- */
-static HRESULT DestroyReachableEntries(
- StorageBaseImpl *base,
- DirRef index)
-{
- HRESULT hr = S_OK;
- DirEntry data;
- ULARGE_INTEGER zero;
-
- zero.QuadPart = 0;
-
- if (index != DIRENTRY_NULL)
- {
- hr = StorageBaseImpl_ReadDirEntry(base, index, &data);
-
- if (SUCCEEDED(hr))
- hr = DestroyReachableEntries(base, data.dirRootEntry);
-
- if (SUCCEEDED(hr))
- hr = DestroyReachableEntries(base, data.leftChild);
-
- if (SUCCEEDED(hr))
- hr = DestroyReachableEntries(base, data.rightChild);
-
- if (SUCCEEDED(hr))
- hr = StorageBaseImpl_StreamSetSize(base, index, zero);
-
- if (SUCCEEDED(hr))
- hr = StorageBaseImpl_DestroyDirEntry(base, index);
- }
-
- return hr;
-}
-
-
/****************************************************************************
*
* Internal Method
@@ -2347,6 +2351,21 @@ static BlockChainStream **StorageImpl_GetCachedBlockChainStream(StorageImpl *Thi
return &This->blockChainCache[free_index];
}
+static void StorageImpl_DeleteCachedBlockChainStream(StorageImpl *This, DirRef index)
+{
+ int i;
+
+ for (i=0; iblockChainCache[i] && This->blockChainCache[i]->ownerDirEntry == index)
+ {
+ BlockChainStream_Destroy(This->blockChainCache[i]);
+ This->blockChainCache[i] = NULL;
+ return;
+ }
+ }
+}
+
static HRESULT StorageImpl_StreamReadAt(StorageBaseImpl *base, DirRef index,
ULARGE_INTEGER offset, ULONG size, void *buffer, ULONG *bytesRead)
{
@@ -2538,6 +2557,30 @@ static HRESULT StorageImpl_StreamWriteAt(StorageBaseImpl *base, DirRef index,
}
}
+static HRESULT StorageImpl_StreamLink(StorageBaseImpl *base, DirRef dst,
+ DirRef src)
+{
+ StorageImpl *This = (StorageImpl*)base;
+ DirEntry dst_data, src_data;
+ HRESULT hr;
+
+ hr = StorageImpl_ReadDirEntry(This, dst, &dst_data);
+
+ if (SUCCEEDED(hr))
+ hr = StorageImpl_ReadDirEntry(This, src, &src_data);
+
+ if (SUCCEEDED(hr))
+ {
+ StorageImpl_DeleteCachedBlockChainStream(This, src);
+ dst_data.startingBlock = src_data.startingBlock;
+ dst_data.size = src_data.size;
+
+ hr = StorageImpl_WriteDirEntry(This, dst, &dst_data);
+ }
+
+ return hr;
+}
+
/*
* Virtual function table for the IStorage32Impl class.
*/
@@ -2573,7 +2616,8 @@ static const StorageBaseImplVtbl StorageImpl_BaseVtbl =
StorageImpl_DestroyDirEntry,
StorageImpl_StreamReadAt,
StorageImpl_StreamWriteAt,
- StorageImpl_StreamSetSize
+ StorageImpl_StreamSetSize,
+ StorageImpl_StreamLink
};
static HRESULT StorageImpl_Construct(
@@ -3540,6 +3584,9 @@ HRESULT StorageImpl_ReadRawDirEntry(StorageImpl *This, ULONG index, BYTE *buffer
buffer,
&bytesRead);
+ if (bytesRead != RAW_DIRENTRY_SIZE)
+ return STG_E_READFAULT;
+
return hr;
}
@@ -3885,6 +3932,11 @@ BlockChainStream* Storage32Impl_SmallBlocksToBigBlocks(
offset.u.LowPart += cbRead;
}
+ else
+ {
+ resRead = STG_E_READFAULT;
+ break;
+ }
} while (cbTotalRead.QuadPart < size.QuadPart);
HeapFree(GetProcessHeap(),0,buffer);
@@ -3983,6 +4035,11 @@ SmallBlockChainStream* Storage32Impl_BigBlocksToSmallBlocks(
offset.u.LowPart += cbRead;
}
+ else
+ {
+ resRead = STG_E_READFAULT;
+ break;
+ }
}while(cbTotalRead.QuadPart < size.QuadPart);
HeapFree(GetProcessHeap(), 0, buffer);
@@ -4011,40 +4068,384 @@ SmallBlockChainStream* Storage32Impl_BigBlocksToSmallBlocks(
return SmallBlockChainStream_Construct(This, NULL, streamEntryRef);
}
-static HRESULT CreateSnapshotFile(StorageBaseImpl* original, StorageBaseImpl **snapshot)
+static HRESULT StorageBaseImpl_CopyStream(
+ StorageBaseImpl *dst, DirRef dst_entry,
+ StorageBaseImpl *src, DirRef src_entry)
{
HRESULT hr;
- DirEntry parentData, snapshotData;
+ BYTE data[4096];
+ DirEntry srcdata;
+ ULARGE_INTEGER bytes_copied;
+ ULONG bytestocopy, bytesread, byteswritten;
- hr = StgCreateDocfile(NULL, STGM_READWRITE|STGM_SHARE_EXCLUSIVE|STGM_DELETEONRELEASE,
- 0, (IStorage**)snapshot);
+ hr = StorageBaseImpl_ReadDirEntry(src, src_entry, &srcdata);
if (SUCCEEDED(hr))
{
- hr = StorageBaseImpl_ReadDirEntry(original,
- original->storageDirEntry, &parentData);
+ hr = StorageBaseImpl_StreamSetSize(dst, dst_entry, srcdata.size);
- if (SUCCEEDED(hr))
- hr = StorageBaseImpl_ReadDirEntry((*snapshot),
- (*snapshot)->storageDirEntry, &snapshotData);
-
- if (SUCCEEDED(hr))
+ bytes_copied.QuadPart = 0;
+ while (bytes_copied.QuadPart < srcdata.size.QuadPart && SUCCEEDED(hr))
{
- memcpy(snapshotData.name, parentData.name, sizeof(snapshotData.name));
- snapshotData.sizeOfNameString = parentData.sizeOfNameString;
- snapshotData.stgType = parentData.stgType;
- snapshotData.clsid = parentData.clsid;
- snapshotData.ctime = parentData.ctime;
- snapshotData.mtime = parentData.mtime;
- hr = StorageBaseImpl_WriteDirEntry((*snapshot),
- (*snapshot)->storageDirEntry, &snapshotData);
+ bytestocopy = min(4096, srcdata.size.QuadPart - bytes_copied.QuadPart);
+
+ hr = StorageBaseImpl_StreamReadAt(src, src_entry, bytes_copied, bytestocopy,
+ data, &bytesread);
+ if (SUCCEEDED(hr) && bytesread != bytestocopy) hr = STG_E_READFAULT;
+
+ if (SUCCEEDED(hr))
+ hr = StorageBaseImpl_StreamWriteAt(dst, dst_entry, bytes_copied, bytestocopy,
+ data, &byteswritten);
+ if (SUCCEEDED(hr))
+ {
+ if (byteswritten != bytestocopy) hr = STG_E_WRITEFAULT;
+ bytes_copied.QuadPart += byteswritten;
+ }
+ }
+ }
+
+ return hr;
+}
+
+static DirRef TransactedSnapshotImpl_FindFreeEntry(TransactedSnapshotImpl *This)
+{
+ DirRef result=This->firstFreeEntry;
+
+ while (result < This->entries_size && This->entries[result].inuse)
+ result++;
+
+ if (result == This->entries_size)
+ {
+ ULONG new_size = This->entries_size * 2;
+ TransactedDirEntry *new_entries;
+
+ new_entries = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TransactedDirEntry) * new_size);
+ if (!new_entries) return DIRENTRY_NULL;
+
+ memcpy(new_entries, This->entries, sizeof(TransactedDirEntry) * This->entries_size);
+ HeapFree(GetProcessHeap(), 0, This->entries);
+
+ This->entries = new_entries;
+ This->entries_size = new_size;
+ }
+
+ This->entries[result].inuse = 1;
+
+ This->firstFreeEntry = result+1;
+
+ return result;
+}
+
+static DirRef TransactedSnapshotImpl_CreateStubEntry(
+ TransactedSnapshotImpl *This, DirRef parentEntryRef)
+{
+ DirRef stubEntryRef;
+ TransactedDirEntry *entry;
+
+ stubEntryRef = TransactedSnapshotImpl_FindFreeEntry(This);
+
+ if (stubEntryRef != DIRENTRY_NULL)
+ {
+ entry = &This->entries[stubEntryRef];
+
+ entry->newTransactedParentEntry = entry->transactedParentEntry = parentEntryRef;
+
+ entry->read = 0;
+ }
+
+ return stubEntryRef;
+}
+
+static HRESULT TransactedSnapshotImpl_EnsureReadEntry(
+ TransactedSnapshotImpl *This, DirRef entry)
+{
+ HRESULT hr=S_OK;
+ DirEntry data;
+
+ if (!This->entries[entry].read)
+ {
+ hr = StorageBaseImpl_ReadDirEntry(This->transactedParent,
+ This->entries[entry].transactedParentEntry,
+ &data);
+
+ if (SUCCEEDED(hr) && data.leftChild != DIRENTRY_NULL)
+ {
+ data.leftChild = TransactedSnapshotImpl_CreateStubEntry(This, data.leftChild);
+
+ if (data.leftChild == DIRENTRY_NULL)
+ hr = E_OUTOFMEMORY;
+ }
+
+ if (SUCCEEDED(hr) && data.rightChild != DIRENTRY_NULL)
+ {
+ data.rightChild = TransactedSnapshotImpl_CreateStubEntry(This, data.rightChild);
+
+ if (data.rightChild == DIRENTRY_NULL)
+ hr = E_OUTOFMEMORY;
+ }
+
+ if (SUCCEEDED(hr) && data.dirRootEntry != DIRENTRY_NULL)
+ {
+ data.dirRootEntry = TransactedSnapshotImpl_CreateStubEntry(This, data.dirRootEntry);
+
+ if (data.dirRootEntry == DIRENTRY_NULL)
+ hr = E_OUTOFMEMORY;
}
if (SUCCEEDED(hr))
- hr = IStorage_CopyTo((IStorage*)original, 0, NULL, NULL,
- (IStorage*)(*snapshot));
+ {
+ memcpy(&This->entries[entry].data, &data, sizeof(DirEntry));
+ This->entries[entry].read = 1;
+ }
+ }
- if (FAILED(hr)) IStorage_Release((IStorage*)(*snapshot));
+ return hr;
+}
+
+static HRESULT TransactedSnapshotImpl_MakeStreamDirty(
+ TransactedSnapshotImpl *This, DirRef entry)
+{
+ HRESULT hr = S_OK;
+
+ if (!This->entries[entry].stream_dirty)
+ {
+ DirEntry new_entrydata;
+
+ memset(&new_entrydata, 0, sizeof(DirEntry));
+ new_entrydata.name[0] = 'S';
+ new_entrydata.sizeOfNameString = 1;
+ new_entrydata.stgType = STGTY_STREAM;
+ new_entrydata.startingBlock = BLOCK_END_OF_CHAIN;
+ new_entrydata.leftChild = DIRENTRY_NULL;
+ new_entrydata.rightChild = DIRENTRY_NULL;
+ new_entrydata.dirRootEntry = DIRENTRY_NULL;
+
+ hr = StorageBaseImpl_CreateDirEntry(This->scratch, &new_entrydata,
+ &This->entries[entry].stream_entry);
+
+ if (SUCCEEDED(hr) && This->entries[entry].transactedParentEntry != DIRENTRY_NULL)
+ {
+ hr = StorageBaseImpl_CopyStream(
+ This->scratch, This->entries[entry].stream_entry,
+ This->transactedParent, This->entries[entry].transactedParentEntry);
+
+ if (FAILED(hr))
+ StorageBaseImpl_DestroyDirEntry(This->scratch, This->entries[entry].stream_entry);
+ }
+
+ if (SUCCEEDED(hr))
+ This->entries[entry].stream_dirty = 1;
+
+ if (This->entries[entry].transactedParentEntry != DIRENTRY_NULL)
+ {
+ /* Since this entry is modified, and we aren't using its stream data, we
+ * no longer care about the original entry. */
+ DirRef delete_ref;
+ delete_ref = TransactedSnapshotImpl_CreateStubEntry(This, This->entries[entry].transactedParentEntry);
+
+ if (delete_ref != DIRENTRY_NULL)
+ This->entries[delete_ref].deleted = 1;
+
+ This->entries[entry].transactedParentEntry = This->entries[entry].newTransactedParentEntry = DIRENTRY_NULL;
+ }
+ }
+
+ return hr;
+}
+
+/* Find the first entry in a depth-first traversal. */
+static DirRef TransactedSnapshotImpl_FindFirstChild(
+ TransactedSnapshotImpl* This, DirRef parent)
+{
+ DirRef cursor, prev;
+ TransactedDirEntry *entry;
+
+ cursor = parent;
+ entry = &This->entries[cursor];
+ while (entry->read)
+ {
+ if (entry->data.leftChild != DIRENTRY_NULL)
+ {
+ prev = cursor;
+ cursor = entry->data.leftChild;
+ entry = &This->entries[cursor];
+ entry->parent = prev;
+ }
+ else if (entry->data.rightChild != DIRENTRY_NULL)
+ {
+ prev = cursor;
+ cursor = entry->data.rightChild;
+ entry = &This->entries[cursor];
+ entry->parent = prev;
+ }
+ else if (entry->data.dirRootEntry != DIRENTRY_NULL)
+ {
+ prev = cursor;
+ cursor = entry->data.dirRootEntry;
+ entry = &This->entries[cursor];
+ entry->parent = prev;
+ }
+ else
+ break;
+ }
+
+ return cursor;
+}
+
+/* Find the next entry in a depth-first traversal. */
+static DirRef TransactedSnapshotImpl_FindNextChild(
+ TransactedSnapshotImpl* This, DirRef current)
+{
+ DirRef parent;
+ TransactedDirEntry *parent_entry;
+
+ parent = This->entries[current].parent;
+ parent_entry = &This->entries[parent];
+
+ if (parent != DIRENTRY_NULL && parent_entry->data.dirRootEntry != current)
+ {
+ if (parent_entry->data.rightChild != current && parent_entry->data.rightChild != DIRENTRY_NULL)
+ {
+ This->entries[parent_entry->data.rightChild].parent = parent;
+ return TransactedSnapshotImpl_FindFirstChild(This, parent_entry->data.rightChild);
+ }
+
+ if (parent_entry->data.dirRootEntry != DIRENTRY_NULL)
+ {
+ This->entries[parent_entry->data.dirRootEntry].parent = parent;
+ return TransactedSnapshotImpl_FindFirstChild(This, parent_entry->data.dirRootEntry);
+ }
+ }
+
+ return parent;
+}
+
+/* Return TRUE if we've made a copy of this entry for committing to the parent. */
+static inline BOOL TransactedSnapshotImpl_MadeCopy(
+ TransactedSnapshotImpl* This, DirRef entry)
+{
+ return entry != DIRENTRY_NULL &&
+ This->entries[entry].newTransactedParentEntry != This->entries[entry].transactedParentEntry;
+}
+
+/* Destroy the entries created by CopyTree. */
+static void TransactedSnapshotImpl_DestroyTemporaryCopy(
+ TransactedSnapshotImpl* This, DirRef stop)
+{
+ DirRef cursor;
+ TransactedDirEntry *entry;
+ ULARGE_INTEGER zero;
+
+ zero.QuadPart = 0;
+
+ if (!This->entries[This->base.storageDirEntry].read)
+ return;
+
+ cursor = This->entries[This->base.storageDirEntry].data.dirRootEntry;
+
+ if (cursor == DIRENTRY_NULL)
+ return;
+
+ cursor = TransactedSnapshotImpl_FindFirstChild(This, cursor);
+
+ while (cursor != DIRENTRY_NULL && cursor != stop)
+ {
+ if (TransactedSnapshotImpl_MadeCopy(This, cursor))
+ {
+ entry = &This->entries[cursor];
+
+ if (entry->stream_dirty)
+ StorageBaseImpl_StreamSetSize(This->transactedParent,
+ entry->newTransactedParentEntry, zero);
+
+ StorageBaseImpl_DestroyDirEntry(This->transactedParent,
+ entry->newTransactedParentEntry);
+
+ entry->newTransactedParentEntry = entry->transactedParentEntry;
+ }
+
+ cursor = TransactedSnapshotImpl_FindNextChild(This, cursor);
+ }
+}
+
+/* Make a copy of our edited tree that we can use in the parent. */
+static HRESULT TransactedSnapshotImpl_CopyTree(TransactedSnapshotImpl* This)
+{
+ DirRef cursor;
+ TransactedDirEntry *entry;
+ HRESULT hr = S_OK;
+
+ cursor = This->base.storageDirEntry;
+ entry = &This->entries[cursor];
+ entry->parent = DIRENTRY_NULL;
+ entry->newTransactedParentEntry = entry->transactedParentEntry;
+
+ if (entry->data.dirRootEntry == DIRENTRY_NULL)
+ return S_OK;
+
+ This->entries[entry->data.dirRootEntry].parent = DIRENTRY_NULL;
+
+ cursor = TransactedSnapshotImpl_FindFirstChild(This, entry->data.dirRootEntry);
+ entry = &This->entries[cursor];
+
+ while (cursor != DIRENTRY_NULL)
+ {
+ /* Make a copy of this entry in the transacted parent. */
+ if (!entry->read ||
+ (!entry->dirty && !entry->stream_dirty &&
+ !TransactedSnapshotImpl_MadeCopy(This, entry->data.leftChild) &&
+ !TransactedSnapshotImpl_MadeCopy(This, entry->data.rightChild) &&
+ !TransactedSnapshotImpl_MadeCopy(This, entry->data.dirRootEntry)))
+ entry->newTransactedParentEntry = entry->transactedParentEntry;
+ else
+ {
+ DirEntry newData;
+
+ memcpy(&newData, &entry->data, sizeof(DirEntry));
+
+ newData.size.QuadPart = 0;
+ newData.startingBlock = BLOCK_END_OF_CHAIN;
+
+ if (newData.leftChild != DIRENTRY_NULL)
+ newData.leftChild = This->entries[newData.leftChild].newTransactedParentEntry;
+
+ if (newData.rightChild != DIRENTRY_NULL)
+ newData.rightChild = This->entries[newData.rightChild].newTransactedParentEntry;
+
+ if (newData.dirRootEntry != DIRENTRY_NULL)
+ newData.dirRootEntry = This->entries[newData.dirRootEntry].newTransactedParentEntry;
+
+ hr = StorageBaseImpl_CreateDirEntry(This->transactedParent, &newData,
+ &entry->newTransactedParentEntry);
+ if (FAILED(hr))
+ {
+ TransactedSnapshotImpl_DestroyTemporaryCopy(This, cursor);
+ return hr;
+ }
+
+ if (entry->stream_dirty)
+ {
+ hr = StorageBaseImpl_CopyStream(
+ This->transactedParent, entry->newTransactedParentEntry,
+ This->scratch, entry->stream_entry);
+ }
+ else if (entry->data.size.QuadPart)
+ {
+ hr = StorageBaseImpl_StreamLink(
+ This->transactedParent, entry->newTransactedParentEntry,
+ entry->transactedParentEntry);
+ }
+
+ if (FAILED(hr))
+ {
+ cursor = TransactedSnapshotImpl_FindNextChild(This, cursor);
+ TransactedSnapshotImpl_DestroyTemporaryCopy(This, cursor);
+ return hr;
+ }
+ }
+
+ cursor = TransactedSnapshotImpl_FindNextChild(This, cursor);
+ entry = &This->entries[cursor];
}
return hr;
@@ -4055,10 +4456,13 @@ static HRESULT WINAPI TransactedSnapshotImpl_Commit(
DWORD grfCommitFlags) /* [in] */
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) iface;
+ TransactedDirEntry *root_entry;
+ DirRef i, dir_root_ref;
+ DirEntry data;
+ ULARGE_INTEGER zero;
HRESULT hr;
- DirEntry data, tempStorageData, snapshotRootData;
- DirRef tempStorageEntry, oldDirRoot;
- StorageInternalImpl *tempStorage;
+
+ zero.QuadPart = 0;
TRACE("(%p,%x)\n", iface, grfCommitFlags);
@@ -4072,75 +4476,71 @@ static HRESULT WINAPI TransactedSnapshotImpl_Commit(
* needed in the rare situation where we have just enough free disk space to
* overwrite the existing data. */
- /* Create an orphaned storage in the parent for the new directory structure. */
- memset(&data, 0, sizeof(data));
- data.name[0] = 'D';
- data.sizeOfNameString = 1;
- data.stgType = STGTY_STORAGE;
- data.leftChild = DIRENTRY_NULL;
- data.rightChild = DIRENTRY_NULL;
- data.dirRootEntry = DIRENTRY_NULL;
- hr = StorageBaseImpl_CreateDirEntry(This->transactedParent, &data, &tempStorageEntry);
+ root_entry = &This->entries[This->base.storageDirEntry];
+ if (!root_entry->read)
+ return S_OK;
+
+ hr = TransactedSnapshotImpl_CopyTree(This);
if (FAILED(hr)) return hr;
- tempStorage = StorageInternalImpl_Construct(This->transactedParent,
- STGM_READWRITE|STGM_SHARE_EXCLUSIVE, tempStorageEntry);
- if (tempStorage)
- {
- hr = IStorage_CopyTo((IStorage*)This->snapshot, 0, NULL, NULL,
- (IStorage*)tempStorage);
-
- list_init(&tempStorage->ParentListEntry);
-
- IStorage_Release((IStorage*) tempStorage);
- }
+ if (root_entry->data.dirRootEntry == DIRENTRY_NULL)
+ dir_root_ref = DIRENTRY_NULL;
else
- hr = E_OUTOFMEMORY;
-
- if (FAILED(hr))
- {
- DestroyReachableEntries(This->transactedParent, tempStorageEntry);
- return hr;
- }
+ dir_root_ref = This->entries[root_entry->data.dirRootEntry].newTransactedParentEntry;
/* Update the storage to use the new data in one step. */
hr = StorageBaseImpl_ReadDirEntry(This->transactedParent,
- This->transactedParent->storageDirEntry, &data);
+ root_entry->transactedParentEntry, &data);
if (SUCCEEDED(hr))
{
- hr = StorageBaseImpl_ReadDirEntry(This->transactedParent,
- tempStorageEntry, &tempStorageData);
- }
-
- if (SUCCEEDED(hr))
- {
- hr = StorageBaseImpl_ReadDirEntry(This->snapshot,
- This->snapshot->storageDirEntry, &snapshotRootData);
- }
-
- if (SUCCEEDED(hr))
- {
- oldDirRoot = data.dirRootEntry;
- data.dirRootEntry = tempStorageData.dirRootEntry;
- data.clsid = snapshotRootData.clsid;
- data.ctime = snapshotRootData.ctime;
- data.mtime = snapshotRootData.mtime;
+ data.dirRootEntry = dir_root_ref;
+ data.clsid = root_entry->data.clsid;
+ data.ctime = root_entry->data.ctime;
+ data.mtime = root_entry->data.mtime;
hr = StorageBaseImpl_WriteDirEntry(This->transactedParent,
- This->transactedParent->storageDirEntry, &data);
+ root_entry->transactedParentEntry, &data);
}
if (SUCCEEDED(hr))
{
/* Destroy the old now-orphaned data. */
- DestroyReachableEntries(This->transactedParent, oldDirRoot);
- StorageBaseImpl_DestroyDirEntry(This->transactedParent, tempStorageEntry);
+ for (i=0; ientries_size; i++)
+ {
+ TransactedDirEntry *entry = &This->entries[i];
+ if (entry->inuse)
+ {
+ if (entry->deleted)
+ {
+ StorageBaseImpl_StreamSetSize(This->transactedParent,
+ entry->transactedParentEntry, zero);
+ StorageBaseImpl_DestroyDirEntry(This->transactedParent,
+ entry->transactedParentEntry);
+ memset(entry, 0, sizeof(TransactedDirEntry));
+ This->firstFreeEntry = min(i, This->firstFreeEntry);
+ }
+ else if (entry->read && entry->transactedParentEntry != entry->newTransactedParentEntry)
+ {
+ if (entry->transactedParentEntry != DIRENTRY_NULL)
+ StorageBaseImpl_DestroyDirEntry(This->transactedParent,
+ entry->transactedParentEntry);
+ if (entry->stream_dirty)
+ {
+ StorageBaseImpl_StreamSetSize(This->scratch, entry->stream_entry, zero);
+ StorageBaseImpl_DestroyDirEntry(This->scratch, entry->stream_entry);
+ entry->stream_dirty = 0;
+ }
+ entry->dirty = 0;
+ entry->transactedParentEntry = entry->newTransactedParentEntry;
+ }
+ }
+ }
}
else
{
- DestroyReachableEntries(This->transactedParent, tempStorageEntry);
+ TransactedSnapshotImpl_DestroyTemporaryCopy(This, DIRENTRY_NULL);
}
return hr;
@@ -4150,21 +4550,31 @@ static HRESULT WINAPI TransactedSnapshotImpl_Revert(
IStorage* iface)
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) iface;
- StorageBaseImpl *newSnapshot;
- HRESULT hr;
+ ULARGE_INTEGER zero;
+ ULONG i;
TRACE("(%p)\n", iface);
- /* Create a new copy of the parent data. */
- hr = CreateSnapshotFile(This->transactedParent, &newSnapshot);
- if (FAILED(hr)) return hr;
-
/* Destroy the open objects. */
StorageBaseImpl_DeleteAll(&This->base);
- /* Replace our current snapshot. */
- IStorage_Release((IStorage*)This->snapshot);
- This->snapshot = newSnapshot;
+ /* Clear out the scratch file. */
+ zero.QuadPart = 0;
+ for (i=0; ientries_size; i++)
+ {
+ if (This->entries[i].stream_dirty)
+ {
+ StorageBaseImpl_StreamSetSize(This->scratch, This->entries[i].stream_entry,
+ zero);
+
+ StorageBaseImpl_DestroyDirEntry(This->scratch, This->entries[i].stream_entry);
+ }
+ }
+
+ memset(This->entries, 0, sizeof(TransactedDirEntry) * This->entries_size);
+
+ This->firstFreeEntry = 0;
+ This->base.storageDirEntry = TransactedSnapshotImpl_CreateStubEntry(This, This->transactedParent->storageDirEntry);
return S_OK;
}
@@ -4185,11 +4595,13 @@ static void TransactedSnapshotImpl_Destroy( StorageBaseImpl *iface)
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) iface;
- TransactedSnapshotImpl_Invalidate(iface);
+ TransactedSnapshotImpl_Revert((IStorage*)iface);
IStorage_Release((IStorage*)This->transactedParent);
- IStorage_Release((IStorage*)This->snapshot);
+ IStorage_Release((IStorage*)This->scratch);
+
+ HeapFree(GetProcessHeap(), 0, This->entries);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -4198,27 +4610,76 @@ static HRESULT TransactedSnapshotImpl_CreateDirEntry(StorageBaseImpl *base,
const DirEntry *newData, DirRef *index)
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
+ DirRef new_ref;
+ TransactedDirEntry *new_entry;
- return StorageBaseImpl_CreateDirEntry(This->snapshot,
- newData, index);
+ new_ref = TransactedSnapshotImpl_FindFreeEntry(This);
+ if (new_ref == DIRENTRY_NULL)
+ return E_OUTOFMEMORY;
+
+ new_entry = &This->entries[new_ref];
+
+ new_entry->newTransactedParentEntry = new_entry->transactedParentEntry = DIRENTRY_NULL;
+ new_entry->read = 1;
+ new_entry->dirty = 1;
+ memcpy(&new_entry->data, newData, sizeof(DirEntry));
+
+ *index = new_ref;
+
+ TRACE("%s l=%x r=%x d=%x <-- %x\n", debugstr_w(newData->name), newData->leftChild, newData->rightChild, newData->dirRootEntry, *index);
+
+ return S_OK;
}
static HRESULT TransactedSnapshotImpl_WriteDirEntry(StorageBaseImpl *base,
DirRef index, const DirEntry *data)
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
+ HRESULT hr;
- return StorageBaseImpl_WriteDirEntry(This->snapshot,
- index, data);
+ TRACE("%x %s l=%x r=%x d=%x\n", index, debugstr_w(data->name), data->leftChild, data->rightChild, data->dirRootEntry);
+
+ hr = TransactedSnapshotImpl_EnsureReadEntry(This, index);
+ if (FAILED(hr)) return hr;
+
+ memcpy(&This->entries[index].data, data, sizeof(DirEntry));
+
+ if (index != This->base.storageDirEntry)
+ {
+ This->entries[index].dirty = 1;
+
+ if (data->size.QuadPart == 0 &&
+ This->entries[index].transactedParentEntry != DIRENTRY_NULL)
+ {
+ /* Since this entry is modified, and we aren't using its stream data, we
+ * no longer care about the original entry. */
+ DirRef delete_ref;
+ delete_ref = TransactedSnapshotImpl_CreateStubEntry(This, This->entries[index].transactedParentEntry);
+
+ if (delete_ref != DIRENTRY_NULL)
+ This->entries[delete_ref].deleted = 1;
+
+ This->entries[index].transactedParentEntry = This->entries[index].newTransactedParentEntry = DIRENTRY_NULL;
+ }
+ }
+
+ return S_OK;
}
static HRESULT TransactedSnapshotImpl_ReadDirEntry(StorageBaseImpl *base,
DirRef index, DirEntry *data)
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
+ HRESULT hr;
- return StorageBaseImpl_ReadDirEntry(This->snapshot,
- index, data);
+ hr = TransactedSnapshotImpl_EnsureReadEntry(This, index);
+ if (FAILED(hr)) return hr;
+
+ memcpy(data, &This->entries[index].data, sizeof(DirEntry));
+
+ TRACE("%x %s l=%x r=%x d=%x\n", index, debugstr_w(data->name), data->leftChild, data->rightChild, data->dirRootEntry);
+
+ return S_OK;
}
static HRESULT TransactedSnapshotImpl_DestroyDirEntry(StorageBaseImpl *base,
@@ -4226,8 +4687,21 @@ static HRESULT TransactedSnapshotImpl_DestroyDirEntry(StorageBaseImpl *base,
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
- return StorageBaseImpl_DestroyDirEntry(This->snapshot,
- index);
+ if (This->entries[index].transactedParentEntry == DIRENTRY_NULL ||
+ This->entries[index].data.size.QuadPart != 0)
+ {
+ /* If we deleted this entry while it has stream data. We must have left the
+ * data because some other entry is using it, and we need to leave the
+ * original entry alone. */
+ memset(&This->entries[index], 0, sizeof(TransactedDirEntry));
+ This->firstFreeEntry = min(index, This->firstFreeEntry);
+ }
+ else
+ {
+ This->entries[index].deleted = 1;
+ }
+
+ return S_OK;
}
static HRESULT TransactedSnapshotImpl_StreamReadAt(StorageBaseImpl *base,
@@ -4235,26 +4709,122 @@ static HRESULT TransactedSnapshotImpl_StreamReadAt(StorageBaseImpl *base,
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
- return StorageBaseImpl_StreamReadAt(This->snapshot,
- index, offset, size, buffer, bytesRead);
+ if (This->entries[index].stream_dirty)
+ {
+ return StorageBaseImpl_StreamReadAt(This->scratch,
+ This->entries[index].stream_entry, offset, size, buffer, bytesRead);
+ }
+ else if (This->entries[index].transactedParentEntry == DIRENTRY_NULL)
+ {
+ /* This stream doesn't live in the parent, and we haven't allocated storage
+ * for it yet */
+ *bytesRead = 0;
+ return S_OK;
+ }
+ else
+ {
+ return StorageBaseImpl_StreamReadAt(This->transactedParent,
+ This->entries[index].transactedParentEntry, offset, size, buffer, bytesRead);
+ }
}
static HRESULT TransactedSnapshotImpl_StreamWriteAt(StorageBaseImpl *base,
DirRef index, ULARGE_INTEGER offset, ULONG size, const void *buffer, ULONG *bytesWritten)
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
+ HRESULT hr;
- return StorageBaseImpl_StreamWriteAt(This->snapshot,
- index, offset, size, buffer, bytesWritten);
+ hr = TransactedSnapshotImpl_EnsureReadEntry(This, index);
+ if (FAILED(hr)) return hr;
+
+ hr = TransactedSnapshotImpl_MakeStreamDirty(This, index);
+ if (FAILED(hr)) return hr;
+
+ hr = StorageBaseImpl_StreamWriteAt(This->scratch,
+ This->entries[index].stream_entry, offset, size, buffer, bytesWritten);
+
+ if (SUCCEEDED(hr) && size != 0)
+ This->entries[index].data.size.QuadPart = max(
+ This->entries[index].data.size.QuadPart,
+ offset.QuadPart + size);
+
+ return hr;
}
static HRESULT TransactedSnapshotImpl_StreamSetSize(StorageBaseImpl *base,
DirRef index, ULARGE_INTEGER newsize)
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
+ HRESULT hr;
- return StorageBaseImpl_StreamSetSize(This->snapshot,
- index, newsize);
+ hr = TransactedSnapshotImpl_EnsureReadEntry(This, index);
+ if (FAILED(hr)) return hr;
+
+ if (This->entries[index].data.size.QuadPart == newsize.QuadPart)
+ return S_OK;
+
+ if (newsize.QuadPart == 0)
+ {
+ /* Destroy any parent references or entries in the scratch file. */
+ if (This->entries[index].stream_dirty)
+ {
+ ULARGE_INTEGER zero;
+ zero.QuadPart = 0;
+ StorageBaseImpl_StreamSetSize(This->scratch,
+ This->entries[index].stream_entry, zero);
+ StorageBaseImpl_DestroyDirEntry(This->scratch,
+ This->entries[index].stream_entry);
+ This->entries[index].stream_dirty = 0;
+ }
+ else if (This->entries[index].transactedParentEntry != DIRENTRY_NULL)
+ {
+ DirRef delete_ref;
+ delete_ref = TransactedSnapshotImpl_CreateStubEntry(This, This->entries[index].transactedParentEntry);
+
+ if (delete_ref != DIRENTRY_NULL)
+ This->entries[delete_ref].deleted = 1;
+
+ This->entries[index].transactedParentEntry = This->entries[index].newTransactedParentEntry = DIRENTRY_NULL;
+ }
+ }
+ else
+ {
+ hr = TransactedSnapshotImpl_MakeStreamDirty(This, index);
+ if (FAILED(hr)) return hr;
+
+ hr = StorageBaseImpl_StreamSetSize(This->scratch,
+ This->entries[index].stream_entry, newsize);
+ }
+
+ if (SUCCEEDED(hr))
+ This->entries[index].data.size = newsize;
+
+ return hr;
+}
+
+static HRESULT TransactedSnapshotImpl_StreamLink(StorageBaseImpl *base,
+ DirRef dst, DirRef src)
+{
+ TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
+ HRESULT hr;
+ TransactedDirEntry *dst_entry, *src_entry;
+
+ hr = TransactedSnapshotImpl_EnsureReadEntry(This, src);
+ if (FAILED(hr)) return hr;
+
+ hr = TransactedSnapshotImpl_EnsureReadEntry(This, dst);
+ if (FAILED(hr)) return hr;
+
+ dst_entry = &This->entries[dst];
+ src_entry = &This->entries[src];
+
+ dst_entry->stream_dirty = src_entry->stream_dirty;
+ dst_entry->stream_entry = src_entry->stream_entry;
+ dst_entry->transactedParentEntry = src_entry->transactedParentEntry;
+ dst_entry->newTransactedParentEntry = src_entry->newTransactedParentEntry;
+ dst_entry->data.size = src_entry->data.size;
+
+ return S_OK;
}
static const IStorageVtbl TransactedSnapshotImpl_Vtbl =
@@ -4289,7 +4859,8 @@ static const StorageBaseImplVtbl TransactedSnapshotImpl_BaseVtbl =
TransactedSnapshotImpl_DestroyDirEntry,
TransactedSnapshotImpl_StreamReadAt,
TransactedSnapshotImpl_StreamWriteAt,
- TransactedSnapshotImpl_StreamSetSize
+ TransactedSnapshotImpl_StreamSetSize,
+ TransactedSnapshotImpl_StreamLink
};
static HRESULT TransactedSnapshotImpl_Construct(StorageBaseImpl *parentStorage,
@@ -4317,17 +4888,35 @@ static HRESULT TransactedSnapshotImpl_Construct(StorageBaseImpl *parentStorage,
(*result)->base.filename = parentStorage->filename;
- /* Create a new temporary storage to act as the snapshot */
- hr = CreateSnapshotFile(parentStorage, &(*result)->snapshot);
+ /* Create a new temporary storage to act as the scratch file. */
+ hr = StgCreateDocfile(NULL, STGM_READWRITE|STGM_SHARE_EXCLUSIVE|STGM_CREATE,
+ 0, (IStorage**)&(*result)->scratch);
if (SUCCEEDED(hr))
{
- (*result)->base.storageDirEntry = (*result)->snapshot->storageDirEntry;
+ ULONG num_entries = 20;
- /* parentStorage already has 1 reference, which we take over here. */
- (*result)->transactedParent = parentStorage;
+ (*result)->entries = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TransactedDirEntry) * num_entries);
- parentStorage->transactedChild = (StorageBaseImpl*)*result;
+ (*result)->entries_size = num_entries;
+
+ (*result)->firstFreeEntry = 0;
+
+ if ((*result)->entries)
+ {
+ /* parentStorage already has 1 reference, which we take over here. */
+ (*result)->transactedParent = parentStorage;
+
+ parentStorage->transactedChild = (StorageBaseImpl*)*result;
+
+ (*result)->base.storageDirEntry = TransactedSnapshotImpl_CreateStubEntry(*result, parentStorage->storageDirEntry);
+ }
+ else
+ {
+ IStorage_Release((IStorage*)(*result)->scratch);
+
+ hr = E_OUTOFMEMORY;
+ }
}
if (FAILED(hr)) HeapFree(GetProcessHeap(), 0, (*result));
@@ -4474,6 +5063,15 @@ static HRESULT StorageInternalImpl_StreamSetSize(StorageBaseImpl *base,
index, newsize);
}
+static HRESULT StorageInternalImpl_StreamLink(StorageBaseImpl *base,
+ DirRef dst, DirRef src)
+{
+ StorageInternalImpl* This = (StorageInternalImpl*) base;
+
+ return StorageBaseImpl_StreamLink(This->parentStorage,
+ dst, src);
+}
+
/******************************************************************************
**
** Storage32InternalImpl_Commit
@@ -4833,7 +5431,8 @@ static const StorageBaseImplVtbl StorageInternalImpl_BaseVtbl =
StorageInternalImpl_DestroyDirEntry,
StorageInternalImpl_StreamReadAt,
StorageInternalImpl_StreamWriteAt,
- StorageInternalImpl_StreamSetSize
+ StorageInternalImpl_StreamSetSize,
+ StorageInternalImpl_StreamLink
};
/******************************************************************************
@@ -5026,38 +5625,134 @@ void StorageUtl_CopyDirEntryToSTATSTG(
** BlockChainStream implementation
*/
+/* Read and save the index of all blocks in this stream. */
+HRESULT BlockChainStream_UpdateIndexCache(BlockChainStream* This)
+{
+ ULONG next_sector, next_offset;
+ HRESULT hr;
+ struct BlockChainRun *last_run;
+
+ if (This->indexCacheLen == 0)
+ {
+ last_run = NULL;
+ next_offset = 0;
+ next_sector = BlockChainStream_GetHeadOfChain(This);
+ }
+ else
+ {
+ last_run = &This->indexCache[This->indexCacheLen-1];
+ next_offset = last_run->lastOffset+1;
+ hr = StorageImpl_GetNextBlockInChain(This->parentStorage,
+ last_run->firstSector + last_run->lastOffset - last_run->firstOffset,
+ &next_sector);
+ if (FAILED(hr)) return hr;
+ }
+
+ while (next_sector != BLOCK_END_OF_CHAIN)
+ {
+ if (!last_run || next_sector != last_run->firstSector + next_offset - last_run->firstOffset)
+ {
+ /* Add the current block to the cache. */
+ if (This->indexCacheSize == 0)
+ {
+ This->indexCache = HeapAlloc(GetProcessHeap(), 0, sizeof(struct BlockChainRun)*16);
+ if (!This->indexCache) return E_OUTOFMEMORY;
+ This->indexCacheSize = 16;
+ }
+ else if (This->indexCacheSize == This->indexCacheLen)
+ {
+ struct BlockChainRun *new_cache;
+ ULONG new_size;
+
+ new_size = This->indexCacheSize * 2;
+ new_cache = HeapAlloc(GetProcessHeap(), 0, sizeof(struct BlockChainRun)*new_size);
+ if (!new_cache) return E_OUTOFMEMORY;
+ memcpy(new_cache, This->indexCache, sizeof(struct BlockChainRun)*This->indexCacheLen);
+
+ HeapFree(GetProcessHeap(), 0, This->indexCache);
+ This->indexCache = new_cache;
+ This->indexCacheSize = new_size;
+ }
+
+ This->indexCacheLen++;
+ last_run = &This->indexCache[This->indexCacheLen-1];
+ last_run->firstSector = next_sector;
+ last_run->firstOffset = next_offset;
+ }
+
+ last_run->lastOffset = next_offset;
+
+ /* Find the next block. */
+ next_offset++;
+ hr = StorageImpl_GetNextBlockInChain(This->parentStorage, next_sector, &next_sector);
+ if (FAILED(hr)) return hr;
+ }
+
+ if (This->indexCacheLen)
+ {
+ This->tailIndex = last_run->firstSector + last_run->lastOffset - last_run->firstOffset;
+ This->numBlocks = last_run->lastOffset+1;
+ }
+ else
+ {
+ This->tailIndex = BLOCK_END_OF_CHAIN;
+ This->numBlocks = 0;
+ }
+
+ return S_OK;
+}
+
+/* Locate the nth block in this stream. */
+ULONG BlockChainStream_GetSectorOfOffset(BlockChainStream *This, ULONG offset)
+{
+ ULONG min_offset = 0, max_offset = This->numBlocks-1;
+ ULONG min_run = 0, max_run = This->indexCacheLen-1;
+
+ if (offset >= This->numBlocks)
+ return BLOCK_END_OF_CHAIN;
+
+ while (min_run < max_run)
+ {
+ ULONG run_to_check = min_run + (offset - min_offset) * (max_run - min_run) / (max_offset - min_offset);
+ if (offset < This->indexCache[run_to_check].firstOffset)
+ {
+ max_offset = This->indexCache[run_to_check].firstOffset-1;
+ max_run = run_to_check-1;
+ }
+ else if (offset > This->indexCache[run_to_check].lastOffset)
+ {
+ min_offset = This->indexCache[run_to_check].lastOffset+1;
+ min_run = run_to_check+1;
+ }
+ else
+ /* Block is in this run. */
+ min_run = max_run = run_to_check;
+ }
+
+ return This->indexCache[min_run].firstSector + offset - This->indexCache[min_run].firstOffset;
+}
+
BlockChainStream* BlockChainStream_Construct(
StorageImpl* parentStorage,
ULONG* headOfStreamPlaceHolder,
DirRef dirEntry)
{
BlockChainStream* newStream;
- ULONG blockIndex;
newStream = HeapAlloc(GetProcessHeap(), 0, sizeof(BlockChainStream));
newStream->parentStorage = parentStorage;
newStream->headOfStreamPlaceHolder = headOfStreamPlaceHolder;
newStream->ownerDirEntry = dirEntry;
- newStream->lastBlockNoInSequence = 0xFFFFFFFF;
- newStream->tailIndex = BLOCK_END_OF_CHAIN;
- newStream->numBlocks = 0;
+ newStream->indexCache = NULL;
+ newStream->indexCacheLen = 0;
+ newStream->indexCacheSize = 0;
- blockIndex = BlockChainStream_GetHeadOfChain(newStream);
-
- while (blockIndex != BLOCK_END_OF_CHAIN)
+ if (FAILED(BlockChainStream_UpdateIndexCache(newStream)))
{
- newStream->numBlocks++;
- newStream->tailIndex = blockIndex;
-
- if(FAILED(StorageImpl_GetNextBlockInChain(
- parentStorage,
- blockIndex,
- &blockIndex)))
- {
- HeapFree(GetProcessHeap(), 0, newStream);
- return NULL;
- }
+ HeapFree(GetProcessHeap(), 0, newStream->indexCache);
+ HeapFree(GetProcessHeap(), 0, newStream);
+ return NULL;
}
return newStream;
@@ -5065,6 +5760,8 @@ BlockChainStream* BlockChainStream_Construct(
void BlockChainStream_Destroy(BlockChainStream* This)
{
+ if (This)
+ HeapFree(GetProcessHeap(), 0, This->indexCache);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -5105,27 +5802,10 @@ static ULONG BlockChainStream_GetHeadOfChain(BlockChainStream* This)
*
* Returns the number of blocks that comprises this chain.
* This is not the size of the stream as the last block may not be full!
- *
*/
static ULONG BlockChainStream_GetCount(BlockChainStream* This)
{
- ULONG blockIndex;
- ULONG count = 0;
-
- blockIndex = BlockChainStream_GetHeadOfChain(This);
-
- while (blockIndex != BLOCK_END_OF_CHAIN)
- {
- count++;
-
- if(FAILED(StorageImpl_GetNextBlockInChain(
- This->parentStorage,
- blockIndex,
- &blockIndex)))
- return 0;
- }
-
- return count;
+ return This->numBlocks;
}
/******************************************************************************
@@ -5146,44 +5826,26 @@ HRESULT BlockChainStream_ReadAt(BlockChainStream* This,
ULONG bytesToReadInBuffer;
ULONG blockIndex;
BYTE* bufferWalker;
+ ULARGE_INTEGER stream_size;
TRACE("(%p)-> %i %p %i %p\n",This, offset.u.LowPart, buffer, size, bytesRead);
/*
* Find the first block in the stream that contains part of the buffer.
*/
- if ( (This->lastBlockNoInSequence == 0xFFFFFFFF) ||
- (This->lastBlockNoInSequenceIndex == BLOCK_END_OF_CHAIN) ||
- (blockNoInSequence < This->lastBlockNoInSequence) )
- {
- blockIndex = BlockChainStream_GetHeadOfChain(This);
- This->lastBlockNoInSequence = blockNoInSequence;
- }
+ blockIndex = BlockChainStream_GetSectorOfOffset(This, blockNoInSequence);
+
+ *bytesRead = 0;
+
+ stream_size = BlockChainStream_GetSize(This);
+ if (stream_size.QuadPart > offset.QuadPart)
+ size = min(stream_size.QuadPart - offset.QuadPart, size);
else
- {
- ULONG temp = blockNoInSequence;
-
- blockIndex = This->lastBlockNoInSequenceIndex;
- blockNoInSequence -= This->lastBlockNoInSequence;
- This->lastBlockNoInSequence = temp;
- }
-
- while ( (blockNoInSequence > 0) && (blockIndex != BLOCK_END_OF_CHAIN))
- {
- if(FAILED(StorageImpl_GetNextBlockInChain(This->parentStorage, blockIndex, &blockIndex)))
- return STG_E_DOCFILECORRUPT;
- blockNoInSequence--;
- }
-
- if ((blockNoInSequence > 0) && (blockIndex == BLOCK_END_OF_CHAIN))
- return STG_E_DOCFILECORRUPT; /* We failed to find the starting block */
-
- This->lastBlockNoInSequenceIndex = blockIndex;
+ return S_OK;
/*
* Start reading the buffer.
*/
- *bytesRead = 0;
bufferWalker = buffer;
while ( (size > 0) && (blockIndex != BLOCK_END_OF_CHAIN) )
@@ -5221,7 +5883,7 @@ HRESULT BlockChainStream_ReadAt(BlockChainStream* This,
break;
}
- return (size == 0) ? S_OK : STG_E_READFAULT;
+ return S_OK;
}
/******************************************************************************
@@ -5245,31 +5907,7 @@ HRESULT BlockChainStream_WriteAt(BlockChainStream* This,
/*
* Find the first block in the stream that contains part of the buffer.
*/
- if ( (This->lastBlockNoInSequence == 0xFFFFFFFF) ||
- (This->lastBlockNoInSequenceIndex == BLOCK_END_OF_CHAIN) ||
- (blockNoInSequence < This->lastBlockNoInSequence) )
- {
- blockIndex = BlockChainStream_GetHeadOfChain(This);
- This->lastBlockNoInSequence = blockNoInSequence;
- }
- else
- {
- ULONG temp = blockNoInSequence;
-
- blockIndex = This->lastBlockNoInSequenceIndex;
- blockNoInSequence -= This->lastBlockNoInSequence;
- This->lastBlockNoInSequence = temp;
- }
-
- while ( (blockNoInSequence > 0) && (blockIndex != BLOCK_END_OF_CHAIN))
- {
- if(FAILED(StorageImpl_GetNextBlockInChain(This->parentStorage, blockIndex,
- &blockIndex)))
- return STG_E_DOCFILECORRUPT;
- blockNoInSequence--;
- }
-
- This->lastBlockNoInSequenceIndex = blockIndex;
+ blockIndex = BlockChainStream_GetSectorOfOffset(This, blockNoInSequence);
/* BlockChainStream_SetSize should have already been called to ensure we have
* enough blocks in the chain to write into */
@@ -5330,15 +5968,8 @@ HRESULT BlockChainStream_WriteAt(BlockChainStream* This,
static BOOL BlockChainStream_Shrink(BlockChainStream* This,
ULARGE_INTEGER newSize)
{
- ULONG blockIndex, extraBlock;
+ ULONG blockIndex;
ULONG numBlocks;
- ULONG count = 1;
-
- /*
- * Reset the last accessed block cache.
- */
- This->lastBlockNoInSequence = 0xFFFFFFFF;
- This->lastBlockNoInSequenceIndex = BLOCK_END_OF_CHAIN;
/*
* Figure out how many blocks are needed to contain the new size
@@ -5348,43 +5979,62 @@ static BOOL BlockChainStream_Shrink(BlockChainStream* This,
if ((newSize.u.LowPart % This->parentStorage->bigBlockSize) != 0)
numBlocks++;
- blockIndex = BlockChainStream_GetHeadOfChain(This);
-
- /*
- * Go to the new end of chain
- */
- while (count < numBlocks)
+ if (numBlocks)
{
- if(FAILED(StorageImpl_GetNextBlockInChain(This->parentStorage, blockIndex,
- &blockIndex)))
- return FALSE;
- count++;
+ /*
+ * Go to the new end of chain
+ */
+ blockIndex = BlockChainStream_GetSectorOfOffset(This, numBlocks-1);
+
+ /* Mark the new end of chain */
+ StorageImpl_SetNextBlockInChain(
+ This->parentStorage,
+ blockIndex,
+ BLOCK_END_OF_CHAIN);
+
+ This->tailIndex = blockIndex;
+ }
+ else
+ {
+ if (This->headOfStreamPlaceHolder != 0)
+ {
+ *This->headOfStreamPlaceHolder = BLOCK_END_OF_CHAIN;
+ }
+ else
+ {
+ DirEntry chainEntry;
+ assert(This->ownerDirEntry != DIRENTRY_NULL);
+
+ StorageImpl_ReadDirEntry(
+ This->parentStorage,
+ This->ownerDirEntry,
+ &chainEntry);
+
+ chainEntry.startingBlock = BLOCK_END_OF_CHAIN;
+
+ StorageImpl_WriteDirEntry(
+ This->parentStorage,
+ This->ownerDirEntry,
+ &chainEntry);
+ }
+
+ This->tailIndex = BLOCK_END_OF_CHAIN;
}
- /* Get the next block before marking the new end */
- if(FAILED(StorageImpl_GetNextBlockInChain(This->parentStorage, blockIndex,
- &extraBlock)))
- return FALSE;
-
- /* Mark the new end of chain */
- StorageImpl_SetNextBlockInChain(
- This->parentStorage,
- blockIndex,
- BLOCK_END_OF_CHAIN);
-
- This->tailIndex = blockIndex;
This->numBlocks = numBlocks;
/*
* Mark the extra blocks as free
*/
- while (extraBlock != BLOCK_END_OF_CHAIN)
+ while (This->indexCacheLen && This->indexCache[This->indexCacheLen-1].lastOffset >= numBlocks)
{
- if(FAILED(StorageImpl_GetNextBlockInChain(This->parentStorage, extraBlock,
- &blockIndex)))
- return FALSE;
- StorageImpl_FreeBigBlock(This->parentStorage, extraBlock);
- extraBlock = blockIndex;
+ struct BlockChainRun *last_run = &This->indexCache[This->indexCacheLen-1];
+ StorageImpl_FreeBigBlock(This->parentStorage,
+ last_run->firstSector + last_run->lastOffset - last_run->firstOffset);
+ if (last_run->lastOffset == last_run->firstOffset)
+ This->indexCacheLen--;
+ else
+ last_run->lastOffset--;
}
return TRUE;
@@ -5498,6 +6148,9 @@ static BOOL BlockChainStream_Enlarge(BlockChainStream* This,
This->numBlocks = newNumBlocks;
}
+ if (FAILED(BlockChainStream_UpdateIndexCache(This)))
+ return FALSE;
+
return TRUE;
}
@@ -5663,6 +6316,9 @@ static HRESULT SmallBlockChainStream_GetNextBlockInChain(
&buffer,
&bytesRead);
+ if (SUCCEEDED(res) && bytesRead != sizeof(DWORD))
+ res = STG_E_READFAULT;
+
if (SUCCEEDED(res))
{
StorageUtl_ReadDWord((BYTE *)&buffer, 0, nextBlockInChain);
@@ -5734,6 +6390,9 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock(
ULONG nextBlockIndex = BLOCK_END_OF_CHAIN;
HRESULT res = S_OK;
ULONG smallBlocksPerBigBlock;
+ DirEntry rootEntry;
+ ULONG blocksRequired;
+ ULARGE_INTEGER old_size, size_required;
offsetOfBlockInDepot.u.HighPart = 0;
@@ -5754,7 +6413,7 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock(
/*
* If we run out of space for the small block depot, enlarge it
*/
- if (SUCCEEDED(res))
+ if (SUCCEEDED(res) && bytesRead == sizeof(DWORD))
{
StorageUtl_ReadDWord((BYTE *)&buffer, 0, &nextBlockIndex);
@@ -5766,76 +6425,22 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock(
ULONG count =
BlockChainStream_GetCount(This->parentStorage->smallBlockDepotChain);
- ULONG sbdIndex = This->parentStorage->smallBlockDepotStart;
- ULONG nextBlock, newsbdIndex;
BYTE smallBlockDepot[MAX_BIG_BLOCK_SIZE];
+ ULARGE_INTEGER newSize, offset;
+ ULONG bytesWritten;
- nextBlock = sbdIndex;
- while (nextBlock != BLOCK_END_OF_CHAIN)
- {
- sbdIndex = nextBlock;
- StorageImpl_GetNextBlockInChain(This->parentStorage, sbdIndex, &nextBlock);
- }
-
- newsbdIndex = StorageImpl_GetNextFreeBigBlock(This->parentStorage);
- if (sbdIndex != BLOCK_END_OF_CHAIN)
- StorageImpl_SetNextBlockInChain(
- This->parentStorage,
- sbdIndex,
- newsbdIndex);
-
- StorageImpl_SetNextBlockInChain(
- This->parentStorage,
- newsbdIndex,
- BLOCK_END_OF_CHAIN);
+ newSize.QuadPart = (count + 1) * This->parentStorage->bigBlockSize;
+ BlockChainStream_Enlarge(This->parentStorage->smallBlockDepotChain, newSize);
/*
* Initialize all the small blocks to free
*/
memset(smallBlockDepot, BLOCK_UNUSED, This->parentStorage->bigBlockSize);
- StorageImpl_WriteBigBlock(This->parentStorage, newsbdIndex, smallBlockDepot);
+ offset.QuadPart = count * This->parentStorage->bigBlockSize;
+ BlockChainStream_WriteAt(This->parentStorage->smallBlockDepotChain,
+ offset, This->parentStorage->bigBlockSize, smallBlockDepot, &bytesWritten);
- if (count == 0)
- {
- /*
- * We have just created the small block depot.
- */
- DirEntry rootEntry;
- ULONG sbStartIndex;
-
- /*
- * Save it in the header
- */
- This->parentStorage->smallBlockDepotStart = newsbdIndex;
- StorageImpl_SaveFileHeader(This->parentStorage);
-
- /*
- * And allocate the first big block that will contain small blocks
- */
- sbStartIndex =
- StorageImpl_GetNextFreeBigBlock(This->parentStorage);
-
- StorageImpl_SetNextBlockInChain(
- This->parentStorage,
- sbStartIndex,
- BLOCK_END_OF_CHAIN);
-
- StorageImpl_ReadDirEntry(
- This->parentStorage,
- This->parentStorage->base.storageDirEntry,
- &rootEntry);
-
- rootEntry.startingBlock = sbStartIndex;
- rootEntry.size.u.HighPart = 0;
- rootEntry.size.u.LowPart = This->parentStorage->bigBlockSize;
-
- StorageImpl_WriteDirEntry(
- This->parentStorage,
- This->parentStorage->base.storageDirEntry,
- &rootEntry);
- }
- else
- StorageImpl_SaveFileHeader(This->parentStorage);
+ StorageImpl_SaveFileHeader(This->parentStorage);
}
}
@@ -5847,30 +6452,29 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock(
/*
* Verify if we have to allocate big blocks to contain small blocks
*/
- if (blockIndex % smallBlocksPerBigBlock == 0)
+ blocksRequired = (blockIndex / smallBlocksPerBigBlock) + 1;
+
+ size_required.QuadPart = blocksRequired * This->parentStorage->bigBlockSize;
+
+ old_size = BlockChainStream_GetSize(This->parentStorage->smallBlockRootChain);
+
+ if (size_required.QuadPart > old_size.QuadPart)
{
- DirEntry rootEntry;
- ULONG blocksRequired = (blockIndex / smallBlocksPerBigBlock) + 1;
+ BlockChainStream_SetSize(
+ This->parentStorage->smallBlockRootChain,
+ size_required);
StorageImpl_ReadDirEntry(
This->parentStorage,
This->parentStorage->base.storageDirEntry,
&rootEntry);
- if (rootEntry.size.u.LowPart <
- (blocksRequired * This->parentStorage->bigBlockSize))
- {
- rootEntry.size.u.LowPart += This->parentStorage->bigBlockSize;
+ rootEntry.size = size_required;
- BlockChainStream_SetSize(
- This->parentStorage->smallBlockRootChain,
- rootEntry.size);
-
- StorageImpl_WriteDirEntry(
- This->parentStorage,
- This->parentStorage->base.storageDirEntry,
- &rootEntry);
- }
+ StorageImpl_WriteDirEntry(
+ This->parentStorage,
+ This->parentStorage->base.storageDirEntry,
+ &rootEntry);
}
return blockIndex;
@@ -5900,12 +6504,21 @@ HRESULT SmallBlockChainStream_ReadAt(
ULONG blockIndex;
ULONG bytesReadFromBigBlockFile;
BYTE* bufferWalker;
+ ULARGE_INTEGER stream_size;
/*
* This should never happen on a small block file.
*/
assert(offset.u.HighPart==0);
+ *bytesRead = 0;
+
+ stream_size = SmallBlockChainStream_GetSize(This);
+ if (stream_size.QuadPart > offset.QuadPart)
+ size = min(stream_size.QuadPart - offset.QuadPart, size);
+ else
+ return S_OK;
+
/*
* Find the first block in the stream that contains part of the buffer.
*/
@@ -5922,7 +6535,6 @@ HRESULT SmallBlockChainStream_ReadAt(
/*
* Start reading the buffer.
*/
- *bytesRead = 0;
bufferWalker = buffer;
while ( (size > 0) && (blockIndex != BLOCK_END_OF_CHAIN) )
@@ -5956,6 +6568,9 @@ HRESULT SmallBlockChainStream_ReadAt(
if (FAILED(rc))
return rc;
+ if (!bytesReadFromBigBlockFile)
+ return STG_E_DOCFILECORRUPT;
+
/*
* Step to the next big block.
*/
@@ -5969,7 +6584,7 @@ HRESULT SmallBlockChainStream_ReadAt(
offsetInBlock = (offsetInBlock + bytesReadFromBigBlockFile) % This->parentStorage->smallBlockSize;
}
- return (size == 0) ? S_OK : STG_E_READFAULT;
+ return S_OK;
}
/******************************************************************************
diff --git a/dll/win32/ole32/storage32.h b/dll/win32/ole32/storage32.h
index 36a7d679af6..19f3f2d682c 100644
--- a/dll/win32/ole32/storage32.h
+++ b/dll/win32/ole32/storage32.h
@@ -263,6 +263,7 @@ struct StorageBaseImplVtbl {
HRESULT (*StreamReadAt)(StorageBaseImpl*,DirRef,ULARGE_INTEGER,ULONG,void*,ULONG*);
HRESULT (*StreamWriteAt)(StorageBaseImpl*,DirRef,ULARGE_INTEGER,ULONG,const void*,ULONG*);
HRESULT (*StreamSetSize)(StorageBaseImpl*,DirRef,ULARGE_INTEGER);
+ HRESULT (*StreamLink)(StorageBaseImpl*,DirRef,DirRef);
};
static inline void StorageBaseImpl_Destroy(StorageBaseImpl *This)
@@ -320,6 +321,16 @@ static inline HRESULT StorageBaseImpl_StreamSetSize(StorageBaseImpl *This,
return This->baseVtbl->StreamSetSize(This, index, newsize);
}
+/* Make dst point to the same stream that src points to. Other stream operations
+ * will not work properly for entries that point to the same stream, so this
+ * must be a very temporary state, and only one entry pointing to a given stream
+ * may be reachable at any given time. */
+static inline HRESULT StorageBaseImpl_StreamLink(StorageBaseImpl *This,
+ DirRef dst, DirRef src)
+{
+ return This->baseVtbl->StreamLink(This, dst, src);
+}
+
/****************************************************************************
* StorageBaseImpl stream list handlers
*/
@@ -513,13 +524,22 @@ void StorageUtl_CopyDirEntryToSTATSTG(StorageBaseImpl *storage,STATSTG* destinat
* The BlockChainStream class is a utility class that is used to create an
* abstraction of the big block chains in the storage file.
*/
+struct BlockChainRun
+{
+ /* This represents a range of blocks that happen reside in consecutive sectors. */
+ ULONG firstSector;
+ ULONG firstOffset;
+ ULONG lastOffset;
+};
+
struct BlockChainStream
{
StorageImpl* parentStorage;
ULONG* headOfStreamPlaceHolder;
DirRef ownerDirEntry;
- ULONG lastBlockNoInSequence;
- ULONG lastBlockNoInSequenceIndex;
+ struct BlockChainRun* indexCache;
+ ULONG indexCacheLen;
+ ULONG indexCacheSize;
ULONG tailIndex;
ULONG numBlocks;
};
diff --git a/dll/win32/ole32/usrmarshal.c b/dll/win32/ole32/usrmarshal.c
index ed316201f69..2d238e6ccc3 100644
--- a/dll/win32/ole32/usrmarshal.c
+++ b/dll/win32/ole32/usrmarshal.c
@@ -2761,7 +2761,8 @@ void CALLBACK IAdviseSink_OnDataChange_Proxy(
FORMATETC *pFormatetc,
STGMEDIUM *pStgmed)
{
- FIXME(":stub\n");
+ TRACE("(%p)->(%p, %p)\n", This, pFormatetc, pStgmed);
+ IAdviseSink_RemoteOnDataChange_Proxy(This, pFormatetc, pStgmed);
}
HRESULT __RPC_STUB IAdviseSink_OnDataChange_Stub(
@@ -2769,8 +2770,9 @@ HRESULT __RPC_STUB IAdviseSink_OnDataChange_Stub(
FORMATETC *pFormatetc,
ASYNC_STGMEDIUM *pStgmed)
{
- FIXME(":stub\n");
- return E_NOTIMPL;
+ TRACE("(%p)->(%p, %p)\n", This, pFormatetc, pStgmed);
+ IAdviseSink_OnDataChange(This, pFormatetc, pStgmed);
+ return S_OK;
}
void CALLBACK IAdviseSink_OnViewChange_Proxy(
@@ -2778,7 +2780,8 @@ void CALLBACK IAdviseSink_OnViewChange_Proxy(
DWORD dwAspect,
LONG lindex)
{
- FIXME(":stub\n");
+ TRACE("(%p)->(%d, %d)\n", This, dwAspect, lindex);
+ IAdviseSink_RemoteOnViewChange_Proxy(This, dwAspect, lindex);
}
HRESULT __RPC_STUB IAdviseSink_OnViewChange_Stub(
@@ -2786,64 +2789,73 @@ HRESULT __RPC_STUB IAdviseSink_OnViewChange_Stub(
DWORD dwAspect,
LONG lindex)
{
- FIXME(":stub\n");
- return E_NOTIMPL;
+ TRACE("(%p)->(%d, %d)\n", This, dwAspect, lindex);
+ IAdviseSink_OnViewChange(This, dwAspect, lindex);
+ return S_OK;
}
void CALLBACK IAdviseSink_OnRename_Proxy(
IAdviseSink* This,
IMoniker *pmk)
{
- FIXME(":stub\n");
+ TRACE("(%p)->(%p)\n", This, pmk);
+ IAdviseSink_RemoteOnRename_Proxy(This, pmk);
}
HRESULT __RPC_STUB IAdviseSink_OnRename_Stub(
IAdviseSink* This,
IMoniker *pmk)
{
- FIXME(":stub\n");
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, pmk);
+ IAdviseSink_OnRename(This, pmk);
+ return S_OK;
}
void CALLBACK IAdviseSink_OnSave_Proxy(
IAdviseSink* This)
{
- FIXME(":stub\n");
+ TRACE("(%p)\n", This);
+ IAdviseSink_RemoteOnSave_Proxy(This);
}
HRESULT __RPC_STUB IAdviseSink_OnSave_Stub(
IAdviseSink* This)
{
- FIXME(":stub\n");
- return E_NOTIMPL;
+ TRACE("(%p)\n", This);
+ IAdviseSink_OnSave(This);
+ return S_OK;
}
void CALLBACK IAdviseSink_OnClose_Proxy(
IAdviseSink* This)
{
- FIXME(":stub\n");
+ TRACE("(%p)\n", This);
+ IAdviseSink_RemoteOnClose_Proxy(This);
}
HRESULT __RPC_STUB IAdviseSink_OnClose_Stub(
IAdviseSink* This)
{
- FIXME(":stub\n");
- return E_NOTIMPL;
+ TRACE("(%p)\n", This);
+ IAdviseSink_OnClose(This);
+ return S_OK;
}
void CALLBACK IAdviseSink2_OnLinkSrcChange_Proxy(
IAdviseSink2* This,
IMoniker *pmk)
{
- FIXME(":stub\n");
+ TRACE("(%p)->(%p)\n", This, pmk);
+ IAdviseSink2_RemoteOnLinkSrcChange_Proxy(This, pmk);
}
HRESULT __RPC_STUB IAdviseSink2_OnLinkSrcChange_Stub(
IAdviseSink2* This,
IMoniker *pmk)
{
- FIXME(":stub\n");
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, pmk);
+ IAdviseSink2_OnLinkSrcChange(This, pmk);
+ return S_OK;
}
HRESULT CALLBACK IDataObject_GetData_Proxy(
diff --git a/dll/win32/riched20/riched20.rbuild b/dll/win32/riched20/riched20.rbuild
index 0191c64390a..b176049bb8a 100644
--- a/dll/win32/riched20/riched20.rbuild
+++ b/dll/win32/riched20/riched20.rbuild
@@ -1,7 +1,7 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/rsaenh/implglue.c b/dll/win32/rsaenh/implglue.c
index 7ecfc289ecf..c217007221c 100644
--- a/dll/win32/rsaenh/implglue.c
+++ b/dll/win32/rsaenh/implglue.c
@@ -342,6 +342,7 @@ BOOL encrypt_block_impl(ALG_ID aiAlgid, DWORD dwKeySpec, KEY_CONTEXT *pKeyContex
case CALG_RSA_KEYX:
case CALG_RSA_SIGN:
+ case CALG_SSL3_SHAMD5:
outlen = inlen = (mp_count_bits(&pKeyContext->rsa.N)+7)/8;
if (enc) {
if (rsa_exptmod(in, inlen, out, &outlen, dwKeySpec, &pKeyContext->rsa) != CRYPT_OK) {
diff --git a/dll/win32/rsaenh/rsaenh.c b/dll/win32/rsaenh/rsaenh.c
index 8a5be9935c3..d7d63b13676 100644
--- a/dll/win32/rsaenh/rsaenh.c
+++ b/dll/win32/rsaenh/rsaenh.c
@@ -1167,16 +1167,6 @@ static void store_key_container_keys(KEYCONTAINER *pKeyContainer)
static void store_key_container_permissions(KEYCONTAINER *pKeyContainer)
{
HKEY hKey;
- DWORD dwFlags;
-
- /* On WinXP, persistent keys are stored in a file located at:
- * $AppData$\\Microsoft\\Crypto\\RSA\\$SID$\\some_hex_string
- */
-
- if (pKeyContainer->dwFlags & CRYPT_MACHINE_KEYSET)
- dwFlags = CRYPTPROTECT_LOCAL_MACHINE;
- else
- dwFlags = 0;
if (create_container_key(pKeyContainer, KEY_WRITE, &hKey))
{
@@ -1426,7 +1416,7 @@ static BOOL build_hash_signature(BYTE *pbSignature, DWORD dwLen, ALG_ID aiAlgid,
ALG_ID aiAlgid;
DWORD dwLen;
CONST BYTE abOID[19];
- } aOIDDescriptor[8] = {
+ } aOIDDescriptor[] = {
{ CALG_MD2, 18, { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48,
0x86, 0xf7, 0x0d, 0x02, 0x02, 0x05, 0x00, 0x04, 0x10 } },
{ CALG_MD4, 18, { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48,
@@ -1444,6 +1434,7 @@ static BOOL build_hash_signature(BYTE *pbSignature, DWORD dwLen, ALG_ID aiAlgid,
{ CALG_SHA_384, 19, { 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01,
0x05, 0x00, 0x04, 0x40 } },
+ { CALG_SSL3_SHAMD5, 0, { 0 } },
{ 0, 0, { 0 } }
};
DWORD dwIdxOID, i, j;
diff --git a/dll/win32/shdocvw/iexplore.c b/dll/win32/shdocvw/iexplore.c
index d65810f58f9..9c14cfc1631 100644
--- a/dll/win32/shdocvw/iexplore.c
+++ b/dll/win32/shdocvw/iexplore.c
@@ -37,6 +37,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
+#define IDI_APPICON 101
+
static const WCHAR szIEWinFrame[] = { 'I','E','F','r','a','m','e',0 };
static LRESULT iewnd_OnCreate(HWND hwnd, LPCREATESTRUCTW lpcs)
@@ -85,7 +87,7 @@ ie_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
void register_iewindow_class(void)
{
- WNDCLASSW wc;
+ WNDCLASSEXW wc;
memset(&wc, 0, sizeof wc);
wc.style = 0;
@@ -93,13 +95,15 @@ void register_iewindow_class(void)
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(InternetExplorer*);
wc.hInstance = shdocvw_hinstance;
- wc.hIcon = 0;
- wc.hCursor = LoadCursorW(0, MAKEINTRESOURCEW(IDI_APPLICATION));
+ wc.hIcon = LoadIconW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDI_APPICON));
+ wc.hIconSm = LoadImageW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDI_APPICON), IMAGE_ICON,
+ GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED);
+ wc.hCursor = LoadCursorW(0, MAKEINTRESOURCEW(IDC_ARROW));
wc.hbrBackground = 0;
wc.lpszClassName = szIEWinFrame;
wc.lpszMenuName = NULL;
- RegisterClassW(&wc);
+ RegisterClassExW(&wc);
}
void unregister_iewindow_class(void)
diff --git a/dll/win32/shdocvw/intshcut.c b/dll/win32/shdocvw/intshcut.c
index b389ec3727a..32dab6dd519 100644
--- a/dll/win32/shdocvw/intshcut.c
+++ b/dll/win32/shdocvw/intshcut.c
@@ -74,6 +74,7 @@ static BOOL run_winemenubuilder( const WCHAR *args )
PROCESS_INFORMATION pi;
BOOL ret;
WCHAR app[MAX_PATH];
+ void *redir;
GetSystemDirectoryW( app, MAX_PATH - sizeof(menubuilder)/sizeof(WCHAR) );
strcatW( app, menubuilder );
@@ -91,7 +92,9 @@ static BOOL run_winemenubuilder( const WCHAR *args )
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
+ Wow64DisableWow64FsRedirection( &redir );
ret = CreateProcessW( app, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
+ Wow64RevertWow64FsRedirection( redir );
heap_free( buffer );
diff --git a/dll/win32/shdocvw/navigate.c b/dll/win32/shdocvw/navigate.c
index 8ba5f692740..99980c7c31b 100644
--- a/dll/win32/shdocvw/navigate.c
+++ b/dll/win32/shdocvw/navigate.c
@@ -642,7 +642,7 @@ static HRESULT async_doc_navigate(DocHost *This, LPCWSTR url, LPCWSTR headers, P
return free_doc_navigate_task(task, TRUE);
}
- if(task->post_data) {
+ if(post_data) {
task->post_data = SafeArrayCreateVector(VT_UI1, 0, post_data_size);
if(!task->post_data)
return free_doc_navigate_task(task, TRUE);
@@ -950,7 +950,132 @@ static const IHlinkFrameVtbl HlinkFrameVtbl = {
HlinkFrame_UpdateHlink
};
+#define TARGETFRAME2_THIS(iface) DEFINE_THIS(WebBrowser, ITargetFrame2, iface)
+
+static HRESULT WINAPI TargetFrame2_QueryInterface(ITargetFrame2 *iface, REFIID riid, void **ppv)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ return IWebBrowser2_QueryInterface(WEBBROWSER2(This), riid, ppv);
+}
+
+static ULONG WINAPI TargetFrame2_AddRef(ITargetFrame2 *iface)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ return IWebBrowser2_AddRef(WEBBROWSER2(This));
+}
+
+static ULONG WINAPI TargetFrame2_Release(ITargetFrame2 *iface)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ return IWebBrowser2_Release(WEBBROWSER2(This));
+}
+
+static HRESULT WINAPI TargetFrame2_SetFrameName(ITargetFrame2 *iface, LPCWSTR pszFrameName)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%s)\n", This, debugstr_w(pszFrameName));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_GetFrameName(ITargetFrame2 *iface, LPWSTR *ppszFrameName)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, ppszFrameName);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_GetParentFrame(ITargetFrame2 *iface, IUnknown **ppunkParent)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, ppunkParent);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_SetFrameSrc(ITargetFrame2 *iface, LPCWSTR pszFrameSrc)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%s)\n", This, debugstr_w(pszFrameSrc));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_GetFrameSrc(ITargetFrame2 *iface, LPWSTR *ppszFrameSrc)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_GetFramesContainer(ITargetFrame2 *iface, IOleContainer **ppContainer)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, ppContainer);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_SetFrameOptions(ITargetFrame2 *iface, DWORD dwFlags)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%x)\n", This, dwFlags);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_GetFrameOptions(ITargetFrame2 *iface, DWORD *pdwFlags)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, pdwFlags);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_SetFrameMargins(ITargetFrame2 *iface, DWORD dwWidth, DWORD dwHeight)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%d %d)\n", This, dwWidth, dwHeight);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_GetFrameMargins(ITargetFrame2 *iface, DWORD *pdwWidth, DWORD *pdwHeight)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%p %p)\n", This, pdwWidth, pdwHeight);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_FindFrame(ITargetFrame2 *iface, LPCWSTR pszTargetName, DWORD dwFlags, IUnknown **ppunkTargetFrame)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%s %x %p)\n", This, debugstr_w(pszTargetName), dwFlags, ppunkTargetFrame);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_GetTargetAlias(ITargetFrame2 *iface, LPCWSTR pszTargetName, LPWSTR *ppszTargetAlias)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%s %p)\n", This, debugstr_w(pszTargetName), ppszTargetAlias);
+ return E_NOTIMPL;
+}
+
+#undef TARGETFRAME2_THIS
+
+static const ITargetFrame2Vtbl TargetFrame2Vtbl = {
+ TargetFrame2_QueryInterface,
+ TargetFrame2_AddRef,
+ TargetFrame2_Release,
+ TargetFrame2_SetFrameName,
+ TargetFrame2_GetFrameName,
+ TargetFrame2_GetParentFrame,
+ TargetFrame2_SetFrameSrc,
+ TargetFrame2_GetFrameSrc,
+ TargetFrame2_GetFramesContainer,
+ TargetFrame2_SetFrameOptions,
+ TargetFrame2_GetFrameOptions,
+ TargetFrame2_SetFrameMargins,
+ TargetFrame2_GetFrameMargins,
+ TargetFrame2_FindFrame,
+ TargetFrame2_GetTargetAlias
+};
+
void WebBrowser_HlinkFrame_Init(WebBrowser *This)
{
This->lpHlinkFrameVtbl = &HlinkFrameVtbl;
+ This->lpITargetFrame2Vtbl = &TargetFrame2Vtbl;
}
diff --git a/dll/win32/shdocvw/shdocvw.h b/dll/win32/shdocvw/shdocvw.h
index 1184298dca9..1af0365d25d 100644
--- a/dll/win32/shdocvw/shdocvw.h
+++ b/dll/win32/shdocvw/shdocvw.h
@@ -37,6 +37,7 @@
#include "exdisp.h"
#include "mshtmhst.h"
#include "hlink.h"
+#include "htiframe.h"
#include "wine/unicode.h"
@@ -126,7 +127,9 @@ struct WebBrowser {
const IOleInPlaceActiveObjectVtbl *lpOleInPlaceActiveObjectVtbl;
const IOleCommandTargetVtbl *lpOleCommandTargetVtbl;
const IHlinkFrameVtbl *lpHlinkFrameVtbl;
+ const ITargetFrame2Vtbl *lpITargetFrame2Vtbl;
const IServiceProviderVtbl *lpServiceProviderVtbl;
+ const IDataObjectVtbl *lpDataObjectVtbl;
LONG ref;
@@ -184,6 +187,8 @@ struct InternetExplorer {
#define ACTIVEOBJ(x) ((IOleInPlaceActiveObject*) &(x)->lpOleInPlaceActiveObjectVtbl)
#define OLECMD(x) ((IOleCommandTarget*) &(x)->lpOleCommandTargetVtbl)
#define HLINKFRAME(x) ((IHlinkFrame*) &(x)->lpHlinkFrameVtbl)
+#define DATAOBJECT(x) ((IDataObject*) &(x)->lpDataObjectVtbl)
+#define TARGETFRAME2(x) ((ITargetFrame2*) &(x)->lpITargetFrame2Vtbl)
#define CLIENTSITE(x) ((IOleClientSite*) &(x)->lpOleClientSiteVtbl)
#define INPLACESITE(x) ((IOleInPlaceSite*) &(x)->lpOleInPlaceSiteVtbl)
@@ -198,6 +203,7 @@ struct InternetExplorer {
void WebBrowser_OleObject_Init(WebBrowser*);
void WebBrowser_ViewObject_Init(WebBrowser*);
+void WebBrowser_DataObject_Init(WebBrowser*);
void WebBrowser_Persist_Init(WebBrowser*);
void WebBrowser_ClassInfo_Init(WebBrowser*);
void WebBrowser_HlinkFrame_Init(WebBrowser*);
diff --git a/dll/win32/shdocvw/shdocvw.inf b/dll/win32/shdocvw/shdocvw.inf
index 932c9beaf25..f08759c5a93 100644
--- a/dll/win32/shdocvw/shdocvw.inf
+++ b/dll/win32/shdocvw/shdocvw.inf
@@ -149,9 +149,9 @@ HKLM,"Software\Microsoft\Windows\CurrentVersion\App Paths\iexplore.exe","Path",,
[IE.Reg]
-HKLM,"Software\Microsoft\Internet Explorer","Build",,"62900.2180"
-HKLM,"Software\Microsoft\Internet Explorer","IVer",,"103"
-HKLM,"Software\Microsoft\Internet Explorer","Version",,"6.0.2900.2180"
+HKLM,"Software\Microsoft\Internet Explorer","Build",,"86001"
+HKLM,"Software\Microsoft\Internet Explorer","Version",,"8.0.6001.18702"
+HKLM,"Software\Microsoft\Internet Explorer","W2kVersion",,"8.0.6001.18702"
[Strings]
diff --git a/dll/win32/shdocvw/shdocvw.spec b/dll/win32/shdocvw/shdocvw.spec
index aa5ef512b3c..4a0dd2c678a 100644
--- a/dll/win32/shdocvw/shdocvw.spec
+++ b/dll/win32/shdocvw/shdocvw.spec
@@ -40,7 +40,7 @@
151 stdcall -noname URLSubRegQueryA(str str long ptr long long)
152 stub -noname CShellUIHelper_CreateInstance2
153 stub -noname IsURLChild
-158 stub -noname SHRestricted2A
+158 stdcall -noname SHRestricted2A(long str long)
159 stdcall -noname SHRestricted2W(long wstr long)
160 stub -noname SHIsRestricted2W
161 stub @ # CSearchAssistantOC::OnDraw
diff --git a/dll/win32/shdocvw/shdocvw_main.c b/dll/win32/shdocvw/shdocvw_main.c
index 746753f0ab2..5dfd2b99ddf 100644
--- a/dll/win32/shdocvw/shdocvw_main.c
+++ b/dll/win32/shdocvw/shdocvw_main.c
@@ -440,3 +440,24 @@ DWORD WINAPI SHRestricted2W(DWORD res, LPCWSTR url, DWORD reserved)
FIXME("(%d %s %d) stub\n", res, debugstr_w(url), reserved);
return 0;
}
+
+/******************************************************************
+ * SHRestricted2A (SHDOCVW.158)
+ *
+ * See SHRestricted2W
+ */
+DWORD WINAPI SHRestricted2A(DWORD restriction, LPCSTR url, DWORD reserved)
+{
+ LPWSTR urlW = NULL;
+ DWORD res;
+
+ TRACE("(%d, %s, %d)\n", restriction, debugstr_a(url), reserved);
+ if (url) {
+ DWORD len = MultiByteToWideChar(CP_ACP, 0, url, -1, NULL, 0);
+ urlW = heap_alloc(len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, url, -1, urlW, len);
+ }
+ res = SHRestricted2W(restriction, urlW, reserved);
+ heap_free(urlW);
+ return res;
+}
diff --git a/dll/win32/shdocvw/view.c b/dll/win32/shdocvw/view.c
index d2e58579cb6..9ee7c067333 100644
--- a/dll/win32/shdocvw/view.c
+++ b/dll/win32/shdocvw/view.c
@@ -1,5 +1,6 @@
/*
* Copyright 2005 Jacek Caban
+ * Copyright 2010 Ilya Shpigor
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -21,6 +22,10 @@
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
+/**********************************************************************
+ * Implement the IViewObject interface
+ */
+
#define VIEWOBJ_THIS(iface) DEFINE_THIS(WebBrowser, ViewObject, iface)
static HRESULT WINAPI ViewObject_QueryInterface(IViewObject2 *iface, REFIID riid, void **ppv)
@@ -122,3 +127,112 @@ void WebBrowser_ViewObject_Init(WebBrowser *This)
{
This->lpViewObjectVtbl = &ViewObjectVtbl;
}
+
+/**********************************************************************
+ * Implement the IDataObject interface
+ */
+
+#define DATAOBJ_THIS(iface) DEFINE_THIS(WebBrowser, DataObject, iface)
+
+static HRESULT WINAPI DataObject_QueryInterface(LPDATAOBJECT iface, REFIID riid, LPVOID * ppvObj)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ return IWebBrowser2_QueryInterface(WEBBROWSER(This), riid, ppvObj);
+}
+
+static ULONG WINAPI DataObject_AddRef(LPDATAOBJECT iface)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ return IWebBrowser2_AddRef(WEBBROWSER(This));
+}
+
+static ULONG WINAPI DataObject_Release(LPDATAOBJECT iface)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ return IWebBrowser2_Release(WEBBROWSER(This));
+}
+
+static HRESULT WINAPI DataObject_GetData(LPDATAOBJECT iface, LPFORMATETC pformatetcIn, STGMEDIUM *pmedium)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_GetDataHere(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_QueryGetData(LPDATAOBJECT iface, LPFORMATETC pformatetc)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_GetCanonicalFormatEtc(LPDATAOBJECT iface, LPFORMATETC pformatectIn, LPFORMATETC pformatetcOut)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_SetData(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium, BOOL fRelease)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_EnumFormatEtc(LPDATAOBJECT iface, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_DAdvise(LPDATAOBJECT iface, FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_DUnadvise(LPDATAOBJECT iface, DWORD dwConnection)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_EnumDAdvise(LPDATAOBJECT iface, IEnumSTATDATA **ppenumAdvise)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static const IDataObjectVtbl DataObjectVtbl = {
+ DataObject_QueryInterface,
+ DataObject_AddRef,
+ DataObject_Release,
+ DataObject_GetData,
+ DataObject_GetDataHere,
+ DataObject_QueryGetData,
+ DataObject_GetCanonicalFormatEtc,
+ DataObject_SetData,
+ DataObject_EnumFormatEtc,
+ DataObject_DAdvise,
+ DataObject_DUnadvise,
+ DataObject_EnumDAdvise
+};
+
+#undef DATAOBJ_THIS
+
+void WebBrowser_DataObject_Init(WebBrowser *This)
+{
+ This->lpDataObjectVtbl = &DataObjectVtbl;
+}
diff --git a/dll/win32/shdocvw/webbrowser.c b/dll/win32/shdocvw/webbrowser.c
index 2ac9b9985d5..0c26a83b55e 100644
--- a/dll/win32/shdocvw/webbrowser.c
+++ b/dll/win32/shdocvw/webbrowser.c
@@ -102,9 +102,15 @@ static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid
}else if(IsEqualGUID(&IID_IHlinkFrame, riid)) {
TRACE("(%p)->(IID_IHlinkFrame %p)\n", This, ppv);
*ppv = HLINKFRAME(This);
+ }else if(IsEqualGUID(&IID_ITargetFrame2, riid)) {
+ TRACE("(%p)->(IID_ITargetFrame2 %p)\n", This, ppv);
+ *ppv = TARGETFRAME2(This);
}else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
*ppv = SERVPROV(This);
TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
+ }else if(IsEqualGUID(&IID_IDataObject, riid)) {
+ *ppv = DATAOBJECT(This);
+ TRACE("(%p)->(IID_IDataObject %p)\n", This, ppv);
}else if(IsEqualGUID(&IID_IQuickActivate, riid)) {
TRACE("(%p)->(IID_IQuickActivate %p) returning NULL\n", This, ppv);
return E_NOINTERFACE;
@@ -1132,6 +1138,7 @@ static HRESULT WebBrowser_Create(INT version, IUnknown *pOuter, REFIID riid, voi
WebBrowser_OleObject_Init(ret);
WebBrowser_ViewObject_Init(ret);
+ WebBrowser_DataObject_Init(ret);
WebBrowser_Persist_Init(ret);
WebBrowser_ClassInfo_Init(ret);
WebBrowser_HlinkFrame_Init(ret);
diff --git a/dll/win32/shell32/lang/cs-CZ.rc b/dll/win32/shell32/lang/cs-CZ.rc
index 6c80a3e3ce7..dff2e85bff0 100644
--- a/dll/win32/shell32/lang/cs-CZ.rc
+++ b/dll/win32/shell32/lang/cs-CZ.rc
@@ -1,6 +1,6 @@
/* FILE: dll/win32/shell32/lang/cs-CZ.rc
* TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com)
- * UPDATED: 2010-05-06
+ * UPDATED: 2010-05-25
* THANKS TO: navaraf, who translated major part of this file
*/
@@ -101,7 +101,7 @@ BEGIN
DEFPUSHBUTTON "&Ano", IDYES, 34, 69, 53, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON "Ano &všem", IDD_YESTOALL, 92, 69, 65, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON "&Ne", IDNO, 162, 69, 53, 14, WS_GROUP | WS_TABSTOP
- PUSHBUTTON "&Storno", IDCANCEL, 220, 69, 53, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Storno", IDCANCEL, 220, 69, 53, 14, WS_GROUP | WS_TABSTOP
ICON "", IDD_ICON, 10, 10, 16, 16
LTEXT "", IDD_MESSAGE, 40, 10, 238, 52, 0
END
diff --git a/dll/win32/shell32/lang/es-ES.rc b/dll/win32/shell32/lang/es-ES.rc
index f26e1d4b616..c619493d3f2 100644
--- a/dll/win32/shell32/lang/es-ES.rc
+++ b/dll/win32/shell32/lang/es-ES.rc
@@ -376,6 +376,16 @@ BEGIN
PUSHBUTTON "Cancelar", 14006, 226, 236, 50, 14
END
+IDD_SH_FILE_COPY DIALOGEX 0, 0, 264, 45
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION
+CAPTION "Copiando..."
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ PUSHBUTTON "Cancelar", 14002, 195, 14, 60, 16
+ CONTROL "", 14000, "MSCTLS_PROGRESS32", 0, 8, 20, 170, 10
+ LTEXT "Archivo", 14001, 8, 6, 169, 10
+END
+
FOLDER_OPTIONS_GENERAL_DLG DIALOGEX 0, 0, 294, 240
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
CAPTION "General"
@@ -755,5 +765,5 @@ BEGIN
IDS_DEFAULT_CLUSTER_SIZE "Tamańo asignado por defecto"
IDS_COPY_OF "Copia de"
- IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file."
+ IDS_SHLEXEC_NOASSOC "No hay ningún programa configurado en ReactOS para abrir este tipo de archivo."
END
diff --git a/dll/win32/shell32/lang/it-IT.rc b/dll/win32/shell32/lang/it-IT.rc
index 18bafe2a6fd..824eb22a88e 100644
--- a/dll/win32/shell32/lang/it-IT.rc
+++ b/dll/win32/shell32/lang/it-IT.rc
@@ -374,6 +374,16 @@ BEGIN
PUSHBUTTON "Annulla", 14006, 206, 236, 50, 14
END
+IDD_SH_FILE_COPY DIALOGEX 0, 0, 264, 45
+STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION
+CAPTION "Copia in corso..."
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ PUSHBUTTON "Annulla", 14002, 195, 14, 60, 16
+ CONTROL "", 14000, "MSCTLS_PROGRESS32", 0, 8, 20, 170, 10
+ LTEXT "File", 14001, 8, 6, 169, 10
+END
+
FOLDER_OPTIONS_GENERAL_DLG DIALOGEX 0, 0, 264, 256
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
CAPTION "Generale"
diff --git a/dll/win32/shell32/shelllink.c b/dll/win32/shell32/shelllink.c
index b2dd1cb6ff8..ae159cdcdc2 100644
--- a/dll/win32/shell32/shelllink.c
+++ b/dll/win32/shell32/shelllink.c
@@ -2828,7 +2828,7 @@ ShellLink_InvokeCommand( IContextMenu* iface, LPCMINVOKECOMMANDINFO lpici )
}
else if (This->sArgs != NULL)
{
- args = This->sArgs;
+ args = strdupW( This->sArgs );
}
memset( &sei, 0, sizeof sei );
diff --git a/dll/win32/shlwapi/ordinal.c b/dll/win32/shlwapi/ordinal.c
index 332bdb67f79..22851d92010 100644
--- a/dll/win32/shlwapi/ordinal.c
+++ b/dll/win32/shlwapi/ordinal.c
@@ -484,7 +484,6 @@ HRESULT WINAPI GetAcceptLanguagesW( LPWSTR langbuf, LPDWORD buflen)
DWORD mystrlen, mytype;
DWORD len;
HKEY mykey;
- HRESULT retval;
LCID mylcid;
WCHAR *mystr;
LONG lres;
@@ -512,7 +511,7 @@ HRESULT WINAPI GetAcceptLanguagesW( LPWSTR langbuf, LPDWORD buflen)
/* Did not find a value in the registry or the user buffer is too small */
mylcid = GetUserDefaultLCID();
- retval = LcidToRfc1766W(mylcid, mystr, mystrlen);
+ LcidToRfc1766W(mylcid, mystr, mystrlen);
len = lstrlenW(mystr);
memcpy( langbuf, mystr, min(*buflen, len+1)*sizeof(WCHAR) );
diff --git a/dll/win32/shlwapi/reg.c b/dll/win32/shlwapi/reg.c
index d641955ba05..09fce55cb3f 100644
--- a/dll/win32/shlwapi/reg.c
+++ b/dll/win32/shlwapi/reg.c
@@ -331,8 +331,25 @@ LONG WINAPI SHRegEnumUSValueA(HUSKEY hUSKey, DWORD dwIndex, LPSTR pszValueName,
LPDWORD pcchValueNameLen, LPDWORD pdwType, LPVOID pvData,
LPDWORD pcbData, SHREGENUM_FLAGS enumRegFlags)
{
- FIXME("(%p, 0x%08x, %s, %p, %p, %p, %p, 0x%08x) stub\n", hUSKey, dwIndex,
- debugstr_a(pszValueName), pcchValueNameLen, pdwType, pvData, pcbData, enumRegFlags);
+ HKEY dokey;
+
+ TRACE("(%p, 0x%08x, %p, %p, %p, %p, %p, 0x%08x)\n", hUSKey, dwIndex,
+ pszValueName, pcchValueNameLen, pdwType, pvData, pcbData, enumRegFlags);
+
+ if (((enumRegFlags == SHREGENUM_HKCU) ||
+ (enumRegFlags == SHREGENUM_DEFAULT)) &&
+ (dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKCU))) {
+ return RegEnumValueA(dokey, dwIndex, pszValueName, pcchValueNameLen,
+ NULL, pdwType, pvData, pcbData);
+ }
+
+ if (((enumRegFlags == SHREGENUM_HKLM) ||
+ (enumRegFlags == SHREGENUM_DEFAULT)) &&
+ (dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKLM))) {
+ return RegEnumValueA(dokey, dwIndex, pszValueName, pcchValueNameLen,
+ NULL, pdwType, pvData, pcbData);
+ }
+ FIXME("no support for SHREGENUM_BOTH\n");
return ERROR_INVALID_FUNCTION;
}
@@ -345,8 +362,25 @@ LONG WINAPI SHRegEnumUSValueW(HUSKEY hUSKey, DWORD dwIndex, LPWSTR pszValueName,
LPDWORD pcchValueNameLen, LPDWORD pdwType, LPVOID pvData,
LPDWORD pcbData, SHREGENUM_FLAGS enumRegFlags)
{
- FIXME("(%p, 0x%08x, %s, %p, %p, %p, %p, 0x%08x) stub\n", hUSKey, dwIndex,
- debugstr_w(pszValueName), pcchValueNameLen, pdwType, pvData, pcbData, enumRegFlags);
+ HKEY dokey;
+
+ TRACE("(%p, 0x%08x, %p, %p, %p, %p, %p, 0x%08x)\n", hUSKey, dwIndex,
+ pszValueName, pcchValueNameLen, pdwType, pvData, pcbData, enumRegFlags);
+
+ if (((enumRegFlags == SHREGENUM_HKCU) ||
+ (enumRegFlags == SHREGENUM_DEFAULT)) &&
+ (dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKCU))) {
+ return RegEnumValueW(dokey, dwIndex, pszValueName, pcchValueNameLen,
+ NULL, pdwType, pvData, pcbData);
+ }
+
+ if (((enumRegFlags == SHREGENUM_HKLM) ||
+ (enumRegFlags == SHREGENUM_DEFAULT)) &&
+ (dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKLM))) {
+ return RegEnumValueW(dokey, dwIndex, pszValueName, pcchValueNameLen,
+ NULL, pdwType, pvData, pcbData);
+ }
+ FIXME("no support for SHREGENUM_BOTH\n");
return ERROR_INVALID_FUNCTION;
}
diff --git a/dll/win32/shlwapi/shlwapi.spec b/dll/win32/shlwapi/shlwapi.spec
index 367046b5ebc..268a2e20145 100644
--- a/dll/win32/shlwapi/shlwapi.spec
+++ b/dll/win32/shlwapi/shlwapi.spec
@@ -683,6 +683,7 @@
@ stdcall SHCreateStreamOnFileEx(wstr long long long ptr ptr)
@ stdcall SHCreateStreamOnFileW(wstr long ptr)
@ stdcall SHCreateStreamWrapper(ptr ptr long ptr)
+@ stdcall SHCreateThreadRef(ptr ptr)
@ stdcall SHDeleteEmptyKeyA(long ptr)
@ stdcall SHDeleteEmptyKeyW(long ptr)
@ stdcall SHDeleteKeyA(long str)
diff --git a/dll/win32/shlwapi/string.c b/dll/win32/shlwapi/string.c
index e00a92582e0..a0269b6cb37 100644
--- a/dll/win32/shlwapi/string.c
+++ b/dll/win32/shlwapi/string.c
@@ -1415,7 +1415,7 @@ HRESULT WINAPI StrRetToBufW (LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest,
break;
case STRRET_CSTR:
- if (!MultiByteToWideChar( CP_ACP, 0, src->u.cStr, -1, dest, len ) && len)
+ if (!MultiByteToWideChar( CP_ACP, 0, src->u.cStr, -1, dest, len ))
dest[len-1] = 0;
break;
@@ -1423,7 +1423,7 @@ HRESULT WINAPI StrRetToBufW (LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest,
if (pidl)
{
if (!MultiByteToWideChar( CP_ACP, 0, ((LPCSTR)&pidl->mkid)+src->u.uOffset, -1,
- dest, len ) && len)
+ dest, len ))
dest[len-1] = 0;
}
break;
diff --git a/dll/win32/shlwapi/thread.c b/dll/win32/shlwapi/thread.c
index cfe6615cd69..00d26f78eb7 100644
--- a/dll/win32/shlwapi/thread.c
+++ b/dll/win32/shlwapi/thread.c
@@ -120,6 +120,93 @@ typedef struct tagSHLWAPI_THREAD_INFO
IUnknown *refIE; /* Reference to the IE process */
} SHLWAPI_THREAD_INFO, *LPSHLWAPI_THREAD_INFO;
+typedef struct
+{
+ const IUnknownVtbl* lpVtbl;
+ LONG *ref;
+} threadref;
+
+static HRESULT WINAPI threadref_QueryInterface(IUnknown *iface, REFIID riid, LPVOID *ppvObj)
+{
+ threadref * This = (threadref *)iface;
+
+ TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppvObj);
+
+ if (ppvObj == NULL)
+ return E_POINTER;
+
+ if (IsEqualGUID(&IID_IUnknown, riid)) {
+ TRACE("(%p)->(IID_IUnknown %p)\n", This, ppvObj);
+ *ppvObj = This;
+ IUnknown_AddRef((IUnknown*)*ppvObj);
+ return S_OK;
+ }
+
+ *ppvObj = NULL;
+ FIXME("(%p, %s, %p) interface not supported\n", This, debugstr_guid(riid), ppvObj);
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI threadref_AddRef(IUnknown *iface)
+{
+ threadref * This = (threadref *)iface;
+
+ TRACE("(%p)\n", This);
+ return InterlockedIncrement(This->ref);
+}
+
+static ULONG WINAPI threadref_Release(IUnknown *iface)
+{
+ LONG refcount;
+ threadref * This = (threadref *)iface;
+
+ TRACE("(%p)\n", This);
+
+ refcount = InterlockedDecrement(This->ref);
+ if (!refcount)
+ HeapFree(GetProcessHeap(), 0, This);
+
+ return refcount;
+}
+
+/* VTable */
+static const IUnknownVtbl threadref_vt =
+{
+ threadref_QueryInterface,
+ threadref_AddRef,
+ threadref_Release,
+};
+
+/*************************************************************************
+ * SHCreateThreadRef [SHLWAPI.@]
+ *
+ * Create a per-thread IUnknown object
+ *
+ * PARAMS
+ * lprefcount [I] Pointer to a LONG to be used as refcount
+ * lppUnknown [O] Destination to receive the created object reference
+ *
+ * RETURNS
+ * Success: S_OK. lppUnknown is set to the object reference.
+ * Failure: E_INVALIDARG, if a parameter is NULL
+ */
+HRESULT WINAPI SHCreateThreadRef(LONG *lprefcount, IUnknown **lppUnknown)
+{
+ threadref * This;
+ TRACE("(%p, %p)\n", lprefcount, lppUnknown);
+
+ if (!lprefcount || !lppUnknown)
+ return E_INVALIDARG;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(threadref));
+ This->lpVtbl = &threadref_vt;
+ This->ref = lprefcount;
+
+ *lprefcount = 1;
+ *lppUnknown = (IUnknown *) This;
+ TRACE("=> returning S_OK with %p\n", This);
+ return S_OK;
+}
/*************************************************************************
* SHGetThreadRef [SHLWAPI.@]
@@ -131,13 +218,13 @@ typedef struct tagSHLWAPI_THREAD_INFO
*
* RETURNS
* Success: S_OK. lppUnknown is set to the object reference.
- * Failure: E_NOINTERFACE, if an error occurs or lppUnknown is NULL.
+ * Failure: E_NOINTERFACE, if an error occurs or no object is set
*/
HRESULT WINAPI SHGetThreadRef(IUnknown **lppUnknown)
{
TRACE("(%p)\n", lppUnknown);
- if (!lppUnknown || SHLWAPI_ThreadRef_index == TLS_OUT_OF_INDEXES)
+ if (SHLWAPI_ThreadRef_index == TLS_OUT_OF_INDEXES)
return E_NOINTERFACE;
*lppUnknown = TlsGetValue(SHLWAPI_ThreadRef_index);
@@ -159,13 +246,13 @@ HRESULT WINAPI SHGetThreadRef(IUnknown **lppUnknown)
*
* RETURNS
* Success: S_OK. lpUnknown is stored and can be retrieved by SHGetThreadRef()
- * Failure: E_NOINTERFACE, if an error occurs or lpUnknown is NULL.
+ * Failure: E_NOINTERFACE, if an error occurs
*/
HRESULT WINAPI SHSetThreadRef(IUnknown *lpUnknown)
{
TRACE("(%p)\n", lpUnknown);
- if (!lpUnknown || SHLWAPI_ThreadRef_index == TLS_OUT_OF_INDEXES)
+ if (SHLWAPI_ThreadRef_index == TLS_OUT_OF_INDEXES)
return E_NOINTERFACE;
TlsSetValue(SHLWAPI_ThreadRef_index, lpUnknown);
diff --git a/dll/win32/shlwapi/url.c b/dll/win32/shlwapi/url.c
index cd83b457178..ad7d989a4bb 100644
--- a/dll/win32/shlwapi/url.c
+++ b/dll/win32/shlwapi/url.c
@@ -232,40 +232,34 @@ HRESULT WINAPI ParseURLW(LPCWSTR x, PARSEDURLW *y)
HRESULT WINAPI UrlCanonicalizeA(LPCSTR pszUrl, LPSTR pszCanonicalized,
LPDWORD pcchCanonicalized, DWORD dwFlags)
{
- LPWSTR base, canonical;
+ LPWSTR url, canonical;
HRESULT ret;
- DWORD len, len2;
+ DWORD len;
TRACE("(%s, %p, %p, 0x%08x) *pcchCanonicalized: %d\n", debugstr_a(pszUrl), pszCanonicalized,
pcchCanonicalized, dwFlags, pcchCanonicalized ? *pcchCanonicalized : -1);
- if(!pszUrl || !pszCanonicalized || !pcchCanonicalized)
+ if(!pszUrl || !pszCanonicalized || !pcchCanonicalized || !*pcchCanonicalized)
return E_INVALIDARG;
- base = HeapAlloc(GetProcessHeap(), 0,
- (2*INTERNET_MAX_URL_LENGTH) * sizeof(WCHAR));
- canonical = base + INTERNET_MAX_URL_LENGTH;
-
- MultiByteToWideChar(0, 0, pszUrl, -1, base, INTERNET_MAX_URL_LENGTH);
- len = INTERNET_MAX_URL_LENGTH;
-
- ret = UrlCanonicalizeW(base, canonical, &len, dwFlags);
- if (ret != S_OK) {
- *pcchCanonicalized = len * 2;
- HeapFree(GetProcessHeap(), 0, base);
- return ret;
+ len = strlen(pszUrl)+1;
+ url = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
+ canonical = HeapAlloc(GetProcessHeap(), 0, *pcchCanonicalized*sizeof(WCHAR));
+ if(!url || !canonical) {
+ HeapFree(GetProcessHeap(), 0, url);
+ HeapFree(GetProcessHeap(), 0, canonical);
+ return E_OUTOFMEMORY;
}
- len2 = WideCharToMultiByte(0, 0, canonical, -1, 0, 0, 0, 0);
- if (len2 > *pcchCanonicalized) {
- *pcchCanonicalized = len2;
- HeapFree(GetProcessHeap(), 0, base);
- return E_POINTER;
- }
- WideCharToMultiByte(0, 0, canonical, -1, pszCanonicalized, *pcchCanonicalized, 0, 0);
- *pcchCanonicalized = len;
- HeapFree(GetProcessHeap(), 0, base);
- return S_OK;
+ MultiByteToWideChar(0, 0, pszUrl, -1, url, len);
+
+ ret = UrlCanonicalizeW(url, canonical, pcchCanonicalized, dwFlags);
+ if(ret == S_OK)
+ WideCharToMultiByte(0, 0, canonical, -1, pszCanonicalized,
+ *pcchCanonicalized+1, 0, 0);
+
+ HeapFree(GetProcessHeap(), 0, canonical);
+ return ret;
}
/*************************************************************************
@@ -287,11 +281,12 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
static const WCHAR wszFile[] = {'f','i','l','e',':'};
static const WCHAR wszRes[] = {'r','e','s',':'};
static const WCHAR wszLocalhost[] = {'l','o','c','a','l','h','o','s','t'};
+ static const WCHAR wszFilePrefix[] = {'f','i','l','e',':','/','/','/'};
TRACE("(%s, %p, %p, 0x%08x) *pcchCanonicalized: %d\n", debugstr_w(pszUrl), pszCanonicalized,
pcchCanonicalized, dwFlags, pcchCanonicalized ? *pcchCanonicalized : -1);
- if(!pszUrl || !pszCanonicalized || !pcchCanonicalized)
+ if(!pszUrl || !pszCanonicalized || !pcchCanonicalized || !*pcchCanonicalized)
return E_INVALIDARG;
if(!*pszUrl) {
@@ -300,8 +295,9 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
}
nByteLen = (strlenW(pszUrl) + 1) * sizeof(WCHAR); /* length in bytes */
+ /* Allocate memory for simplified URL (before escaping) */
lpszUrlCpy = HeapAlloc(GetProcessHeap(), 0,
- INTERNET_MAX_URL_LENGTH * sizeof(WCHAR));
+ nByteLen+sizeof(wszFilePrefix)+sizeof(WCHAR));
if((dwFlags & URL_FILE_USE_PATHURL) && nByteLen >= sizeof(wszFile)
&& !memcmp(wszFile, pszUrl, sizeof(wszFile)))
@@ -328,8 +324,6 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
state = 0;
if(pszUrl[1] == ':') { /* Assume path */
- static const WCHAR wszFilePrefix[] = {'f','i','l','e',':','/','/','/'};
-
memcpy(wk2, wszFilePrefix, sizeof(wszFilePrefix));
wk2 += sizeof(wszFilePrefix)/sizeof(WCHAR);
if (dwFlags & URL_FILE_USE_PATHURL)
@@ -833,6 +827,8 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
if (ret == S_OK) {
/* Reuse mrelative as temp storage as its already allocated and not needed anymore */
+ if(*pcchCombined == 0)
+ *pcchCombined = 1;
ret = UrlCanonicalizeW(preliminary, mrelative, pcchCombined, (dwFlags & ~URL_FILE_USE_PATHURL));
if(SUCCEEDED(ret) && pszCombined) {
lstrcpyW(pszCombined, mrelative);
diff --git a/dll/win32/syssetup/lang/es-ES.rc b/dll/win32/syssetup/lang/es-ES.rc
index 3b5fabc6482..878aa3b8e43 100644
--- a/dll/win32/syssetup/lang/es-ES.rc
+++ b/dll/win32/syssetup/lang/es-ES.rc
@@ -254,7 +254,7 @@ BEGIN
IDS_SYS_ENTERTAINMENT "Entretenimiento"
IDS_CMT_MPLAY32 "Ejecutar Reproductor multimedia"
IDS_CMT_SNDVOL32 "Ejecutar Control de volumen"
- IDS_CMT_SNDREC32 "Launch Sound Recorder"
+ IDS_CMT_SNDREC32 "Ejecutar Grabadora de sonidos"
END
STRINGTABLE
@@ -292,7 +292,7 @@ BEGIN
IDS_SHORT_EVENTVIEW "Visor de sucesos.lnk"
IDS_SHORT_MSCONFIG "Configuración del sistema.lnk"
IDS_SHORT_SNDVOL32 "Control de volumen.lnk"
- IDS_SHORT_SNDREC32 "Audiorecorder.lnk"
+ IDS_SHORT_SNDREC32 "Grabadora de sonidos.lnk"
IDS_SHORT_DXDIAG "Diagnóstico de ReactX.lnk"
IDS_SHORT_PAINT "Paint.lnk"
IDS_SHORT_SPIDER "Solitario Spider.lnk"
diff --git a/dll/win32/urlmon/binding.c b/dll/win32/urlmon/binding.c
index dcf0207278c..e0f3624ff6b 100644
--- a/dll/win32/urlmon/binding.c
+++ b/dll/win32/urlmon/binding.c
@@ -47,6 +47,7 @@ typedef struct {
BYTE buf[1024*8];
DWORD size;
BOOL init;
+ HANDLE file;
HRESULT hres;
LPWSTR cache_file;
@@ -57,7 +58,7 @@ typedef struct _stgmed_obj_t stgmed_obj_t;
typedef struct {
void (*release)(stgmed_obj_t*);
HRESULT (*fill_stgmed)(stgmed_obj_t*,STGMEDIUM*);
- void *(*get_result)(stgmed_obj_t*);
+ HRESULT (*get_result)(stgmed_obj_t*,DWORD,void**);
} stgmed_obj_vtbl;
struct _stgmed_obj_t {
@@ -101,6 +102,7 @@ struct Binding {
LPWSTR redirect_url;
IID iid;
BOOL report_mime;
+ BOOL use_cache_file;
DWORD state;
HRESULT hres;
download_state_t download_state;
@@ -134,6 +136,20 @@ static void fill_stgmed_buffer(stgmed_buf_t *buf)
buf->init = TRUE;
}
+static void read_protocol_data(stgmed_buf_t *stgmed_buf)
+{
+ BYTE buf[8192];
+ DWORD read;
+ HRESULT hres;
+
+ fill_stgmed_buffer(stgmed_buf);
+ if(stgmed_buf->size < sizeof(stgmed_buf->buf))
+ return;
+
+ do hres = IInternetProtocol_Read(stgmed_buf->protocol, buf, sizeof(buf), &read);
+ while(hres == S_OK);
+}
+
static void dump_BINDINFO(BINDINFO *bi)
{
static const char * const BINDINFOF_str[] = {
@@ -339,6 +355,19 @@ static void create_object(Binding *binding)
IInternetProtocol_Terminate(binding->protocol, 0);
}
+static void cache_file_available(Binding *This, const WCHAR *file_name)
+{
+ heap_free(This->stgmed_buf->cache_file);
+ This->stgmed_buf->cache_file = heap_strdupW(file_name);
+
+ if(This->use_cache_file) {
+ This->stgmed_buf->file = CreateFileW(file_name, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if(This->stgmed_buf->file == INVALID_HANDLE_VALUE)
+ WARN("CreateFile failed: %u\n", GetLastError());
+ }
+}
+
#define STGMEDUNK_THIS(iface) DEFINE_THIS(stgmed_buf_t, Unknown, iface)
static HRESULT WINAPI StgMedUnk_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
@@ -377,6 +406,8 @@ static ULONG WINAPI StgMedUnk_Release(IUnknown *iface)
TRACE("(%p) ref=%d\n", This, ref);
if(!ref) {
+ if(This->file != INVALID_HANDLE_VALUE)
+ CloseHandle(This->file);
IInternetProtocol_Release(This->protocol);
heap_free(This->cache_file);
heap_free(This);
@@ -403,6 +434,7 @@ static stgmed_buf_t *create_stgmed_buf(IInternetProtocol *protocol)
ret->ref = 1;
ret->size = 0;
ret->init = FALSE;
+ ret->file = INVALID_HANDLE_VALUE;
ret->hres = S_OK;
ret->cache_file = NULL;
@@ -488,6 +520,15 @@ static HRESULT WINAPI ProtocolStream_Read(IStream *iface, void *pv,
TRACE("(%p)->(%p %d %p)\n", This, pv, cb, pcbRead);
+ if(This->buf->file != INVALID_HANDLE_VALUE) {
+ if (!ReadFile(This->buf->file, pv, cb, &read, NULL))
+ return INET_E_DOWNLOAD_FAILURE;
+
+ if(pcbRead)
+ *pcbRead = read;
+ return read ? S_OK : S_FALSE;
+ }
+
if(This->buf->size) {
read = cb;
@@ -637,12 +678,13 @@ static HRESULT stgmed_stream_fill_stgmed(stgmed_obj_t *obj, STGMEDIUM *stgmed)
return S_OK;
}
-static void *stgmed_stream_get_result(stgmed_obj_t *obj)
+static HRESULT stgmed_stream_get_result(stgmed_obj_t *obj, DWORD bindf, void **result)
{
ProtocolStream *stream = (ProtocolStream*)obj;
IStream_AddRef(STREAM(stream));
- return STREAM(stream);
+ *result = STREAM(stream);
+ return S_OK;
}
static const stgmed_obj_vtbl stgmed_stream_vtbl = {
@@ -689,16 +731,7 @@ static HRESULT stgmed_file_fill_stgmed(stgmed_obj_t *obj, STGMEDIUM *stgmed)
return INET_E_DATA_NOT_AVAILABLE;
}
- fill_stgmed_buffer(file_obj->buf);
- if(file_obj->buf->size == sizeof(file_obj->buf->buf)) {
- BYTE buf[1024];
- DWORD read;
- HRESULT hres;
-
- do {
- hres = IInternetProtocol_Read(file_obj->buf->protocol, buf, sizeof(buf), &read);
- }while(hres == S_OK);
- }
+ read_protocol_data(file_obj->buf);
stgmed->tymed = TYMED_FILE;
stgmed->u.lpszFileName = file_obj->buf->cache_file;
@@ -707,9 +740,9 @@ static HRESULT stgmed_file_fill_stgmed(stgmed_obj_t *obj, STGMEDIUM *stgmed)
return S_OK;
}
-static void *stgmed_file_get_result(stgmed_obj_t *obj)
+static HRESULT stgmed_file_get_result(stgmed_obj_t *obj, DWORD bindf, void **result)
{
- return NULL;
+ return bindf & BINDF_ASYNCHRONOUS ? MK_S_ASYNCHRONOUS : S_OK;
}
static const stgmed_obj_vtbl stgmed_file_vtbl = {
@@ -987,8 +1020,7 @@ static HRESULT WINAPI InternetProtocolSink_ReportProgress(IInternetProtocolSink
mime_available(This, szStatusText);
break;
case BINDSTATUS_CACHEFILENAMEAVAILABLE:
- heap_free(This->stgmed_buf->cache_file);
- This->stgmed_buf->cache_file = heap_strdupW(szStatusText);
+ cache_file_available(This, szStatusText);
break;
case BINDSTATUS_DECODING:
IBindStatusCallback_OnProgress(This->callback, 0, 0, BINDSTATUS_DECODING, szStatusText);
@@ -1019,9 +1051,12 @@ static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progres
if(This->download_state == END_DOWNLOAD || (This->state & BINDING_STOPPED))
return;
- if(This->download_state == BEFORE_DOWNLOAD) {
+ if(This->stgmed_buf->file != INVALID_HANDLE_VALUE)
+ read_protocol_data(This->stgmed_buf);
+ else if(This->download_state == BEFORE_DOWNLOAD)
fill_stgmed_buffer(This->stgmed_buf);
+ if(This->download_state == BEFORE_DOWNLOAD) {
This->download_state = DOWNLOADING;
sent_begindownloaddata = TRUE;
IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
@@ -1430,8 +1465,12 @@ static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, LPCWSTR url,
if(to_obj)
ret->bindinfo.dwOptions |= 0x100000;
- if(!is_urlmon_protocol(url))
+ if(!(ret->bindf & BINDF_ASYNCHRONOUS)) {
ret->bindf |= BINDF_NEEDFILE;
+ ret->use_cache_file = TRUE;
+ }else if(!is_urlmon_protocol(url)) {
+ ret->bindf |= BINDF_NEEDFILE;
+ }
ret->url = heap_strdupW(url);
@@ -1530,12 +1569,14 @@ HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv)
if((binding->state & BINDING_STOPPED) && (binding->state & BINDING_LOCKED))
IInternetProtocol_UnlockRequest(binding->protocol);
- *ppv = binding->stgmed_obj->vtbl->get_result(binding->stgmed_obj);
+ hres = binding->stgmed_obj->vtbl->get_result(binding->stgmed_obj, binding->bindf, ppv);
+ }else {
+ hres = MK_S_ASYNCHRONOUS;
}
IBinding_Release(BINDING(binding));
- return *ppv ? S_OK : MK_S_ASYNCHRONOUS;
+ return hres;
}
HRESULT bind_to_object(IMoniker *mon, LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv)
diff --git a/dll/win32/urlmon/file.c b/dll/win32/urlmon/file.c
index ed4802b8a3b..a517d949222 100644
--- a/dll/win32/urlmon/file.c
+++ b/dll/win32/urlmon/file.c
@@ -141,7 +141,10 @@ static HRESULT WINAPI FileProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_SENDINGREQUEST, &null_char);
file_name = url+sizeof(wszFile)/sizeof(WCHAR);
- if(file_name[0] == '/' && file_name[1] == '/')
+
+ /* Strip both forward and back slashes */
+ if( (file_name[0] == '/' && file_name[1] == '/') ||
+ (file_name[0] == '\\' && file_name[1] == '\\'))
file_name += 2;
if(*file_name == '/')
file_name++;
diff --git a/dll/win32/urlmon/umon.c b/dll/win32/urlmon/umon.c
index 5e6a8f6c21f..7ce22cc6de8 100644
--- a/dll/win32/urlmon/umon.c
+++ b/dll/win32/urlmon/umon.c
@@ -513,6 +513,12 @@ HRESULT WINAPI CreateURLMonikerEx(IMoniker *pmkContext, LPCWSTR szURL, IMoniker
TRACE("(%p, %s, %p, %08x)\n", pmkContext, debugstr_w(szURL), ppmk, dwFlags);
+ if (ppmk)
+ *ppmk = NULL;
+
+ if (!szURL || !ppmk)
+ return E_INVALIDARG;
+
if (dwFlags & URL_MK_UNIFORM) FIXME("ignoring flag URL_MK_UNIFORM\n");
if(!(obj = alloc_moniker()))
@@ -619,6 +625,9 @@ HRESULT WINAPI MkParseDisplayNameEx(IBindCtx *pbc, LPCWSTR szDisplayName, ULONG
{
TRACE("(%p %s %p %p)\n", pbc, debugstr_w(szDisplayName), pchEaten, ppmk);
+ if (!pbc || !szDisplayName || !*szDisplayName || !pchEaten || !ppmk)
+ return E_INVALIDARG;
+
if(is_registered_protocol(szDisplayName)) {
HRESULT hres;
diff --git a/dll/win32/urlmon/uri.c b/dll/win32/urlmon/uri.c
index 668aa9b7109..27b0863c2cb 100644
--- a/dll/win32/urlmon/uri.c
+++ b/dll/win32/urlmon/uri.c
@@ -1,5 +1,6 @@
/*
* Copyright 2010 Jacek Caban for CodeWeavers
+ * Copyright 2010 Thomas Mullaly
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -97,6 +98,20 @@ static HRESULT WINAPI Uri_GetPropertyDWORD(IUri *iface, Uri_PROPERTY uriProp, DW
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%d %p %x)\n", This, uriProp, pcchProperty, dwFlags);
+
+ if(!pcchProperty)
+ return E_INVALIDARG;
+
+ /* Microsoft's implementation for the ZONE property of a URI seems to be lacking...
+ * From what I can tell, instead of checking which URLZONE the URI belongs to it
+ * simply assigns URLZONE_INVALID and returns E_NOTIMPL. This also applies to the GetZone
+ * function.
+ */
+ if(uriProp == Uri_PROPERTY_ZONE) {
+ *pcchProperty = URLZONE_INVALID;
+ return E_NOTIMPL;
+ }
+
return E_NOTIMPL;
}
@@ -111,6 +126,10 @@ static HRESULT WINAPI Uri_GetAbsoluteUri(IUri *iface, BSTR *pstrAbsoluteUri)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrAbsoluteUri);
+
+ if(!pstrAbsoluteUri)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -118,6 +137,10 @@ static HRESULT WINAPI Uri_GetAuthority(IUri *iface, BSTR *pstrAuthority)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrAuthority);
+
+ if(!pstrAuthority)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -125,6 +148,10 @@ static HRESULT WINAPI Uri_GetDisplayUri(IUri *iface, BSTR *pstrDisplayUri)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrDisplayUri);
+
+ if(!pstrDisplayUri)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -132,6 +159,10 @@ static HRESULT WINAPI Uri_GetDomain(IUri *iface, BSTR *pstrDomain)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrDomain);
+
+ if(!pstrDomain)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -139,6 +170,10 @@ static HRESULT WINAPI Uri_GetExtension(IUri *iface, BSTR *pstrExtension)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrExtension);
+
+ if(!pstrExtension)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -146,6 +181,10 @@ static HRESULT WINAPI Uri_GetFragment(IUri *iface, BSTR *pstrFragment)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrFragment);
+
+ if(!pstrFragment)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -160,6 +199,10 @@ static HRESULT WINAPI Uri_GetPassword(IUri *iface, BSTR *pstrPassword)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrPassword);
+
+ if(!pstrPassword)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -167,6 +210,10 @@ static HRESULT WINAPI Uri_GetPath(IUri *iface, BSTR *pstrPath)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrPath);
+
+ if(!pstrPath)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -174,6 +221,10 @@ static HRESULT WINAPI Uri_GetPathAndQuery(IUri *iface, BSTR *pstrPathAndQuery)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrPathAndQuery);
+
+ if(!pstrPathAndQuery)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -181,6 +232,10 @@ static HRESULT WINAPI Uri_GetQuery(IUri *iface, BSTR *pstrQuery)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrQuery);
+
+ if(!pstrQuery)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -188,6 +243,10 @@ static HRESULT WINAPI Uri_GetRawUri(IUri *iface, BSTR *pstrRawUri)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrRawUri);
+
+ if(!pstrRawUri)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -195,6 +254,10 @@ static HRESULT WINAPI Uri_GetSchemeName(IUri *iface, BSTR *pstrSchemeName)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrSchemeName);
+
+ if(!pstrSchemeName)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -202,6 +265,10 @@ static HRESULT WINAPI Uri_GetUserInfo(IUri *iface, BSTR *pstrUserInfo)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrUserInfo);
+
+ if(!pstrUserInfo)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -209,6 +276,10 @@ static HRESULT WINAPI Uri_GetUserName(IUri *iface, BSTR *pstrUserName)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrUserName);
+
+ if(!pstrUserName)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -216,6 +287,10 @@ static HRESULT WINAPI Uri_GetHostType(IUri *iface, DWORD *pdwHostType)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pdwHostType);
+
+ if(!pdwHostType)
+ return E_INVALIDARG;
+
return E_NOTIMPL;
}
@@ -223,6 +298,10 @@ static HRESULT WINAPI Uri_GetPort(IUri *iface, DWORD *pdwPort)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pdwPort);
+
+ if(!pdwPort)
+ return E_INVALIDARG;
+
return E_NOTIMPL;
}
@@ -230,6 +309,10 @@ static HRESULT WINAPI Uri_GetScheme(IUri *iface, DWORD *pdwScheme)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pdwScheme);
+
+ if(!pdwScheme)
+ return E_INVALIDARG;
+
return E_NOTIMPL;
}
@@ -237,6 +320,14 @@ static HRESULT WINAPI Uri_GetZone(IUri *iface, DWORD *pdwZone)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pdwZone);
+
+ if(!pdwZone)
+ return E_INVALIDARG;
+
+ /* Microsoft doesn't seem to have this implemented yet... See
+ * the comment in Uri_GetPropertyDWORD for more about this.
+ */
+ *pdwZone = URLZONE_INVALID;
return E_NOTIMPL;
}
@@ -296,6 +387,14 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU
TRACE("(%s %x %x %p)\n", debugstr_w(pwzURI), dwFlags, (DWORD)dwReserved, ppURI);
+ if(!ppURI)
+ return E_INVALIDARG;
+
+ if(!pwzURI) {
+ *ppURI = NULL;
+ return E_INVALIDARG;
+ }
+
ret = heap_alloc(sizeof(Uri));
if(!ret)
return E_OUTOFMEMORY;
diff --git a/dll/win32/user32/include/user32p.h b/dll/win32/user32/include/user32p.h
index 31f38a1a7db..1ab637eeea0 100644
--- a/dll/win32/user32/include/user32p.h
+++ b/dll/win32/user32/include/user32p.h
@@ -33,9 +33,6 @@
#define NtUserMsqClearWakeMask() \
NtUserCallNoParam(NOPARAM_ROUTINE_MSQCLEARWAKEMASK)
-#define NtUserAnyPopup() \
- (BOOL)NtUserCallNoParam(NOPARAM_ROUTINE_ANYPOPUP)
-
#define NtUserValidateRgn(hWnd, hRgn) \
(BOOL)NtUserCallTwoParam((DWORD_PTR)hWnd, (DWORD_PTR)hRgn, TWOPARAM_ROUTINE_VALIDATERGN)
diff --git a/dll/win32/user32/misc/misc.c b/dll/win32/user32/misc/misc.c
index 4d786c51e52..32438366a5e 100644
--- a/dll/win32/user32/misc/misc.c
+++ b/dll/win32/user32/misc/misc.c
@@ -45,13 +45,6 @@ PrivateCsrssManualGuiCheck(LONG Check)
NtUserCallOneParam(Check, ONEPARAM_ROUTINE_CSRSS_GUICHECK);
}
-VOID
-WINAPI
-PrivateCsrssInitialized(VOID)
-{
- NtUserCallNoParam(NOPARAM_ROUTINE_CSRSS_INITIALIZED);
-}
-
/*
* @implemented
diff --git a/dll/win32/user32/user32.pspec b/dll/win32/user32/user32.pspec
index 45eb26b2b64..d58fb951d1b 100644
--- a/dll/win32/user32/user32.pspec
+++ b/dll/win32/user32/user32.pspec
@@ -750,7 +750,6 @@
; ROS specific exports
@ stdcall PrivateCsrssManualGuiCheck(long)
-@ stdcall PrivateCsrssInitialized()
; Functions exported by Win Vista
@ stdcall SetProcessDPIAware()
diff --git a/dll/win32/user32/windows/class.c b/dll/win32/user32/windows/class.c
index f546aa45952..1c66fd7606f 100644
--- a/dll/win32/user32/windows/class.c
+++ b/dll/win32/user32/windows/class.c
@@ -423,22 +423,15 @@ GetClassLongA(HWND hWnd, int nIndex)
}
else
{
- /* This is a race condition! Call win32k to make sure we're getting
- the correct result */
- Wnd = NULL; /* Make sure we call NtUserGetClassLong */
-
WARN("Invalid class for hwnd 0x%p!\n", hWnd);
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- Wnd = NULL; /* Make sure we call NtUserGetClassLong */
+ Ret = 0;
}
_SEH2_END;
- if (Wnd == NULL)
- Ret = NtUserGetClassLong(hWnd, nIndex, TRUE);
-
return Ret;
}
@@ -534,22 +527,14 @@ GetClassLongW ( HWND hWnd, int nIndex )
}
else
{
- /* This is a race condition! Call win32k to make sure we're getting
- the correct result */
- Wnd = NULL; /* Make sure we call NtUserGetClassLong */
-
WARN("Invalid class for hwnd 0x%p!\n", hWnd);
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- Wnd = NULL; /* Make sure we call NtUserGetClassLong */
}
_SEH2_END;
- if (Wnd == NULL)
- Ret = NtUserGetClassLong(hWnd, nIndex, FALSE);
-
return Ret;
}
@@ -617,18 +602,28 @@ GetClassNameW(
WORD
WINAPI
GetClassWord(
- HWND hWnd,
- int nIndex)
-/*
- * NOTE: Obsoleted in 32-bit windows
- */
+ HWND hwnd,
+ int offset)
{
- TRACE("%p %x\n", hWnd, nIndex);
+ PWND Wnd;
+ PCLS class;
+ WORD retvalue = 0;
- if ((nIndex < 0) && (nIndex != GCW_ATOM))
+ if (offset < 0) return GetClassLongA( hwnd, offset );
+
+ Wnd = ValidateHwnd(hwnd);
+ if (!Wnd)
return 0;
- return (WORD) NtUserGetClassLong ( hWnd, nIndex, TRUE );
+ class = DesktopPtrToUser(Wnd->pcls);
+ if (class == NULL) return 0;
+
+ if (offset <= class->cbclsExtra - sizeof(WORD))
+ memcpy( &retvalue, (char *)(class + 1) + offset, sizeof(retvalue) );
+ else
+ SetLastError( ERROR_INVALID_INDEX );
+
+ return retvalue;
}
diff --git a/dll/win32/user32/windows/menu.c b/dll/win32/user32/windows/menu.c
index d5723bb3271..eed233f4947 100644
--- a/dll/win32/user32/windows/menu.c
+++ b/dll/win32/user32/windows/menu.c
@@ -1605,25 +1605,25 @@ static BOOL FASTCALL MenuShowPopup(HWND hwndOwner, HMENU hmenu, UINT id, UINT fl
if( flags & TPM_BOTTOMALIGN ) y -= height;
if( flags & TPM_VCENTERALIGN ) y -= height / 2;
- if( x + width > info.rcWork.right)
+ if( x + width > info.rcMonitor.right)
{
if( xanchor && x >= width - xanchor )
x -= width - xanchor;
- if( x + width > info.rcWork.right)
- x = info.rcWork.right - width;
+ if( x + width > info.rcMonitor.right)
+ x = info.rcMonitor.right - width;
}
- if( x < info.rcWork.left ) x = info.rcWork.left;
+ if( x < info.rcMonitor.left ) x = info.rcMonitor.left;
- if( y + height > info.rcWork.bottom)
+ if( y + height > info.rcMonitor.bottom)
{
if( yanchor && y >= height + yanchor )
y -= height + yanchor;
- if( y + height > info.rcWork.bottom)
- y = info.rcWork.bottom - height;
+ if( y + height > info.rcMonitor.bottom)
+ y = info.rcMonitor.bottom - height;
}
- if( y < info.rcWork.top ) y = info.rcWork.top;
+ if( y < info.rcMonitor.top ) y = info.rcMonitor.top;
/* NOTE: In Windows, top menu popup is not owned. */
MenuInfo.Wnd = CreateWindowExW( 0, POPUPMENU_CLASS_ATOMW, NULL,
diff --git a/dll/win32/user32/windows/message.c b/dll/win32/user32/windows/message.c
index 5631469c03c..6c849042b7a 100644
--- a/dll/win32/user32/windows/message.c
+++ b/dll/win32/user32/windows/message.c
@@ -60,6 +60,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(user32);
* content). When a ACK message is generated, the list of pair is searched for a
* matching pair, so that the client memory handle can be returned.
*/
+
typedef struct tagDDEPAIR
{
HGLOBAL ClientMem;
@@ -2214,11 +2215,16 @@ SendMessageCallbackA(
SENDASYNCPROC lpCallBack,
ULONG_PTR dwData)
{
+ CALL_BACK_INFO CallBackInfo;
+
+ CallBackInfo.CallBack = lpCallBack;
+ CallBackInfo.Context = dwData;
+
return NtUserMessageCall(hWnd,
Msg,
wParam,
lParam,
- (ULONG_PTR)&lpCallBack,
+ (ULONG_PTR)&CallBackInfo,
FNID_SENDMESSAGECALLBACK,
TRUE);
}
@@ -2236,11 +2242,17 @@ SendMessageCallbackW(
SENDASYNCPROC lpCallBack,
ULONG_PTR dwData)
{
+
+ CALL_BACK_INFO CallBackInfo;
+
+ CallBackInfo.CallBack = lpCallBack;
+ CallBackInfo.Context = dwData;
+
return NtUserMessageCall(hWnd,
Msg,
wParam,
lParam,
- (ULONG_PTR)&lpCallBack,
+ (ULONG_PTR)&CallBackInfo,
FNID_SENDMESSAGECALLBACK,
FALSE);
}
diff --git a/dll/win32/user32/windows/window.c b/dll/win32/user32/windows/window.c
index 2427cd76ee0..04533ff0aa1 100644
--- a/dll/win32/user32/windows/window.c
+++ b/dll/win32/user32/windows/window.c
@@ -29,9 +29,10 @@ User32CallSendAsyncProcForKernel(PVOID Arguments, ULONG ArgumentLength)
PSENDASYNCPROC_CALLBACK_ARGUMENTS CallbackArgs;
TRACE("User32CallSendAsyncProcKernel()\n");
+
CallbackArgs = (PSENDASYNCPROC_CALLBACK_ARGUMENTS)Arguments;
- if (ArgumentLength != sizeof(WINDOWPROC_CALLBACK_ARGUMENTS))
+ if (ArgumentLength != sizeof(SENDASYNCPROC_CALLBACK_ARGUMENTS))
{
return(STATUS_INFO_LENGTH_MISMATCH);
}
@@ -1029,16 +1030,16 @@ GetParent(HWND hWnd)
_SEH2_TRY
{
WndParent = NULL;
- if (Wnd->style & WS_CHILD)
- {
- if (Wnd->spwndParent != NULL)
- WndParent = DesktopPtrToUser(Wnd->spwndParent);
- }
- else if (Wnd->style & WS_POPUP)
+ if (Wnd->style & WS_POPUP)
{
if (Wnd->spwndOwner != NULL)
WndParent = DesktopPtrToUser(Wnd->spwndOwner);
}
+ else if (Wnd->style & WS_CHILD)
+ {
+ if (Wnd->spwndParent != NULL)
+ WndParent = DesktopPtrToUser(Wnd->spwndParent);
+ }
if (WndParent != NULL)
Ret = UserHMGetHandle(WndParent);
@@ -1463,7 +1464,7 @@ BOOL WINAPI
IsChild(HWND hWndParent,
HWND hWnd)
{
- PWND WndParent, Wnd;
+ PWND WndParent, DesktopWnd, Wnd;
BOOL Ret = FALSE;
WndParent = ValidateHwnd(hWndParent);
@@ -1473,6 +1474,10 @@ IsChild(HWND hWndParent,
if (!Wnd)
return FALSE;
+ DesktopWnd = GetThreadDesktopWnd();
+ if (!DesktopWnd)
+ return FALSE;
+
_SEH2_TRY
{
while (Wnd != NULL)
@@ -1480,6 +1485,10 @@ IsChild(HWND hWndParent,
if (Wnd->spwndParent != NULL)
{
Wnd = DesktopPtrToUser(Wnd->spwndParent);
+
+ if(Wnd == DesktopWnd)
+ Wnd = NULL;
+
if (Wnd == WndParent)
{
Ret = TRUE;
@@ -2061,7 +2070,18 @@ ScrollWindowEx(HWND hWnd,
BOOL WINAPI
AnyPopup(VOID)
{
- return NtUserAnyPopup();
+ int i;
+ BOOL retvalue;
+ HWND *list = WIN_ListChildren( GetDesktopWindow() );
+
+ if (!list) return FALSE;
+ for (i = 0; list[i]; i++)
+ {
+ if (IsWindowVisible( list[i] ) && GetWindow( list[i], GW_OWNER )) break;
+ }
+ retvalue = (list[i] != 0);
+ HeapFree( GetProcessHeap(), 0, list );
+ return retvalue;
}
/*
diff --git a/dll/win32/userenv/lang/es-ES.rc b/dll/win32/userenv/lang/es-ES.rc
index dcfd07f92d8..8d87d2859ad 100644
--- a/dll/win32/userenv/lang/es-ES.rc
+++ b/dll/win32/userenv/lang/es-ES.rc
@@ -27,7 +27,7 @@ LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
STRINGTABLE
BEGIN
IDS_PROFILEPATH "%SystemDrive%\\Documents and Settings"
- IDS_APPDATA "Application Data"
+ IDS_APPDATA "Datos de programa"
IDS_DESKTOP "Escritorio"
IDS_FAVORITES "Favoritos"
IDS_STARTMENU "Menu de Inicio"
@@ -39,8 +39,8 @@ BEGIN
IDS_MYMUSIC "Mis Documentos\\Mi música"
IDS_MYVIDEOS "Mis Documentos\\Mis videos"
IDS_TEMPLATES "Plantillas"
- IDS_RECENT "Documentos recientes"
- IDS_SENDTO "Enviar a"
+ IDS_RECENT "Reciente"
+ IDS_SENDTO "SendTo"
IDS_PRINTHOOD "Impresoras"
IDS_NETHOOD "Entorno de red"
IDS_LOCALSETTINGS "Configuración local"
diff --git a/dll/win32/userenv/lang/it-IT.rc b/dll/win32/userenv/lang/it-IT.rc
index fa6106f922e..dbbbcfa17f9 100644
--- a/dll/win32/userenv/lang/it-IT.rc
+++ b/dll/win32/userenv/lang/it-IT.rc
@@ -27,8 +27,8 @@ BEGIN
IDS_MYMUSIC "Documenti\\Musica"
IDS_MYVIDEOS "Documenti\\Video"
IDS_TEMPLATES "Modelli"
- IDS_RECENT "Dati recenti"
- IDS_SENDTO "Invia a"
+ IDS_RECENT "Recent"
+ IDS_SENDTO "SendTo"
IDS_PRINTHOOD "Stampanti"
IDS_NETHOOD "Risorse di rete"
IDS_LOCALSETTINGS "Impostazioni locali"
diff --git a/dll/win32/winemp3.acm/winemp3.acm.rbuild b/dll/win32/winemp3.acm/winemp3.acm.rbuild
index fec518725e0..be4a53bc8eb 100644
--- a/dll/win32/winemp3.acm/winemp3.acm.rbuild
+++ b/dll/win32/winemp3.acm/winemp3.acm.rbuild
@@ -1,4 +1,4 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/wininet/ftp.c b/dll/win32/wininet/ftp.c
index 1f031996811..80cc6f0e60a 100644
--- a/dll/win32/wininet/ftp.c
+++ b/dll/win32/wininet/ftp.c
@@ -1176,7 +1176,7 @@ static DWORD FTPFILE_QueryOption(object_header_t *hdr, DWORD option, void *buffe
}
}
}
- return INET_QueryOption(option, buffer, size, unicode);
+ return INET_QueryOption(hdr, option, buffer, size, unicode);
}
static DWORD FTPFILE_ReadFile(object_header_t *hdr, void *buffer, DWORD size, DWORD *read)
@@ -2395,7 +2395,7 @@ static DWORD FTPSESSION_QueryOption(object_header_t *hdr, DWORD option, void *bu
return ERROR_SUCCESS;
}
- return INET_QueryOption(option, buffer, size, unicode);
+ return INET_QueryOption(hdr, option, buffer, size, unicode);
}
static const object_vtbl_t FTPSESSIONVtbl = {
@@ -3476,7 +3476,7 @@ static DWORD FTPFINDNEXT_QueryOption(object_header_t *hdr, DWORD option, void *b
return ERROR_SUCCESS;
}
- return INET_QueryOption(option, buffer, size, unicode);
+ return INET_QueryOption(hdr, option, buffer, size, unicode);
}
static DWORD FTPFINDNEXT_FindNextFileW(object_header_t *hdr, void *data)
diff --git a/dll/win32/wininet/http.c b/dll/win32/wininet/http.c
index 57b73729a10..d14a52281e7 100644
--- a/dll/win32/wininet/http.c
+++ b/dll/win32/wininet/http.c
@@ -1756,7 +1756,7 @@ static DWORD HTTPREQ_QueryOption(object_header_t *hdr, DWORD option, void *buffe
}
}
- return INET_QueryOption(option, buffer, size, unicode);
+ return INET_QueryOption(hdr, option, buffer, size, unicode);
}
static DWORD HTTPREQ_SetOption(object_header_t *hdr, DWORD option, void *buffer, DWORD size)
@@ -3464,6 +3464,10 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *lpwhr, LPCWSTR lpszHeaders,
* for all the data */
HTTP_DrainContent(lpwhr);
lpwhr->dwContentRead = 0;
+ if(redirected) {
+ lpwhr->dwContentLength = ~0u;
+ lpwhr->dwBytesToWrite = 0;
+ }
if (TRACE_ON(wininet))
{
@@ -3670,7 +3674,7 @@ lend:
HTTP_ReceiveRequestData(lpwhr, TRUE);
else
{
- iar.dwResult = (DWORD_PTR)lpwhr->hdr.hInternet;
+ iar.dwResult = 0;
iar.dwError = res;
INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
@@ -4164,7 +4168,7 @@ static DWORD HTTPSESSION_QueryOption(object_header_t *hdr, DWORD option, void *b
return ERROR_SUCCESS;
}
- return INET_QueryOption(option, buffer, size, unicode);
+ return INET_QueryOption(hdr, option, buffer, size, unicode);
}
static DWORD HTTPSESSION_SetOption(object_header_t *hdr, DWORD option, void *buffer, DWORD size)
@@ -4261,11 +4265,8 @@ DWORD HTTP_Connect(appinfo_t *hIC, LPCWSTR lpszServerName,
if(hIC->lpszProxyBypass)
FIXME("Proxy bypass is ignored.\n");
}
- if (lpszServerName && lpszServerName[0])
- {
- lpwhs->lpszServerName = heap_strdupW(lpszServerName);
- lpwhs->lpszHostName = heap_strdupW(lpszServerName);
- }
+ lpwhs->lpszServerName = heap_strdupW(lpszServerName);
+ lpwhs->lpszHostName = heap_strdupW(lpszServerName);
if (lpszUserName && lpszUserName[0])
lpwhs->lpszUserName = heap_strdupW(lpszUserName);
if (lpszPassword && lpszPassword[0])
@@ -4362,6 +4363,10 @@ static DWORD HTTP_OpenConnection(http_request_t *lpwhr)
if(res != ERROR_SUCCESS)
goto lend;
+ INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
+ INTERNET_STATUS_CONNECTED_TO_SERVER,
+ szaddr, strlen(szaddr)+1);
+
if (lpwhr->hdr.dwFlags & INTERNET_FLAG_SECURE)
{
/* Note: we differ from Microsoft's WinINet here. they seem to have
@@ -4370,20 +4375,31 @@ static DWORD HTTP_OpenConnection(http_request_t *lpwhr)
* behaviour to be more correct and to not cause any incompatibilities
* because using a secure connection through a proxy server is a rare
* case that would be hard for anyone to depend on */
- if (hIC->lpszProxy && (res = HTTP_SecureProxyConnect(lpwhr)) != ERROR_SUCCESS)
+ if (hIC->lpszProxy && (res = HTTP_SecureProxyConnect(lpwhr)) != ERROR_SUCCESS) {
+ HTTPREQ_CloseConnection(&lpwhr->hdr);
goto lend;
+ }
res = NETCON_secure_connect(&lpwhr->netConnection, lpwhs->lpszHostName);
if(res != ERROR_SUCCESS)
{
WARN("Couldn't connect securely to host\n");
+
+ if((lpwhr->hdr.ErrorMask&INTERNET_ERROR_MASK_COMBINED_SEC_CERT) && (
+ res == ERROR_INTERNET_SEC_CERT_DATE_INVALID
+ || res == ERROR_INTERNET_INVALID_CA
+ || res == ERROR_INTERNET_SEC_CERT_NO_REV
+ || res == ERROR_INTERNET_SEC_CERT_REV_FAILED
+ || res == ERROR_INTERNET_SEC_CERT_REVOKED
+ || res == ERROR_INTERNET_SEC_INVALID_CERT
+ || res == ERROR_INTERNET_SEC_CERT_CN_INVALID))
+ res = ERROR_INTERNET_SEC_CERT_ERRORS;
+
+ HTTPREQ_CloseConnection(&lpwhr->hdr);
goto lend;
}
}
- INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
- INTERNET_STATUS_CONNECTED_TO_SERVER,
- szaddr, strlen(szaddr)+1);
lend:
lpwhr->read_pos = lpwhr->read_size = 0;
diff --git a/dll/win32/wininet/internet.c b/dll/win32/wininet/internet.c
index 6fc8a212c89..001736001a4 100644
--- a/dll/win32/wininet/internet.c
+++ b/dll/win32/wininet/internet.c
@@ -812,7 +812,7 @@ static DWORD APPINFO_QueryOption(object_header_t *hdr, DWORD option, void *buffe
}
}
- return INET_QueryOption(option, buffer, size, unicode);
+ return INET_QueryOption(hdr, option, buffer, size, unicode);
}
static const object_vtbl_t APPINFOVtbl = {
@@ -1447,7 +1447,7 @@ BOOL WINAPI InternetCrackUrlA(LPCSTR lpszUrl, DWORD dwUrlLength, DWORD dwFlags,
lpUrlComponents->nScheme = UCW.nScheme;
lpUrlComponents->nPort = UCW.nPort;
- TRACE("%s: scheme(%s) host(%s) path(%s) extra(%s)\n", lpszUrl,
+ TRACE("%s: scheme(%s) host(%s) path(%s) extra(%s)\n", debugstr_a(lpszUrl),
debugstr_an(lpUrlComponents->lpszScheme, lpUrlComponents->dwSchemeLength),
debugstr_an(lpUrlComponents->lpszHostName, lpUrlComponents->dwHostNameLength),
debugstr_an(lpUrlComponents->lpszUrlPath, lpUrlComponents->dwUrlPathLength),
@@ -1860,7 +1860,7 @@ BOOL WINAPI InternetCanonicalizeUrlA(LPCSTR lpszUrl, LPSTR lpszBuffer,
DWORD dwURLFlags = URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE;
TRACE("(%s, %p, %p, 0x%08x) bufferlength: %d\n", debugstr_a(lpszUrl), lpszBuffer,
- lpdwBufferLength, lpdwBufferLength ? *lpdwBufferLength : -1, dwFlags);
+ lpdwBufferLength, dwFlags, lpdwBufferLength ? *lpdwBufferLength : -1);
if(dwFlags & ICU_DECODE)
{
@@ -2194,7 +2194,7 @@ BOOL WINAPI InternetReadFileExW(HINTERNET hFile, LPINTERNET_BUFFERSW lpBuffer,
return res == ERROR_SUCCESS;
}
-DWORD INET_QueryOption(DWORD option, void *buffer, DWORD *size, BOOL unicode)
+DWORD INET_QueryOption(object_header_t *hdr, DWORD option, void *buffer, DWORD *size, BOOL unicode)
{
static BOOL warn = TRUE;
@@ -2357,6 +2357,25 @@ DWORD INET_QueryOption(DWORD option, void *buffer, DWORD *size, BOOL unicode)
return ERROR_INTERNET_INCORRECT_HANDLE_TYPE;
case INTERNET_OPTION_POLICY:
return ERROR_INVALID_PARAMETER;
+ case INTERNET_OPTION_CONTEXT_VALUE:
+ {
+ if (!hdr)
+ return ERROR_INTERNET_INCORRECT_HANDLE_TYPE;
+ if (!size)
+ return ERROR_INVALID_PARAMETER;
+
+ if (*size < sizeof(DWORD_PTR))
+ {
+ *size = sizeof(DWORD_PTR);
+ return ERROR_INSUFFICIENT_BUFFER;
+ }
+ if (!buffer)
+ return ERROR_INVALID_PARAMETER;
+
+ *(DWORD_PTR *)buffer = hdr->dwContext;
+ *size = sizeof(DWORD_PTR);
+ return ERROR_SUCCESS;
+ }
}
FIXME("Stub for %d\n", option);
@@ -2388,7 +2407,7 @@ BOOL WINAPI InternetQueryOptionW(HINTERNET hInternet, DWORD dwOption,
WININET_Release(hdr);
}
}else {
- res = INET_QueryOption(dwOption, lpBuffer, lpdwBufferLength, TRUE);
+ res = INET_QueryOption(NULL, dwOption, lpBuffer, lpdwBufferLength, TRUE);
}
if(res != ERROR_SUCCESS)
@@ -2421,7 +2440,7 @@ BOOL WINAPI InternetQueryOptionA(HINTERNET hInternet, DWORD dwOption,
WININET_Release(hdr);
}
}else {
- res = INET_QueryOption(dwOption, lpBuffer, lpdwBufferLength, FALSE);
+ res = INET_QueryOption(NULL, dwOption, lpBuffer, lpdwBufferLength, FALSE);
}
if(res != ERROR_SUCCESS)
@@ -2484,8 +2503,19 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption,
break;
case INTERNET_OPTION_ERROR_MASK:
{
- ULONG flags = *(ULONG *)lpBuffer;
- FIXME("Option INTERNET_OPTION_ERROR_MASK(%d): STUB\n", flags);
+ if(!lpwhh) {
+ SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
+ return FALSE;
+ } else if(*(ULONG*)lpBuffer & (~(INTERNET_ERROR_MASK_INSERT_CDROM|
+ INTERNET_ERROR_MASK_COMBINED_SEC_CERT|
+ INTERNET_ERROR_MASK_LOGIN_FAILURE_DISPLAY_ENTITY_BODY))) {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ ret = FALSE;
+ } else if(dwBufferLength != sizeof(ULONG)) {
+ SetLastError(ERROR_INTERNET_BAD_OPTION_LENGTH);
+ ret = FALSE;
+ } else
+ lpwhh->ErrorMask = *(ULONG*)lpBuffer;
}
break;
case INTERNET_OPTION_CODEPAGE:
@@ -2550,8 +2580,21 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption,
break;
}
case INTERNET_OPTION_CONTEXT_VALUE:
- FIXME("Option INTERNET_OPTION_CONTEXT_VALUE; STUB\n");
- break;
+ {
+ if (!lpwhh)
+ {
+ SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
+ return FALSE;
+ }
+ if (!lpBuffer || dwBufferLength != sizeof(DWORD_PTR))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ ret = FALSE;
+ }
+ else
+ lpwhh->dwContext = *(DWORD_PTR *)lpBuffer;
+ break;
+ }
case INTERNET_OPTION_SECURITY_FLAGS:
FIXME("Option INTERNET_OPTION_SECURITY_FLAGS; STUB\n");
break;
diff --git a/dll/win32/wininet/internet.h b/dll/win32/wininet/internet.h
index 8fcc0cf3565..a531ccd752f 100644
--- a/dll/win32/wininet/internet.h
+++ b/dll/win32/wininet/internet.h
@@ -160,6 +160,7 @@ struct _object_header_t
DWORD dwFlags;
DWORD_PTR dwContext;
DWORD dwError;
+ ULONG ErrorMask;
DWORD dwInternalFlags;
LONG refs;
INTERNET_STATUS_CALLBACK lpfnStatusCB;
@@ -392,7 +393,7 @@ object_header_t *WININET_AddRef( object_header_t *info );
BOOL WININET_Release( object_header_t *info );
BOOL WININET_FreeHandle( HINTERNET hinternet );
-DWORD INET_QueryOption(DWORD,void*,DWORD*,BOOL);
+DWORD INET_QueryOption( object_header_t *, DWORD, void *, DWORD *, BOOL );
time_t ConvertTimeString(LPCWSTR asctime);
diff --git a/dll/win32/wininet/netconnection.c b/dll/win32/wininet/netconnection.c
index c2560b5da37..5aa647a7a49 100644
--- a/dll/win32/wininet/netconnection.c
+++ b/dll/win32/wininet/netconnection.c
@@ -134,6 +134,7 @@ MAKE_FUNCPTR(SSL_shutdown);
MAKE_FUNCPTR(SSL_write);
MAKE_FUNCPTR(SSL_read);
MAKE_FUNCPTR(SSL_pending);
+MAKE_FUNCPTR(SSL_get_error);
MAKE_FUNCPTR(SSL_get_ex_new_index);
MAKE_FUNCPTR(SSL_get_ex_data);
MAKE_FUNCPTR(SSL_set_ex_data);
@@ -330,7 +331,9 @@ static int netconn_secure_verify(int preverify_ok, X509_STORE_CTX *ctx)
CertFreeCertificateContext(endCert);
CertCloseStore(store, 0);
}
- }
+ } else
+ pSSL_set_ex_data(ssl, error_idx, (void *)ERROR_INTERNET_SEC_CERT_ERRORS);
+
return ret;
}
@@ -392,6 +395,7 @@ DWORD NETCON_init(WININET_NETCONNECTION *connection, BOOL useSSL)
DYNSSL(SSL_write);
DYNSSL(SSL_read);
DYNSSL(SSL_pending);
+ DYNSSL(SSL_get_error);
DYNSSL(SSL_get_ex_new_index);
DYNSSL(SSL_get_ex_data);
DYNSSL(SSL_set_ex_data);
@@ -772,6 +776,12 @@ DWORD NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int
{
#ifdef SONAME_LIBSSL
*recvd = pSSL_read(connection->ssl_s, buf, len);
+
+ /* Check if EOF was received */
+ if(!*recvd && (pSSL_get_error(connection->ssl_s, *recvd)==SSL_ERROR_ZERO_RETURN
+ || pSSL_get_error(connection->ssl_s, *recvd)==SSL_ERROR_SYSCALL))
+ return ERROR_SUCCESS;
+
return *recvd > 0 ? ERROR_SUCCESS : ERROR_INTERNET_CONNECTION_ABORTED;
#else
return ERROR_NOT_SUPPORTED;
diff --git a/dll/win32/wininet/urlcache.c b/dll/win32/wininet/urlcache.c
index 6a39c691475..c617a93299f 100644
--- a/dll/win32/wininet/urlcache.c
+++ b/dll/win32/wininet/urlcache.c
@@ -2435,7 +2435,6 @@ static BOOL CommitUrlCacheEntryInternal(
DWORD dwFileSizeLow = 0;
DWORD dwFileSizeHigh = 0;
BYTE cDirectory = 0;
- int len;
char achFile[MAX_PATH];
LPSTR lpszUrlNameA = NULL;
LPSTR lpszFileExtensionA = NULL;
@@ -2556,7 +2555,6 @@ static BOOL CommitUrlCacheEntryInternal(
dwBytesNeeded = DWORD_ALIGN(dwBytesNeeded + strlen(lpszUrlNameA) + 1);
if (lpszLocalFileName)
{
- len = WideCharToMultiByte(CP_ACP, 0, lpszUrlName, -1, NULL, 0, NULL, NULL);
dwOffsetLocalFileName = dwBytesNeeded;
dwBytesNeeded = DWORD_ALIGN(dwBytesNeeded + strlen(pchLocalFileName) + 1);
}
diff --git a/dll/win32/wininet/utility.c b/dll/win32/wininet/utility.c
index 66fbecdd653..0639f40385e 100644
--- a/dll/win32/wininet/utility.c
+++ b/dll/win32/wininet/utility.c
@@ -307,6 +307,7 @@ VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext,
case INTERNET_STATUS_CONNECTING_TO_SERVER:
case INTERNET_STATUS_CONNECTED_TO_SERVER:
lpvNewInfo = heap_strdupAtoW(lpvStatusInfo);
+ dwStatusInfoLength *= sizeof(WCHAR);
break;
case INTERNET_STATUS_RESOLVING_NAME:
case INTERNET_STATUS_REDIRECT:
@@ -325,6 +326,7 @@ VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext,
case INTERNET_STATUS_RESOLVING_NAME:
case INTERNET_STATUS_REDIRECT:
lpvNewInfo = heap_strdupWtoA(lpvStatusInfo);
+ dwStatusInfoLength /= sizeof(WCHAR);
break;
}
}
diff --git a/dll/win32/wininet/wininet.rbuild b/dll/win32/wininet/wininet.rbuild
index 45b87b18665..ac2c43f7945 100644
--- a/dll/win32/wininet/wininet.rbuild
+++ b/dll/win32/wininet/wininet.rbuild
@@ -6,6 +6,7 @@
.
include/reactos/wine
+ .
@@ -22,6 +23,7 @@
secur32
crypt32
ws2_32
+ zlib
pseh
cookie.c
dialogs.c
diff --git a/dll/win32/wininet/wininet_Si.rc b/dll/win32/wininet/wininet_Si.rc
index b5bf2914328..488104ec9dc 100644
--- a/dll/win32/wininet/wininet_Si.rc
+++ b/dll/win32/wininet/wininet_Si.rc
@@ -27,11 +27,11 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Vnos omreĹľnega gesla"
FONT 8, "MS Shell Dlg"
{
- LTEXT "Vnesite uporabniško ime in geslo:", -1, 40, 6, 150, 15
- LTEXT "Proksi", -1, 40, 26, 50, 10
- LTEXT "Kraljestvo", -1, 40, 46, 50, 10
- LTEXT "Uporabniško ime", -1, 40, 66, 50, 10
- LTEXT "Geslo", -1, 40, 86, 50, 10
+ LTEXT "Vnesite uporabniško ime in geslo:", -1, 20, 6, 150, 15
+ LTEXT "Proksi", -1, 20, 26, 50, 10
+ LTEXT "PodroÄŤje", -1, 20, 46, 50, 10
+ LTEXT "Uporabniško ime", -1, 20, 66, 55, 10
+ LTEXT "Geslo", -1, 20, 86, 50, 10
LTEXT "" IDC_PROXY, 80, 26, 150, 14, 0
LTEXT "" IDC_REALM, 80, 46, 150, 14, 0
EDITTEXT IDC_USERNAME, 80, 66, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP
@@ -42,6 +42,26 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "PrekliÄŤi", IDCANCEL, 158, 126, 56, 14, WS_GROUP | WS_TABSTOP
}
+IDD_AUTHDLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 250, 154
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Authentication Required"
+FONT 8, "MS Shell Dlg"
+{
+ LTEXT "Vnesite uporabniško ime in geslo:", -1, 20, 6, 150, 15
+ LTEXT "Server", -1, 20, 26, 50, 10
+ LTEXT "PodroÄŤje", -1, 20, 46, 50, 10
+ LTEXT "Uporabniško ime", -1, 20, 66, 55, 10
+ LTEXT "Geslo", -1, 20, 86, 50, 10
+ LTEXT "" IDC_SERVER, 80, 26, 150, 14, 0
+ LTEXT "" IDC_REALM, 80, 46, 150, 14, 0
+ EDITTEXT IDC_USERNAME, 80, 66, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP
+ EDITTEXT IDC_PASSWORD, 80, 86, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP | ES_PASSWORD
+ CHECKBOX "&Shrani geslo (nezaščiteno)", IDC_SAVEPASSWORD,
+ 80, 106, 150, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "V redu", IDOK, 98, 126, 56, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON
+ PUSHBUTTON "PrekliÄŤi", IDCANCEL, 158, 126, 56, 14, WS_GROUP | WS_TABSTOP
+}
+
STRINGTABLE DISCARDABLE
{
IDS_LANCONNECTION "LAN povezava"
diff --git a/dll/win32/wintrust/wintrust.rbuild b/dll/win32/wintrust/wintrust.rbuild
index 910d2278f8e..bcb1c2b8304 100644
--- a/dll/win32/wintrust/wintrust.rbuild
+++ b/dll/win32/wintrust/wintrust.rbuild
@@ -1,4 +1,4 @@
-
+
.
diff --git a/dll/win32/ws2_32/misc/ns.c b/dll/win32/ws2_32/misc/ns.c
index fee4f032868..04e5b4bc5e2 100644
--- a/dll/win32/ws2_32/misc/ns.c
+++ b/dll/win32/ws2_32/misc/ns.c
@@ -32,10 +32,44 @@ WSAAddressToStringA(IN LPSOCKADDR lpsaAddress,
OUT LPSTR lpszAddressString,
IN OUT LPDWORD lpdwAddressStringLength)
{
- UNIMPLEMENTED
+ DWORD size;
+ CHAR buffer[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
+ CHAR *p;
- WSASetLastError(WSASYSCALLFAILURE);
- return SOCKET_ERROR;
+ if (!lpsaAddress) return SOCKET_ERROR;
+ if (!lpszAddressString || !lpdwAddressStringLength) return SOCKET_ERROR;
+
+ switch(lpsaAddress->sa_family)
+ {
+ case AF_INET:
+ if (dwAddressLength < sizeof(SOCKADDR_IN)) return SOCKET_ERROR;
+ sprintf( buffer, "%u.%u.%u.%u:%u",
+ (unsigned int)(ntohl( ((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr ) >> 24 & 0xff),
+ (unsigned int)(ntohl( ((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr ) >> 16 & 0xff),
+ (unsigned int)(ntohl( ((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr ) >> 8 & 0xff),
+ (unsigned int)(ntohl( ((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr ) & 0xff),
+ ntohs( ((SOCKADDR_IN *)lpsaAddress)->sin_port ) );
+
+ p = strchr( buffer, ':' );
+ if (!((SOCKADDR_IN *)lpsaAddress)->sin_port) *p = 0;
+ break;
+ default:
+ WSASetLastError(WSAEINVAL);
+ return SOCKET_ERROR;
+ }
+
+ size = strlen( buffer ) + 1;
+
+ if (*lpdwAddressStringLength < size)
+ {
+ *lpdwAddressStringLength = size;
+ WSASetLastError(WSAEFAULT);
+ return SOCKET_ERROR;
+ }
+
+ *lpdwAddressStringLength = size;
+ strcpy( lpszAddressString, buffer );
+ return 0;
}
@@ -50,10 +84,28 @@ WSAAddressToStringW(IN LPSOCKADDR lpsaAddress,
OUT LPWSTR lpszAddressString,
IN OUT LPDWORD lpdwAddressStringLength)
{
- UNIMPLEMENTED
+ INT ret;
+ DWORD size;
+ WCHAR buffer[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
+ CHAR bufAddr[54];
- WSASetLastError(WSASYSCALLFAILURE);
- return SOCKET_ERROR;
+ size = *lpdwAddressStringLength;
+ ret = WSAAddressToStringA(lpsaAddress, dwAddressLength, NULL, bufAddr, &size);
+
+ if (ret) return ret;
+
+ MultiByteToWideChar( CP_ACP, 0, bufAddr, size, buffer, sizeof( buffer )/sizeof(WCHAR));
+
+ if (*lpdwAddressStringLength < size)
+ {
+ *lpdwAddressStringLength = size;
+ WSASetLastError(WSAEFAULT);
+ return SOCKET_ERROR;
+ }
+
+ *lpdwAddressStringLength = size;
+ lstrcpyW( lpszAddressString, buffer );
+ return 0;
}
diff --git a/dll/win32/ws2_32/misc/sndrcv.c b/dll/win32/ws2_32/misc/sndrcv.c
index f1b68feb158..8fb4186933e 100644
--- a/dll/win32/ws2_32/misc/sndrcv.c
+++ b/dll/win32/ws2_32/misc/sndrcv.c
@@ -410,6 +410,8 @@ WSASendTo(IN SOCKET s,
if (Code == SOCKET_ERROR)
WSASetLastError(Errno);
+ else
+ WSASetLastError(0);
return Code;
}
diff --git a/drivers/base/bootvid/i386/bootvid.c b/drivers/base/bootvid/i386/bootvid.c
index 3d0ae503167..08d0dc10b8e 100644
--- a/drivers/base/bootvid/i386/bootvid.c
+++ b/drivers/base/bootvid/i386/bootvid.c
@@ -155,7 +155,7 @@ VgaInterpretCmdStream(IN PUSHORT CmdStream)
if (!ShortValue) continue;
/* Loop the cmd array */
- for (; Count; Count--, CmdStream++, Value++)
+ for (; Count; Count--, CmdStream++)
{
/* Get the byte we're writing */
ShortValue += (*CmdStream) << 8;
diff --git a/drivers/base/bootvid/i386/vga.c b/drivers/base/bootvid/i386/vga.c
index eeb06fe8df5..1c80994c0e7 100644
--- a/drivers/base/bootvid/i386/vga.c
+++ b/drivers/base/bootvid/i386/vga.c
@@ -402,33 +402,20 @@ BitBlt(IN ULONG Left,
IN ULONG BitsPerPixel,
IN ULONG Delta)
{
- ULONG LeftAnd, LeftShifted, LeftPlusOne, LeftPos;
- ULONG lMask, rMask;
- UCHAR NotlMask;
- ULONG Distance;
- ULONG DistanceMinusLeftBpp;
- ULONG SomeYesNoFlag, SomeYesNoFlag2;
- PUCHAR PixelPosition, m;
- PUCHAR i, k;
- ULONG j;
- ULONG x;
- ULONG Plane;
- UCHAR LeftArray[84];
- PUCHAR CurrentLeft;
- PUCHAR l;
- ULONG LoopCount;
- UCHAR pMask, PlaneShift;
- BOOLEAN Odd;
- UCHAR Value;
+ ULONG sx, dx, dy;
+ UCHAR color;
+ ULONG offset = 0;
+ const ULONG Bottom = Top + Height;
+ const ULONG Right = Left + Width;
/* Check if the buffer isn't 4bpp */
if (BitsPerPixel != 4)
{
/* FIXME: TODO */
DbgPrint("Unhandled BitBlt\n"
- "%lxx%lx @ (%lx,%lx)\n"
- "Bits Per Pixel %lx\n"
- "Buffer: %p. Delta: %lx\n",
+ "%lux%lu @ (%lu|%lu)\n"
+ "Bits Per Pixel %lu\n"
+ "Buffer: %p. Delta: %lu\n",
Width,
Height,
Left,
@@ -439,181 +426,28 @@ BitBlt(IN ULONG Left,
return;
}
- /* Get the masks and other values */
- LeftAnd = Left & 0x7;
- lMask = lMaskTable[LeftAnd];
- Distance = Width + Left;
- rMask = rMaskTable[(Distance - 1) & 0x7];
- Left >>= 3;
-
- /* Set some values */
- SomeYesNoFlag = FALSE;
- SomeYesNoFlag2 = FALSE;
- Distance = (Distance - 1) >> 3;
- DistanceMinusLeftBpp = Distance - Left;
-
- /* Check if the distance is equal to the left position and add the masks */
- if (Left == Distance) lMask += rMask;
-
- /* Check if there's no distance offset */
- if (DistanceMinusLeftBpp)
- {
- /* Set the first flag on */
- SomeYesNoFlag = TRUE;
-
- /* Decrease offset and check if we still have one */
- if (--DistanceMinusLeftBpp)
- {
- /* Still have a distance offset */
- SomeYesNoFlag2 = TRUE;
- }
- }
-
- /* Calculate initial pixel position */
- PixelPosition = (PUCHAR)VgaBase + (Top * 80) + Left;
-
- /* Set loop buffer variable */
- i = Buffer;
-
- /* Switch to mode 0 */
- ReadWriteMode(0);
-
- /* Leave now if the height is 0 */
- if (Height <= 0) return;
-
- /* Set more weird values */
- CurrentLeft = &LeftArray[Left];
- NotlMask = ~(UCHAR)lMask;
- LeftPlusOne = Left + 1;
- LeftShifted = (lMask << 8) | 8;
- j = Height;
-
- /* Start the height loop */
+ /* 4bpp blitting */
+ dy = Top;
do
{
- /* Start the plane loop */
- Plane = 0;
+ sx = 0;
do
{
- /* Clear the current value */
- *CurrentLeft = 0;
- LoopCount = 0;
+ /* Extract color */
+ color = Buffer[offset + sx];
- /* Set the buffer loop variable for this loop */
- k = i;
+ /* Calc destination x */
+ dx = Left + (sx << 1);
- /* Calculate plane shift and pixel mask */
- PlaneShift = 1 << Plane;
- pMask = PixelMask[LeftAnd];
+ /* Set two pixels */
+ SetPixel(dx, dy, color >> 4);
+ SetPixel(dx + 1, dy, color & 0x0F);
- /* Check if we have a width */
- if (Width > 0)
- {
- /* Loop it */
- l = CurrentLeft;
- x = Width;
- do
- {
- /* Check if we're odd and increase the loop count */
- Odd = LoopCount & 1 ? TRUE : FALSE;
- LoopCount++;
- if (Odd)
- {
- /* Check for the plane shift */
- if (*k & PlaneShift)
- {
- /* Write the pixel mask */
- *l |= pMask;
- }
-
- /* Increase buffer position */
- k++;
- }
- else
- {
- /* Check for plane shift */
- if ((*k >> 4) & PlaneShift)
- {
- /* Write the pixel mask */
- *l |= pMask;
- }
- }
-
- /* Shift the pixel mask */
- pMask >>= 1;
- if (!pMask)
- {
- /* Move to the next current left position and clear it */
- l++;
- *l = 0;
-
- /* Set the pixel mask to 0x80 */
- pMask = 0x80;
- }
- } while (--x);
- }
-
- /* Set the plane value */
- __outpw(0x3C4, (1 << (Plane + 8) | 2));
-
- /* Select the bitmask register and write the mask */
- __outpw(0x3CE, (USHORT)LeftShifted);
-
- /* Read the current Pixel value */
- Value = READ_REGISTER_UCHAR(PixelPosition);
-
- /* Add our mask */
- Value = (Value & NotlMask) | *CurrentLeft;
-
- /* Set current left for the loop, and write new pixel value */
- LeftPos = LeftPlusOne;
- WRITE_REGISTER_UCHAR(PixelPosition, Value);
-
- /* Set loop pixel position and check if we should loop */
- m = PixelPosition + 1;
- if (SomeYesNoFlag2)
- {
- /* Set the bitmask to 0xFF for all 4 planes */
- __outpw(0x3CE, 0xFF08);
-
- /* Check if we have any distance left */
- if (DistanceMinusLeftBpp > 0)
- {
- /* Start looping it */
- x = DistanceMinusLeftBpp;
- do
- {
- /* Write the value */
- WRITE_REGISTER_UCHAR(m, LeftArray[LeftPos]);
-
- /* Go to the next position */
- m++;
- LeftPos++;
- } while (--x);
- }
- }
-
- /* Check if the first flag is on */
- if (SomeYesNoFlag)
- {
- /* Set the mask value */
- __outpw(0x3CE, (rMask << 8) | 8);
-
- /* Read the current Pixel value */
- Value = READ_REGISTER_UCHAR(m);
-
- /* Add our mask */
- Value = (Value & ~(UCHAR)rMask) | LeftArray[LeftPos];
-
- /* Set current left for the loop, and write new pixel value */
- WRITE_REGISTER_UCHAR(m, Value);
- }
- } while (++Plane < 4);
-
- /* Update pixel position, buffer and height */
- PixelPosition += 80;
- i += Delta;
- } while (--j);
+ sx++;
+ } while (dx < Right);
+ offset += Delta;
+ dy++;
+ } while (dy < Bottom);
}
VOID
diff --git a/drivers/battery/battc/battc.rbuild b/drivers/battery/battc/battc.rbuild
index c0261344994..5847dd401b0 100644
--- a/drivers/battery/battc/battc.rbuild
+++ b/drivers/battery/battc/battc.rbuild
@@ -5,6 +5,7 @@
hal
.
+
battc.c
battc.rc
diff --git a/drivers/bus/acpi/acpica/include/platform/acwin64.h b/drivers/bus/acpi/acpica/include/platform/acwin64.h
index faec855e22d..59a8adda807 100644
--- a/drivers/bus/acpi/acpica/include/platform/acwin64.h
+++ b/drivers/bus/acpi/acpica/include/platform/acwin64.h
@@ -118,10 +118,14 @@
/*! [Begin] no source code translation (Keep the include) */
-#include "acintel.h"
+//#include "acintel.h"
+// HACK
+#define INT32 _ACPI_INT32
+#define UINT32 _ACPI_UINT32
+
/*! [End] no source code translation !*/
-#define ACPI_MACHINE_WIDTH 64
+#define ACPI_MACHINE_WIDTH 64
#define ACPI_USE_STANDARD_HEADERS
diff --git a/drivers/bus/acpi/busmgr/bus.c b/drivers/bus/acpi/busmgr/bus.c
index ae04c2cb31b..9860055873a 100644
--- a/drivers/bus/acpi/busmgr/bus.c
+++ b/drivers/bus/acpi/busmgr/bus.c
@@ -457,6 +457,7 @@ acpi_bus_get_perf_flags (
-------------------------------------------------------------------------- */
void
+NTAPI
acpi_bus_generate_event_dpc(PKDPC Dpc,
PVOID DeferredContext,
PVOID SystemArgument1,
diff --git a/drivers/bus/acpi/compbatt/compbatt.c b/drivers/bus/acpi/compbatt/compbatt.c
index a0b17f83e45..094cb4e6b6e 100644
--- a/drivers/bus/acpi/compbatt/compbatt.c
+++ b/drivers/bus/acpi/compbatt/compbatt.c
@@ -214,15 +214,6 @@ CompBattSetStatusNotify(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension,
return STATUS_NOT_IMPLEMENTED;
}
-NTSTATUS
-NTAPI
-CompBattGetBatteryStatus(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension,
- IN ULONG Tag)
-{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
-}
-
NTSTATUS
NTAPI
CompBattQueryStatus(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension,
diff --git a/drivers/bus/acpi/include/acpisys.h b/drivers/bus/acpi/include/acpisys.h
index adf2a0c592a..eb171f15546 100644
--- a/drivers/bus/acpi/include/acpisys.h
+++ b/drivers/bus/acpi/include/acpisys.h
@@ -130,6 +130,7 @@ Bus_PnP (
);
NTSTATUS
+NTAPI
Bus_CompletionRoutine(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
diff --git a/drivers/bus/acpi/interface.c b/drivers/bus/acpi/interface.c
index 59717056484..4e54115c0b4 100644
--- a/drivers/bus/acpi/interface.c
+++ b/drivers/bus/acpi/interface.c
@@ -25,13 +25,14 @@ AcpiInterfaceDereference(PVOID Context)
}
NTSTATUS
+NTAPI
AcpiInterfaceConnectVector(PDEVICE_OBJECT Context,
ULONG GpeNumber,
KINTERRUPT_MODE Mode,
BOOLEAN Shareable,
PGPE_SERVICE_ROUTINE ServiceRoutine,
PVOID ServiceContext,
- PVOID *ObjectContext)
+ PVOID ObjectContext)
{
UNIMPLEMENTED
@@ -39,8 +40,8 @@ AcpiInterfaceConnectVector(PDEVICE_OBJECT Context,
}
NTSTATUS
-AcpiInterfaceDisconnectVector(PDEVICE_OBJECT Context,
- PVOID ObjectContext)
+NTAPI
+AcpiInterfaceDisconnectVector(PVOID ObjectContext)
{
UNIMPLEMENTED
@@ -48,6 +49,7 @@ AcpiInterfaceDisconnectVector(PDEVICE_OBJECT Context,
}
NTSTATUS
+NTAPI
AcpiInterfaceEnableEvent(PDEVICE_OBJECT Context,
PVOID ObjectContext)
{
@@ -57,6 +59,7 @@ AcpiInterfaceEnableEvent(PDEVICE_OBJECT Context,
}
NTSTATUS
+NTAPI
AcpiInterfaceDisableEvent(PDEVICE_OBJECT Context,
PVOID ObjectContext)
{
@@ -66,6 +69,7 @@ AcpiInterfaceDisableEvent(PDEVICE_OBJECT Context,
}
NTSTATUS
+NTAPI
AcpiInterfaceClearStatus(PDEVICE_OBJECT Context,
PVOID ObjectContext)
{
@@ -75,6 +79,7 @@ AcpiInterfaceClearStatus(PDEVICE_OBJECT Context,
}
NTSTATUS
+NTAPI
AcpiInterfaceNotificationsRegister(PDEVICE_OBJECT Context,
PDEVICE_NOTIFY_CALLBACK NotificationHandler,
PVOID NotificationContext)
@@ -85,6 +90,7 @@ AcpiInterfaceNotificationsRegister(PDEVICE_OBJECT Context,
}
VOID
+NTAPI
AcpiInterfaceNotificationsUnregister(PDEVICE_OBJECT Context,
PDEVICE_NOTIFY_CALLBACK NotificationHandler)
{
diff --git a/drivers/bus/acpi/pnp.c b/drivers/bus/acpi/pnp.c
index c82a3905023..9259fb9d2a5 100644
--- a/drivers/bus/acpi/pnp.c
+++ b/drivers/bus/acpi/pnp.c
@@ -363,6 +363,7 @@ Bus_SendIrpSynchronously (
}
NTSTATUS
+NTAPI
Bus_CompletionRoutine(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
diff --git a/drivers/filesystems/npfs/create.c b/drivers/filesystems/npfs/create.c
index 5236e2035ee..bef462fb8d7 100644
--- a/drivers/filesystems/npfs/create.c
+++ b/drivers/filesystems/npfs/create.c
@@ -205,8 +205,8 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
ClientCcb->MaxDataLength = Fcb->OutboundQuota;
ExInitializeFastMutex(&ClientCcb->DataListLock);
KeInitializeEvent(&ClientCcb->ConnectEvent, SynchronizationEvent, FALSE);
- KeInitializeEvent(&ClientCcb->ReadEvent, SynchronizationEvent, FALSE);
- KeInitializeEvent(&ClientCcb->WriteEvent, SynchronizationEvent, FALSE);
+ KeInitializeEvent(&ClientCcb->ReadEvent, NotificationEvent, FALSE);
+ KeInitializeEvent(&ClientCcb->WriteEvent, NotificationEvent, FALSE);
/*
@@ -255,8 +255,9 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
if (ClientCcb->Data)
{
ExFreePool(ClientCcb->Data);
- ClientCcb->Data = NULL;
}
+
+ ExFreePool(ClientCcb);
KeUnlockMutex(&Fcb->CcbListLock);
Irp->IoStatus.Status = STATUS_OBJECT_PATH_NOT_FOUND;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
@@ -273,6 +274,14 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
else if (IsListEmpty(&Fcb->ServerCcbListHead))
{
DPRINT("No server fcb found!\n");
+
+ if (ClientCcb->Data)
+ {
+ ExFreePool(ClientCcb->Data);
+ }
+
+ ExFreePool(ClientCcb);
+
KeUnlockMutex(&Fcb->CcbListLock);
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
@@ -540,8 +549,8 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject,
DPRINT("CCB: %p\n", Ccb);
KeInitializeEvent(&Ccb->ConnectEvent, SynchronizationEvent, FALSE);
- KeInitializeEvent(&Ccb->ReadEvent, SynchronizationEvent, FALSE);
- KeInitializeEvent(&Ccb->WriteEvent, SynchronizationEvent, FALSE);
+ KeInitializeEvent(&Ccb->ReadEvent, NotificationEvent, FALSE);
+ KeInitializeEvent(&Ccb->WriteEvent, NotificationEvent, FALSE);
KeLockMutex(&Fcb->CcbListLock);
InsertTailList(&Fcb->ServerCcbListHead, &Ccb->CcbListEntry);
@@ -619,7 +628,6 @@ NpfsCleanup(PDEVICE_OBJECT DeviceObject,
ExAcquireFastMutex(&OtherSide->DataListLock);
ExAcquireFastMutex(&Ccb->DataListLock);
}
- //OtherSide->PipeState = FILE_PIPE_DISCONNECTED_STATE;
OtherSide->OtherSide = NULL;
/*
* Signaling the write event. If is possible that an other
@@ -743,8 +751,11 @@ NpfsClose(PDEVICE_OBJECT DeviceObject,
}
/* Disconnect the pipes */
- if (Ccb->OtherSide) Ccb->OtherSide->OtherSide = NULL;
- if (Ccb) Ccb->OtherSide = NULL;
+ if (Ccb->OtherSide)
+ {
+ Ccb->OtherSide->OtherSide = NULL;
+ Ccb->OtherSide = NULL;
+ }
ASSERT(Ccb->PipeState == FILE_PIPE_CLOSING_STATE);
diff --git a/drivers/filesystems/npfs/finfo.c b/drivers/filesystems/npfs/finfo.c
index 18c53414d64..fbb1d6090de 100644
--- a/drivers/filesystems/npfs/finfo.c
+++ b/drivers/filesystems/npfs/finfo.c
@@ -26,6 +26,13 @@ NpfsSetPipeInformation(PDEVICE_OBJECT DeviceObject,
PFILE_PIPE_INFORMATION Request;
DPRINT("NpfsSetPipeInformation()\n");
+ if (*BufferLength < sizeof(FILE_PIPE_INFORMATION))
+ {
+ /* Buffer too small */
+ return STATUS_INFO_LENGTH_MISMATCH;
+ }
+
+
/* Get the Pipe and data */
Fcb = Ccb->Fcb;
Request = (PFILE_PIPE_INFORMATION)Info;
@@ -63,6 +70,12 @@ NpfsSetPipeRemoteInformation(PDEVICE_OBJECT DeviceObject,
PFILE_PIPE_REMOTE_INFORMATION Request;
DPRINT("NpfsSetPipeRemoteInformation()\n");
+ if (*BufferLength < sizeof(FILE_PIPE_REMOTE_INFORMATION))
+ {
+ /* Buffer too small */
+ return STATUS_INFO_LENGTH_MISMATCH;
+ }
+
/* Get the Pipe and data */
Fcb = Ccb->Fcb;
Request = (PFILE_PIPE_REMOTE_INFORMATION)Info;
@@ -86,6 +99,13 @@ NpfsQueryPipeInformation(PDEVICE_OBJECT DeviceObject,
ULONG ConnectionSideReadMode;
DPRINT("NpfsQueryPipeInformation()\n");
+ if (*BufferLength < sizeof(FILE_PIPE_INFORMATION))
+ {
+ /* Buffer too small */
+ *BufferLength = sizeof(FILE_PIPE_INFORMATION);
+ return STATUS_BUFFER_OVERFLOW;
+ }
+
/* Get the Pipe */
Fcb = Ccb->Fcb;
@@ -100,7 +120,7 @@ NpfsQueryPipeInformation(PDEVICE_OBJECT DeviceObject,
Info->ReadMode = ConnectionSideReadMode;
/* Return success */
- *BufferLength -= sizeof(FILE_PIPE_INFORMATION);
+ *BufferLength = sizeof(FILE_PIPE_INFORMATION);
return STATUS_SUCCESS;
}
@@ -114,6 +134,13 @@ NpfsQueryPipeRemoteInformation(PDEVICE_OBJECT DeviceObject,
PNPFS_FCB Fcb;
DPRINT("NpfsQueryPipeRemoteInformation()\n");
+ if (*BufferLength < sizeof(FILE_PIPE_REMOTE_INFORMATION))
+ {
+ /* Buffer too small */
+ *BufferLength = sizeof(FILE_PIPE_REMOTE_INFORMATION);
+ return STATUS_BUFFER_OVERFLOW;
+ }
+
/* Get the Pipe */
Fcb = Ccb->Fcb;
@@ -125,7 +152,7 @@ NpfsQueryPipeRemoteInformation(PDEVICE_OBJECT DeviceObject,
Info->CollectDataTime = Fcb->TimeOut;
/* Return success */
- *BufferLength -= sizeof(FILE_PIPE_REMOTE_INFORMATION);
+ *BufferLength = sizeof(FILE_PIPE_REMOTE_INFORMATION);
return STATUS_SUCCESS;
}
@@ -140,11 +167,21 @@ NpfsQueryLocalPipeInformation(PDEVICE_OBJECT DeviceObject,
DPRINT("NpfsQueryLocalPipeInformation()\n");
+ if (*BufferLength < sizeof(FILE_PIPE_REMOTE_INFORMATION))
+ {
+ /* Buffer too small */
+ *BufferLength = sizeof(FILE_PIPE_REMOTE_INFORMATION);
+ return STATUS_BUFFER_OVERFLOW;
+ }
+
+ /* Get the Pipe */
Fcb = Ccb->Fcb;
+ /* Clear Info */
RtlZeroMemory(Info,
sizeof(FILE_PIPE_LOCAL_INFORMATION));
+ /* Return Info */
Info->NamedPipeType = Fcb->PipeType;
Info->NamedPipeConfiguration = Fcb->PipeConfiguration;
Info->MaximumInstances = Fcb->MaximumInstances;
@@ -165,7 +202,7 @@ NpfsQueryLocalPipeInformation(PDEVICE_OBJECT DeviceObject,
Info->WriteQuotaAvailable = Ccb->OtherSide->WriteQuotaAvailable;
}
- *BufferLength -= sizeof(FILE_PIPE_LOCAL_INFORMATION);
+ *BufferLength = sizeof(FILE_PIPE_LOCAL_INFORMATION);
return STATUS_SUCCESS;
}
@@ -226,14 +263,12 @@ NpfsQueryInformation(PDEVICE_OBJECT DeviceObject,
default:
Status = STATUS_NOT_SUPPORTED;
+ BufferLength = 0;
}
Irp->IoStatus.Status = Status;
- if (NT_SUCCESS(Status))
- Irp->IoStatus.Information =
- IoStack->Parameters.QueryFile.Length - BufferLength;
- else
- Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Information = BufferLength;
+
IoCompleteRequest (Irp, IO_NO_INCREMENT);
return Status;
diff --git a/drivers/filesystems/npfs/npfs.c b/drivers/filesystems/npfs/npfs.c
index ed6d6005221..147f4107b52 100644
--- a/drivers/filesystems/npfs/npfs.c
+++ b/drivers/filesystems/npfs/npfs.c
@@ -70,6 +70,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
/* initialize the device object */
DeviceObject->Flags |= DO_DIRECT_IO;
+ DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
/* initialize the device extension */
DeviceExtension = DeviceObject->DeviceExtension;
diff --git a/drivers/filesystems/npfs/rw.c b/drivers/filesystems/npfs/rw.c
index 7b14449b308..e5ef963b9ad 100644
--- a/drivers/filesystems/npfs/rw.c
+++ b/drivers/filesystems/npfs/rw.c
@@ -51,7 +51,9 @@ NpfsReadWriteCancelRoutine(IN PDEVICE_OBJECT DeviceObject,
PNPFS_DEVICE_EXTENSION DeviceExt;
PIO_STACK_LOCATION IoStack;
PNPFS_CCB Ccb;
- BOOLEAN Complete = FALSE;
+ PLIST_ENTRY ListEntry;
+ PNPFS_THREAD_CONTEXT ThreadContext;
+ ULONG i;
DPRINT("NpfsReadWriteCancelRoutine(DeviceObject %p, Irp %p)\n", DeviceObject, Irp);
@@ -67,28 +69,50 @@ NpfsReadWriteCancelRoutine(IN PDEVICE_OBJECT DeviceObject,
switch(IoStack->MajorFunction)
{
case IRP_MJ_READ:
- if (Ccb->ReadRequestListHead.Flink != &Context->ListEntry)
+ ListEntry = DeviceExt->ThreadListHead.Flink;
+ while (ListEntry != &DeviceExt->ThreadListHead)
{
- /* we are not the first in the list, remove an complete us */
- RemoveEntryList(&Context->ListEntry);
- Complete = TRUE;
- }
- else
- {
- KeSetEvent(&Ccb->ReadEvent, IO_NO_INCREMENT, FALSE);
+ ThreadContext = CONTAINING_RECORD(ListEntry, NPFS_THREAD_CONTEXT, ListEntry);
+ /* Real events start at index 1 */
+ for (i = 1; i < ThreadContext->Count; i++)
+ {
+ if (ThreadContext->WaitIrpArray[i] == Irp)
+ {
+ ASSERT(ThreadContext->WaitObjectArray[i] == Context->WaitEvent);
+
+ ThreadContext->WaitIrpArray[i] = NULL;
+
+ RemoveEntryList(&Context->ListEntry);
+
+ Irp->IoStatus.Status = STATUS_CANCELLED;
+ Irp->IoStatus.Information = 0;
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ KeSetEvent(&ThreadContext->Event, IO_NO_INCREMENT, FALSE);
+
+ ExReleaseFastMutex(&Ccb->DataListLock);
+ KeUnlockMutex(&DeviceExt->PipeListLock);
+
+ return;
+ }
+ }
+ ListEntry = ListEntry->Flink;
}
+
+ RemoveEntryList(&Context->ListEntry);
+
+ ExReleaseFastMutex(&Ccb->DataListLock);
+ KeUnlockMutex(&DeviceExt->PipeListLock);
+
+ Irp->IoStatus.Status = STATUS_CANCELLED;
+ Irp->IoStatus.Information = 0;
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
break;
default:
ASSERT(FALSE);
}
- ExReleaseFastMutex(&Ccb->DataListLock);
- KeUnlockMutex(&DeviceExt->PipeListLock);
- if (Complete)
- {
- Irp->IoStatus.Status = STATUS_CANCELLED;
- Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- }
}
static VOID NTAPI
@@ -96,16 +120,11 @@ NpfsWaiterThread(PVOID InitContext)
{
PNPFS_THREAD_CONTEXT ThreadContext = (PNPFS_THREAD_CONTEXT) InitContext;
ULONG CurrentCount;
- ULONG Count = 0;
+ ULONG Count = 0, i;
PIRP Irp = NULL;
- PIRP NextIrp;
NTSTATUS Status;
- BOOLEAN Terminate = FALSE;
- BOOLEAN Cancel = FALSE;
PIO_STACK_LOCATION IoStack = NULL;
- PNPFS_CONTEXT Context;
- PNPFS_CONTEXT NextContext;
- PNPFS_CCB Ccb;
+ KIRQL OldIrql;
KeLockMutex(&ThreadContext->DeviceExt->PipeListLock);
@@ -113,29 +132,23 @@ NpfsWaiterThread(PVOID InitContext)
{
CurrentCount = ThreadContext->Count;
KeUnlockMutex(&ThreadContext->DeviceExt->PipeListLock);
- if (Irp)
+ IoAcquireCancelSpinLock(&OldIrql);
+ if (Irp && IoSetCancelRoutine(Irp, NULL) != NULL)
{
- if (Cancel)
+ IoReleaseCancelSpinLock(OldIrql);
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ switch (IoStack->MajorFunction)
{
- Irp->IoStatus.Status = STATUS_CANCELLED;
- Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- }
- else
- {
- switch (IoStack->MajorFunction)
- {
case IRP_MJ_READ:
NpfsRead(IoStack->DeviceObject, Irp);
break;
default:
ASSERT(FALSE);
- }
}
}
- if (Terminate)
+ else
{
- break;
+ IoReleaseCancelSpinLock(OldIrql);
}
Status = KeWaitForMultipleObjects(CurrentCount,
ThreadContext->WaitObjectArray,
@@ -150,7 +163,7 @@ NpfsWaiterThread(PVOID InitContext)
ASSERT(FALSE);
}
KeLockMutex(&ThreadContext->DeviceExt->PipeListLock);
- Count = Status - STATUS_SUCCESS;
+ Count = Status - STATUS_WAIT_0;
ASSERT (Count < CurrentCount);
if (Count > 0)
{
@@ -159,47 +172,31 @@ NpfsWaiterThread(PVOID InitContext)
ThreadContext->DeviceExt->EmptyWaiterCount++;
ThreadContext->WaitObjectArray[Count] = ThreadContext->WaitObjectArray[ThreadContext->Count];
ThreadContext->WaitIrpArray[Count] = ThreadContext->WaitIrpArray[ThreadContext->Count];
-
- Cancel = (NULL == IoSetCancelRoutine(Irp, NULL));
- Context = (PNPFS_CONTEXT)&Irp->Tail.Overlay.DriverContext;
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
- if (Cancel)
- {
- Ccb = IoStack->FileObject->FsContext2;
- ExAcquireFastMutex(&Ccb->DataListLock);
- RemoveEntryList(&Context->ListEntry);
- switch (IoStack->MajorFunction)
- {
- case IRP_MJ_READ:
- if (!IsListEmpty(&Ccb->ReadRequestListHead))
- {
- /* put the next request on the wait list */
- NextContext = CONTAINING_RECORD(Ccb->ReadRequestListHead.Flink, NPFS_CONTEXT, ListEntry);
- ThreadContext->WaitObjectArray[ThreadContext->Count] = NextContext->WaitEvent;
- NextIrp = CONTAINING_RECORD(NextContext, IRP, Tail.Overlay.DriverContext);
- ThreadContext->WaitIrpArray[ThreadContext->Count] = NextIrp;
- ThreadContext->Count++;
- ThreadContext->DeviceExt->EmptyWaiterCount--;
- }
- break;
- default:
- ASSERT(FALSE);
- }
- ExReleaseFastMutex(&Ccb->DataListLock);
- }
}
else
{
- /* someone has add a new wait request */
+ /* someone has add a new wait request or cancelled an old one */
Irp = NULL;
+
+ /* Look for cancelled requests */
+ for (i = 1; i < ThreadContext->Count; i++)
+ {
+ if (ThreadContext->WaitIrpArray[i] == NULL)
+ {
+ ThreadContext->Count--;
+ ThreadContext->DeviceExt->EmptyWaiterCount++;
+ ThreadContext->WaitObjectArray[i] = ThreadContext->WaitObjectArray[ThreadContext->Count];
+ ThreadContext->WaitIrpArray[i] = ThreadContext->WaitIrpArray[ThreadContext->Count];
+ }
+ }
}
if (ThreadContext->Count == 1 && ThreadContext->DeviceExt->EmptyWaiterCount >= MAXIMUM_WAIT_OBJECTS)
{
/* it exist an other thread with empty wait slots, we can remove our thread from the list */
RemoveEntryList(&ThreadContext->ListEntry);
ThreadContext->DeviceExt->EmptyWaiterCount -= MAXIMUM_WAIT_OBJECTS - 1;
- Terminate = TRUE;
+ KeUnlockMutex(&ThreadContext->DeviceExt->PipeListLock);
+ break;
}
}
ExFreePool(ThreadContext);
@@ -332,10 +329,7 @@ NpfsRead(IN PDEVICE_OBJECT DeviceObject,
if ((Ccb->OtherSide == NULL) && (Ccb->ReadDataAvailable == 0))
{
if (Ccb->PipeState == FILE_PIPE_CONNECTED_STATE)
- {
- DPRINT("File pipe broken\n");
Status = STATUS_PIPE_BROKEN;
- }
else if (Ccb->PipeState == FILE_PIPE_LISTENING_STATE)
Status = STATUS_PIPE_LISTENING;
else if (Ccb->PipeState == FILE_PIPE_DISCONNECTED_STATE)
@@ -443,7 +437,7 @@ NpfsRead(IN PDEVICE_OBJECT DeviceObject,
{
break;
}
- if ((Ccb->PipeState != FILE_PIPE_CONNECTED_STATE) && (Ccb->ReadDataAvailable == 0))
+ if (((Ccb->PipeState != FILE_PIPE_CONNECTED_STATE) || (!Ccb->OtherSide)) && (Ccb->ReadDataAvailable == 0))
{
DPRINT("PipeState: %x\n", Ccb->PipeState);
Status = STATUS_PIPE_BROKEN;
@@ -787,7 +781,16 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
}
Status = STATUS_SUCCESS;
- Buffer = MmGetSystemAddressForMdl (Irp->MdlAddress);
+ Buffer = MmGetSystemAddressForMdlSafe (Irp->MdlAddress, NormalPagePriority);
+
+ if (!Buffer)
+ {
+ DPRINT("MmGetSystemAddressForMdlSafe failed\n");
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ Length = 0;
+ goto done;
+
+ }
ExAcquireFastMutex(&ReaderCcb->DataListLock);
@@ -800,13 +803,13 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
{
if ((ReaderCcb->WriteQuotaAvailable == 0))
{
- KeSetEvent(&ReaderCcb->ReadEvent, IO_NO_INCREMENT, FALSE);
- if (Ccb->PipeState != FILE_PIPE_CONNECTED_STATE)
+ if (Ccb->PipeState != FILE_PIPE_CONNECTED_STATE || !Ccb->OtherSide)
{
Status = STATUS_PIPE_BROKEN;
ExReleaseFastMutex(&ReaderCcb->DataListLock);
goto done;
}
+ KeSetEvent(&ReaderCcb->ReadEvent, IO_NO_INCREMENT, FALSE);
ExReleaseFastMutex(&ReaderCcb->DataListLock);
DPRINT("Write Waiting for buffer space (%S)\n", Fcb->PipeName.Buffer);
@@ -830,20 +833,15 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
* It's possible that the event was signaled because the
* other side of pipe was closed.
*/
- if (Ccb->PipeState != FILE_PIPE_CONNECTED_STATE)
+ if (Ccb->PipeState != FILE_PIPE_CONNECTED_STATE || !Ccb->OtherSide)
{
DPRINT("PipeState: %x\n", Ccb->PipeState);
Status = STATUS_PIPE_BROKEN;
goto done;
}
/* Check that the pipe has not been closed */
- if (ReaderCcb->PipeState != FILE_PIPE_CONNECTED_STATE)
+ if (ReaderCcb->PipeState != FILE_PIPE_CONNECTED_STATE || !ReaderCcb->OtherSide)
{
- /* If the other side is valid, fire event */
- if (Ccb)
- {
- KeResetEvent(&Ccb->WriteEvent);
- }
Status = STATUS_PIPE_BROKEN;
goto done;
}
diff --git a/drivers/filesystems/npfs/volume.c b/drivers/filesystems/npfs/volume.c
index 4241c88ec3d..63eb0773b91 100644
--- a/drivers/filesystems/npfs/volume.c
+++ b/drivers/filesystems/npfs/volume.c
@@ -23,12 +23,15 @@ NpfsQueryFsDeviceInformation(PFILE_FS_DEVICE_INFORMATION FsDeviceInfo,
DPRINT("FsDeviceInfo = %p\n", FsDeviceInfo);
if (*BufferLength < sizeof(FILE_FS_DEVICE_INFORMATION))
+ {
+ *BufferLength = sizeof(FILE_FS_DEVICE_INFORMATION);
return STATUS_BUFFER_OVERFLOW;
+ }
FsDeviceInfo->DeviceType = FILE_DEVICE_NAMED_PIPE;
FsDeviceInfo->Characteristics = 0;
- *BufferLength -= sizeof(FILE_FS_DEVICE_INFORMATION);
+ *BufferLength = sizeof(FILE_FS_DEVICE_INFORMATION);
DPRINT("NpfsQueryFsDeviceInformation() finished.\n");
@@ -44,7 +47,10 @@ NpfsQueryFsAttributeInformation(PFILE_FS_ATTRIBUTE_INFORMATION FsAttributeInfo,
DPRINT("FsAttributeInfo = %p\n", FsAttributeInfo);
if (*BufferLength < sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 8)
+ {
+ *BufferLength = (sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 8);
return STATUS_BUFFER_OVERFLOW;
+ }
FsAttributeInfo->FileSystemAttributes = FILE_CASE_PRESERVED_NAMES;
FsAttributeInfo->MaximumComponentNameLength = 255;
@@ -53,7 +59,7 @@ NpfsQueryFsAttributeInformation(PFILE_FS_ATTRIBUTE_INFORMATION FsAttributeInfo,
L"NPFS");
DPRINT("NpfsQueryFsAttributeInformation() finished.\n");
- *BufferLength -= (sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 8);
+ *BufferLength = (sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 8);
return STATUS_SUCCESS;
}
@@ -102,10 +108,8 @@ NpfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject,
}
Irp->IoStatus.Status = Status;
- if (NT_SUCCESS(Status))
- Irp->IoStatus.Information = Stack->Parameters.QueryVolume.Length - BufferLength;
- else
- Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Information = BufferLength;
+
IoCompleteRequest(Irp,
IO_NO_INCREMENT);
diff --git a/drivers/ksfilter/ks/pin.c b/drivers/ksfilter/ks/pin.c
index 019e5ce6023..a95755c2279 100644
--- a/drivers/ksfilter/ks/pin.c
+++ b/drivers/ksfilter/ks/pin.c
@@ -1332,7 +1332,9 @@ IKsPin_PrepareStreamHeader(
else
StreamPointer->StreamPointer.Offset = &StreamPointer->StreamPointer.OffsetOut;
+#ifndef _WIN64
StreamPointer->StreamPointer.Offset->Alignment = 0;
+#endif
StreamPointer->StreamPointer.Offset->Count = 0;
StreamPointer->StreamPointer.Offset->Data = NULL;
StreamPointer->StreamPointer.Offset->Remaining = 0;
@@ -1352,7 +1354,9 @@ IKsPin_PrepareStreamHeader(
/* FIXME */
ASSERT(Length);
+#ifndef _WIN64
StreamPointer->StreamPointer.Offset->Alignment = 0;
+#endif
StreamPointer->StreamPointer.Context = NULL;
StreamPointer->StreamPointer.Pin = &This->Pin;
StreamPointer->StreamPointer.Offset->Count = Length;
@@ -1543,7 +1547,7 @@ KsStreamPointerClone(
IKsPinImpl * This;
PKSISTREAM_POINTER CurFrame;
PKSISTREAM_POINTER NewFrame;
- ULONG RefCount;
+ ULONG_PTR RefCount;
NTSTATUS Status;
ULONG Size;
@@ -1562,7 +1566,7 @@ KsStreamPointerClone(
return STATUS_INSUFFICIENT_RESOURCES;
/* get current irp stack location */
- RefCount = (ULONG)CurFrame->Irp->Tail.Overlay.DriverContext[0];
+ RefCount = (ULONG_PTR)CurFrame->Irp->Tail.Overlay.DriverContext[0];
/* increment reference count */
RefCount++;
diff --git a/drivers/network/afd/afd/connect.c b/drivers/network/afd/afd/connect.c
index 3f47a05941a..28fcfada857 100644
--- a/drivers/network/afd/afd/connect.c
+++ b/drivers/network/afd/afd/connect.c
@@ -247,6 +247,8 @@ NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB ) {
if( Status == STATUS_PENDING ) Status = STATUS_SUCCESS;
FCB->PollState |= AFD_EVENT_CONNECT | AFD_EVENT_SEND;
+ FCB->PollStatus[FD_CONNECT_BIT] = STATUS_SUCCESS;
+ FCB->PollStatus[FD_WRITE_BIT] = STATUS_SUCCESS;
PollReeval( FCB->DeviceExt, FCB->FileObject );
return Status;
@@ -291,6 +293,7 @@ static NTSTATUS NTAPI StreamSocketConnectComplete
if( !NT_SUCCESS(Irp->IoStatus.Status) ) {
FCB->PollState |= AFD_EVENT_CONNECT_FAIL;
+ FCB->PollStatus[FD_CONNECT_BIT] = Irp->IoStatus.Status;
AFD_DbgPrint(MID_TRACE,("Going to bound state\n"));
FCB->State = SOCKET_STATE_BOUND;
PollReeval( FCB->DeviceExt, FCB->FileObject );
diff --git a/drivers/network/afd/afd/listen.c b/drivers/network/afd/afd/listen.c
index 5a1b8f55bbb..f6eb1104210 100644
--- a/drivers/network/afd/afd/listen.c
+++ b/drivers/network/afd/afd/listen.c
@@ -193,11 +193,10 @@ static NTSTATUS NTAPI ListenComplete
/* Trigger a select return if appropriate */
if( !IsListEmpty( &FCB->PendingConnections ) ) {
FCB->PollState |= AFD_EVENT_ACCEPT;
- } else {
- FCB->PollState &= ~AFD_EVENT_ACCEPT;
- }
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
+ FCB->PollStatus[FD_ACCEPT_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
+ } else
+ FCB->PollState &= ~AFD_EVENT_ACCEPT;
SocketStateUnlock( FCB );
@@ -293,12 +292,13 @@ NTSTATUS AfdWaitForListen( PDEVICE_OBJECT DeviceObject, PIRP Irp,
AFD_DbgPrint(MID_TRACE,("Completed a wait for accept\n"));
- if ( IsListEmpty( &FCB->PendingConnections ) )
- FCB->PollState &= ~AFD_EVENT_ACCEPT;
- else
+ if ( !IsListEmpty( &FCB->PendingConnections ) )
+ {
FCB->PollState |= AFD_EVENT_ACCEPT;
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
+ FCB->PollStatus[FD_ACCEPT_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
+ } else
+ FCB->PollState &= ~AFD_EVENT_ACCEPT;
SocketStateUnlock( FCB );
return Status;
@@ -402,13 +402,12 @@ NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp,
ExFreePool( PendingConnObj );
- if( IsListEmpty( &FCB->PendingConnections ) ) {
- FCB->PollState &= ~AFD_EVENT_ACCEPT;
- } else {
+ if( !IsListEmpty( &FCB->PendingConnections ) ) {
FCB->PollState |= AFD_EVENT_ACCEPT;
- }
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
+ FCB->PollStatus[FD_ACCEPT_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
+ } else
+ FCB->PollState &= ~AFD_EVENT_ACCEPT;
SocketStateUnlock( FCB );
return Status;
diff --git a/drivers/network/afd/afd/main.c b/drivers/network/afd/afd/main.c
index bcbb2f56603..95da3c054bf 100644
--- a/drivers/network/afd/afd/main.c
+++ b/drivers/network/afd/afd/main.c
@@ -314,6 +314,7 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
/* A datagram socket is always sendable */
FCB->PollState |= AFD_EVENT_SEND;
+ FCB->PollStatus[FD_WRITE_BIT] = STATUS_SUCCESS;
PollReeval( FCB->DeviceExt, FCB->FileObject );
}
@@ -377,6 +378,7 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
FCB->State = SOCKET_STATE_CLOSED;
FCB->PollState = AFD_EVENT_CLOSE;
+ FCB->PollStatus[FD_CLOSE_BIT] = STATUS_SUCCESS; //I think we can return success here
PollReeval( FCB->DeviceExt, FCB->FileObject );
InFlightRequest[0] = &FCB->ListenIrp;
@@ -542,6 +544,7 @@ AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
ExFreePool( ConnectionReturnInfo );
FCB->PollState |= AFD_EVENT_DISCONNECT;
+ FCB->PollStatus[FD_CLOSE_BIT] = STATUS_SUCCESS;
PollReeval( FCB->DeviceExt, FCB->FileObject );
} else
Status = STATUS_INVALID_PARAMETER;
diff --git a/drivers/network/afd/afd/read.c b/drivers/network/afd/afd/read.c
index dccfa559ba8..f98fd17b3aa 100644
--- a/drivers/network/afd/afd/read.c
+++ b/drivers/network/afd/afd/read.c
@@ -46,6 +46,7 @@ static NTSTATUS RefillSocketBuffer( PAFD_FCB FCB ) {
{
/* The socket has been closed */
FCB->PollState |= AFD_EVENT_DISCONNECT;
+ FCB->PollStatus[FD_CLOSE_BIT] = Status;
FCB->Overread = TRUE;
Status = STATUS_FILE_CLOSED;
}
@@ -53,6 +54,7 @@ static NTSTATUS RefillSocketBuffer( PAFD_FCB FCB ) {
{
FCB->Recv.Content = FCB->ReceiveIrp.Iosb.Information;
FCB->PollState |= AFD_EVENT_RECEIVE;
+ FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
}
PollReeval( FCB->DeviceExt, FCB->FileObject );
}
@@ -189,10 +191,10 @@ static NTSTATUS ReceiveActivity( PAFD_FCB FCB, PIRP Irp ) {
if( FCB->Recv.Content ) {
FCB->PollState |= AFD_EVENT_RECEIVE;
+ FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
} else
- FCB->PollState &= ~AFD_EVENT_RECEIVE;
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
+ FCB->PollState &= ~AFD_EVENT_RECEIVE;
AFD_DbgPrint(MID_TRACE,("RetStatus for irp %x is %x\n", Irp, RetStatus));
@@ -538,10 +540,10 @@ PacketSocketRecvComplete(
if( !IsListEmpty( &FCB->DatagramList ) ) {
AFD_DbgPrint(MID_TRACE,("Signalling\n"));
FCB->PollState |= AFD_EVENT_RECEIVE;
+ FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
} else
- FCB->PollState &= ~AFD_EVENT_RECEIVE;
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
+ FCB->PollState &= ~AFD_EVENT_RECEIVE;
if( NT_SUCCESS(Irp->IoStatus.Status) ) {
/* Now relaunch the datagram request */
@@ -608,12 +610,12 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
Status = Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
Irp->IoStatus.Information = DatagramRecv->Len;
- if( IsListEmpty( &FCB->DatagramList ) )
- FCB->PollState &= ~AFD_EVENT_RECEIVE;
- else
+ if( !IsListEmpty( &FCB->DatagramList ) ) {
FCB->PollState |= AFD_EVENT_RECEIVE;
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
+ FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
+ } else
+ FCB->PollState &= ~AFD_EVENT_RECEIVE;
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
@@ -624,12 +626,12 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
( FCB, Irp, DatagramRecv,
(PUINT)&Irp->IoStatus.Information );
- if( IsListEmpty( &FCB->DatagramList ) )
- FCB->PollState &= ~AFD_EVENT_RECEIVE;
- else
+ if( !IsListEmpty( &FCB->DatagramList ) ) {
FCB->PollState |= AFD_EVENT_RECEIVE;
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
+ FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
+ } else
+ FCB->PollState &= ~AFD_EVENT_RECEIVE;
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
@@ -640,12 +642,10 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
Status = STATUS_CANT_WAIT;
FCB->PollState &= ~AFD_EVENT_RECEIVE;
- PollReeval( FCB->DeviceExt, FCB->FileObject );
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
} else {
FCB->PollState &= ~AFD_EVENT_RECEIVE;
- PollReeval( FCB->DeviceExt, FCB->FileObject );
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_RECV );
}
}
diff --git a/drivers/network/afd/afd/select.c b/drivers/network/afd/afd/select.c
index 4cdbcdffb4a..dd334d343a8 100644
--- a/drivers/network/afd/afd/select.c
+++ b/drivers/network/afd/afd/select.c
@@ -296,8 +296,11 @@ AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
FCB->EventSelect = NULL;
else
FCB->EventSelectTriggers = EventSelectInfo->Events;
- } else
- Status = STATUS_INVALID_PARAMETER;
+ } else {
+ FCB->EventSelect = NULL;
+ FCB->EventSelectTriggers = 0;
+ Status = STATUS_SUCCESS;
+ }
AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
@@ -325,7 +328,9 @@ AfdEnumEvents( PDEVICE_OBJECT DeviceObject, PIRP Irp,
}
EnumReq->PollEvents = FCB->PollState;
- RtlZeroMemory( EnumReq->EventStatus, sizeof(EnumReq->EventStatus) );
+ RtlCopyMemory( EnumReq->EventStatus,
+ FCB->PollStatus,
+ sizeof(EnumReq->EventStatus) );
return UnlockAndMaybeComplete( FCB, STATUS_SUCCESS, Irp,
0 );
diff --git a/drivers/network/afd/afd/write.c b/drivers/network/afd/afd/write.c
index aa1c9e371a5..7506489be8e 100644
--- a/drivers/network/afd/afd/write.c
+++ b/drivers/network/afd/afd/write.c
@@ -142,10 +142,10 @@ static NTSTATUS NTAPI SendComplete
FCB );
} else {
FCB->PollState |= AFD_EVENT_SEND;
+ FCB->PollStatus[FD_WRITE_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
}
- PollReeval( FCB->DeviceExt, FCB->FileObject );
-
if( TotalBytesCopied > 0 ) {
UnlockBuffers( SendReq->BufferArray, SendReq->BufferCount, FALSE );
@@ -186,6 +186,7 @@ static NTSTATUS NTAPI PacketSocketSendComplete
/* Request is not in flight any longer */
FCB->PollState |= AFD_EVENT_SEND;
+ FCB->PollStatus[FD_WRITE_BIT] = STATUS_SUCCESS;
PollReeval( FCB->DeviceExt, FCB->FileObject );
if( FCB->State == SOCKET_STATE_CLOSED ) {
@@ -391,10 +392,6 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
- FCB->PollState &= ~AFD_EVENT_SEND;
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
-
/* Check that the socket is bound */
if( FCB->State != SOCKET_STATE_BOUND )
return UnlockAndMaybeComplete
@@ -425,6 +422,8 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
/* Check the size of the Address given ... */
if( NT_SUCCESS(Status) ) {
+ FCB->PollState &= ~AFD_EVENT_SEND;
+
Status = TdiSendDatagram
( &FCB->SendIrp.InFlightRequest,
FCB->AddressFile.Object,
diff --git a/drivers/network/afd/include/afd.h b/drivers/network/afd/include/afd.h
index 6b5e875ec9b..ac3a286cd6c 100644
--- a/drivers/network/afd/include/afd.h
+++ b/drivers/network/afd/include/afd.h
@@ -192,6 +192,7 @@ typedef struct _AFD_FCB {
UNICODE_STRING TdiDeviceName;
PVOID Context;
DWORD PollState;
+ NTSTATUS PollStatus[FD_MAX_EVENTS];
UINT ContextSize;
PVOID ConnectData;
UINT FilledConnectData;
diff --git a/drivers/network/ndis/ndis/memory.c b/drivers/network/ndis/ndis/memory.c
index 7696389e876..3d96170ea4c 100644
--- a/drivers/network/ndis/ndis/memory.c
+++ b/drivers/network/ndis/ndis/memory.c
@@ -171,6 +171,15 @@ NdisMAllocateSharedMemory(
NDIS_DbgPrint(MAX_TRACE,("Called.\n"));
+ if (KeGetCurrentIrql() != PASSIVE_LEVEL)
+ {
+ KeBugCheckEx(BUGCODE_ID_DRIVER,
+ (ULONG_PTR)MiniportAdapterHandle,
+ Length,
+ 0,
+ 1);
+ }
+
*VirtualAddress = Adapter->NdisMiniportBlock.SystemAdapterObject->DmaOperations->AllocateCommonBuffer(
Adapter->NdisMiniportBlock.SystemAdapterObject, Length, PhysicalAddress, Cached);
}
diff --git a/drivers/network/ndis/ndis/miniport.c b/drivers/network/ndis/ndis/miniport.c
index daaf7cac1b1..4492caffe32 100644
--- a/drivers/network/ndis/ndis/miniport.c
+++ b/drivers/network/ndis/ndis/miniport.c
@@ -365,6 +365,15 @@ MiniResetComplete(
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
+ if (Adapter->NdisMiniportBlock.ResetStatus != NDIS_STATUS_PENDING)
+ {
+ KeBugCheckEx(BUGCODE_ID_DRIVER,
+ (ULONG_PTR)MiniportAdapterHandle,
+ (ULONG_PTR)Status,
+ (ULONG_PTR)AddressingReset,
+ 0);
+ }
+
Adapter->NdisMiniportBlock.ResetStatus = Status;
CurrentEntry = Adapter->ProtocolListHead.Flink;
@@ -1959,6 +1968,22 @@ NdisIPnPStartDevice(
{
NDIS_DbgPrint(MIN_TRACE, ("MiniportInitialize() failed for an adapter.\n"));
ExInterlockedRemoveEntryList( &Adapter->ListEntry, &AdapterListLock );
+ if (Adapter->NdisMiniportBlock.Interrupt)
+ {
+ KeBugCheckEx(BUGCODE_ID_DRIVER,
+ (ULONG_PTR)Adapter,
+ (ULONG_PTR)Adapter->NdisMiniportBlock.Interrupt,
+ (ULONG_PTR)Adapter->NdisMiniportBlock.TimerQueue,
+ 1);
+ }
+ if (Adapter->NdisMiniportBlock.TimerQueue)
+ {
+ KeBugCheckEx(BUGCODE_ID_DRIVER,
+ (ULONG_PTR)Adapter,
+ (ULONG_PTR)Adapter->NdisMiniportBlock.Interrupt,
+ (ULONG_PTR)Adapter->NdisMiniportBlock.TimerQueue,
+ 1);
+ }
return NdisStatus;
}
diff --git a/drivers/network/ndis/ndis/time.c b/drivers/network/ndis/ndis/time.c
index 75a65f3b24f..0e8cdd46473 100644
--- a/drivers/network/ndis/ndis/time.c
+++ b/drivers/network/ndis/ndis/time.c
@@ -95,6 +95,38 @@ NdisInitializeTimer(
KeInitializeDpc (&Timer->Dpc, (PKDEFERRED_ROUTINE)TimerFunction, FunctionContext);
}
+BOOLEAN DequeueMiniportTimer(PNDIS_MINIPORT_TIMER Timer)
+{
+ PNDIS_MINIPORT_TIMER CurrentTimer;
+
+ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+
+ if (!Timer->Miniport->TimerQueue)
+ return FALSE;
+
+ if (Timer->Miniport->TimerQueue == Timer)
+ {
+ Timer->Miniport->TimerQueue = Timer->NextDeferredTimer;
+ Timer->NextDeferredTimer = NULL;
+ return TRUE;
+ }
+ else
+ {
+ CurrentTimer = Timer->Miniport->TimerQueue;
+ while (CurrentTimer->NextDeferredTimer)
+ {
+ if (CurrentTimer->NextDeferredTimer == Timer)
+ {
+ CurrentTimer->NextDeferredTimer = Timer->NextDeferredTimer;
+ Timer->NextDeferredTimer = NULL;
+ return TRUE;
+ }
+ CurrentTimer = CurrentTimer->NextDeferredTimer;
+ }
+ return FALSE;
+ }
+}
+
/*
* @implemented
@@ -113,11 +145,44 @@ NdisMCancelTimer(
* - call at IRQL <= DISPATCH_LEVEL
*/
{
+ KIRQL OldIrql;
+
ASSERT_IRQL(DISPATCH_LEVEL);
ASSERT(TimerCancelled);
ASSERT(Timer);
*TimerCancelled = KeCancelTimer (&Timer->Timer);
+
+ if (*TimerCancelled)
+ {
+ KeAcquireSpinLock(&Timer->Miniport->Lock, &OldIrql);
+ /* If it's somebody already dequeued it, something is wrong (maybe a double-cancel?) */
+ if (!DequeueMiniportTimer(Timer)) ASSERT(FALSE);
+ KeReleaseSpinLock(&Timer->Miniport->Lock, OldIrql);
+ }
+}
+
+VOID NTAPI
+MiniTimerDpcFunction(PKDPC Dpc,
+ PVOID DeferredContext,
+ PVOID SystemArgument1,
+ PVOID SystemArgument2)
+{
+ PNDIS_MINIPORT_TIMER Timer = DeferredContext;
+
+ Timer->MiniportTimerFunction(Dpc,
+ Timer->MiniportTimerContext,
+ SystemArgument1,
+ SystemArgument2);
+
+ /* Only dequeue if the timer has a period of 0 */
+ if (!Timer->Timer.Period)
+ {
+ KeAcquireSpinLockAtDpcLevel(&Timer->Miniport->Lock);
+ /* If someone already dequeued it, something is wrong (borked timer implementation?) */
+ if (!DequeueMiniportTimer(Timer)) ASSERT(FALSE);
+ KeReleaseSpinLockFromDpcLevel(&Timer->Miniport->Lock);
+ }
}
@@ -145,9 +210,14 @@ NdisMInitializeTimer(
{
PAGED_CODE();
ASSERT(Timer);
- KeInitializeTimer (&Timer->Timer);
- KeInitializeDpc (&Timer->Dpc, (PKDEFERRED_ROUTINE)TimerFunction, FunctionContext);
+ KeInitializeTimer (&Timer->Timer);
+ KeInitializeDpc (&Timer->Dpc, MiniTimerDpcFunction, Timer);
+
+ Timer->MiniportTimerFunction = TimerFunction;
+ Timer->MiniportTimerContext = FunctionContext;
+ Timer->Miniport = &((PLOGICAL_ADAPTER)MiniportAdapterHandle)->NdisMiniportBlock;
+ Timer->NextDeferredTimer = NULL;
}
@@ -170,6 +240,7 @@ NdisMSetPeriodicTimer(
*/
{
LARGE_INTEGER Timeout;
+ KIRQL OldIrql;
ASSERT_IRQL(DISPATCH_LEVEL);
ASSERT(Timer);
@@ -177,7 +248,15 @@ NdisMSetPeriodicTimer(
/* relative delays are negative, absolute are positive; resolution is 100ns */
Timeout.QuadPart = Int32x32To64(MillisecondsPeriod, -10000);
- KeSetTimerEx (&Timer->Timer, Timeout, MillisecondsPeriod, &Timer->Dpc);
+ KeAcquireSpinLock(&Timer->Miniport->Lock, &OldIrql);
+ /* If KeSetTimer(Ex) returns FALSE then the timer is not in the system's queue (and not in ours either) */
+ if (!KeSetTimerEx(&Timer->Timer, Timeout, MillisecondsPeriod, &Timer->Dpc))
+ {
+ /* Add the timer at the head of the timer queue */
+ Timer->NextDeferredTimer = Timer->Miniport->TimerQueue;
+ Timer->Miniport->TimerQueue = Timer;
+ }
+ KeReleaseSpinLock(&Timer->Miniport->Lock, OldIrql);
}
@@ -201,6 +280,7 @@ NdisMSetTimer(
*/
{
LARGE_INTEGER Timeout;
+ KIRQL OldIrql;
ASSERT_IRQL(DISPATCH_LEVEL);
ASSERT(Timer);
@@ -208,7 +288,15 @@ NdisMSetTimer(
/* relative delays are negative, absolute are positive; resolution is 100ns */
Timeout.QuadPart = Int32x32To64(MillisecondsToDelay, -10000);
- KeSetTimer (&Timer->Timer, Timeout, &Timer->Dpc);
+ KeAcquireSpinLock(&Timer->Miniport->Lock, &OldIrql);
+ /* If KeSetTimer(Ex) returns FALSE then the timer is not in the system's queue (and not in ours either) */
+ if (!KeSetTimer(&Timer->Timer, Timeout, &Timer->Dpc))
+ {
+ /* Add the timer at the head of the timer queue */
+ Timer->NextDeferredTimer = Timer->Miniport->TimerQueue;
+ Timer->Miniport->TimerQueue = Timer;
+ }
+ KeReleaseSpinLock(&Timer->Miniport->Lock, OldIrql);
}
diff --git a/drivers/network/tcpip/tcpip/fileobjs.c b/drivers/network/tcpip/tcpip/fileobjs.c
index bd7968e5ede..70357fced9a 100644
--- a/drivers/network/tcpip/tcpip/fileobjs.c
+++ b/drivers/network/tcpip/tcpip/fileobjs.c
@@ -265,7 +265,7 @@ NTSTATUS FileOpenAddress(
!AddrLocateInterface(&AddrFile->Address)) {
ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
TI_DbgPrint(MIN_TRACE, ("Non-local address given (0x%X).\n", A2S(&AddrFile->Address)));
- return STATUS_INVALID_PARAMETER;
+ return STATUS_INVALID_ADDRESS;
}
TI_DbgPrint(MID_TRACE, ("Opening address %s for communication (P=%d U=%d).\n",
@@ -282,7 +282,7 @@ NTSTATUS FileOpenAddress(
AddrFile->Port == 0xffff)
{
ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
- return STATUS_INVALID_PARAMETER;
+ return STATUS_ADDRESS_ALREADY_EXISTS;
}
AddEntity(CO_TL_ENTITY, AddrFile, CO_TL_TCP);
@@ -300,7 +300,7 @@ NTSTATUS FileOpenAddress(
AddrFile->Port == 0xffff)
{
ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
- return STATUS_INVALID_PARAMETER;
+ return STATUS_ADDRESS_ALREADY_EXISTS;
}
TI_DbgPrint(MID_TRACE,("Setting port %d (wanted %d)\n",
diff --git a/drivers/wdm/audio/drivers/CMIDriver/adapter.cpp b/drivers/wdm/audio/drivers/CMIDriver/adapter.cpp
index edf88bf746e..a3d884dc912 100644
--- a/drivers/wdm/audio/drivers/CMIDriver/adapter.cpp
+++ b/drivers/wdm/audio/drivers/CMIDriver/adapter.cpp
@@ -29,7 +29,9 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include "adapter.hpp"
-//#pragma code_seg("PAGE")
+#ifdef _MSC_VER
+//#pragma code_seg("PAGE") // GCC ignores pragma code_seg
+#endif
const GUID KSNODETYPE_DAC = {0x507AE360L, 0xC554, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
const GUID KSNODETYPE_ADC = {0x4D837FE0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
@@ -267,7 +269,9 @@ NTSTATUS StartDevice(PDEVICE_OBJECT DeviceObject, PIRP Irp, PRESOURCELIST Resour
PUNKNOWN unknownTopology = NULL;
// install the topology miniport.
- ntStatus = InstallSubdevice(DeviceObject, Irp, L"Topology", CLSID_PortTopology, CLSID_PortTopology, CreateMiniportTopologyCMI, pCMIAdapter, NULL, GUID_NULL, &unknownTopology);
+ ntStatus = InstallSubdevice( DeviceObject, Irp, (PWCHAR) L"Topology",
+ CLSID_PortTopology, CLSID_PortTopology, CreateMiniportTopologyCMI,
+ pCMIAdapter, NULL, GUID_NULL, &unknownTopology );
if (!NT_SUCCESS (ntStatus)) {
DBGPRINT(("Topology miniport installation failed"));
return ntStatus;
@@ -277,7 +281,7 @@ NTSTATUS StartDevice(PDEVICE_OBJECT DeviceObject, PIRP Irp, PRESOURCELIST Resour
// install the UART miniport - execution order important
ntStatus = STATUS_UNSUCCESSFUL;
MPUBase = 0;
- for (int i=0;iNumberOfPorts();i++) {
+ for ( UINT i=0; i < ResourceList->NumberOfPorts(); i++ ) {
if (ResourceList->FindTranslatedPort(i)->u.Port.Length == 2) {
MPUBase = (UInt32*)ResourceList->FindTranslatedPort(i)->u.Port.Start.QuadPart;
}
@@ -285,7 +289,10 @@ NTSTATUS StartDevice(PDEVICE_OBJECT DeviceObject, PIRP Irp, PRESOURCELIST Resour
if (MPUBase != 0) {
ntStatus = pCMIAdapter->activateMPU(MPUBase);
if (NT_SUCCESS(ntStatus)) {
- ntStatus = InstallSubdevice(DeviceObject, Irp, L"Uart", CLSID_PortDMus, CLSID_MiniportDriverDMusUART, NULL, pCMIAdapter->getInterruptSync(), UartResourceList, IID_IPortDMus, NULL);
+ ntStatus = InstallSubdevice( DeviceObject, Irp, (PWCHAR) L"Uart",
+ CLSID_PortDMus, CLSID_MiniportDriverDMusUART, NULL,
+ pCMIAdapter->getInterruptSync(), UartResourceList,
+ IID_IPortDMus, NULL );
}
}
if (!NT_SUCCESS(ntStatus)) {
@@ -300,9 +307,13 @@ NTSTATUS StartDevice(PDEVICE_OBJECT DeviceObject, PIRP Irp, PRESOURCELIST Resour
// install the wave miniport - the order matters here
#ifdef WAVERT
- ntStatus = InstallSubdevice(DeviceObject, Irp, L"Wave", CLSID_PortWaveRT, CLSID_PortWaveRT, CreateMiniportWaveCMI, pCMIAdapter, ResourceList, IID_IPortWaveRT, &unknownWave);
+ ntStatus = InstallSubdevice(DeviceObject, Irp, (PWCHAR) L"Wave",
+ CLSID_PortWaveRT, CLSID_PortWaveRT, CreateMiniportWaveCMI,
+ pCMIAdapter, ResourceList, IID_IPortWaveRT, &unknownWave );
#else
- ntStatus = InstallSubdevice(DeviceObject, Irp, L"Wave", CLSID_PortWaveCyclic, CLSID_PortWaveCyclic, CreateMiniportWaveCMI, pCMIAdapter, ResourceList, IID_IPortWaveCyclic, &unknownWave);
+ ntStatus = InstallSubdevice(DeviceObject, Irp, (PWCHAR) L"Wave",
+ CLSID_PortWaveCyclic, CLSID_PortWaveCyclic, CreateMiniportWaveCMI,
+ pCMIAdapter, ResourceList, IID_IPortWaveCyclic, &unknownWave );
#endif
if (!NT_SUCCESS(ntStatus)) {
DBGPRINT(("Wave miniport installation failed"));
@@ -449,8 +460,10 @@ AdapterDispatchPnp(
resourceList->List[0].Count = 0;
// copy the resources which have already been assigned
- for (int i=0;iList[0].Count;i++) {
- if (CopyResourceDescriptor(&list->List[0].Descriptors[i], &resourceList->List[0].Descriptors[resourceList->List[0].Count])) {
+ for ( UINT i=0; i < list->List[0].Count; i++ ) {
+ if (CopyResourceDescriptor( &list->List[0].Descriptors[i],
+ &resourceList->List[0].Descriptors[resourceList->List[0].Count] ))
+ {
resourceList->List[0].Count++;
}
}
diff --git a/drivers/wdm/audio/drivers/CMIDriver/common.cpp b/drivers/wdm/audio/drivers/CMIDriver/common.cpp
index 260f51d62e2..dc2b62ac55e 100644
--- a/drivers/wdm/audio/drivers/CMIDriver/common.cpp
+++ b/drivers/wdm/audio/drivers/CMIDriver/common.cpp
@@ -27,7 +27,9 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "common.hpp"
-#pragma code_seg("PAGE")
+#ifdef _MSC_VER
+#pragma code_seg("PAGE") /* warning - ignored by GCC compiler */
+#endif
NTSTATUS
NewCMIAdapter(
@@ -63,7 +65,7 @@ STDMETHODIMP_(NTSTATUS) CCMIAdapter::init(PRESOURCELIST ResourceList, PDEVICE_OB
DeviceObject = aDeviceObject;
cm.IOBase = 0;
- for (int i=0;iNumberOfPorts();i++) {
+ for ( UINT i=0; i < ResourceList->NumberOfPorts(); i++ ) {
if (ResourceList->FindTranslatedPort(i)->u.Port.Length == 0x100) {
cm.IOBase = (UInt32*)ResourceList->FindTranslatedPort(i)->u.Port.Start.QuadPart;
}
@@ -357,7 +359,7 @@ STDMETHODIMP_(NTSTATUS) CCMIAdapter::loadSBMixerFromMemory()
//PAGED_CODE();
DBGPRINT(("CCMIAdapter[%p]::loadSBMixerFromMemory()", this));
#endif
- for (int i = 0; i<(sizeof(sbIndex)/sizeof(sbIndex[0]));i++) {
+ for ( UINT i = 0; i < (sizeof(sbIndex)/sizeof(sbIndex[0])); i++ ) {
writeUInt8(REG_SBINDEX, sbIndex[i]);
writeUInt8(REG_SBDATA, mixerCache[i]);
}
@@ -368,7 +370,9 @@ STDMETHODIMP_(NTSTATUS) CCMIAdapter::loadSBMixerFromMemory()
/*
** non-paged code below
*/
-#pragma code_seg()
+#ifdef _MSC_VER
+#pragma code_seg() /* warning - ignored by GCC compiler */
+#endif
STDMETHODIMP_(UInt8) CCMIAdapter::readUInt8(UInt8 reg)
{
diff --git a/drivers/wdm/audio/drivers/CMIDriver/mintopo.cpp b/drivers/wdm/audio/drivers/CMIDriver/mintopo.cpp
index 23584dd1dcd..283dc2b071f 100644
--- a/drivers/wdm/audio/drivers/CMIDriver/mintopo.cpp
+++ b/drivers/wdm/audio/drivers/CMIDriver/mintopo.cpp
@@ -31,7 +31,9 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define NTSTRSAFE_LIB //for Windows 2000 compatibility
#include "ntstrsafe.h"
-#pragma code_seg("PAGE")
+#ifdef _MSC_VER
+#pragma code_seg("PAGE") /* warning - ignored by GCC compiler */
+#endif
const GUID KSPROPSETID_CMI = {0x2B81CDBB, 0xEE6C, 0x4ECC, {0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xFF}};
@@ -173,7 +175,7 @@ STDMETHODIMP CCMITopology::loadMixerSettingsFromRegistry()
PropertyRequest.ValueSize = sizeof(DWORD);
PropertyRequest.PropertyItem = &PropertyItem;
- for (int i=0;i < SIZEOF_ARRAY(TopologyNodes); i++) {
+ for ( UINT i=0; i < SIZEOF_ARRAY(TopologyNodes); i++ ) {
PropertyRequest.Node = i;
Channel = CHAN_LEFT;
@@ -310,7 +312,7 @@ STDMETHODIMP CCMITopology::storeMixerSettingsToRegistry()
PropertyRequest.ValueSize = sizeof(DWORD);
PropertyRequest.PropertyItem = &PropertyItem;
- for (int i=0;i < SIZEOF_ARRAY(TopologyNodes); i++) {
+ for ( UINT i=0; i < SIZEOF_ARRAY(TopologyNodes); i++ ) {
PropertyRequest.Node = i;
if (IsEqualGUIDAligned(*(TopologyNodes[i].Type), KSNODETYPE_VOLUME)) {
PropertyRequest.Node = i;
@@ -473,7 +475,8 @@ NTSTATUS NTAPI PropertyHandler_OnOff(PPCPROPERTY_REQUEST PropertyRequest)
CCMITopology *that = (CCMITopology *) ((PMINIPORTTOPOLOGY) PropertyRequest->MajorTarget);
NTSTATUS ntStatus = STATUS_INVALID_PARAMETER;
- UInt8 data, mask, reg;
+ //UInt8 data, mask, reg;
+ UInt8 mask, reg;
LONG channel;
if (PropertyRequest->Node == ULONG(-1)) {
@@ -1042,7 +1045,7 @@ static NTSTATUS BasicSupportHandler(PPCPROPERTY_REQUEST PropertyRequest)
PKSPROPERTY_STEPPING_LONG Range = PKSPROPERTY_STEPPING_LONG(Members + 1);
- for (int i=0;iNode) {
Range->Bounds.SignedMaximum = (VolTable[i].max << 16);
Range->Bounds.SignedMinimum = (VolTable[i].min << 16);
@@ -1110,7 +1113,7 @@ NTSTATUS NTAPI PropertyHandler_Level(PPCPROPERTY_REQUEST PropertyRequest)
PLONG Level = (PLONG)PropertyRequest->Value;
- for (int i=0;iNode) {
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
diff --git a/drivers/wdm/audio/drivers/CMIDriver/mintopotables.hpp b/drivers/wdm/audio/drivers/CMIDriver/mintopotables.hpp
index dce93b1cf44..182b4e6d97f 100644
--- a/drivers/wdm/audio/drivers/CMIDriver/mintopotables.hpp
+++ b/drivers/wdm/audio/drivers/CMIDriver/mintopotables.hpp
@@ -35,7 +35,8 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define STATIC_KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF\
DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DOLBY_AC3_SPDIF)
DEFINE_GUIDSTRUCT("00000092-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF);
-#define KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF)
+#define KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF DEFINE_GUIDNAMED( KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF )
+/* Warning - Recursive #define for KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF */
#endif
#endif
@@ -47,15 +48,17 @@ NTSTATUS NTAPI PropertyHandler_Private(PPCPROPERTY_REQUEST PropertyRequest);
static KSDATARANGE PinDataRangesBridge[] =
{
- {
- sizeof(KSDATARANGE),
- 0,
- 0,
- 0,
- STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG),
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
- }
+ {
+ {
+ sizeof(KSDATARANGE),
+ 0,
+ 0,
+ 0,
+ { STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG) },
+ { STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE) }
+ }
+ }
};
static PKSDATARANGE PinDataRangePointersBridge[] =
@@ -65,14 +68,16 @@ static PKSDATARANGE PinDataRangePointersBridge[] =
static KSDATARANGE WavePinDataRangesAC3Bridge[] =
{
- {
- sizeof(KSDATARANGE),
- 0,
- 0,
- 0,
- STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SUBTYPE_AC3_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
+ {
+ {
+ sizeof(KSDATARANGE),
+ 0,
+ 0,
+ 0,
+ { STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SUBTYPE_AC3_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE) }
+ }
}
};
@@ -98,7 +103,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSCATEGORY_AUDIO, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -117,7 +122,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_SPDIF_INTERFACE, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -136,7 +141,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_MICROPHONE, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -155,7 +160,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_CD_PLAYER, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -174,7 +179,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_LINE_CONNECTOR, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -193,7 +198,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_ANALOG_CONNECTOR, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -212,7 +217,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_ANALOG_CONNECTOR, // Category
&CMINAME_DAC, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -231,7 +236,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_SPEAKER, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -250,7 +255,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSCATEGORY_AUDIO, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -269,7 +274,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSCATEGORY_AUDIO, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -288,7 +293,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
NULL, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
}
};
diff --git a/drivers/wdm/audio/drivers/CMIDriver/minwave.cpp b/drivers/wdm/audio/drivers/CMIDriver/minwave.cpp
index 4a0477133d5..5152d863e57 100644
--- a/drivers/wdm/audio/drivers/CMIDriver/minwave.cpp
+++ b/drivers/wdm/audio/drivers/CMIDriver/minwave.cpp
@@ -29,7 +29,9 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "minwavetables.hpp"
#include "ntddk.h"
-#pragma code_seg("PAGE")
+#ifdef _MSC_VER
+#pragma code_seg("PAGE") /* warning - ignored by GCC compiler */
+#endif
HRESULT NTAPI CreateMiniportWaveCMI(PUNKNOWN *Unknown, REFCLSID, PUNKNOWN UnknownOuter, POOL_TYPE PoolType)
{
@@ -233,7 +235,8 @@ NTSTATUS CMiniportWaveCMI::loadChannelConfigFromRegistry()
PREGISTRYKEY DriverKey;
PREGISTRYKEY SettingsKey;
UNICODE_STRING KeyName;
- DWORD Value, ResultLength;
+ //DWORD Value, ResultLength;
+ DWORD ResultLength;
PVOID KeyInfo;
DBGPRINT(("CMiniportWaveCMI::loadChannelConfigFromRegistry()"));
@@ -418,12 +421,12 @@ NTSTATUS CMiniportWaveCMI::validateFormat(PKSDATAFORMAT format, ULONG PinID, BOO
DBGPRINT(("---channels: %d, resolution: %d, sample rate: %d, pin: %d, formatMask: %x", waveFormat->nChannels, waveFormat->wBitsPerSample, waveFormat->nSamplesPerSec, PinID, cm->formatMask));
//WaveFormatEx
- if ( ( format->FormatSize >= sizeof(KSDATAFORMAT_WAVEFORMATEX))
+ if ( ( (size_t) format->FormatSize >= sizeof(KSDATAFORMAT_WAVEFORMATEX))
&& IsEqualGUIDAligned(format->MajorFormat,KSDATAFORMAT_TYPE_AUDIO)
&& IsEqualGUIDAligned(format->Specifier,KSDATAFORMAT_SPECIFIER_WAVEFORMATEX) ) {
switch (EXTRACT_WAVEFORMATEX_ID(&format->SubFormat)) {
case WAVE_FORMAT_PCM:
- if ((PinID != PIN_WAVE_RENDER_SINK) && (PinID != PIN_WAVE_CAPTURE_SOURCE) && (PinID != -1)) {
+ if ((PinID != PIN_WAVE_RENDER_SINK) && (PinID != PIN_WAVE_CAPTURE_SOURCE) && ((int)PinID != -1)) {
if ((PinID == PIN_WAVE_AC3_RENDER_SINK) && !IoIsWdmVersionAvailable(6,0)) {
return STATUS_INVALID_PARAMETER;
}
@@ -438,10 +441,10 @@ NTSTATUS CMiniportWaveCMI::validateFormat(PKSDATAFORMAT format, ULONG PinID, BOO
return isFormatAllowed(waveFormat->nSamplesPerSec, FALSE, FALSE);
}
if ( (waveFormat->wBitsPerSample == 16)
- && ((waveFormat->nChannels >= 4) && (waveFormat->nChannels <= cm->maxChannels))
+ && ((waveFormat->nChannels >= 4) && (waveFormat->nChannels <= (WORD) cm->maxChannels))
&& ((waveFormat->nSamplesPerSec == 44100) || (waveFormat->nSamplesPerSec == 48000)) ) {
#if OUT_CHANNEL == 1
- if ((PinID == PIN_WAVE_RENDER_SINK) || (PinID == -1)) {
+ if ((PinID == PIN_WAVE_RENDER_SINK) || ((int)PinID == -1)) {
return isFormatAllowed(waveFormat->nSamplesPerSec, TRUE, FALSE);
}
#else
@@ -450,7 +453,7 @@ NTSTATUS CMiniportWaveCMI::validateFormat(PKSDATAFORMAT format, ULONG PinID, BOO
}
break;
case WAVE_FORMAT_DOLBY_AC3_SPDIF:
- if ((PinID != PIN_WAVE_AC3_RENDER_SINK) && (PinID != -1)) {
+ if ((PinID != PIN_WAVE_AC3_RENDER_SINK) && ((int)PinID != -1)) {
return STATUS_INVALID_PARAMETER;
}
if ( ((waveFormat->wBitsPerSample >= MIN_BITS_PER_SAMPLE_AC3) && (waveFormat->wBitsPerSample <= MAX_BITS_PER_SAMPLE_AC3))
@@ -907,7 +910,7 @@ NTSTATUS CMiniportWaveStreamCMI::prepareStream()
DBGPRINT(("---streamIndex: %d, channelNumber: %d", streamIndex, channelNumber));
NTSTATUS ntStatus;
- UInt8 reg;
+ //UInt8 reg;
UInt32 val;
if (state == KSSTATE_RUN) {
@@ -990,7 +993,7 @@ NTSTATUS CMiniportWaveStreamCMI::setDACChannels()
NTSTATUS ntStatus = STATUS_SUCCESS;
if (currentChannelCount > 2) {
- if (Miniport->cm->maxChannels < currentChannelCount) {
+ if ((WORD) Miniport->cm->maxChannels < currentChannelCount ) {
return STATUS_INVALID_DEVICE_REQUEST;
}
if ((currentResolution != 16) || (currentChannelCount < 2)) {
@@ -1052,7 +1055,7 @@ NTSTATUS CMiniportWaveStreamCMI::setupSPDIFPlayback(bool enableSPDIF)
//PAGED_CODE();
DBGPRINT(("CMiniportWaveStreamCMI[%p]::setupSPDIFPlayback(%d)", this, enableSPDIF));
- NTSTATUS ntStatus;
+ //NTSTATUS ntStatus;
KeWaitForSingleObject(&Miniport->mutex, Executive, KernelMode, false, NULL);
@@ -1434,7 +1437,9 @@ STDMETHODIMP_(NTSTATUS) CMiniportWaveStreamCMI::GetClockRegister(PKSRTAUDIO_HWRE
/*
** non-paged code below
*/
-#pragma code_seg()
+#ifdef _MSC_VER
+#pragma code_seg() /* warning - ignored by GCC compiler */
+#endif
STDMETHODIMP CMiniportWaveStreamCMI::SetState(KSSTATE NewState)
{
@@ -1461,7 +1466,9 @@ STDMETHODIMP CMiniportWaveStreamCMI::SetState(KSSTATE NewState)
// STOP -> ACQUIRE -> PAUSE -> PLAY -> PAUSE -> ACQUIRE -> STOP
if (state != NewState) {
- switch (NewState) {
+ switch ((UINT) NewState) {
+ // LN: The cast on NewState is to satisfy the compiler about
+ // KSSTATE_STOP_AC3, which is not in the original enum KSSTATE.
case KSSTATE_ACQUIRE:
DBGPRINT(("---KSSTATE_ACQUIRE: previous state: %d", state));
if (state == KSSTATE_PAUSE) {
diff --git a/drivers/wdm/audio/drivers/CMIDriver/minwavetables.hpp b/drivers/wdm/audio/drivers/CMIDriver/minwavetables.hpp
index 0c0326ca21c..8f44c5a977d 100644
--- a/drivers/wdm/audio/drivers/CMIDriver/minwavetables.hpp
+++ b/drivers/wdm/audio/drivers/CMIDriver/minwavetables.hpp
@@ -31,23 +31,23 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define STATIC_KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF\
DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DOLBY_AC3_SPDIF)
DEFINE_GUIDSTRUCT("00000092-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF);
-#define KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF)
+#define KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF)
+/* Warning - Recursive #define for KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF */
NTSTATUS NTAPI PropertyHandler_ChannelConfig(PPCPROPERTY_REQUEST PropertyRequest);
-
static KSDATARANGE_AUDIO WavePinDataRangesPCMStream[] =
{
{
- {
+ {{
sizeof(KSDATARANGE_AUDIO),
0,
0,
0,
- STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
- },
+ { STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM) },
+ { STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX) }
+ }},
MAX_CHANNELS_PCM,
MIN_BITS_PER_SAMPLE_PCM,
MAX_BITS_PER_SAMPLE_PCM,
@@ -59,15 +59,15 @@ static KSDATARANGE_AUDIO WavePinDataRangesPCMStream[] =
static KSDATARANGE_AUDIO WavePinDataRangesAC3Stream[] =
{
{
- {
+ {{
sizeof(KSDATARANGE_AUDIO),
0,
0,
0,
- STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF),
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
- },
+ { STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF) },
+ { STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX) }
+ }},
MAX_CHANNELS_AC3,
MIN_BITS_PER_SAMPLE_AC3,
MAX_BITS_PER_SAMPLE_AC3,
@@ -75,15 +75,15 @@ static KSDATARANGE_AUDIO WavePinDataRangesAC3Stream[] =
MAX_SAMPLE_RATE_AC3
},
{
- {
+ {{
sizeof(KSDATARANGE_AUDIO),
0,
0,
0,
- STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF),
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_DSOUND)
- },
+ { STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF) },
+ { STATICGUIDOF(KSDATAFORMAT_SPECIFIER_DSOUND) }
+ }},
MAX_CHANNELS_AC3,
MIN_BITS_PER_SAMPLE_AC3,
MAX_BITS_PER_SAMPLE_AC3,
@@ -107,28 +107,28 @@ static PKSDATARANGE WavePinDataRangePointersAC3Stream[] =
static KSDATARANGE WavePinDataRangesPCMBridge[] =
{
- {
+ {{
sizeof(KSDATARANGE),
0,
0,
0,
- STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG),
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
- }
+ { STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG) },
+ { STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE) }
+ }}
};
static KSDATARANGE WavePinDataRangesAC3Bridge[] =
{
- {
+ {{
sizeof(KSDATARANGE),
0,
0,
0,
- STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SUBTYPE_AC3_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
- }
+ { STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SUBTYPE_AC3_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE) }
+ }}
};
static PKSDATARANGE WavePinDataRangePointersPCMBridge[] =
@@ -160,7 +160,7 @@ static PCPIN_DESCRIPTOR WaveMiniportPins[] =
KSPIN_COMMUNICATION_SINK,
&KSCATEGORY_AUDIO,
&KSAUDFNAME_RECORDING_CONTROL,
- 0
+ { 0 }
}
},
@@ -181,7 +181,7 @@ static PCPIN_DESCRIPTOR WaveMiniportPins[] =
KSPIN_COMMUNICATION_NONE,
&KSCATEGORY_AUDIO,
NULL,
- 0
+ { 0 }
}
},
@@ -202,7 +202,7 @@ static PCPIN_DESCRIPTOR WaveMiniportPins[] =
KSPIN_COMMUNICATION_SINK,
&KSCATEGORY_AUDIO,
&KSAUDFNAME_VOLUME_CONTROL,
- 0
+ { 0 }
}
},
@@ -223,7 +223,7 @@ static PCPIN_DESCRIPTOR WaveMiniportPins[] =
KSPIN_COMMUNICATION_NONE,
&KSNODETYPE_SPEAKER,
NULL,
- 0
+ { 0 }
}
},
@@ -244,7 +244,7 @@ static PCPIN_DESCRIPTOR WaveMiniportPins[] =
KSPIN_COMMUNICATION_SINK,
&KSCATEGORY_AUDIO,
NULL,
- 0
+ { 0 }
}
},
@@ -266,7 +266,7 @@ static PCPIN_DESCRIPTOR WaveMiniportPins[] =
KSPIN_COMMUNICATION_NONE,
&KSNODETYPE_SPDIF_INTERFACE,
NULL,
- 0
+ { 0 }
}
}
};
diff --git a/hal/halx86/amd64/halinit.c b/hal/halx86/amd64/halinit.c
new file mode 100644
index 00000000000..b9b305126d3
--- /dev/null
+++ b/hal/halx86/amd64/halinit.c
@@ -0,0 +1,31 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: hal/halx86/amd64/halinit.c
+ * PURPOSE: HAL Entrypoint and Initialization
+ * PROGRAMMERS:
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+/* GLOBALS *******************************************************************/
+
+/* PRIVATE FUNCTIONS *********************************************************/
+
+/* FUNCTIONS *****************************************************************/
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+HalInitSystem(IN ULONG BootPhase,
+ IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+ UNIMPLEMENTED;
+ return FALSE;
+}
diff --git a/hal/halx86/mp/amd64/mps.S b/hal/halx86/amd64/mps.S
similarity index 100%
rename from hal/halx86/mp/amd64/mps.S
rename to hal/halx86/amd64/mps.S
diff --git a/hal/halx86/amd64/processor.c b/hal/halx86/amd64/processor.c
new file mode 100644
index 00000000000..255f50b8bf0
--- /dev/null
+++ b/hal/halx86/amd64/processor.c
@@ -0,0 +1,97 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: hal/halx86/amd64/processor.c
+ * PURPOSE: HAL Processor Routines
+ * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+KAFFINITY HalpActiveProcessors;
+KAFFINITY HalpDefaultInterruptAffinity;
+
+/* PRIVATE FUNCTIONS *********************************************************/
+
+VOID
+NTAPI
+HaliHaltSystem(VOID)
+{
+ /* Disable interrupts and halt the CPU */
+ _disable();
+ __halt();
+}
+
+/* FUNCTIONS *****************************************************************/
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalInitializeProcessor(IN ULONG ProcessorNumber,
+ IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+ /* Set default stall count */
+ KeGetPcr()->StallScaleFactor = INITIAL_STALL_COUNT;
+
+ /* Update the interrupt affinity and processor mask */
+ InterlockedBitTestAndSet((PLONG)&HalpActiveProcessors, ProcessorNumber);
+ InterlockedBitTestAndSet((PLONG)&HalpDefaultInterruptAffinity,
+ ProcessorNumber);
+
+ /* Register routines for KDCOM */
+ //HalpRegisterKdSupportFunctions();
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+HalAllProcessorsStarted(VOID)
+{
+ /* Do nothing */
+ return TRUE;
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+HalStartNextProcessor(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
+ IN PKPROCESSOR_STATE ProcessorState)
+{
+ /* Ready to start */
+ return FALSE;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalProcessorIdle(VOID)
+{
+ /* Enable interrupts and halt the processor */
+ _enable();
+ __halt();
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalRequestIpi(KAFFINITY TargetProcessors)
+{
+ UNIMPLEMENTED;
+ __debugbreak();
+}
+
+/* EOF */
diff --git a/hal/halx86/amd64/stubs.c b/hal/halx86/amd64/stubs.c
new file mode 100644
index 00000000000..ee295d17944
--- /dev/null
+++ b/hal/halx86/amd64/stubs.c
@@ -0,0 +1,97 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING.ARM in the top level directory
+ * FILE: hal/halx86/amd64/stubs.c
+ * PURPOSE: HAL stubs
+ * PROGRAMMERS:
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+/* GLOBALS ********************************************************************/
+
+LARGE_INTEGER HalpPerformanceFrequency;
+
+
+/* FUNCTIONS ******************************************************************/
+
+VOID
+FASTCALL
+HalClearSoftwareInterrupt(
+ IN KIRQL Irql)
+{
+ UNIMPLEMENTED;
+}
+
+VOID
+FASTCALL
+HalRequestSoftwareInterrupt(
+ IN KIRQL Irql)
+{
+ UNIMPLEMENTED;
+}
+
+BOOLEAN
+NTAPI
+HalBeginSystemInterrupt(
+ IN KIRQL Irql,
+ IN UCHAR Vector,
+ OUT PKIRQL OldIrql)
+{
+ UNIMPLEMENTED;
+ return FALSE;
+}
+
+BOOLEAN
+NTAPI
+HalEnableSystemInterrupt(
+ IN UCHAR Vector,
+ IN KIRQL Irql,
+ IN KINTERRUPT_MODE InterruptMode)
+{
+ UNIMPLEMENTED;
+ return FALSE;
+}
+
+VOID
+NTAPI
+HalDisableSystemInterrupt(
+ IN UCHAR Vector,
+ IN KIRQL Irql)
+{
+ UNIMPLEMENTED;
+}
+
+VOID
+NTAPI
+HalEndSystemInterrupt(
+ IN KIRQL OldIrql,
+ IN PKTRAP_FRAME TrapFrame)
+{
+ UNIMPLEMENTED;
+}
+
+LARGE_INTEGER
+NTAPI
+KeQueryPerformanceCounter(
+ OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL)
+{
+ LARGE_INTEGER Result;
+
+// ASSERT(HalpPerformanceFrequency.QuadPart != 0);
+
+ /* Does the caller want the frequency? */
+ if (PerformanceFrequency)
+ {
+ /* Return value */
+ *PerformanceFrequency = HalpPerformanceFrequency;
+ }
+
+ Result.QuadPart = __rdtsc();
+ return Result;
+}
+
diff --git a/hal/halx86/generic/amd64/systimer.S b/hal/halx86/amd64/systimer.S
similarity index 100%
rename from hal/halx86/generic/amd64/systimer.S
rename to hal/halx86/amd64/systimer.S
diff --git a/hal/halx86/generic/amd64/x86bios.c b/hal/halx86/amd64/x86bios.c
similarity index 99%
rename from hal/halx86/generic/amd64/x86bios.c
rename to hal/halx86/amd64/x86bios.c
index 3b43bf1d95f..a814873cbe0 100644
--- a/hal/halx86/generic/amd64/x86bios.c
+++ b/hal/halx86/amd64/x86bios.c
@@ -12,7 +12,7 @@
//#define NDEBUG
#include
-#include "x86emu.h"
+//#include "x86emu.h"
/* This page serves as fallback for pages used by Mm */
#define DEFAULT_PAGE 0x21
@@ -216,6 +216,7 @@ x86BiosWriteMemory(
return STATUS_SUCCESS;
}
+#if 0
BOOLEAN
NTAPI
x86BiosCall(
@@ -261,11 +262,13 @@ x86BiosCall(
return TRUE;
}
+#endif
BOOLEAN
NTAPI
HalpBiosDisplayReset(VOID)
{
+#if 0
X86_BIOS_REGISTERS Registers;
ULONG OldEflags;
@@ -283,7 +286,7 @@ HalpBiosDisplayReset(VOID)
/* Restore previous flags */
__writeeflags(OldEflags);
-
+#endif
return TRUE;
}
diff --git a/hal/halx86/generic/bus/halbus.c b/hal/halx86/generic/acpi/busemul.c
similarity index 91%
rename from hal/halx86/generic/bus/halbus.c
rename to hal/halx86/generic/acpi/busemul.c
index d8e478f450f..7a317f56728 100644
--- a/hal/halx86/generic/bus/halbus.c
+++ b/hal/halx86/generic/acpi/busemul.c
@@ -1,22 +1,20 @@
/*
* PROJECT: ReactOS HAL
- * LICENSE: GPL - See COPYING in the top level directory
- * FILE: hal/halx86/generic/bus/halbus.c
- * PURPOSE: Bus Support Routines
- * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: hal/halx86/generic/acpi/busemul.c
+ * PURPOSE: ACPI HAL Bus Handler Emulation Code
+ * PROGRAMMERS: ReactOS Portable Systems Group
*/
-/* INCLUDES ******************************************************************/
+/* INCLUDES *******************************************************************/
#include
#define NDEBUG
#include
-/* GLOBALS *******************************************************************/
+/* GLOBALS ********************************************************************/
-ULONG HalpBusType;
-
-/* PRIVATE FUNCTIONS *********************************************************/
+/* PRIVATE FUNCTIONS **********************************************************/
VOID
NTAPI
@@ -83,11 +81,11 @@ HalpTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,
ULONG
NTAPI
-HalpGetSystemInterruptVector(IN ULONG BusNumber,
- IN ULONG BusInterruptLevel,
- IN ULONG BusInterruptVector,
- OUT PKIRQL Irql,
- OUT PKAFFINITY Affinity)
+HalpGetSystemInterruptVector_Acpi(IN ULONG BusNumber,
+ IN ULONG BusInterruptLevel,
+ IN ULONG BusInterruptVector,
+ OUT PKIRQL Irql,
+ OUT PKAFFINITY Affinity)
{
ULONG Vector = IRQ2VECTOR(BusInterruptLevel);
*Irql = (KIRQL)VECTOR2IRQL(Vector);
@@ -250,11 +248,11 @@ HalGetInterruptVector(IN INTERFACE_TYPE InterfaceType,
OUT PKAFFINITY Affinity)
{
/* Call the system bus translator */
- return HalpGetSystemInterruptVector(BusNumber,
- BusInterruptLevel,
- BusInterruptVector,
- Irql,
- Affinity);
+ return HalpGetSystemInterruptVector_Acpi(BusNumber,
+ BusInterruptLevel,
+ BusInterruptVector,
+ Irql,
+ Affinity);
}
/*
diff --git a/hal/halx86/generic/acpi/halacpi.c b/hal/halx86/generic/acpi/halacpi.c
index 1efee7996a4..22d3c9b6a72 100644
--- a/hal/halx86/generic/acpi/halacpi.c
+++ b/hal/halx86/generic/acpi/halacpi.c
@@ -879,6 +879,24 @@ HalpInitializePciBus(VOID)
HalpGetNMICrashFlag();
}
+VOID
+NTAPI
+HalpInitNonBusHandler(VOID)
+{
+ /* These should be written by the PCI driver later, but we give defaults */
+ HalPciTranslateBusAddress = HalpTranslateBusAddress;
+ HalPciAssignSlotResources = HalpAssignSlotResources;
+ HalFindBusAddressTranslation = HalpFindBusAddressTranslation;
+}
+
+VOID
+NTAPI
+HalpInitBusHandlers(VOID)
+{
+ /* On ACPI, we only have a fake PCI bus to worry about */
+ HalpInitNonBusHandler();
+}
+
VOID
NTAPI
HalpBuildAddressMap(VOID)
diff --git a/hal/halx86/generic/bus/bushndlr.c b/hal/halx86/generic/bus/bushndlr.c
deleted file mode 100644
index 18121360a62..00000000000
--- a/hal/halx86/generic/bus/bushndlr.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * PROJECT: ReactOS HAL
- * LICENSE: GPL - See COPYING in the top level directory
- * FILE: hal/halx86/generic/bus/bushndlr.c
- * PURPOSE: Generic HAL Bus Handler Support
- * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
- */
-
-/* INCLUDES *******************************************************************/
-
-#include
-#define NDEBUG
-#include
-
-/* GLOBALS ********************************************************************/
-
-KSPIN_LOCK HalpBusDatabaseSpinLock;
-KEVENT HalpBusDatabaseEvent;
-LIST_ENTRY HalpAllBusHandlers;
-PARRAY HalpBusTable;
-PARRAY HalpConfigTable;
-
-/* PRIVATE FUNCTIONS **********************************************************/
-
-PARRAY
-NTAPI
-HalpAllocateArray(IN ULONG ArraySize)
-{
- PARRAY Array;
- ULONG Size;
-
- /* Compute array size */
- if (ArraySize == MAXULONG) ArraySize = 0;
- Size = ArraySize * sizeof(PARRAY) + sizeof(ARRAY);
-
- /* Allocate the array */
- Array = ExAllocatePoolWithTag(NonPagedPool,
- Size,
- 'BusH');
- if (!Array) KeBugCheckEx(HAL_MEMORY_ALLOCATION, Size, 0, (ULONG_PTR)__FILE__, __LINE__);
-
- /* Initialize it */
- Array->ArraySize = ArraySize;
- RtlZeroMemory(Array->Element, sizeof(PVOID) * (ArraySize + 1));
- return Array;
-}
-
-VOID
-NTAPI
-HalpGrowArray(IN PARRAY *CurrentArray,
- IN PARRAY *NewArray)
-{
- PVOID Tmp;
-
- /* Check if the current array doesn't exist yet, or if it's smaller than the new one */
- if (!(*CurrentArray) || ((*NewArray)->ArraySize > (*CurrentArray)->ArraySize))
- {
- /* Does it exist (and can it fit?) */
- if (*CurrentArray)
- {
- /* Copy the current array into the new one */
- RtlCopyMemory(&(*NewArray)->Element,
- &(*CurrentArray)->Element,
- sizeof(PVOID) * ((*CurrentArray)->ArraySize + 1));
- }
-
- /* Swap the pointers (XOR swap would be more l33t) */
- Tmp = *CurrentArray;
- *CurrentArray = *NewArray;
- *NewArray = Tmp;
- }
-}
-
-PBUS_HANDLER
-FASTCALL
-HalpLookupHandler(IN PARRAY Array,
- IN ULONG Type,
- IN ULONG Number,
- IN BOOLEAN AddReference)
-{
- PHAL_BUS_HANDLER Bus;
- PBUS_HANDLER Handler = NULL;
-
- /* Make sure the entry exists */
- if (Array->ArraySize >= Type)
- {
- /* Retrieve it */
- Array = Array->Element[Type];
-
- /* Make sure the entry array exists */
- if ((Array) && (Array->ArraySize >= Number))
- {
- /* Retrieve the bus and its handler */
- Bus = Array->Element[Number];
- Handler = &Bus->Handler;
-
- /* Reference the handler if needed */
- if (AddReference) Bus->ReferenceCount++;
- }
- }
-
- /* Return the handler */
- return Handler;
-}
-
-VOID
-FASTCALL
-HaliReferenceBusHandler(IN PBUS_HANDLER Handler)
-{
- PHAL_BUS_HANDLER Bus;
-
- /* Find and reference the bus handler */
- Bus = CONTAINING_RECORD(Handler, HAL_BUS_HANDLER, Handler);
- Bus->ReferenceCount++;
-}
-
-VOID
-FASTCALL
-HaliDereferenceBusHandler(IN PBUS_HANDLER Handler)
-{
- PHAL_BUS_HANDLER Bus;
-
- /* Find and dereference the bus handler */
- Bus = CONTAINING_RECORD(Handler, HAL_BUS_HANDLER, Handler);
- Bus->ReferenceCount--;
- ASSERT(Bus->ReferenceCount != 0);
-}
-
-PBUS_HANDLER
-FASTCALL
-HaliHandlerForBus(IN INTERFACE_TYPE InterfaceType,
- IN ULONG BusNumber)
-{
- /* Lookup the interface in the bus table */
- return HalpLookupHandler(HalpBusTable, InterfaceType, BusNumber, FALSE);
-}
-
-PBUS_HANDLER
-FASTCALL
-HaliHandlerForConfigSpace(IN BUS_DATA_TYPE ConfigType,
- IN ULONG BusNumber)
-{
- /* Lookup the configuration in the configuration table */
- return HalpLookupHandler(HalpConfigTable, ConfigType, BusNumber, FALSE);
-}
-
-PBUS_HANDLER
-FASTCALL
-HaliReferenceHandlerForBus(IN INTERFACE_TYPE InterfaceType,
- IN ULONG BusNumber)
-{
- /* Lookup the interface in the bus table, and reference the handler */
- return HalpLookupHandler(HalpBusTable, InterfaceType, BusNumber, TRUE);
-}
-
-PBUS_HANDLER
-FASTCALL
-HaliReferenceHandlerForConfigSpace(IN BUS_DATA_TYPE ConfigType,
- IN ULONG BusNumber)
-{
- /* Lookup the configuration in the configuration table and add a reference */
- return HalpLookupHandler(HalpConfigTable, ConfigType, BusNumber, TRUE);
-}
-
-VOID
-NTAPI
-HalpInitBusHandler(VOID)
-{
- /* Setup the bus lock */
- KeInitializeSpinLock(&HalpBusDatabaseSpinLock);
-
- /* Setup the bus event */
- KeInitializeEvent(&HalpBusDatabaseEvent, SynchronizationEvent, TRUE);
-
- /* Setup the bus configuration and bus table */
- HalpBusTable = HalpAllocateArray(0);
- HalpConfigTable = HalpAllocateArray(0);
-
- /* Setup the bus list */
- InitializeListHead(&HalpAllBusHandlers);
-
- /* These should be written by the PCI driver later, but we give defaults */
- HalPciTranslateBusAddress = HalpTranslateBusAddress;
- HalPciAssignSlotResources = HalpAssignSlotResources;
- HalFindBusAddressTranslation = HalpFindBusAddressTranslation;
-}
diff --git a/hal/halx86/generic/bus/isabus.c b/hal/halx86/generic/bus/isabus.c
deleted file mode 100644
index 7e9631f6536..00000000000
--- a/hal/halx86/generic/bus/isabus.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- * PROJECT: ReactOS HAL
- * LICENSE: GPL - See COPYING in the top level directory
- * FILE: hal/halx86/generic/bus/isabus.c
- * PURPOSE:
- * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
- */
diff --git a/hal/halx86/generic/bus/sysbus.c b/hal/halx86/generic/bus/sysbus.c
deleted file mode 100644
index d011cb568c5..00000000000
--- a/hal/halx86/generic/bus/sysbus.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- * PROJECT: ReactOS HAL
- * LICENSE: GPL - See COPYING in the top level directory
- * FILE: hal/halx86/generic/bus/sysbus.c
- * PURPOSE:
- * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
- */
diff --git a/hal/halx86/generic/halinit.c b/hal/halx86/generic/halinit.c
index db54eb59d63..f0ebd33d4ca 100644
--- a/hal/halx86/generic/halinit.c
+++ b/hal/halx86/generic/halinit.c
@@ -14,223 +14,10 @@
/* GLOBALS *******************************************************************/
-/* Share with Mm headers? */
-#define MM_HAL_VA_START (PVOID)0xFFC00000
-#define MM_HAL_HEAP_START (PVOID)((ULONG_PTR)MM_HAL_VA_START + (1024 * 1024))
-
BOOLEAN HalpPciLockSettings;
-ULONG HalpUsedAllocDescriptors;
-MEMORY_ALLOCATION_DESCRIPTOR HalpAllocationDescriptorArray[64];
-PVOID HalpHeapStart = MM_HAL_HEAP_START;
/* PRIVATE FUNCTIONS *********************************************************/
-ULONG
-NTAPI
-HalpAllocPhysicalMemory(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
- IN ULONG MaxAddress,
- IN ULONG PageCount,
- IN BOOLEAN Aligned)
-{
- ULONG UsedDescriptors, Alignment, PhysicalAddress;
- PFN_NUMBER MaxPage, BasePage;
- PLIST_ENTRY NextEntry;
- PMEMORY_ALLOCATION_DESCRIPTOR MdBlock, NewBlock, FreeBlock;
-
- /* Highest page we'll go */
- MaxPage = MaxAddress >> PAGE_SHIFT;
-
- /* We need at least two blocks */
- if ((HalpUsedAllocDescriptors + 2) > 64) return 0;
-
- /* Remember how many we have now */
- UsedDescriptors = HalpUsedAllocDescriptors;
-
- /* Loop the loader block memory descriptors */
- NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
- while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
- {
- /* Get the block */
- MdBlock = CONTAINING_RECORD(NextEntry,
- MEMORY_ALLOCATION_DESCRIPTOR,
- ListEntry);
-
- /* No alignment by default */
- Alignment = 0;
-
- /* Unless requested, in which case we use a 64KB block alignment */
- if (Aligned) Alignment = ((MdBlock->BasePage + 0x0F) & ~0x0F) - MdBlock->BasePage;
-
- /* Search for free memory */
- if ((MdBlock->MemoryType == LoaderFree) ||
- (MdBlock->MemoryType == MemoryFirmwareTemporary))
- {
- /* Make sure the page is within bounds, including alignment */
- BasePage = MdBlock->BasePage;
- if ((BasePage) &&
- (MdBlock->PageCount >= PageCount + Alignment) &&
- (BasePage + PageCount + Alignment < MaxPage))
- {
-
- /* We found an address */
- PhysicalAddress = (BasePage + Alignment) << PAGE_SHIFT;
- break;
- }
- }
-
- /* Keep trying */
- NextEntry = NextEntry->Flink;
- }
-
- /* If we didn't find anything, get out of here */
- if (NextEntry == &LoaderBlock->MemoryDescriptorListHead) return 0;
-
- /* Okay, now get a descriptor */
- NewBlock = &HalpAllocationDescriptorArray[HalpUsedAllocDescriptors];
- NewBlock->PageCount = PageCount;
- NewBlock->BasePage = MdBlock->BasePage + Alignment;
- NewBlock->MemoryType = LoaderHALCachedMemory;
-
- /* Update count */
- UsedDescriptors++;
- HalpUsedAllocDescriptors = UsedDescriptors;
-
- /* Check if we had any alignment */
- if (Alignment)
- {
- /* Check if we had leftovers */
- if ((MdBlock->PageCount - Alignment) != PageCount)
- {
- /* Get the next descriptor */
- FreeBlock = &HalpAllocationDescriptorArray[UsedDescriptors];
- FreeBlock->PageCount = MdBlock->PageCount - Alignment - PageCount;
- FreeBlock->BasePage = MdBlock->BasePage + Alignment + PageCount;
-
- /* One more */
- HalpUsedAllocDescriptors++;
-
- /* Insert it into the list */
- InsertHeadList(&MdBlock->ListEntry, &FreeBlock->ListEntry);
- }
-
- /* Use this descriptor */
- NewBlock->PageCount = Alignment;
- InsertHeadList(&MdBlock->ListEntry, &NewBlock->ListEntry);
- }
- else
- {
- /* Consume memory from this block */
- MdBlock->BasePage += PageCount;
- MdBlock->PageCount -= PageCount;
-
- /* Insert the descriptor */
- InsertTailList(&MdBlock->ListEntry, &NewBlock->ListEntry);
-
- /* Remove the entry if the whole block was allocated */
- if (!MdBlock->PageCount == 0) RemoveEntryList(&MdBlock->ListEntry);
- }
-
- /* Return the address */
- return PhysicalAddress;
-}
-
-PVOID
-NTAPI
-HalpMapPhysicalMemory64(IN PHYSICAL_ADDRESS PhysicalAddress,
- IN ULONG PageCount)
-{
- PHARDWARE_PTE PointerPte;
- ULONG UsedPages = 0;
- PVOID VirtualAddress, BaseAddress;
-
- /* Start at the current HAL heap base */
- BaseAddress = HalpHeapStart;
- VirtualAddress = BaseAddress;
-
- /* Loop until we have all the pages required */
- while (UsedPages < PageCount)
- {
- /* If this overflows past the HAL heap, it means there's no space */
- if (VirtualAddress == NULL) return NULL;
-
- /* Get the PTE for this address */
- PointerPte = HalAddressToPte(VirtualAddress);
-
- /* Go to the next page */
- VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress + PAGE_SIZE);
-
- /* Check if the page is available */
- if (PointerPte->Valid)
- {
- /* PTE has data, skip it and start with a new base address */
- BaseAddress = VirtualAddress;
- UsedPages = 0;
- continue;
- }
-
- /* PTE is available, keep going on this run */
- UsedPages++;
- }
-
- /* Take the base address of the page plus the actual offset in the address */
- VirtualAddress = (PVOID)((ULONG_PTR)BaseAddress +
- BYTE_OFFSET(PhysicalAddress.LowPart));
-
- /* If we are starting at the heap, move the heap */
- if (BaseAddress == HalpHeapStart)
- {
- /* Past this allocation */
- HalpHeapStart = (PVOID)((ULONG_PTR)BaseAddress + (PageCount * PAGE_SIZE));
- }
-
- /* Loop pages that can be mapped */
- while (UsedPages--)
- {
- /* Fill out the PTE */
- PointerPte = HalAddressToPte(BaseAddress);
- PointerPte->PageFrameNumber = PhysicalAddress.QuadPart >> PAGE_SHIFT;
- PointerPte->Valid = 1;
- PointerPte->Write = 1;
-
- /* Move to the next address */
- PhysicalAddress.QuadPart += PAGE_SIZE;
- BaseAddress = (PVOID)((ULONG_PTR)BaseAddress + PAGE_SIZE);
- }
-
- /* Flush the TLB and return the address */
- HalpFlushTLB();
- return VirtualAddress;
-}
-
-VOID
-NTAPI
-HalpUnmapVirtualAddress(IN PVOID VirtualAddress,
- IN ULONG PageCount)
-{
- PHARDWARE_PTE PointerPte;
- ULONG i;
-
- /* Only accept valid addresses */
- if (VirtualAddress < MM_HAL_VA_START) return;
-
- /* Align it down to page size */
- VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress & ~(PAGE_SIZE - 1));
-
- /* Loop PTEs */
- PointerPte = HalAddressToPte(VirtualAddress);
- for (i = 0; i < PageCount; i++)
- {
- *(PULONG)PointerPte = 0;
- PointerPte++;
- }
-
- /* Flush the TLB */
- HalpFlushTLB();
-
- /* Put the heap back */
- if (HalpHeapStart > VirtualAddress) HalpHeapStart = VirtualAddress;
-}
-
VOID
NTAPI
HalpGetParameters(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
@@ -368,7 +155,7 @@ HalInitSystem(IN ULONG BootPhase,
else if (BootPhase == 1)
{
/* Initialize bus handlers */
- HalpInitBusHandler();
+ HalpInitBusHandlers();
#ifndef _MINIHAL_
/* Enable IRQ 0 */
diff --git a/hal/halx86/generic/legacy/bus/bushndlr.c b/hal/halx86/generic/legacy/bus/bushndlr.c
new file mode 100644
index 00000000000..7cb3a205cea
--- /dev/null
+++ b/hal/halx86/generic/legacy/bus/bushndlr.c
@@ -0,0 +1,421 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: hal/halx86/generic/bus/bushndlr.c
+ * PURPOSE: Generic HAL Bus Handler Support
+ * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+/* GLOBALS ********************************************************************/
+
+KSPIN_LOCK HalpBusDatabaseSpinLock;
+KEVENT HalpBusDatabaseEvent;
+LIST_ENTRY HalpAllBusHandlers;
+PARRAY HalpBusTable;
+PARRAY HalpConfigTable;
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+PARRAY
+NTAPI
+HalpAllocateArray(IN ULONG ArraySize)
+{
+ PARRAY Array;
+ ULONG Size;
+
+ /* Compute array size */
+ if (ArraySize == MAXULONG) ArraySize = 0;
+ Size = ArraySize * sizeof(PARRAY) + sizeof(ARRAY);
+
+ /* Allocate the array */
+ Array = ExAllocatePoolWithTag(NonPagedPool,
+ Size,
+ 'BusH');
+ if (!Array) KeBugCheckEx(HAL_MEMORY_ALLOCATION, Size, 0, (ULONG_PTR)__FILE__, __LINE__);
+
+ /* Initialize it */
+ Array->ArraySize = ArraySize;
+ RtlZeroMemory(Array->Element, sizeof(PVOID) * (ArraySize + 1));
+ return Array;
+}
+
+VOID
+NTAPI
+HalpGrowArray(IN PARRAY *CurrentArray,
+ IN PARRAY *NewArray)
+{
+ PVOID Tmp;
+
+ /* Check if the current array doesn't exist yet, or if it's smaller than the new one */
+ if (!(*CurrentArray) || ((*NewArray)->ArraySize > (*CurrentArray)->ArraySize))
+ {
+ /* Does it exist (and can it fit?) */
+ if (*CurrentArray)
+ {
+ /* Copy the current array into the new one */
+ RtlCopyMemory(&(*NewArray)->Element,
+ &(*CurrentArray)->Element,
+ sizeof(PVOID) * ((*CurrentArray)->ArraySize + 1));
+ }
+
+ /* Swap the pointers (XOR swap would be more l33t) */
+ Tmp = *CurrentArray;
+ *CurrentArray = *NewArray;
+ *NewArray = Tmp;
+ }
+}
+
+PBUS_HANDLER
+FASTCALL
+HalpLookupHandler(IN PARRAY Array,
+ IN ULONG Type,
+ IN ULONG Number,
+ IN BOOLEAN AddReference)
+{
+ PHAL_BUS_HANDLER Bus;
+ PBUS_HANDLER Handler = NULL;
+
+ /* Make sure the entry exists */
+ if (Array->ArraySize >= Type)
+ {
+ /* Retrieve it */
+ Array = Array->Element[Type];
+
+ /* Make sure the entry array exists */
+ if ((Array) && (Array->ArraySize >= Number))
+ {
+ /* Retrieve the bus and its handler */
+ Bus = Array->Element[Number];
+ Handler = &Bus->Handler;
+
+ /* Reference the handler if needed */
+ if (AddReference) Bus->ReferenceCount++;
+ }
+ }
+
+ /* Return the handler */
+ return Handler;
+}
+
+ULONG
+NTAPI
+HalpNoBusData(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length)
+{
+ /* Not implemented */
+ DPRINT1("STUB GetSetBusData\n");
+ return 0;
+}
+
+NTSTATUS
+NTAPI
+HalpNoAdjustResourceList(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList)
+{
+ DPRINT1("STUB Adjustment\n");
+ return STATUS_UNSUCCESSFUL;
+}
+
+NTSTATUS
+NTAPI
+HalpNoAssignSlotResources(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PUNICODE_STRING RegistryPath,
+ IN PUNICODE_STRING DriverClassName OPTIONAL,
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT DeviceObject OPTIONAL,
+ IN ULONG SlotNumber,
+ IN OUT PCM_RESOURCE_LIST *AllocatedResources)
+{
+ DPRINT1("STUB Assignment\n");
+ return STATUS_NOT_SUPPORTED;
+}
+
+VOID
+FASTCALL
+HaliReferenceBusHandler(IN PBUS_HANDLER Handler)
+{
+ PHAL_BUS_HANDLER Bus;
+
+ /* Find and reference the bus handler */
+ Bus = CONTAINING_RECORD(Handler, HAL_BUS_HANDLER, Handler);
+ Bus->ReferenceCount++;
+}
+
+VOID
+FASTCALL
+HaliDereferenceBusHandler(IN PBUS_HANDLER Handler)
+{
+ PHAL_BUS_HANDLER Bus;
+
+ /* Find and dereference the bus handler */
+ Bus = CONTAINING_RECORD(Handler, HAL_BUS_HANDLER, Handler);
+ Bus->ReferenceCount--;
+ ASSERT(Bus->ReferenceCount != 0);
+}
+
+PBUS_HANDLER
+FASTCALL
+HaliHandlerForBus(IN INTERFACE_TYPE InterfaceType,
+ IN ULONG BusNumber)
+{
+ /* Lookup the interface in the bus table */
+ return HalpLookupHandler(HalpBusTable, InterfaceType, BusNumber, FALSE);
+}
+
+PBUS_HANDLER
+FASTCALL
+HaliHandlerForConfigSpace(IN BUS_DATA_TYPE ConfigType,
+ IN ULONG BusNumber)
+{
+ /* Lookup the configuration in the configuration table */
+ return HalpLookupHandler(HalpConfigTable, ConfigType, BusNumber, FALSE);
+}
+
+PBUS_HANDLER
+FASTCALL
+HaliReferenceHandlerForBus(IN INTERFACE_TYPE InterfaceType,
+ IN ULONG BusNumber)
+{
+ /* Lookup the interface in the bus table, and reference the handler */
+ return HalpLookupHandler(HalpBusTable, InterfaceType, BusNumber, TRUE);
+}
+
+PBUS_HANDLER
+FASTCALL
+HaliReferenceHandlerForConfigSpace(IN BUS_DATA_TYPE ConfigType,
+ IN ULONG BusNumber)
+{
+ /* Lookup the configuration in the configuration table and add a reference */
+ return HalpLookupHandler(HalpConfigTable, ConfigType, BusNumber, TRUE);
+}
+
+#ifndef _MINIHAL_
+NTSTATUS
+NTAPI
+HaliRegisterBusHandler(IN INTERFACE_TYPE InterfaceType,
+ IN BUS_DATA_TYPE ConfigType,
+ IN ULONG BusNumber,
+ IN INTERFACE_TYPE ParentBusType,
+ IN ULONG ParentBusNumber,
+ IN ULONG ExtraData,
+ IN PINSTALL_BUS_HANDLER InstallCallback,
+ OUT PBUS_HANDLER *ReturnedBusHandler)
+{
+ PHAL_BUS_HANDLER Bus, OldHandler = NULL;
+ PHAL_BUS_HANDLER* BusEntry;
+ //PVOID CodeHandle;
+ PARRAY InterfaceArray, InterfaceBusNumberArray, ConfigArray, ConfigBusNumberArray;
+ PBUS_HANDLER ParentHandler;
+ KIRQL OldIrql;
+ NTSTATUS Status;
+
+ /* Make sure we have a valid handler */
+ ASSERT((InterfaceType != InterfaceTypeUndefined) ||
+ (ConfigType != ConfigurationSpaceUndefined));
+
+ /* Allocate the bus handler */
+ Bus = ExAllocatePoolWithTag(NonPagedPool,
+ sizeof(HAL_BUS_HANDLER) + ExtraData,
+ 'HsuB');
+ if (!Bus) return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* Return the handler */
+ *ReturnedBusHandler = &Bus->Handler;
+
+ /* FIXME: Fix the kernel first. Don't page us out */
+ //CodeHandle = MmLockPagableDataSection(&HaliRegisterBusHandler);
+
+ /* Synchronize with anyone else */
+ KeWaitForSingleObject(&HalpBusDatabaseEvent,
+ WrExecutive,
+ KernelMode,
+ FALSE,
+ NULL);
+
+ /* Check for unknown/root bus */
+ if (BusNumber == -1)
+ {
+ /* We must have an interface */
+ ASSERT(InterfaceType != InterfaceTypeUndefined);
+
+ /* Find the right bus */
+ BusNumber = 0;
+ while (HaliHandlerForBus(InterfaceType, BusNumber)) BusNumber++;
+ }
+
+ /* Allocate arrays for the handler */
+ InterfaceArray = HalpAllocateArray(InterfaceType);
+ InterfaceBusNumberArray = HalpAllocateArray(BusNumber);
+ ConfigArray = HalpAllocateArray(ConfigType);
+ ConfigBusNumberArray = HalpAllocateArray(BusNumber);
+
+ /* Only proceed if all allocations succeeded */
+ if (InterfaceArray && InterfaceBusNumberArray && ConfigArray && ConfigBusNumberArray)
+ {
+ /* Find the parent handler if any */
+ ParentHandler = HaliReferenceHandlerForBus(ParentBusType, ParentBusNumber);
+
+ /* Initialize the handler */
+ RtlZeroMemory(Bus, sizeof(HAL_BUS_HANDLER) + ExtraData);
+ Bus->ReferenceCount = 1;
+
+ /* Fill out bus data */
+ Bus->Handler.BusNumber = BusNumber;
+ Bus->Handler.InterfaceType = InterfaceType;
+ Bus->Handler.ConfigurationType = ConfigType;
+ Bus->Handler.ParentHandler = ParentHandler;
+
+ /* Fill out dummy handlers */
+ Bus->Handler.GetBusData = HalpNoBusData;
+ Bus->Handler.SetBusData = HalpNoBusData;
+ Bus->Handler.AdjustResourceList = HalpNoAdjustResourceList;
+ Bus->Handler.AssignSlotResources = HalpNoAssignSlotResources;
+
+ /* Make space for extra data */
+ if (ExtraData) Bus->Handler.BusData = Bus + 1;
+
+ /* Check for a parent handler */
+ if (ParentHandler)
+ {
+ /* Inherit the parent routines */
+ Bus->Handler.GetBusData = ParentHandler->GetBusData;
+ Bus->Handler.SetBusData = ParentHandler->SetBusData;
+ Bus->Handler.AdjustResourceList = ParentHandler->AdjustResourceList;
+ Bus->Handler.AssignSlotResources = ParentHandler->AssignSlotResources;
+ Bus->Handler.TranslateBusAddress = ParentHandler->TranslateBusAddress;
+ Bus->Handler.GetInterruptVector = ParentHandler->GetInterruptVector;
+ }
+
+ /* We don't support this yet */
+ ASSERT(!InstallCallback);
+
+ /* Lock the buses */
+ KeAcquireSpinLock(&HalpBusDatabaseSpinLock, &OldIrql);
+
+ /* Make space for the interface */
+ HalpGrowArray(&HalpBusTable, &InterfaceArray);
+
+ /* Check if we really have an interface */
+ if (InterfaceType != InterfaceTypeUndefined)
+ {
+ /* Make space for the association */
+ HalpGrowArray((PARRAY*)&HalpBusTable->Element[InterfaceType],
+ &InterfaceBusNumberArray);
+
+ /* Get the bus handler pointer */
+ BusEntry = (PHAL_BUS_HANDLER*)&((PARRAY)HalpBusTable->Element[InterfaceType])->Element[BusNumber];
+
+ /* Check if there was already a handler there, and set the new one */
+ if (*BusEntry) OldHandler = *BusEntry;
+ *BusEntry = Bus;
+ }
+
+ /* Now add a space for the configuration space */
+ HalpGrowArray(&HalpConfigTable, &ConfigArray);
+
+ /* Check if we really have one */
+ if (ConfigType != ConfigurationSpaceUndefined)
+ {
+ /* Make space for this association */
+ HalpGrowArray((PARRAY*)&HalpConfigTable->Element[ConfigType],
+ &ConfigBusNumberArray);
+
+ /* Get the bus handler pointer */
+ BusEntry = (PHAL_BUS_HANDLER*)&((PARRAY)HalpConfigTable->Element[ConfigType])->Element[BusNumber];
+ if (*BusEntry)
+ {
+ /* Get the old entry, but make sure it's the same we had before */
+ ASSERT((OldHandler == NULL) || (OldHandler == *BusEntry));
+ OldHandler = *BusEntry;
+ }
+
+ /* Set the new entry */
+ *BusEntry = Bus;
+ }
+
+ /* Link the adapter */
+ InsertTailList(&HalpAllBusHandlers, &Bus->AllHandlers);
+
+ /* Remove the old linkage */
+ Bus = OldHandler;
+ if (Bus) RemoveEntryList(&Bus->AllHandlers);
+
+ /* Release the lock */
+ KeReleaseSpinLock(&HalpBusDatabaseSpinLock, OldIrql);
+ Status = STATUS_SUCCESS;
+ }
+ else
+ {
+ /* Fail */
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Signal the event */
+ KeSetEvent(&HalpBusDatabaseEvent, 0, FALSE);
+
+ /* FIXME: Fix the kernel first. Re-page the function */
+ //MmUnlockPagableImageSection(CodeHandle);
+
+ /* Free all allocations */
+ if (Bus) ExFreePool(Bus);
+ if (InterfaceArray) ExFreePool(InterfaceArray);
+ if (InterfaceBusNumberArray) ExFreePool(InterfaceBusNumberArray);
+ if (ConfigArray) ExFreePool(ConfigArray);
+ if (ConfigBusNumberArray) ExFreePool(ConfigBusNumberArray);
+
+ /* And we're done */
+ return Status;
+}
+#endif
+
+VOID
+NTAPI
+HalpInitBusHandler(VOID)
+{
+ /* Setup the bus lock */
+ KeInitializeSpinLock(&HalpBusDatabaseSpinLock);
+
+ /* Setup the bus event */
+ KeInitializeEvent(&HalpBusDatabaseEvent, SynchronizationEvent, TRUE);
+
+ /* Setup the bus configuration and bus table */
+ HalpBusTable = HalpAllocateArray(0);
+ HalpConfigTable = HalpAllocateArray(0);
+
+ /* Setup the bus list */
+ InitializeListHead(&HalpAllBusHandlers);
+
+ /* Setup the HAL Dispatch routines */
+#ifndef _MINIHAL_
+ HalRegisterBusHandler = HaliRegisterBusHandler;
+ HalHandlerForBus = HaliHandlerForBus;
+ HalHandlerForConfigSpace = HaliHandlerForConfigSpace;
+ HalReferenceHandlerForBus = HaliReferenceHandlerForBus;
+ HalReferenceBusHandler = HaliReferenceBusHandler;
+ HalDereferenceBusHandler = HaliDereferenceBusHandler;
+#endif
+ HalPciAssignSlotResources = HalpAssignSlotResources;
+ /* FIXME: Fix later */
+#if 0
+ HalPciTranslateBusAddress = HaliTranslateBusAddress;
+ if (!HalFindBusAddressTranslation) HalFindBusAddressTranslation = HaliFindBusAddressTranslation;
+#else
+ /* These should be written by the PCI driver later, but we give defaults */
+ HalPciTranslateBusAddress = HalpTranslateBusAddress;
+ HalFindBusAddressTranslation = HalpFindBusAddressTranslation;
+#endif
+}
+
+/* EOF */
diff --git a/hal/halx86/generic/legacy/bus/cmosbus.c b/hal/halx86/generic/legacy/bus/cmosbus.c
new file mode 100644
index 00000000000..279aebf9e20
--- /dev/null
+++ b/hal/halx86/generic/legacy/bus/cmosbus.c
@@ -0,0 +1,47 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: hal/halx86/generic/bus/sysbus.c
+ * PURPOSE:
+ * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+/* GLOBALS ********************************************************************/
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+ULONG
+NTAPI
+HalpcGetCmosData(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length)
+{
+ DPRINT1("CMOS GetData\n");
+ while (TRUE);
+ return 0;
+}
+
+ULONG
+NTAPI
+HalpcSetCmosData(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length)
+{
+ DPRINT1("CMOS SetData\n");
+ while (TRUE);
+ return 0;
+}
+
+/* EOF */
diff --git a/hal/halx86/generic/legacy/bus/isabus.c b/hal/halx86/generic/legacy/bus/isabus.c
new file mode 100644
index 00000000000..884e6d026bb
--- /dev/null
+++ b/hal/halx86/generic/legacy/bus/isabus.c
@@ -0,0 +1,32 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: hal/halx86/generic/bus/isabus.c
+ * PURPOSE:
+ * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+/* GLOBALS ********************************************************************/
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+BOOLEAN
+NTAPI
+HalpTranslateIsaBusAddress(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress)
+{
+ DPRINT1("ISA Translate\n");
+ while (TRUE);
+ return FALSE;
+}
+
+/* EOF */
diff --git a/hal/halx86/generic/bus/pcibus.c b/hal/halx86/generic/legacy/bus/pcibus.c
similarity index 95%
rename from hal/halx86/generic/bus/pcibus.c
rename to hal/halx86/generic/legacy/bus/pcibus.c
index 3c46e805122..fe49b731fcb 100644
--- a/hal/halx86/generic/bus/pcibus.c
+++ b/hal/halx86/generic/legacy/bus/pcibus.c
@@ -14,6 +14,8 @@
/* GLOBALS *******************************************************************/
+ULONG HalpBusType;
+
PCI_TYPE1_CFG_CYCLE_BITS HalpPciDebuggingDevice[2] = {{{{0}}}};
BOOLEAN HalpPCIConfigInitialized;
@@ -391,7 +393,6 @@ HalpGetPCIData(IN PBUS_HANDLER BusHandler,
if (PciConfig->VendorID == PCI_INVALID_VENDORID)
{
/* It's invalid, but we want to return this much */
- PciConfig->VendorID = PCI_INVALID_VENDORID;
Len = sizeof(USHORT);
}
@@ -506,6 +507,55 @@ HalpSetPCIData(IN PBUS_HANDLER BusHandler,
return Len;
}
+ULONG
+NTAPI
+HalpGetPCIIntOnISABus(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG BusInterruptLevel,
+ IN ULONG BusInterruptVector,
+ OUT PKIRQL Irql,
+ OUT PKAFFINITY Affinity)
+{
+ UNIMPLEMENTED;
+ while (TRUE);
+ return 0;
+}
+
+VOID
+NTAPI
+HalpPCIPin2ISALine(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PCI_SLOT_NUMBER SlotNumber,
+ IN PPCI_COMMON_CONFIG PciData)
+{
+ UNIMPLEMENTED;
+ while (TRUE);
+}
+
+VOID
+NTAPI
+HalpPCIISALine2Pin(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PCI_SLOT_NUMBER SlotNumber,
+ IN PPCI_COMMON_CONFIG PciNewData,
+ IN PPCI_COMMON_CONFIG PciOldData)
+{
+ UNIMPLEMENTED;
+ while (TRUE);
+}
+
+NTSTATUS
+NTAPI
+HalpGetISAFixedPCIIrq(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PCI_SLOT_NUMBER PciSlot,
+ OUT PSUPPORTED_RANGE *Range)
+{
+ UNIMPLEMENTED;
+ while (TRUE);
+ return STATUS_SUCCESS;
+}
+
NTSTATUS
NTAPI
HalpSetupPciDeviceForDebugging(IN PVOID LoaderBlock,
@@ -559,6 +609,18 @@ PciSize(ULONG Base, ULONG Mask)
return Size;
}
+NTSTATUS
+NTAPI
+HalpAdjustPCIResourceList(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList)
+{
+ /* Not yet supported */
+ DbgPrint("HAL: PCI Resource List Adjustment not implemented!");
+ while (TRUE);
+ return STATUS_UNSUCCESSFUL;
+}
+
NTSTATUS
NTAPI
HalpAssignPCISlotResources(IN PBUS_HANDLER BusHandler,
@@ -1062,3 +1124,5 @@ HalpInitializePciStubs(VOID)
HalpPCIConfigInitialized = TRUE;
}
+/* EOF */
+
diff --git a/hal/halx86/generic/bus/pcidata.c b/hal/halx86/generic/legacy/bus/pcidata.c
similarity index 100%
rename from hal/halx86/generic/bus/pcidata.c
rename to hal/halx86/generic/legacy/bus/pcidata.c
diff --git a/hal/halx86/generic/legacy/bus/sysbus.c b/hal/halx86/generic/legacy/bus/sysbus.c
new file mode 100644
index 00000000000..ab8d2925c44
--- /dev/null
+++ b/hal/halx86/generic/legacy/bus/sysbus.c
@@ -0,0 +1,47 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: hal/halx86/generic/bus/sysbus.c
+ * PURPOSE:
+ * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+/* GLOBALS ********************************************************************/
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+BOOLEAN
+NTAPI
+HalpTranslateSystemBusAddress(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress)
+{
+ DPRINT1("SYSTEM Translate\n");
+ while (TRUE);
+ return FALSE;
+}
+
+ULONG
+NTAPI
+HalpGetSystemInterruptVector(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG BusInterruptLevel,
+ IN ULONG BusInterruptVector,
+ OUT PKIRQL Irql,
+ OUT PKAFFINITY Affinity)
+{
+ /* Get the root vector */
+ DPRINT1("SYSTEM GetVector\n");
+ while (TRUE);
+ return 0;
+}
+
+/* EOF */
diff --git a/hal/halx86/generic/legacy/bussupp.c b/hal/halx86/generic/legacy/bussupp.c
new file mode 100644
index 00000000000..8d8f799c541
--- /dev/null
+++ b/hal/halx86/generic/legacy/bussupp.c
@@ -0,0 +1,963 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: hal/halx86/generic/legacy/bussupp.c
+ * PURPOSE: HAL Legacy Bus Support Code
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+/* GLOBALS ********************************************************************/
+
+extern KSPIN_LOCK HalpPCIConfigLock;
+ULONG HalpPciIrqMask;
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+PBUS_HANDLER
+NTAPI
+HalpAllocateBusHandler(IN INTERFACE_TYPE InterfaceType,
+ IN BUS_DATA_TYPE BusDataType,
+ IN ULONG BusNumber,
+ IN INTERFACE_TYPE ParentBusInterfaceType,
+ IN ULONG ParentBusNumber,
+ IN ULONG BusSpecificData)
+{
+ PBUS_HANDLER Bus;
+
+ /* Register the bus handler */
+ HalRegisterBusHandler(InterfaceType,
+ BusDataType,
+ BusNumber,
+ ParentBusInterfaceType,
+ ParentBusNumber,
+ BusSpecificData,
+ NULL,
+ &Bus);
+ if (!Bus) return NULL;
+
+ /* Check for a valid interface */
+ if (InterfaceType != InterfaceTypeUndefined)
+ {
+ /* Allocate address ranges and zero them out */
+ Bus->BusAddresses = ExAllocatePoolWithTag(NonPagedPool,
+ sizeof(SUPPORTED_RANGES),
+ ' laH');
+ RtlZeroMemory(Bus->BusAddresses, sizeof(SUPPORTED_RANGES));
+
+ /* Build the data structure */
+ Bus->BusAddresses->Version = HAL_SUPPORTED_RANGE_VERSION;
+ Bus->BusAddresses->Dma.Limit = 7;
+ Bus->BusAddresses->Memory.Limit = 0xFFFFFFFF;
+ Bus->BusAddresses->IO.Limit = 0xFFFF;
+ Bus->BusAddresses->IO.SystemAddressSpace = 1;
+ Bus->BusAddresses->PrefetchMemory.Base = 1;
+ }
+
+ /* Return the bus address */
+ return Bus;
+}
+
+VOID
+NTAPI
+HalpRegisterInternalBusHandlers(VOID)
+{
+ PBUS_HANDLER Bus;
+
+ /* Only do processor 1 */
+ if (KeGetCurrentPrcb()->Number) return;
+
+ /* Register root support */
+ HalpInitBusHandler();
+
+ /* Allocate the system bus */
+ Bus = HalpAllocateBusHandler(Internal,
+ ConfigurationSpaceUndefined,
+ 0,
+ InterfaceTypeUndefined,
+ 0,
+ 0);
+ DPRINT1("Registering Internal Bus: %p\n", Bus);
+ if (Bus)
+ {
+ /* Set it up */
+ Bus->GetInterruptVector = HalpGetSystemInterruptVector;
+ Bus->TranslateBusAddress = HalpTranslateSystemBusAddress;
+ }
+
+ /* Allocate the CMOS bus */
+ Bus = HalpAllocateBusHandler(InterfaceTypeUndefined,
+ Cmos,
+ 0,
+ InterfaceTypeUndefined,
+ 0,
+ 0);
+ DPRINT1("Registering CMOS Bus: %p\n", Bus);
+ if (Bus)
+ {
+ /* Set it up */
+ Bus->GetBusData = HalpcGetCmosData;
+ Bus->SetBusData = HalpcSetCmosData;
+ }
+
+ /* Allocate the CMOS bus */
+ Bus = HalpAllocateBusHandler(InterfaceTypeUndefined,
+ Cmos,
+ 1,
+ InterfaceTypeUndefined,
+ 0,
+ 0);
+ DPRINT1("Registering CMOS Bus: %p\n", Bus);
+ if (Bus)
+ {
+ /* Set it up */
+ Bus->GetBusData = HalpcGetCmosData;
+ Bus->SetBusData = HalpcSetCmosData;
+ }
+
+ /* Allocate ISA bus */
+ Bus = HalpAllocateBusHandler(Isa,
+ ConfigurationSpaceUndefined,
+ 0,
+ Internal,
+ 0,
+ 0);
+ DPRINT1("Registering ISA Bus: %p\n", Bus);
+ if (Bus)
+ {
+ /* Set it up */
+ Bus->GetBusData = HalpNoBusData;
+ Bus->BusAddresses->Memory.Limit = 0xFFFFFF;
+ Bus->TranslateBusAddress = HalpTranslateIsaBusAddress;
+ }
+
+ /* No support for EISA or MCA */
+ ASSERT(HalpBusType == MACHINE_TYPE_ISA);
+}
+
+#ifndef _MINIHAL_
+NTSTATUS
+NTAPI
+HalpMarkChipsetDecode(BOOLEAN OverrideEnable)
+{
+ NTSTATUS Status;
+ UNICODE_STRING KeyString;
+ ULONG Data = OverrideEnable;
+ HANDLE KeyHandle, Handle;
+
+ /* Open CCS key */
+ RtlInitUnicodeString(&KeyString,
+ L"\\REGISTRY\\MACHINE\\SYSTEM\\CURRENTCONTROLSET");
+ Status = HalpOpenRegistryKey(&Handle, 0, &KeyString, KEY_ALL_ACCESS, FALSE);
+ if (NT_SUCCESS(Status))
+ {
+ /* Open PNP Bios key */
+ RtlInitUnicodeString(&KeyString, L"Control\\Biosinfo\\PNPBios");
+ Status = HalpOpenRegistryKey(&KeyHandle,
+ Handle,
+ &KeyString,
+ KEY_ALL_ACCESS,
+ TRUE);
+
+ /* Close root key */
+ ZwClose(Handle);
+
+ /* Check if PNP BIOS key exists */
+ if (NT_SUCCESS(Status))
+ {
+ /* Set the override value */
+ RtlInitUnicodeString(&KeyString, L"FullDecodeChipsetOverride");
+ Status = ZwSetValueKey(KeyHandle,
+ &KeyString,
+ 0,
+ REG_DWORD,
+ &Data,
+ sizeof(Data));
+
+ /* Close subkey */
+ ZwClose(KeyHandle);
+ }
+ }
+
+ /* Return status */
+ return Status;
+}
+
+PBUS_HANDLER
+NTAPI
+HalpAllocateAndInitPciBusHandler(IN ULONG PciType,
+ IN ULONG BusNo,
+ IN BOOLEAN TestAllocation)
+{
+ PBUS_HANDLER Bus;
+ PPCIPBUSDATA BusData;
+
+ /* Allocate the bus handler */
+ Bus = HalpAllocateBusHandler(PCIBus,
+ PCIConfiguration,
+ BusNo,
+ Internal,
+ 0,
+ sizeof(PCIPBUSDATA));
+
+ /* Set it up */
+ Bus->GetBusData = (PGETSETBUSDATA)HalpGetPCIData;
+ Bus->SetBusData = (PGETSETBUSDATA)HalpSetPCIData;
+ Bus->GetInterruptVector = (PGETINTERRUPTVECTOR)HalpGetPCIIntOnISABus;
+ Bus->AdjustResourceList = (PADJUSTRESOURCELIST)HalpAdjustPCIResourceList;
+ Bus->AssignSlotResources = (PASSIGNSLOTRESOURCES)HalpAssignPCISlotResources;
+ Bus->BusAddresses->Dma.Limit = 0;
+
+ /* Get our custom bus data */
+ BusData = (PPCIPBUSDATA)Bus->BusData;
+
+ /* Setup custom bus data */
+ BusData->CommonData.Tag = PCI_DATA_TAG;
+ BusData->CommonData.Version = PCI_DATA_VERSION;
+ BusData->CommonData.ReadConfig = (PciReadWriteConfig)HalpReadPCIConfig;
+ BusData->CommonData.WriteConfig = (PciReadWriteConfig)HalpWritePCIConfig;
+ BusData->CommonData.Pin2Line = (PciPin2Line)HalpPCIPin2ISALine;
+ BusData->CommonData.Line2Pin = (PciLine2Pin)HalpPCIISALine2Pin;
+ BusData->MaxDevice = PCI_MAX_DEVICES;
+ BusData->GetIrqRange = (PciIrqRange)HalpGetISAFixedPCIIrq;
+
+ /* Initialize the bitmap */
+ RtlInitializeBitMap(&BusData->DeviceConfigured, BusData->ConfiguredBits, 256);
+
+ /* Check the type of PCI bus */
+ switch (PciType)
+ {
+ /* Type 1 PCI Bus */
+ case 1:
+
+ /* Copy the Type 1 handler data */
+ RtlCopyMemory(&PCIConfigHandler,
+ &PCIConfigHandlerType1,
+ sizeof(PCIConfigHandler));
+
+ /* Set correct I/O Ports */
+ BusData->Config.Type1.Address = PCI_TYPE1_ADDRESS_PORT;
+ BusData->Config.Type1.Data = PCI_TYPE1_DATA_PORT;
+ break;
+
+ /* Type 2 PCI Bus */
+ case 2:
+
+ /* Copy the Type 1 handler data */
+ RtlCopyMemory(&PCIConfigHandler,
+ &PCIConfigHandlerType2,
+ sizeof (PCIConfigHandler));
+
+ /* Set correct I/O Ports */
+ BusData->Config.Type2.CSE = PCI_TYPE2_CSE_PORT;
+ BusData->Config.Type2.Forward = PCI_TYPE2_FORWARD_PORT;
+ BusData->Config.Type2.Base = PCI_TYPE2_ADDRESS_BASE;
+
+ /* Only 16 devices supported, not 32 */
+ BusData->MaxDevice = 16;
+ break;
+
+ default:
+
+ /* Invalid type */
+ DbgPrint("HAL: Unnkown PCI type\n");
+ }
+
+ /* Return the bus handler */
+ return Bus;
+}
+
+BOOLEAN
+NTAPI
+HalpIsValidPCIDevice(IN PBUS_HANDLER BusHandler,
+ IN PCI_SLOT_NUMBER Slot)
+{
+ UCHAR DataBuffer[PCI_COMMON_HDR_LENGTH];
+ PPCI_COMMON_CONFIG PciHeader = (PVOID)DataBuffer;
+ ULONG i;
+ ULONG_PTR Address;
+
+ /* Read the PCI header */
+ HalpReadPCIConfig(BusHandler, Slot, PciHeader, 0, PCI_COMMON_HDR_LENGTH);
+
+ /* Make sure it's a valid device */
+ if ((PciHeader->VendorID == PCI_INVALID_VENDORID) ||
+ (PCI_CONFIGURATION_TYPE(PciHeader) != PCI_DEVICE_TYPE))
+ {
+ /* Bail out */
+ return FALSE;
+ }
+
+ /* Make sure interrupt numbers make sense */
+ if (((PciHeader->u.type0.InterruptPin) &&
+ (PciHeader->u.type0.InterruptPin > 4)) ||
+ (PciHeader->u.type0.InterruptLine & 0x70))
+ {
+ /* Bail out */
+ return FALSE;
+ }
+
+ /* Now scan PCI BARs */
+ for (i = 0; i < PCI_TYPE0_ADDRESSES; i++)
+ {
+ /* Check what kind of address it is */
+ Address = PciHeader->u.type0.BaseAddresses[i];
+ if (Address & PCI_ADDRESS_IO_SPACE)
+ {
+ /* Highest I/O port is 65535 */
+ if (Address > 0xFFFF) return FALSE;
+ }
+ else
+ {
+ /* MMIO should be higher than 0x80000 */
+ if ((Address > 0xF) && (Address < 0x80000)) return FALSE;
+ }
+
+ /* Is this a 64-bit address? */
+ if (!(Address & PCI_ADDRESS_IO_SPACE) &&
+ ((Address & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_64BIT))
+ {
+ /* Check the next-next entry, since this one 64-bits wide */
+ i++;
+ }
+ }
+
+ /* Header, interrupt and address data all make sense */
+ return TRUE;
+}
+
+static BOOLEAN WarningsGiven[5];
+
+NTSTATUS
+NTAPI
+HalpGetChipHacks(IN USHORT VendorId,
+ IN USHORT DeviceId,
+ IN UCHAR RevisionId,
+ IN PULONG HackFlags)
+{
+ /* Not yet implemented */
+ if (!WarningsGiven[0]++) DbgPrint("HAL: Not checking for PCI Chipset Hacks. Your hardware may malfunction!\n");
+ *HackFlags = 0;
+ return STATUS_UNSUCCESSFUL;
+}
+
+BOOLEAN
+NTAPI
+HalpIsRecognizedCard(IN PPCI_REGISTRY_INFO_INTERNAL PciRegistryInfo,
+ IN PPCI_COMMON_CONFIG PciData,
+ IN ULONG Flags)
+{
+ /* Not yet implemented */
+ if (!WarningsGiven[1]++) DbgPrint("HAL: Not checking for PCI Cards with Extended Addressing. Your hardware may malfunction!\n");
+ return FALSE;
+}
+
+BOOLEAN
+NTAPI
+HalpIsIdeDevice(IN PPCI_COMMON_CONFIG PciData)
+{
+ /* Not yet implemented */
+ if (!WarningsGiven[2]++) DbgPrint("HAL: Not checking for PCI Cards that are IDE devices. Your hardware may malfunction!\n");
+ return FALSE;
+}
+
+BOOLEAN
+NTAPI
+HalpGetPciBridgeConfig(IN ULONG PciType,
+ IN PUCHAR MaxPciBus)
+{
+ /* Not yet implemented */
+ if (!WarningsGiven[3]++) DbgPrint("HAL: Not checking for PCI-to-PCI Bridges. Your hardware may malfunction!\n");
+ return FALSE;
+}
+
+VOID
+NTAPI
+HalpFixupPciSupportedRanges(IN ULONG MaxBuses)
+{
+ /* Not yet implemented */
+ if (!WarningsGiven[4]++) DbgPrint("HAL: Not adjusting Bridge-to-Child PCI Address Ranges. Your hardware may malfunction!\n");
+}
+#endif
+
+VOID
+NTAPI
+HalpInitializePciBus(VOID)
+{
+#ifndef _MINIHAL_
+ PPCI_REGISTRY_INFO_INTERNAL PciRegistryInfo;
+ UCHAR PciType;
+ PCI_SLOT_NUMBER PciSlot;
+ ULONG i, j, k;
+ UCHAR DataBuffer[PCI_COMMON_HDR_LENGTH];
+ PPCI_COMMON_CONFIG PciData = (PPCI_COMMON_CONFIG)DataBuffer;
+ PBUS_HANDLER BusHandler;
+ ULONG HackFlags;
+ BOOLEAN ExtendedAddressDecoding = FALSE;
+
+ /* Query registry information */
+ PciRegistryInfo = HalpQueryPciRegistryInfo();
+ if (!PciRegistryInfo) return;
+
+ /* Initialize the PCI configuration lock */
+ KeInitializeSpinLock(&HalpPCIConfigLock);
+
+ /* Get the type and free the info structure */
+ PciType = PciRegistryInfo->HardwareMechanism & 0xF;
+
+ /* Check if this is a type 2 PCI bus with at least one bus */
+ if ((PciRegistryInfo->NoBuses) && (PciType == 2))
+ {
+ /* Setup the PCI slot */
+ PciSlot.u.bits.Reserved = 0;
+ PciSlot.u.bits.FunctionNumber = 0;
+
+ /* Loop all slots */
+ for (i = 0; i < 32; i++)
+ {
+ /* Try to setup a Type 2 PCI slot */
+ PciType = 2;
+ BusHandler = HalpAllocateAndInitPciBusHandler(2, 0, TRUE);
+ if (!BusHandler) break;
+
+ /* Now check if it's valid */
+ if (HalpIsValidPCIDevice(BusHandler, PciSlot)) break;
+
+ /* Heh, the BIOS lied... try Type 1 */
+ PciType = 1;
+ BusHandler = HalpAllocateAndInitPciBusHandler(1, 0, TRUE);
+ if (!BusHandler) break;
+
+ /* Now check if it's valid */
+ if (HalpIsValidPCIDevice(BusHandler, PciSlot)) break;
+
+ /* Keep trying */
+ PciType = 2;
+ }
+
+ /* Now allocate the correct kind of handler */
+ HalpAllocateAndInitPciBusHandler(PciType, 0, FALSE);
+ }
+
+ /* Okay, now loop all PCI bridges */
+ do
+ {
+ /* Loop all PCI buses */
+ for (i = 0; i < PciRegistryInfo->NoBuses; i++)
+ {
+ /* Check if we have a handler for it */
+ if (!HalHandlerForBus(PCIBus, i))
+ {
+ /* Allocate it */
+ HalpAllocateAndInitPciBusHandler(PciType, i, FALSE);
+ }
+ }
+ /* Go to the next bridge */
+ } while (HalpGetPciBridgeConfig(PciType, &PciRegistryInfo->NoBuses));
+
+ /* Now build correct address range informaiton */
+ HalpFixupPciSupportedRanges(PciRegistryInfo->NoBuses);
+
+ /* Loop every bus */
+ PciSlot.u.bits.Reserved = 0;
+ for (i = 0; i < PciRegistryInfo->NoBuses; i++)
+ {
+ /* Get the bus handler */
+ BusHandler = HalHandlerForBus(PCIBus, i);
+
+ /* Loop every device */
+ for (j = 0; j < 32; j++)
+ {
+ /* Loop every function */
+ PciSlot.u.bits.DeviceNumber = j;
+ for (k = 0; k < 8; k++)
+ {
+ /* Build the final slot structure */
+ PciSlot.u.bits.FunctionNumber = k;
+
+ /* Read the configuration information */
+ HalpReadPCIConfig(BusHandler,
+ PciSlot,
+ PciData,
+ 0,
+ PCI_COMMON_HDR_LENGTH);
+
+ /* Skip if this is an invalid function */
+ if (PciData->VendorID == PCI_INVALID_VENDORID) continue;
+
+ /* Check if this is a Cardbus bridge */
+ if (PCI_CONFIGURATION_TYPE(PciData) == PCI_CARDBUS_BRIDGE_TYPE)
+ {
+ /* Not supported */
+ DbgPrint("HAL: Your machine has a PCI Cardbus Bridge. This is not supported!\n");
+ continue;
+ }
+
+ /* Check if this is a PCI device */
+ if (PCI_CONFIGURATION_TYPE(PciData) != PCI_BRIDGE_TYPE)
+ {
+ /* Check if it has an interrupt pin and line registered */
+ if ((PciData->u.type1.InterruptPin) &&
+ (PciData->u.type1.InterruptLine))
+ {
+ /* Check if this interrupt line is connected to the bus */
+ if (PciData->u.type1.InterruptLine < 16)
+ {
+ /* Is this an IDE device? */
+ DbgPrint("HAL: Found PCI device with IRQ line\n");
+ if (!HalpIsIdeDevice(PciData))
+ {
+ /* We'll mask out this interrupt then */
+ DbgPrint("HAL: Device is not an IDE Device. Should be masking IRQ %d! This is not supported!\n",
+ PciData->u.type1.InterruptLine);
+ HalpPciIrqMask |= (1 << PciData->u.type1.InterruptLine);
+ }
+ }
+ }
+ }
+
+ /* Check for broken Intel chips */
+ if (PciData->VendorID == 0x8086)
+ {
+ /* Check for broken 82830 PCI controller */
+ if ((PciData->DeviceID == 0x04A3) &&
+ (PciData->RevisionID < 0x11))
+ {
+ /* Skip */
+ DbgPrint("HAL: Your machine has a broken Intel 82430 PCI Controller. This is not supported!\n");
+ continue;
+ }
+
+ /* Check for broken 82378 PCI-to-ISA Bridge */
+ if ((PciData->DeviceID == 0x0484) &&
+ (PciData->RevisionID <= 3))
+ {
+ /* Skip */
+ DbgPrint("HAL: Your machine has a broken Intel 82378 PCI-to-ISA Bridge. This is not supported!\n");
+ continue;
+ }
+
+ /* Check for broken 82450 PCI Bridge */
+ if ((PciData->DeviceID == 0x84C4) &&
+ (PciData->RevisionID <= 4))
+ {
+ DbgPrint("HAL: Your machine has an Intel Orion 82450 PCI Bridge. This is not supported!\n");
+ continue;
+ }
+ }
+
+ /* Do we know this card? */
+ if (!ExtendedAddressDecoding)
+ {
+ /* Check for it */
+ if (HalpIsRecognizedCard(PciRegistryInfo, PciData, 1))
+ {
+ /* We'll do chipset checks later */
+ DbgPrint("HAL: Recognized a PCI Card with Extended Address Decoding. This is not supported!\n");
+ ExtendedAddressDecoding = TRUE;
+ }
+ }
+
+ /* Check if this is a USB controller */
+ if ((PciData->BaseClass == PCI_CLASS_SERIAL_BUS_CTLR) &&
+ (PciData->SubClass == PCI_SUBCLASS_SB_USB))
+ {
+ /* Check if this is an OHCI controller */
+ if (PciData->ProgIf == 0x10)
+ {
+ DbgPrint("HAL: Your machine has an OHCI (USB) PCI Expansion Card. This is not supported!\n");
+ continue;
+ }
+
+ /* Check for Intel UHCI controller */
+ if (PciData->VendorID == 0x8086)
+ {
+ DbgPrint("HAL: Your machine has an Intel UHCI (USB) Controller. This is not supported!\n");
+ continue;
+ }
+
+ /* Check for VIA UHCI controller */
+ if (PciData->VendorID == 0x1106)
+ {
+ DbgPrint("HAL: Your machine has a VIA UHCI (USB) Controller. This is not supported!\n");
+ continue;
+ }
+ }
+
+ /* Now check the registry for chipset hacks */
+ if (NT_SUCCESS(HalpGetChipHacks(PciData->VendorID,
+ PciData->DeviceID,
+ PciData->RevisionID,
+ &HackFlags)))
+ {
+ /* Check for hibernate-disable */
+ if (HackFlags & HAL_PCI_CHIP_HACK_DISABLE_HIBERNATE)
+ {
+ DbgPrint("HAL: Your machine has a broken PCI device which is incompatible with hibernation. This is not supported!\n");
+ continue;
+ }
+
+ /* Check for USB controllers that generate SMIs */
+ if (HackFlags & HAL_PCI_CHIP_HACK_USB_SMI_DISABLE)
+ {
+ DbgPrint("HAL: Your machine has a USB controller which generates SMIs. This is not supported!\n");
+ continue;
+ }
+ }
+ }
+ }
+ }
+
+ /* Initialize NMI Crash Flag */
+ HalpGetNMICrashFlag();
+
+ /* Free the registry data */
+ ExFreePool(PciRegistryInfo);
+
+ /* Tell PnP if this hard supports correct decoding */
+ HalpMarkChipsetDecode(ExtendedAddressDecoding);
+ DPRINT1("PCI BUS Setup complete\n");
+#endif
+}
+
+VOID
+NTAPI
+HalpInitBusHandlers(VOID)
+{
+ /* Register the HAL Bus Handler support */
+ HalpRegisterInternalBusHandlers();
+}
+
+VOID
+NTAPI
+HalpRegisterKdSupportFunctions(VOID)
+{
+ /* Register PCI Device Functions */
+ KdSetupPciDeviceForDebugging = HalpSetupPciDeviceForDebugging;
+ KdReleasePciDeviceforDebugging = HalpReleasePciDeviceForDebugging;
+
+ /* Register memory functions */
+#ifndef _MINIHAL_
+ KdMapPhysicalMemory64 = HalpMapPhysicalMemory64;
+ KdUnmapVirtualAddress = HalpUnmapVirtualAddress;
+#endif
+
+ /* Register ACPI stub */
+ KdCheckPowerButton = HalpCheckPowerButton;
+}
+
+NTSTATUS
+NTAPI
+HalpAssignSlotResources(IN PUNICODE_STRING RegistryPath,
+ IN PUNICODE_STRING DriverClassName,
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN INTERFACE_TYPE BusType,
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN OUT PCM_RESOURCE_LIST *AllocatedResources)
+{
+ BUS_HANDLER BusHandler;
+ PAGED_CODE();
+
+ /* Only PCI is supported */
+ if (BusType != PCIBus) return STATUS_NOT_IMPLEMENTED;
+
+ /* Setup fake PCI Bus handler */
+ RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
+ BusHandler.BusNumber = BusNumber;
+
+ /* Call the PCI function */
+ return HalpAssignPCISlotResources(&BusHandler,
+ &BusHandler,
+ RegistryPath,
+ DriverClassName,
+ DriverObject,
+ DeviceObject,
+ SlotNumber,
+ AllocatedResources);
+}
+
+BOOLEAN
+NTAPI
+HalpTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,
+ IN ULONG BusNumber,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress)
+{
+ /* Translation is easy */
+ TranslatedAddress->QuadPart = BusAddress.QuadPart;
+ return TRUE;
+}
+
+ULONG
+NTAPI
+HalpGetSystemInterruptVector_Acpi(IN ULONG BusNumber,
+ IN ULONG BusInterruptLevel,
+ IN ULONG BusInterruptVector,
+ OUT PKIRQL Irql,
+ OUT PKAFFINITY Affinity)
+{
+ ULONG Vector = IRQ2VECTOR(BusInterruptLevel);
+ *Irql = (KIRQL)VECTOR2IRQL(Vector);
+ *Affinity = 0xFFFFFFFF;
+ return Vector;
+}
+
+BOOLEAN
+NTAPI
+HalpFindBusAddressTranslation(IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress,
+ IN OUT PULONG_PTR Context,
+ IN BOOLEAN NextBus)
+{
+ /* Make sure we have a context */
+ if (!Context) return FALSE;
+
+ /* If we have data in the context, then this shouldn't be a new lookup */
+ if ((*Context) && (NextBus == TRUE)) return FALSE;
+
+ /* Return bus data */
+ TranslatedAddress->QuadPart = BusAddress.QuadPart;
+
+ /* Set context value and return success */
+ *Context = 1;
+ return TRUE;
+}
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+HalAdjustResourceList(IN PCM_RESOURCE_LIST Resources)
+{
+ /* Deprecated, return success */
+ return STATUS_SUCCESS;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+HalAssignSlotResources(IN PUNICODE_STRING RegistryPath,
+ IN PUNICODE_STRING DriverClassName,
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN INTERFACE_TYPE BusType,
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN OUT PCM_RESOURCE_LIST *AllocatedResources)
+{
+ /* Check the bus type */
+ if (BusType != PCIBus)
+ {
+ /* Call our internal handler */
+ return HalpAssignSlotResources(RegistryPath,
+ DriverClassName,
+ DriverObject,
+ DeviceObject,
+ BusType,
+ BusNumber,
+ SlotNumber,
+ AllocatedResources);
+ }
+ else
+ {
+ /* Call the PCI registered function */
+ return HalPciAssignSlotResources(RegistryPath,
+ DriverClassName,
+ DriverObject,
+ DeviceObject,
+ PCIBus,
+ BusNumber,
+ SlotNumber,
+ AllocatedResources);
+ }
+}
+
+/*
+ * @implemented
+ */
+ULONG
+NTAPI
+HalGetBusData(IN BUS_DATA_TYPE BusDataType,
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Length)
+{
+ /* Call the extended function */
+ return HalGetBusDataByOffset(BusDataType,
+ BusNumber,
+ SlotNumber,
+ Buffer,
+ 0,
+ Length);
+}
+
+/*
+ * @implemented
+ */
+ULONG
+NTAPI
+HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length)
+{
+ BUS_HANDLER BusHandler;
+
+ /* Look as the bus type */
+ if (BusDataType == Cmos)
+ {
+ /* Call CMOS Function */
+ return HalpGetCmosData(0, SlotNumber, Buffer, Length);
+ }
+ else if (BusDataType == EisaConfiguration)
+ {
+ /* FIXME: TODO */
+ ASSERT(FALSE);
+ }
+ else if ((BusDataType == PCIConfiguration) &&
+ (HalpPCIConfigInitialized) &&
+ ((BusNumber >= HalpMinPciBus) && (BusNumber <= HalpMaxPciBus)))
+ {
+ /* Setup fake PCI Bus handler */
+ RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
+ BusHandler.BusNumber = BusNumber;
+
+ /* Call PCI function */
+ return HalpGetPCIData(&BusHandler,
+ &BusHandler,
+ *(PPCI_SLOT_NUMBER)&SlotNumber,
+ Buffer,
+ Offset,
+ Length);
+ }
+
+ /* Invalid bus */
+ return 0;
+}
+
+/*
+ * @implemented
+ */
+ULONG
+NTAPI
+HalGetInterruptVector(IN INTERFACE_TYPE InterfaceType,
+ IN ULONG BusNumber,
+ IN ULONG BusInterruptLevel,
+ IN ULONG BusInterruptVector,
+ OUT PKIRQL Irql,
+ OUT PKAFFINITY Affinity)
+{
+ /* Call the system bus translator */
+ return HalpGetSystemInterruptVector_Acpi(BusNumber,
+ BusInterruptLevel,
+ BusInterruptVector,
+ Irql,
+ Affinity);
+}
+
+/*
+ * @implemented
+ */
+ULONG
+NTAPI
+HalSetBusData(IN BUS_DATA_TYPE BusDataType,
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Length)
+{
+ /* Call the extended function */
+ return HalSetBusDataByOffset(BusDataType,
+ BusNumber,
+ SlotNumber,
+ Buffer,
+ 0,
+ Length);
+}
+
+/*
+ * @implemented
+ */
+ULONG
+NTAPI
+HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length)
+{
+ BUS_HANDLER BusHandler;
+
+ /* Look as the bus type */
+ if (BusDataType == Cmos)
+ {
+ /* Call CMOS Function */
+ return HalpSetCmosData(0, SlotNumber, Buffer, Length);
+ }
+ else if ((BusDataType == PCIConfiguration) && (HalpPCIConfigInitialized))
+ {
+ /* Setup fake PCI Bus handler */
+ RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
+ BusHandler.BusNumber = BusNumber;
+
+ /* Call PCI function */
+ return HalpSetPCIData(&BusHandler,
+ &BusHandler,
+ *(PPCI_SLOT_NUMBER)&SlotNumber,
+ Buffer,
+ Offset,
+ Length);
+ }
+
+ /* Invalid bus */
+ return 0;
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+HalTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,
+ IN ULONG BusNumber,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress)
+{
+ /* Look as the bus type */
+ if (InterfaceType == PCIBus)
+ {
+ /* Call the PCI registered function */
+ return HalPciTranslateBusAddress(PCIBus,
+ BusNumber,
+ BusAddress,
+ AddressSpace,
+ TranslatedAddress);
+ }
+ else
+ {
+ /* Translation is easy */
+ TranslatedAddress->QuadPart = BusAddress.QuadPart;
+ return TRUE;
+ }
+}
+
+/* EOF */
diff --git a/hal/halx86/generic/legacy/halpcat.c b/hal/halx86/generic/legacy/halpcat.c
index ea16403676e..0b85acd54ae 100644
--- a/hal/halx86/generic/legacy/halpcat.c
+++ b/hal/halx86/generic/legacy/halpcat.c
@@ -1,7 +1,7 @@
/*
* PROJECT: ReactOS HAL
* LICENSE: BSD - See COPYING.ARM in the top level directory
- * FILE: hal/halx86/generic/acpi/halpcat.c
+ * FILE: hal/halx86/generic/legacy/halpcat.c
* PURPOSE: HAL Legacy Support Code
* PROGRAMMERS: ReactOS Portable Systems Group
*/
@@ -29,19 +29,6 @@ HalpSetupAcpiPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
return STATUS_NO_SUCH_DEVICE;
}
-VOID
-NTAPI
-HalpInitializePciBus(VOID)
-{
- /* FIXME: Should do legacy PCI bus detection */
-
- /* FIXME: Should detect chipset hacks */
-
- /* FIXME: Should detect broken PCI hardware and apply hacks */
-
- /* FIXME: Should build resource ranges */
-}
-
VOID
NTAPI
HalpBuildAddressMap(VOID)
diff --git a/hal/halx86/generic/memory.c b/hal/halx86/generic/memory.c
new file mode 100644
index 00000000000..74f20cbc6ed
--- /dev/null
+++ b/hal/halx86/generic/memory.c
@@ -0,0 +1,234 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: hal/halx86/generic/memory.c
+ * PURPOSE: HAL memory management
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+/* Share with Mm headers? */
+#define MM_HAL_VA_START (PVOID)0xFFC00000
+#define MM_HAL_HEAP_START (PVOID)((ULONG_PTR)MM_HAL_VA_START + (1024 * 1024))
+
+/* GLOBALS *******************************************************************/
+
+ULONG HalpUsedAllocDescriptors;
+MEMORY_ALLOCATION_DESCRIPTOR HalpAllocationDescriptorArray[64];
+PVOID HalpHeapStart = MM_HAL_HEAP_START;
+
+
+/* PRIVATE FUNCTIONS *********************************************************/
+
+
+ULONG
+NTAPI
+HalpAllocPhysicalMemory(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
+ IN ULONG MaxAddress,
+ IN ULONG PageCount,
+ IN BOOLEAN Aligned)
+{
+ ULONG UsedDescriptors, Alignment, PhysicalAddress;
+ PFN_NUMBER MaxPage, BasePage;
+ PLIST_ENTRY NextEntry;
+ PMEMORY_ALLOCATION_DESCRIPTOR MdBlock, NewBlock, FreeBlock;
+
+ /* Highest page we'll go */
+ MaxPage = MaxAddress >> PAGE_SHIFT;
+
+ /* We need at least two blocks */
+ if ((HalpUsedAllocDescriptors + 2) > 64) return 0;
+
+ /* Remember how many we have now */
+ UsedDescriptors = HalpUsedAllocDescriptors;
+
+ /* Loop the loader block memory descriptors */
+ NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
+ while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
+ {
+ /* Get the block */
+ MdBlock = CONTAINING_RECORD(NextEntry,
+ MEMORY_ALLOCATION_DESCRIPTOR,
+ ListEntry);
+
+ /* No alignment by default */
+ Alignment = 0;
+
+ /* Unless requested, in which case we use a 64KB block alignment */
+ if (Aligned) Alignment = ((MdBlock->BasePage + 0x0F) & ~0x0F) - MdBlock->BasePage;
+
+ /* Search for free memory */
+ if ((MdBlock->MemoryType == LoaderFree) ||
+ (MdBlock->MemoryType == LoaderFirmwareTemporary))
+ {
+ /* Make sure the page is within bounds, including alignment */
+ BasePage = MdBlock->BasePage;
+ if ((BasePage) &&
+ (MdBlock->PageCount >= PageCount + Alignment) &&
+ (BasePage + PageCount + Alignment < MaxPage))
+ {
+
+ /* We found an address */
+ PhysicalAddress = (BasePage + Alignment) << PAGE_SHIFT;
+ break;
+ }
+ }
+
+ /* Keep trying */
+ NextEntry = NextEntry->Flink;
+ }
+
+ /* If we didn't find anything, get out of here */
+ if (NextEntry == &LoaderBlock->MemoryDescriptorListHead) return 0;
+
+ /* Okay, now get a descriptor */
+ NewBlock = &HalpAllocationDescriptorArray[HalpUsedAllocDescriptors];
+ NewBlock->PageCount = PageCount;
+ NewBlock->BasePage = MdBlock->BasePage + Alignment;
+ NewBlock->MemoryType = LoaderHALCachedMemory;
+
+ /* Update count */
+ UsedDescriptors++;
+ HalpUsedAllocDescriptors = UsedDescriptors;
+
+ /* Check if we had any alignment */
+ if (Alignment)
+ {
+ /* Check if we had leftovers */
+ if ((MdBlock->PageCount - Alignment) != PageCount)
+ {
+ /* Get the next descriptor */
+ FreeBlock = &HalpAllocationDescriptorArray[UsedDescriptors];
+ FreeBlock->PageCount = MdBlock->PageCount - Alignment - PageCount;
+ FreeBlock->BasePage = MdBlock->BasePage + Alignment + PageCount;
+
+ /* One more */
+ HalpUsedAllocDescriptors++;
+
+ /* Insert it into the list */
+ InsertHeadList(&MdBlock->ListEntry, &FreeBlock->ListEntry);
+ }
+
+ /* Use this descriptor */
+ NewBlock->PageCount = Alignment;
+ InsertHeadList(&MdBlock->ListEntry, &NewBlock->ListEntry);
+ }
+ else
+ {
+ /* Consume memory from this block */
+ MdBlock->BasePage += PageCount;
+ MdBlock->PageCount -= PageCount;
+
+ /* Insert the descriptor */
+ InsertTailList(&MdBlock->ListEntry, &NewBlock->ListEntry);
+
+ /* Remove the entry if the whole block was allocated */
+ if (!MdBlock->PageCount == 0) RemoveEntryList(&MdBlock->ListEntry);
+ }
+
+ /* Return the address */
+ return PhysicalAddress;
+}
+
+PVOID
+NTAPI
+HalpMapPhysicalMemory64(IN PHYSICAL_ADDRESS PhysicalAddress,
+ IN ULONG PageCount)
+{
+ PHARDWARE_PTE PointerPte;
+ ULONG UsedPages = 0;
+ PVOID VirtualAddress, BaseAddress;
+
+ /* Start at the current HAL heap base */
+ BaseAddress = HalpHeapStart;
+ VirtualAddress = BaseAddress;
+
+ /* Loop until we have all the pages required */
+ while (UsedPages < PageCount)
+ {
+ /* If this overflows past the HAL heap, it means there's no space */
+ if (VirtualAddress == NULL) return NULL;
+
+ /* Get the PTE for this address */
+ PointerPte = HalAddressToPte(VirtualAddress);
+
+ /* Go to the next page */
+ VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress + PAGE_SIZE);
+
+ /* Check if the page is available */
+ if (PointerPte->Valid)
+ {
+ /* PTE has data, skip it and start with a new base address */
+ BaseAddress = VirtualAddress;
+ UsedPages = 0;
+ continue;
+ }
+
+ /* PTE is available, keep going on this run */
+ UsedPages++;
+ }
+
+ /* Take the base address of the page plus the actual offset in the address */
+ VirtualAddress = (PVOID)((ULONG_PTR)BaseAddress +
+ BYTE_OFFSET(PhysicalAddress.LowPart));
+
+ /* If we are starting at the heap, move the heap */
+ if (BaseAddress == HalpHeapStart)
+ {
+ /* Past this allocation */
+ HalpHeapStart = (PVOID)((ULONG_PTR)BaseAddress + (PageCount * PAGE_SIZE));
+ }
+
+ /* Loop pages that can be mapped */
+ while (UsedPages--)
+ {
+ /* Fill out the PTE */
+ PointerPte = HalAddressToPte(BaseAddress);
+ PointerPte->PageFrameNumber = PhysicalAddress.QuadPart >> PAGE_SHIFT;
+ PointerPte->Valid = 1;
+ PointerPte->Write = 1;
+
+ /* Move to the next address */
+ PhysicalAddress.QuadPart += PAGE_SIZE;
+ BaseAddress = (PVOID)((ULONG_PTR)BaseAddress + PAGE_SIZE);
+ }
+
+ /* Flush the TLB and return the address */
+ HalpFlushTLB();
+ return VirtualAddress;
+}
+
+VOID
+NTAPI
+HalpUnmapVirtualAddress(IN PVOID VirtualAddress,
+ IN ULONG PageCount)
+{
+ PHARDWARE_PTE PointerPte;
+ ULONG i;
+
+ /* Only accept valid addresses */
+ if (VirtualAddress < MM_HAL_VA_START) return;
+
+ /* Align it down to page size */
+ VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress & ~(PAGE_SIZE - 1));
+
+ /* Loop PTEs */
+ PointerPte = HalAddressToPte(VirtualAddress);
+ for (i = 0; i < PageCount; i++)
+ {
+ *(PULONG)PointerPte = 0;
+ PointerPte++;
+ }
+
+ /* Flush the TLB */
+ HalpFlushTLB();
+
+ /* Put the heap back */
+ if (HalpHeapStart > VirtualAddress) HalpHeapStart = VirtualAddress;
+}
+
diff --git a/hal/halx86/generic/timer.c b/hal/halx86/generic/timer.c
index 6d90dada9b8..524b6cecb34 100644
--- a/hal/halx86/generic/timer.c
+++ b/hal/halx86/generic/timer.c
@@ -109,6 +109,7 @@ HalpInitializeClock(VOID)
HalpCurrentRollOver = RollOver;
}
+#ifdef _M_IX86
#ifndef _MINIHAL_
VOID
FASTCALL
@@ -163,6 +164,7 @@ HalpProfileInterruptHandler(IN PKTRAP_FRAME TrapFrame)
}
#endif
+#endif
/* PUBLIC FUNCTIONS ***********************************************************/
diff --git a/hal/halx86/generic/usage.c b/hal/halx86/generic/usage.c
index 02c86e2a046..c35df96c3e5 100644
--- a/hal/halx86/generic/usage.c
+++ b/hal/halx86/generic/usage.c
@@ -509,17 +509,11 @@ HalpEnableInterruptHandler(IN UCHAR Flags,
IN PVOID Handler,
IN KINTERRUPT_MODE Mode)
{
- UCHAR Entry;
-
- /* Convert the vector into the IDT entry */
- Entry = HalVectorToIDTEntry(SystemVector);
-
/* Register the vector */
HalpRegisterVector(Flags, BusVector, SystemVector, Irql);
/* Connect the interrupt */
- ((PKIPCR)KeGetPcr())->IDT[Entry].ExtendedOffset = (USHORT)(((ULONG_PTR)Handler >> 16) & 0xFFFF);
- ((PKIPCR)KeGetPcr())->IDT[Entry].Offset = (USHORT)((ULONG_PTR)Handler);
+ KeRegisterInterruptHandler(SystemVector, Handler);
/* Enable the interrupt */
HalEnableSystemInterrupt(SystemVector, Irql, Mode);
diff --git a/hal/halx86/hal_generic.rbuild b/hal/halx86/hal_generic.rbuild
index 3532d001d18..0cd4e5aac43 100644
--- a/hal/halx86/hal_generic.rbuild
+++ b/hal/halx86/hal_generic.rbuild
@@ -7,20 +7,12 @@
-
- bushndlr.c
- isabus.c
- halbus.c
- pcibus.c
- pcidata.c
- sysbus.c
-
beep.c
cmos.c
display.c
dma.c
drive.c
- halinit.c
+ memory.c
misc.c
profil.c
reboot.c
@@ -29,25 +21,13 @@
usage.c
bios.c
+ halinit.c
portio.c
systimer.S
trap.S
-
-
-
-
- x86bios.c
-
-
-
-
- systimer.S
-
-
-
hal.h
diff --git a/hal/halx86/hal_generic_acpi.rbuild b/hal/halx86/hal_generic_acpi.rbuild
index 3784394b642..97501cb1823 100644
--- a/hal/halx86/hal_generic_acpi.rbuild
+++ b/hal/halx86/hal_generic_acpi.rbuild
@@ -10,7 +10,13 @@
halacpi.c
halpnpdd.c
+ busemul.c
+
+
+ pcibus.c
+
+
diff --git a/hal/halx86/hal_generic_pcat.rbuild b/hal/halx86/hal_generic_pcat.rbuild
index e00ed5bdb4e..51f46eefc71 100644
--- a/hal/halx86/hal_generic_pcat.rbuild
+++ b/hal/halx86/hal_generic_pcat.rbuild
@@ -8,6 +8,15 @@
+
+ bushndlr.c
+ cmosbus.c
+ isabus.c
+ pcibus.c
+ pcidata.c
+ sysbus.c
+
+ bussupp.c
halpcat.c
diff --git a/hal/halx86/hal_mini.rbuild b/hal/halx86/hal_mini.rbuild
index a7baed44639..b2c8b718735 100644
--- a/hal/halx86/hal_mini.rbuild
+++ b/hal/halx86/hal_mini.rbuild
@@ -9,13 +9,16 @@
-
- bushndlr.c
- isabus.c
- halbus.c
- pcibus.c
- pcidata.c
- sysbus.c
+
+
+ bushndlr.c
+ cmosbus.c
+ isabus.c
+ pcibus.c
+ pcidata.c
+ sysbus.c
+
+ bussupp.c
beep.c
bios.c
diff --git a/hal/halx86/halamd64.rbuild b/hal/halx86/halamd64.rbuild
index 92c4f29983d..02f633c9fd0 100644
--- a/hal/halx86/halamd64.rbuild
+++ b/hal/halx86/halamd64.rbuild
@@ -8,6 +8,7 @@
include
+
hal_generic
@@ -19,18 +20,14 @@
spinlock.c
-
+
+ x86bios.c
+ halinit.c
+ stubs.c
+ systimer.S
processor.c
-
diff --git a/hal/halx86/include/bus.h b/hal/halx86/include/bus.h
index 03840227411..38cf406bf13 100644
--- a/hal/halx86/include/bus.h
+++ b/hal/halx86/include/bus.h
@@ -205,6 +205,18 @@ typedef struct _HAL_BUS_HANDLER
/* FUNCTIONS *****************************************************************/
+/* SHARED (Fake PCI-BUS HANDLER) */
+
+extern PCI_CONFIG_HANDLER PCIConfigHandler;
+extern PCI_CONFIG_HANDLER PCIConfigHandlerType1;
+extern PCI_CONFIG_HANDLER PCIConfigHandlerType2;
+
+PPCI_REGISTRY_INFO_INTERNAL
+NTAPI
+HalpQueryPciRegistryInfo(
+ VOID
+);
+
VOID
NTAPI
HalpPCISynchronizeType1(
@@ -277,34 +289,6 @@ HalpWritePCIConfig(
IN ULONG Length
);
-ULONG
-NTAPI
-HalpGetSystemInterruptVector(
- ULONG BusNumber,
- ULONG BusInterruptLevel,
- ULONG BusInterruptVector,
- PKIRQL Irql,
- PKAFFINITY Affinity
-);
-
-ULONG
-NTAPI
-HalpGetCmosData(
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Length
-);
-
-ULONG
-NTAPI
-HalpSetCmosData(
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Length
-);
-
ULONG
NTAPI
HalpGetPCIData(
@@ -340,6 +324,36 @@ HalpAssignPCISlotResources(
IN OUT PCM_RESOURCE_LIST *pAllocatedResources
);
+/* NON-LEGACY */
+
+ULONG
+NTAPI
+HalpGetSystemInterruptVector_Acpi(
+ ULONG BusNumber,
+ ULONG BusInterruptLevel,
+ ULONG BusInterruptVector,
+ PKIRQL Irql,
+ PKAFFINITY Affinity
+);
+
+ULONG
+NTAPI
+HalpGetCmosData(
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Length
+);
+
+ULONG
+NTAPI
+HalpSetCmosData(
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Length
+);
+
VOID
NTAPI
HalpInitializePciBus(
@@ -352,12 +366,6 @@ HalpInitializePciStubs(
VOID
);
-VOID
-NTAPI
-HalpInitBusHandler(
- VOID
-);
-
BOOLEAN
NTAPI
HalpTranslateBusAddress(
@@ -397,6 +405,114 @@ HalpRegisterPciDebuggingDeviceInfo(
VOID
);
+/* LEGACY */
+
+NTSTATUS
+NTAPI
+HalpAdjustPCIResourceList(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList);
+
+ULONG
+NTAPI
+HalpGetPCIIntOnISABus(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG BusInterruptLevel,
+ IN ULONG BusInterruptVector,
+ OUT PKIRQL Irql,
+ OUT PKAFFINITY Affinity);
+VOID
+NTAPI
+HalpPCIPin2ISALine(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PCI_SLOT_NUMBER SlotNumber,
+ IN PPCI_COMMON_CONFIG PciData);
+
+VOID
+NTAPI
+HalpPCIISALine2Pin(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PCI_SLOT_NUMBER SlotNumber,
+ IN PPCI_COMMON_CONFIG PciNewData,
+ IN PPCI_COMMON_CONFIG PciOldData);
+
+NTSTATUS
+NTAPI
+HalpGetISAFixedPCIIrq(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PCI_SLOT_NUMBER PciSlot,
+ OUT PSUPPORTED_RANGE *Range);
+
+VOID
+NTAPI
+HalpInitBusHandler(
+ VOID
+);
+
+ULONG
+NTAPI
+HalpNoBusData(
+ IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length
+);
+
+ULONG
+NTAPI
+HalpcGetCmosData(
+ IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length
+);
+
+ULONG
+NTAPI
+HalpcSetCmosData(
+ IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length
+);
+
+BOOLEAN
+NTAPI
+HalpTranslateSystemBusAddress(
+ IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress
+);
+
+BOOLEAN
+NTAPI
+HalpTranslateIsaBusAddress(
+ IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress
+);
+
+ULONG
+NTAPI
+HalpGetSystemInterruptVector(
+ IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG BusInterruptLevel,
+ IN ULONG BusInterruptVector,
+ OUT PKIRQL Irql,
+ OUT PKAFFINITY Affinity
+);
+
extern ULONG HalpBusType;
extern BOOLEAN HalpPCIConfigInitialized;
extern BUS_HANDLER HalpFakePciBusHandler;
diff --git a/hal/halx86/include/hal.h b/hal/halx86/include/hal.h
index 97e8f4a810e..0c3654f5ff8 100644
--- a/hal/halx86/include/hal.h
+++ b/hal/halx86/include/hal.h
@@ -32,11 +32,13 @@
/* Internal kernel headers */
#include "internal/pci.h"
#define KeGetCurrentThread _KeGetCurrentThread
-#include
-#include
#ifdef _M_AMD64
+#include
+#include
#include "internal/amd64/intrin_i.h"
#else
+#include
+#include
#include "internal/i386/intrin_i.h"
#endif
diff --git a/hal/halx86/include/halp.h b/hal/halx86/include/halp.h
index 6edb85570d7..aa36554c7ec 100644
--- a/hal/halx86/include/halp.h
+++ b/hal/halx86/include/halp.h
@@ -765,6 +765,12 @@ KeUpdateSystemTime(
IN KIRQL OldIrql
);
+VOID
+NTAPI
+HalpInitBusHandlers(
+ VOID
+);
+
#ifdef _M_AMD64
#define KfLowerIrql KeLowerIrql
#ifndef CONFIG_SMP
diff --git a/hal/halx86/up/pic.c b/hal/halx86/up/pic.c
index a710d862567..91b902b1a35 100644
--- a/hal/halx86/up/pic.c
+++ b/hal/halx86/up/pic.c
@@ -94,8 +94,8 @@ PHAL_DISMISS_INTERRUPT HalpSpecialDismissLevelTable[16] =
/* This table contains the static x86 PIC mapping between IRQLs and IRQs */
ULONG KiI8259MaskTable[32] =
{
-#ifdef __GNUC__
-#if __GNUC__ * 100 + __GNUC_MINOR__ >= 404
+#if defined(__GNUC__) && \
+ (__GNUC__ * 100 + __GNUC_MINOR__ >= 404)
/*
* It Device IRQLs only start at 4 or higher, so these are just software
* IRQLs that don't really change anything on the hardware
@@ -206,14 +206,13 @@ ULONG KiI8259MaskTable[32] =
0xFFFFFFFB, /* IRQL 30 */
0xFFFFFFFB /* IRQL 31 */
#endif
-#endif
};
/* This table indicates which IRQs, if pending, can preempt a given IRQL level */
ULONG FindHigherIrqlMask[32] =
{
-#ifdef __GNUC__
-#if __GNUC__ * 100 + __GNUC_MINOR__ >= 404
+#if defined(__GNUC__) && \
+ (__GNUC__ * 100 + __GNUC_MINOR__ >= 404)
/*
* Software IRQLs, at these levels all hardware interrupts can preempt.
* Each higher IRQL simply enables which software IRQL can preempt the
@@ -313,7 +312,6 @@ ULONG FindHigherIrqlMask[32] =
0, /* IRQL 30 */
0 /* IRQL 31 */
#endif
-#endif
};
/* Denotes minimum required IRQL before we can process pending SW interrupts */
@@ -329,6 +327,8 @@ KIRQL SWInterruptLookUpTable[8] =
DISPATCH_LEVEL /* IRR 7 */
};
+#if defined(__GNUC__)
+
#define HalpDelayedHardwareInterrupt(x) \
VOID HalpHardwareInterrupt##x(VOID); \
VOID \
@@ -337,6 +337,23 @@ KIRQL SWInterruptLookUpTable[8] =
asm volatile ("int $%c0\n"::"i"(PRIMARY_VECTOR_BASE + x)); \
}
+#elif defined(_MSC_VER)
+
+#define HalpDelayedHardwareInterrupt(x) \
+ VOID HalpHardwareInterrupt##x(VOID); \
+ VOID \
+ HalpHardwareInterrupt##x(VOID) \
+ { \
+ __asm \
+ { \
+ int PRIMARY_VECTOR_BASE + x \
+ } \
+ }
+
+#else
+#error Unsupported compiler
+#endif
+
/* Pending/delayed hardware interrupt handlers */
HalpDelayedHardwareInterrupt(0);
HalpDelayedHardwareInterrupt(1);
@@ -522,7 +539,7 @@ KeRaiseIrqlToDpcLevel(VOID)
CurrentIrql = Pcr->Irql;
Pcr->Irql = DISPATCH_LEVEL;
-#ifdef IRQL_DEBUG
+#if DBG
/* Validate correct raise */
if (CurrentIrql > DISPATCH_LEVEL) KeBugCheck(IRQL_NOT_GREATER_OR_EQUAL);
#endif
@@ -545,7 +562,7 @@ KeRaiseIrqlToSynchLevel(VOID)
CurrentIrql = Pcr->Irql;
Pcr->Irql = SYNCH_LEVEL;
-#ifdef IRQL_DEBUG
+#if DBG
/* Validate correct raise */
if (CurrentIrql > SYNCH_LEVEL)
{
@@ -575,7 +592,7 @@ KfRaiseIrql(IN KIRQL NewIrql)
/* Read current IRQL */
CurrentIrql = Pcr->Irql;
-#ifdef IRQL_DEBUG
+#if DBG
/* Validate correct raise */
if (CurrentIrql > NewIrql)
{
@@ -605,7 +622,7 @@ KfLowerIrql(IN KIRQL OldIrql)
PKPCR Pcr = KeGetPcr();
PIC_MASK Mask;
-#ifdef IRQL_DEBUG
+#if DBG
/* Validate correct lower */
if (OldIrql > Pcr->Irql)
{
diff --git a/include/crt/_mingw.h b/include/crt/_mingw.h
index d4e53ff435a..cff811248d8 100644
--- a/include/crt/_mingw.h
+++ b/include/crt/_mingw.h
@@ -157,10 +157,12 @@ allow GCC to optimize away some EH unwind code, at least in DW2 case. */
//#endif
#ifdef __GNUC__
+#ifndef __clang__
#define __int8 char
#define __int16 short
#define __int32 int
#define __int64 long long
+#endif
#ifdef _WIN64
typedef int __int128 __attribute__ ((mode (TI)));
# endif
diff --git a/include/crt/assert.h b/include/crt/assert.h
index 252fd54a269..9107ee5a272 100644
--- a/include/crt/assert.h
+++ b/include/crt/assert.h
@@ -28,8 +28,7 @@ extern "C" {
#endif
#ifndef assert
-//#define assert(_Expression) (void)((!!(_Expression)) || (_assert(#_Expression,__FILE__,__LINE__),0))
-#define assert(_Expression) (void)((!!(_Expression)))// || (_wassert(_CRT_WIDE(#_Expression),_CRT_WIDE(__FILE__),__LINE__),0))
+#define assert(_Expression) (void)((!!(_Expression)) || (_assert(#_Expression,__FILE__,__LINE__),0))
#endif
#ifndef wassert
diff --git a/include/crt/math.h b/include/crt/math.h
index 9b645c15a51..fe4b4bc65b8 100644
--- a/include/crt/math.h
+++ b/include/crt/math.h
@@ -435,8 +435,6 @@ __CRT_INLINE int isinf (double d) {
return res;
}
- extern long double __cdecl modfl (long double, long double*);
-
/* 7.12.6.13 */
extern double __cdecl scalbn (double, int);
extern float __cdecl scalbnf (float, int);
@@ -458,7 +456,6 @@ __CRT_INLINE int isinf (double d) {
extern long double __cdecl expl(long double);
extern long double expm1l(long double);
extern long double __cdecl coshl(long double);
- extern long double __cdecl fabsl (long double);
extern long double __cdecl acosl(long double);
extern long double __cdecl asinl(long double);
extern long double __cdecl atanl(long double);
diff --git a/include/crt/mingw32/intrin_x86.h b/include/crt/mingw32/intrin_x86.h
index 9e83ed81838..5b6f32d18a3 100644
--- a/include/crt/mingw32/intrin_x86.h
+++ b/include/crt/mingw32/intrin_x86.h
@@ -114,7 +114,7 @@ __INTRIN_INLINE long _InterlockedCompareExchange(volatile long * const Destinati
__INTRIN_INLINE void * _InterlockedCompareExchangePointer(void * volatile * const Destination, void * const Exchange, void * const Comperand)
{
- return __sync_val_compare_and_swap(Destination, Comperand, Exchange);
+ return (void *)__sync_val_compare_and_swap(Destination, Comperand, Exchange);
}
__INTRIN_INLINE long _InterlockedExchange(volatile long * const Target, const long Value)
@@ -137,7 +137,7 @@ __INTRIN_INLINE void * _InterlockedExchangePointer(void * volatile * const Targe
{
/* NOTE: ditto */
__sync_synchronize();
- return __sync_lock_test_and_set(Target, Value);
+ return (void *)__sync_lock_test_and_set(Target, Value);
}
__INTRIN_INLINE long _InterlockedExchangeAdd16(volatile short * const Addend, const short Value)
diff --git a/include/crt/sec_api/wchar_s.h b/include/crt/sec_api/wchar_s.h
index 94251aa8b64..8a3ea3739d5 100644
--- a/include/crt/sec_api/wchar_s.h
+++ b/include/crt/sec_api/wchar_s.h
@@ -96,16 +96,6 @@ extern "C" {
_CRTIMP errno_t __cdecl _wcsupr_s_l(wchar_t *_Str,size_t _Size,_locale_t _Locale);
#endif
-#ifndef _WTIME_S_DEFINED
-#define _WTIME_S_DEFINED
- _CRTIMP errno_t __cdecl _wasctime_s(wchar_t *_Buf,size_t _SizeInWords,const struct tm *_Tm);
- _CRTIMP errno_t __cdecl _wctime32_s(wchar_t *_Buf,size_t _SizeInWords,const __time32_t *_Time);
- _CRTIMP errno_t __cdecl _wstrdate_s(wchar_t *_Buf,size_t _SizeInWords);
- _CRTIMP errno_t __cdecl _wstrtime_s(wchar_t *_Buf,size_t _SizeInWords);
-#if _INTEGRAL_MAX_BITS >= 64
- _CRTIMP errno_t __cdecl _wctime64_s(wchar_t *_Buf,size_t _SizeInWords,const __time64_t *_Time);
-#endif
-
#if !defined (RC_INVOKED) && !defined (_INC_WTIME_S_INL)
#define _INC_WTIME_S_INL
#ifdef _USE_32BIT_TIME_T
diff --git a/include/crt/stdlib.h b/include/crt/stdlib.h
index d4846fa2c71..0efd5cc4321 100644
--- a/include/crt/stdlib.h
+++ b/include/crt/stdlib.h
@@ -345,11 +345,15 @@ extern "C" {
void *__cdecl bsearch(const void *_Key,const void *_Base,size_t _NumOfElements,size_t _SizeOfElements,int (__cdecl *_PtFuncCompare)(const void *,const void *));
void __cdecl qsort(void *_Base,size_t _NumOfElements,size_t _SizeOfElements,int (__cdecl *_PtFuncCompare)(const void *,const void *));
#endif
+
+#if !defined(__GNUC__) && !defined(__clang)
unsigned short __cdecl _byteswap_ushort(unsigned short _Short);
- /*unsigned long __cdecl _byteswap_ulong (unsigned long _Long); */
+ unsigned long __cdecl _byteswap_ulong (unsigned long _Long);
#if _INTEGRAL_MAX_BITS >= 64
__MINGW_EXTENSION unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 _Int64);
#endif
+#endif
+
div_t __cdecl div(int _Numerator,int _Denominator);
char *__cdecl getenv(const char *_VarName);
_CRTIMP char *__cdecl _itoa(int _Value,char *_Dest,int _Radix);
@@ -478,6 +482,7 @@ extern "C" {
void __cdecl perror(const char *_ErrMsg);
#endif
_CRTIMP int __cdecl _putenv(const char *_EnvString);
+#if !defined(__GNUC__) && !defined(__clang)
unsigned int __cdecl _rotl(unsigned int _Val,int _Shift);
#if _INTEGRAL_MAX_BITS >= 64
__MINGW_EXTENSION unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val,int _Shift);
@@ -485,6 +490,7 @@ extern "C" {
unsigned int __cdecl _rotr(unsigned int _Val,int _Shift);
#if _INTEGRAL_MAX_BITS >= 64
__MINGW_EXTENSION unsigned __int64 __cdecl _rotr64(unsigned __int64 _Val,int _Shift);
+#endif
#endif
_CRTIMP void __cdecl _searchenv(const char *_Filename,const char *_EnvVar,char *_ResultPath);
_CRTIMP void __cdecl _splitpath(const char *_FullPath,char *_Drive,char *_Dir,char *_Filename,char *_Ext);
diff --git a/include/crt/time.h b/include/crt/time.h
index 75da425e3a1..5cf88adf7c9 100644
--- a/include/crt/time.h
+++ b/include/crt/time.h
@@ -114,6 +114,7 @@ extern "C" {
_CRT_OBSOLETE(GetLocalTime) unsigned __cdecl _getsystime(struct tm *_Tm);
_CRT_OBSOLETE(GetLocalTime) unsigned __cdecl _setsystime(struct tm *_Tm,unsigned _MilliSec);
+ _CRTIMP errno_t __cdecl asctime_s(char *_Buf,size_t _SizeInWords,const struct tm *_Tm);
_CRTIMP errno_t __cdecl _ctime32_s(char *_Buf,size_t _SizeInBytes,const __time32_t *_Time);
_CRTIMP errno_t __cdecl _gmtime32_s(struct tm *_Tm,const __time32_t *_Time);
_CRTIMP errno_t __cdecl _localtime32_s(struct tm *_Tm,const __time32_t *_Time);
@@ -184,6 +185,7 @@ __CRT_INLINE double __cdecl difftime(time_t _Time1,time_t _Time2) { return _diff
__CRT_INLINE char *__cdecl ctime(const time_t *_Time) { return _ctime32(_Time); }
__CRT_INLINE struct tm *__cdecl gmtime(const time_t *_Time) { return _gmtime32(_Time); }
__CRT_INLINE struct tm *__cdecl localtime(const time_t *_Time) { return _localtime32(_Time); }
+__CRT_INLINE errno_t __cdecl localtime_s(struct tm *_Tm,const time_t *_Time) { return _localtime32_s(_Tm,_Time); }
__CRT_INLINE time_t __cdecl mktime(struct tm *_Tm) { return _mktime32(_Tm); }
__CRT_INLINE time_t __cdecl _mkgmtime(struct tm *_Tm) { return _mkgmtime32(_Tm); }
__CRT_INLINE time_t __cdecl time(time_t *_Time) { return _time32(_Time); }
@@ -193,6 +195,7 @@ __CRT_INLINE double __cdecl difftime(time_t _Time1,time_t _Time2) { return _diff
__CRT_INLINE char *__cdecl ctime(const time_t *_Time) { return _ctime64(_Time); }
__CRT_INLINE struct tm *__cdecl gmtime(const time_t *_Time) { return _gmtime64(_Time); }
__CRT_INLINE struct tm *__cdecl localtime(const time_t *_Time) { return _localtime64(_Time); }
+__CRT_INLINE errno_t __cdecl localtime_s(struct tm *_Tm,const time_t *_Time) { return _localtime64_s(_Tm,_Time); }
__CRT_INLINE time_t __cdecl mktime(struct tm *_Tm) { return _mktime64(_Tm); }
__CRT_INLINE time_t __cdecl _mkgmtime(struct tm *_Tm) { return _mkgmtime64(_Tm); }
__CRT_INLINE time_t __cdecl time(time_t *_Time) { return _time64(_Time); }
@@ -214,7 +217,5 @@ __CRT_INLINE time_t __cdecl time(time_t *_Time) { return _time64(_Time); }
#pragma pack(pop)
-#include
-
#endif /* End _TIME_H_ */
diff --git a/include/crt/wchar.h b/include/crt/wchar.h
index f70dfbbc6a2..364b1697534 100644
--- a/include/crt/wchar.h
+++ b/include/crt/wchar.h
@@ -751,19 +751,27 @@ _CRTIMP int __cdecl iswblank(wint_t _C);
_CRTIMP size_t __cdecl _wcsftime_l(wchar_t *_Buf,size_t _SizeInWords,const wchar_t *_Format,const struct tm *_Tm,_locale_t _Locale);
_CRTIMP wchar_t *__cdecl _wstrdate(wchar_t *_Buffer);
_CRTIMP wchar_t *__cdecl _wstrtime(wchar_t *_Buffer);
+
+ _CRTIMP errno_t __cdecl _wasctime_s(wchar_t *_Buf,size_t _SizeInWords,const struct tm *_Tm);
+ _CRTIMP errno_t __cdecl _wctime32_s(wchar_t *_Buf,size_t _SizeInWords,const __time32_t *_Time);
+ _CRTIMP errno_t __cdecl _wstrdate_s(wchar_t *_Buf,size_t _SizeInWords);
+ _CRTIMP errno_t __cdecl _wstrtime_s(wchar_t *_Buf,size_t _SizeInWords);
+
#if _INTEGRAL_MAX_BITS >= 64
_CRTIMP wchar_t *__cdecl _wctime64(const __time64_t *_Time);
+ _CRTIMP errno_t __cdecl _wctime64_s(wchar_t *_Buf,size_t _SizeInWords,const __time64_t *_Time);
#endif
#if !defined (RC_INVOKED) && !defined (_INC_WTIME_INL)
#define _INC_WTIME_INL
#ifdef _USE_32BIT_TIME_T
__CRT_INLINE wchar_t *__cdecl _wctime(const time_t *_Time) { return _wctime32(_Time); }
-#else
+#else /* !_USE_32BIT_TIME_T */
__CRT_INLINE wchar_t *__cdecl _wctime(const time_t *_Time) { return _wctime64(_Time); }
-#endif
-#endif
-#endif
+#endif /* !_USE_32BIT_TIME_T */
+#endif /* !defined (RC_INVOKED) && !defined (_INC_WTIME_INL) */
+
+#endif /* _WTIME_DEFINED */
typedef int mbstate_t;
typedef wchar_t _Wint_t;
diff --git a/include/ddk/ntifs.h b/include/ddk/ntifs.h
index c05458e81f2..7c91023e6d6 100644
--- a/include/ddk/ntifs.h
+++ b/include/ddk/ntifs.h
@@ -6188,6 +6188,20 @@ typedef LBN *PLBN;
typedef ULONG VBN;
typedef VBN *PVBN;
+#define FSRTL_COMMON_FCB_HEADER_LAYOUT \
+ CSHORT NodeTypeCode; \
+ CSHORT NodeByteSize; \
+ UCHAR Flags; \
+ UCHAR IsFastIoPossible; \
+ UCHAR Flags2; \
+ UCHAR Reserved:4; \
+ UCHAR Version:4; \
+ PERESOURCE Resource; \
+ PERESOURCE PagingIoResource; \
+ LARGE_INTEGER AllocationSize; \
+ LARGE_INTEGER FileSize; \
+ LARGE_INTEGER ValidDataLength;
+
#define FSRTL_COMMON_FCB_HEADER_LAYOUT \
CSHORT NodeTypeCode; \
CSHORT NodeByteSize; \
diff --git a/include/ddk/ntstrsafe.h b/include/ddk/ntstrsafe.h
index d5a02cb1bf7..447a3a5265c 100644
--- a/include/ddk/ntstrsafe.h
+++ b/include/ddk/ntstrsafe.h
@@ -36,7 +36,7 @@ typedef unsigned long DWORD;
__inline
NTSTATUS
NTAPI
-RtlStringLengthWorkerA(IN PCHAR String,
+RtlStringLengthWorkerA(IN LPCSTR String,
IN SIZE_T MaxLength,
OUT PSIZE_T ReturnLength OPTIONAL)
{
@@ -69,7 +69,7 @@ RtlStringLengthWorkerA(IN PCHAR String,
__inline
NTSTATUS
NTAPI
-RtlStringValidateDestA(IN PCHAR Destination,
+RtlStringValidateDestA(IN LPSTR Destination,
IN SIZE_T Length,
OUT PSIZE_T ReturnLength OPTIONAL,
IN SIZE_T MaxLength)
@@ -98,7 +98,7 @@ RtlStringValidateDestA(IN PCHAR Destination,
__inline
NTSTATUS
NTAPI
-RtlStringExValidateDestA(IN OUT PCHAR *Destination,
+RtlStringExValidateDestA(IN OUT LPSTR *Destination,
IN OUT PSIZE_T DestinationLength,
OUT PSIZE_T ReturnLength OPTIONAL,
IN SIZE_T MaxLength,
@@ -114,7 +114,7 @@ RtlStringExValidateDestA(IN OUT PCHAR *Destination,
__inline
NTSTATUS
NTAPI
-RtlStringExValidateSrcA(IN OUT PCCHAR *Source OPTIONAL,
+RtlStringExValidateSrcA(IN OUT LPCSTR *Source OPTIONAL,
IN OUT PSIZE_T ReturnLength OPTIONAL,
IN SIZE_T MaxLength,
IN DWORD Flags)
@@ -133,10 +133,10 @@ RtlStringExValidateSrcA(IN OUT PCCHAR *Source OPTIONAL,
__inline
NTSTATUS
NTAPI
-RtlStringVPrintfWorkerA(OUT PCHAR Destination,
+RtlStringVPrintfWorkerA(OUT LPSTR Destination,
IN SIZE_T Length,
OUT PSIZE_T NewLength OPTIONAL,
- IN PCCHAR Format,
+ IN LPCSTR Format,
IN va_list argList)
{
NTSTATUS Status = STATUS_SUCCESS;
@@ -174,10 +174,10 @@ RtlStringVPrintfWorkerA(OUT PCHAR Destination,
__inline
NTSTATUS
NTAPI
-RtlStringCopyWorkerA(OUT PCHAR Destination,
+RtlStringCopyWorkerA(OUT LPSTR Destination,
IN SIZE_T Length,
OUT PSIZE_T NewLength OPTIONAL,
- IN PCCHAR Source,
+ IN LPCSTR Source,
IN SIZE_T CopyLength)
{
NTSTATUS Status = STATUS_SUCCESS;
@@ -211,9 +211,9 @@ RtlStringCopyWorkerA(OUT PCHAR Destination,
__inline
NTSTATUS
NTAPI
-RtlStringCchCopyA(IN PCHAR Destination,
+RtlStringCchCopyA(IN LPSTR Destination,
IN SIZE_T cchDest,
- IN PCCHAR pszSrc)
+ IN LPCSTR pszSrc)
{
ASSERTMSG("RtlStringCchCopyA is UNIMPLEMENTED!\n", FALSE);
return STATUS_NOT_IMPLEMENTED;
@@ -222,9 +222,9 @@ RtlStringCchCopyA(IN PCHAR Destination,
__inline
NTSTATUS
NTAPI
-RtlStringCbPrintfA(OUT PCHAR Destination,
+RtlStringCbPrintfA(OUT LPSTR Destination,
IN SIZE_T Length,
- IN PCHAR Format,
+ IN LPCSTR Format,
...)
{
NTSTATUS Status;
@@ -252,12 +252,12 @@ RtlStringCbPrintfA(OUT PCHAR Destination,
__inline
NTSTATUS
NTAPI
-RtlStringCbPrintfExA(OUT PCHAR Destination,
+RtlStringCbPrintfExA(OUT LPSTR Destination,
IN SIZE_T Length,
- OUT PCHAR *DestinationEnd OPTIONAL,
+ OUT LPSTR *DestinationEnd OPTIONAL,
OUT PSIZE_T RemainingSize OPTIONAL,
IN DWORD Flags,
- IN PCCHAR Format,
+ IN LPCSTR Format,
...)
{
NTSTATUS Status;
@@ -333,10 +333,10 @@ RtlStringCbPrintfExA(OUT PCHAR Destination,
__inline
NTSTATUS
NTAPI
-RtlStringCbCopyExA(OUT PCHAR Destination,
+RtlStringCbCopyExA(OUT LPSTR Destination,
IN SIZE_T Length,
- IN PCCHAR Source,
- OUT PCHAR *DestinationEnd OPTIONAL,
+ IN LPCSTR Source,
+ OUT LPSTR *DestinationEnd OPTIONAL,
OUT PSIZE_T RemainingSize OPTIONAL,
IN DWORD Flags)
{
@@ -423,10 +423,10 @@ RtlStringCbPrintfW(
__inline
NTSTATUS
NTAPI
-RtlStringCbCatExA(IN OUT PCHAR Destination,
+RtlStringCbCatExA(IN OUT LPSTR Destination,
IN SIZE_T Length,
- IN PCCHAR Source,
- OUT PCHAR *DestinationEnd OPTIONAL,
+ IN LPCSTR Source,
+ OUT LPSTR *DestinationEnd OPTIONAL,
OUT PSIZE_T RemainingSize OPTIONAL,
IN DWORD Flags)
{
@@ -497,9 +497,9 @@ RtlStringCbCatExA(IN OUT PCHAR Destination,
__inline
NTSTATUS
NTAPI
-RtlStringCbCopyA(OUT PCHAR Destination,
+RtlStringCbCopyA(OUT LPSTR Destination,
IN SIZE_T Length,
- IN PCCHAR Source)
+ IN LPCSTR Source)
{
NTSTATUS Status;
SIZE_T CharLength = Length / sizeof(CHAR);
diff --git a/include/dxsdk/ksguid.h b/include/dxsdk/ksguid.h
index 84b1e59487c..51b1bb38a36 100644
--- a/include/dxsdk/ksguid.h
+++ b/include/dxsdk/ksguid.h
@@ -6,7 +6,7 @@
#endif
#if !defined( DEFINE_WAVEFORMATEX_GUID )
- #define DEFINE_WAVEFORMATEX_GUID(x) (USHORT)(x), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
+ #define DEFINE_WAVEFORMATEX_GUID(x) (USHORT)(x), 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
#endif
#if defined( DEFINE_GUIDEX )
diff --git a/include/ndk/pstypes.h b/include/ndk/pstypes.h
index 43b44680960..414e2dcbec1 100644
--- a/include/ndk/pstypes.h
+++ b/include/ndk/pstypes.h
@@ -60,7 +60,11 @@ Author:
#define FLG_ENABLE_CSRDEBUG 0x00020000
#define FLG_ENABLE_KDEBUG_SYMBOL_LOAD 0x00040000
#define FLG_DISABLE_PAGE_KERNEL_STACKS 0x00080000
+#if (NTDDI_VERSION < NTDDI_WINXP)
#define FLG_HEAP_ENABLE_CALL_TRACING 0x00100000
+#else
+#define FLG_ENABLE_SYSTEM_CRIT_BREAKS 0x00100000
+#endif
#define FLG_HEAP_DISABLE_COALESCING 0x00200000
#define FLG_ENABLE_CLOSE_EXCEPTIONS 0x00400000
#define FLG_ENABLE_EXCEPTION_LOGGING 0x00800000
diff --git a/include/ndk/rtlfuncs.h b/include/ndk/rtlfuncs.h
index 18aa4749ad4..d0f3f06d701 100644
--- a/include/ndk/rtlfuncs.h
+++ b/include/ndk/rtlfuncs.h
@@ -2042,12 +2042,12 @@ RtlRemoteCall(
);
NTSYSAPI
-VOID
+NTSTATUS
NTAPI
RtlSetProcessIsCritical(
IN BOOLEAN NewValue,
OUT PBOOLEAN OldValue OPTIONAL,
- IN BOOLEAN IsWinlogon
+ IN BOOLEAN NeedBreaks
);
NTSYSAPI
diff --git a/include/psdk/commctrl.h b/include/psdk/commctrl.h
index 9f3366e3474..bc452a2f9db 100644
--- a/include/psdk/commctrl.h
+++ b/include/psdk/commctrl.h
@@ -2240,6 +2240,7 @@ extern "C" {
#define LVSIL_NORMAL 0
#define LVSIL_SMALL 1
#define LVSIL_STATE 2
+#define LVSIL_GROUPHEADER 3
#define LVM_SETIMAGELIST (LVM_FIRST+3)
#define ListView_SetImageList(hwnd,himl,iImageList) (HIMAGELIST)SNDMSG((hwnd),LVM_SETIMAGELIST,(WPARAM)(iImageList),(LPARAM)(HIMAGELIST)(himl))
@@ -2392,6 +2393,7 @@ extern "C" {
#define LVFI_PARAM 0x1
#define LVFI_STRING 0x2
+#define LVFI_SUBSTRING 0x4
#define LVFI_PARTIAL 0x8
#define LVFI_WRAP 0x20
#define LVFI_NEARESTXY 0x40
@@ -4380,6 +4382,8 @@ typedef struct tagTVDISPINFOEXW {
SYSTEMTIME st;
} MCHITTESTINFO,*PMCHITTESTINFO;
+#define MCHITTESTINFO_V1_SIZE CCSIZEOF_STRUCT(MCHITTESTINFO, st)
+
#define MCHT_TITLE 0x10000
#define MCHT_CALENDAR 0x20000
#define MCHT_TODAYLINK 0x30000
diff --git a/include/psdk/ks.h b/include/psdk/ks.h
index 2290d7cf4e2..62357d623a1 100644
--- a/include/psdk/ks.h
+++ b/include/psdk/ks.h
@@ -166,77 +166,77 @@ DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_P
*/
#define STATIC_KSCATEGORY_BRIDGE \
- 0x085AFF00L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x085AFF00L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000", KSCATEGORY_BRIDGE);
#define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE)
#define STATIC_KSCATEGORY_CAPTURE \
- 0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0x65E8773DL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_CAPTURE);
#define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE)
#define STATIC_KSCATEGORY_RENDER \
- 0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0x65E8773EL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_RENDER);
#define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER)
#define STATIC_KSCATEGORY_MIXER \
- 0xAD809C00L, 0x7B88, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0xAD809C00L, 0x7B88, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000", KSCATEGORY_MIXER);
#define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER)
#define STATIC_KSCATEGORY_SPLITTER \
- 0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x0A4252A0L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_SPLITTER);
#define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER)
#define STATIC_KSCATEGORY_DATACOMPRESSOR \
- 0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x1E84C900L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATACOMPRESSOR);
#define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR)
#define STATIC_KSCATEGORY_DATADECOMPRESSOR \
- 0x2721AE20L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x2721AE20L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATADECOMPRESSOR);
#define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR)
#define STATIC_KSCATEGORY_DATATRANSFORM \
- 0x2EB07EA0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x2EB07EA0L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATATRANSFORM);
#define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM)
#define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \
- 0xCF1DDA2CL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0xCF1DDA2CL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_COMMUNICATIONSTRANSFORM);
#define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM)
#define STATIC_KSCATEGORY_INTERFACETRANSFORM \
- 0xCF1DDA2DL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0xCF1DDA2DL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_INTERFACETRANSFORM);
#define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM)
#define STATIC_KSCATEGORY_MEDIUMTRANSFORM \
- 0xCF1DDA2EL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0xCF1DDA2EL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_MEDIUMTRANSFORM);
#define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM)
#define STATIC_KSCATEGORY_FILESYSTEM \
- 0x760FED5EL, 0x9357, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0x760FED5EL, 0x9357, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196", KSCATEGORY_FILESYSTEM);
#define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM)
#define STATIC_KSCATEGORY_CLOCK \
- 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x53172480L, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSCATEGORY_CLOCK);
#define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK)
#define STATIC_KSCATEGORY_PROXY \
- 0x97EBAACAL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0x97EBAACAL, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_PROXY);
#define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY)
#define STATIC_KSCATEGORY_QUALITY \
- 0x97EBAACBL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0x97EBAACBL, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_QUALITY);
#define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY)
@@ -308,7 +308,7 @@ typedef enum
} KSINTERFACE_STANDARD;
#define STATIC_KSINTERFACESETID_FileIo \
- 0x8C6F932CL, 0xE771, 0x11D0, 0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0x8C6F932CL, 0xE771, 0x11D0, {0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196", KSINTERFACESETID_FileIo);
#define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo)
@@ -337,7 +337,7 @@ DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000", KSMEDIUMSETID_Standard
*/
#define STATIC_KSPROPSETID_Clock \
- 0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0xDF12A4C0L, 0xAC17, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000", KSPROPSETID_Clock);
#define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock)
@@ -355,7 +355,7 @@ typedef enum
} KSPROPERTY_CLOCK;
#define STATIC_KSEVENTSETID_Clock \
- 0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x364D8E20L, 0x62C7, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000", KSEVENTSETID_Clock);
#define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock)
@@ -491,7 +491,7 @@ typedef enum
*/
#define KSPROPSETID_GM \
- 0xAF627536L, 0xE719, 0x11D2, 0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D
+ 0xAF627536L, 0xE719, 0x11D2, {0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D}
typedef enum
{
@@ -508,7 +508,7 @@ typedef enum
*/
#define STATIC_KSPROPSETID_MediaSeeking\
- 0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0xEE904F0CL, 0xD09B, 0x11D0, {0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196", KSPROPSETID_MediaSeeking);
#define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking)
@@ -652,12 +652,12 @@ typedef struct {
*/
#define STATIC_KSPROPSETID_Pin\
- 0x8C134960L, 0x51AD, 0x11CF, 0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00
+ 0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000", KSPROPSETID_Pin);
#define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin)
#define STATIC_KSNAME_Pin\
- 0x146F1A80L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x146F1A80L, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000", KSNAME_Pin);
#define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin)
@@ -725,7 +725,7 @@ typedef enum
*/
#define STATIC_KSPROPSETID_Stream\
- 0x65aaba60L, 0x98ae, 0x11cf, 0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
+ 0x65aaba60L, 0x98ae, 0x11cf, {0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4", KSPROPSETID_Stream);
#define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream)
@@ -844,7 +844,7 @@ typedef enum
*/
#define STATIC_KSPROPSETID_StreamAllocator\
- 0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
+ 0xcf6e4342L, 0xec87, 0x11cf, {0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4", KSPROPSETID_StreamAllocator);
#define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator)
@@ -855,7 +855,7 @@ typedef enum
} KSPROPERTY_STREAMALLOCATOR;
#define KSMETHODSETID_StreamAllocator \
- 0xcf6e4341L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
+ 0xcf6e4341L, 0xec87, 0x11cf, {0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
typedef enum
{
@@ -893,7 +893,7 @@ typedef enum
*/
#define STATIC_KSPROPSETID_Topology\
- 0x720D4AC0L, 0x7533, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000", KSPROPSETID_Topology);
#define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology)
@@ -1243,7 +1243,7 @@ typedef PVOID KSDEVICE_HEADER,
*/
#define STATIC_KSDATAFORMAT_SPECIFIER_NONE\
- 0x0F6417D6L, 0xC318, 0x11D0, 0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0x0F6417D6L, 0xC318, 0x11D0, {0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196", KSDATAFORMAT_SPECIFIER_NONE);
#define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE)
diff --git a/include/psdk/ksmedia.h b/include/psdk/ksmedia.h
index a1b1c0c314e..32e5e3e5269 100644
--- a/include/psdk/ksmedia.h
+++ b/include/psdk/ksmedia.h
@@ -28,7 +28,7 @@ DEFINE_GUIDSTRUCT("FBF6F530-07B9-11D2-A71E-0000F8004788", KSCATEGORY_AUDIO_DEVIC
/* video */
#define STATIC_PINNAME_VIDEO_CAPTURE \
- 0xfb6c4281, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
+ 0xfb6c4281, 0x353, 0x11d1, {0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba}
#define STATIC_PINNAME_CAPTURE STATIC_PINNAME_VIDEO_CAPTURE
DEFINE_GUIDSTRUCT("FB6C4281-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_CAPTURE);
#define PINNAME_VIDEO_CAPTURE DEFINE_GUIDNAMED(PINNAME_VIDEO_CAPTURE)
@@ -130,32 +130,32 @@ DEFINE_GUIDSTRUCT("9EA331FA-B91B-45F8-9285-BD2BC77AFCDE", KSCATEGORY_AUDIO_SPLIT
*/
#define STATIC_KSNODETYPE_ADC\
- 0x4D837FE0L, 0xC555, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x4D837FE0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("4D837FE0-C555-11D0-8A2B-00A0C9255AC1", KSNODETYPE_ADC);
#define KSNODETYPE_ADC DEFINE_GUIDNAMED(KSNODETYPE_ADC)
#define STATIC_KSNODETYPE_AGC\
- 0xE88C9BA0L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0xE88C9BA0L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("E88C9BA0-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_AGC);
#define KSNODETYPE_AGC DEFINE_GUIDNAMED(KSNODETYPE_AGC)
#define STATIC_KSNODETYPE_3D_EFFECTS\
- 0x55515860L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x55515860L, 0xC559, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("55515860-C559-11D0-8A2B-00A0C9255AC1", KSNODETYPE_3D_EFFECTS);
#define KSNODETYPE_3D_EFFECTS DEFINE_GUIDNAMED(KSNODETYPE_3D_EFFECTS)
#define STATIC_KSNODETYPE_SUPERMIX\
- 0xE573ADC0L, 0xC555, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0xE573ADC0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("E573ADC0-C555-11D0-8A2B-00A0C9255AC1", KSNODETYPE_SUPERMIX);
#define KSNODETYPE_SUPERMIX DEFINE_GUIDNAMED(KSNODETYPE_SUPERMIX)
#define STATIC_KSNODETYPE_SRC\
- 0x9DB7B9E0L, 0xC555, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x9DB7B9E0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("9DB7B9E0-C555-11D0-8A2B-00A0C9255AC1", KSNODETYPE_SRC);
#define KSNODETYPE_SRC DEFINE_GUIDNAMED(KSNODETYPE_SRC)
#define STATIC_KSNODETYPE_DAC\
- 0x507AE360L, 0xC554, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x507AE360L, 0xC554, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("507AE360-C554-11D0-8A2B-00A0C9255AC1", KSNODETYPE_DAC);
#define KSNODETYPE_DAC DEFINE_GUIDNAMED(KSNODETYPE_DAC)
@@ -175,12 +175,12 @@ DEFINE_GUIDSTRUCT("DFF220E3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_CD_PLAYER);
#define KSNODETYPE_CD_PLAYER DEFINE_GUIDNAMED(KSNODETYPE_CD_PLAYER)
#define STATIC_KSNODETYPE_CHORUS\
- 0x20173F20L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x20173F20L, 0xC559, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("20173F20-C559-11D0-8A2B-00A0C9255AC1", KSNODETYPE_CHORUS);
#define KSNODETYPE_CHORUS DEFINE_GUIDNAMED(KSNODETYPE_CHORUS)
#define STATIC_KSNODETYPE_REVERB\
- 0xEF0328E0L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0xEF0328E0L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("EF0328E0-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_REVERB);
#define KSNODETYPE_REVERB DEFINE_GUIDNAMED(KSNODETYPE_REVERB)
@@ -201,127 +201,127 @@ DEFINE_GUIDSTRUCT("DFF21CE1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_SPEAKER);
#define KSNODETYPE_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_SPEAKER)
#define STATIC_KSAUDFNAME_RECORDING_CONTROL\
- 0x185FEDFAL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDFAL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDFA-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_RECORDING_CONTROL);
#define KSAUDFNAME_RECORDING_CONTROL DEFINE_GUIDNAMED(KSAUDFNAME_RECORDING_CONTROL)
#define STATIC_KSNODETYPE_VOLUME\
- 0x3A5ACC00L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x3A5ACC00L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("3A5ACC00-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_VOLUME);
#define KSNODETYPE_VOLUME DEFINE_GUIDNAMED(KSNODETYPE_VOLUME)
#define STATIC_KSAUDFNAME_WAVE_VOLUME\
- 0x185FEDE5L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDE5L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDE5-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_WAVE_VOLUME);
#define KSAUDFNAME_WAVE_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_VOLUME)
#define STATIC_KSNODETYPE_MUTE\
- 0x02B223C0L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x02B223C0L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("02B223C0-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_MUTE);
#define KSNODETYPE_MUTE DEFINE_GUIDNAMED(KSNODETYPE_MUTE)
#define STATIC_KSAUDFNAME_WAVE_MUTE\
- 0x185FEDE6L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDE6L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDE6-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_WAVE_MUTE);
#define KSAUDFNAME_WAVE_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_MUTE)
#define STATIC_KSAUDFNAME_MIC_VOLUME\
- 0x185FEDEDL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDEDL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDED-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIC_VOLUME);
#define KSAUDFNAME_MIC_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIC_VOLUME)
#define STATIC_KSNODETYPE_SUM\
- 0xDA441A60L, 0xC556, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0xDA441A60L, 0xC556, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("DA441A60-C556-11D0-8A2B-00A0C9255AC1", KSNODETYPE_SUM);
#define KSNODETYPE_SUM DEFINE_GUIDNAMED(KSNODETYPE_SUM)
#define STATIC_KSAUDFNAME_MASTER_VOLUME\
- 0x185FEDE3L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDE3L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDE3-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MASTER_VOLUME);
#define KSAUDFNAME_MASTER_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MASTER_VOLUME)
#define STATIC_KSAUDFNAME_CD_VOLUME\
- 0x185FEDE9L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDE9L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDE9-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_CD_VOLUME);
#define KSAUDFNAME_CD_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_CD_VOLUME)
#define STATIC_KSAUDFNAME_RECORDING_SOURCE\
- 0x185FEDEFL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDEFL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDEF-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_RECORDING_SOURCE);
#define KSAUDFNAME_RECORDING_SOURCE DEFINE_GUIDNAMED(KSAUDFNAME_RECORDING_SOURCE)
#define STATIC_KSAUDFNAME_LINE_IN_VOLUME\
- 0x185FEDF4L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDF4L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDF4-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_LINE_IN_VOLUME);
#define KSAUDFNAME_LINE_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_LINE_IN_VOLUME)
#define STATIC_KSAUDFNAME_AUX_VOLUME\
- 0x185FEDFCL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDFCL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDFC-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_AUX_VOLUME);
#define KSAUDFNAME_AUX_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_AUX_VOLUME)
#define STATIC_KSAUDFNAME_MIC_IN_VOLUME\
- 0x185FEDF5L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDF5L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDF5-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIC_IN_VOLUME);
#define KSAUDFNAME_MIC_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIC_IN_VOLUME)
#define STATIC_KSNODETYPE_LOUDNESS\
- 0x41887440L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x41887440L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("41887440-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_LOUDNESS);
#define KSNODETYPE_LOUDNESS DEFINE_GUIDNAMED(KSNODETYPE_LOUDNESS)
#define STATIC_KSAUDFNAME_MICROPHONE_BOOST\
- 0x2bc31d6aL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68
+ 0x2bc31d6aL, 0x96e3, 0x11d2, {0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68}
DEFINE_GUIDSTRUCT("2BC31D6A-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MICROPHONE_BOOST);
#define KSAUDFNAME_MICROPHONE_BOOST DEFINE_GUIDNAMED(KSAUDFNAME_MICROPHONE_BOOST)
#define STATIC_KSAUDFNAME_CD_MUTE\
- 0x185FEDEAL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDEAL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDEA-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_CD_MUTE);
#define KSAUDFNAME_CD_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_CD_MUTE)
#define STATIC_KSAUDFNAME_LINE_MUTE\
- 0x185FEDECL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDECL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDEC-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_LINE_MUTE);
#define KSAUDFNAME_LINE_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_LINE_MUTE)
#define STATIC_KSAUDFNAME_MIC_MUTE\
- 0x185FEDEEL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDEEL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDEE-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIC_MUTE);
#define KSAUDFNAME_MIC_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MIC_MUTE)
#define STATIC_KSAUDFNAME_AUX_MUTE\
- 0x185FEDFDL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDFDL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDFD-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_AUX_MUTE);
#define KSAUDFNAME_AUX_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_AUX_MUTE)
#define STATIC_KSAUDFNAME_VOLUME_CONTROL\
- 0x185FEDF7L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDF7L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDF7-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_VOLUME_CONTROL);
#define KSAUDFNAME_VOLUME_CONTROL DEFINE_GUIDNAMED(KSAUDFNAME_VOLUME_CONTROL)
#define STATIC_KSNODETYPE_MUX\
- 0x2CEAF780L, 0xC556, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x2CEAF780L, 0xC556, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("2CEAF780-C556-11D0-8A2B-00A0C9255AC1", KSNODETYPE_MUX);
#define KSNODETYPE_MUX DEFINE_GUIDNAMED(KSNODETYPE_MUX)
#define STATIC_KSAUDFNAME_MASTER_MUTE\
- 0x185FEDE4L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDE4L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDE4-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MASTER_MUTE);
#define KSAUDFNAME_MASTER_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MASTER_MUTE)
#define STATIC_KSNODETYPE_PEAKMETER\
- 0xa085651eL, 0x5f0d, 0x4b36, 0xa8, 0x69, 0xd1, 0x95, 0xd6, 0xab, 0x4b, 0x9e
+ 0xa085651eL, 0x5f0d, 0x4b36, {0xa8, 0x69, 0xd1, 0x95, 0xd6, 0xab, 0x4b, 0x9e}
DEFINE_GUIDSTRUCT("A085651E-5F0D-4b36-A869-D195D6AB4B9E", KSNODETYPE_PEAKMETER);
#define KSNODETYPE_PEAKMETER DEFINE_GUIDNAMED(KSNODETYPE_PEAKMETER)
#define STATIC_KSNODETYPE_STEREO_WIDE\
- 0xA9E69800L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0xA9E69800L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("A9E69800-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_STEREO_WIDE);
#define KSNODETYPE_STEREO_WIDE DEFINE_GUIDNAMED(KSNODETYPE_STEREO_WIDE)
#define STATIC_KSNODETYPE_TONE\
- 0x7607E580L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x7607E580L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("7607E580-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_TONE);
#define KSNODETYPE_TONE DEFINE_GUIDNAMED(KSNODETYPE_TONE)
@@ -375,11 +375,11 @@ typedef struct {
} KSDATARANGE_AUDIO, *PKSDATARANGE_AUDIO;
#if !defined( DEFINE_WAVEFORMATEX_GUID )
-#define DEFINE_WAVEFORMATEX_GUID(x) (USHORT)(x), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
+#define DEFINE_WAVEFORMATEX_GUID(x) (USHORT)(x), 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
#endif
#define STATIC_KSDATAFORMAT_SUBTYPE_WAVEFORMATEX\
- 0x00000000L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
+ 0x00000000L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
DEFINE_GUIDSTRUCT("00000000-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_WAVEFORMATEX);
#define KSDATAFORMAT_SUBTYPE_WAVEFORMATEX DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_WAVEFORMATEX)
@@ -403,12 +403,12 @@ DEFINE_GUIDSTRUCT("73647561-0000-0010-8000-00aa00389b71", KSDATAFORMAT_TYPE_AUDI
#define KSDATAFORMAT_TYPE_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_AUDIO)
#define STATIC_KSDATAFORMAT_SPECIFIER_DSOUND\
- 0x518590a2L, 0xa184, 0x11d0, 0x85, 0x22, 0x00, 0xc0, 0x4f, 0xd9, 0xba, 0xf3
+ 0x518590a2L, 0xa184, 0x11d0, {0x85, 0x22, 0x00, 0xc0, 0x4f, 0xd9, 0xba, 0xf3}
DEFINE_GUIDSTRUCT("518590a2-a184-11d0-8522-00c04fd9baf3", KSDATAFORMAT_SPECIFIER_DSOUND);
#define KSDATAFORMAT_SPECIFIER_DSOUND DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DSOUND)
#define STATIC_KSDATAFORMAT_SUBTYPE_ANALOG\
- 0x6dba3190L, 0x67bd, 0x11cf, 0xa0, 0xf7, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
+ 0x6dba3190L, 0x67bd, 0x11cf, {0xa0, 0xf7, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
DEFINE_GUIDSTRUCT("6dba3190-67bd-11cf-a0f7-0020afd156e4", KSDATAFORMAT_SUBTYPE_ANALOG);
#define KSDATAFORMAT_SUBTYPE_ANALOG DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ANALOG)
@@ -446,22 +446,22 @@ DEFINE_GUIDSTRUCT("00000003-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_I
#define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)
#define STATIC_KSDATAFORMAT_SPECIFIER_WAVEFORMATEX\
- 0x05589f81L, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a
+ 0x05589f81L, 0xc356, 0x11ce, {0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a}
DEFINE_GUIDSTRUCT("05589f81-c356-11ce-bf01-00aa0055595a", KSDATAFORMAT_SPECIFIER_WAVEFORMATEX);
#define KSDATAFORMAT_SPECIFIER_WAVEFORMATEX DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
#define STATIC_KSDATAFORMAT_SUBTYPE_AC3_AUDIO\
- 0xe06d802cL, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea
+ 0xe06d802cL, 0xdb46, 0x11cf, {0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea}
DEFINE_GUIDSTRUCT("e06d802c-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_AC3_AUDIO);
#define KSDATAFORMAT_SUBTYPE_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_AC3_AUDIO)
#define STATIC_KSDATAFORMAT_SPECIFIER_AC3_AUDIO\
- 0xe06d80e4L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea
+ 0xe06d80e4L, 0xdb46, 0x11cf, {0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea}
DEFINE_GUIDSTRUCT("e06d80e4-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SPECIFIER_AC3_AUDIO);
#define KSDATAFORMAT_SPECIFIER_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_AC3_AUDIO)
#define STATIC_KSPROPSETID_AC3\
- 0xBFABE720L, 0x6E1F, 0x11D0, 0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00
+ 0xBFABE720L, 0x6E1F, 0x11D0, {0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}
DEFINE_GUIDSTRUCT("BFABE720-6E1F-11D0-BCF2-444553540000", KSPROPSETID_AC3);
#define KSPROPSETID_AC3 DEFINE_GUIDNAMED(KSPROPSETID_AC3)
@@ -532,7 +532,7 @@ typedef enum {
} KSPROPERTY_AUDIO;
#define STATIC_KSEVENTSETID_AudioControlChange\
- 0xE85E9698L, 0xFA2F, 0x11D1, 0x95, 0xBD, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0xE85E9698L, 0xFA2F, 0x11D1, {0x95, 0xBD, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("E85E9698-FA2F-11D1-95BD-00C04FB925D3", KSEVENTSETID_AudioControlChange);
#define KSEVENTSETID_AudioControlChange DEFINE_GUIDNAMED(KSEVENTSETID_AudioControlChange)
@@ -542,7 +542,7 @@ typedef enum {
#define STATIC_KSEVENTSETID_LoopedStreaming\
- 0x4682B940L, 0xC6EF, 0x11D0, 0x96, 0xD8, 0x00, 0xAA, 0x00, 0x51, 0xE5, 0x1D
+ 0x4682B940L, 0xC6EF, 0x11D0, {0x96, 0xD8, 0x00, 0xAA, 0x00, 0x51, 0xE5, 0x1D}
DEFINE_GUIDSTRUCT("4682B940-C6EF-11D0-96D8-00AA0051E51D", KSEVENTSETID_LoopedStreaming);
#define KSEVENTSETID_LoopedStreaming DEFINE_GUIDNAMED(KSEVENTSETID_LoopedStreaming)
@@ -551,7 +551,7 @@ typedef enum {
} KSEVENT_LOOPEDSTREAMING;
#define STATIC_KSEVENTSETID_Connection\
- 0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00
+ 0x7f4bcbe0L, 0x9ea5, 0x11cf, {0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("7f4bcbe0-9ea5-11cf-a5d6-28db04c10000", KSEVENTSETID_Connection);
#define KSEVENTSETID_Connection DEFINE_GUIDNAMED(KSEVENTSETID_Connection)
diff --git a/include/psdk/msxml2.idl b/include/psdk/msxml2.idl
index 89914004955..f2841a5f3f2 100644
--- a/include/psdk/msxml2.idl
+++ b/include/psdk/msxml2.idl
@@ -85,6 +85,22 @@ interface IMXAttributes;
interface IMXReaderControl;
interface IMXWriter;
+interface IXMLDOMSchemaCollection2;
+interface ISchemaStringCollection;
+interface ISchemaItemCollection;
+interface ISchemaItem;
+interface ISchema;
+interface ISchemaParticle;
+interface ISchemaAttribute;
+interface ISchemaElement;
+interface ISchemaType;
+interface ISchemaComplexType;
+interface ISchemaAttributeGroup;
+interface ISchemaModelGroup;
+interface ISchemaAny;
+interface ISchemaIdentityConstraint;
+interface ISchemaNotation;
+
cpp_quote("#define DOMDocument DOMDocument2")
cpp_quote("#define CLSID_DOMDocument CLSID_DOMDocument2")
@@ -108,6 +124,134 @@ typedef enum tagDOMNodeType
} DOMNodeType;
cpp_quote("#endif /* __WIDL_XMLDOM_H */")
+typedef enum _SOMITEMTYPE
+{
+ SOMITEM_SCHEMA = 0x1000,
+ SOMITEM_ATTRIBUTE = 0x1001,
+ SOMITEM_ATTRIBUTEGROUP = 0x1002,
+ SOMITEM_NOTATION = 0x1003,
+ SOMITEM_IDENTITYCONSTRAINT = 0x1100,
+ SOMITEM_KEY = 0x1101,
+ SOMITEM_KEYREF = 0x1102,
+ SOMITEM_UNIQUE = 0x1103,
+ SOMITEM_ANYTYPE = 0x2000,
+ SOMITEM_DATATYPE = 0x2100,
+ SOMITEM_DATATYPE_ANYTYPE = 0x2101,
+ SOMITEM_DATATYPE_ANYURI = 0x2102,
+ SOMITEM_DATATYPE_BASE64BINARY = 0x2103,
+ SOMITEM_DATATYPE_BOOLEAN = 0x2104,
+ SOMITEM_DATATYPE_BYTE = 0x2105,
+ SOMITEM_DATATYPE_DATE = 0x2106,
+ SOMITEM_DATATYPE_DATETIME = 0x2107,
+ SOMITEM_DATATYPE_DAY = 0x2108,
+ SOMITEM_DATATYPE_DECIMAL = 0x2109,
+ SOMITEM_DATATYPE_DOUBLE = 0x210A,
+ SOMITEM_DATATYPE_DURATION = 0x210B,
+ SOMITEM_DATATYPE_ENTITIES = 0x210C,
+ SOMITEM_DATATYPE_ENTITY = 0x210D,
+ SOMITEM_DATATYPE_FLOAT = 0x210E,
+ SOMITEM_DATATYPE_HEXBINARY = 0x210F,
+ SOMITEM_DATATYPE_ID = 0x2110,
+ SOMITEM_DATATYPE_IDREF = 0x2111,
+ SOMITEM_DATATYPE_IDREFS = 0x2112,
+ SOMITEM_DATATYPE_INT = 0x2113,
+ SOMITEM_DATATYPE_INTEGER = 0x2114,
+ SOMITEM_DATATYPE_LANGUAGE = 0x2115,
+ SOMITEM_DATATYPE_LONG = 0x2116,
+ SOMITEM_DATATYPE_MONTH = 0x2117,
+ SOMITEM_DATATYPE_MONTHDAY = 0x2118,
+ SOMITEM_DATATYPE_NAME = 0x2119,
+ SOMITEM_DATATYPE_NCNAME = 0x211A,
+ SOMITEM_DATATYPE_NEGATIVEINTEGER = 0x211B,
+ SOMITEM_DATATYPE_NMTOKEN = 0x211C,
+ SOMITEM_DATATYPE_NMTOKENS = 0x211D,
+ SOMITEM_DATATYPE_NONNEGATIVEINTEGER = 0x211E,
+ SOMITEM_DATATYPE_NONPOSITIVEINTEGER = 0x211F,
+ SOMITEM_DATATYPE_NORMALIZEDSTRING = 0x2120,
+ SOMITEM_DATATYPE_NOTATION = 0x2121,
+ SOMITEM_DATATYPE_POSITIVEINTEGER = 0x2122,
+ SOMITEM_DATATYPE_QNAME = 0x2123,
+ SOMITEM_DATATYPE_SHORT = 0x2124,
+ SOMITEM_DATATYPE_STRING = 0x2125,
+ SOMITEM_DATATYPE_TIME = 0x2126,
+ SOMITEM_DATATYPE_TOKEN = 0x2127,
+ SOMITEM_DATATYPE_UNSIGNEDBYTE = 0x2128,
+ SOMITEM_DATATYPE_UNSIGNEDINT = 0x2129,
+ SOMITEM_DATATYPE_UNSIGNEDLONG = 0x212A,
+ SOMITEM_DATATYPE_UNSIGNEDSHORT = 0x212B,
+ SOMITEM_DATATYPE_YEAR = 0x212C,
+ SOMITEM_DATATYPE_YEARMONTH = 0x212D,
+ SOMITEM_DATATYPE_ANYSIMPLETYPE = 0x21FF,
+ SOMITEM_SIMPLETYPE = 0x2200,
+ SOMITEM_COMPLEXTYPE = 0x2400,
+ SOMITEM_PARTICLE = 0x4000,
+ SOMITEM_ANY = 0x4001,
+ SOMITEM_ANYATTRIBUTE = 0x4002,
+ SOMITEM_ELEMENT = 0x4003,
+ SOMITEM_GROUP = 0x4100,
+ SOMITEM_ALL = 0x4101,
+ SOMITEM_CHOICE = 0x4102,
+ SOMITEM_SEQUENCE = 0x4103,
+ SOMITEM_EMPTYPARTICLE = 0x4104,
+ SOMITEM_NULL = 0x0800,
+ SOMITEM_NULL_TYPE = 0x2800,
+ SOMITEM_NULL_ANY = 0x4801,
+ SOMITEM_NULL_ANYATTRIBUTE = 0x4802,
+ SOMITEM_NULL_ELEMENT = 0x4803,
+} SOMITEMTYPE;
+
+typedef enum _SCHEMAUSE
+{
+ SCHEMAUSE_OPTIONAL,
+ SCHEMAUSE_PROHIBITED,
+ SCHEMAUSE_REQUIRED,
+} SCHEMAUSE;
+
+typedef enum _SCHEMADERIVATIONMETHOD
+{
+ SCHEMADERIVATIONMETHOD_EMPTY = 0x0000,
+ SCHEMADERIVATIONMETHOD_SUBSTITUTION = 0x0001,
+ SCHEMADERIVATIONMETHOD_EXTENSION = 0x0002,
+ SCHEMADERIVATIONMETHOD_RESTRICTION = 0x0004,
+ SCHEMADERIVATIONMETHOD_LIST = 0x0008,
+ SCHEMADERIVATIONMETHOD_UNION = 0x0010,
+ SCHEMADERIVATIONMETHOD_ALL = 0x00FF,
+ SCHEMADERIVATIONMETHOD_NONE = 0x0100,
+} SCHEMADERIVATIONMETHOD;
+
+typedef enum _SCHEMACONTENTTYPE
+{
+ SCHEMACONTENTTYPE_EMPTY,
+ SCHEMACONTENTTYPE_TEXTONLY,
+ SCHEMACONTENTTYPE_ELEMENTONLY,
+ SCHEMACONTENTTYPE_MIXED,
+} SCHEMACONTENTTYPE;
+
+typedef enum _SCHEMAPROCESSCONTENTS
+{
+ SCHEMAPROCESSCONTENTS_NONE,
+ SCHEMAPROCESSCONTENTS_SKIP,
+ SCHEMAPROCESSCONTENTS_LAX,
+ SCHEMAPROCESSCONTENTS_STRICT,
+} SCHEMAPROCESSCONTENTS;
+
+typedef enum _SCHEMAWHITESPACE
+{
+ SCHEMAWHITESPACE_NONE = -1,
+ SCHEMAWHITESPACE_PRESERVE = 0,
+ SCHEMAWHITESPACE_REPLACE = 1,
+ SCHEMAWHITESPACE_COLLAPSE = 2,
+} SCHEMAWHITESPACE;
+
+
+typedef enum _SCHEMATYPEVARIETY
+{
+ SCHEMATYPEVARIETY_NONE = -1,
+ SCHEMATYPEVARIETY_ATOMIC = 0,
+ SCHEMATYPEVARIETY_LIST = 1,
+ SCHEMATYPEVARIETY_UNION = 2,
+} SCHEMATYPEVARIETY;
+
[
local,
object,
@@ -417,6 +561,35 @@ interface IXMLDOMSchemaCollection : IDispatch
HRESULT _newEnum([retval, out] IUnknown **ppUnk);
}
+[
+ local,
+ object,
+ uuid(50ea08b0-dd1b-4664-9a50-c2f40f4bd79a),
+]
+interface IXMLDOMSchemaCollection2 : IXMLDOMSchemaCollection
+{
+ [id(DISPID_SOM_VALIDATE)]
+ HRESULT validate();
+
+ [propput, id(DISPID_SOM_VALIDATEONLOAD)]
+ HRESULT validateOnLoad(
+ [in] VARIANT_BOOL validateOnLoad);
+
+ [propget, id(DISPID_SOM_VALIDATEONLOAD)]
+ HRESULT validateOnLoad(
+ [out,retval] VARIANT_BOOL* validateOnLoad);
+
+ [id(DISPID_SOM_GETSCHEMA)]
+ HRESULT getSchema(
+ [in] BSTR namespaceURI,
+ [out,retval] ISchema** schema);
+
+ [id(DISPID_SOM_GETDECLARATION)]
+ HRESULT getDeclaration(
+ [in] IXMLDOMNode* node,
+ [out,retval]ISchemaItem** item);
+};
+
[
local,
object,
@@ -1106,6 +1279,15 @@ coclass FreeThreadedDOMDocument30
[default, source] dispinterface XMLDOMDocumentEvents;
}
+[
+ uuid(88d969c1-f192-11d4-a65f-0040963251e5),
+]
+coclass FreeThreadedDOMDocument40
+{
+ [default] interface IXMLDOMDocument2;
+ [default, source] dispinterface XMLDOMDocumentEvents;
+};
+
[
uuid(373984c9-b845-449b-91e7-45ac83036ade)
]
@@ -1130,6 +1312,14 @@ coclass XMLSchemaCache30
[default] interface IXMLDOMSchemaCollection;
}
+[
+ uuid(88d969c2-f192-11d4-a65f-0040963251e5)
+]
+coclass XMLSchemaCache40
+{
+ [default] interface IXMLDOMSchemaCollection2;
+};
+
[
uuid(2933BF94-7B36-11d2-B20E-00C04F983E60)
]
@@ -1959,6 +2149,443 @@ interface IMXWriter : IDispatch
HRESULT flush();
};
+[
+ local,
+ object,
+ uuid(50ea08b1-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaStringCollection : IDispatch
+{
+ [id(DISPID_VALUE), propget]
+ HRESULT item(
+ [in] long index,
+ [out,retval] BSTR* bstr);
+
+ [id(DISPID_SOM_LENGTH), propget]
+ HRESULT length(
+ [out,retval] long* length);
+
+ [id(DISPID_NEWENUM), hidden, restricted, propget]
+ HRESULT _newEnum(
+ [out,retval] IUnknown** ppunk);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08b2-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaItemCollection : IDispatch
+{
+ [id(DISPID_VALUE), propget]
+ HRESULT item(
+ [in] long index,
+ [out,retval]ISchemaItem** item);
+
+ [id(DISPID_SOM_ITEMBYNAME)]
+ HRESULT itemByName(
+ [in] BSTR name,
+ [out,retval] ISchemaItem** item);
+
+ [id(DISPID_SOM_ITEMBYQNAME)]
+ HRESULT itemByQName(
+ [in] BSTR name,
+ [in] BSTR namespaceURI,
+ [out,retval] ISchemaItem** item);
+
+ [id(DISPID_SOM_LENGTH), propget]
+ HRESULT length(
+ [out,retval]long* length);
+
+ [id(DISPID_NEWENUM), hidden, restricted, propget]
+ HRESULT _newEnum(
+ [out,retval]IUnknown** ppunk);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08b3-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaItem : IDispatch
+{
+ [id(DISPID_SOM_NAME), propget]
+ HRESULT name(
+ [out,retval] BSTR* name);
+
+ [id(DISPID_SOM_NAMESPACEURI), propget]
+ HRESULT namespaceURI(
+ [out,retval] BSTR* namespaceURI);
+
+ [id(DISPID_SOM_SCHEMA), propget]
+ HRESULT schema(
+ [out,retval] ISchema** schema);
+
+ [id(DISPID_SOM_ID), propget]
+ HRESULT id(
+ [out,retval] BSTR* id);
+
+ [id(DISPID_SOM_ITEMTYPE), propget]
+ HRESULT itemType(
+ [out,retval] SOMITEMTYPE* itemType);
+
+ [id(DISPID_SOM_UNHANDLEDATTRS), propget]
+ HRESULT unhandledAttributes(
+ [out,retval] IVBSAXAttributes** attributes);
+
+ [id(DISPID_SOM_WRITEANNOTATION)]
+ HRESULT writeAnnotation(
+ [in] IUnknown* annotationSink,
+ [out,retval] VARIANT_BOOL* isWritten);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08b4-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchema : ISchemaItem
+{
+ [id(DISPID_SOM_TARGETNAMESPACE), propget]
+ HRESULT targetNamespace(
+ [out,retval] BSTR* targetNamespace);
+
+ [id(DISPID_SOM_VERSION), propget]
+ HRESULT version(
+ [out,retval] BSTR* version);
+
+ [id(DISPID_SOM_TYPES), propget]
+ HRESULT types(
+ [out,retval] ISchemaItemCollection** types);
+
+ [id(DISPID_SOM_ELEMENTS), propget]
+ HRESULT elements(
+ [out,retval] ISchemaItemCollection** elements);
+
+ [id(DISPID_SOM_ATTRIBUTES), propget]
+ HRESULT attributes(
+ [out,retval] ISchemaItemCollection** attributes);
+
+ [id(DISPID_SOM_ATTRIBUTEGROUPS), propget]
+ HRESULT attributeGroups(
+ [out,retval] ISchemaItemCollection** attributeGroups);
+
+ [id(DISPID_SOM_MODELGROUPS), propget]
+ HRESULT modelGroups(
+ [out,retval] ISchemaItemCollection** modelGroups);
+
+ [id(DISPID_SOM_NOTATIONS), propget]
+ HRESULT notations(
+ [out,retval] ISchemaItemCollection** notations);
+
+ [id(DISPID_SOM_SCHEMALOCATIONS), propget]
+ HRESULT schemaLocations(
+ [out,retval] ISchemaStringCollection** schemaLocations);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08b5-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaParticle : ISchemaItem
+{
+ [id(DISPID_SOM_MINOCCURS), propget]
+ HRESULT minOccurs(
+ [out,retval] VARIANT* minOccurs);
+
+ [id(DISPID_SOM_MAXOCCURS), propget]
+ HRESULT maxOccurs(
+ [out,retval] VARIANT* maxOccurs);
+};
+
+[
+ object,
+ uuid(50ea08b6-dd1b-4664-9a50-c2f40f4bd79a),
+ dual,
+]
+interface ISchemaAttribute : ISchemaItem
+{
+ [id(DISPID_SOM_TYPE), propget]
+ HRESULT type(
+ [out,retval] ISchemaType** type);
+
+ [id(DISPID_SOM_SCOPE), propget]
+ HRESULT scope(
+ [out,retval] ISchemaComplexType** scope);
+
+ [id(DISPID_SOM_DEFAULTVALUE), propget]
+ HRESULT defaultValue(
+ [out,retval]BSTR* defaultValue);
+
+ [id(DISPID_SOM_FIXEDVALUE), propget]
+ HRESULT fixedValue(
+ [out,retval] BSTR* fixedValue);
+
+ [id(DISPID_SOM_USE), propget]
+ HRESULT use(
+ [out,retval] SCHEMAUSE* use);
+
+ [id(DISPID_SOM_ISREFERENCE), propget]
+ HRESULT isReference(
+ [out,retval] VARIANT_BOOL* reference);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08b7-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaElement : ISchemaParticle
+{
+ [id(DISPID_SOM_TYPE), propget]
+ HRESULT type(
+ [out,retval] ISchemaType** type);
+
+ [id(DISPID_SOM_SCOPE), propget]
+ HRESULT scope(
+ [out,retval] ISchemaComplexType** scope);
+
+ [id(DISPID_SOM_DEFAULTVALUE), propget]
+ HRESULT defaultValue(
+ [out,retval] BSTR* defaultValue);
+
+ [id(DISPID_SOM_FIXEDVALUE), propget]
+ HRESULT fixedValue(
+ [out,retval] BSTR* fixedValue);
+
+ [id(DISPID_SOM_ISNILLABLE), propget]
+ HRESULT isNillable(
+ [out,retval] VARIANT_BOOL* nillable);
+
+ [id(DISPID_SOM_IDCONSTRAINTS), propget]
+ HRESULT identityConstraints(
+ [out,retval] ISchemaItemCollection** constraints);
+
+ [id(DISPID_SOM_SUBSTITUTIONGROUP), propget]
+ HRESULT substitutionGroup(
+ [out,retval] ISchemaElement** element);
+
+ [id(DISPID_SOM_EXCLUSIONS), propget]
+ HRESULT substitutionGroupExclusions(
+ [out,retval] SCHEMADERIVATIONMETHOD* exclusions);
+
+ [id(DISPID_SOM_DISALLOWED), propget]
+ HRESULT disallowedSubstitutions(
+ [out,retval] SCHEMADERIVATIONMETHOD* disallowed);
+
+ [id(DISPID_SOM_ISABSTRACT), propget]
+ HRESULT isAbstract(
+ [out,retval] VARIANT_BOOL* abstract);
+
+ [id(DISPID_SOM_ISREFERENCE), propget]
+ HRESULT isReference(
+ [out,retval] VARIANT_BOOL* reference);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08b8-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaType : ISchemaItem
+{
+ [id(DISPID_SOM_BASETYPES), propget]
+ HRESULT baseTypes(
+ [out,retval] ISchemaItemCollection** baseTypes);
+
+ [id(DISPID_SOM_FINAL), propget]
+ HRESULT final(
+ [out,retval] SCHEMADERIVATIONMETHOD* final);
+
+ [id(DISPID_SOM_VARIETY), propget]
+ HRESULT variety(
+ [out,retval] SCHEMATYPEVARIETY* variety);
+
+ [id(DISPID_SOM_DERIVEDBY), propget]
+ HRESULT derivedBy(
+ [out,retval] SCHEMADERIVATIONMETHOD* derivedBy);
+
+ [id(DISPID_SOM_ISVALID)]
+ HRESULT isValid(
+ [in] BSTR data,
+ [out,retval] VARIANT_BOOL* valid);
+
+ [id(DISPID_SOM_MINEXCLUSIVE), propget]
+ HRESULT minExclusive(
+ [out,retval]BSTR* minExclusive);
+
+ [id(DISPID_SOM_MININCLUSIVE), propget]
+ HRESULT minInclusive(
+ [out,retval] BSTR* minInclusive);
+
+ [id(DISPID_SOM_MAXEXCLUSIVE), propget]
+ HRESULT maxExclusive(
+ [out,retval] BSTR* maxExclusive);
+
+ [id(DISPID_SOM_MAXINCLUSIVE), propget]
+ HRESULT maxInclusive(
+ [out,retval] BSTR* maxInclusive);
+
+ [id(DISPID_SOM_TOTALDIGITS), propget]
+ HRESULT totalDigits(
+ [out,retval] VARIANT* totalDigits);
+
+ [id(DISPID_SOM_FRACTIONDIGITS), propget]
+ HRESULT fractionDigits(
+ [out,retval] VARIANT* fractionDigits);
+
+ [id(DISPID_SOM_LENGTH), propget]
+ HRESULT length(
+ [out,retval] VARIANT* length);
+
+ [id(DISPID_SOM_MINLENGTH), propget]
+ HRESULT minLength(
+ [out,retval]VARIANT* minLength);
+
+ [id(DISPID_SOM_MAXLENGTH), propget]
+ HRESULT maxLength(
+ [out,retval]VARIANT* maxLength);
+
+ [id(DISPID_SOM_ENUMERATION), propget]
+ HRESULT enumeration(
+ [out,retval] ISchemaStringCollection** enumeration);
+
+ [id(DISPID_SOM_WHITESPACE), propget]
+ HRESULT whitespace(
+ [out,retval]SCHEMAWHITESPACE* whitespace);
+
+ [id(DISPID_SOM_PATTERNS), propget]
+ HRESULT patterns(
+ [out,retval] ISchemaStringCollection** patterns);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08b9-dd1b-4664-9a50-c2f40f4bd79a),
+ dual,
+]
+interface ISchemaComplexType : ISchemaType
+{
+ [id(DISPID_SOM_ISABSTRACT), propget]
+ HRESULT isAbstract(
+ [out,retval] VARIANT_BOOL* abstract);
+
+ [id(DISPID_SOM_ANYATTRIBUTE), propget]
+ HRESULT anyAttribute(
+ [out,retval] ISchemaAny** anyAttribute);
+
+ [id(DISPID_SOM_ATTRIBUTES), propget]
+ HRESULT attributes(
+ [out,retval] ISchemaItemCollection** attributes);
+
+ [id(DISPID_SOM_CONTENTTYPE), propget]
+ HRESULT contentType(
+ [out,retval] SCHEMACONTENTTYPE* contentType);
+
+ [id(DISPID_SOM_CONTENTMODEL), propget]
+ HRESULT contentModel(
+ [out,retval] ISchemaModelGroup** contentModel);
+
+ [id(DISPID_SOM_PROHIBITED), propget]
+ HRESULT prohibitedSubstitutions(
+ [out,retval] SCHEMADERIVATIONMETHOD* prohibited);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08ba-dd1b-4664-9a50-c2f40f4bd79a),
+ dual,
+]
+interface ISchemaAttributeGroup : ISchemaItem
+{
+ [id(DISPID_SOM_ANYATTRIBUTE), propget]
+ HRESULT anyAttribute(
+ [out,retval] ISchemaAny** anyAttribute);
+
+ [id(DISPID_SOM_ATTRIBUTES), propget]
+ HRESULT attributes(
+ [out,retval] ISchemaItemCollection** attributes);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08bb-dd1b-4664-9a50-c2f40f4bd79a),
+ dual,
+]
+interface ISchemaModelGroup : ISchemaParticle
+{
+ [id(DISPID_SOM_PARTICLES), propget]
+ HRESULT particles(
+ [out,retval] ISchemaItemCollection** particles);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08bc-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaAny : ISchemaParticle
+{
+ [id(DISPID_SOM_NAMESPACES), propget]
+ HRESULT namespaces(
+ [out,retval] ISchemaStringCollection** namespaces);
+
+ [id(DISPID_SOM_PROCESSCONTENTS), propget]
+ HRESULT processContents(
+ [out,retval] SCHEMAPROCESSCONTENTS* processContents);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08bd-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaIdentityConstraint : ISchemaItem
+{
+ [id(DISPID_SOM_SELECTOR), propget]
+ HRESULT selector(
+ [out,retval] BSTR* selector);
+
+ [id(DISPID_SOM_FIELDS), propget]
+ HRESULT fields(
+ [out,retval] ISchemaStringCollection** fields);
+
+ [id(DISPID_SOM_REFERENCEDKEY), propget]
+ HRESULT referencedKey(
+ [out,retval] ISchemaIdentityConstraint** key);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08be-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaNotation : ISchemaItem
+{
+ [id(DISPID_SOM_SYSTEMIDENTIFIER), propget]
+ HRESULT systemIdentifier(
+ [out,retval] BSTR* uri);
+
+ [id(DISPID_SOM_PUBLICIDENTIFIER), propget]
+ HRESULT publicIdentifier(
+ [out,retval] BSTR* uri);
+};
+
+
[
uuid(079aa557-4a18-424a-8eee-e39f0a8d41b9)
]
@@ -2028,6 +2655,26 @@ coclass MXXMLWriter30
interface IVBSAXLexicalHandler;
};
+[
+ uuid(88d969c8-f192-11d4-a65f-0040963251e5),
+]
+coclass MXXMLWriter40
+{
+ [default] interface IMXWriter;
+
+ interface ISAXContentHandler;
+ interface ISAXDeclHandler;
+ interface ISAXDTDHandler;
+ interface ISAXErrorHandler;
+ interface ISAXLexicalHandler;
+
+ interface IVBSAXContentHandler;
+ interface IVBSAXDeclHandler;
+ interface IVBSAXDTDHandler;
+ interface IVBSAXErrorHandler;
+ interface IVBSAXLexicalHandler;
+};
+
[
uuid(4dd441ad-526d-4a77-9f1b-9841ed802fb0)
]
@@ -2048,5 +2695,15 @@ coclass SAXAttributes30
interface ISAXAttributes;
};
+[
+ uuid(88d969ca-f192-11d4-a65f-0040963251e5),
+]
+coclass SAXAttributes40
+{
+ [default] interface IMXAttributes;
+ interface IVBSAXAttributes;
+ interface ISAXAttributes;
+};
+
} /* Library MSXML */
diff --git a/include/psdk/msxml2did.h b/include/psdk/msxml2did.h
index f2adaaff427..d7489d0524f 100644
--- a/include/psdk/msxml2did.h
+++ b/include/psdk/msxml2did.h
@@ -394,5 +394,87 @@
#define DISPID_MX_READER_CONTROL_RESUME 0x00000577
#define DISPID_MX_READER_CONTROL_SUSPEND 0x00000578
+#define DISPID_MX_SCHEMADECLHANDLER 0x0000057a
+#define DISPID_MX_SCHEMADECLHANDLER_SCHEMAELEMENTDECL 0x0000057b
+
+#define DISPID_MX_NSMGR 0x0000057d
+#define DISPID_MX_NSMGR_ALLOWOVERRIDE 0x0000057e
+#define DISPID_MX_NSMGR_RESET 0x0000057f
+#define DISPID_MX_NSMGR_PUSHCONTEXT 0x00000580
+#define DISPID_MX_NSMGR_PUSHNODECONTEXT 0x00000581
+#define DISPID_MX_NSMGR_POPCONTEXT 0x00000582
+#define DISPID_MX_NSMGR_DECLAREPREFIX 0x00000583
+#define DISPID_MX_NSMGR_GETDECLAREDPREFIXES 0x00000584
+#define DISPID_MX_NSMGR_GETPREFIXES 0x00000585
+#define DISPID_MX_NSMGR_GETURI 0x00000586
+#define DISPID_MX_NSMGR_GETURIFROMNODE 0x00000587
+#define DISPID_MX_NSMGR_LENGTH 0x00000588
+
+#define DISPID_SOM_VALIDATE 0x0000058b
+#define DISPID_SOM_VALIDATEONLOAD 0x0000058c
+#define DISPID_SOM_GETSCHEMA 0x0000058d
+#define DISPID_SOM_GETDECLARATION 0x0000058e
+#define DISPID_SOM_ITEMBYNAME 0x0000058f
+#define DISPID_SOM_ITEMBYQNAME 0x00000590
+#define DISPID_SOM_ANYATTRIBUTE 0x00000591
+#define DISPID_SOM_ATTRIBUTEGROUPS 0x00000592
+#define DISPID_SOM_ATTRIBUTES 0x00000593
+#define DISPID_SOM_BASETYPES 0x00000594
+#define DISPID_SOM_CONTENTMODEL 0x00000595
+#define DISPID_SOM_CONTENTTYPE 0x00000596
+#define DISPID_SOM_DEFAULTVALUE 0x00000597
+#define DISPID_SOM_DERIVEDBY 0x00000598
+#define DISPID_SOM_DISALLOWED 0x00000599
+#define DISPID_SOM_ELEMENTS 0x0000059a
+#define DISPID_SOM_ENUMERATION 0x0000059b
+#define DISPID_SOM_FIELDS 0x0000059c
+#define DISPID_SOM_FINAL 0x0000059d
+#define DISPID_SOM_FIXEDVALUE 0x0000059e
+#define DISPID_SOM_FRACTIONDIGITS 0x0000059f
+#define DISPID_SOM_ID 0x000005a0
+#define DISPID_SOM_IDCONSTRAINTS 0x000005a1
+#define DISPID_SOM_ISABSTRACT 0x000005a2
+#define DISPID_SOM_ISNILLABLE 0x000005a3
+#define DISPID_SOM_ISREFERENCE 0x000005a4
+#define DISPID_SOM_ISVALID 0x000005a5
+#define DISPID_SOM_ITEMTYPE 0x000005a6
+#define DISPID_SOM_LENGTH 0x000005a7
+#define DISPID_SOM_MAXEXCLUSIVE 0x000005a8
+#define DISPID_SOM_MAXINCLUSIVE 0x000005a9
+#define DISPID_SOM_MAXLENGTH 0x000005aa
+#define DISPID_SOM_MAXOCCURS 0x000005ab
+#define DISPID_SOM_MINEXCLUSIVE 0x000005ac
+#define DISPID_SOM_MININCLUSIVE 0x000005ad
+#define DISPID_SOM_MINLENGTH 0x000005ae
+#define DISPID_SOM_MINOCCURS 0x000005af
+#define DISPID_SOM_MODELGROUPS 0x000005b0
+#define DISPID_SOM_NAME 0x000005b1
+#define DISPID_SOM_NAMESPACES 0x000005b2
+#define DISPID_SOM_NAMESPACEURI 0x000005b3
+#define DISPID_SOM_NOTATIONS 0x000005b4
+#define DISPID_SOM_PARTICLES 0x000005b5
+#define DISPID_SOM_PATTERNS 0x000005b6
+#define DISPID_SOM_PROCESSCONTENTS 0x000005b7
+#define DISPID_SOM_PROHIBITED 0x000005b8
+#define DISPID_SOM_PUBLICIDENTIFIER 0x000005b9
+#define DISPID_SOM_REFERENCEDKEY 0x000005ba
+#define DISPID_SOM_SCHEMA 0x000005bb
+#define DISPID_SOM_SCHEMALOCATIONS 0x000005bc
+#define DISPID_SOM_SCOPE 0x000005bd
+#define DISPID_SOM_SELECTOR 0x000005be
+#define DISPID_SOM_SUBSTITUTIONGROUP 0x000005bf
+#define DISPID_SOM_EXCLUSIONS 0x000005c0
+#define DISPID_SOM_SYSTEMIDENTIFIER 0x000005c1
+#define DISPID_SOM_TARGETNAMESPACE 0x000005c2
+#define DISPID_SOM_TOTALDIGITS 0x000005c3
+#define DISPID_SOM_TYPE 0x000005c4
+#define DISPID_SOM_TYPES 0x000005c5
+#define DISPID_SOM_UNHANDLEDATTRS 0x000005c6
+#define DISPID_SOM_USE 0x000005c7
+#define DISPID_SOM_VARIETY 0x000005c8
+#define DISPID_SOM_VERSION 0x000005c9
+#define DISPID_SOM_WHITESPACE 0x000005ca
+#define DISPID_SOM_WRITEANNOTATION 0x000005cb
+
#endif /* __MSXML2DID_H__ */
diff --git a/include/psdk/prsht.h b/include/psdk/prsht.h
index 91f3e76de14..dc1b1afedac 100644
--- a/include/psdk/prsht.h
+++ b/include/psdk/prsht.h
@@ -82,7 +82,11 @@ extern "C" {
#if (_WIN32_IE >= 0x0500)
#define PSM_GETRESULT 1159
#define PropSheet_GetResult(hDlg) SNDMSG(hDlg, PSM_GETRESULT, 0, 0)
+
#define PSM_HWNDTOINDEX 1153
+#define PropSheet_HwndToIndex(hDlg, hwnd) \
+ (int)SNDMSG(hDlg, PSM_HWNDTOINDEX, (WPARAM)(hwnd), 0)
+
#define PSM_IDTOINDEX 1157
#define PSM_INDEXTOHWND 1154
#define PSM_INDEXTOID 1158
diff --git a/include/psdk/shellapi.h b/include/psdk/shellapi.h
index 26fe6450873..ff7b94ea3f9 100644
--- a/include/psdk/shellapi.h
+++ b/include/psdk/shellapi.h
@@ -128,6 +128,19 @@ extern "C" {
#define SHGFI_PIDL 8
#define SHGFI_USEFILEATTRIBUTES 16
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+#define SHIL_LARGE 0x0
+#define SHIL_SMALL 0x1
+#define SHIL_EXTRALARGE 0x2
+#define SHIL_SYSSMALL 0x3
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define SHIL_JUMBO 0x4
+#define SHIL_LAST SHIL_JUMBO
+#else
+#define SHIL_LAST SHIL_SYSSMALL
+#endif
+#endif
+
typedef struct _SHCREATEPROCESSINFOW
{
DWORD cbSize;
diff --git a/include/psdk/urlmon.idl b/include/psdk/urlmon.idl
index 2ab3b2b021d..c1d3bec3b57 100644
--- a/include/psdk/urlmon.idl
+++ b/include/psdk/urlmon.idl
@@ -1231,6 +1231,7 @@ interface IInternetZoneManager : IUnknown
typedef enum tagURLZONE
{
+ URLZONE_INVALID = -1,
URLZONE_PREDEFINED_MIN = 0,
URLZONE_LOCAL_MACHINE = 0,
URLZONE_INTRANET = 1,
@@ -1563,6 +1564,15 @@ interface IUri : IUnknown
Uri_PROPERTY_DWORD_LAST = Uri_PROPERTY_ZONE
} Uri_PROPERTY;
+ typedef enum
+ {
+ Uri_HOST_UNKNOWN = 0,
+ Uri_HOST_DNS = 1,
+ Uri_HOST_IPV4 = 2,
+ Uri_HOST_IPV6 = 3,
+ Uri_HOST_IDN = 4
+ } Uri_HOST_TYPE;
+
HRESULT GetPropertyBSTR(
[in] Uri_PROPERTY uriProp,
[out] BSTR *pbstrProperty,
diff --git a/include/psdk/wincrypt.h b/include/psdk/wincrypt.h
index 3f7f4ed6e5b..540169b266d 100644
--- a/include/psdk/wincrypt.h
+++ b/include/psdk/wincrypt.h
@@ -3389,6 +3389,8 @@ typedef struct _CERT_CHAIN_ENGINE_CONFIG
DWORD dwUrlRetrievalTimeout;
DWORD MaximumCachedCertificates;
DWORD CycleDetectionModulus;
+ HCERTSTORE hExclusiveRoot;
+ HCERTSTORE hExclusiveRootTrustedPeople;
} CERT_CHAIN_ENGINE_CONFIG, *PCERT_CHAIN_ENGINE_CONFIG;
/* message-related definitions */
diff --git a/include/psdk/wininet.h b/include/psdk/wininet.h
index 1cb0508ead3..a0ec4082d12 100644
--- a/include/psdk/wininet.h
+++ b/include/psdk/wininet.h
@@ -122,6 +122,9 @@ INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP)
)
#define INTERNET_ERROR_MASK_INSERT_CDROM 0x1
+#define INTERNET_ERROR_MASK_COMBINED_SEC_CERT 0x2
+#define INTERNET_ERROR_MASK_NEED_MSN_SSPI_PKG 0x4
+#define INTERNET_ERROR_MASK_LOGIN_FAILURE_DISPLAY_ENTITY_BODY 0x8
#define INTERNET_OPTIONS_MASK (~INTERNET_FLAGS_MASK)
#define WININET_API_FLAG_ASYNC 0x00000001
diff --git a/include/psdk/winnt.h b/include/psdk/winnt.h
index d0e203fd206..10c4a14e39f 100644
--- a/include/psdk/winnt.h
+++ b/include/psdk/winnt.h
@@ -2339,8 +2339,8 @@ typedef struct _KNONVOLATILE_CONTEXT_POINTERS {
PM128A Xmm13;
PM128A Xmm14;
PM128A Xmm15;
- };
- };
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
union {
PULONG64 IntegerContext[16];
@@ -2361,8 +2361,8 @@ typedef struct _KNONVOLATILE_CONTEXT_POINTERS {
PULONG64 R13;
PULONG64 R14;
PULONG64 R15;
- };
- };
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME2;
} KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS;
#define RUNTIME_FUNCTION_INDIRECT 0x1
diff --git a/include/reactos/libs/pseh/pseh2.h b/include/reactos/libs/pseh/pseh2.h
index ce1326e9ae0..6c473a4c43d 100644
--- a/include/reactos/libs/pseh/pseh2.h
+++ b/include/reactos/libs/pseh/pseh2.h
@@ -26,7 +26,7 @@
#ifndef KJK_PSEH2_H_
#define KJK_PSEH2_H_
-#if !defined (__arm__)
+#if !defined (__arm__) && !defined(__clang__)
#if defined(__GNUC__)
struct _EXCEPTION_RECORD;
@@ -395,7 +395,7 @@ __SEH_END_SCOPE_CHAIN;
#define _SEH2_END }
#define _SEH2_GetExceptionInformation()
-#define _SEH2_GetExceptionCode() STATUS_SUCCESS
+#define _SEH2_GetExceptionCode() 0
#define _SEH2_AbnormalTermination()
#define _SEH2_YIELD(STMT_) STMT_
diff --git a/include/reactos/libs/sound/mmebuddy.h b/include/reactos/libs/sound/mmebuddy.h
index 4e1583230c1..cae6f3f1489 100644
--- a/include/reactos/libs/sound/mmebuddy.h
+++ b/include/reactos/libs/sound/mmebuddy.h
@@ -400,8 +400,8 @@ ReleaseEntrypointMutex(
VOID
NotifyMmeClient(
IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
- IN DWORD Message,
- IN DWORD Parameter);
+ IN UINT Message,
+ IN DWORD_PTR Parameter);
MMRESULT
MmeGetSoundDeviceCapabilities(
@@ -413,20 +413,20 @@ MmeGetSoundDeviceCapabilities(
MMRESULT
MmeOpenWaveDevice(
IN MMDEVICE_TYPE DeviceType,
- IN DWORD DeviceId,
+ IN UINT DeviceId,
IN LPWAVEOPENDESC OpenParameters,
IN DWORD Flags,
- OUT DWORD* PrivateHandle);
+ OUT DWORD_PTR* PrivateHandle);
MMRESULT
MmeCloseDevice(
- IN DWORD PrivateHandle);
+ IN DWORD_PTR PrivateHandle);
MMRESULT
MmeGetPosition(
IN MMDEVICE_TYPE DeviceType,
IN DWORD DeviceId,
- IN DWORD PrivateHandle,
+ IN DWORD_PTR PrivateHandle,
IN MMTIME* Time,
IN DWORD Size);
@@ -441,7 +441,7 @@ MmeGetDeviceInterfaceString(
MMRESULT
MmeSetState(
- IN DWORD PrivateHandle,
+ IN DWORD_PTR PrivateHandle,
IN BOOL bStart);
@@ -456,7 +456,7 @@ MmeSetState(
MMRESULT
MmeResetWavePlayback(
- IN DWORD PrivateHandle);
+ IN DWORD_PTR PrivateHandle);
/*
diff --git a/include/reactos/subsys/csrss/csrss.h b/include/reactos/subsys/csrss/csrss.h
index 0119bad99a3..1f8628ef712 100644
--- a/include/reactos/subsys/csrss/csrss.h
+++ b/include/reactos/subsys/csrss/csrss.h
@@ -51,10 +51,9 @@ typedef struct
typedef struct
{
- ULONG nMaxIds;
- ULONG nProcessIdsCopied;
- ULONG nProcessIdsTotal;
- HANDLE ProcessId[0];
+ USHORT nMaxIds;
+ PDWORD ProcessId;
+ ULONG nProcessIdsTotal;
} CSRSS_GET_PROCESS_LIST, *PCSRSS_GET_PROCESS_LIST;
typedef struct
@@ -63,6 +62,7 @@ typedef struct
BOOL Unicode;
ULONG NrCharactersToWrite;
ULONG NrCharactersWritten;
+ HANDLE UnpauseEvent;
BYTE Buffer[0];
} CSRSS_WRITE_CONSOLE, *PCSRSS_WRITE_CONSOLE;
@@ -70,8 +70,8 @@ typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
+ WORD FullReadSize;
WORD NrCharactersToRead;
- WORD nCharsCanBeDeleted; /* number of chars already in buffer that can be backspaced */
HANDLE EventHandle;
ULONG NrCharactersRead;
BYTE Buffer[0];
@@ -80,7 +80,8 @@ typedef struct
typedef struct
{
PCONTROLDISPATCHER CtrlDispatcher;
- BOOL ConsoleNeeded;
+ BOOLEAN ConsoleNeeded;
+ BOOLEAN Visible;
HANDLE Console;
HANDLE InputHandle;
HANDLE OutputHandle;
@@ -206,13 +207,13 @@ typedef struct
typedef struct
{
DWORD Length;
- WCHAR Title[0];
+ PWCHAR Title;
} CSRSS_SET_TITLE, *PCSRSS_SET_TITLE;
typedef struct
{
DWORD Length;
- WCHAR Title[0];
+ PWCHAR Title;
} CSRSS_GET_TITLE, *PCSRSS_GET_TITLE;
typedef struct
@@ -320,15 +321,10 @@ typedef struct
{
DWORD Access;
BOOL Inheritable;
- HANDLE InputHandle;
-} CSRSS_GET_INPUT_HANDLE, *PCSRSS_GET_INPUT_HANDLE;
-
-typedef struct
-{
- DWORD Access;
- BOOL Inheritable;
- HANDLE OutputHandle;
-} CSRSS_GET_OUTPUT_HANDLE, *PCSRSS_GET_OUTPUT_HANDLE;
+ HANDLE Handle;
+ DWORD ShareMode;
+} CSRSS_GET_INPUT_HANDLE, *PCSRSS_GET_INPUT_HANDLE,
+ CSRSS_GET_OUTPUT_HANDLE, *PCSRSS_GET_OUTPUT_HANDLE;
typedef struct
{
@@ -478,6 +474,42 @@ typedef struct
COORD Size;
} CSRSS_SET_SCREEN_BUFFER_SIZE, *PCSRSS_SET_SCREEN_BUFFER_SIZE;
+typedef struct
+{
+ CONSOLE_SELECTION_INFO Info;
+} CSRSS_GET_CONSOLE_SELECTION_INFO, *PCSRSS_GET_CONSOLE_SELECTION_INFO;
+
+typedef struct
+{
+ UNICODE_STRING ExeName;
+ DWORD Length;
+} CSRSS_GET_COMMAND_HISTORY_LENGTH, *PCSRSS_GET_COMMAND_HISTORY_LENGTH;
+
+typedef struct
+{
+ UNICODE_STRING ExeName;
+ PWCHAR History;
+ DWORD Length;
+} CSRSS_GET_COMMAND_HISTORY, *PCSRSS_GET_COMMAND_HISTORY;
+
+typedef struct
+{
+ UNICODE_STRING ExeName;
+} CSRSS_EXPUNGE_COMMAND_HISTORY, *PCSRSS_EXPUNGE_COMMAND_HISTORY;
+
+typedef struct
+{
+ UNICODE_STRING ExeName;
+ DWORD NumCommands;
+} CSRSS_SET_HISTORY_NUMBER_COMMANDS, *PCSRSS_SET_HISTORY_NUMBER_COMMANDS;
+
+typedef struct
+{
+ DWORD HistoryBufferSize;
+ DWORD NumberOfHistoryBuffers;
+ DWORD dwFlags;
+} CSRSS_GET_HISTORY_INFO, *PCSRSS_GET_HISTORY_INFO,
+ CSRSS_SET_HISTORY_INFO, *PCSRSS_SET_HISTORY_INFO;
#define CSR_API_MESSAGE_HEADER_SIZE(Type) (FIELD_OFFSET(CSR_API_MESSAGE, Data) + sizeof(Type))
#define CSRSS_MAX_WRITE_CONSOLE (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE))
@@ -486,11 +518,6 @@ typedef struct
#define CSRSS_MAX_READ_CONSOLE (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE))
#define CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR))
#define CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB))
-#define CSRSS_MAX_GET_PROCESS_LIST (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST))
-
-/* WCHARs, not bytes! */
-#define CSRSS_MAX_TITLE_LENGTH 80
-#define CSRSS_MAX_ALIAS_TARGET_LENGTH 80
#define CREATE_PROCESS (0x0)
#define TERMINATE_PROCESS (0x1)
@@ -557,6 +584,13 @@ typedef struct
#define GENERATE_CTRL_EVENT (0x3E)
#define CREATE_THREAD (0x3F)
#define SET_SCREEN_BUFFER_SIZE (0x40)
+#define GET_CONSOLE_SELECTION_INFO (0x41)
+#define GET_COMMAND_HISTORY_LENGTH (0x42)
+#define GET_COMMAND_HISTORY (0x43)
+#define EXPUNGE_COMMAND_HISTORY (0x44)
+#define SET_HISTORY_NUMBER_COMMANDS (0x45)
+#define GET_HISTORY_INFO (0x46)
+#define SET_HISTORY_INFO (0x47)
/* Keep in sync with definition below. */
#define CSRSS_HEADER_SIZE (sizeof(PORT_MESSAGE) + sizeof(ULONG) + sizeof(NTSTATUS))
@@ -631,6 +665,13 @@ typedef struct _CSR_API_MESSAGE
CSRSS_GET_CONSOLE_ALIASES_EXES_LENGTH GetConsoleAliasesExesLength;
CSRSS_GENERATE_CTRL_EVENT GenerateCtrlEvent;
CSRSS_SET_SCREEN_BUFFER_SIZE SetScreenBufferSize;
+ CSRSS_GET_CONSOLE_SELECTION_INFO GetConsoleSelectionInfo;
+ CSRSS_GET_COMMAND_HISTORY_LENGTH GetCommandHistoryLength;
+ CSRSS_GET_COMMAND_HISTORY GetCommandHistory;
+ CSRSS_EXPUNGE_COMMAND_HISTORY ExpungeCommandHistory;
+ CSRSS_SET_HISTORY_NUMBER_COMMANDS SetHistoryNumberCommands;
+ CSRSS_GET_HISTORY_INFO GetHistoryInfo;
+ CSRSS_SET_HISTORY_INFO SetHistoryInfo;
} Data;
} CSR_API_MESSAGE, *PCSR_API_MESSAGE;
diff --git a/include/reactos/win32k/callback.h b/include/reactos/win32k/callback.h
index 7dd97948adc..fc7c0bb95e2 100644
--- a/include/reactos/win32k/callback.h
+++ b/include/reactos/win32k/callback.h
@@ -33,6 +33,13 @@ typedef struct _SENDASYNCPROC_CALLBACK_ARGUMENTS
LRESULT Result;
} SENDASYNCPROC_CALLBACK_ARGUMENTS, *PSENDASYNCPROC_CALLBACK_ARGUMENTS;
+typedef struct _CALL_BACK_INFO
+{
+ SENDASYNCPROC CallBack;
+ ULONG_PTR Context;
+} CALL_BACK_INFO, * PCALL_BACK_INFO;
+
+
typedef struct _HOOKPROC_CALLBACK_ARGUMENTS
{
INT HookId;
diff --git a/include/reactos/win32k/ntuser.h b/include/reactos/win32k/ntuser.h
index 0d6d7811db7..007fa887200 100644
--- a/include/reactos/win32k/ntuser.h
+++ b/include/reactos/win32k/ntuser.h
@@ -3135,7 +3135,6 @@ typedef struct tagKMDDELPARAM
#define NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO 0xffff0005
#define NOPARAM_ROUTINE_ANYPOPUP 0xffff0006
-#define NOPARAM_ROUTINE_CSRSS_INITIALIZED 0xffff0007
#define ONEPARAM_ROUTINE_CSRSS_GUICHECK 0xffff0008
#define ONEPARAM_ROUTINE_SWITCHCARETSHOWING 0xfffe0008
#define ONEPARAM_ROUTINE_ISWINDOWINDESTROY 0xfffe000c
diff --git a/include/reactos/wine/config.h b/include/reactos/wine/config.h
index 406b5fb895d..404783b1d26 100644
--- a/include/reactos/wine/config.h
+++ b/include/reactos/wine/config.h
@@ -442,6 +442,12 @@
/* Define to 1 if you have the header file. */
/* #undef HAVE_OPENSSL_SSL_H */
+/* Define to 1 if you have the `z' library (-lz). */
+#define HAVE_ZLIB 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_ZLIB_H 1
+
/* Define to 1 if you have the `pclose' function. */
#define HAVE_PCLOSE 1
diff --git a/include/reactos/wine/test.h b/include/reactos/wine/test.h
index d0d8208926c..bbd0c6b2d74 100644
--- a/include/reactos/wine/test.h
+++ b/include/reactos/wine/test.h
@@ -80,21 +80,21 @@ extern void winetest_vskip( const char *msg, va_list ap );
#ifdef __GNUC__
-extern int winetest_ok( int condition, const char *msg, ... ) __attribute__((format (printf,2,3) ));
+extern void winetest_ok( int condition, const char *msg, ... ) __attribute__((format (printf,2,3) ));
extern void winetest_skip( const char *msg, ... ) __attribute__((format (printf,1,2)));
extern void winetest_win_skip( const char *msg, ... ) __attribute__((format (printf,1,2)));
extern void winetest_trace( const char *msg, ... ) __attribute__((format (printf,1,2)));
#else /* __GNUC__ */
-extern int winetest_ok( int condition, const char *msg, ... );
+extern void winetest_ok( int condition, const char *msg, ... );
extern void winetest_skip( const char *msg, ... );
extern void winetest_win_skip( const char *msg, ... );
extern void winetest_trace( const char *msg, ... );
#endif /* __GNUC__ */
-#define ok_(file, line) (winetest_set_location(file, line), 0) ? 0 : winetest_ok
+#define ok_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_ok
#define skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_skip
#define win_skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_win_skip
#define trace_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_trace
@@ -322,15 +322,13 @@ int winetest_vok( int condition, const char *msg, va_list args )
}
}
-int winetest_ok( int condition, const char *msg, ... )
+void winetest_ok( int condition, const char *msg, ... )
{
va_list valist;
- int rc;
-
+
va_start(valist, msg);
- rc=winetest_vok(condition, msg, valist);
+ winetest_vok(condition, msg, valist);
va_end(valist);
- return rc;
}
void winetest_trace( const char *msg, ... )
diff --git a/include/reactos/wine/wined3d.idl b/include/reactos/wine/wined3d.idl
index 6364f9cfe89..1da7d44b738 100644
--- a/include/reactos/wine/wined3d.idl
+++ b/include/reactos/wine/wined3d.idl
@@ -275,9 +275,7 @@ typedef enum _WINED3DFORMAT
typedef enum _WINED3DRENDERSTATETYPE
{
- WINED3DRS_TEXTUREHANDLE = 1, /* d3d7 */
WINED3DRS_ANTIALIAS = 2, /* d3d7 */
- WINED3DRS_TEXTUREADDRESS = 3, /* d3d7 */
WINED3DRS_TEXTUREPERSPECTIVE = 4, /* d3d7 */
WINED3DRS_WRAPU = 5, /* d3d7 */
WINED3DRS_WRAPV = 6, /* d3d7 */
@@ -291,11 +289,8 @@ typedef enum _WINED3DRENDERSTATETYPE
WINED3DRS_ZWRITEENABLE = 14,
WINED3DRS_ALPHATESTENABLE = 15,
WINED3DRS_LASTPIXEL = 16,
- WINED3DRS_TEXTUREMAG = 17, /* d3d7 */
- WINED3DRS_TEXTUREMIN = 18, /* d3d7 */
WINED3DRS_SRCBLEND = 19,
WINED3DRS_DESTBLEND = 20,
- WINED3DRS_TEXTUREMAPBLEND = 21, /* d3d7 */
WINED3DRS_CULLMODE = 22,
WINED3DRS_ZFUNC = 23,
WINED3DRS_ALPHAREF = 24,
@@ -316,9 +311,6 @@ typedef enum _WINED3DRENDERSTATETYPE
WINED3DRS_STIPPLEENABLE = 39, /* d3d7 */
WINED3DRS_EDGEANTIALIAS = 40, /* d3d7, d3d8 */
WINED3DRS_COLORKEYENABLE = 41, /* d3d7 */
- WINED3DRS_BORDERCOLOR = 43, /* d3d7 */
- WINED3DRS_TEXTUREADDRESSU = 44, /* d3d7 */
- WINED3DRS_TEXTUREADDRESSV = 45, /* d3d7 */
WINED3DRS_MIPMAPLODBIAS = 46, /* d3d7 */
WINED3DRS_ZBIAS = 47, /* d3d7, d3d8 */
WINED3DRS_RANGEFOGENABLE = 48,
@@ -334,38 +326,6 @@ typedef enum _WINED3DRENDERSTATETYPE
WINED3DRS_STENCILMASK = 58,
WINED3DRS_STENCILWRITEMASK = 59,
WINED3DRS_TEXTUREFACTOR = 60,
- WINED3DRS_STIPPLEPATTERN00 = 64,
- WINED3DRS_STIPPLEPATTERN01 = 65,
- WINED3DRS_STIPPLEPATTERN02 = 66,
- WINED3DRS_STIPPLEPATTERN03 = 67,
- WINED3DRS_STIPPLEPATTERN04 = 68,
- WINED3DRS_STIPPLEPATTERN05 = 69,
- WINED3DRS_STIPPLEPATTERN06 = 70,
- WINED3DRS_STIPPLEPATTERN07 = 71,
- WINED3DRS_STIPPLEPATTERN08 = 72,
- WINED3DRS_STIPPLEPATTERN09 = 73,
- WINED3DRS_STIPPLEPATTERN10 = 74,
- WINED3DRS_STIPPLEPATTERN11 = 75,
- WINED3DRS_STIPPLEPATTERN12 = 76,
- WINED3DRS_STIPPLEPATTERN13 = 77,
- WINED3DRS_STIPPLEPATTERN14 = 78,
- WINED3DRS_STIPPLEPATTERN15 = 79,
- WINED3DRS_STIPPLEPATTERN16 = 80,
- WINED3DRS_STIPPLEPATTERN17 = 81,
- WINED3DRS_STIPPLEPATTERN18 = 82,
- WINED3DRS_STIPPLEPATTERN19 = 83,
- WINED3DRS_STIPPLEPATTERN20 = 84,
- WINED3DRS_STIPPLEPATTERN21 = 85,
- WINED3DRS_STIPPLEPATTERN22 = 86,
- WINED3DRS_STIPPLEPATTERN23 = 87,
- WINED3DRS_STIPPLEPATTERN24 = 88,
- WINED3DRS_STIPPLEPATTERN25 = 89,
- WINED3DRS_STIPPLEPATTERN26 = 90,
- WINED3DRS_STIPPLEPATTERN27 = 91,
- WINED3DRS_STIPPLEPATTERN28 = 92,
- WINED3DRS_STIPPLEPATTERN29 = 93,
- WINED3DRS_STIPPLEPATTERN30 = 94,
- WINED3DRS_STIPPLEPATTERN31 = 95,
WINED3DRS_WRAP0 = 128,
WINED3DRS_WRAP1 = 129,
WINED3DRS_WRAP2 = 130,
@@ -407,8 +367,6 @@ typedef enum _WINED3DRENDERSTATETYPE
WINED3DRS_COLORWRITEENABLE = 168,
WINED3DRS_TWEENFACTOR = 170,
WINED3DRS_BLENDOP = 171,
- WINED3DRS_POSITIONORDER = 172,
- WINED3DRS_NORMALORDER = 173,
WINED3DRS_POSITIONDEGREE = 172,
WINED3DRS_NORMALDEGREE = 173,
WINED3DRS_SCISSORTESTENABLE = 174,
@@ -3452,6 +3410,15 @@ interface IWineD3DDevice : IWineD3DBase
[in] D3DCB_ENUMRESOURCES callback,
[in] void *data
);
+ HRESULT GetSurfaceFromDC(
+ [in] HDC dc,
+ [out] IWineD3DSurface **surface
+ );
+ HRESULT AcquireFocusWindow(
+ [in] HWND window
+ );
+ void ReleaseFocusWindow(
+ );
}
IWineD3D *WineDirect3DCreate(UINT dxVersion, IUnknown *parent);
diff --git a/lib/3rdparty/3rdparty.rbuild b/lib/3rdparty/3rdparty.rbuild
index 7f0c2006e45..92ecd8abc7c 100644
--- a/lib/3rdparty/3rdparty.rbuild
+++ b/lib/3rdparty/3rdparty.rbuild
@@ -1,6 +1,9 @@
+
+ -Wno-unused-value
+
diff --git a/lib/3rdparty/freetype/ChangeLog b/lib/3rdparty/freetype/ChangeLog
index cd5a4df4cc1..83a7d53c6d4 100644
--- a/lib/3rdparty/freetype/ChangeLog
+++ b/lib/3rdparty/freetype/ChangeLog
@@ -1,3 +1,5498 @@
+2010-02-13 Werner Lemberg
+
+ * Version 2.3.12 released.
+ ==========================
+
+
+ Tag sources with `VER-2-3-12'.
+
+ * docs/CHANGES: Updated.
+
+ * docs/VERSION.DLL: Update documentation and bump version number to
+ 2.3.12.
+
+ * README, Jamfile (RefDoc),
+ builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html,
+ builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html,
+ builds/win32/visualc/freetype.dsp,
+ builds/win32/visualc/freetype.vcproj,
+ builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp,
+ builds/win32/visualce/freetype.vcproj,
+ builds/win32/visualce/index.html,
+ builds/wince/vc2005-ce/freetype.vcproj,
+ builds/wince/vc2005-ce/index.html,
+ builds/wince/vc2008-ce/freetype.vcproj,
+ builds/wince/vc2008-ce/index.html: s/2.3.11/2.3.12/, s/2311/2312/.
+
+ * include/freetype/freetype.h (FREETYPE_PATCH): Set to 12.
+
+ * builds/unix/configure.raw (version_info): Set to 10:0:4.
+
+2010-02-12 suzuki toshiya
+
+ Improve autotool version checking to work with beta releases.
+
+ * autogen.sh (check_tool_version): Improve the extraction of version
+ number from "tool --version" output. Some beta releases of
+ autotools have extra strings before version number.
+
+2010-02-12 suzuki toshiya
+
+ Fix overallocating bug in FT_Outline_New_Internal().
+
+ * src/base/ftoutln.c (FT_Outline_New_Internal): The length of
+ FT_Outline->points[] should be numPoints, not 2 * numPoints.
+ Found by Paul Messmer, see
+ http://lists.gnu.org/archive/html/freetype-devel/2010-02/msg00003.html
+
+2010-02-10 Ken Sharp
+
+ Really fix Savannah bug #28678 (part 2).
+
+ Since we consider `sbw' for the horizontal direction only, we still have
+ to synthesize vertical metrics if the user wants to use the vertical
+ writing direction.
+
+ * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c
+ (cid_slot_load_glyph), src/type1/t1gload.c (T1_Load_Glyph):
+ Synthesize vertical metrics (only) if FT_LOAD_VERTICAL_LAYOUT is
+ set.
+
+2010-02-10 Ken Sharp
+
+ Really fix Savannah bug #28678 (part 1).
+
+ After long discussion, we now consider the character width vector
+ (wx,wy) returned by the `sbw' Type 1 operator as being part of *one*
+ direction only. For example, if you are using the horizontal
+ writing direction, you get the horizontal and vertical components of
+ the advance width for this direction. Note that OpenType and CFF fonts
+ don't have such a vertical component; instead, the GPOS table can be
+ used to generate two-dimensional advance widths (but this isn't
+ handled by FreeType).
+
+ * include/freetype/ftincrem.h (FT_Incremental_MetricsRec): Add
+ `advance_v' field to hold the vertical component of the advance
+ value.
+
+ * src/truetype/ttgload.c (tt_get_metrics), src/cff/cffgload.c
+ (cff_slot_load), src/type1/t1gload.c
+ (T1_Parse_Glyph_And_Get_Char_String), src/cid/cidgload.c
+ (cid_load_glyph): Use it.
+
+2010-02-08 Werner Lemberg
+
+ * devel/ftoption.h [FT_CONFIG_OPTION_PIC]: Define.
+
+2010-02-04 suzuki toshiya
+
+ Prevent NULL pointer dereference passed to FT_Module_Requester.
+
+ * src/sfnt/sfdriver.c (sfnt_get_interface): Don't use `module'.
+ * src/psnames/psmodule.c (psnames_get_interface): Ditto.
+
+ * src/cff/cffdrivr.c (cff_get_interface): Check NULL `driver'.
+ * src/truetype/ttdriver.c (tt_get_interface): Ditto.
+
+2010-01-29 suzuki toshiya
+
+ Fix memory leaks in previous patch.
+
+ * src/sfnt/sfobjs.c (sfnt_load_face): Don't overwrite the strings
+ allocated for face->root.family_name and style_name.
+
+2010-01-29 suzuki toshiya
+
+ New parameters for FT_Open_Face() to ignore preferred family names.
+
+ Preferred family names should be used for legacy systems that
+ can hold only a few faces (<= 4) for a family name. Suggested by
+ Andreas Heinrich.
+ http://lists.gnu.org/archive/html/freetype/2010-01/msg00001.html
+
+ * include/freetype/ftsnames.h (FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY,
+ FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY): Define.
+
+ * src/sfnt/sfobjs.h (sfnt_load_face): Check the arguments and
+ ignore preferred family and subfamily names if requested.
+
+2010-01-27 Ken Sharp
+
+ Fix Savannah bug #28678.
+
+ * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c
+ (cid_load_glyph): Handle vertical metrics correctly.
+
+ * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Handle
+ vertical metrics correctly.
+ (T1_Load_Glyph): Don't synthesize vertical metrics.
+
+2010-01-14 Werner Lemberg
+
+ Make FT_Set_Transform work if no renderer is available.
+
+ * src/base/ftobjs.c (FT_Load_Glyph): Apply `standard' transformation
+ if no renderer is compiled into the library.
+
+2010-01-14 Werner Lemberg
+
+ Fix compilation warning.
+
+ * src/base/ftbase.h: s/LOCAL_DEF/LOCAL/.
+ * src/base/ftobjc.s: Include ftbase.h conditionally.
+
+2010-01-11 Kwang Yul Seo
+
+ Provide inline assembly code for RVCT compiler.
+ This is Savannah patch #7059.
+
+ * include/freetype/config/ftconfig.h (FT_MULFIX_ASSEMBLER,
+ FT_MulFix_arm) [__CC_ARM || __ARM_CC]: Define.
+
+2010-01-08 Ken Sharp
+
+ Fix Savannah bug #28521.
+
+ Issue #28226 involved a work-around for a font which used the
+ `setcurrentpoint' operator in an invalid way; this operator is only
+ supposed to be used with the result of OtherSubrs, and the font used
+ it directly. The supplied patch removed the block of code which
+ checked this usage entirely.
+
+ This turns out to be a Bad Thing. If `setcurrentpoint' is being
+ used correctly it should reset the flex flag in the decoder. If we
+ don't do this then the flag never gets reset and we omit any further
+ contours from the glyph (at least until we close the path or
+ similar).
+
+ * src/psaux/t1decode.c (t1_decoder_parse_charstrings)
+ : Handle `flex_state' correctly.
+
+2010-01-05 Werner Lemberg
+
+ Apply reports from clang static analyzer.
+
+ * src/lzw/ftlzw.c (ft_lzw_file_init), src/base/ftstroke.c
+ (FT_Stroker_ParseOutline), src/base/ftsynth.c
+ (FT_GlyphSlot_Embolden): Remove dead code.
+
+ * src/base/ftpatent.c (_tt_check_patents_in_table): Initialize
+ `offset_i' and `length_i'.
+
+2010-01-05 Ralph Giles
+
+ Enable the incremental font interface by default.
+
+ Ghostscript requires the incremental font interface for handling
+ some Postscript documents. It is moving to using FreeType as its
+ primary renderer; supporting this in the default build makes it
+ Ghostscript to be linked against the system FreeType when one is
+ available.
+
+ * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_INCREMENTAL):
+ Uncomment.
+
+2010-01-05 Werner Lemberg
+
+ Fix Savannah bug #28395.
+
+ * src/truetype/ttdriver.c (Load_Glyph), src/type1/t1gload.c
+ (T1_Loada_Glyph): Don't check `num_glyphs' if incremental interface
+ is used.
+
+2010-01-05 Ken Sharp
+
+ Make Type 1 `seac' operator work with incremental interface.
+ This fixes Savannah bug #28480.
+
+ * src/psaux/t1decode.c (t1operator_seac): Don't check `glyph_names'
+ if incremental interface is used.
+
+2010-01-04 Ken Sharp
+
+ Make incremental interface work with TrueType fonts.
+ This fixes Savannah bug #28478.
+
+ * src/truetype/ttgload.c (load_truetype_glyph): Don't check
+ `glyf_offset' if incremental interface is used.
+
+2009-12-31 Lars Abrahamsson
+
+ Make compilation with FT_CONFIG_OPTION_PIC work again.
+
+ * src/base/ftglyph.c (FT_Glyph_To_Bitmap) [FT_CONFIG_OPTION_PIC]:
+ Declare `library' for FT_BITMAP_GLYPH_CLASS_GET.
+
+ * src/base/ftinit.c (ft_destroy_default_module_classes,
+ ft_create_default_module_classes): Use proper casts (needed for C++
+ compilation).
+
+ * src/sfnt/ttcmap.c (tt_cmap13_class_rec): Use FT_DEFINE_TT_CMAP.
+
+2009-12-22 Marc Kleine-Budde
+
+ Make freetype-config aware of $SYSROOT.
+ This is Savannah patch #7040.
+
+ * builds/unix/freetype-config.in: Decorate with ${SYSROOT} where
+ appropriate.
+
+2009-12-20 Werner Lemberg
+
+ Fix compiler warning.
+ Reported by Sean.
+
+ * src/base/ftdbgmem.c [!FT_DEBUG_MEMORY]: ANSI C doesn't like empty
+ source files; however, some compilers warn about an unused variable
+ declaration. This is now replaced with a typedef.
+
+2009-12-18 Werner Lemberg
+
+ Fix Savannah bug #28320.
+
+ There exist corrupt, subsetted fonts (embedded in PDF files) which
+ contain a private dict that ends with an unterminated floating point
+ number (no operator following). We now ignore this error (as
+ acrobat does).
+
+ * src/cff/cffparse.c (cff_parser_run): Don't emit a syntax error for
+ unterminated floating point numbers.
+
+2009-12-16 Werner Lemberg
+
+ Really fix compiler warnings.
+ Reported by Sean.
+
+ * src/truetype/ttgxvar.c (GX_PT_POINTS_ARE_WORDS,
+ GX_PT_POINT_RUN_COUNT_MASK): Convert enum values to macros.
+
+2009-12-16 suzuki toshiya
+
+ Improve configure.raw to copy some options from CFLAGS to LDFLAGS.
+ The linker of Mac OS X 10.6 is sensitive to the architecture. If
+ the architectures are specified explicitly for the C compiler, the
+ linker requires the architecture specifications too.
+
+ * builds/unix/configure.raw: Replace `-isysroot' option parser by
+ more generic argument parser.
+
+2009-12-15 Werner Lemberg
+
+ Fix compiler warnings.
+ Reported by Sean.
+
+ * src/truetype/ttgxvar.c (ft_var_readpackeddeltas): Fix counter data
+ type.
+
+2009-12-14 Ken Sharp
+
+ Ignore invalid `setcurrentpoint' operations in Type 1 fonts.
+ This fixes Savannah bug #28226.
+
+ At least two wild PostScript files of unknown provenance contain
+ Type 1 fonts, apparently converted from TrueType fonts in earlier
+ PDF versions of the files, which use the `setcurrentpoint' operator
+ inappropriately.
+
+ FreeType currently throws an error in this case, but Ghostscript and
+ Adobe Distiller both accept the fonts and ignore the problem. This
+ commit #ifdefs out the check so PostScript interpreters using
+ FreeType can render these files.
+
+ The specification says `setcurrentpoint' should only be used to set
+ the point after a `Subr' call, but these fonts use it to set the
+ initial point to (0,0). Unnecessarily so, as they correctly use an
+ `hsbw' operation which implicitly sets the initial point.
+
+ * src/psaux/t1decode.c (t1_decoder_parse_charstrings)
+ : Comment out code.
+
+2009-12-14 Bram Tassyns
+
+ Fix parsing of /CIDFontVersion.
+ This fixes Savannah bug #28287.
+
+ * src/cid/cidtoken.h: `cid_version' in CID_FaceInfoRec (in
+ t1tables.h) is of type FT_Fixed.
+
+2009-12-14 Werner Lemberg
+
+ Trace glyph index in CID module.
+ Suggested in Savannah patch #7023.
+
+ * src/cid/cidgload.c (cid_load_glyph): Add tracing message.
+
+2009-12-03 Werner Lemberg
+
+ Fix compiler warnings.
+
+ * src/truetype/ttgload.c (tt_get_metrics): Put `Exit' label into the
+ proper preprocessor conditional.
+ * src/pfr/pfrobjs.c (pfr_slot_load): Pacify gcc.
+
+2009-11-25 John Tytgat
+
+ Better handling of start of `eexec' section.
+ This fixes Savannah bug #28090.
+
+ * src/type1/t1parse.c (T1_Get_Private_Dict): Skip all whitespace
+ characters before start of `eexec' section.
+
+2009-11-20 Werner Lemberg
+
+ Fix Savannah bug #27742.
+
+ * src/base/ftstroke.c (ft_stroker_outside): Avoid silent division by
+ zero, using a threshold for `theta'.
+
+2009-11-20 Werner Lemberg
+
+ Fix Savannah bug #28036.
+
+ * src/type1/t1afm.c (t1_get_index): Fix comparison.
+
+2009-11-16 Werner Lemberg
+
+ Fix compiler warnings.
+ Reported by Kevin Blenkinsopp .
+
+ * src/sfnt/ttload.c (check_table_dir): Use proper data type.
+
+2009-11-15 Werner Lemberg
+
+ Really fix FreeDesktop bug #21197.
+ This also fixes Savannah bug #28021.
+
+ * src/autofit/aflatin.c (af_latin_metrics_check_digits),
+ src/autofit/aflatin2.c (af_latin2_metrics_check_digits): Fix loop.
+
+2009-11-15 Werner Lemberg
+
+ Add tracing messages for advance values.
+
+ * src/base/ftobjs.c (FT_Load_Glyph), src/truetype/ttgload.c
+ (TT_Get_HMetrics, TT_Get_VMetrics): Do it.
+
+2009-11-08 Werner Lemberg
+
+ Fix compiler warning.
+ Reported by Jeremy Manson .
+
+ * src/truetype/ttgload.c (load_truetype_glyph): Initialize `error'.
+
+2009-11-04 Werner Lemberg
+
+ Remove compiler warning.
+ Reported by Sean McBride .
+
+ * src/tools/apinames.c (read_header_file): Use a cast to
+ `int', as specified in the printf(3) man page.
+
+2009-11-04 Werner Lemberg
+
+ Fix Savannah bug #27921.
+
+ * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c
+ (cid_face_init), src/type1/t1afm.c (T1_Read_Metrics),
+ src/type1/t1objs.c (T1_Face_Init): Don't use unsigned constant
+ values for rounding if the argument can be negative.
+
+2009-11-03 Bram Tassyns
+
+ Add basic support for Type1 charstrings in CFF.
+ This fixes Savannah bug #27922.
+
+ * src/cff/cffgload.c (CFF_Operator, cff_argument_counts): Handle
+ `seac', `sbw', and `setcurrentpoint' opcodes.
+ (cff_compute_bias): Add parameter to indicate the charstring type.
+ Update all callers.
+ (cff_operator_seac): Add parameter for side bearing.
+ (cff_decoder_parse_charstrings): Updated for more Type1 support.
+
+2009-11-03 Werner Lemberg
+
+ Return correct `linearHoriAdvance' value for embedded TT bitmaps too.
+ Reported by Jeremy Manson .
+
+ src/truetype/ttgload.c (load_truetype_glyph): Add parameter to
+ quickly load the glyph header only.
+ Update all callers.
+ (tt_loader_init): Add parameter to quickly load the `glyf' table
+ only.
+ Update all callers.
+ (TT_Load_Glyph): Compute linear advance values for embedded bitmap
+ glyphs too.
+
+2009-11-03 Werner Lemberg
+
+ Improve code readability.
+
+ * src/ttgload.c (load_truetype_glyph): Move metrics calculation
+ to...
+ (tt_get_metrics): This new function.
+
+2009-10-26 Bram Tassyns
+
+ Fix Savannah bug #27811.
+
+ * src/truetype/ttxgvar.c (ft_var_readpackeddeltas): Fix
+ signed/unsigned mismatch.
+
+2009-10-19 Ning Dong
+
+ Fix handling of `get' and `put' CFF instructions.
+
+ * src/cff/cffgload.c (cff_decoder_parse_charstrings) : Appendix B of Adobe Technote #5177 limits the number of
+ elements for the `get' and `put' operators to 32.
+ * src/cff/cffgload.h (CFF_MAX_TRANS_ELEMENTS): Define.
+ (CFF_Decoder): Use it for `buildchar' and remove `len_buildchar'.
+
+2009-10-18 Werner Lemberg
+
+ Fix handling of `dup' CFF instruction.
+ Problem and solution reported by Ning Dong .
+
+ * src/cff/cffgload.c (cff_decoder_parse_charstrings) :
+ Increase `args' by 2, not 1.
+
+2009-10-10 Werner Lemberg
+
+ * Version 2.3.11 released.
+ ==========================
+
+
+ Tag sources with `VER-2-3-11'.
+
+ * docs/VERSION.DLL: Update documentation and bump version number to
+ 2.3.11.
+
+ * README, Jamfile (RefDoc), builds/win32/visualc/index.html,
+ builds/win32/visualc/freetype.dsp,
+ builds/win32/visualc/freetype.vcproj,
+ builds/win32/visualce/index.html,
+ builds/win32/visualce/freetype.dsp,
+ builds/win32/visualce/freetype.vcproj: s/2.3.10/2.3.11/, s/2310/2311/.
+
+ * include/freetype/freetype.h (FREETYPE_PATCH): Set to 11.
+
+ * builds/unix/configure.raw (version_info): Set to 9:22:3.
+
+2009-10-10 Werner Lemberg
+
+ * docs/CHANGES, docs/release: Updated.
+
+2009-10-10 suzuki toshiya
+
+ * src/pcf/pcfread.c (pcf_get_properties): Fix a bug in the nprops
+ truncation. Reported by Martin von Gagern and Peter Volkov.
+ https://bugs.gentoo.org/288357 and https://bugs.gentoo.org/288256
+
+2009-10-06 Werner Lemberg
+
+ * Version 2.3.10 released.
+ ==========================
+
+
+ Tag sources with `VER-2-3-10'.
+
+ * builds/toplevel.mk (major, minor, patch): Fix regexp to allow more
+ than a single digit.
+ (dist): We now use git.
+
+ * docs/VERSION.DLL: Update documentation and bump version number to
+ 2.3.10.
+
+ * README, Jamfile (RefDoc), builds/win32/visualc/index.html,
+ builds/win32/visualc/freetype.dsp,
+ builds/win32/visualc/freetype.vcproj,
+ builds/win32/visualce/index.html,
+ builds/win32/visualce/freetype.dsp,
+ builds/win32/visualce/freetype.vcproj: s/2.3.9/2.3.10/, s/239/2310/.
+
+ * include/freetype/freetype.h (FREETYPE_PATCH): Set to 10.
+
+ * builds/unix/configure.raw (version_info): Set to 9:21:3.
+
+2009-10-06 Werner Lemberg
+
+ Fix `make multi'.
+
+ * src/cache/ftccache.c, src/cache/ftcsbits.c (FT_COMPONENT): Define.
+
+ * src/sfnt/sfdriver.c: Include FT_INTERNAL_DEBUG_H.
+
+2009-09-27 suzuki toshiya
+
+ [cache] Fix Savannah bug #27441, clean up Redhat bugzilla #513582.
+ Tricky casts in FTC_{CACHE,GCACHE,MRULIST}_LOOKUP_CMP() are removed.
+ Now these functions should be called with FTC_Node or FTC_MruNode
+ variable, and the caller should cast them to appropriate pointers to
+ concrete data. These tricky casts can GCC-4.4 optimizer (-O2)
+ confused and the crashing binaries are generated.
+
+ * src/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): Drop tricky cast.
+ Now the 4th argument `node' of this function should be typed as
+ FTC_MruNode.
+
+ * src/cache/ftcglyph.h (FTC_GCACHE_LOOKUP_CMP): For inline
+ implementation, new temporal variable FTC_MruNode `_mrunode' to take
+ the pointer from FTC_MRULIST_LOOKUP_CMP(). For non-inline
+ implementation, tricky cast is dropped.
+
+ * src/cache/ftcmanag.c (FTC_SIZE_NODE): New macro casting
+ to FTC_SizeNode.
+ (FTC_Manager_LookupSize): Replace FTC_SizeNode `node' by FTC_MruNode
+ `mrunode', and FTC_SIZE_NODE() is inserted.
+ (FTC_FACE_NODE): New macro casting to FTC_FaceNode.
+ (FTC_Manager_LookupFace) Replace FTC_FaceNode `node' by FTC_MruNode
+ `mrunode', and FTC_FACE_NODE() is inserted.
+
+ * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Change the type of
+ `node' from FTC_INode to FTC_Node. Extra casting macro FTC_NODE()
+ is dropped.
+ (FTC_ImageCache_LookupScaler): Ditto.
+ (FTC_SBitCache_Lookup): Change the type of `node' from FTC_SNode to
+ FTC_Node. Extra casting macro FTC_NODE() is dropped. FTC_SNODE()
+ is inserted.
+ (FTC_SBitCache_LookupScaler): Ditto.
+
+ * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Change the type of
+ `node' from FTC_CMapNode to FTC_Node. Extra casting macro
+ FTC_NODE() is dropped, FTC_CMAP_NODE() is inserted.
+
+2009-09-25 suzuki toshiya
+
+ [cache, psaux, type1] Fix for multi build.
+ In multi build, some cpp functions are left as unresolved symbols.
+
+ * src/cache/ftcbasic.c: Include FT_INTERNAL_DEBUG_H for FT_TRACE1().
+
+ * src/psaux/t1decode.c: Include FT_INTERNAL_CALC_H for
+ FIXED_TO_INT().
+ * src/type1/t1gload.c: Ditto.
+ * src/type1/t1objs.c: Ditto.
+
+2009-09-25 suzuki toshiya
+
+ [autofit] Fix for multi build.
+
+ * src/autofit/afmodule.h: Include FT_INTERNAL_OBJECTS_H to use
+ FT_DECLARE_MODULE() macro in multi build.
+
+ * src/autofit/aflatin.c: Include to handle
+ FT_ADVANCES_H correctly in multi build.
+
+2009-09-24 suzuki toshiya
+
+ [cache] Check the face filled by FTC_Manager_LookupFace().
+
+ * src/cache/ftcbasic.c (ftc_basic_family_get_count): Return
+ immediately if FTC_Manager_LookupFace() fills face by NULL. Such
+ case can occur when the code is optimized by GCC-4.2.x.
+
+2009-09-23 Werner Lemberg
+
+ * docs/CHANGES: Updated.
+
+2009-09-12 Werner Lemberg
+
+ [raster] Fix 5-levels grayscale output.
+ This was broken since version 2.3.0.
+
+ * src/raster/ftraster.c (count_table): Use pre-2.3.0 values (which
+ were then computed dynamically).
+ (Vertical_Gray_Sweep_Step): Updated.
+
+ (ft_black_render): Initialize `worker->gray_lines' (problem found by
+ valgrind).
+
+ (FT_RASTER_OPTION_ANTI_ALIASING, DEBUG_RASTER): Dont' #undef, just
+ comment out.
+
+2009-09-12 suzuki toshiya
+
+ Improve configure.raw for cross build.
+
+ * builds/unix/configure.raw: Remove temporal files created by the
+ suffix checking for CC_BUILD. Set XX_ANSIFLAGS and XX_CFLAGS when
+ cross compiler is GCC. AC_PROG_CC checks whether the cross compiler
+ is GCC, its result is stored in GCC.
+
+2009-09-12 suzuki toshiya
+
+ [BDF] Modify hash API to take size_t value instead of void *.
+
+ The hash API in BDF driver is designed to be generic, it takes
+ void * typed data. But BDF driver always gives an unsigned long
+ integer (the index to a property). To reduce non-essential
+ casts from unsigned long to void* and from void* to unsigned
+ long, the hash API is changed to take size_t integer.
+ The issue of incompatible cast between unsigned long and void*
+ on LLP64 platform is reported by NightStrike from MinGW-Win64
+ project. See
+ http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html
+
+ * src/bdf/bdf.h: The type of hashnode->data is changed from
+ void* to size_t.
+
+ * src/bdf/bdflib.c (hash_insert): Get size_t data, instead of
+ void* data.
+ (bdf_create_property): Get the name length of new property by
+ size_t variable, with a cut-off at FT_ULONG_MAX.
+ (_bdf_set_default_spacing): Get the name length of the face by
+ size_t variable, with a cut-off at 256.
+ (bdf_get_property): Get the property id by size_t variable to
+ reduce the casts between 32-bit prop ID & hashnode->data during
+ simple copying.
+ (_bdf_add_property): Ditto.
+ (_bdf_parse_start): Calculate the index to the property array
+ by size_t variable.
+ (bdf_get_font_property): Drop a cast to unsigned long.
+
+2009-09-10 suzuki toshiya
+
+ [Win64] Improve the computation of random seed from stack address.
+
+ On LLP64 platform, the conversion from pointer to FT_Fixed need
+ to drop higher 32-bit. Explict casts are required. Reported by
+ NightStrike from MinGW-w64 project. See
+ http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html
+
+ * src/cff/cffgload.c: Convert the pointers to FT_Fixed explicitly.
+
+ * src/psaux/t1decode.c: Ditto.
+
+
+2009-09-03 Werner Lemberg
+
+ [raster] Improvements for stand-alone mode.
+
+ * src/raster/rules.mk: Don't handle ftmisc.h. It is needed for
+ stand-alone mode only.
+
+ * src/raster/ftmisc.h (FT_MemoryRec , FT_Alloc_Func, FT_Free_Func,
+ FT_Realloc_Func): Copy declarations from ftsystem.h.
+
+2009-09-02 Bram Tassyns
+
+ Improve vertical metrics calculation (Savannah bug #27364).
+
+ The calculation of `vertBearingX' is not defined in the OTF font
+ spec so FreeType does a `best effort' attempt. However, this value
+ is defined in the PDF and PostScript specs, and that algorithm is
+ better than the one FreeType currently uses:
+
+ FreeType: Use the middle of the bounding box as the X coordinate
+ of the vertical origin.
+
+ Adobe PDF spec: Use the middle of the horizontal advance vector as
+ the X coordinate of the vertical origin.
+
+ FreeType's algorithm goes wrong if you have a really small glyph
+ (like the full-width, circle-like dot at the end of the sentence, as
+ used in CJK scripts) with large bearings. With the FreeType
+ algorithm this dot gets centered on the baseline; with the PDF
+ algorithm it gets the correct location (in the top right). Note
+ that this is a serious issue, it's like printing the dot at the end
+ of a Roman sentence at the center of the textline instead of on the
+ baseline like it should. So i believe the PDF spec's algorithm
+ should be used in FreeType as well.
+
+ The `vertBearingY' value for such small glyphs is also very strange
+ if no `vmtx' information is present, since the height of the bbox is
+ not representable for the height of the glyph visually (the
+ whitespace up to the baseline is part of the glyph). The fix also
+ includes some code for a better estimate of `vertBearingY'.
+
+ * src/base/ftobjs.c (ft_synthesize_vertical_metrics): `vertBearingX'
+ is now calculated as described by the Adobe PDF Spec. Estimate for
+ `vertBearingY' now works better for small glyphs completely above or
+ below the baseline into account.
+
+ * src/cff/cffgload.c (cff_slot_load): `vertBearingX' is now
+ calculated as described by the Adobe PDF Spec. Vertical metrics
+ information was always ignored when FT_CONFIG_OPTION_OLD_INTERNALS
+ was not defined.
+
+ * src/truetype/ttgload.c (compute_glyph_metrics): `vertBearingX' is
+ now calculated as described by the Adobe PDF Spec.
+
+2009-09-01 John Tytgat
+
+ Fix custom cmap for empty Type 1 font (Savannah bug #27294).
+
+ * include/freetype/internal/t1types.h (T1_EncodingRecRec_): Update
+ comment to reflect revised code_last meaning.
+ * src/type1/t1load.c (T1_Open_Face), src/type42/t42objs.c
+ (T42_Open_Face): Assign max_char as highest character code + 1 and
+ use this for T1_EncodingRecRec_::code_last.
+ * src/psaux/t1cmap.c (t1_cmap_custom_init): Follow revised
+ T1_EncodingRecRec_::code_last meaning.
+
+2009-08-25 Werner Lemberg
+
+ Fix rendering of horizontally compressed CFFs.
+ Bug reported by Ivan Nincic .
+
+ * src/cff/cffgload.c (cff_slot_load): Thinko: Check `xx' element of
+ `font_matrix' also.
+
+ * docs/CHANGES: Updated.
+
+2009-08-03 suyu0925@gmail.com
+
+ Don't call `ft_fseek' every time when executing `ft_fread'.
+
+ * src/base/ftstream.c (FT_Stream_Seek), src/base/ftsystem.c
+ (ft_ansi_stream_io): Implement it.
+
+2009-07-31 suzuki toshiya
+
+ sfnt: Cast a charcode to 32-bit in cmap format 14 parser.
+
+ * src/sfnt/ttcmap.c (tt_cmap14_char_var_index,
+ tt_cmap14_char_var_isdefault, tt_cmap14_char_variants,
+ tt_cmap14_variant_chars): Correct mismatches from
+ FT_CMap_CharVarIndexFunc prototype, FT_ULong arguments
+ are replaced by FT_UInt32 arguments.
+
+2009-07-31 suzuki toshiya
+
+ sfnt: Cast a charcode to 32-bit in cmap format 12 parser.
+
+ * src/sfnt/ttcmap.c (tt_cmap12_char_next):
+ Insert explicit cast from FT_UFast to FT_UInt32
+ for return value.
+
+2009-07-31 suzuki toshiya
+
+ psaux: Fix a few casts to FT_Int32 value.
+
+ * src/psaux/t1decode.c (t1_decoder_parse_charstrings):
+ Fix a few casts setting `value' from FT_Long to FT_Int32,
+ because `value' is typed as FT_Int32 since 2009-06-22.
+
+2009-07-31 suzuki toshiya
+
+ sfnt: Fix a data type mismatching with its source.
+
+ * src/sfnt/ttcmap.c (tt_cmap13_char_next): Fix the
+ type of `gindex' from FT_ULong to FT_UInt because
+ it is set by FT_UInt tt_cmap13_char_map_binary() or
+ TT_CMap13->cur_gindex.
+
+2009-07-31 suzuki toshiya
+
+ sfnt: Extend a few local variables to load 32-bit values.
+
+ * src/sfnt/ttkern.c (tt_face_load_kern): Extend `count'
+ and `kern' to load 32-bit values.
+
+2009-07-31 suzuki toshiya
+
+ pfr: Extend `num_aux' to take 32-bit value.
+
+ * src/pfr/pfrload.c (pfr_phy_font_load): Extend
+ `num_aux' to load 32-bit value.
+
+2009-07-31 suzuki toshiya
+
+ pcf: Truncate FT_ULong `nprops' to fit to int PCF_Face->nprops.
+
+ * src/pcf/pcfread.c (pcf_get_properties): Load `nprops'
+ as FT_ULong value from PCF file, but truncate it as
+ int to fit PCF_Face->nprops. The number of truncated
+ properties is shown in the trace message.
+
+2009-07-31 suzuki toshiya
+
+ gxvalid: Extend a few local variables to reduce the casts.
+
+ * src/gxvalid/gxvmorx.c (gxv_morx_subtables_validate):
+ Extend `type' and `rest' to take FT_ULong values.
+
+2009-07-31 suzuki toshiya
+
+ gxvalid: Extend `settingTable' to take 32-bit offset.
+
+ * src/gxvalid/gxvfeat.c (gxv_feat_name_validate):
+ Extend `settingTable' to take 32-bit offset.
+
+2009-07-31 suzuki toshiya
+
+ autofit: Cast FT_Long glyph_count to compare with FT_UInt GID.
+
+ * src/autofit/afglobal.c (af_face_globals_is_digit,
+ af_face_globals_compute_script_coverage): Cast FT_Long
+ globals->glyph_count to FT_ULong, to compare with FT_UInt
+ gindex.
+
+2009-07-31 suzuki toshiya
+
+ smooth: Exclude 16-bit system in invalid pitch/height check.
+
+ * src/smooth/ftsmooth.c (ft_smooth_render_generic):
+ pitch and height are typed as FT_UInt but checked to fit
+ 16-bit range, to avoid the overflows. On 16-bit system,
+ this checking inserts a conditional that never occurs.
+
+2009-07-03 suzuki toshiya
+
+ cff: Type large constants > 0x7FFF as long for 16-bit systems.
+
+ * src/cff/cffload.c (cff_charset_load): Type large
+ constants > 0x7FFF as long, because normal constants
+ are typed signed integer that is less than 0x8000 on
+ 16-bit systems.
+
+2009-07-31 suzuki toshiya
+
+ base: Remove an unused variable.
+
+ * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Remove an
+ unused variable `library'. glyph->library is used.
+
+2009-07-31 suzuki toshiya
+
+ cache: Check higher bits in flags for non ILP32 systems.
+
+ 4 public functions ought to take FT_ULong flags, but take
+ FT_UInt flags. To keep binary compatibility, we drop higher
+ bits on non ILP32 platforms,
+ ILP64 systems: No drop occurs.
+ LP64 systems: Higher bits are not used.
+ 16-bit systems: Drop can occur.
+ See
+ http://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00065.html
+ These functions will be refined to take FT_ULong flags in
+ next bump with incompatible API change.
+
+ * src/cache/ftcbasic.c (FTC_ImageCache_Lookup):
+ Check `flags' in `type', the 2nd argument.
+ (FTC_SBitCache_Lookup): Ditto.
+ (FTC_ImageCache_LookupScaler): Check `load_flags',
+ the 3rd argument.
+ (FTC_SBitCache_LookupScaler): Ditto.
+
+2009-07-31 suzuki toshiya
+
+ sfnt: Ignore invalid GIDs in glyph name lookup.
+
+ * include/freetype/internal/fttrace.h:
+ New trace module for sfdriver.c is added.
+
+ * src/sfnt/sfdriver.c (sfnt_get_name_index):
+ Restrict glyph name lookup to FT_UInt GID.
+ Genuine TrueType can hold 16-bit glyphs.
+
+2009-07-31 suzuki toshiya
+
+ pcf: Fix a comparison between FT_Long and FT_ULong.
+
+ * src/pcf/pcfread.c (pcf_get_bitmaps): Return an error
+ if PCF_Face->nemetrics is negative.
+
+2009-07-31 suzuki toshiya
+
+ gxvalid: Guarantee `nFeatureFlags' size up to 32-bit.
+
+ * src/gxvalid/gxvmort.c (gxv_mort_featurearray_validate):
+ Extend the 3rd argument `nFeatureFlags' to FT_ULong.
+ * src/gxvalid/gxvmort.h: Ditto.
+
+2009-07-31 suzuki toshiya
+
+ sfnt: Insert explicit cast for LP64 system.
+
+ * src/sfnt/ttkern.c (tt_face_load_kern): Insert
+ cast from unsigned long to FT_UInt32.
+
+2009-07-31 suzuki toshiya
+
+ gxvalid: Guarantee `just' table size upto 32-bit.
+
+ * src/gxvalid/gxvjust.c (gxv_just_validate):
+ The type of `offset' is changed from FT_UInt to
+ FT_Offset, for 16-bit platforms.
+
+2009-07-31 suzuki toshiya
+
+ gxvalid: Guarantee `trak' table size upto 32-bit.
+
+ * src/gxvalid/gxvtrak.c (gxv_trak_validate):
+ The type of `offset' is changed from FT_UInt to
+ FT_Offset, for 16-bit platforms.
+
+2009-07-31 suzuki toshiya
+
+ type1: Fix a data type mismatching with its source.
+
+ * include/freetype/internal/t1types.h: The type of
+ T1_Face->buildchar is matched with T1_Decorder->top.
+
+2009-07-31 suzuki toshiya
+
+ pfr: Fix a data type mismatching with its source.
+
+ * src/pfr/pfrtypes.h: The type of PFR_KernItem->offset
+ is extended from FT_UInt32 to FT_Offset, because it is
+ calculated with the pointer difference, in
+ pfr_extra_item_load_kerning_pairs().
+
+2009-07-31 suzuki toshiya
+
+ pfr: Fix a data type mismatching with its source.
+
+ * src/pfr/pfrtypes.h: The type of PFR_PhysFont->chars_offset
+ is extended from FT_UInt32 to FT_Offset, because it is
+ calculated with the pointer difference in pfr_phy_font_load().
+
+2009-07-31 suzuki toshiya
+
+ pfr: Fix a data type mismatching with its source.
+
+ * src/pfr/pfrtypes.h: The type of PFR_PhyFont->bct_offset
+ is extended from FT_UInt32 to FT_Long, because it is
+ loaded by FT_STREAM_POS() in pfr_phy_font_load().
+
+2009-07-31 suzuki toshiya
+
+ smooth: Improve the format in debug message.
+
+ * src/smooth/ftgrays.c (gray_dump_cells): Improve the
+ format specifications to dump variables.
+
+2009-07-31 suzuki toshiya
+
+ sfnt: Fix a data type mismatching with its source.
+
+ * src/sfnt/sfobjs.c (sfnt_load_face): The type of
+ local `flags' is matched with FT_Face->face_flags.
+
+2009-07-31 suzuki toshiya
+
+ psaux: Fix a data type mismatching with its source.
+
+ * include/freetype/internal/psaux.h: The type of
+ T1_DecorderRec.buildchar is matched with
+ T1_DecorderRec.top.
+
+2009-07-31 suzuki toshiya
+
+ truetype: Extend TrueType GX packed deltas to FT_Offset.
+
+ * src/truetype/ttgxvar.c (ft_var_readpackeddeltas):
+ The type of 2nd argument `delta_cnt' is changed from
+ FT_Int to FT_Offset, because its source can be cvt
+ table size calculated from stream position.
+
+2009-07-31 suzuki toshiya
+
+ truetype: Extend mmvar_len to hold size_t values.
+
+ * src/truetype/ttgxvar.h: The type of
+ GX_BlendRec.mmvar_len is changed from FT_Int to
+ FT_Offset, because TT_Get_MM_Var() calculates it
+ by sizeof() results.
+
+2009-07-31 suzuki toshiya
+
+ truetype: Check invalid function number in IDEF instruction.
+
+ * src/truetype/ttinterp.c (Ins_IDEF): Check
+ if the operand fits to 8-bit opcode limitation.
+
+2009-07-31 suzuki toshiya
+
+ truetype: Check invalid function number in FDEF instruction.
+
+ * src/truetype/ttinterp.c (Ins_FDEF): Check
+ if the operand fits 16-bit function number.
+
+2009-07-31 suzuki toshiya
+
+ truetype: Truncate the deltas of composite glyph at 16-bit values.
+
+ * src/truetype/ttgload.c (load_truetype_glyph):
+ Insert cast from FT_Long (deltas[i].{x,y}) to
+ FT_Int16 in the summation of deltas[] for composite
+ glyphs. Because deltas[i] is typed as FT_Pos,
+ its component x, y are typed as FT_Long, but
+ their sources are always FT_Int16 when they are
+ loaded by ft_var_readpackeddeltas(). However,
+ the limitation about the summed deltas is unclear.
+
+2009-07-31 suzuki toshiya
+
+ truetype: Truncate the instructions upto 16-bit per a glyph.
+
+ * src/truetype/ttgload.c (TT_Hint_Glyph): Truncate
+ the instructions upto 16-bit length per a glyph.
+
+2009-07-31 suzuki toshiya
+
+ truetype: Cast the numerical operands to 32-bit for LP64 systems.
+
+ * src/truetype/ttinterp.c (Ins_SPHIX, INS_MIAP,
+ Ins_MIRP): Insert cast from long (args[], the
+ operands passed to TrueType operator) to FT_Int32
+ (the argument of TT_MulFix14()).
+
+2009-07-31 suzuki toshiya
+
+ truetype: Cast the project vector to 32-bit for LP64 system.
+
+ * src/truetype/ttinterp.c (Project, DualProject):
+ Insert casts from FT_Pos (the arguments `dx', `dy')
+ to FT_UInt32 (the argument to TT_DotFix14()).
+
+2009-07-31 suzuki toshiya
+
+ truetype: Cast the scaling params to 32-bit for LP64 system.
+
+ * src/truetype/ttgload.c (TT_Process_Composite_Component):
+ Insert casts from long (return value of FT_MulFix()) to
+ FT_Int32 (the argument to FT_SqrtFixed()).
+
+2009-07-31 suzuki toshiya
+
+ sfnt: Cast a character code to FT_UInt32 for LP64 system.
+
+ * src/sfnt/ttcmap.c (tt_cmap14_char_map_nondef_binary,
+ tt_cmap14_variants, tt_cmap14_char_variants,
+ tt_cmap14_def_char_count, tt_cmap14_get_def_chars,
+ tt_cmap14_get_nondef_chars, tt_cmap14_variant_chars)
+ Insert casts when FT_UInt32 variable is loaded by
+ TT_NEXT_{UINT24|ULONG}. Because most of them are
+ compared with FT_UInt32 values in public API, replacing
+ FT_UFast is not recommended.
+
+2009-07-31 suzuki toshiya
+
+ sfnt: Cast a character code to FT_UInt32 for LP64 system.
+
+ * src/sfnt/ttcmap.c (tt_cmap4_init, tt_cmap4_next):
+ Insert the casts from unsigned long constant to
+ FT_UInt32.
+
+2009-07-31 suzuki toshiya
+
+ sfnt: Extend TT_BDF->strings_size to FT_ULong for huge BDF.
+
+ * include/freetype/internal/tttypes.h: The type
+ of TT_BDF->string_size is extended from FT_UInt32
+ to FT_ULong, because BDF specification does not
+ restrict the length of string.
+ * src/sfnt/ttbdf.c: The scratch variable `strings'
+ to load TT_BDF->string_size is matched with
+ TT_BDF->string_size.
+
+2009-07-31 suzuki toshiya
+
+ psaux: Handle the string length by FT_Offset variables.
+
+ * src/psaux/afmparse.c (afm_parser_next_key,
+ afm_tokenize, afm_parse_track_kern,
+ afm_parse_kern_pairs, afm_parse_kern_data,
+ afm_parser_skip_section, afm_parser_parse):
+ The length of key is handled by FT_Offset,
+ instead of FT_UInt. Although the length of
+ PostScript strings or name object is 16-bit,
+ AFM_STREAM_KEY_LEN() calculates the length
+ from the pointer difference.
+
+ * src/psaux/afmparse.h (afm_parser_next_key):
+ Ditto.
+
+2009-07-31 suzuki toshiya
+
+ pcf: Fix some data types mismatching with their sources.
+
+ * src/pcf/pcfread.c (pcf_get_bitmaps): The types
+ of `nbitmaps', `i', `sizebitmaps' are matched with
+ the type of area FT_Bitmap.pitch * FT_Bitmap.rows.
+
+2009-07-31 suzuki toshiya
+
+ pcf: Handle the string length by size_t variables.
+
+ * src/pcf/pcfread.c (pcf_interpret_style): The types
+ of nn, len, lengths[4] are changed to size_t, because
+ they are loaded by (or compared with) ft_strlen().
+
+ * src/pcf/pcfutil.c (BitOrderInvert, TwoByteSwap,
+ FourByteSwap): The type of the 2nd argument `nbytes'
+ is changed to size_t, for similarity with ANSI C
+ string functions.
+
+ * src/pcf/pcfdrivr.c (PCF_Glyph_Load): The type of
+ `bytes' is changed to FT_Offset, because it is passed
+ to FT_ALLOC(), via ft_glyphslot_alloc_bitmap(). At
+ least, using unsigned type is better.
+
+2009-07-31 suzuki toshiya
+
+ pcf: Fix some data types mismatching with their sources.
+
+ * src/pcf/pcfread.c (pcf_seek_to_table_type,
+ pcf_has_table_type): The type of 3rd argument
+ `ntables' is matched with PCF_Toc->count.
+
+2009-07-31 suzuki toshiya
+
+ otvalid: Truncate the glyph index to 16-bit.
+
+ * src/otvalid/otvalid.c (otv_validate): Checks
+ face->num_glyphs does not exceed 16-bit limit,
+ pass FT_UInt num_glyphs to backend functions
+ otv_{GPOS|GSUB|GDEF|JSTF|MATH}_validate().
+
+2009-07-31 suzuki toshiya
+
+ cache: Insert explict casts for LP64 systems.
+
+ * src/cache/ftcbasic.c (FTC_ImageCache_Lookup,
+ FTC_SBitCache_Lookup): The type of FTC_ImageType->width
+ is FT_Int, so the cast to unsigned larger type FT_ULong
+ is introduced for the comparisons with 0x10000L for
+ LP64 platform.
+
+2009-07-31 suzuki toshiya
+
+ cache: Fix some data types mismatching with their sources.
+
+ * src/cache/ftccache.h: The type of return value
+ by FTC_Node_WeightFunc function is changed to
+ FT_Offset. The type of FTC_CacheClass->cache_size
+ is changed to FT_Offset, too.
+
+ * src/cache/ftccback.h (ft_inode_weight,
+ ftc_snode_weight): Ditto.
+
+ * src/cache/ftccmap.c (ftc_cmap_node_weight): Ditto.
+
+ * src/cache/ftcimage.c (ftc_inode_weight,
+ FTC_INode_Weight): Ditto.
+
+ * src/cache/ftcsbits.c (ftc_snode_weight,
+ FTC_SNode_Weight): Ditto.
+
+ * src/cache/ftcmru.h: The type of
+ FTC_MruListClass->node_size is changed to FT_Offset,
+ because it is passed to FT_ALLOC() to specify the
+ size of buffer.
+
+2009-07-31 suzuki toshiya
+
+ XXX_cmap_encoding_char_next() return FT_UInt32 values.
+
+ * include/freetype/internal/services/svpscmap.h:
+ The size of the charcode value returned by
+ the function typed PS_Unicodes_CharNextFunc is
+ matched with its input charcode value.
+
+ * src/cff/cffmap.c (cff_cmap_encoding_char_next,
+ cff_cmap_unicode_char_next): Ditto.
+
+ * src/pfr/pfrmap.c (pfr_cmap_encoding_char_next):
+ Ditto.
+
+ * src/psaux/t1cmap.c (t1_cmap_std_char_next,
+ t1_cmap_custom_char_next, t1_cmap_unicode_char_next):
+ Ditto.
+
+ * src/psnames/psmodule.c (ps_unicodes_char_next):
+ Ditto.
+
+ * src/winfonts/winfnt.c (fnt_cmap_char_next):
+ Ditto.
+
+ * src/sfnt/ttcmap.c (tt_cmap0_char_next,
+ tt_cmap2_char_next, tt_cmap4_char_next,
+ tt_cmap6_char_next, tt_cmap10_char_next,
+ tt_cmap12_char_next, tt_cmap13_char_next): Ditto.
+ (tt_cmap14_char_variants): Handle base unicode
+ codepoint by FT_UInt32 variable to avoid overflow
+ on 16-bit platforms.
+ (tt_cmap14_ensure): The type of `num_results' is
+ extend to FT_UInt32, to cover unsigned 32-bit
+ `numVarSelectorRecords' in cmap14 table header.
+
+2009-07-31 suzuki toshiya
+
+ truetype: Extend TT_Face->num_locations for broken TTFs.
+
+ * include/freetype/internal/tttypes.h:
+ TT_Face->num_locations are extended from FT_UInt
+ to FT_ULong, to stand with broken huge loca table.
+ Some people insists there are broken TTF including
+ the glyphs over 16-bit limitation, in PRC market.
+ * src/truetype/ttpload.c (tt_face_load_loca):
+ Remove unrequired 16-bit truncation for FT_UInt
+ TT_Face->num_locations.
+
+2009-07-31 suzuki toshiya
+
+ smooth: Fix some data types mismatching with their sources.
+
+ * src/smooth/ftgrays.c: The type of `TCoord' is
+ matched to `TPos', because they are mixed in
+ gray_set_cell(). The type of TCell->x is extended
+ to `TPos', because gray_find_cell() sets it by
+ TWorker.ex. The type of TCell->cover is extended
+ to `TCoord', because gray_render_scanline() adds
+ TCoord value to it. The type of TWork.cover is matched
+ with TCell->cover. The types of
+ TWork.{max_cells,num_cells} are changed to FT_PtrDist,
+ because they are calculated from the memory addresses.
+ The type of TWork.ycount is changed to TPos, because
+ it is calculated from TPos variables.
+ (gray_find_cell): The type of `x' is matched with
+ its initial value ras.ex.
+ (gray_render_scanline): The types of `mod', `lift'
+ and `rem' are changed to TCoord, because their values
+ are set with explicit casts to TCoord. When ras.area
+ is updated by the differential values including
+ `delta', they are explicitly cast to TArea, because
+ the type of `delta' is not TArea but TCoord.
+ (gray_render_line): The type of `mod' is extended
+ from int to TCoord, because (TCoord)dy is added to mod.
+ (gray_hline): The argument `acount' is extended to
+ TCoord, to match with the parameters in the callers.
+
+2009-07-31 suzuki toshiya
+
+ cff: Fix some data types mismatching with their sources.
+
+ * src/cff/cffobjs.c (cff_face_init): The type of
+ `scaling' is matched with the scaling parameter
+ in FT_Matrix_Multiply_Scaled() and
+ FT_Vector_Transform_Scaled().
+
+ * src/cff/cffparse.c (cff_parse_real): The type of
+ `power_ten', `scaling', `exponent_add',
+ `integer_length', `fraction_length',
+ `new_fraction_length' and `shift' are matched with
+ the type of `exponent' to avoid unexpected truncation.
+ (cff_parse_fixed_scaled): The type of `scaling' is
+ matched with the `scaling' argument to
+ cff_parse_real().
+ (cff_parse_fixed_dynamic): Ditto.
+ (cff_parse_font_matrix): The type of `scaling' is
+ matched with the `scaling' argument to
+ cff_parse_dynamic().
+
+2009-07-31 suzuki toshiya
+
+ autofit: Fix some data types mismatching with their sources.
+
+ * src/autofit/afglobal.c: Correct the type of
+ AF_FaceGlobalsRec.glyph_count to match with
+ FT_Face->num_glyphs.
+ (af_face_globals_compute_script_coverage):
+ Insert explicit cast to compare
+ FT_Long AF_FaceGlobalsRec.glyph_count versus
+ FT_UInt gindex. The type of `nn' is changed
+ to scan glyph index upto AF_FaceGlobalsRec.glyph_count.
+ (af_face_globals_get_metrics): The type of `script_max'
+ is changed to cover size_t value. Insert explicit cast
+ to compare FT_Long AF_FaceGlobalsRec.glyph_count versus
+ FT_UInt gindex.
+
+ * src/autofit/afhints.c (af_axis_hints_new_segment):
+ Insert explicit cast to calculate `big_max' from
+ integer and size_t values.
+ (af_axis_hints_new_edge): Ditto.
+
+ * src/autofit/aflatin.c (af_latin_metrics_init_blues):
+ The type of `best_y' is matched to FT_Vector.y.
+ (af_latin_compute_stem_width): The type of `delta' is
+ matched to `dist' and `org_dist'.
+
+2009-07-31 suzuki toshiya
+
+ autofit: Count the size of the memory object by ptrdiff_t.
+
+ * src/autofit/afcjk.c (af_cjk_hint_edges): The
+ number of edges `n_edges' should be counted by
+ FT_PtrDist variable instead of FT_Int.
+
+ * src/autofit/aflatin.c (af_latin_hint_edges):
+ Ditto.
+
+ * src/autofit/aftypes.h: In AF_ScriptClassRec,
+ the size of metric `script_metrics_size' should
+ be counted by FT_Offset variable instead of FT_UInt.
+
+ * src/autofit/afhints.c
+ (af_glyph_hints_align_strong_points): The cursors
+ for the edges `min', `max', `mid' in the memory
+ buffer should be typed FT_PtrDist.
+
+2009-07-31 suzuki toshiya
+
+ autofit: Fix for unused variable `first'.
+
+ * src/autofit/afhints.c (af_glyph_hints_reload): Insert
+ FT_UNUSED() to hide the unused variable warning.
+
+2009-07-31 suzuki toshiya
+
+ Improve bitmap size or pixel variables for 16-bit systems.
+
+ * include/freetype/config/ftstdlib.h: Introduce
+ FT_INT_MIN, to use in signed integer overflow in
+ 16-bit and 64-bit platforms.
+
+ * include/freetype/internal/fttrace.h: Add a tracer
+ to ftsynth.c.
+
+ * src/base/ftbitmap.c (FT_Bitmap_Embolden): Check
+ invalid strength causing integer overflow on 16-bit
+ platform.
+
+ * src/base/ftcalc.c (ft_corner_orientation): Change
+ the internal calculation from FT_Int to FT_Long, to
+ avoid an overflow on 16-bit platforms. The caller of
+ this function should use only the sign of result,
+ so the cast to FT_Int is acceptable.
+
+ * src/base/ftsynth.c: Introduce a tracer for synth module.
+ (FT_GlyphSlot_Embolden): Check invalid strength causing
+ integer overflow on 16-bit platform.
+
+ * src/bdf/bdfdrivr.c (BDF_Face_Init): The glyph index
+ in FT2 API is typed as FT_UInt, although BDF driver
+ can handle unsigned long glyph index internally. To
+ avoid integer overflow on 16-bit platform, too large
+ glyph index should be excluded.
+ (BDF_Glyph_Load): The glyph pitch in FT2 is typed as
+ FT_UInt, although BDF driver can handle unsigned long
+ glyph pitch internally. To avoid integer overflow on
+ 16-bit platform, too large glyph pitch should not be
+ returned.
+
+ * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): The glyph
+ pitch in FT2 is typed as FT_UInt, although PFR font
+ format can include huge bitmap glyph with 24-bit pitch
+ (however, a glyph spends 16.7 pixel, it's not realistic).
+ To avoid integer overflow on 16-bit platform, huge
+ bitmap glyph should be excluded.
+
+ * src/smooth/ftgrays.c (gray_hline): As FT_Span.x is
+ truncated to fit its type (16-bit short), FT_Span.y
+ should be truncated to fit its type (FT_Int).
+
+ * src/cff/cffdrivr.c (cff_get_ros): CFF specification
+ defines the supplement in ROS as a real number.
+ Truncate it to fit public FT2 API.
+
+ * src/cff/cffparse.c (cff_parse_cid_ros): Warn the
+ supplement if it is truncated or rounded in cff_get_ros().
+
+ * src/cff/cfftypes.h: Change the type of internal variable
+ `supplement' from FT_Long to FT_ULong to fit the signedness
+ to the type in public API.
+
+2009-07-31 suzuki toshiya
+
+ psaux: Prevent invalid arguments to afm_parser_read_vals().
+
+ * src/psaux/afmparse.c (afm_parser_read_vals): Change
+ the type of `n' to prevent negative number how many
+ arguments should be parsed.
+
+ * src/psaux/afmparse.h (afm_parser_read_vals): Ditto.
+
+2009-07-31 suzuki toshiya
+
+ base: Prevent some overflows on LP64 systems.
+
+ * src/base/ftadvance.c (FT_Get_Advances): Cast the
+ unsigned long constant FT_LOAD_ADVANCE_ONLY to FT_UInt32
+ for LP64 platforms.
+
+ * src/base/ftcalc.c (FT_Sqrt32): All internal variables
+ are changed to FT_UInt32 from FT_ULong.
+ (FT_MulDiv): Insert casts to FT_Int32 for LP64 platforms.
+ This function is designed for 32-bit integer, although
+ their arguments and return value are FT_Long.
+
+ * src/base/ftobjs.c (FT_Get_Char_Index): Check `charcode'
+ is within unsigned 32-bit integer for LP64 platforms.
+ (FT_Face_GetCharVariantIndex): Check `charcode' and
+ `variantSelector' are within 32-bit integer for LP64
+ platforms.
+ (FT_Face_GetCharsOfVariant): Check `variantSelector' is
+ within unsigned 32-bit integer for LP64 platforms.
+
+ * src/base/fttrigon.c (ft_trig_downscale): The FT_Fixed
+ variable `val' and unsigned long constant FT_TRIG_SCALE
+ are cast to FT_UInt32, when calculates FT_UInt32.
+ (FT_Vector_Rotate): The long constant 1L is cast to
+ FT_Int32 to calculate FT_Int32 `half'.
+
+2009-07-31 suzuki toshiya
+
+ cff: Cast the long variables to 32-bit for LP64 systems.
+
+ * src/cff/cffdrivr.c (cff_get_advances): Insert
+ explicit cast to modify a 32-bit flag by unsigned
+ long constant.
+
+ * src/cff/cffobjs.c (cff_face_init): Ditto.
+
+ * src/cff/cffgload.c (cff_decoder_parse_charstrings):
+ Replace the casts to FT_Long by the casts to FT_Int32
+ for LP64 platforms.
+
+2009-07-31 suzuki toshiya
+
+ pcf: Improve PCF_PropertyRec.value names on LP64 platforms.
+
+ * src/pcf/pcf.h: In PCF_PropertyRec.value, the member
+ `integer' is replaced by `l', `cardinal' is replaced
+ by `ul', to fix the difference between the name and
+ the types on LP64 platforms.
+
+ * src/pcf/pcfdrivr.c (pcf_get_bdf_property): Reflect
+ PCF_PropertyRec.value change, with appropriate casts
+ to FT_Int32/FT_UInt32. Their destinations
+ BDF_PropertyRec.{integer|cardinal} are public and
+ explicitly defined as FT_Int32/FT_UInt32.
+
+ * src/pcf/pcfread.c (pcf_get_properties, pcf_load_font):
+ Reflect PCF_PropertyRec.value change.
+
+2009-07-31 suzuki toshiya
+
+ pcf: Fix some data types mismatching with their sources.
+
+ * src/pcf/pcfdrivr.c (pcf_cmap_char_index): The type of
+ `code' is matched to PCF_Encoding->enc.
+ (pcf_cmap_char_next): The type of `charcode' is matched
+ to PCF_Encoding->enc. When *acharcode is set by charcode,
+ an overflow is checked and cast to unsigned 32-bit
+ integer.
+
+2009-07-31 suzuki toshiya
+
+ bdf: Improve bdf_property_t.value names for LP64 platforms.
+
+ * src/bdf/bdf.h: In bdf_property_t.value, the member
+ `int32' is replaced by `l', `card32' is replaced by
+ `ul', to fix the difference between the name and the
+ types on LP64 platforms.
+
+ * src/bdf/bdfdrivr.c (BDF_Face_Init): Reflect
+ bdf_property_t.value change.
+ (bdf_get_bdf_property): Reflect bdf_property_t.value
+ change, with appropriate casts to FT_Int32/FT_UInt32.
+ Their destinations BDF_PropertyRec.{integer|cardinal}
+ are public and explicitly defined as FT_Int32/FT_UInt32.
+
+ * src/bdf/bdflib.c (_bdf_add_property): Reflect
+ bdf_property_t.value change.
+
+2009-07-31 suzuki toshiya
+
+ bdf: Fix some data types mismatching with their sources.
+
+ * src/bdf/bdrdrivr.c (bdf_cmap_char_index): The type
+ of `code' is matched with BDF_encoding_el->enc.
+ (bdf_cmap_char_next): The type of `charcode' is
+ matched with BDF_encoding_el->enc. When *acharcode
+ is set by charcode, an overflow is checked and
+ cast to unsigned 32-bit integer.
+
+2009-07-31 suzuki toshiya
+
+ autofit: Improve Unicode range definitions.
+
+ * src/autofit/aftypes.h (AF_UNIRANGE_REC): New macro
+ to declare a range by two unsigned 32-bit integer,
+ to avoid 64-bit range definition on LP64 platforms.
+
+ * src/autofit/aflatin.c (af_latin_uniranges): Ditto.
+
+ * src/autofit/aflatin2.c (af_latin2_uniranges): Ditto.
+
+ * src/autofit/afindic.c (af_indic_uniranges): Ditto.
+
+ * src/autofit/afcjk.c (af_cjk_uniranges): Declare
+ the ranges by AF_UNIRANGE_REC.
+
+2009-07-31 suzuki toshiya
+
+ smooth: Fix a data type mismatching with its source.
+
+ * src/smooth/ftgrays.c (gray_sweep): The type of
+ `area' is matched with the 3rd argument `area'
+ of gray_hline().
+
+2009-07-31 suzuki toshiya
+
+ smooth: Fix a data type mismatching with its source.
+
+ * src/smooth/ftgrays.c (gray_render_line): The type
+ of `area' is matched with TWorker.area.
+
+2009-07-31 suzuki toshiya
+
+ cache: Disable the legacy compatibility if 16-bit system.
+
+ * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Exclude
+ the legacy behaviour from 16-bit platform, because the
+ current hack cannot detect the caller uses this function
+ via legacy convension.
+ (FTC_SBitCache_Lookup): Ditto.
+
+2009-07-31 suzuki toshiya
+
+ cache: Check 32-bit glyph index on 16-bit systems.
+
+ * src/cache/ftcbasic.c (ftc_basic_family_get_count):
+ Check overflow caused by the face including large
+ number of glyphs > 64k.
+
+2009-07-31 suzuki toshiya
+
+ cache: Fix some data types mismatching with their sources.
+
+ * src/cache/ftccache.c (ftc_cache_resize): The types of
+ `p', `mask', `count' are matched with FTC_Cache->{p,mask}.
+ (FTC_Cache_Clear): The type of `old_index' is matched to
+ FTC_Cache->{p,mask}.
+
+ * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): The type
+ of `_idx' is matched with FTC_Cache->{p,mask}.
+
+2009-07-31 suzuki toshiya
+
+ cache: Fix some data types mismatching with their sources.
+
+ * src/cache/ftcsbits.c (ftc_snode_load): The types
+ of `xadvance' and `yadvance' are matched with
+ FT_GlyphSlot->advance.{x|y}.
+
+2009-07-31 suzuki toshiya
+
+ cache: Cast NULL to a required function type explicitly.
+
+ * src/cache/ftcmanag.c (FTC_Manager_RemoveFaceID):
+ Insert explicit cast from NULL to function type.
+
+2009-07-31 suzuki toshiya
+
+ fttypes.h: Cast FT_MAKE_TAG output to FT_Tag exlicitly.
+
+ * include/freetype/fttypes.h (FT_MAKE_TAG):
+ Cast the result to FT_Tag.
+
+2009-07-31 suzuki toshiya
+
+ psnames: Handle Unicode codepoints by FT_UInt32 variables.
+
+ * src/psnames/psmodule.c (BASE_GLYPH): Cast the result
+ to unsigned 32-bit integer for LP64 platform.
+ (ps_unicode_value): Return the value by unsigned 32-bit
+ integer instead of unsigned long.
+
+2009-07-31 suzuki toshiya
+
+ psaux: Use size_t variable to pass the buffer size.
+
+ * src/psaux/psaux.h (to_bytes): The type of `max_bytes'
+ (the argument to pass the buffer size) is changed to
+ size_t, to match with ANSI C string functions.
+
+ * src/psaux/psconv.h (PS_Conv_StringDecode,
+ PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Ditto.
+
+ * src/psaux/psconv.c (PS_Conv_StringDecode,
+ PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Ditto.
+
+ * src/psaux/psobjs.h (ps_parser_to_bytes): Ditto.
+
+ * src/psaux/psobjs.c (ps_parser_to_bytes): Ditto.
+
+2009-07-31 suzuki toshiya
+
+ type1: Use size_t variable to pass the string length.
+
+ * psaux.h: The type of `len' (the argument to pass
+ the buffer size to the function in AFM_ParserRec)
+ is changed to size_t, to match with ANSI C string
+ functions.
+
+ * t1afm.c (t1_get_index): Ditto.
+
+ * test_afm.c (dummy_get_index): Ditto.
+
+ * afmparse.c (afm_parser_read_vals): To call
+ AFM_ParserRec.get_index, the length of token
+ `len' is cast to size_t.
+
+2009-07-31 suzuki toshiya
+
+ cid: Fix some data types mismatching with their sources.
+
+ * src/cid/cidparse.c (cid_parser_new): The types of
+ `read_len' and `stream_len' are matched to
+ FT_Stream->size. Unrequired cast is removed.
+
+2009-07-31 suzuki toshiya
+
+ cff: Fix for unused variable `rest'.
+
+ * src/cff/cffparse.c (cff_parse_real): Insert
+ FT_UNUSED() to hide the unused variable warning.
+
+2009-07-31 suzuki toshiya
+
+ cff: Fix some data types mismatching with their sources.
+
+ * src/cff/cffgload.c (cff_slot_load): The types of
+ `top_upm' and `sub_upm' are matched with
+ CFF_FontRecDict->units_per_em.
+
+ * src/cff/cffobjs.c (cff_size_select): Ditto.
+ (cff_size_request): Ditto.
+
+2009-07-31 suzuki toshiya
+
+ bdf: Fix some data types mismatching with their sources.
+
+ * bdflib.c (_bdf_list_ensure): The type of `num_items'
+ is matched with _bdf_list_t.used. Also the types of
+ `oldsize', `newsize', `bigsize' are matched too.
+ (_bdf_readstream): `cursor' is used as an offset to
+ the pointer, it should be typed as FT_Offset. Also
+ the types of `bytes', `start', `end', `avail' are matched.
+
+ * bdfdrivr.c: The type of BDF_CMap->num_encodings is
+ matched with FT_CMap->clazz->size.
+ (bdf_cmap_char_index): The types of `min', `max', `mid'
+ are matched with BDF_CMap->num_encodings. The type of
+ `result' is matched with encoding->glyph.
+ (bdf_cmap_char_next): Ditto, the type of `code' is
+ matched with BDF_encoding_el.enc.
+ (bdf_interpret_style): The type of `lengths' is changed
+ to size_t, to take the value by ft_strlen(). Also the
+ types of `len', `nn', `mm' are matched.
+
+2009-07-31 suzuki toshiya
+
+ sfnt: Count the size of the memory object by ptrdiff_t.
+
+ * src/sfnt/ttbdf.c (tt_face_find_bdf_prop): The type of
+ `peroperty_len' is changed from FT_UInt to FT_Offset,
+ to match with size_t, which is appropriate type for the
+ object in the memory buffer.
+
+2009-07-31 suzuki toshiya
+
+ lzw: Count the size of the memory object by ptrdiff_t.
+
+ * src/lzw/ftzopen.h: The types of FT_LzwState->{buf_total,
+ stack_size} are changed from FT_UInt to FT_Offset, to match
+ with size_t, which is appropriate type for the object in
+ the memory buffer.
+
+ * src/lzw/ftzopen.c (ft_lzwstate_stack_grow): The types of
+ `old_size' and `new_size' are changed from FT_UInt to
+ FT_Offset, to match with size_t, which is appropriate type
+ for the object in the memory buffer.
+
+2009-07-31 suzuki toshiya
+
+ otvalid: Count the table size on memory by ptrdiff_t.
+
+ * src/otvalid/otvgpos.c (otv_ValueRecord_validate):
+ Change the type of table size from FT_UInt to
+ FT_PtrDist because it is calculated by the memory
+ addresses.
+
+2009-07-31 suzuki toshiya
+
+ otvalid: Prevent an overflow by GPOS/GSUB 32b-bit offset.
+
+ * src/otvalid/otvgpos.c (otv_ExtensionPos_validate):
+ Extend ExtensionOffset from FT_UInt to FT_ULong, to
+ cover 32-bit offset on 16-bit platform.
+
+ * src/otvalid/otvgsub.c (otv_ExtensionSubst_validate):
+ Ditto.
+
+2009-07-31 suzuki toshiya
+
+ ftobjs.c: Prevent an overflow in glyph index handling.
+
+ * src/base/ftobjs.c (FT_Face_GetCharsOfVariant):
+ Improve the cast in comparison to avoid the truncation.
+
+2009-07-31 suzuki toshiya
+
+ Improve the variable types in raccess_make_file_name().
+
+ * src/base/ftrfork.c (raccess_make_file_name):
+ Change the type of cursor variable `tmp' to const char*,
+ to prevent the unexpected modification of original pathname.
+ (raccess_make_file_name): Change the type of new_length
+ to size_t.
+
+2009-07-31 suzuki toshiya
+
+ ftpatent.c: Fix for unused variable `error'.
+
+ * src/base/ftpatent.c (_tt_check_patents_in_range):
+ Fix warning for unused variable `error'.
+
+2009-07-31 suzuki toshiya
+
+ type1: Check invalid string longer than PostScript limit.
+
+ * src/type1/t1afm.c (t1_get_index): Check invalid string
+ which exceeds the limit of PostScript string/name objects.
+
+2009-07-31 suzuki toshiya
+
+ gzip: Use FT2 zcalloc() & zfree() in ftgzip.c by default.
+
+ * src/gzip/ftgzip.c (zcalloc, zcfree): Disable all
+ zcalloc() & zfree() by zlib in zutil.c, those in
+ ftgzip.c by FT2 are enabled by default. To use
+ zlib zcalloc() & zfree(), define USE_ZLIB_ZCALLOC.
+ See discussion:
+ http://lists.gnu.org/archive/html/freetype-devel/2009-02/msg00000.html
+
+2009-07-31 suzuki toshiya
+
+ gzip: Distinguish PureC from TurboC on MSDOS.
+
+ * src/gzip/zutil.c (zcalloc, zcfree): Enable only for
+ MSDOS platform.
+
+2009-07-31 suzuki toshiya
+
+ gxvalid: Insert PureC pragma to allow unevaluated variables.
+
+ * builds/atari/ATARI.H: Insert PureC pragma not to
+ warn against set-but-unevaluated variable in gxvalid
+ module.
+
+2009-07-31 suzuki toshiya
+
+ gxvalid: Pass the union by the pointer instead of the value.
+
+ * src/gxvalid/gxvcommn.h:
+ - Declare new type `GXV_LookupValueCPtr'.
+ - Update the type of the 2nd argument to pass GXV_LookupValueDesc
+ data to the function prototyped as GXV_Lookup_Value_Validate_Func,
+ from GXV_LookupValueDesc to GXV_LookupValueCPtr.
+ - Likewise for the function prototyped as
+ GXV_Lookup_Fmt4_Transit_Func.
+
+ - Declare new type `GXV_StateTable_GlyphOffsetCPtr'.
+ - Update the type of the 3rd argument to pass
+ GXV_StateTable_GlyphOffsetDesc data to the function prototyped
+ as GXV_StateTable_Entry_Validate_Func, from
+ GXV_StateTable_GlyphOffsetDesc to GXV_StateTable_GlyphOffsetCPtr.
+
+ - Declare new type `GXV_XStateTable_GlyphOffsetCPtr'.
+ - Update the type of the 3rd argument to pass
+ GXV_XStateTable_GlyphOffsetDesc data to the function prototyped
+ as GXV_XStateTable_Entry_Validate_Func,
+ from GXV_XStateTable_GlyphOffsetDesc
+ to GXV_XStateTable_GlyphOffsetCPtr.
+
+ * src/gxvalid/gxvcommn.c (gxv_LookupTable_fmt0_validate,
+ gxv_XClassTable_lookupval_validate,
+ gxv_XClassTable_lookupfmt4_transit):
+ Update from GXV_LookupValueDesc to GXV_LookupValueCPtr.
+
+ * src/gxvalid/gxvbsln.c (gxv_bsln_LookupValue_validate,
+ gxv_bsln_LookupFmt4_transit): Ditto.
+
+ * src/gxvalid/gxvjust.c
+ (gxv_just_pcTable_LookupValue_entry_validate,
+ gxv_just_classTable_entry_validate,
+ gxv_just_wdcTable_LookupValue_validate): Ditto.
+
+ * src/gxvalid/gxvkern.c
+ (gxv_kern_subtable_fmt1_entry_validate): Ditto.
+
+ * src/gxvalid/gxvlcar.c (gxv_lcar_LookupValue_validate,
+ gxv_lcar_LookupFmt4_transit): Ditto.
+
+ * src/gxvalid/gxvopbd.c (gxv_opbd_LookupValue_validate,
+ gxv_opbd_LookupFmt4_transit): Ditto.
+
+ * src/gxvalid/gxvprop.c (gxv_prop_LookupValue_validate,
+ gxv_prop_LookupFmt4_transit): Ditto.
+
+ * src/gxvalid/gxvmort4.c
+ (gxv_mort_subtable_type4_lookupval_validate): Ditto.
+
+ * src/gxvalid/gxvmort0.c
+ (gxv_mort_subtable_type0_entry_validate): Update
+ from GXV_StateTable_GlyphOffsetDesc
+ to GXV_StateTable_GlyphOffsetCPtr.
+
+ * src/gxvalid/gxvmort1.c
+ (gxv_mort_subtable_type1_entry_validate): Ditto.
+
+ * src/gxvalid/gxvmort2.c
+ (gxv_mort_subtable_type2_entry_validate): Ditto.
+
+ * src/gxvalid/gxvmort5.c
+ (gxv_mort_subtable_type5_entry_validate): Ditto.
+
+ * src/gxvalid/gxvmorx2.c
+ (gxv_morx_subtable_type2_entry_validate): Ditto.
+
+ * src/gxvalid/gxvmorx5.c
+ (gxv_morx_subtable_type5_entry_validate): Ditto.
+
+ * src/gxvalid/gxvmorx1.c
+ (gxv_morx_subtable_type1_entry_validate): Ditto.
+ (gxv_morx_subtable_type1_LookupValue_validate,
+ gxv_morx_subtable_type1_LookupFmt4_transit):
+ Update from GXV_LookupValueDesc to GXV_LookupValueCPtr.
+
+ * src/gxvalid/gxvmorx0.c
+ (gxv_morx_subtable_type0_entry_validate): Update
+ from GXV_XStateTable_GlyphOffsetDesc
+ to GXV_XStateTable_GlyphOffsetCPtr.
+
+2009-07-29 Fabrice Bellet
+
+ Fix Redhat bugzilla #513582 and Savannah bug #26849.
+
+ * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP) : Fix
+ aliasing bug.
+
+2009-07-19 Werner Lemberg
+
+ Document recent library changes.
+
+ * docs/CHANGES: Do it.
+
+2009-07-17 Werner Lemberg
+
+ Fix Savannah bug #23786.
+
+ * src/truetype/ttobjs.c (tt_size_init_bytecode): Don't reset x_ppem
+ and y_ppem. Otherwise the `*_CVT_Stretched' functions in ttinterp.c
+ get never called.
+ An anonymous guy suggested this change on Savannah, and it seems to
+ be the right solution.
+
+2009-07-15 Werner Lemberg
+
+ * docs/release: Updated.
+
+2009-07-15 Werner Lemberg
+
+ README.CVS -> README.git
+
+ * README.CVS: Renamed to...
+ * README.git: This.
+ Updated.
+
+2009-07-15 suzuki toshiya
+
+ Borland C++ compiler patch proposed by Mirco Babin.
+ http://lists.gnu.org/archive/html/freetype/2009-07/msg00016.html.
+
+ * builds/exports.mk: Delete unused flags, CCexe_{CFLAGS,LDFLAGS}.
+ Fix APINAMES_C and APINAMES_EXE pathnames to reflect the platform
+ specific pathname syntax.
+ * builds/compiler/bcc.mk: Remove unused flag, CCexe_LDFLAGS.
+ Define TE = `-e' separately (bcc32 cannot specify the pathname of
+ binary executable by T = `-o').
+ Extend the large page size in linking freetype.lib.
+ Add extra CLEAN target to delete bcc specific temporary files.
+ * builds/compiler/bcc-dev.mk: Ditto.
+
+2009-07-14 Werner Lemberg
+
+ Fix Savannah bug #27026.
+
+ * builds/win32/vc2005/freetype.sln: Use correct version number.
+
+2009-07-12 suzuki toshiya
+
+ Add a script to check the undefined and unused trace macros.
+
+ * src/tools/chktrcmp.py: A script to check trace_XXXX macros
+ that are used in C source but undefined in fttrace.h, or
+ defined in fttrace.h but unused in C sources. See
+ http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html.
+ * docs/DEBUG: Mention on chktrcmp.py.
+ * docs/release: Ditto.
+
+2009-07-09 Werner Lemberg
+
+ [ftraster] Make it compile again with -D_STANDALONE_.
+
+ * src/raster/ftraster.c [_STANDALONE_]: Define
+ FT_CONFIG_STANDARD_LIBRARY_H.
+ Include `string.h'.
+ Don't include `rastpic.h'.
+ Define FT_DEFINE_RASTER_FUNCS.
+
+2009-07-09 suzuki toshiya
+
+ smooth: Check glyph size by width/height, instead of pitch/height.
+ Suggested by der Mouse .
+
+ * src/smooth/ftsmooth.c (ft_smooth_render_generic): Improve
+ the check for too large glyph. Replace the pair of `pitch' and
+ `height' by the pair of `width' and `height'. `pitch' cannot
+ be greater than `height'. The required is checking the product
+ `pitch' * `height' <= FT_ULONG_MAX, but we use cheap checks for
+ the realistic case only.
+
+2009-07-09 suzuki toshiya
+
+ Register 2 missing trace components, t1afm and ttbdf.
+
+ * include/freetype/internal/fttrace.h: Add FT_TRACE_DEF( t1afm )
+ and FT_TRACE_DEF( ttbdf ). See
+ http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html
+
+2009-07-09 suzuki toshiya