Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
June 2018
- 68 participants
- 1149 messages
Re: [PATCH] gdi32/tests: Test writing to the default palette.
by Huw Davies
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
June 22, 2018
Re: [PATCH] winex11.drv: Move condition to the proper place.
by Huw Davies
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
June 22, 2018
Re: [PATCH 1/1] wsdapi/tests: Add tests for MatchProbeEx.
by Huw Davies
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
June 22, 2018
Re: [PATCH] gdi32: Add a workaround for A->W text output with Symbol font encoding.
by Huw Davies
On Fri, Jun 22, 2018 at 12:55:06PM +0800, Dmitry Timoshkov wrote:
> There are 2 ways to output Ansi text:
> 1. Call DrawTextA/ExtTextOutA, it uses font codepage for unicode translation.
> 2. hfont = CreateFont("Wingdings", SYMBOL_CHARSET);
> SendMessageA(hwnd, WM_SETFONT, hfont);
> SendMessageA(hwnd, WM_SETTEXT, textA);
> It uses current ANSI codepage for unicode translation.
>
> Currently #1 works correctly for Symbol fonts but #2 does not. This patch
> makes #2 work as well. Since this is a text drawing bug I don't see a way
> of adding a test case for this behaviour.
Looks good. I've sent in a new version with a re-worded commit
message that hopefully makes it clear that this isn't a work-around in
Wine, but a work-around in Windows. I also fixed a grammar issue in
an existing comment and took the opportunity to make the formatting
more consistent.
Huw.
June 22, 2018
Re: [PATCH] msvcp120: Add test for Concurrent_vector_Internal_compact.
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
June 22, 2018
[PATCH] gdi32: For symbol fonts check whether the char has been converted to Unicode.
by Huw Davies
From: Dmitry Timoshkov <dmitry(a)baikal.ru>
This means that Unicode versions of text functions can use the result
of a A->W conversion under CP_ACP.
It's required so that the following will work:
hfont = CreateFont("Wingdings", SYMBOL_CHARSET);
SendMessageA(hwnd, WM_SETFONT, hfont);
SendMessageA(hwnd, WM_SETTEXT, textA);
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/gdi32/freetype.c | 57 ++++++++++++++++++++++++++++++++++++---------------
1 file changed, 41 insertions(+), 16 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 1293e08a73..b7e2413753 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -6303,24 +6303,47 @@ static FT_UInt get_GSUB_vert_glyph(const GdiFont *font, UINT glyph)
return GSUB_apply_feature(header, feature, glyph);
}
+static FT_UInt get_glyph_index_symbol(const GdiFont *font, UINT glyph)
+{
+ FT_UInt ret;
+
+ if (glyph < 0x100) glyph += 0xf000;
+ /* there are a number of old pre-Unicode "broken" TTFs, which
+ do have symbols at U+00XX instead of U+f0XX */
+ if (!(ret = pFT_Get_Char_Index(font->ft_face, glyph)))
+ ret = pFT_Get_Char_Index(font->ft_face, glyph - 0xf000);
+
+ return ret;
+}
+
static FT_UInt get_glyph_index(const GdiFont *font, UINT glyph)
{
- FT_UInt glyphId;
+ FT_UInt ret;
+ WCHAR wc;
+ char buf;
- if(font->ft_face->charmap->encoding == FT_ENCODING_NONE) {
- WCHAR wc = (WCHAR)glyph;
+ if (font->ft_face->charmap->encoding == FT_ENCODING_NONE)
+ {
BOOL default_used;
BOOL *default_used_pointer;
- FT_UInt ret;
- char buf;
+
default_used_pointer = NULL;
default_used = FALSE;
if (codepage_sets_default_used(font->codepage))
default_used_pointer = &default_used;
- if(!WideCharToMultiByte(font->codepage, 0, &wc, 1, &buf, sizeof(buf), NULL, default_used_pointer) || default_used)
+ wc = (WCHAR)glyph;
+ if (!WideCharToMultiByte(font->codepage, 0, &wc, 1, &buf, sizeof(buf), NULL, default_used_pointer) ||
+ default_used)
{
- if (font->codepage == CP_SYMBOL && wc < 0x100)
- ret = pFT_Get_Char_Index(font->ft_face, (unsigned char)wc);
+ if (font->codepage == CP_SYMBOL)
+ {
+ ret = get_glyph_index_symbol(font, glyph);
+ if (!ret)
+ {
+ if (WideCharToMultiByte(CP_ACP, 0, &wc, 1, &buf, 1, NULL, NULL))
+ ret = get_glyph_index_symbol(font, buf);
+ }
+ }
else
ret = 0;
}
@@ -6330,17 +6353,19 @@ static FT_UInt get_glyph_index(const GdiFont *font, UINT glyph)
return ret;
}
- if(font->ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL)
+ if (font->ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL)
{
- if (glyph < 0x100) glyph += 0xf000;
- /* there is a number of old pre-Unicode "broken" TTFs, which
- do have symbols at U+00XX instead of U+f0XX */
- if (!(glyphId = pFT_Get_Char_Index(font->ft_face, glyph)))
- glyphId = pFT_Get_Char_Index(font->ft_face, glyph-0xf000);
+ ret = get_glyph_index_symbol(font, glyph);
+ if (!ret)
+ {
+ wc = (WCHAR)glyph;
+ if (WideCharToMultiByte(CP_ACP, 0, &wc, 1, &buf, 1, NULL, NULL))
+ ret = get_glyph_index_symbol(font, (unsigned char)buf);
+ }
+ return ret;
}
- else glyphId = pFT_Get_Char_Index(font->ft_face, glyph);
- return glyphId;
+ return pFT_Get_Char_Index(font->ft_face, glyph);
}
/* helper for freetype_GetGlyphIndices */
--
2.16.2
June 22, 2018
[PATCH] msvcp120: Add test for Concurrent_vector_Internal_compact.
by Hua Meng
Signed-off-by: Hua meng <161220092(a)smail.nju.edu.cn>
---
dlls/msvcp120/tests/msvcp120.c | 102 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 101 insertions(+), 1 deletion(-)
diff --git a/dlls/msvcp120/tests/msvcp120.c b/dlls/msvcp120/tests/msvcp120.c
index aec66fb259..0ec9fbd3b1 100644
--- a/dlls/msvcp120/tests/msvcp120.c
+++ b/dlls/msvcp120/tests/msvcp120.c
@@ -27,6 +27,11 @@
DWORD expect_idx;
static int vector_alloc_count;
static int vector_elem_count;
+typedef struct blocks_to_free{
+ size_t first_block;
+ void *blocks[sizeof(void*)*8];
+ int size_check;
+}compact_block;
#define DEFINE_EXPECT(func) \
BOOL expect_ ## func, called_ ## func
@@ -115,6 +120,8 @@ static void * (WINAPI *call_thiscall_func3)( void *func, void *this, const void
const void *b );
static void * (WINAPI *call_thiscall_func4)( void *func, void *this, const void *a,
const void *b, const void *c );
+static void * (WINAPI *call_thiscall_func5)( void *func, void *this, const void *a,
+ const void *b, const void *c, const void *d );
static void * (WINAPI *call_thiscall_func6)( void *func, void *this, const void *a,
const void *b, const void *c, const void *d, const void *e );
@@ -131,6 +138,7 @@ static void init_thiscall_thunk(void)
call_thiscall_func2 = (void *)thunk;
call_thiscall_func3 = (void *)thunk;
call_thiscall_func4 = (void *)thunk;
+ call_thiscall_func5 = (void *)thunk;
call_thiscall_func6 = (void *)thunk;
}
@@ -140,6 +148,8 @@ static void init_thiscall_thunk(void)
(const void*)(b))
#define call_func4(func,_this,a,b,c) call_thiscall_func4(func,_this,(const void*)(a),\
(const void*)(b),(const void*)(c))
+#define call_func5(func,_this,a,b,c,d) call_thiscall_func5(func,_this,(const void*)(a),\
+ (const void*)(b),(const void*)(c),(const void*)(d))
#define call_func6(func,_this,a,b,c,d,e) call_thiscall_func6(func,_this,(const void*)(a),\
(const void*)(b),(const void*)(c),(const void*)(d),(const void*)(e))
#else
@@ -149,6 +159,7 @@ static void init_thiscall_thunk(void)
#define call_func2(func,_this,a) func(_this,a)
#define call_func3(func,_this,a,b) func(_this,a,b)
#define call_func4(func,_this,a,b,c) func(_this,a,b,c)
+#define call_func5(func,_this,a,b,c,d) func(_this,a,b,c,d)
#define call_func6(func,_this,a,b,c,d,e) func(_this,a,b,c,d,e)
#endif /* __i386__ */
@@ -404,6 +415,9 @@ static void (__thiscall *p_vector_base_v4__Internal_assign)(
void (__cdecl*)(void*, const void*, size_t), void (__cdecl*)(void*, const void*, size_t));
static void (__thiscall *p_vector_base_v4__Internal_swap)(
vector_base_v4*, const vector_base_v4*);
+static void* (__thiscall *p_vector_base_v4__Internal_compact)(
+ vector_base_v4*, size_t, void*, void (__cdecl*)(void*, size_t),
+ void (__cdecl*)(void*, const void*, size_t));
static HMODULE msvcp;
#define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y)
@@ -552,6 +566,8 @@ static BOOL init(void)
"?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z");
SET(p_vector_base_v4__Internal_swap,
"?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z");
+ SET(p_vector_base_v4__Internal_compact,
+ "?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z");
} else {
SET(p_tr2_sys__File_size,
"?_File_size(a)sys@tr2(a)std@@YA_KPBD(a)Z");
@@ -669,6 +685,8 @@ static BOOL init(void)
"?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z");
SET(p_vector_base_v4__Internal_swap,
"?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z");
+ SET(p_vector_base_v4__Internal_compact,
+ "?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z");
#else
SET(p__Thrd_current,
"_Thrd_current");
@@ -714,6 +732,9 @@ static BOOL init(void)
"?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z");
SET(p_vector_base_v4__Internal_swap,
"?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z");
+ SET(p_vector_base_v4__Internal_compact,
+ "?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z");
+
#endif
}
SET(p__Thrd_equal,
@@ -2734,7 +2755,8 @@ static void test_vector_base_v4(void)
{
vector_base_v4 vector, v2;
size_t idx, size;
- int *data;
+ compact_block b;
+ int i, *data;
concurrent_vector_int_ctor(&vector);
@@ -2892,6 +2914,84 @@ static void test_vector_base_v4(void)
CHECK_CALLED(concurrent_vector_int_destroy);
concurrent_vector_int_dtor(&v2);
+ /* test for _Internal_compact */
+ concurrent_vector_int_ctor(&v2);
+ for(i=0; i<2; i++) {
+ SET_EXPECT(concurrent_vector_int_alloc);
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ vector_elem_count += 2;
+ }
+ ok(v2.first_block == 1, "v2.first_block got %ld expected 1\n", (long)v2.first_block);
+ ok(v2.early_size == 4, "v2.early_size got %ld expected 4\n", (long)v2.early_size);
+ memset(&b, 0xff, sizeof(b));
+ SET_EXPECT(concurrent_vector_int_alloc);
+ SET_EXPECT(concurrent_vector_int_copy);
+ SET_EXPECT(concurrent_vector_int_destroy);
+ data = call_func5(p_vector_base_v4__Internal_compact,
+ &v2, sizeof(int), &b, concurrent_vector_int_destroy,
+ concurrent_vector_int_copy);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ CHECK_CALLED(concurrent_vector_int_copy);
+ CHECK_CALLED(concurrent_vector_int_destroy);
+ ok(v2.first_block == 2, "v2.first_block got %ld expected 2\n", (long)v2.first_block);
+ ok(v2.early_size == 4,"v2.early_size got %ld expected 4\n", (long)v2.early_size);
+ ok(b.first_block == 1, "b.first_block got %ld expected 1\n", (long)b.first_block);
+ for(i=0; i<2; i++){
+ ok(b.blocks[i] != NULL, "b.blocks[%d] got NULL\n", i);
+ free(b.blocks[i]);
+ vector_alloc_count--;
+ }
+ for(; i<ARRAY_SIZE(b.blocks); i++)
+ ok(!b.blocks[i], "b.blocks[%d] != NULL\n", i);
+ ok(b.size_check == -1, "b.size_check = %x\n", b.size_check);
+
+ SET_EXPECT(concurrent_vector_int_alloc);
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ for(i=0; i<3; i++){
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ }
+ SET_EXPECT(concurrent_vector_int_alloc);
+ data = call_func3(p_vector_base_v4__Internal_push_back, &v2, sizeof(int), &idx);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ ok(data != NULL, "_Internal_push_back returned NULL\n");
+ vector_elem_count += 5;
+ ok(v2.first_block == 2, "v2.first_block got %ld expected 2\n", (long)v2.first_block);
+ ok(v2.early_size == 9, "v2.early_size got %ld expected 9\n", (long)v2.early_size);
+ memset(&b, 0xff, sizeof(b));
+ SET_EXPECT(concurrent_vector_int_alloc);
+ SET_EXPECT(concurrent_vector_int_copy);
+ SET_EXPECT(concurrent_vector_int_destroy);
+ data = call_func5(p_vector_base_v4__Internal_compact,
+ &v2, sizeof(int), &b, concurrent_vector_int_destroy,
+ concurrent_vector_int_copy);
+ CHECK_CALLED(concurrent_vector_int_alloc);
+ CHECK_CALLED(concurrent_vector_int_copy);
+ CHECK_CALLED(concurrent_vector_int_destroy);
+ ok(v2.first_block == 4, "v2.first_block got %ld expected 4\n", (long)v2.first_block);
+ ok(v2.early_size == 9, "v2.early_size got %ld expected 9\n", (long)v2.early_size);
+ ok(b.first_block == 2, "b.first_block got %ld expected 2\n", (long)b.first_block);
+ for(i=0; i<4; i++){
+ ok(b.blocks[i] != NULL, "b.blocks[%d] got NULL\n", i);
+ /* only b.blocks[0] and b.blocks[>=b.first_block] are used */
+ if(i == b.first_block-1) continue;
+ free(b.blocks[i]);
+ vector_alloc_count--;
+ }
+ for(; i<ARRAY_SIZE(b.blocks); i++)
+ ok(!b.blocks[i], "b.blocks[%d] != NULL\n", i);
+ SET_EXPECT(concurrent_vector_int_destroy);
+ size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
+ &v2, concurrent_vector_int_destroy);
+ CHECK_CALLED(concurrent_vector_int_destroy);
+ concurrent_vector_int_dtor(&v2);
+
SET_EXPECT(concurrent_vector_int_destroy);
size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
&vector, concurrent_vector_int_destroy);
--
2.11.0
June 22, 2018
Re: [PATCH] fonts: Add clock images to Wingdings font.
by Dmitry Timoshkov
Alexandre Julliard <julliard(a)winehq.org> wrote:
> > Glyphs were copied from the Android Emoji font.
>
> As far as I can tell, this Android font is under the SIL Open Font
> License, which is not LGPL-compatible.
I had an impression that this font is part of the Android codebase
which is under a BSD-like license.
Perhaps you have a suggestion for the font with a compatible license?
--
Dmitry.
June 22, 2018
Re: [PATCH] fonts: Add clock images to Wingdings font.
by Alexandre Julliard
Dmitry Timoshkov <dmitry(a)baikal.ru> writes:
> Glyphs were copied from the Android Emoji font.
As far as I can tell, this Android font is under the SIL Open Font
License, which is not LGPL-compatible.
--
Alexandre Julliard
julliard(a)winehq.org
June 22, 2018
Re: [PATCH 2/2] msi: Add support for re-caching package
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
June 22, 2018
Re: [PATCH 1/2] msi: Report error when cached installer has different version
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
June 22, 2018
Re: [PATCH] d2d1: Stop redefination on older compilers
by Alistair Leslie-Hughes
https://bugs.winehq.org/show_bug.cgi?id=44052
Comment #25
Regards
Alistair
________________________________
From: Henri Verbeet <hverbeet(a)gmail.com>
Sent: Friday, June 22, 2018 6:23:48 PM
To: Alistair Leslie-Hughes
Cc: wine-devel(a)winehq.org
Subject: Re: [PATCH] d2d1: Stop redefination on older compilers
On 22 June 2018 at 06:30, Alistair Leslie-Hughes
<leslie_alistair(a)hotmail.com> wrote:
> Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
> ---
> dlls/d2d1/d2d1_private.h | 3 ++-
> dlls/d2d1/tests/d2d1.c | 7 ++++---
> 2 files changed, 6 insertions(+), 4 deletions(-)
>
What are you trying to fix exactly?
June 22, 2018
[PATCH] fonts: Add clock images to Wingdings font.
by Dmitry Timoshkov
Glyphs were copied from the Android Emoji font.
wingding.ttf should be rebuilt in maintainer mode after applying this patch.
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
fonts/wingding.sfd | 1903 +++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 1900 insertions(+), 3 deletions(-)
diff --git a/fonts/wingding.sfd b/fonts/wingding.sfd
index c46152b077..940b1d686c 100644
--- a/fonts/wingding.sfd
+++ b/fonts/wingding.sfd
@@ -47,12 +47,12 @@ LangName: 1033 "" "" "" "" "" "" "" "" "" "" "" "http://www.winehq.org" "" "This
Encoding: Symbol
UnicodeInterp: none
NameList: Adobe Glyph List
-DisplaySize: -48
+DisplaySize: -72
AntiAlias: 1
FitToEm: 1
-WinInfo: 0 29 12
+WinInfo: 0 25 9
TeXData: 1 0 0 708670 354335 236222 1342177 -2147484 236222 783286 444596 497025 792723 393216 433062 380633 303038 157286 324010 404750 52429 2506097 1059062 262144
-BeginChars: 256 38
+BeginChars: 256 50
StartChar: f020
Encoding: 0 61472 0
@@ -788,5 +788,1902 @@ LayerCount: 2
Fore
Refer: 34 63724 N 0 1 -1 0 1653 -173 2
EndChar
+
+StartChar: bullet
+Encoding: 183 8226 38
+Width: 2048
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1024 1538 m 0,0,1
+ 1239 1538 1239 1538 1427 1430 c 128,-1,2
+ 1615 1322 1615 1322 1723 1133.5 c 128,-1,3
+ 1831 945 1831 945 1831 731 c 0,4,5
+ 1831 515 1831 515 1722 327.5 c 128,-1,6
+ 1613 140 1613 140 1425.5 32.5 c 128,-1,7
+ 1238 -75 1238 -75 1024 -75 c 0,8,9
+ 808 -75 808 -75 621 33 c 128,-1,10
+ 434 141 434 141 326 328 c 128,-1,11
+ 218 515 218 515 218 731 c 0,12,13
+ 218 945 218 945 325.5 1132.5 c 128,-1,14
+ 433 1320 433 1320 620.5 1429 c 128,-1,15
+ 808 1538 808 1538 1024 1538 c 0,0,1
+1024 3 m 0,16,17
+ 1220 3 1220 3 1389 101 c 128,-1,18
+ 1558 199 1558 199 1655.5 367.5 c 128,-1,19
+ 1753 536 1753 536 1753 731 c 0,20,21
+ 1753 927 1753 927 1655 1096 c 128,-1,22
+ 1557 1265 1557 1265 1388.5 1362.5 c 128,-1,23
+ 1220 1460 1220 1460 1024 1460 c 256,24,25
+ 828 1460 828 1460 659.5 1362 c 128,-1,26
+ 491 1264 491 1264 393.5 1095.5 c 128,-1,27
+ 296 927 296 927 296 731 c 256,28,29
+ 296 535 296 535 394 366.5 c 128,-1,30
+ 492 198 492 198 660.5 100.5 c 128,-1,31
+ 829 3 829 3 1024 3 c 0,16,17
+1285 1066 m 1,32,-1
+ 1129 796 l 1,33,34
+ 1148 766 1148 766 1148 731 c 0,35,36
+ 1148 680 1148 680 1112 644 c 128,-1,37
+ 1076 608 1076 608 1024 608 c 0,38,39
+ 973 608 973 608 937 644 c 128,-1,40
+ 901 680 901 680 901 731 c 0,41,42
+ 901 766 901 766 919 794.5 c 128,-1,43
+ 937 823 937 823 966 840 c 1,44,-1
+ 966 1396 l 1,45,-1
+ 1082 1396 l 1,46,-1
+ 1082 948 l 1,47,-1
+ 1184 1124 l 1,48,-1
+ 1285 1066 l 1,32,-1
+978 731 m 0,49,50
+ 978 716 978 716 990.5 700.5 c 128,-1,51
+ 1003 685 1003 685 1024 685 c 0,52,53
+ 1040 685 1040 685 1055.5 696.5 c 128,-1,54
+ 1071 708 1071 708 1071 731 c 0,55,56
+ 1071 751 1071 751 1057.5 764 c 128,-1,57
+ 1044 777 1044 777 1024 777 c 0,58,59
+ 1005 777 1005 777 991.5 764 c 128,-1,60
+ 978 751 978 751 978 731 c 0,49,50
+1654 777 m 0,61,62
+ 1674 777 1674 777 1687.5 764 c 128,-1,63
+ 1701 751 1701 751 1701 731 c 0,64,65
+ 1701 712 1701 712 1687.5 698.5 c 128,-1,66
+ 1674 685 1674 685 1654 685 c 0,67,68
+ 1635 685 1635 685 1621.5 698.5 c 128,-1,69
+ 1608 712 1608 712 1608 731 c 0,70,71
+ 1608 751 1608 751 1621.5 764 c 128,-1,72
+ 1635 777 1635 777 1654 777 c 0,61,62
+1570 1000 m 0,73,74
+ 1552 1000 1552 1000 1538 1013 c 128,-1,75
+ 1524 1026 1524 1026 1524 1046 c 0,76,77
+ 1524 1063 1524 1063 1536.5 1078 c 128,-1,78
+ 1549 1093 1549 1093 1569 1093 c 0,79,80
+ 1588 1093 1588 1093 1602 1080 c 128,-1,81
+ 1616 1067 1616 1067 1616 1047 c 0,82,83
+ 1616 1020 1616 1020 1594 1006 c 1,84,85
+ 1582 1000 1582 1000 1570 1000 c 0,73,74
+1386 1277 m 0,86,87
+ 1386 1256 1386 1256 1371.5 1243 c 128,-1,88
+ 1357 1230 1357 1230 1340 1230 c 0,89,90
+ 1319 1230 1319 1230 1306 1245 c 128,-1,91
+ 1293 1260 1293 1260 1293 1277 c 0,92,93
+ 1293 1297 1293 1297 1307.5 1310 c 128,-1,94
+ 1322 1323 1322 1323 1339 1323 c 0,95,96
+ 1358 1323 1358 1323 1372 1310 c 128,-1,97
+ 1386 1297 1386 1297 1386 1277 c 0,86,87
+709 1323 m 256,98,99
+ 727 1323 727 1323 741.5 1310.5 c 128,-1,100
+ 756 1298 756 1298 756 1277 c 0,101,102
+ 756 1259 756 1259 743 1244.5 c 128,-1,103
+ 730 1230 730 1230 709 1230 c 0,104,105
+ 692 1230 692 1230 677.5 1243 c 128,-1,106
+ 663 1256 663 1256 663 1277 c 0,107,108
+ 663 1297 663 1297 677 1310 c 128,-1,109
+ 691 1323 691 1323 709 1323 c 256,98,99
+525 1046 m 0,110,111
+ 525 1025 525 1025 510 1012.5 c 128,-1,112
+ 495 1000 495 1000 478 1000 c 0,113,114
+ 458 1000 458 1000 445 1014.5 c 128,-1,115
+ 432 1029 432 1029 432 1046 c 0,116,117
+ 432 1066 432 1066 446 1079.5 c 128,-1,118
+ 460 1093 460 1093 479 1093 c 256,119,120
+ 498 1093 498 1093 511.5 1079 c 128,-1,121
+ 525 1065 525 1065 525 1046 c 0,110,111
+394 777 m 256,122,123
+ 414 777 414 777 427.5 764 c 128,-1,124
+ 441 751 441 751 441 731 c 0,125,126
+ 441 712 441 712 427.5 698.5 c 128,-1,127
+ 414 685 414 685 394 685 c 256,128,129
+ 374 685 374 685 361 698.5 c 128,-1,130
+ 348 712 348 712 348 731 c 0,131,132
+ 348 751 348 751 361 764 c 128,-1,133
+ 374 777 374 777 394 777 c 256,122,123
+477 462 m 256,134,135
+ 496 462 496 462 510.5 449.5 c 128,-1,136
+ 525 437 525 437 525 416 c 0,137,138
+ 525 397 525 397 512 383.5 c 128,-1,139
+ 499 370 499 370 478 370 c 0,140,141
+ 460 370 460 370 446 383.5 c 128,-1,142
+ 432 397 432 397 432 417 c 256,143,144
+ 432 437 432 437 445 449.5 c 128,-1,145
+ 458 462 458 462 477 462 c 256,134,135
+756 185 m 0,146,147
+ 756 164 756 164 741.5 151.5 c 128,-1,148
+ 727 139 727 139 709 139 c 0,149,150
+ 689 139 689 139 676 153.5 c 128,-1,151
+ 663 168 663 168 663 185 c 0,152,153
+ 663 206 663 206 677.5 219 c 128,-1,154
+ 692 232 692 232 709 232 c 0,155,156
+ 721 232 721 232 733 226 c 1,157,158
+ 756 211 756 211 756 185 c 0,146,147
+1024 147 m 256,159,160
+ 1044 147 1044 147 1057.5 134 c 128,-1,161
+ 1071 121 1071 121 1071 101 c 256,162,163
+ 1071 81 1071 81 1057.5 67.5 c 128,-1,164
+ 1044 54 1044 54 1024 54 c 0,165,166
+ 1005 54 1005 54 991.5 67.5 c 128,-1,167
+ 978 81 978 81 978 101 c 256,168,169
+ 978 121 978 121 991 134 c 128,-1,170
+ 1004 147 1004 147 1024 147 c 256,159,160
+1339 232 m 0,171,172
+ 1357 232 1357 232 1371.5 219 c 128,-1,173
+ 1386 206 1386 206 1386 185 c 0,174,175
+ 1386 168 1386 168 1373 153.5 c 128,-1,176
+ 1360 139 1360 139 1339 139 c 0,177,178
+ 1322 139 1322 139 1307.5 152 c 128,-1,179
+ 1293 165 1293 165 1293 185 c 0,180,181
+ 1293 204 1293 204 1306.5 218 c 128,-1,182
+ 1320 232 1320 232 1339 232 c 0,171,172
+1616 415 m 0,183,184
+ 1616 394 1616 394 1601.5 382 c 128,-1,185
+ 1587 370 1587 370 1570 370 c 0,186,187
+ 1550 370 1550 370 1537 384.5 c 128,-1,188
+ 1524 399 1524 399 1524 416 c 0,189,190
+ 1524 436 1524 436 1537.5 449 c 128,-1,191
+ 1551 462 1551 462 1571 462 c 256,192,193
+ 1591 462 1591 462 1603.5 449.5 c 128,-1,194
+ 1616 437 1616 437 1616 415 c 0,183,184
+EndSplineSet
+EndChar
+
+StartChar: divide
+Encoding: 184 247 39
+Width: 2048
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1024 1538 m 0,0,1
+ 1238 1538 1238 1538 1425.5 1430.5 c 128,-1,2
+ 1613 1323 1613 1323 1722 1135.5 c 128,-1,3
+ 1831 948 1831 948 1831 732 c 0,4,5
+ 1831 514 1831 514 1722 327 c 128,-1,6
+ 1613 140 1613 140 1425 32.5 c 128,-1,7
+ 1237 -75 1237 -75 1024 -75 c 0,8,9
+ 808 -75 808 -75 621 33 c 128,-1,10
+ 434 141 434 141 326 328 c 128,-1,11
+ 218 515 218 515 218 732 c 0,12,13
+ 218 948 218 948 326 1135 c 128,-1,14
+ 434 1322 434 1322 621 1430 c 128,-1,15
+ 808 1538 808 1538 1024 1538 c 0,0,1
+1024 2 m 0,16,17
+ 1219 2 1219 2 1387 98.5 c 128,-1,18
+ 1555 195 1555 195 1654 364.5 c 128,-1,19
+ 1753 534 1753 534 1753 732 c 0,20,21
+ 1753 928 1753 928 1655 1096.5 c 128,-1,22
+ 1557 1265 1557 1265 1388.5 1362.5 c 128,-1,23
+ 1220 1460 1220 1460 1024 1460 c 256,24,25
+ 828 1460 828 1460 659.5 1362 c 128,-1,26
+ 491 1264 491 1264 393.5 1095.5 c 128,-1,27
+ 296 927 296 927 296 732 c 0,28,29
+ 296 534 296 534 395.5 364.5 c 128,-1,30
+ 495 195 495 195 663 98.5 c 128,-1,31
+ 831 2 831 2 1024 2 c 0,16,17
+1359 992 m 1,32,-1
+ 1417 891 l 1,33,-1
+ 1147 735 l 1,34,-1
+ 1148 732 l 1,35,36
+ 1148 680 1148 680 1111.5 644 c 128,-1,37
+ 1075 608 1075 608 1024 608 c 256,38,39
+ 973 608 973 608 937 644 c 128,-1,40
+ 901 680 901 680 901 732 c 0,41,42
+ 901 767 901 767 919 795.5 c 128,-1,43
+ 937 824 937 824 966 839 c 1,44,-1
+ 966 1396 l 1,45,-1
+ 1082 1396 l 1,46,-1
+ 1082 839 l 1,47,-1
+ 1089 836 l 1,48,-1
+ 1359 992 l 1,32,-1
+1654 778 m 0,49,50
+ 1674 778 1674 778 1687.5 764.5 c 128,-1,51
+ 1701 751 1701 751 1701 732 c 0,52,53
+ 1701 712 1701 712 1687.5 698 c 128,-1,54
+ 1674 684 1674 684 1654 684 c 0,55,56
+ 1635 684 1635 684 1621.5 698 c 128,-1,57
+ 1608 712 1608 712 1608 732 c 0,58,59
+ 1608 751 1608 751 1621.5 764.5 c 128,-1,60
+ 1635 778 1635 778 1654 778 c 0,49,50
+756 185 m 0,61,62
+ 756 164 756 164 741.5 151.5 c 128,-1,63
+ 727 139 727 139 709 139 c 0,64,65
+ 689 139 689 139 676 153.5 c 128,-1,66
+ 663 168 663 168 663 186 c 0,67,68
+ 663 206 663 206 677.5 219 c 128,-1,69
+ 692 232 692 232 709 232 c 0,70,71
+ 729 232 729 232 742.5 218.5 c 128,-1,72
+ 756 205 756 205 756 185 c 0,61,62
+1024 684 m 0,73,74
+ 1043 684 1043 684 1057 698 c 128,-1,75
+ 1071 712 1071 712 1071 732 c 0,76,77
+ 1071 751 1071 751 1057.5 764.5 c 128,-1,78
+ 1044 778 1044 778 1024 778 c 0,79,80
+ 1005 778 1005 778 991.5 764.5 c 128,-1,81
+ 978 751 978 751 978 732 c 0,82,83
+ 978 712 978 712 992.5 698 c 128,-1,84
+ 1007 684 1007 684 1024 684 c 0,73,74
+394 778 m 256,85,86
+ 414 778 414 778 427.5 764.5 c 128,-1,87
+ 441 751 441 751 441 732 c 0,88,89
+ 441 712 441 712 428 698.5 c 128,-1,90
+ 415 685 415 685 396 685 c 0,91,92
+ 376 685 376 685 362 698.5 c 128,-1,93
+ 348 712 348 712 348 732 c 0,94,95
+ 348 751 348 751 361 764.5 c 128,-1,96
+ 374 778 374 778 394 778 c 256,85,86
+1339 232 m 0,97,98
+ 1357 232 1357 232 1371.5 219 c 128,-1,99
+ 1386 206 1386 206 1386 186 c 0,100,101
+ 1386 168 1386 168 1373 153.5 c 128,-1,102
+ 1360 139 1360 139 1339 139 c 0,103,104
+ 1322 139 1322 139 1307.5 152 c 128,-1,105
+ 1293 165 1293 165 1293 185 c 0,106,107
+ 1293 206 1293 206 1306.5 219 c 128,-1,108
+ 1320 232 1320 232 1339 232 c 0,97,98
+710 1323 m 0,109,110
+ 727 1323 727 1323 741.5 1310.5 c 128,-1,111
+ 756 1298 756 1298 756 1277 c 0,112,113
+ 756 1259 756 1259 743 1244.5 c 128,-1,114
+ 730 1230 730 1230 709 1230 c 0,115,116
+ 692 1230 692 1230 677.5 1243 c 128,-1,117
+ 663 1256 663 1256 663 1277 c 0,118,119
+ 663 1297 663 1297 677 1310 c 128,-1,120
+ 691 1323 691 1323 710 1323 c 0,109,110
+479 462 m 0,121,122
+ 496 462 496 462 510.5 450 c 128,-1,123
+ 525 438 525 438 525 417 c 0,124,125
+ 525 399 525 399 512 384 c 128,-1,126
+ 499 369 499 369 478 369 c 0,127,128
+ 460 369 460 369 446 382.5 c 128,-1,129
+ 432 396 432 396 432 417 c 0,130,131
+ 432 437 432 437 446.5 449.5 c 128,-1,132
+ 461 462 461 462 479 462 c 0,121,122
+1024 147 m 256,133,134
+ 1044 147 1044 147 1057.5 134 c 128,-1,135
+ 1071 121 1071 121 1071 101 c 0,136,137
+ 1071 82 1071 82 1057.5 68 c 128,-1,138
+ 1044 54 1044 54 1024 54 c 0,139,140
+ 1005 54 1005 54 991.5 68 c 128,-1,141
+ 978 82 978 82 978 101 c 0,142,143
+ 978 121 978 121 991 134 c 128,-1,144
+ 1004 147 1004 147 1024 147 c 256,133,134
+525 1046 m 256,145,146
+ 525 1025 525 1025 510.5 1012.5 c 128,-1,147
+ 496 1000 496 1000 478 1000 c 0,148,149
+ 458 1000 458 1000 445 1014.5 c 128,-1,150
+ 432 1029 432 1029 432 1046 c 0,151,152
+ 432 1066 432 1066 446.5 1079.5 c 128,-1,153
+ 461 1093 461 1093 479 1093 c 0,154,155
+ 498 1093 498 1093 511.5 1080 c 128,-1,156
+ 525 1067 525 1067 525 1046 c 256,145,146
+1293 1277 m 0,157,158
+ 1293 1297 1293 1297 1307.5 1310 c 128,-1,159
+ 1322 1323 1322 1323 1339 1323 c 0,160,161
+ 1359 1323 1359 1323 1372.5 1308.5 c 128,-1,162
+ 1386 1294 1386 1294 1386 1277 c 0,163,164
+ 1386 1256 1386 1256 1371.5 1243 c 128,-1,165
+ 1357 1230 1357 1230 1340 1230 c 0,166,167
+ 1322 1230 1322 1230 1307.5 1243 c 128,-1,168
+ 1293 1256 1293 1256 1293 1277 c 0,157,158
+1570 1000 m 0,169,170
+ 1551 1000 1551 1000 1537.5 1013 c 128,-1,171
+ 1524 1026 1524 1026 1524 1046 c 0,172,173
+ 1524 1064 1524 1064 1537 1078.5 c 128,-1,174
+ 1550 1093 1550 1093 1570 1093 c 0,175,176
+ 1587 1093 1587 1093 1601.5 1080.5 c 128,-1,177
+ 1616 1068 1616 1068 1616 1047 c 0,178,179
+ 1616 1020 1616 1020 1594 1006 c 1,180,181
+ 1582 1000 1582 1000 1570 1000 c 0,169,170
+1616 415 m 0,182,183
+ 1616 394 1616 394 1602 381.5 c 128,-1,184
+ 1588 369 1588 369 1571 369 c 0,185,186
+ 1550 369 1550 369 1537 384 c 128,-1,187
+ 1524 399 1524 399 1524 416 c 0,188,189
+ 1524 436 1524 436 1538 449 c 128,-1,190
+ 1552 462 1552 462 1570 462 c 0,191,192
+ 1582 462 1582 462 1594 456 c 1,193,194
+ 1616 442 1616 442 1616 415 c 0,182,183
+EndSplineSet
+EndChar
+
+StartChar: notequal
+Encoding: 185 8800 40
+Width: 2048
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1024 1538 m 0,0,1
+ 1239 1538 1239 1538 1427 1430 c 128,-1,2
+ 1615 1322 1615 1322 1723 1133.5 c 128,-1,3
+ 1831 945 1831 945 1831 731 c 0,4,5
+ 1831 515 1831 515 1722 327.5 c 128,-1,6
+ 1613 140 1613 140 1425.5 32.5 c 128,-1,7
+ 1238 -75 1238 -75 1024 -75 c 0,8,9
+ 808 -75 808 -75 621 33 c 128,-1,10
+ 434 141 434 141 326 328 c 128,-1,11
+ 218 515 218 515 218 731 c 0,12,13
+ 218 945 218 945 325.5 1132.5 c 128,-1,14
+ 433 1320 433 1320 620.5 1429 c 128,-1,15
+ 808 1538 808 1538 1024 1538 c 0,0,1
+1024 3 m 0,16,17
+ 1220 3 1220 3 1388 100 c 128,-1,18
+ 1556 197 1556 197 1654.5 365.5 c 128,-1,19
+ 1753 534 1753 534 1753 731 c 0,20,21
+ 1753 927 1753 927 1655 1096 c 128,-1,22
+ 1557 1265 1557 1265 1388.5 1362.5 c 128,-1,23
+ 1220 1460 1220 1460 1024 1460 c 256,24,25
+ 828 1460 828 1460 659.5 1362 c 128,-1,26
+ 491 1264 491 1264 393.5 1095.5 c 128,-1,27
+ 296 927 296 927 296 731 c 0,28,29
+ 296 533 296 533 394.5 365 c 128,-1,30
+ 493 197 493 197 661 100 c 128,-1,31
+ 829 3 829 3 1024 3 c 0,16,17
+1082 840 m 1,32,33
+ 1115 822 1115 822 1133 789 c 1,34,-1
+ 1445 789 l 1,35,-1
+ 1445 673 l 1,36,-1
+ 1133 673 l 1,37,38
+ 1117 644 1117 644 1088 626 c 128,-1,39
+ 1059 608 1059 608 1024 608 c 0,40,41
+ 973 608 973 608 937 644 c 128,-1,42
+ 901 680 901 680 901 731 c 0,43,44
+ 901 767 901 767 919 795.5 c 128,-1,45
+ 937 824 937 824 966 840 c 1,46,-1
+ 966 1396 l 1,47,-1
+ 1082 1396 l 1,48,-1
+ 1082 840 l 1,32,33
+1024 685 m 0,49,50
+ 1044 685 1044 685 1057.5 698 c 128,-1,51
+ 1071 711 1071 711 1071 731 c 256,52,53
+ 1071 751 1071 751 1057.5 764.5 c 128,-1,54
+ 1044 778 1044 778 1024 778 c 256,55,56
+ 1004 778 1004 778 991 764.5 c 128,-1,57
+ 978 751 978 751 978 731 c 0,58,59
+ 978 712 978 712 990 698.5 c 128,-1,60
+ 1002 685 1002 685 1024 685 c 0,49,50
+1654 778 m 0,61,62
+ 1674 778 1674 778 1687.5 764.5 c 128,-1,63
+ 1701 751 1701 751 1701 731 c 256,64,65
+ 1701 711 1701 711 1687.5 698 c 128,-1,66
+ 1674 685 1674 685 1654 685 c 0,67,68
+ 1635 685 1635 685 1621.5 698 c 128,-1,69
+ 1608 711 1608 711 1608 731 c 256,70,71
+ 1608 751 1608 751 1621.5 764.5 c 128,-1,72
+ 1635 778 1635 778 1654 778 c 0,61,62
+1569 1000 m 0,73,74
+ 1551 1000 1551 1000 1537.5 1013 c 128,-1,75
+ 1524 1026 1524 1026 1524 1046 c 0,76,77
+ 1524 1064 1524 1064 1536.5 1078.5 c 128,-1,78
+ 1549 1093 1549 1093 1570 1093 c 0,79,80
+ 1587 1093 1587 1093 1601.5 1081 c 128,-1,81
+ 1616 1069 1616 1069 1616 1047 c 0,82,83
+ 1616 1026 1616 1026 1602.5 1013 c 128,-1,84
+ 1589 1000 1589 1000 1569 1000 c 0,73,74
+1293 1277 m 256,85,86
+ 1293 1297 1293 1297 1307.5 1310 c 128,-1,87
+ 1322 1323 1322 1323 1339 1323 c 0,88,89
+ 1359 1323 1359 1323 1372.5 1309.5 c 128,-1,90
+ 1386 1296 1386 1296 1386 1277 c 0,91,92
+ 1386 1257 1386 1257 1371.5 1244 c 128,-1,93
+ 1357 1231 1357 1231 1339 1231 c 0,94,95
+ 1320 1231 1320 1231 1306.5 1244 c 128,-1,96
+ 1293 1257 1293 1257 1293 1277 c 256,85,86
+710 1323 m 0,97,98
+ 728 1323 728 1323 742 1310.5 c 128,-1,99
+ 756 1298 756 1298 756 1277 c 0,100,101
+ 756 1260 756 1260 743 1245.5 c 128,-1,102
+ 730 1231 730 1231 709 1231 c 0,103,104
+ 692 1231 692 1231 677.5 1244 c 128,-1,105
+ 663 1257 663 1257 663 1277 c 0,106,107
+ 663 1296 663 1296 676 1309.5 c 128,-1,108
+ 689 1323 689 1323 710 1323 c 0,97,98
+525 1046 m 0,109,110
+ 525 1025 525 1025 510.5 1012.5 c 128,-1,111
+ 496 1000 496 1000 479 1000 c 0,112,113
+ 459 1000 459 1000 445.5 1014.5 c 128,-1,114
+ 432 1029 432 1029 432 1046 c 0,115,116
+ 432 1066 432 1066 446 1079.5 c 128,-1,117
+ 460 1093 460 1093 478 1093 c 0,118,119
+ 490 1093 490 1093 502 1087 c 1,120,121
+ 525 1072 525 1072 525 1046 c 0,109,110
+394 778 m 256,122,123
+ 414 778 414 778 427.5 764.5 c 128,-1,124
+ 441 751 441 751 441 731 c 256,125,126
+ 441 711 441 711 427.5 698 c 128,-1,127
+ 414 685 414 685 394 685 c 256,128,129
+ 374 685 374 685 361 698 c 128,-1,130
+ 348 711 348 711 348 731 c 256,131,132
+ 348 751 348 751 361 764.5 c 128,-1,133
+ 374 778 374 778 394 778 c 256,122,123
+479 462 m 0,134,135
+ 496 462 496 462 510.5 449.5 c 128,-1,136
+ 525 437 525 437 525 416 c 0,137,138
+ 525 399 525 399 512 384.5 c 128,-1,139
+ 499 370 499 370 478 370 c 0,140,141
+ 460 370 460 370 446 383.5 c 128,-1,142
+ 432 397 432 397 432 417 c 0,143,144
+ 432 436 432 436 445 449 c 128,-1,145
+ 458 462 458 462 479 462 c 0,134,135
+756 185 m 256,146,147
+ 756 164 756 164 741.5 151.5 c 128,-1,148
+ 727 139 727 139 709 139 c 0,149,150
+ 688 139 688 139 675.5 153.5 c 128,-1,151
+ 663 168 663 168 663 186 c 0,152,153
+ 663 206 663 206 678 219 c 128,-1,154
+ 693 232 693 232 710 232 c 0,155,156
+ 729 232 729 232 742.5 219 c 128,-1,157
+ 756 206 756 206 756 185 c 256,146,147
+1024 148 m 256,158,159
+ 1044 148 1044 148 1057.5 134.5 c 128,-1,160
+ 1071 121 1071 121 1071 101 c 256,161,162
+ 1071 81 1071 81 1057.5 68 c 128,-1,163
+ 1044 55 1044 55 1024 55 c 0,164,165
+ 1005 55 1005 55 991.5 68 c 128,-1,166
+ 978 81 978 81 978 101 c 256,167,168
+ 978 121 978 121 991 134.5 c 128,-1,169
+ 1004 148 1004 148 1024 148 c 256,158,159
+1339 232 m 0,170,171
+ 1356 232 1356 232 1371 219 c 128,-1,172
+ 1386 206 1386 206 1386 186 c 0,173,174
+ 1386 168 1386 168 1373.5 153.5 c 128,-1,175
+ 1361 139 1361 139 1339 139 c 0,176,177
+ 1322 139 1322 139 1307.5 152 c 128,-1,178
+ 1293 165 1293 165 1293 185 c 0,179,180
+ 1293 206 1293 206 1306.5 219 c 128,-1,181
+ 1320 232 1320 232 1339 232 c 0,170,171
+1616 415 m 0,182,183
+ 1616 394 1616 394 1601.5 382 c 128,-1,184
+ 1587 370 1587 370 1570 370 c 0,185,186
+ 1550 370 1550 370 1537 384.5 c 128,-1,187
+ 1524 399 1524 399 1524 416 c 0,188,189
+ 1524 436 1524 436 1538 449 c 128,-1,190
+ 1552 462 1552 462 1570 462 c 0,191,192
+ 1589 462 1589 462 1602.5 449.5 c 128,-1,193
+ 1616 437 1616 437 1616 415 c 0,182,183
+EndSplineSet
+EndChar
+
+StartChar: equivalence
+Encoding: 186 8801 41
+Width: 2048
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1024 1538 m 0,0,1
+ 1239 1538 1239 1538 1427 1430 c 128,-1,2
+ 1615 1322 1615 1322 1723 1133.5 c 128,-1,3
+ 1831 945 1831 945 1831 731 c 0,4,5
+ 1831 515 1831 515 1722 327.5 c 128,-1,6
+ 1613 140 1613 140 1425.5 32.5 c 128,-1,7
+ 1238 -75 1238 -75 1024 -75 c 0,8,9
+ 808 -75 808 -75 621 33 c 128,-1,10
+ 434 141 434 141 326 328 c 128,-1,11
+ 218 515 218 515 218 731 c 0,12,13
+ 218 945 218 945 325.5 1132.5 c 128,-1,14
+ 433 1320 433 1320 620.5 1429 c 128,-1,15
+ 808 1538 808 1538 1024 1538 c 0,0,1
+1024 3 m 0,16,17
+ 1220 3 1220 3 1388 100 c 128,-1,18
+ 1556 197 1556 197 1654.5 365.5 c 128,-1,19
+ 1753 534 1753 534 1753 731 c 0,20,21
+ 1753 927 1753 927 1655 1096 c 128,-1,22
+ 1557 1265 1557 1265 1388.5 1362.5 c 128,-1,23
+ 1220 1460 1220 1460 1024 1460 c 256,24,25
+ 828 1460 828 1460 659.5 1362 c 128,-1,26
+ 491 1264 491 1264 393.5 1095.5 c 128,-1,27
+ 296 927 296 927 296 731 c 0,28,29
+ 296 533 296 533 394.5 365 c 128,-1,30
+ 493 197 493 197 661 100 c 128,-1,31
+ 829 3 829 3 1024 3 c 0,16,17
+1082 840 m 1,32,33
+ 1115 822 1115 822 1133 789 c 1,34,-1
+ 1445 789 l 1,35,-1
+ 1445 673 l 1,36,-1
+ 1133 673 l 1,37,38
+ 1117 644 1117 644 1088 626 c 128,-1,39
+ 1059 608 1059 608 1024 608 c 0,40,41
+ 973 608 973 608 937 644 c 128,-1,42
+ 901 680 901 680 901 731 c 0,43,44
+ 901 767 901 767 919 795.5 c 128,-1,45
+ 937 824 937 824 966 840 c 1,46,-1
+ 966 1396 l 1,47,-1
+ 1082 1396 l 1,48,-1
+ 1082 840 l 1,32,33
+1024 685 m 0,49,50
+ 1044 685 1044 685 1057.5 698 c 128,-1,51
+ 1071 711 1071 711 1071 731 c 256,52,53
+ 1071 751 1071 751 1057.5 764.5 c 128,-1,54
+ 1044 778 1044 778 1024 778 c 256,55,56
+ 1004 778 1004 778 991 764.5 c 128,-1,57
+ 978 751 978 751 978 731 c 0,58,59
+ 978 712 978 712 990 698.5 c 128,-1,60
+ 1002 685 1002 685 1024 685 c 0,49,50
+1654 778 m 0,61,62
+ 1674 778 1674 778 1687.5 764.5 c 128,-1,63
+ 1701 751 1701 751 1701 731 c 256,64,65
+ 1701 711 1701 711 1687.5 698 c 128,-1,66
+ 1674 685 1674 685 1654 685 c 0,67,68
+ 1635 685 1635 685 1621.5 698 c 128,-1,69
+ 1608 711 1608 711 1608 731 c 256,70,71
+ 1608 751 1608 751 1621.5 764.5 c 128,-1,72
+ 1635 778 1635 778 1654 778 c 0,61,62
+1569 1000 m 0,73,74
+ 1551 1000 1551 1000 1537.5 1013 c 128,-1,75
+ 1524 1026 1524 1026 1524 1046 c 0,76,77
+ 1524 1064 1524 1064 1536.5 1078.5 c 128,-1,78
+ 1549 1093 1549 1093 1570 1093 c 0,79,80
+ 1587 1093 1587 1093 1601.5 1081 c 128,-1,81
+ 1616 1069 1616 1069 1616 1047 c 0,82,83
+ 1616 1026 1616 1026 1602.5 1013 c 128,-1,84
+ 1589 1000 1589 1000 1569 1000 c 0,73,74
+1293 1277 m 256,85,86
+ 1293 1297 1293 1297 1307.5 1310 c 128,-1,87
+ 1322 1323 1322 1323 1339 1323 c 0,88,89
+ 1359 1323 1359 1323 1372.5 1309.5 c 128,-1,90
+ 1386 1296 1386 1296 1386 1277 c 0,91,92
+ 1386 1257 1386 1257 1371.5 1244 c 128,-1,93
+ 1357 1231 1357 1231 1339 1231 c 0,94,95
+ 1320 1231 1320 1231 1306.5 1244 c 128,-1,96
+ 1293 1257 1293 1257 1293 1277 c 256,85,86
+710 1323 m 0,97,98
+ 728 1323 728 1323 742 1310.5 c 128,-1,99
+ 756 1298 756 1298 756 1277 c 0,100,101
+ 756 1260 756 1260 743 1245.5 c 128,-1,102
+ 730 1231 730 1231 709 1231 c 0,103,104
+ 692 1231 692 1231 677.5 1244 c 128,-1,105
+ 663 1257 663 1257 663 1277 c 0,106,107
+ 663 1296 663 1296 676 1309.5 c 128,-1,108
+ 689 1323 689 1323 710 1323 c 0,97,98
+525 1046 m 0,109,110
+ 525 1025 525 1025 510.5 1012.5 c 128,-1,111
+ 496 1000 496 1000 479 1000 c 0,112,113
+ 459 1000 459 1000 445.5 1014.5 c 128,-1,114
+ 432 1029 432 1029 432 1046 c 0,115,116
+ 432 1066 432 1066 446 1079.5 c 128,-1,117
+ 460 1093 460 1093 478 1093 c 0,118,119
+ 490 1093 490 1093 502 1087 c 1,120,121
+ 525 1072 525 1072 525 1046 c 0,109,110
+394 778 m 256,122,123
+ 414 778 414 778 427.5 764.5 c 128,-1,124
+ 441 751 441 751 441 731 c 256,125,126
+ 441 711 441 711 427.5 698 c 128,-1,127
+ 414 685 414 685 394 685 c 256,128,129
+ 374 685 374 685 361 698 c 128,-1,130
+ 348 711 348 711 348 731 c 256,131,132
+ 348 751 348 751 361 764.5 c 128,-1,133
+ 374 778 374 778 394 778 c 256,122,123
+479 462 m 0,134,135
+ 496 462 496 462 510.5 449.5 c 128,-1,136
+ 525 437 525 437 525 416 c 0,137,138
+ 525 399 525 399 512 384.5 c 128,-1,139
+ 499 370 499 370 478 370 c 0,140,141
+ 460 370 460 370 446 383.5 c 128,-1,142
+ 432 397 432 397 432 417 c 0,143,144
+ 432 436 432 436 445 449 c 128,-1,145
+ 458 462 458 462 479 462 c 0,134,135
+756 185 m 256,146,147
+ 756 164 756 164 741.5 151.5 c 128,-1,148
+ 727 139 727 139 709 139 c 0,149,150
+ 688 139 688 139 675.5 153.5 c 128,-1,151
+ 663 168 663 168 663 186 c 0,152,153
+ 663 206 663 206 678 219 c 128,-1,154
+ 693 232 693 232 710 232 c 0,155,156
+ 729 232 729 232 742.5 219 c 128,-1,157
+ 756 206 756 206 756 185 c 256,146,147
+1024 148 m 256,158,159
+ 1044 148 1044 148 1057.5 134.5 c 128,-1,160
+ 1071 121 1071 121 1071 101 c 256,161,162
+ 1071 81 1071 81 1057.5 68 c 128,-1,163
+ 1044 55 1044 55 1024 55 c 0,164,165
+ 1005 55 1005 55 991.5 68 c 128,-1,166
+ 978 81 978 81 978 101 c 256,167,168
+ 978 121 978 121 991 134.5 c 128,-1,169
+ 1004 148 1004 148 1024 148 c 256,158,159
+1339 232 m 0,170,171
+ 1356 232 1356 232 1371 219 c 128,-1,172
+ 1386 206 1386 206 1386 186 c 0,173,174
+ 1386 168 1386 168 1373.5 153.5 c 128,-1,175
+ 1361 139 1361 139 1339 139 c 0,176,177
+ 1322 139 1322 139 1307.5 152 c 128,-1,178
+ 1293 165 1293 165 1293 185 c 0,179,180
+ 1293 206 1293 206 1306.5 219 c 128,-1,181
+ 1320 232 1320 232 1339 232 c 0,170,171
+1616 415 m 0,182,183
+ 1616 394 1616 394 1601.5 382 c 128,-1,184
+ 1587 370 1587 370 1570 370 c 0,185,186
+ 1550 370 1550 370 1537 384.5 c 128,-1,187
+ 1524 399 1524 399 1524 416 c 0,188,189
+ 1524 436 1524 436 1538 449 c 128,-1,190
+ 1552 462 1552 462 1570 462 c 0,191,192
+ 1589 462 1589 462 1602.5 449.5 c 128,-1,193
+ 1616 437 1616 437 1616 415 c 0,182,183
+EndSplineSet
+EndChar
+
+StartChar: approxequal
+Encoding: 187 8776 42
+Width: 2048
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1024 1538 m 256,0,1
+ 1240 1538 1240 1538 1427.5 1429 c 128,-1,2
+ 1615 1320 1615 1320 1722.5 1132.5 c 128,-1,3
+ 1830 945 1830 945 1830 731 c 0,4,5
+ 1830 515 1830 515 1722 328 c 128,-1,6
+ 1614 141 1614 141 1427 33 c 128,-1,7
+ 1240 -75 1240 -75 1024 -75 c 256,8,9
+ 808 -75 808 -75 621 33 c 128,-1,10
+ 434 141 434 141 326 328 c 128,-1,11
+ 218 515 218 515 218 731 c 0,12,13
+ 218 945 218 945 325.5 1132.5 c 128,-1,14
+ 433 1320 433 1320 620.5 1429 c 128,-1,15
+ 808 1538 808 1538 1024 1538 c 256,0,1
+1024 3 m 0,16,17
+ 1220 3 1220 3 1388.5 100.5 c 128,-1,18
+ 1557 198 1557 198 1654.5 367 c 128,-1,19
+ 1752 536 1752 536 1752 731 c 0,20,21
+ 1752 927 1752 927 1655 1095 c 128,-1,22
+ 1558 1263 1558 1263 1389.5 1361.5 c 128,-1,23
+ 1221 1460 1221 1460 1024 1460 c 0,24,25
+ 826 1460 826 1460 658 1361.5 c 128,-1,26
+ 490 1263 490 1263 393 1095 c 128,-1,27
+ 296 927 296 927 296 731 c 256,28,29
+ 296 535 296 535 393.5 366.5 c 128,-1,30
+ 491 198 491 198 660 100.5 c 128,-1,31
+ 829 3 829 3 1024 3 c 0,16,17
+1147 731 m 0,32,33
+ 1147 695 1147 695 1128 666 c 1,34,-1
+ 1285 397 l 1,35,-1
+ 1184 338 l 1,36,-1
+ 1028 608 l 1,37,38
+ 974 608 974 608 937 643 c 128,-1,39
+ 900 678 900 678 900 731 c 0,40,41
+ 900 766 900 766 918.5 795 c 128,-1,42
+ 937 824 937 824 966 840 c 1,43,-1
+ 966 1396 l 1,44,-1
+ 1082 1396 l 1,45,-1
+ 1082 840 l 1,46,47
+ 1111 824 1111 824 1129 795 c 128,-1,48
+ 1147 766 1147 766 1147 731 c 0,32,33
+1024 685 m 256,49,50
+ 1044 685 1044 685 1057 698.5 c 128,-1,51
+ 1070 712 1070 712 1070 731 c 0,52,53
+ 1070 751 1070 751 1057 764.5 c 128,-1,54
+ 1044 778 1044 778 1024 778 c 256,55,56
+ 1004 778 1004 778 991 764 c 128,-1,57
+ 978 750 978 750 978 731 c 0,58,59
+ 978 711 978 711 991 698 c 128,-1,60
+ 1004 685 1004 685 1024 685 c 256,49,50
+1654 778 m 0,61,62
+ 1674 778 1674 778 1687 764.5 c 128,-1,63
+ 1700 751 1700 751 1700 731 c 256,64,65
+ 1700 711 1700 711 1687 698 c 128,-1,66
+ 1674 685 1674 685 1654 685 c 0,67,68
+ 1635 685 1635 685 1621.5 698 c 128,-1,69
+ 1608 711 1608 711 1608 731 c 256,70,71
+ 1608 751 1608 751 1621.5 764.5 c 128,-1,72
+ 1635 778 1635 778 1654 778 c 0,61,62
+1570 1000 m 0,73,74
+ 1551 1000 1551 1000 1537 1013.5 c 128,-1,75
+ 1523 1027 1523 1027 1523 1047 c 0,76,77
+ 1523 1064 1523 1064 1535.5 1078.5 c 128,-1,78
+ 1548 1093 1548 1093 1570 1093 c 0,79,80
+ 1587 1093 1587 1093 1601.5 1080 c 128,-1,81
+ 1616 1067 1616 1067 1616 1046 c 0,82,83
+ 1616 1026 1616 1026 1602 1013 c 128,-1,84
+ 1588 1000 1588 1000 1570 1000 c 0,73,74
+1385 1276 m 0,85,86
+ 1385 1255 1385 1255 1370.5 1242.5 c 128,-1,87
+ 1356 1230 1356 1230 1338 1230 c 0,88,89
+ 1318 1230 1318 1230 1305.5 1244.5 c 128,-1,90
+ 1293 1259 1293 1259 1293 1277 c 0,91,92
+ 1293 1297 1293 1297 1306.5 1310 c 128,-1,93
+ 1320 1323 1320 1323 1338 1323 c 0,94,95
+ 1359 1323 1359 1323 1372 1310.5 c 128,-1,96
+ 1385 1298 1385 1298 1385 1276 c 0,85,86
+709 1323 m 0,97,98
+ 728 1323 728 1323 741.5 1310 c 128,-1,99
+ 755 1297 755 1297 755 1277 c 0,100,101
+ 755 1258 755 1258 742 1244.5 c 128,-1,102
+ 729 1231 729 1231 709 1231 c 0,103,104
+ 690 1231 690 1231 676 1244.5 c 128,-1,105
+ 662 1258 662 1258 662 1278 c 0,106,107
+ 662 1297 662 1297 675 1310 c 128,-1,108
+ 688 1323 688 1323 709 1323 c 0,97,98
+524 1047 m 0,109,110
+ 524 1027 524 1027 510.5 1013.5 c 128,-1,111
+ 497 1000 497 1000 478 1000 c 0,112,113
+ 458 1000 458 1000 445 1014.5 c 128,-1,114
+ 432 1029 432 1029 432 1046 c 0,115,116
+ 432 1067 432 1067 445.5 1080 c 128,-1,117
+ 459 1093 459 1093 478 1093 c 0,118,119
+ 490 1093 490 1093 502 1087 c 1,120,121
+ 524 1073 524 1073 524 1047 c 0,109,110
+394 778 m 0,122,123
+ 413 778 413 778 426.5 764.5 c 128,-1,124
+ 440 751 440 751 440 731 c 256,125,126
+ 440 711 440 711 426.5 698 c 128,-1,127
+ 413 685 413 685 394 685 c 0,128,129
+ 374 685 374 685 360.5 698 c 128,-1,130
+ 347 711 347 711 347 731 c 256,131,132
+ 347 751 347 751 360.5 764.5 c 128,-1,133
+ 374 778 374 778 394 778 c 0,122,123
+479 462 m 0,134,135
+ 497 462 497 462 510.5 449 c 128,-1,136
+ 524 436 524 436 524 416 c 0,137,138
+ 524 399 524 399 511 384.5 c 128,-1,139
+ 498 370 498 370 478 370 c 0,140,141
+ 460 370 460 370 446 383 c 128,-1,142
+ 432 396 432 396 432 416 c 0,143,144
+ 432 435 432 435 445 448.5 c 128,-1,145
+ 458 462 458 462 479 462 c 0,134,135
+755 185 m 0,146,147
+ 755 165 755 165 741 152 c 128,-1,148
+ 727 139 727 139 709 139 c 0,149,150
+ 687 139 687 139 674.5 153.5 c 128,-1,151
+ 662 168 662 168 662 186 c 0,152,153
+ 662 207 662 207 676 219 c 128,-1,154
+ 690 231 690 231 708 231 c 0,155,156
+ 727 231 727 231 741 219 c 128,-1,157
+ 755 207 755 207 755 185 c 0,146,147
+1024 148 m 256,158,159
+ 1044 148 1044 148 1057 134 c 128,-1,160
+ 1070 120 1070 120 1070 101 c 0,161,162
+ 1070 81 1070 81 1057 68 c 128,-1,163
+ 1044 55 1044 55 1024 55 c 256,164,165
+ 1004 55 1004 55 991 68 c 128,-1,166
+ 978 81 978 81 978 101 c 0,167,168
+ 978 120 978 120 991 134 c 128,-1,169
+ 1004 148 1004 148 1024 148 c 256,158,159
+1340 231 m 0,170,171
+ 1357 231 1357 231 1371 219 c 128,-1,172
+ 1385 207 1385 207 1385 187 c 0,173,174
+ 1385 168 1385 168 1372.5 153.5 c 128,-1,175
+ 1360 139 1360 139 1339 139 c 0,176,177
+ 1320 139 1320 139 1306.5 152 c 128,-1,178
+ 1293 165 1293 165 1293 185 c 0,179,180
+ 1293 207 1293 207 1306.5 219 c 128,-1,181
+ 1320 231 1320 231 1340 231 c 0,170,171
+1616 416 m 0,182,183
+ 1616 396 1616 396 1601.5 383 c 128,-1,184
+ 1587 370 1587 370 1570 370 c 0,185,186
+ 1549 370 1549 370 1536 384 c 128,-1,187
+ 1523 398 1523 398 1523 415 c 0,188,189
+ 1523 435 1523 435 1537.5 448.5 c 128,-1,190
+ 1552 462 1552 462 1569 462 c 0,191,192
+ 1590 462 1590 462 1603 448.5 c 128,-1,193
+ 1616 435 1616 435 1616 416 c 0,182,183
+EndSplineSet
+EndChar
+
+StartChar: ellipsis
+Encoding: 188 8230 43
+Width: 2048
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1024 1538 m 256,0,1
+ 1240 1538 1240 1538 1427.5 1429 c 128,-1,2
+ 1615 1320 1615 1320 1722.5 1132.5 c 128,-1,3
+ 1830 945 1830 945 1830 731 c 0,4,5
+ 1830 515 1830 515 1722 328 c 128,-1,6
+ 1614 141 1614 141 1427 33 c 128,-1,7
+ 1240 -75 1240 -75 1024 -75 c 256,8,9
+ 808 -75 808 -75 621 33 c 128,-1,10
+ 434 141 434 141 326 328 c 128,-1,11
+ 218 515 218 515 218 731 c 0,12,13
+ 218 945 218 945 325.5 1132.5 c 128,-1,14
+ 433 1320 433 1320 620.5 1429 c 128,-1,15
+ 808 1538 808 1538 1024 1538 c 256,0,1
+1024 3 m 256,16,17
+ 1222 3 1222 3 1390 101.5 c 128,-1,18
+ 1558 200 1558 200 1655 368 c 128,-1,19
+ 1752 536 1752 536 1752 731 c 0,20,21
+ 1752 927 1752 927 1655 1095 c 128,-1,22
+ 1558 1263 1558 1263 1389.5 1361.5 c 128,-1,23
+ 1221 1460 1221 1460 1024 1460 c 0,24,25
+ 826 1460 826 1460 658 1361.5 c 128,-1,26
+ 490 1263 490 1263 393 1095 c 128,-1,27
+ 296 927 296 927 296 731 c 0,28,29
+ 296 536 296 536 393 368 c 128,-1,30
+ 490 200 490 200 658 101.5 c 128,-1,31
+ 826 3 826 3 1024 3 c 256,16,17
+1082 840 m 1,32,33
+ 1111 824 1111 824 1129 795.5 c 128,-1,34
+ 1147 767 1147 767 1147 732 c 256,35,36
+ 1147 697 1147 697 1129 668 c 128,-1,37
+ 1111 639 1111 639 1082 623 c 1,38,-1
+ 1082 311 l 1,39,-1
+ 966 311 l 1,40,-1
+ 966 623 l 1,41,42
+ 937 639 937 639 918.5 667.5 c 128,-1,43
+ 900 696 900 696 900 732 c 0,44,45
+ 900 767 900 767 918.5 795.5 c 128,-1,46
+ 937 824 937 824 966 840 c 1,47,-1
+ 966 1396 l 1,48,-1
+ 1082 1396 l 1,49,-1
+ 1082 840 l 1,32,33
+1024 685 m 0,50,51
+ 1042 685 1042 685 1056 698 c 128,-1,52
+ 1070 711 1070 711 1070 731 c 0,53,54
+ 1070 750 1070 750 1056.5 764 c 128,-1,55
+ 1043 778 1043 778 1024 778 c 256,56,57
+ 1005 778 1005 778 991.5 764 c 128,-1,58
+ 978 750 978 750 978 731 c 0,59,60
+ 978 711 978 711 991.5 698 c 128,-1,61
+ 1005 685 1005 685 1024 685 c 0,50,51
+1654 778 m 0,62,63
+ 1674 778 1674 778 1687 764.5 c 128,-1,64
+ 1700 751 1700 751 1700 731 c 0,65,66
+ 1700 712 1700 712 1687 698.5 c 128,-1,67
+ 1674 685 1674 685 1654 685 c 0,68,69
+ 1635 685 1635 685 1621.5 698.5 c 128,-1,70
+ 1608 712 1608 712 1608 731 c 0,71,72
+ 1608 751 1608 751 1621.5 764.5 c 128,-1,73
+ 1635 778 1635 778 1654 778 c 0,62,63
+1570 1000 m 0,74,75
+ 1551 1000 1551 1000 1537 1013.5 c 128,-1,76
+ 1523 1027 1523 1027 1523 1047 c 0,77,78
+ 1523 1064 1523 1064 1536 1078.5 c 128,-1,79
+ 1549 1093 1549 1093 1570 1093 c 0,80,81
+ 1587 1093 1587 1093 1601.5 1080 c 128,-1,82
+ 1616 1067 1616 1067 1616 1046 c 0,83,84
+ 1616 1026 1616 1026 1602 1013 c 128,-1,85
+ 1588 1000 1588 1000 1570 1000 c 0,74,75
+1385 1276 m 0,86,87
+ 1385 1255 1385 1255 1370.5 1243 c 128,-1,88
+ 1356 1231 1356 1231 1339 1231 c 0,89,90
+ 1319 1231 1319 1231 1306 1245.5 c 128,-1,91
+ 1293 1260 1293 1260 1293 1277 c 0,92,93
+ 1293 1297 1293 1297 1306.5 1310.5 c 128,-1,94
+ 1320 1324 1320 1324 1340 1324 c 0,95,96
+ 1359 1324 1359 1324 1372 1311 c 128,-1,97
+ 1385 1298 1385 1298 1385 1276 c 0,86,87
+708 1324 m 0,98,99
+ 727 1324 727 1324 741 1310.5 c 128,-1,100
+ 755 1297 755 1297 755 1277 c 0,101,102
+ 755 1260 755 1260 742 1245.5 c 128,-1,103
+ 729 1231 729 1231 709 1231 c 0,104,105
+ 690 1231 690 1231 676 1244.5 c 128,-1,106
+ 662 1258 662 1258 662 1278 c 256,107,108
+ 662 1298 662 1298 676 1311 c 128,-1,109
+ 690 1324 690 1324 708 1324 c 0,98,99
+524 1047 m 0,110,111
+ 524 1027 524 1027 510.5 1013.5 c 128,-1,112
+ 497 1000 497 1000 478 1000 c 0,113,114
+ 458 1000 458 1000 445 1014.5 c 128,-1,115
+ 432 1029 432 1029 432 1046 c 0,116,117
+ 432 1066 432 1066 445.5 1079.5 c 128,-1,118
+ 459 1093 459 1093 478 1093 c 0,119,120
+ 490 1093 490 1093 502 1087 c 1,121,122
+ 524 1073 524 1073 524 1047 c 0,110,111
+394 778 m 0,123,124
+ 413 778 413 778 426.5 764.5 c 128,-1,125
+ 440 751 440 751 440 731 c 0,126,127
+ 440 712 440 712 426.5 698.5 c 128,-1,128
+ 413 685 413 685 394 685 c 0,129,130
+ 374 685 374 685 360.5 698.5 c 128,-1,131
+ 347 712 347 712 347 731 c 0,132,133
+ 347 751 347 751 360.5 764.5 c 128,-1,134
+ 374 778 374 778 394 778 c 0,123,124
+478 463 m 256,135,136
+ 497 463 497 463 510.5 449.5 c 128,-1,137
+ 524 436 524 436 524 416 c 0,138,139
+ 524 399 524 399 511 384.5 c 128,-1,140
+ 498 370 498 370 478 370 c 0,141,142
+ 460 370 460 370 446 383 c 128,-1,143
+ 432 396 432 396 432 416 c 0,144,145
+ 432 435 432 435 445.5 449 c 128,-1,146
+ 459 463 459 463 478 463 c 256,135,136
+755 185 m 0,147,148
+ 755 165 755 165 740.5 152 c 128,-1,149
+ 726 139 726 139 708 139 c 0,150,151
+ 688 139 688 139 675 153.5 c 128,-1,152
+ 662 168 662 168 662 185 c 0,153,154
+ 662 207 662 207 676.5 219.5 c 128,-1,155
+ 691 232 691 232 709 232 c 0,156,157
+ 728 232 728 232 741.5 218 c 128,-1,158
+ 755 204 755 204 755 185 c 0,147,148
+1024 147 m 256,159,160
+ 1044 147 1044 147 1057 134 c 128,-1,161
+ 1070 121 1070 121 1070 101 c 0,162,163
+ 1070 82 1070 82 1057 68.5 c 128,-1,164
+ 1044 55 1044 55 1024 55 c 256,165,166
+ 1004 55 1004 55 991 68.5 c 128,-1,167
+ 978 82 978 82 978 101 c 0,168,169
+ 978 121 978 121 991 134 c 128,-1,170
+ 1004 147 1004 147 1024 147 c 256,159,160
+1339 232 m 0,171,172
+ 1356 232 1356 232 1370.5 219.5 c 128,-1,173
+ 1385 207 1385 207 1385 186 c 0,174,175
+ 1385 167 1385 167 1372.5 153 c 128,-1,176
+ 1360 139 1360 139 1339 139 c 0,177,178
+ 1322 139 1322 139 1307.5 152 c 128,-1,179
+ 1293 165 1293 165 1293 185 c 0,180,181
+ 1293 204 1293 204 1306.5 218 c 128,-1,182
+ 1320 232 1320 232 1339 232 c 0,171,172
+1616 416 m 0,183,184
+ 1616 396 1616 396 1601.5 383 c 128,-1,185
+ 1587 370 1587 370 1570 370 c 0,186,187
+ 1549 370 1549 370 1536 384.5 c 128,-1,188
+ 1523 399 1523 399 1523 416 c 0,189,190
+ 1523 436 1523 436 1537 449.5 c 128,-1,191
+ 1551 463 1551 463 1570 463 c 256,192,193
+ 1589 463 1589 463 1602.5 449 c 128,-1,194
+ 1616 435 1616 435 1616 416 c 0,183,184
+EndSplineSet
+EndChar
+
+StartChar: uniF8E6
+Encoding: 189 63718 44
+Width: 2048
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1024 1538 m 0,0,1
+ 1240 1538 1240 1538 1427 1430 c 128,-1,2
+ 1614 1322 1614 1322 1722 1135 c 128,-1,3
+ 1830 948 1830 948 1830 732 c 0,4,5
+ 1830 518 1830 518 1722.5 330.5 c 128,-1,6
+ 1615 143 1615 143 1427.5 34 c 128,-1,7
+ 1240 -75 1240 -75 1024 -75 c 0,8,9
+ 809 -75 809 -75 621 33 c 128,-1,10
+ 433 141 433 141 325 329.5 c 128,-1,11
+ 217 518 217 518 217 732 c 0,12,13
+ 217 948 217 948 326 1135.5 c 128,-1,14
+ 435 1323 435 1323 622.5 1430.5 c 128,-1,15
+ 810 1538 810 1538 1024 1538 c 0,0,1
+1024 3 m 256,16,17
+ 1220 3 1220 3 1389 101 c 128,-1,18
+ 1558 199 1558 199 1655.5 367.5 c 128,-1,19
+ 1753 536 1753 536 1753 732 c 256,20,21
+ 1753 928 1753 928 1655 1096.5 c 128,-1,22
+ 1557 1265 1557 1265 1388.5 1362.5 c 128,-1,23
+ 1220 1460 1220 1460 1024 1460 c 256,24,25
+ 828 1460 828 1460 659 1362 c 128,-1,26
+ 490 1264 490 1264 392.5 1095.5 c 128,-1,27
+ 295 927 295 927 295 732 c 0,28,29
+ 295 536 295 536 393 367 c 128,-1,30
+ 491 198 491 198 659.5 100.5 c 128,-1,31
+ 828 3 828 3 1024 3 c 256,16,17
+1082 840 m 1,32,33
+ 1111 824 1111 824 1129 795.5 c 128,-1,34
+ 1147 767 1147 767 1147 732 c 0,35,36
+ 1147 679 1147 679 1109.5 643.5 c 128,-1,37
+ 1072 608 1072 608 1020 608 c 1,38,-1
+ 864 339 l 1,39,-1
+ 763 397 l 1,40,-1
+ 919 666 l 1,41,42
+ 901 698 901 698 901 732 c 0,43,44
+ 901 767 901 767 919 795.5 c 128,-1,45
+ 937 824 937 824 966 840 c 1,46,-1
+ 966 1396 l 1,47,-1
+ 1082 1396 l 1,48,-1
+ 1082 840 l 1,32,33
+977 732 m 0,49,50
+ 977 714 977 714 990.5 699.5 c 128,-1,51
+ 1004 685 1004 685 1024 685 c 0,52,53
+ 1042 685 1042 685 1056.5 698.5 c 128,-1,54
+ 1071 712 1071 712 1071 732 c 0,55,56
+ 1071 747 1071 747 1059 762.5 c 128,-1,57
+ 1047 778 1047 778 1024 778 c 0,58,59
+ 1007 778 1007 778 992 766.5 c 128,-1,60
+ 977 755 977 755 977 732 c 0,49,50
+1654 778 m 256,61,62
+ 1674 778 1674 778 1687.5 764.5 c 128,-1,63
+ 1701 751 1701 751 1701 731 c 0,64,65
+ 1701 712 1701 712 1687.5 698.5 c 128,-1,66
+ 1674 685 1674 685 1654 685 c 256,67,68
+ 1634 685 1634 685 1620.5 698.5 c 128,-1,69
+ 1607 712 1607 712 1607 731 c 0,70,71
+ 1607 751 1607 751 1620.5 764.5 c 128,-1,72
+ 1634 778 1634 778 1654 778 c 256,61,62
+1569 1000 m 0,73,74
+ 1552 1000 1552 1000 1537.5 1013 c 128,-1,75
+ 1523 1026 1523 1026 1523 1046 c 0,76,77
+ 1523 1064 1523 1064 1536 1078.5 c 128,-1,78
+ 1549 1093 1549 1093 1569 1093 c 0,79,80
+ 1587 1093 1587 1093 1601.5 1080 c 128,-1,81
+ 1616 1067 1616 1067 1616 1047 c 0,82,83
+ 1616 1021 1616 1021 1593 1006 c 1,84,85
+ 1581 1000 1581 1000 1569 1000 c 0,73,74
+1385 1278 m 256,86,87
+ 1385 1258 1385 1258 1370.5 1244.5 c 128,-1,88
+ 1356 1231 1356 1231 1339 1231 c 0,89,90
+ 1318 1231 1318 1231 1305 1245.5 c 128,-1,91
+ 1292 1260 1292 1260 1292 1277 c 0,92,93
+ 1292 1297 1292 1297 1307 1310.5 c 128,-1,94
+ 1322 1324 1322 1324 1339 1324 c 0,95,96
+ 1358 1324 1358 1324 1371.5 1311 c 128,-1,97
+ 1385 1298 1385 1298 1385 1278 c 256,86,87
+708 1324 m 256,98,99
+ 725 1324 725 1324 740 1311 c 128,-1,100
+ 755 1298 755 1298 755 1278 c 0,101,102
+ 755 1260 755 1260 742 1245.5 c 128,-1,103
+ 729 1231 729 1231 709 1231 c 0,104,105
+ 690 1231 690 1231 676 1244.5 c 128,-1,106
+ 662 1258 662 1258 662 1278 c 256,107,108
+ 662 1298 662 1298 676.5 1311 c 128,-1,109
+ 691 1324 691 1324 708 1324 c 256,98,99
+524 1046 m 0,110,111
+ 524 1026 524 1026 510 1013 c 128,-1,112
+ 496 1000 496 1000 477 1000 c 0,113,114
+ 457 1000 457 1000 444 1014.5 c 128,-1,115
+ 431 1029 431 1029 431 1046 c 0,116,117
+ 431 1066 431 1066 446 1079.5 c 128,-1,118
+ 461 1093 461 1093 478 1093 c 0,119,120
+ 497 1093 497 1093 510.5 1080 c 128,-1,121
+ 524 1067 524 1067 524 1046 c 0,110,111
+393 778 m 0,122,123
+ 413 778 413 778 426.5 764.5 c 128,-1,124
+ 440 751 440 751 440 732 c 0,125,126
+ 440 712 440 712 426.5 698.5 c 128,-1,127
+ 413 685 413 685 393 685 c 0,128,129
+ 374 685 374 685 360.5 698.5 c 128,-1,130
+ 347 712 347 712 347 732 c 0,131,132
+ 347 751 347 751 360.5 764.5 c 128,-1,133
+ 374 778 374 778 393 778 c 0,122,123
+478 463 m 0,134,135
+ 495 463 495 463 509.5 450 c 128,-1,136
+ 524 437 524 437 524 416 c 0,137,138
+ 524 399 524 399 511 384.5 c 128,-1,139
+ 498 370 498 370 478 370 c 0,140,141
+ 460 370 460 370 445.5 383.5 c 128,-1,142
+ 431 397 431 397 431 417 c 256,143,144
+ 431 437 431 437 445.5 450 c 128,-1,145
+ 460 463 460 463 478 463 c 0,134,135
+755 185 m 0,146,147
+ 755 164 755 164 740 151.5 c 128,-1,148
+ 725 139 725 139 708 139 c 0,149,150
+ 687 139 687 139 674.5 153.5 c 128,-1,151
+ 662 168 662 168 662 185 c 0,152,153
+ 662 206 662 206 676.5 219 c 128,-1,154
+ 691 232 691 232 708 232 c 0,155,156
+ 720 232 720 232 732 226 c 1,157,158
+ 755 211 755 211 755 185 c 0,146,147
+1024 148 m 256,159,160
+ 1044 148 1044 148 1057 134.5 c 128,-1,161
+ 1070 121 1070 121 1070 101 c 0,162,163
+ 1070 82 1070 82 1057 68.5 c 128,-1,164
+ 1044 55 1044 55 1024 55 c 256,165,166
+ 1004 55 1004 55 990.5 68.5 c 128,-1,167
+ 977 82 977 82 977 101 c 0,168,169
+ 977 121 977 121 990.5 134.5 c 128,-1,170
+ 1004 148 1004 148 1024 148 c 256,159,160
+1339 232 m 0,171,172
+ 1356 232 1356 232 1370.5 219.5 c 128,-1,173
+ 1385 207 1385 207 1385 186 c 0,174,175
+ 1385 168 1385 168 1372.5 153.5 c 128,-1,176
+ 1360 139 1360 139 1339 139 c 0,177,178
+ 1322 139 1322 139 1307 152 c 128,-1,179
+ 1292 165 1292 165 1292 186 c 0,180,181
+ 1292 206 1292 206 1306.5 219 c 128,-1,182
+ 1321 232 1321 232 1339 232 c 0,171,172
+1616 416 m 0,183,184
+ 1616 396 1616 396 1601.5 383 c 128,-1,185
+ 1587 370 1587 370 1569 370 c 0,186,187
+ 1549 370 1549 370 1536 384.5 c 128,-1,188
+ 1523 399 1523 399 1523 416 c 0,189,190
+ 1523 437 1523 437 1537.5 450 c 128,-1,191
+ 1552 463 1552 463 1569 463 c 0,192,193
+ 1581 463 1581 463 1593 457 c 1,194,195
+ 1616 442 1616 442 1616 416 c 0,183,184
+EndSplineSet
+EndChar
+
+StartChar: uniF8E7
+Encoding: 190 63719 45
+Width: 2048
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1024 1538 m 0,0,1
+ 1240 1538 1240 1538 1427 1430 c 128,-1,2
+ 1614 1322 1614 1322 1722 1135 c 128,-1,3
+ 1830 948 1830 948 1830 732 c 256,4,5
+ 1830 516 1830 516 1722 329 c 128,-1,6
+ 1614 142 1614 142 1427 34 c 128,-1,7
+ 1240 -74 1240 -74 1024 -74 c 0,8,9
+ 810 -74 810 -74 622.5 33.5 c 128,-1,10
+ 435 141 435 141 326 328.5 c 128,-1,11
+ 217 516 217 516 217 732 c 256,12,13
+ 217 948 217 948 326 1135.5 c 128,-1,14
+ 435 1323 435 1323 622.5 1430.5 c 128,-1,15
+ 810 1538 810 1538 1024 1538 c 0,0,1
+1024 4 m 256,16,17
+ 1220 4 1220 4 1388 101 c 128,-1,18
+ 1556 198 1556 198 1654.5 366.5 c 128,-1,19
+ 1753 535 1753 535 1753 732 c 0,20,21
+ 1753 930 1753 930 1654.5 1098 c 128,-1,22
+ 1556 1266 1556 1266 1388 1363 c 128,-1,23
+ 1220 1460 1220 1460 1024 1460 c 256,24,25
+ 828 1460 828 1460 660 1363 c 128,-1,26
+ 492 1266 492 1266 393.5 1097.5 c 128,-1,27
+ 295 929 295 929 295 732 c 0,28,29
+ 295 534 295 534 393.5 366.5 c 128,-1,30
+ 492 199 492 199 660 101.5 c 128,-1,31
+ 828 4 828 4 1024 4 c 256,16,17
+1082 841 m 1,32,33
+ 1111 824 1111 824 1129 795.5 c 128,-1,34
+ 1147 767 1147 767 1147 732 c 0,35,36
+ 1147 681 1147 681 1111 645 c 128,-1,37
+ 1075 609 1075 609 1024 609 c 0,38,39
+ 989 609 989 609 959 628 c 1,40,-1
+ 689 472 l 1,41,-1
+ 631 572 l 1,42,-1
+ 901 728 l 1,43,44
+ 901 805 901 805 966 841 c 1,45,-1
+ 966 1397 l 1,46,-1
+ 1082 1397 l 1,47,-1
+ 1082 841 l 1,32,33
+1071 732 m 256,48,49
+ 1071 752 1071 752 1056.5 765 c 128,-1,50
+ 1042 778 1042 778 1024 778 c 0,51,52
+ 1004 778 1004 778 990.5 765 c 128,-1,53
+ 977 752 977 752 977 732 c 256,54,55
+ 977 712 977 712 990.5 699 c 128,-1,56
+ 1004 686 1004 686 1024 686 c 0,57,58
+ 1042 686 1042 686 1056.5 699 c 128,-1,59
+ 1071 712 1071 712 1071 732 c 256,48,49
+1654 778 m 256,60,61
+ 1674 778 1674 778 1687.5 765 c 128,-1,62
+ 1701 752 1701 752 1701 732 c 256,63,64
+ 1701 712 1701 712 1687.5 699 c 128,-1,65
+ 1674 686 1674 686 1654 686 c 256,66,67
+ 1634 686 1634 686 1620.5 699 c 128,-1,68
+ 1607 712 1607 712 1607 732 c 256,69,70
+ 1607 752 1607 752 1620.5 765 c 128,-1,71
+ 1634 778 1634 778 1654 778 c 256,60,61
+1569 1001 m 0,72,73
+ 1552 1001 1552 1001 1537.5 1014 c 128,-1,74
+ 1523 1027 1523 1027 1523 1047 c 0,75,76
+ 1523 1065 1523 1065 1535.5 1079.5 c 128,-1,77
+ 1548 1094 1548 1094 1569 1094 c 0,78,79
+ 1587 1094 1587 1094 1601.5 1081 c 128,-1,80
+ 1616 1068 1616 1068 1616 1047 c 0,81,82
+ 1616 1028 1616 1028 1603 1014.5 c 128,-1,83
+ 1590 1001 1590 1001 1569 1001 c 0,72,73
+1385 1278 m 0,84,85
+ 1385 1257 1385 1257 1370.5 1244 c 128,-1,86
+ 1356 1231 1356 1231 1339 1231 c 0,87,88
+ 1317 1231 1317 1231 1304.5 1245.5 c 128,-1,89
+ 1292 1260 1292 1260 1292 1277 c 0,90,91
+ 1292 1297 1292 1297 1307 1310.5 c 128,-1,92
+ 1322 1324 1322 1324 1339 1324 c 0,93,94
+ 1358 1324 1358 1324 1371.5 1311 c 128,-1,95
+ 1385 1298 1385 1298 1385 1278 c 0,84,85
+708 1231 m 0,96,97
+ 691 1231 691 1231 676.5 1244.5 c 128,-1,98
+ 662 1258 662 1258 662 1279 c 0,99,100
+ 662 1296 662 1296 675 1310 c 128,-1,101
+ 688 1324 688 1324 708 1324 c 0,102,103
+ 726 1324 726 1324 740.5 1311 c 128,-1,104
+ 755 1298 755 1298 755 1278 c 0,105,106
+ 755 1257 755 1257 740.5 1244 c 128,-1,107
+ 726 1231 726 1231 708 1231 c 0,96,97
+524 1047 m 0,108,109
+ 524 1027 524 1027 509.5 1014 c 128,-1,110
+ 495 1001 495 1001 478 1001 c 0,111,112
+ 458 1001 458 1001 444.5 1015 c 128,-1,113
+ 431 1029 431 1029 431 1047 c 0,114,115
+ 431 1068 431 1068 445.5 1081 c 128,-1,116
+ 460 1094 460 1094 478 1094 c 0,117,118
+ 497 1094 497 1094 510.5 1080 c 128,-1,119
+ 524 1066 524 1066 524 1047 c 0,108,109
+393 778 m 0,120,121
+ 413 778 413 778 426.5 765 c 128,-1,122
+ 440 752 440 752 440 732 c 256,123,124
+ 440 712 440 712 426.5 699 c 128,-1,125
+ 413 686 413 686 393 686 c 0,126,127
+ 374 686 374 686 360.5 699 c 128,-1,128
+ 347 712 347 712 347 732 c 256,129,130
+ 347 752 347 752 360.5 765 c 128,-1,131
+ 374 778 374 778 393 778 c 0,120,121
+478 463 m 0,132,133
+ 496 463 496 463 510 450 c 128,-1,134
+ 524 437 524 437 524 417 c 0,135,136
+ 524 400 524 400 511.5 385 c 128,-1,137
+ 499 370 499 370 479 370 c 0,138,139
+ 460 370 460 370 445.5 383.5 c 128,-1,140
+ 431 397 431 397 431 417 c 0,141,142
+ 431 436 431 436 444.5 449.5 c 128,-1,143
+ 458 463 458 463 478 463 c 0,132,133
+755 186 m 0,144,145
+ 755 166 755 166 740.5 153 c 128,-1,146
+ 726 140 726 140 708 140 c 0,147,148
+ 688 140 688 140 675 154.5 c 128,-1,149
+ 662 169 662 169 662 186 c 0,150,151
+ 662 206 662 206 676 219 c 128,-1,152
+ 690 232 690 232 708 232 c 0,153,154
+ 729 232 729 232 742 218.5 c 128,-1,155
+ 755 205 755 205 755 186 c 0,144,145
+1024 148 m 256,156,157
+ 1044 148 1044 148 1057 134.5 c 128,-1,158
+ 1070 121 1070 121 1070 102 c 0,159,160
+ 1070 82 1070 82 1057 69 c 128,-1,161
+ 1044 56 1044 56 1024 56 c 256,162,163
+ 1004 56 1004 56 990.5 69 c 128,-1,164
+ 977 82 977 82 977 102 c 0,165,166
+ 977 121 977 121 990.5 134.5 c 128,-1,167
+ 1004 148 1004 148 1024 148 c 256,156,157
+1340 232 m 0,168,169
+ 1357 232 1357 232 1371 219.5 c 128,-1,170
+ 1385 207 1385 207 1385 186 c 0,171,172
+ 1385 169 1385 169 1372 154.5 c 128,-1,173
+ 1359 140 1359 140 1339 140 c 0,174,175
+ 1322 140 1322 140 1307 153 c 128,-1,176
+ 1292 166 1292 166 1292 187 c 0,177,178
+ 1292 207 1292 207 1307 219.5 c 128,-1,179
+ 1322 232 1322 232 1340 232 c 0,168,169
+1616 417 m 0,180,181
+ 1616 396 1616 396 1601.5 383 c 128,-1,182
+ 1587 370 1587 370 1568 370 c 0,183,184
+ 1547 370 1547 370 1535 385 c 128,-1,185
+ 1523 400 1523 400 1523 417 c 0,186,187
+ 1523 437 1523 437 1537.5 450 c 128,-1,188
+ 1552 463 1552 463 1569 463 c 0,189,190
+ 1590 463 1590 463 1603 449.5 c 128,-1,191
+ 1616 436 1616 436 1616 417 c 0,180,181
+EndSplineSet
+EndChar
+
+StartChar: carriagereturn
+Encoding: 191 8629 46
+Width: 2048
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1024 1538 m 0,0,1
+ 1240 1538 1240 1538 1427.5 1429 c 128,-1,2
+ 1615 1320 1615 1320 1722.5 1132.5 c 128,-1,3
+ 1830 945 1830 945 1830 731 c 0,4,5
+ 1830 515 1830 515 1722 328 c 128,-1,6
+ 1614 141 1614 141 1427 33 c 128,-1,7
+ 1240 -75 1240 -75 1024 -75 c 0,8,9
+ 810 -75 810 -75 622.5 32.5 c 128,-1,10
+ 435 140 435 140 326 327.5 c 128,-1,11
+ 217 515 217 515 217 731 c 0,12,13
+ 217 946 217 946 325 1134 c 128,-1,14
+ 433 1322 433 1322 621.5 1430 c 128,-1,15
+ 810 1538 810 1538 1024 1538 c 0,0,1
+1024 3 m 256,16,17
+ 1220 3 1220 3 1389 101 c 128,-1,18
+ 1558 199 1558 199 1655.5 367.5 c 128,-1,19
+ 1753 536 1753 536 1753 731 c 0,20,21
+ 1753 927 1753 927 1655 1096 c 128,-1,22
+ 1557 1265 1557 1265 1388.5 1362.5 c 128,-1,23
+ 1220 1460 1220 1460 1024 1460 c 256,24,25
+ 828 1460 828 1460 659 1362 c 128,-1,26
+ 490 1264 490 1264 392.5 1095.5 c 128,-1,27
+ 295 927 295 927 295 731 c 256,28,29
+ 295 535 295 535 393 366.5 c 128,-1,30
+ 491 198 491 198 659.5 100.5 c 128,-1,31
+ 828 3 828 3 1024 3 c 256,16,17
+1082 840 m 1,32,33
+ 1111 824 1111 824 1129 795.5 c 128,-1,34
+ 1147 767 1147 767 1147 732 c 0,35,36
+ 1147 679 1147 679 1110 643.5 c 128,-1,37
+ 1073 608 1073 608 1024 608 c 0,38,39
+ 988 608 988 608 959.5 626.5 c 128,-1,40
+ 931 645 931 645 916 674 c 1,41,-1
+ 604 674 l 1,42,-1
+ 604 790 l 1,43,-1
+ 916 790 l 1,44,45
+ 933 822 933 822 966 840 c 1,46,-1
+ 966 1396 l 1,47,-1
+ 1082 1396 l 1,48,-1
+ 1082 840 l 1,32,33
+1024 685 m 0,49,50
+ 1041 685 1041 685 1056 698.5 c 128,-1,51
+ 1071 712 1071 712 1071 731 c 256,52,53
+ 1071 750 1071 750 1057 764 c 128,-1,54
+ 1043 778 1043 778 1024 778 c 0,55,56
+ 1004 778 1004 778 990.5 764.5 c 128,-1,57
+ 977 751 977 751 977 731 c 256,58,59
+ 977 711 977 711 991 698 c 128,-1,60
+ 1005 685 1005 685 1024 685 c 0,49,50
+1654 778 m 256,61,62
+ 1674 778 1674 778 1687.5 764.5 c 128,-1,63
+ 1701 751 1701 751 1701 731 c 0,64,65
+ 1701 712 1701 712 1687.5 698.5 c 128,-1,66
+ 1674 685 1674 685 1654 685 c 256,67,68
+ 1634 685 1634 685 1620.5 698.5 c 128,-1,69
+ 1607 712 1607 712 1607 731 c 0,70,71
+ 1607 751 1607 751 1620.5 764.5 c 128,-1,72
+ 1634 778 1634 778 1654 778 c 256,61,62
+1569 1000 m 0,73,74
+ 1552 1000 1552 1000 1537.5 1013 c 128,-1,75
+ 1523 1026 1523 1026 1523 1046 c 0,76,77
+ 1523 1064 1523 1064 1536 1078.5 c 128,-1,78
+ 1549 1093 1549 1093 1569 1093 c 0,79,80
+ 1587 1093 1587 1093 1601.5 1080 c 128,-1,81
+ 1616 1067 1616 1067 1616 1047 c 0,82,83
+ 1616 1021 1616 1021 1593 1006 c 1,84,85
+ 1581 1000 1581 1000 1569 1000 c 0,73,74
+1385 1278 m 256,86,87
+ 1385 1258 1385 1258 1370.5 1244.5 c 128,-1,88
+ 1356 1231 1356 1231 1339 1231 c 0,89,90
+ 1318 1231 1318 1231 1305 1245.5 c 128,-1,91
+ 1292 1260 1292 1260 1292 1277 c 0,92,93
+ 1292 1297 1292 1297 1306.5 1310.5 c 128,-1,94
+ 1321 1324 1321 1324 1339 1324 c 0,95,96
+ 1358 1324 1358 1324 1371.5 1311 c 128,-1,97
+ 1385 1298 1385 1298 1385 1278 c 256,86,87
+709 1231 m 0,98,99
+ 690 1231 690 1231 676 1244.5 c 128,-1,100
+ 662 1258 662 1258 662 1278 c 0,101,102
+ 662 1295 662 1295 675 1309.5 c 128,-1,103
+ 688 1324 688 1324 708 1324 c 0,104,105
+ 726 1324 726 1324 740.5 1311 c 128,-1,106
+ 755 1298 755 1298 755 1277 c 0,107,108
+ 755 1257 755 1257 741 1244 c 128,-1,109
+ 727 1231 727 1231 709 1231 c 0,98,99
+524 1046 m 0,110,111
+ 524 1026 524 1026 510 1013 c 128,-1,112
+ 496 1000 496 1000 477 1000 c 0,113,114
+ 457 1000 457 1000 444 1014.5 c 128,-1,115
+ 431 1029 431 1029 431 1046 c 0,116,117
+ 431 1066 431 1066 446 1079.5 c 128,-1,118
+ 461 1093 461 1093 478 1093 c 0,119,120
+ 497 1093 497 1093 510.5 1080 c 128,-1,121
+ 524 1067 524 1067 524 1046 c 0,110,111
+393 778 m 0,122,123
+ 413 778 413 778 426.5 764.5 c 128,-1,124
+ 440 751 440 751 440 732 c 0,125,126
+ 440 712 440 712 426.5 698.5 c 128,-1,127
+ 413 685 413 685 393 685 c 0,128,129
+ 374 685 374 685 360.5 698.5 c 128,-1,130
+ 347 712 347 712 347 732 c 0,131,132
+ 347 751 347 751 360.5 764.5 c 128,-1,133
+ 374 778 374 778 393 778 c 0,122,123
+478 463 m 0,134,135
+ 495 463 495 463 509.5 450 c 128,-1,136
+ 524 437 524 437 524 416 c 0,137,138
+ 524 399 524 399 511 384.5 c 128,-1,139
+ 498 370 498 370 478 370 c 0,140,141
+ 461 370 461 370 446 383 c 128,-1,142
+ 431 396 431 396 431 417 c 0,143,144
+ 431 437 431 437 445.5 450 c 128,-1,145
+ 460 463 460 463 478 463 c 0,134,135
+755 185 m 0,146,147
+ 755 165 755 165 740.5 152 c 128,-1,148
+ 726 139 726 139 709 139 c 0,149,150
+ 689 139 689 139 675.5 153.5 c 128,-1,151
+ 662 168 662 168 662 185 c 0,152,153
+ 662 206 662 206 676.5 219 c 128,-1,154
+ 691 232 691 232 708 232 c 0,155,156
+ 720 232 720 232 732 226 c 1,157,158
+ 755 211 755 211 755 185 c 0,146,147
+1024 148 m 256,159,160
+ 1044 148 1044 148 1057 134.5 c 128,-1,161
+ 1070 121 1070 121 1070 101 c 0,162,163
+ 1070 82 1070 82 1057 68.5 c 128,-1,164
+ 1044 55 1044 55 1024 55 c 256,165,166
+ 1004 55 1004 55 990.5 68.5 c 128,-1,167
+ 977 82 977 82 977 101 c 0,168,169
+ 977 121 977 121 990.5 134.5 c 128,-1,170
+ 1004 148 1004 148 1024 148 c 256,159,160
+1339 232 m 0,171,172
+ 1356 232 1356 232 1370.5 219 c 128,-1,173
+ 1385 206 1385 206 1385 185 c 0,174,175
+ 1385 167 1385 167 1371.5 153 c 128,-1,176
+ 1358 139 1358 139 1338 139 c 0,177,178
+ 1321 139 1321 139 1306.5 152.5 c 128,-1,179
+ 1292 166 1292 166 1292 186 c 256,180,181
+ 1292 206 1292 206 1306.5 219 c 128,-1,182
+ 1321 232 1321 232 1339 232 c 0,171,172
+1616 416 m 0,183,184
+ 1616 396 1616 396 1601.5 383 c 128,-1,185
+ 1587 370 1587 370 1569 370 c 0,186,187
+ 1549 370 1549 370 1536 384.5 c 128,-1,188
+ 1523 399 1523 399 1523 416 c 0,189,190
+ 1523 437 1523 437 1537.5 450 c 128,-1,191
+ 1552 463 1552 463 1569 463 c 0,192,193
+ 1581 463 1581 463 1593 457 c 1,194,195
+ 1616 442 1616 442 1616 416 c 0,183,184
+EndSplineSet
+EndChar
+
+StartChar: aleph
+Encoding: 192 8501 47
+Width: 2048
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1024 1538 m 0,0,1
+ 1239 1538 1239 1538 1427 1430 c 128,-1,2
+ 1615 1322 1615 1322 1723 1133.5 c 128,-1,3
+ 1831 945 1831 945 1831 731 c 0,4,5
+ 1831 515 1831 515 1722 327.5 c 128,-1,6
+ 1613 140 1613 140 1425.5 32.5 c 128,-1,7
+ 1238 -75 1238 -75 1024 -75 c 256,8,9
+ 810 -75 810 -75 622.5 32.5 c 128,-1,10
+ 435 140 435 140 326 327.5 c 128,-1,11
+ 217 515 217 515 217 731 c 0,12,13
+ 217 946 217 946 325 1134 c 128,-1,14
+ 433 1322 433 1322 621.5 1430 c 128,-1,15
+ 810 1538 810 1538 1024 1538 c 0,0,1
+1024 3 m 256,16,17
+ 1220 3 1220 3 1389 101 c 128,-1,18
+ 1558 199 1558 199 1655.5 367.5 c 128,-1,19
+ 1753 536 1753 536 1753 731 c 0,20,21
+ 1753 927 1753 927 1655 1096 c 128,-1,22
+ 1557 1265 1557 1265 1388.5 1362.5 c 128,-1,23
+ 1220 1460 1220 1460 1024 1460 c 256,24,25
+ 828 1460 828 1460 659 1362 c 128,-1,26
+ 490 1264 490 1264 392.5 1095.5 c 128,-1,27
+ 295 927 295 927 295 731 c 256,28,29
+ 295 535 295 535 393 366.5 c 128,-1,30
+ 491 198 491 198 659.5 100.5 c 128,-1,31
+ 828 3 828 3 1024 3 c 256,16,17
+1082 839 m 1,32,33
+ 1111 824 1111 824 1129 795.5 c 128,-1,34
+ 1147 767 1147 767 1147 732 c 0,35,36
+ 1147 680 1147 680 1110.5 644 c 128,-1,37
+ 1074 608 1074 608 1024 608 c 0,38,39
+ 973 608 973 608 937 644 c 128,-1,40
+ 901 680 901 680 901 735 c 1,41,-1
+ 631 891 l 1,42,-1
+ 689 992 l 1,43,-1
+ 959 836 l 1,44,-1
+ 966 839 l 1,45,-1
+ 966 1396 l 1,46,-1
+ 1082 1396 l 1,47,-1
+ 1082 839 l 1,32,33
+1024 147 m 0,48,49
+ 1044 147 1044 147 1057.5 134 c 128,-1,50
+ 1071 121 1071 121 1071 101 c 0,51,52
+ 1071 82 1071 82 1057.5 68 c 128,-1,53
+ 1044 54 1044 54 1024 54 c 0,54,55
+ 1005 54 1005 54 991 68 c 128,-1,56
+ 977 82 977 82 977 101 c 0,57,58
+ 977 121 977 121 991 134 c 128,-1,59
+ 1005 147 1005 147 1024 147 c 0,48,49
+394 778 m 256,60,61
+ 414 778 414 778 427 764.5 c 128,-1,62
+ 440 751 440 751 440 731 c 0,63,64
+ 440 712 440 712 427 698.5 c 128,-1,65
+ 414 685 414 685 394 685 c 256,66,67
+ 374 685 374 685 360.5 698.5 c 128,-1,68
+ 347 712 347 712 347 731 c 0,69,70
+ 347 751 347 751 360.5 764.5 c 128,-1,71
+ 374 778 374 778 394 778 c 256,60,61
+525 1046 m 0,72,73
+ 525 1025 525 1025 510.5 1012.5 c 128,-1,74
+ 496 1000 496 1000 478 1000 c 0,75,76
+ 458 1000 458 1000 445 1014.5 c 128,-1,77
+ 432 1029 432 1029 432 1047 c 0,78,79
+ 432 1067 432 1067 446.5 1080 c 128,-1,80
+ 461 1093 461 1093 478 1093 c 0,81,82
+ 498 1093 498 1093 511.5 1078 c 128,-1,83
+ 525 1063 525 1063 525 1046 c 0,72,73
+478 463 m 0,84,85
+ 495 463 495 463 510 450.5 c 128,-1,86
+ 525 438 525 438 525 416 c 0,87,88
+ 525 399 525 399 512 384.5 c 128,-1,89
+ 499 370 499 370 478 370 c 0,90,91
+ 461 370 461 370 446.5 383 c 128,-1,92
+ 432 396 432 396 432 416 c 0,93,94
+ 432 435 432 435 445.5 449 c 128,-1,95
+ 459 463 459 463 478 463 c 0,84,85
+1024 685 m 0,96,97
+ 1042 685 1042 685 1056.5 698 c 128,-1,98
+ 1071 711 1071 711 1071 731 c 256,99,100
+ 1071 751 1071 751 1057.5 764 c 128,-1,101
+ 1044 777 1044 777 1024 777 c 256,102,103
+ 1004 777 1004 777 990.5 764 c 128,-1,104
+ 977 751 977 751 977 731 c 256,105,106
+ 977 711 977 711 991 698 c 128,-1,107
+ 1005 685 1005 685 1024 685 c 0,96,97
+755 186 m 0,108,109
+ 755 165 755 165 740.5 152 c 128,-1,110
+ 726 139 726 139 709 139 c 0,111,112
+ 688 139 688 139 675 153.5 c 128,-1,113
+ 662 168 662 168 662 185 c 0,114,115
+ 662 205 662 205 676.5 218.5 c 128,-1,116
+ 691 232 691 232 709 232 c 0,117,118
+ 728 232 728 232 741.5 219 c 128,-1,119
+ 755 206 755 206 755 186 c 0,108,109
+1570 1000 m 256,120,121
+ 1552 1000 1552 1000 1537.5 1013.5 c 128,-1,122
+ 1523 1027 1523 1027 1523 1047 c 0,123,124
+ 1523 1064 1523 1064 1536 1078.5 c 128,-1,125
+ 1549 1093 1549 1093 1570 1093 c 0,126,127
+ 1587 1093 1587 1093 1601.5 1079.5 c 128,-1,128
+ 1616 1066 1616 1066 1616 1046 c 256,129,130
+ 1616 1026 1616 1026 1602 1013 c 128,-1,131
+ 1588 1000 1588 1000 1570 1000 c 256,120,121
+1339 232 m 0,132,133
+ 1356 232 1356 232 1370.5 218.5 c 128,-1,134
+ 1385 205 1385 205 1385 185 c 0,135,136
+ 1385 168 1385 168 1372 153.5 c 128,-1,137
+ 1359 139 1359 139 1339 139 c 0,138,139
+ 1322 139 1322 139 1307 152 c 128,-1,140
+ 1292 165 1292 165 1292 186 c 0,141,142
+ 1292 206 1292 206 1306.5 219 c 128,-1,143
+ 1321 232 1321 232 1339 232 c 0,132,133
+708 1230 m 256,144,145
+ 691 1230 691 1230 676.5 1243.5 c 128,-1,146
+ 662 1257 662 1257 662 1277 c 0,147,148
+ 662 1294 662 1294 675.5 1308.5 c 128,-1,149
+ 689 1323 689 1323 709 1323 c 0,150,151
+ 726 1323 726 1323 740.5 1310 c 128,-1,152
+ 755 1297 755 1297 755 1276 c 0,153,154
+ 755 1256 755 1256 740 1243 c 128,-1,155
+ 725 1230 725 1230 708 1230 c 256,144,145
+1616 417 m 0,156,157
+ 1616 396 1616 396 1601.5 383 c 128,-1,158
+ 1587 370 1587 370 1570 370 c 0,159,160
+ 1549 370 1549 370 1536 384 c 128,-1,161
+ 1523 398 1523 398 1523 415 c 0,162,163
+ 1523 436 1523 436 1538 449 c 128,-1,164
+ 1553 462 1553 462 1571 462 c 0,165,166
+ 1590 462 1590 462 1603 449.5 c 128,-1,167
+ 1616 437 1616 437 1616 417 c 0,156,157
+1654 777 m 0,168,169
+ 1674 777 1674 777 1687.5 764 c 128,-1,170
+ 1701 751 1701 751 1701 731 c 0,171,172
+ 1701 712 1701 712 1687.5 698.5 c 128,-1,173
+ 1674 685 1674 685 1654 685 c 0,174,175
+ 1635 685 1635 685 1621.5 698.5 c 128,-1,176
+ 1608 712 1608 712 1608 731 c 0,177,178
+ 1608 751 1608 751 1621.5 764 c 128,-1,179
+ 1635 777 1635 777 1654 777 c 0,168,169
+1385 1277 m 256,180,181
+ 1385 1257 1385 1257 1370.5 1243.5 c 128,-1,182
+ 1356 1230 1356 1230 1339 1230 c 0,183,184
+ 1319 1230 1319 1230 1306 1245 c 128,-1,185
+ 1293 1260 1293 1260 1293 1277 c 0,186,187
+ 1293 1297 1293 1297 1307 1310 c 128,-1,188
+ 1321 1323 1321 1323 1338 1323 c 0,189,190
+ 1357 1323 1357 1323 1371 1310 c 128,-1,191
+ 1385 1297 1385 1297 1385 1277 c 256,180,181
+EndSplineSet
+EndChar
+
+StartChar: Ifraktur
+Encoding: 193 8465 48
+Width: 2048
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1024 1538 m 256,0,1
+ 1238 1538 1238 1538 1425.5 1430.5 c 128,-1,2
+ 1613 1323 1613 1323 1722 1135.5 c 128,-1,3
+ 1831 948 1831 948 1831 732 c 256,4,5
+ 1831 516 1831 516 1722 328.5 c 128,-1,6
+ 1613 141 1613 141 1425.5 33.5 c 128,-1,7
+ 1238 -74 1238 -74 1024 -74 c 256,8,9
+ 810 -74 810 -74 622.5 33.5 c 128,-1,10
+ 435 141 435 141 326 328.5 c 128,-1,11
+ 217 516 217 516 217 732 c 256,12,13
+ 217 948 217 948 326 1135.5 c 128,-1,14
+ 435 1323 435 1323 622.5 1430.5 c 128,-1,15
+ 810 1538 810 1538 1024 1538 c 256,0,1
+1024 3 m 256,16,17
+ 1220 3 1220 3 1389 101 c 128,-1,18
+ 1558 199 1558 199 1655.5 367.5 c 128,-1,19
+ 1753 536 1753 536 1753 732 c 256,20,21
+ 1753 928 1753 928 1655 1097 c 128,-1,22
+ 1557 1266 1557 1266 1388.5 1363.5 c 128,-1,23
+ 1220 1461 1220 1461 1024 1461 c 256,24,25
+ 828 1461 828 1461 659 1363 c 128,-1,26
+ 490 1265 490 1265 392.5 1096.5 c 128,-1,27
+ 295 928 295 928 295 732 c 256,28,29
+ 295 536 295 536 393 367 c 128,-1,30
+ 491 198 491 198 659.5 100.5 c 128,-1,31
+ 828 3 828 3 1024 3 c 256,16,17
+1082 841 m 1,32,33
+ 1111 825 1111 825 1129 796 c 128,-1,34
+ 1147 767 1147 767 1147 732 c 0,35,36
+ 1147 681 1147 681 1111 645 c 128,-1,37
+ 1075 609 1075 609 1024 609 c 256,38,39
+ 973 609 973 609 937 645 c 128,-1,40
+ 901 681 901 681 901 732 c 0,41,42
+ 901 768 901 768 919 797 c 1,43,-1
+ 764 1067 l 1,44,-1
+ 865 1125 l 1,45,-1
+ 966 949 l 1,46,-1
+ 966 1397 l 1,47,-1
+ 1082 1397 l 1,48,-1
+ 1082 841 l 1,32,33
+1024 686 m 0,49,50
+ 1047 686 1047 686 1059 701 c 128,-1,51
+ 1071 716 1071 716 1071 732 c 0,52,53
+ 1071 751 1071 751 1057.5 765 c 128,-1,54
+ 1044 779 1044 779 1024 779 c 256,55,56
+ 1004 779 1004 779 990.5 765 c 128,-1,57
+ 977 751 977 751 977 732 c 0,58,59
+ 977 711 977 711 991 698.5 c 128,-1,60
+ 1005 686 1005 686 1024 686 c 0,49,50
+1654 779 m 0,61,62
+ 1674 779 1674 779 1687.5 765 c 128,-1,63
+ 1701 751 1701 751 1701 732 c 0,64,65
+ 1701 712 1701 712 1687.5 699 c 128,-1,66
+ 1674 686 1674 686 1654 686 c 0,67,68
+ 1635 686 1635 686 1621.5 699 c 128,-1,69
+ 1608 712 1608 712 1608 732 c 0,70,71
+ 1608 751 1608 751 1621.5 765 c 128,-1,72
+ 1635 779 1635 779 1654 779 c 0,61,62
+1570 1001 m 0,73,74
+ 1553 1001 1553 1001 1538 1014 c 128,-1,75
+ 1523 1027 1523 1027 1523 1048 c 0,76,77
+ 1523 1065 1523 1065 1536.5 1079 c 128,-1,78
+ 1550 1093 1550 1093 1571 1093 c 0,79,80
+ 1588 1093 1588 1093 1602 1080 c 128,-1,81
+ 1616 1067 1616 1067 1616 1047 c 256,82,83
+ 1616 1027 1616 1027 1602 1014 c 128,-1,84
+ 1588 1001 1588 1001 1570 1001 c 0,73,74
+1385 1278 m 256,85,86
+ 1385 1258 1385 1258 1371 1244.5 c 128,-1,87
+ 1357 1231 1357 1231 1338 1231 c 0,88,89
+ 1318 1231 1318 1231 1305.5 1246 c 128,-1,90
+ 1293 1261 1293 1261 1293 1278 c 0,91,92
+ 1293 1298 1293 1298 1307.5 1311 c 128,-1,93
+ 1322 1324 1322 1324 1339 1324 c 0,94,95
+ 1358 1324 1358 1324 1371.5 1311 c 128,-1,96
+ 1385 1298 1385 1298 1385 1278 c 256,85,86
+709 1324 m 0,97,98
+ 726 1324 726 1324 740.5 1310.5 c 128,-1,99
+ 755 1297 755 1297 755 1277 c 0,100,101
+ 755 1260 755 1260 743 1245.5 c 128,-1,102
+ 731 1231 731 1231 710 1231 c 0,103,104
+ 691 1231 691 1231 676.5 1244.5 c 128,-1,105
+ 662 1258 662 1258 662 1278 c 0,106,107
+ 662 1297 662 1297 675.5 1310.5 c 128,-1,108
+ 689 1324 689 1324 709 1324 c 0,97,98
+525 1047 m 0,109,110
+ 525 1026 525 1026 510.5 1013.5 c 128,-1,111
+ 496 1001 496 1001 478 1001 c 0,112,113
+ 458 1001 458 1001 445 1015.5 c 128,-1,114
+ 432 1030 432 1030 432 1047 c 0,115,116
+ 432 1068 432 1068 446 1080.5 c 128,-1,117
+ 460 1093 460 1093 477 1093 c 0,118,119
+ 497 1093 497 1093 511 1079.5 c 128,-1,120
+ 525 1066 525 1066 525 1047 c 0,109,110
+394 779 m 256,121,122
+ 414 779 414 779 427 765.5 c 128,-1,123
+ 440 752 440 752 440 732 c 256,124,125
+ 440 712 440 712 427 699 c 128,-1,126
+ 414 686 414 686 394 686 c 256,127,128
+ 374 686 374 686 360.5 699 c 128,-1,129
+ 347 712 347 712 347 732 c 256,130,131
+ 347 752 347 752 360.5 765.5 c 128,-1,132
+ 374 779 374 779 394 779 c 256,121,122
+478 463 m 256,133,134
+ 496 463 496 463 510.5 450.5 c 128,-1,135
+ 525 438 525 438 525 417 c 0,136,137
+ 525 400 525 400 512.5 385 c 128,-1,138
+ 500 370 500 370 479 370 c 0,139,140
+ 462 370 462 370 447 383 c 128,-1,141
+ 432 396 432 396 432 417 c 0,142,143
+ 432 437 432 437 446 450 c 128,-1,144
+ 460 463 460 463 478 463 c 256,133,134
+755 187 m 0,145,146
+ 755 166 755 166 740.5 153 c 128,-1,147
+ 726 140 726 140 709 140 c 0,148,149
+ 688 140 688 140 675 154 c 128,-1,150
+ 662 168 662 168 662 185 c 0,151,152
+ 662 206 662 206 676.5 219 c 128,-1,153
+ 691 232 691 232 708 232 c 0,154,155
+ 728 232 728 232 741.5 219.5 c 128,-1,156
+ 755 207 755 207 755 187 c 0,145,146
+1024 148 m 0,157,158
+ 1044 148 1044 148 1057.5 134.5 c 128,-1,159
+ 1071 121 1071 121 1071 102 c 0,160,161
+ 1071 82 1071 82 1058 69 c 128,-1,162
+ 1045 56 1045 56 1026 56 c 0,163,164
+ 1006 56 1006 56 991.5 69 c 128,-1,165
+ 977 82 977 82 977 102 c 0,166,167
+ 977 121 977 121 991 134.5 c 128,-1,168
+ 1005 148 1005 148 1024 148 c 0,157,158
+1339 232 m 0,169,170
+ 1356 232 1356 232 1370.5 219 c 128,-1,171
+ 1385 206 1385 206 1385 185 c 0,172,173
+ 1385 168 1385 168 1372 154 c 128,-1,174
+ 1359 140 1359 140 1339 140 c 0,175,176
+ 1322 140 1322 140 1307 153 c 128,-1,177
+ 1292 166 1292 166 1292 186 c 256,178,179
+ 1292 206 1292 206 1306.5 219 c 128,-1,180
+ 1321 232 1321 232 1339 232 c 0,169,170
+1616 417 m 256,181,182
+ 1616 397 1616 397 1601 383.5 c 128,-1,183
+ 1586 370 1586 370 1569 370 c 0,184,185
+ 1548 370 1548 370 1535.5 384.5 c 128,-1,186
+ 1523 399 1523 399 1523 416 c 0,187,188
+ 1523 436 1523 436 1538 449.5 c 128,-1,189
+ 1553 463 1553 463 1570 463 c 0,190,191
+ 1589 463 1589 463 1602.5 450 c 128,-1,192
+ 1616 437 1616 437 1616 417 c 256,181,182
+EndSplineSet
+EndChar
+
+StartChar: Rfraktur
+Encoding: 194 8476 49
+Width: 2048
+Flags: W
+LayerCount: 2
+Fore
+SplineSet
+1024 1538 m 0,0,1
+ 1239 1538 1239 1538 1427 1430 c 128,-1,2
+ 1615 1322 1615 1322 1723 1133.5 c 128,-1,3
+ 1831 945 1831 945 1831 731 c 0,4,5
+ 1831 516 1831 516 1723 328 c 128,-1,6
+ 1615 140 1615 140 1426.5 32 c 128,-1,7
+ 1238 -76 1238 -76 1024 -76 c 0,8,9
+ 809 -76 809 -76 621 32 c 128,-1,10
+ 433 140 433 140 325 328.5 c 128,-1,11
+ 217 517 217 517 217 731 c 0,12,13
+ 217 946 217 946 325 1134 c 128,-1,14
+ 433 1322 433 1322 621.5 1430 c 128,-1,15
+ 810 1538 810 1538 1024 1538 c 0,0,1
+1024 2 m 256,16,17
+ 1220 2 1220 2 1389 100 c 128,-1,18
+ 1558 198 1558 198 1655.5 366.5 c 128,-1,19
+ 1753 535 1753 535 1753 731 c 256,20,21
+ 1753 927 1753 927 1655 1096 c 128,-1,22
+ 1557 1265 1557 1265 1388.5 1362.5 c 128,-1,23
+ 1220 1460 1220 1460 1024 1460 c 256,24,25
+ 828 1460 828 1460 659 1362 c 128,-1,26
+ 490 1264 490 1264 392.5 1095.5 c 128,-1,27
+ 295 927 295 927 295 731 c 256,28,29
+ 295 535 295 535 393 366 c 128,-1,30
+ 491 197 491 197 659.5 99.5 c 128,-1,31
+ 828 2 828 2 1024 2 c 256,16,17
+1099 828 m 1,32,33
+ 1147 793 1147 793 1147 731 c 0,34,35
+ 1147 680 1147 680 1111 644 c 128,-1,36
+ 1075 608 1075 608 1024 608 c 256,37,38
+ 973 608 973 608 937 644 c 128,-1,39
+ 901 680 901 680 901 731 c 0,40,41
+ 901 791 901 791 949 828 c 1,42,-1
+ 949 1162 l 1,43,-1
+ 966 1162 l 1,44,-1
+ 966 1396 l 1,45,-1
+ 1082 1396 l 1,46,-1
+ 1082 1162 l 1,47,-1
+ 1099 1162 l 1,48,-1
+ 1099 828 l 1,32,33
+977 731 m 0,49,50
+ 977 713 977 713 991 698.5 c 128,-1,51
+ 1005 684 1005 684 1024 684 c 256,52,53
+ 1043 684 1043 684 1057 697 c 128,-1,54
+ 1071 710 1071 710 1071 731 c 0,55,56
+ 1071 750 1071 750 1057.5 763.5 c 128,-1,57
+ 1044 777 1044 777 1024 777 c 0,58,59
+ 1005 777 1005 777 991 764 c 128,-1,60
+ 977 751 977 751 977 731 c 0,49,50
+1654 777 m 0,61,62
+ 1674 777 1674 777 1687.5 764 c 128,-1,63
+ 1701 751 1701 751 1701 731 c 256,64,65
+ 1701 711 1701 711 1687.5 697.5 c 128,-1,66
+ 1674 684 1674 684 1654 684 c 0,67,68
+ 1635 684 1635 684 1621.5 697.5 c 128,-1,69
+ 1608 711 1608 711 1608 731 c 256,70,71
+ 1608 751 1608 751 1621.5 764 c 128,-1,72
+ 1635 777 1635 777 1654 777 c 0,61,62
+1569 999 m 256,73,74
+ 1552 999 1552 999 1537.5 1012.5 c 128,-1,75
+ 1523 1026 1523 1026 1523 1046 c 0,76,77
+ 1523 1063 1523 1063 1536.5 1077.5 c 128,-1,78
+ 1550 1092 1550 1092 1570 1092 c 0,79,80
+ 1587 1092 1587 1092 1601.5 1079 c 128,-1,81
+ 1616 1066 1616 1066 1616 1045 c 0,82,83
+ 1616 1025 1616 1025 1601 1012 c 128,-1,84
+ 1586 999 1586 999 1569 999 c 256,73,74
+1385 1277 m 0,85,86
+ 1385 1256 1385 1256 1370.5 1243 c 128,-1,87
+ 1356 1230 1356 1230 1339 1230 c 0,88,89
+ 1319 1230 1319 1230 1306 1244 c 128,-1,90
+ 1293 1258 1293 1258 1293 1276 c 0,91,92
+ 1293 1297 1293 1297 1307 1310 c 128,-1,93
+ 1321 1323 1321 1323 1338 1323 c 0,94,95
+ 1357 1323 1357 1323 1371 1310 c 128,-1,96
+ 1385 1297 1385 1297 1385 1277 c 0,85,86
+709 1323 m 0,97,98
+ 726 1323 726 1323 740.5 1310 c 128,-1,99
+ 755 1297 755 1297 755 1276 c 0,100,101
+ 755 1259 755 1259 741.5 1244.5 c 128,-1,102
+ 728 1230 728 1230 708 1230 c 0,103,104
+ 691 1230 691 1230 676.5 1243 c 128,-1,105
+ 662 1256 662 1256 662 1277 c 0,106,107
+ 662 1297 662 1297 676.5 1310 c 128,-1,108
+ 691 1323 691 1323 709 1323 c 0,97,98
+525 1045 m 0,109,110
+ 525 1024 525 1024 510.5 1011.5 c 128,-1,111
+ 496 999 496 999 479 999 c 0,112,113
+ 459 999 459 999 445.5 1013.5 c 128,-1,114
+ 432 1028 432 1028 432 1046 c 0,115,116
+ 432 1066 432 1066 446 1079 c 128,-1,117
+ 460 1092 460 1092 477 1092 c 0,118,119
+ 489 1092 489 1092 501 1086 c 1,120,121
+ 525 1071 525 1071 525 1045 c 0,109,110
+394 777 m 256,122,123
+ 414 777 414 777 427 764 c 128,-1,124
+ 440 751 440 751 440 731 c 256,125,126
+ 440 711 440 711 427 697.5 c 128,-1,127
+ 414 684 414 684 394 684 c 256,128,129
+ 374 684 374 684 360.5 697.5 c 128,-1,130
+ 347 711 347 711 347 731 c 256,131,132
+ 347 751 347 751 360.5 764 c 128,-1,133
+ 374 777 374 777 394 777 c 256,122,123
+478 462 m 256,134,135
+ 496 462 496 462 510.5 449.5 c 128,-1,136
+ 525 437 525 437 525 416 c 0,137,138
+ 525 399 525 399 511.5 384 c 128,-1,139
+ 498 369 498 369 477 369 c 0,140,141
+ 460 369 460 369 446 382 c 128,-1,142
+ 432 395 432 395 432 416 c 0,143,144
+ 432 436 432 436 446 449 c 128,-1,145
+ 460 462 460 462 478 462 c 256,134,135
+755 186 m 0,146,147
+ 755 165 755 165 740.5 151.5 c 128,-1,148
+ 726 138 726 138 709 138 c 0,149,150
+ 689 138 689 138 675.5 152.5 c 128,-1,151
+ 662 167 662 167 662 184 c 0,152,153
+ 662 205 662 205 676.5 218 c 128,-1,154
+ 691 231 691 231 708 231 c 0,155,156
+ 728 231 728 231 741.5 218.5 c 128,-1,157
+ 755 206 755 206 755 186 c 0,146,147
+1024 147 m 0,158,159
+ 1044 147 1044 147 1057.5 134 c 128,-1,160
+ 1071 121 1071 121 1071 101 c 256,161,162
+ 1071 81 1071 81 1057.5 67.5 c 128,-1,163
+ 1044 54 1044 54 1024 54 c 0,164,165
+ 1005 54 1005 54 991 67.5 c 128,-1,166
+ 977 81 977 81 977 101 c 256,167,168
+ 977 121 977 121 991 134 c 128,-1,169
+ 1005 147 1005 147 1024 147 c 0,158,159
+1339 231 m 256,170,171
+ 1356 231 1356 231 1370.5 217.5 c 128,-1,172
+ 1385 204 1385 204 1385 184 c 0,173,174
+ 1385 167 1385 167 1372 152.5 c 128,-1,175
+ 1359 138 1359 138 1338 138 c 0,176,177
+ 1321 138 1321 138 1306.5 151.5 c 128,-1,178
+ 1292 165 1292 165 1292 186 c 0,179,180
+ 1292 206 1292 206 1307 218.5 c 128,-1,181
+ 1322 231 1322 231 1339 231 c 256,170,171
+1616 416 m 256,182,183
+ 1616 396 1616 396 1601.5 382.5 c 128,-1,184
+ 1587 369 1587 369 1570 369 c 0,185,186
+ 1550 369 1550 369 1536.5 383.5 c 128,-1,187
+ 1523 398 1523 398 1523 415 c 0,188,189
+ 1523 435 1523 435 1538 448.5 c 128,-1,190
+ 1553 462 1553 462 1570 462 c 0,191,192
+ 1589 462 1589 462 1602.5 449 c 128,-1,193
+ 1616 436 1616 436 1616 416 c 256,182,183
+EndSplineSet
+EndChar
EndChars
EndSplineFont
--
2.16.3
June 22, 2018
Re: [PATCH] d2d1: Stop redefination on older compilers
by Henri Verbeet
On 22 June 2018 at 06:30, Alistair Leslie-Hughes
<leslie_alistair(a)hotmail.com> wrote:
> Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
> ---
> dlls/d2d1/d2d1_private.h | 3 ++-
> dlls/d2d1/tests/d2d1.c | 7 ++++---
> 2 files changed, 6 insertions(+), 4 deletions(-)
>
What are you trying to fix exactly?
June 22, 2018
[PATCH] gdi32: Add a workaround for A->W text output with Symbol font encoding.
by Dmitry Timoshkov
There are 2 ways to output Ansi text:
1. Call DrawTextA/ExtTextOutA, it uses font codepage for unicode translation.
2. hfont = CreateFont("Wingdings", SYMBOL_CHARSET);
SendMessageA(hwnd, WM_SETFONT, hfont);
SendMessageA(hwnd, WM_SETTEXT, textA);
It uses current ANSI codepage for unicode translation.
Currently #1 works correctly for Symbol fonts but #2 does not. This patch
makes #2 work as well. Since this is a text drawing bug I don't see a way
of adding a test case for this behaviour.
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/gdi32/freetype.c | 48 +++++++++++++++++++++++++++++++++++-------------
1 file changed, 35 insertions(+), 13 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 1293e08a73..ba1839af82 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -6303,24 +6303,44 @@ static FT_UInt get_GSUB_vert_glyph(const GdiFont *font, UINT glyph)
return GSUB_apply_feature(header, feature, glyph);
}
+static FT_UInt get_glyph_index_symbol(const GdiFont *font, UINT glyph)
+{
+ FT_UInt ret;
+
+ if (glyph < 0x100) glyph += 0xf000;
+ /* there is a number of old pre-Unicode "broken" TTFs, which
+ do have symbols at U+00XX instead of U+f0XX */
+ if (!(ret = pFT_Get_Char_Index(font->ft_face, glyph)))
+ ret = pFT_Get_Char_Index(font->ft_face, glyph - 0xf000);
+
+ return ret;
+}
+
static FT_UInt get_glyph_index(const GdiFont *font, UINT glyph)
{
- FT_UInt glyphId;
+ FT_UInt ret;
+ WCHAR wc;
+ char buf;
if(font->ft_face->charmap->encoding == FT_ENCODING_NONE) {
- WCHAR wc = (WCHAR)glyph;
BOOL default_used;
BOOL *default_used_pointer;
- FT_UInt ret;
- char buf;
default_used_pointer = NULL;
default_used = FALSE;
if (codepage_sets_default_used(font->codepage))
default_used_pointer = &default_used;
+ wc = (WCHAR)glyph;
if(!WideCharToMultiByte(font->codepage, 0, &wc, 1, &buf, sizeof(buf), NULL, default_used_pointer) || default_used)
{
- if (font->codepage == CP_SYMBOL && wc < 0x100)
- ret = pFT_Get_Char_Index(font->ft_face, (unsigned char)wc);
+ if (font->codepage == CP_SYMBOL)
+ {
+ ret = get_glyph_index_symbol(font, glyph);
+ if (!ret)
+ {
+ if (WideCharToMultiByte(CP_ACP, 0, &wc, 1, &buf, 1, NULL, NULL))
+ ret = get_glyph_index_symbol(font, buf);
+ }
+ }
else
ret = 0;
}
@@ -6332,15 +6352,17 @@ static FT_UInt get_glyph_index(const GdiFont *font, UINT glyph)
if(font->ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL)
{
- if (glyph < 0x100) glyph += 0xf000;
- /* there is a number of old pre-Unicode "broken" TTFs, which
- do have symbols at U+00XX instead of U+f0XX */
- if (!(glyphId = pFT_Get_Char_Index(font->ft_face, glyph)))
- glyphId = pFT_Get_Char_Index(font->ft_face, glyph-0xf000);
+ ret = get_glyph_index_symbol(font, glyph);
+ if (!ret)
+ {
+ wc = (WCHAR)glyph;
+ if (WideCharToMultiByte(CP_ACP, 0, &wc, 1, &buf, 1, NULL, NULL))
+ ret = get_glyph_index_symbol(font, (unsigned char)buf);
+ }
+ return ret;
}
- else glyphId = pFT_Get_Char_Index(font->ft_face, glyph);
- return glyphId;
+ return pFT_Get_Char_Index(font->ft_face, glyph);
}
/* helper for freetype_GetGlyphIndices */
--
2.16.3
June 22, 2018
[PATCH] d2d1: Stop redefination on older compilers
by Alistair Leslie-Hughes
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/d2d1/d2d1_private.h | 3 ++-
dlls/d2d1/tests/d2d1.c | 7 ++++---
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index d754e85..2281eef 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -25,11 +25,12 @@
#include <assert.h>
#include <limits.h>
#define COBJMACROS
-#include "d2d1_1.h"
+
#ifdef D2D1_INIT_GUID
#include "initguid.h"
#endif
#include "dwrite_2.h"
+#include "d2d1_1.h"
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 26c81e6..e89d0e9 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -19,12 +19,13 @@
#define COBJMACROS
#include <limits.h>
#include <math.h>
-#include "d2d1_1.h"
-#include "wincrypt.h"
-#include "wine/test.h"
#include "initguid.h"
#include "dwrite.h"
+#include "d2d1_1.h"
#include "wincodec.h"
+#include "wincrypt.h"
+
+#include "wine/test.h"
struct resource_readback
{
--
1.9.1
June 22, 2018
[v2 PATCH] ntdll: Implement LdrRegisterDllNotification and LdrUnregisterDllNotification.
by Alistair Leslie-Hughes
From: Michael Müller <michael(a)fds-team.de>
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/ntdll/loader.c | 77 ++++++++++++++-
dlls/ntdll/tests/rtl.c | 261 +++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 334 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 3e00ec6..df206e8 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -40,6 +40,7 @@
#include "wine/library.h"
#include "wine/unicode.h"
#include "wine/debug.h"
+#include "wine/list.h"
#include "wine/server.h"
#include "ntdll_misc.h"
#include "ddk/wdm.h"
@@ -71,6 +72,15 @@ static BOOL imports_fixup_done = FALSE; /* set once the imports have been fixed
static BOOL process_detaching = FALSE; /* set on process detach to avoid deadlocks with thread detach */
static int free_lib_count; /* recursion depth of LdrUnloadDll calls */
+struct ldr_notification
+{
+ struct list entry;
+ PLDR_DLL_NOTIFICATION_FUNCTION callback;
+ void *context;
+};
+
+static struct list ldr_notifications = LIST_INIT( ldr_notifications );
+
static const char * const reason_names[] =
{
"PROCESS_DETACH",
@@ -342,6 +352,29 @@ static ULONG_PTR allocate_stub( const char *dll, const char *name )
static inline ULONG_PTR allocate_stub( const char *dll, const char *name ) { return 0xdeadbeef; }
#endif /* __i386__ */
+/* call ldr notifications */
+static void call_ldr_notifications( ULONG reason, LDR_MODULE *module )
+{
+ struct ldr_notification *notify, *notify_next;
+ LDR_DLL_NOTIFICATION_DATA data;
+
+ data.Loaded.Flags = 0;
+ data.Loaded.FullDllName = &module->FullDllName;
+ data.Loaded.BaseDllName = &module->BaseDllName;
+ data.Loaded.DllBase = module->BaseAddress;
+ data.Loaded.SizeOfImage = module->SizeOfImage;
+
+ LIST_FOR_EACH_ENTRY_SAFE( notify, notify_next, &ldr_notifications, struct ldr_notification, entry )
+ {
+ TRACE_(relay)("\1Call LDR notification callback (proc=%p,reason=%u,data=%p,context=%p)\n",
+ notify->callback, reason, &data, notify->context );
+
+ notify->callback(reason, &data, notify->context);
+
+ TRACE_(relay)("\1Ret LDR notification callback (proc=%p,reason=%u,data=%p,context=%p)\n",
+ notify->callback, reason, &data, notify->context );
+ }
+}
/*************************************************************************
* get_modref
@@ -1275,12 +1308,18 @@ static NTSTATUS process_attach( WINE_MODREF *wm, LPVOID lpReserved )
{
WINE_MODREF *prev = current_modref;
current_modref = wm;
+
+ call_ldr_notifications( LDR_DLL_NOTIFICATION_REASON_LOADED, &wm->ldr );
status = MODULE_InitDLL( wm, DLL_PROCESS_ATTACH, lpReserved );
if (status == STATUS_SUCCESS)
+ {
wm->ldr.Flags |= LDR_PROCESS_ATTACHED;
+ }
else
{
MODULE_InitDLL( wm, DLL_PROCESS_DETACH, lpReserved );
+ call_ldr_notifications( LDR_DLL_NOTIFICATION_REASON_UNLOADED, &wm->ldr );
+
/* point to the name so LdrInitializeThunk can print it */
last_failed_modref = wm;
WARN("Initialization of %s failed\n", debugstr_w(wm->ldr.BaseDllName.Buffer));
@@ -1353,6 +1392,7 @@ static void process_detach(void)
mod->Flags &= ~LDR_PROCESS_ATTACHED;
MODULE_InitDLL( CONTAINING_RECORD(mod, WINE_MODREF, ldr),
DLL_PROCESS_DETACH, ULongToPtr(process_detaching) );
+ call_ldr_notifications( LDR_DLL_NOTIFICATION_REASON_UNLOADED, mod );
/* Restart at head of WINE_MODREF list, as entries might have
been added and/or removed while performing the call ... */
@@ -1467,8 +1507,27 @@ NTSTATUS WINAPI LdrEnumerateLoadedModules( void *unknown, LDRENUMPROC callback,
NTSTATUS WINAPI LdrRegisterDllNotification(ULONG flags, PLDR_DLL_NOTIFICATION_FUNCTION callback,
void *context, void **cookie)
{
- FIXME( "(%04x, %p, %p, %p) stub\n", flags, callback, context, cookie );
- return STATUS_NOT_IMPLEMENTED;
+ struct ldr_notification *notify;
+
+ TRACE( "(%x, %p, %p, %p)\n", flags, callback, context, cookie );
+
+ if (!callback || !cookie)
+ return STATUS_INVALID_PARAMETER;
+
+ if (flags)
+ FIXME( "ignoring flags %x\n", flags );
+
+ notify = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(*notify) );
+ if (!notify) return STATUS_NO_MEMORY;
+ notify->callback = callback;
+ notify->context = context;
+
+ RtlEnterCriticalSection( &loader_section );
+ list_add_tail( &ldr_notifications, ¬ify->entry );
+ RtlLeaveCriticalSection( &loader_section );
+
+ *cookie = notify;
+ return STATUS_SUCCESS;
}
/******************************************************************
@@ -1476,8 +1535,18 @@ NTSTATUS WINAPI LdrRegisterDllNotification(ULONG flags, PLDR_DLL_NOTIFICATION_FU
*/
NTSTATUS WINAPI LdrUnregisterDllNotification( void *cookie )
{
- FIXME( "(%p) stub\n", cookie );
- return STATUS_NOT_IMPLEMENTED;
+ struct ldr_notification *notify = cookie;
+
+ TRACE( "(%p)\n", cookie );
+
+ if (!notify) return STATUS_INVALID_PARAMETER;
+
+ RtlEnterCriticalSection( &loader_section );
+ list_remove( ¬ify->entry );
+ RtlLeaveCriticalSection( &loader_section );
+
+ RtlFreeHeap( GetProcessHeap(), 0, notify );
+ return STATUS_SUCCESS;
}
/******************************************************************
diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c
index e202408..881bc1a 100644
--- a/dlls/ntdll/tests/rtl.c
+++ b/dlls/ntdll/tests/rtl.c
@@ -101,6 +101,8 @@ static NTSTATUS (WINAPI *pRtlInitializeCriticalSectionEx)(CRITICAL_SECTION *, U
static NTSTATUS (WINAPI *pLdrEnumerateLoadedModules)(void *, void *, void *);
static NTSTATUS (WINAPI *pRtlMakeSelfRelativeSD)(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,LPDWORD);
static NTSTATUS (WINAPI *pRtlAbsoluteToSelfRelativeSD)(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,PULONG);
+static NTSTATUS (WINAPI *pLdrRegisterDllNotification)(ULONG, PLDR_DLL_NOTIFICATION_FUNCTION, void *, void **);
+static NTSTATUS (WINAPI *pLdrUnregisterDllNotification)(void *);
static HMODULE hkernel32 = 0;
static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
@@ -108,10 +110,15 @@ static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
#define LEN 16
static const char* src_src = "This is a test!"; /* 16 bytes long, incl NUL */
+static WCHAR ws2_32dllW[] = {'w','s','2','_','3','2','.','d','l','l',0};
+static WCHAR nsidllW[] = {'n','s','i','.','d','l','l',0};
+static WCHAR wintrustdllW[] = {'w','i','n','t','r','u','s','t','.','d','l','l',0};
+static WCHAR crypt32dllW[] = {'c','r','y','p','t','3','2','.','d','l','l',0};
static ULONG src_aligned_block[4];
static ULONG dest_aligned_block[32];
static const char *src = (const char*)src_aligned_block;
static char* dest = (char*)dest_aligned_block;
+const WCHAR *expected_dll = nsidllW;
static void InitFunctionPtrs(void)
{
@@ -157,6 +164,8 @@ static void InitFunctionPtrs(void)
pLdrEnumerateLoadedModules = (void *)GetProcAddress(hntdll, "LdrEnumerateLoadedModules");
pRtlMakeSelfRelativeSD = (void *)GetProcAddress(hntdll, "RtlMakeSelfRelativeSD");
pRtlAbsoluteToSelfRelativeSD = (void *)GetProcAddress(hntdll, "RtlAbsoluteToSelfRelativeSD");
+ pLdrRegisterDllNotification = (void *)GetProcAddress(hntdll, "LdrRegisterDllNotification");
+ pLdrUnregisterDllNotification = (void *)GetProcAddress(hntdll, "LdrUnregisterDllNotification");
}
hkernel32 = LoadLibraryA("kernel32.dll");
ok(hkernel32 != 0, "LoadLibrary failed\n");
@@ -2257,6 +2266,257 @@ static void test_RtlMakeSelfRelativeSD(void)
ok( status == STATUS_BAD_DESCRIPTOR_FORMAT, "got %08x\n", status );
}
+static DWORD (CALLBACK *orig_entry)(HMODULE,DWORD,LPVOID);
+static DWORD *dll_main_data;
+
+static inline void *get_rva( HMODULE module, DWORD va )
+{
+ return (void *)((char *)module + va);
+}
+
+static void CALLBACK ldr_notify_callback1(ULONG reason, LDR_DLL_NOTIFICATION_DATA *data, void *context)
+{
+ const IMAGE_IMPORT_DESCRIPTOR *imports;
+ const IMAGE_THUNK_DATA *import_list;
+ IMAGE_THUNK_DATA *thunk_list;
+ DWORD *calls = context;
+ LIST_ENTRY *mark;
+ LDR_MODULE *mod;
+ ULONG size;
+ int i, j;
+
+ *calls <<= 4;
+ *calls |= reason;
+
+ if (!lstrcmpiW(data->Loaded.BaseDllName->Buffer, expected_dll))
+ return;
+
+ ok(data->Loaded.Flags == 0, "Expected flags 0, got %x\n", data->Loaded.Flags);
+ ok(!lstrcmpiW(data->Loaded.BaseDllName->Buffer, expected_dll), "Expected %s, got %s\n",
+ wine_dbgstr_w(expected_dll), wine_dbgstr_w(data->Loaded.BaseDllName->Buffer));
+ ok(!!data->Loaded.DllBase, "Expected non zero base address\n");
+ ok(data->Loaded.SizeOfImage, "Expected non zero image size\n");
+
+ /* expect module to be last module listed in LdrData load order list */
+ mark = &NtCurrentTeb()->Peb->LdrData->InMemoryOrderModuleList;
+ mod = CONTAINING_RECORD(mark->Blink, LDR_MODULE, InMemoryOrderModuleList);
+ ok(mod->BaseAddress == data->Loaded.DllBase, "Expected base address %p, got %p\n",
+ data->Loaded.DllBase, mod->BaseAddress);
+ ok(!lstrcmpiW(mod->BaseDllName.Buffer, expected_dll), "Expected %s, got %s\n",
+ wine_dbgstr_w(expected_dll), wine_dbgstr_w(mod->BaseDllName.Buffer));
+
+ /* show that imports have already been resolved */
+ imports = RtlImageDirectoryEntryToData(data->Loaded.DllBase, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &size);
+ ok(!!imports, "Expected dll to have imports\n");
+
+ for (i = 0; imports[i].Name; i++)
+ {
+ thunk_list = get_rva(data->Loaded.DllBase, (DWORD)imports[i].FirstThunk);
+ if (imports[i].OriginalFirstThunk)
+ import_list = get_rva(data->Loaded.DllBase, (DWORD)imports[i].OriginalFirstThunk);
+ else
+ import_list = thunk_list;
+
+ for (j = 0; import_list[j].u1.Ordinal; j++)
+ {
+ ok(thunk_list[j].u1.AddressOfData > data->Loaded.SizeOfImage,
+ "Import has not been resolved: %p\n", (void*)thunk_list[j].u1.Function);
+ }
+ }
+}
+
+static void CALLBACK ldr_notify_callback2(ULONG reason, LDR_DLL_NOTIFICATION_DATA *data, void *context)
+{
+ DWORD *calls = context;
+ *calls <<= 4;
+ *calls |= reason + 2;
+}
+
+static BOOL WINAPI fake_dll_main(HINSTANCE instance, DWORD reason, void* reserved)
+{
+ if (reason == DLL_PROCESS_ATTACH)
+ {
+ *dll_main_data <<= 4;
+ *dll_main_data |= 3;
+ }
+ else if (reason == DLL_PROCESS_DETACH)
+ {
+ *dll_main_data <<= 4;
+ *dll_main_data |= 4;
+ }
+ return orig_entry(instance, reason, reserved);
+}
+
+static void CALLBACK ldr_notify_callback_dll_main(ULONG reason, LDR_DLL_NOTIFICATION_DATA *data, void *context)
+{
+ DWORD *calls = context;
+ LIST_ENTRY *mark;
+ LDR_MODULE *mod;
+
+ *calls <<= 4;
+ *calls |= reason;
+
+ if (reason != LDR_DLL_NOTIFICATION_REASON_LOADED)
+ return;
+
+ mark = &NtCurrentTeb()->Peb->LdrData->InMemoryOrderModuleList;
+ mod = CONTAINING_RECORD(mark->Blink, LDR_MODULE, InMemoryOrderModuleList);
+ ok(mod->BaseAddress == data->Loaded.DllBase, "Expected base address %p, got %p\n",
+ data->Loaded.DllBase, mod->BaseAddress);
+ if (mod->BaseAddress != data->Loaded.DllBase)
+ return;
+
+ orig_entry = mod->EntryPoint;
+ mod->EntryPoint = fake_dll_main;
+ dll_main_data = calls;
+}
+
+static BOOL WINAPI fake_dll_main_fail(HINSTANCE instance, DWORD reason, void* reserved)
+{
+ if (reason == DLL_PROCESS_ATTACH)
+ {
+ *dll_main_data <<= 4;
+ *dll_main_data |= 3;
+ }
+ else if (reason == DLL_PROCESS_DETACH)
+ {
+ *dll_main_data <<= 4;
+ *dll_main_data |= 4;
+ }
+ return FALSE;
+}
+
+static void CALLBACK ldr_notify_callback_fail(ULONG reason, LDR_DLL_NOTIFICATION_DATA *data, void *context)
+{
+ DWORD *calls = context;
+ LIST_ENTRY *mark;
+ LDR_MODULE *mod;
+
+ *calls <<= 4;
+ *calls |= reason;
+
+ if (reason != LDR_DLL_NOTIFICATION_REASON_LOADED)
+ return;
+
+ mark = &NtCurrentTeb()->Peb->LdrData->InMemoryOrderModuleList;
+ mod = CONTAINING_RECORD(mark->Blink, LDR_MODULE, InMemoryOrderModuleList);
+ ok(mod->BaseAddress == data->Loaded.DllBase, "Expected base address %p, got %p\n",
+ data->Loaded.DllBase, mod->BaseAddress);
+ if (mod->BaseAddress != data->Loaded.DllBase)
+ return;
+
+ orig_entry = mod->EntryPoint;
+ mod->EntryPoint = fake_dll_main_fail;
+ dll_main_data = calls;
+}
+
+static void CALLBACK ldr_notify_callback_imports(ULONG reason, LDR_DLL_NOTIFICATION_DATA *data, void *context)
+{
+ DWORD *calls = context;
+
+ if (reason != LDR_DLL_NOTIFICATION_REASON_LOADED)
+ return;
+
+ if (!lstrcmpiW(data->Loaded.BaseDllName->Buffer, crypt32dllW))
+ {
+ *calls <<= 4;
+ *calls |= 1;
+ }
+
+ if (!lstrcmpiW(data->Loaded.BaseDllName->Buffer, wintrustdllW))
+ {
+ *calls <<= 4;
+ *calls |= 2;
+ }
+}
+
+static void test_LdrRegisterDllNotification(void)
+{
+ void *cookie, *cookie2;
+ NTSTATUS status;
+ HMODULE mod;
+ DWORD calls;
+
+ if (!pLdrRegisterDllNotification || !pLdrUnregisterDllNotification)
+ {
+ win_skip("Ldr(Un)RegisterDllNotification not available\n");
+ return;
+ }
+
+ mod = LoadLibraryW(expected_dll);
+ if(mod)
+ FreeLibrary(mod);
+ else
+ expected_dll = ws2_32dllW; /* XP Default */
+
+ /* generic test */
+ status = pLdrRegisterDllNotification(0, ldr_notify_callback1, &calls, &cookie);
+ ok(!status, "Expected STATUS_SUCCESS, got %08x\n", status);
+
+ calls = 0;
+ mod = LoadLibraryW(expected_dll);
+ ok(!!mod, "Failed to load library: %d\n", GetLastError());
+ ok(calls == LDR_DLL_NOTIFICATION_REASON_LOADED, "Expected LDR_DLL_NOTIFICATION_REASON_LOADED, got %x\n", calls);
+
+ calls = 0;
+ FreeLibrary(mod);
+ ok(calls == LDR_DLL_NOTIFICATION_REASON_UNLOADED, "Expected LDR_DLL_NOTIFICATION_REASON_UNLOADED, got %x\n", calls);
+
+ /* test order of callbacks */
+ status = pLdrRegisterDllNotification(0, ldr_notify_callback2, &calls, &cookie2);
+ ok(!status, "Expected STATUS_SUCCESS, got %08x\n", status);
+
+ calls = 0;
+ mod = LoadLibraryW(expected_dll);
+ ok(!!mod, "Failed to load library: %d\n", GetLastError());
+ ok(calls == 0x13, "Expected order 0x13, got %x\n", calls);
+
+ calls = 0;
+ FreeLibrary(mod);
+ ok(calls == 0x24, "Expected order 0x24, got %x\n", calls);
+
+ pLdrUnregisterDllNotification(cookie2);
+ pLdrUnregisterDllNotification(cookie);
+
+ /* test dll main order */
+ status = pLdrRegisterDllNotification(0, ldr_notify_callback_dll_main, &calls, &cookie);
+ ok(!status, "Expected STATUS_SUCCESS, got %08x\n", status);
+
+ calls = 0;
+ mod = LoadLibraryW(expected_dll);
+ ok(!!mod, "Failed to load library: %d\n", GetLastError());
+ ok(calls == 0x13, "Expected order 0x13, got %x\n", calls);
+
+ calls = 0;
+ FreeLibrary(mod);
+ ok(calls == 0x42, "Expected order 0x42, got %x\n", calls);
+
+ pLdrUnregisterDllNotification(cookie);
+
+ /* test dll main order */
+ status = pLdrRegisterDllNotification(0, ldr_notify_callback_fail, &calls, &cookie);
+ ok(!status, "Expected STATUS_SUCCESS, got %08x\n", status);
+
+ calls = 0;
+ mod = LoadLibraryW(expected_dll);
+ ok(!mod, "Expected library to fail loading\n");
+ ok(calls == 0x1342, "Expected order 0x1342, got %x\n", calls);
+
+ pLdrUnregisterDllNotification(cookie);
+
+ /* test dll with dependencies */
+ status = pLdrRegisterDllNotification(0, ldr_notify_callback_imports, &calls, &cookie);
+ ok(!status, "Expected STATUS_SUCCESS, got %08x\n", status);
+
+ calls = 0;
+ mod = LoadLibraryW(wintrustdllW);
+ ok(!!mod, "Failed to load library: %d\n", GetLastError());
+ ok(calls == 0x12 || calls == 0x21, "got %x\n", calls);
+
+ FreeLibrary(mod);
+ pLdrUnregisterDllNotification(cookie);
+}
+
START_TEST(rtl)
{
InitFunctionPtrs();
@@ -2291,4 +2551,5 @@ START_TEST(rtl)
test_RtlLeaveCriticalSection();
test_LdrEnumerateLoadedModules();
test_RtlMakeSelfRelativeSD();
+ test_LdrRegisterDllNotification();
}
--
1.9.1
June 22, 2018
[PATCH 4/4] winemac.drv: Implement waking up the display when activity occurs.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/winemac.drv/macdrv_main.c | 12 ++++++++++++
dlls/winemac.drv/winemac.drv.spec | 3 +++
2 files changed, 15 insertions(+)
diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c
index 491ab06..1e76d94 100644
--- a/dlls/winemac.drv/macdrv_main.c
+++ b/dlls/winemac.drv/macdrv_main.c
@@ -451,3 +451,15 @@ BOOL CDECL macdrv_SystemParametersInfo( UINT action, UINT int_param, void *ptr_p
}
return FALSE;
}
+
+/***********************************************************************
+ * wine_notify_activity (X11DRV.@)
+ *
+ * Notify the display server that activity has occurred, e.g. to wake up
+ * the display and reset any power management related timeouts.
+ */
+void CDECL macdrv_notify_activity(void)
+{
+ static IOPMAssertionID assertion;
+ IOPMAssertionDeclareUserActivity("Wine user input", kIOPMUserActiveLocal, &assertion);
+}
diff --git a/dlls/winemac.drv/winemac.drv.spec b/dlls/winemac.drv/winemac.drv.spec
index 6fa723a..9658fad 100644
--- a/dlls/winemac.drv/winemac.drv.spec
+++ b/dlls/winemac.drv/winemac.drv.spec
@@ -45,6 +45,9 @@
@ cdecl WindowPosChanged(long long long ptr ptr ptr ptr ptr) macdrv_WindowPosChanged
@ cdecl WindowPosChanging(long long long ptr ptr ptr ptr) macdrv_WindowPosChanging
+# Desktop
+@ cdecl wine_notify_activity() macdrv_notify_activity
+
# System tray
@ cdecl wine_notify_icon(long ptr)
--
2.7.4
June 21, 2018
[PATCH 3/4] winex11.drv: Implement waking up the display when activity occurs.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/winex11.drv/winex11.drv.spec | 1 +
dlls/winex11.drv/x11drv_main.c | 12 ++++++++++++
2 files changed, 13 insertions(+)
diff --git a/dlls/winex11.drv/winex11.drv.spec b/dlls/winex11.drv/winex11.drv.spec
index 614f0b9..c833edb 100644
--- a/dlls/winex11.drv/winex11.drv.spec
+++ b/dlls/winex11.drv/winex11.drv.spec
@@ -57,6 +57,7 @@
# Desktop
@ cdecl wine_create_desktop(long long) X11DRV_create_desktop
+@ cdecl wine_notify_activity() X11DRV_notify_activity
# System tray
@ cdecl wine_notify_icon(long ptr)
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 4654556..0dbd4f6 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -739,3 +739,15 @@ BOOL CDECL X11DRV_SystemParametersInfo( UINT action, UINT int_param, void *ptr_p
}
return FALSE; /* let user32 handle it */
}
+
+/***********************************************************************
+ * wine_notify_activity (X11DRV.@)
+ *
+ * Notify the display server that activity has occurred, e.g. to wake up
+ * the display and reset any power management related timeouts.
+ */
+void CDECL X11DRV_notify_activity(void)
+{
+ XResetScreenSaver( gdi_display );
+ XFlush( gdi_display );
+}
--
2.7.4
June 21, 2018
[PATCH 2/4] dinput: Notify the desktop window when device input is received.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
The overall goal of this patchset is to avoid letting the system go to sleep
when a joystick is being used. On Windows, receiving input from a joystick
which is currently being read by dinput can be easily shown to reset the
system idle timer.
dlls/dinput/device.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 7b83a39..fc43fb5 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -39,6 +39,8 @@
#include "device_private.h"
#include "dinput_private.h"
+#define WM_WINE_NOTIFY_ACTIVITY WM_USER
+
WINE_DEFAULT_DEBUG_CHANNEL(dinput);
static inline IDirectInputDeviceImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface)
@@ -968,6 +970,8 @@ void queue_event(LPDIRECTINPUTDEVICE8A iface, int inst_id, DWORD data, DWORD tim
}
}
+ SendMessageW(GetDesktopWindow(), WM_WINE_NOTIFY_ACTIVITY, 0, 0);
+
This->queue_head = next_pos;
/* Send event if asked */
}
--
2.7.4
June 21, 2018
[PATCH 1/4] explorer: Add a private message to notify the graphics driver when activity occurs.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
programs/explorer/desktop.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c
index a2d9e1a..f5a01c2 100644
--- a/programs/explorer/desktop.c
+++ b/programs/explorer/desktop.c
@@ -46,6 +46,10 @@ static const WCHAR default_driver[] = {'m','a','c',',','x','1','1',0};
static const WCHAR default_driver[] = {'x','1','1',0};
#endif
+static void (CDECL *wine_notify_activity)(void);
+
+#define WM_WINE_NOTIFY_ACTIVITY WM_USER
+
static BOOL using_root;
struct launcher
@@ -661,6 +665,11 @@ static LRESULT WINAPI desktop_wnd_proc( HWND hwnd, UINT message, WPARAM wp, LPAR
}
return 0;
+ case WM_WINE_NOTIFY_ACTIVITY:
+ if (wine_notify_activity)
+ wine_notify_activity();
+ return 0;
+
default:
return DefWindowProcW( hwnd, message, wp, lp );
}
@@ -1005,6 +1014,8 @@ void manage_desktop( WCHAR *arg )
{
pShellDDEInit( TRUE );
}
+
+ wine_notify_activity = (void *)GetProcAddress( graphics_driver, "wine_notify_activity" );
}
}
--
2.7.4
June 21, 2018
[PATCH 1/1] wsdapi/tests: Add tests for MatchProbeEx.
by Owen Rudge
Signed-off-by: Owen Rudge <orudge(a)codeweavers.com>
---
dlls/wsdapi/tests/discovery.c | 194
+++++++++++++++++++++++++++++++++++++++++-
1 file changed, 193 insertions(+), 1 deletion(-)
June 21, 2018
Re: [PATCH 1/2] ntdll/tests: Use the available ARRAY_SIZE() macro
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39291
Your paranoid android.
=== w2008s64 (32 bit threadpool) ===
TestBot process got stuck or died unexpectedly
The previous 1 run(s) terminated abnormally
=== wvistau64 (32 bit info) ===
info.c:1792: Test failed: Expected STATUS_SUCCESS, got c0000022
0890:info: unhandled exception c0000005 at 00340000
=== wvistau64_zh_CN (32 bit info) ===
info.c:1792: Test failed: Expected STATUS_SUCCESS, got c0000022
0bb8:info: unhandled exception c0000005 at 00370000
=== wvistau64_fr (32 bit info) ===
info.c:1792: Test failed: Expected STATUS_SUCCESS, got c0000022
072c:info: unhandled exception c0000005 at 00340000
=== wvistau64_he (32 bit info) ===
info.c:1792: Test failed: Expected STATUS_SUCCESS, got c0000022
0bd8:info: unhandled exception c0000005 at 002C0000
=== w2008s64 (32 bit info) ===
info.c:1792: Test failed: Expected STATUS_SUCCESS, got c0000022
0870:info: unhandled exception c0000005 at 003D0000
=== w7u (32 bit info) ===
info.c:1792: Test failed: Expected STATUS_SUCCESS, got c0000022
=== w7pro64 (32 bit info) ===
info.c:1792: Test failed: Expected STATUS_SUCCESS, got c0000022
0af4:info: unhandled exception c0000005 at 00350000
=== w8 (32 bit info) ===
info.c:1792: Test failed: Expected STATUS_SUCCESS, got c0000022
0f84:info: unhandled exception c0000005 at 00310000
=== w864 (32 bit info) ===
info.c:1792: Test failed: Expected STATUS_SUCCESS, got c0000022
0d00:info: unhandled exception c0000005 at 00350000
=== w1064 (32 bit info) ===
info.c:1792: Test failed: Expected STATUS_SUCCESS, got c0000022
0db8:info: unhandled exception c0000005 at 002D0000
June 21, 2018
[PATCH 2/2] ntdll/tests: Avoid ARRAY_SIZE-like macros
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/ntdll/tests/large_int.c | 8 +++-----
dlls/ntdll/tests/rtl.c | 6 ++----
dlls/ntdll/tests/rtlstr.c | 31 +++++++++++--------------------
dlls/ntdll/tests/string.c | 24 ++++++++++--------------
4 files changed, 26 insertions(+), 43 deletions(-)
diff --git a/dlls/ntdll/tests/large_int.c b/dlls/ntdll/tests/large_int.c
index da7afa4f25..c980aebe5d 100644
--- a/dlls/ntdll/tests/large_int.c
+++ b/dlls/ntdll/tests/large_int.c
@@ -102,7 +102,6 @@ static const magic_divide_t magic_divide[] = {
{ ULL(0x74ae3b5f,0x1558c800), ULL(0x2f1e28fd,0x1b5cca00), 41, 0xabcde},
};
-#define NB_MAGIC_DIVIDE (sizeof(magic_divide)/sizeof(*magic_divide))
static void test_RtlExtendedMagicDivide(void)
@@ -110,7 +109,7 @@ static void test_RtlExtendedMagicDivide(void)
int i;
LONGLONG result;
- for (i = 0; i < NB_MAGIC_DIVIDE; i++) {
+ for (i = 0; i < ARRAY_SIZE(magic_divide); i++) {
result = pRtlExtendedMagicDivide(magic_divide[i].a, magic_divide[i].b, magic_divide[i].shift);
ok(result == magic_divide[i].result,
"call failed: RtlExtendedMagicDivide(0x%s, 0x%s, %d) has result 0x%s, expected 0x%s\n",
@@ -271,7 +270,6 @@ static const largeint2str_t largeint2str[] = {
{20, 0xdeadbeef, 0, 9, "-------------------------------------------------------------------", STATUS_INVALID_PARAMETER},
{-8, 07654321, 0, 12, "-------------------------------------------------------------------", STATUS_INVALID_PARAMETER},
};
-#define NB_LARGEINT2STR (sizeof(largeint2str)/sizeof(*largeint2str))
static void one_RtlInt64ToUnicodeString_test(int test_num, const largeint2str_t *largeint2str)
@@ -360,7 +358,7 @@ static void test_RtlInt64ToUnicodeString(void)
{
int test_num;
- for (test_num = 0; test_num < NB_LARGEINT2STR; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(largeint2str); test_num++) {
one_RtlInt64ToUnicodeString_test(test_num, &largeint2str[test_num]);
} /* for */
}
@@ -405,7 +403,7 @@ static void test_RtlLargeIntegerToChar(void)
int test_num;
ULONGLONG value;
- for (test_num = 0; test_num < NB_LARGEINT2STR; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(largeint2str); test_num++) {
one_RtlLargeIntegerToChar_test(test_num, &largeint2str[test_num]);
} /* for */
diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c
index db3dc9ff4e..e202408caa 100644
--- a/dlls/ntdll/tests/rtl.c
+++ b/dlls/ntdll/tests/rtl.c
@@ -708,7 +708,6 @@ static const all_accesses_t all_accesses[] = {
{0xFEDCBA76, 0xC8C4B242, 1},
{0xC8C4B242, 0xFEDCBA76, 0},
};
-#define NB_ALL_ACCESSES (sizeof(all_accesses)/sizeof(*all_accesses))
static void test_RtlAreAllAccessesGranted(void)
@@ -722,7 +721,7 @@ static void test_RtlAreAllAccessesGranted(void)
return;
}
- for (test_num = 0; test_num < NB_ALL_ACCESSES; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(all_accesses); test_num++) {
result = pRtlAreAllAccessesGranted(all_accesses[test_num].GrantedAccess,
all_accesses[test_num].DesiredAccess);
ok(all_accesses[test_num].result == result,
@@ -751,7 +750,6 @@ static const any_accesses_t any_accesses[] = {
{0xFEDCBA76, 0x00040000, 1},
{0xFED8BA76, 0x00040000, 0},
};
-#define NB_ANY_ACCESSES (sizeof(any_accesses)/sizeof(*any_accesses))
static void test_RtlAreAnyAccessesGranted(void)
@@ -765,7 +763,7 @@ static void test_RtlAreAnyAccessesGranted(void)
return;
}
- for (test_num = 0; test_num < NB_ANY_ACCESSES; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(any_accesses); test_num++) {
result = pRtlAreAnyAccessesGranted(any_accesses[test_num].GrantedAccess,
any_accesses[test_num].DesiredAccess);
ok(any_accesses[test_num].result == result,
diff --git a/dlls/ntdll/tests/rtlstr.c b/dlls/ntdll/tests/rtlstr.c
index 53cc185939..8b948fa82a 100644
--- a/dlls/ntdll/tests/rtlstr.c
+++ b/dlls/ntdll/tests/rtlstr.c
@@ -406,7 +406,6 @@ static const dupl_ustr_t dupl_ustr[] = {
{ 3, 0, 2, 2, NULL, 40, 42, 42, NULL, 40, 42, 0, NULL, STATUS_INVALID_PARAMETER},
{ 3, 0, 0, 0, NULL, 40, 42, 42, NULL, 0, 2, 2, "", STATUS_SUCCESS},
};
-#define NB_DUPL_USTR (sizeof(dupl_ustr)/sizeof(*dupl_ustr))
static void test_RtlDuplicateUnicodeString(void)
@@ -429,7 +428,7 @@ static void test_RtlDuplicateUnicodeString(void)
return;
}
- for (test_num = 0; test_num < NB_DUPL_USTR; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(dupl_ustr); test_num++) {
source_str.Length = dupl_ustr[test_num].source_Length;
source_str.MaximumLength = dupl_ustr[test_num].source_MaximumLength;
if (dupl_ustr[test_num].source_buf != NULL) {
@@ -776,7 +775,6 @@ static const ustr2astr_t ustr2astr[] = {
{ 0, 0, 12, NULL, 10, 10, 12, NULL, FALSE, 5, 0, 0, NULL, STATUS_BUFFER_OVERFLOW},
#endif
};
-#define NB_USTR2ASTR (sizeof(ustr2astr)/sizeof(*ustr2astr))
static void test_RtlUnicodeStringToAnsiString(void)
@@ -789,7 +787,7 @@ static void test_RtlUnicodeStringToAnsiString(void)
NTSTATUS result;
unsigned int test_num;
- for (test_num = 0; test_num < NB_USTR2ASTR; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(ustr2astr); test_num++) {
ansi_str.Length = ustr2astr[test_num].ansi_Length;
ansi_str.MaximumLength = ustr2astr[test_num].ansi_MaximumLength;
if (ustr2astr[test_num].ansi_buf != NULL) {
@@ -852,7 +850,6 @@ static const app_asc2str_t app_asc2str[] = {
{ 5, 14, 15, NULL, NULL, 5, 14, 15, NULL, STATUS_SUCCESS},
{ 5, 12, 15, "Tst\0S01234abcde", "tr\0i", 7, 12, 15, "Tst\0Str234abcde", STATUS_SUCCESS},
};
-#define NB_APP_ASC2STR (sizeof(app_asc2str)/sizeof(*app_asc2str))
static void test_RtlAppendAsciizToString(void)
@@ -862,7 +859,7 @@ static void test_RtlAppendAsciizToString(void)
NTSTATUS result;
unsigned int test_num;
- for (test_num = 0; test_num < NB_APP_ASC2STR; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(app_asc2str); test_num++) {
dest_str.Length = app_asc2str[test_num].dest_Length;
dest_str.MaximumLength = app_asc2str[test_num].dest_MaximumLength;
if (app_asc2str[test_num].dest_buf != NULL) {
@@ -922,7 +919,6 @@ static const app_str2str_t app_str2str[] = {
{ 5, 14, 15, NULL, 0, 0, 7, NULL, 5, 14, 15, NULL, STATUS_SUCCESS},
{ 5, 12, 15, "Tst\0S01234abcde", 4, 4, 7, "tr\0iZY", 9, 12, 15, "Tst\0Str\0i4abcde", STATUS_SUCCESS},
};
-#define NB_APP_STR2STR (sizeof(app_str2str)/sizeof(*app_str2str))
static void test_RtlAppendStringToString(void)
@@ -934,7 +930,7 @@ static void test_RtlAppendStringToString(void)
NTSTATUS result;
unsigned int test_num;
- for (test_num = 0; test_num < NB_APP_STR2STR; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(app_str2str); test_num++) {
dest_str.Length = app_str2str[test_num].dest_Length;
dest_str.MaximumLength = app_str2str[test_num].dest_MaximumLength;
if (app_str2str[test_num].dest_buf != NULL) {
@@ -1005,7 +1001,6 @@ static const app_uni2str_t app_uni2str[] = {
{ 4, 14, 14, "Fake0123abcdef", "U\0stri\0", 10, 14, 14, "FakeU\0stri\0\0ef", STATUS_SUCCESS},
{ 6, 14, 16, "Te\0\0stabcdefghij", "St\0\0ri", 8, 14, 16, "Te\0\0stSt\0\0efghij", STATUS_SUCCESS},
};
-#define NB_APP_UNI2STR (sizeof(app_uni2str)/sizeof(*app_uni2str))
static void test_RtlAppendUnicodeToString(void)
@@ -1015,7 +1010,7 @@ static void test_RtlAppendUnicodeToString(void)
NTSTATUS result;
unsigned int test_num;
- for (test_num = 0; test_num < NB_APP_UNI2STR; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(app_uni2str); test_num++) {
dest_str.Length = app_uni2str[test_num].dest_Length;
dest_str.MaximumLength = app_uni2str[test_num].dest_MaximumLength;
if (app_uni2str[test_num].dest_buf != NULL) {
@@ -1079,7 +1074,6 @@ static const app_ustr2str_t app_ustr2str[] = {
{ 4, 14, 14, NULL, 0, 0, 8, NULL, 4, 14, 14, NULL, STATUS_SUCCESS},
{ 6, 14, 16, "Te\0\0stabcdefghij", 6, 8, 8, "St\0\0riZY", 12, 14, 16, "Te\0\0stSt\0\0ri\0\0ij", STATUS_SUCCESS},
};
-#define NB_APP_USTR2STR (sizeof(app_ustr2str)/sizeof(*app_ustr2str))
static void test_RtlAppendUnicodeStringToString(void)
@@ -1091,7 +1085,7 @@ static void test_RtlAppendUnicodeStringToString(void)
NTSTATUS result;
unsigned int test_num;
- for (test_num = 0; test_num < NB_APP_USTR2STR; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(app_ustr2str); test_num++) {
dest_str.Length = app_ustr2str[test_num].dest_Length;
dest_str.MaximumLength = app_ustr2str[test_num].dest_MaximumLength;
if (app_ustr2str[test_num].dest_buf != NULL) {
@@ -1189,7 +1183,6 @@ static const find_ch_in_ustr_t find_ch_in_ustr[] = {
{ 2, "abcdabcdabcdabcdabcdabcd", "abcd", 0, STATUS_NOT_FOUND},
{ 3, "abcdabcdabcdabcdabcdabcd", "abcd", 0, STATUS_NOT_FOUND},
};
-#define NB_FIND_CH_IN_USTR (sizeof(find_ch_in_ustr)/sizeof(*find_ch_in_ustr))
static void test_RtlFindCharInUnicodeString(void)
@@ -1209,7 +1202,7 @@ static void test_RtlFindCharInUnicodeString(void)
return;
}
- for (test_num = 0; test_num < NB_FIND_CH_IN_USTR; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(find_ch_in_ustr); test_num++) {
if (find_ch_in_ustr[test_num].main_str != NULL) {
main_str.Length = strlen(find_ch_in_ustr[test_num].main_str) * sizeof(WCHAR);
main_str.MaximumLength = main_str.Length + sizeof(WCHAR);
@@ -1371,7 +1364,6 @@ static const str2int_t str2int[] = {
{-8, "0", 0, STATUS_INVALID_PARAMETER}, /* Negative base */
/* { 0, NULL, 0, STATUS_SUCCESS}, */ /* NULL as string */
};
-#define NB_STR2INT (sizeof(str2int)/sizeof(*str2int))
static void test_RtlUnicodeStringToInteger(void)
@@ -1382,7 +1374,7 @@ static void test_RtlUnicodeStringToInteger(void)
WCHAR *wstr;
UNICODE_STRING uni;
- for (test_num = 0; test_num < NB_STR2INT; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(str2int); test_num++) {
wstr = AtoW(str2int[test_num].str);
value = 0xdeadbeef;
pRtlInitUnicodeString(&uni, wstr);
@@ -1451,7 +1443,7 @@ static void test_RtlCharToInteger(void)
int value;
NTSTATUS result;
- for (test_num = 0; test_num < NB_STR2INT; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(str2int); test_num++) {
/* w2k skips a leading '\0' and processes the string after */
if (str2int[test_num].str[0] != '\0') {
value = 0xdeadbeef;
@@ -1600,7 +1592,6 @@ static const int2str_t int2str[] = {
{20, 0xdeadbeef, 0, 9, "-----------------------------------", STATUS_INVALID_PARAMETER}, /* ill. base */
{-8, 07654321, 0, 12, "-----------------------------------", STATUS_INVALID_PARAMETER}, /* neg. base */
};
-#define NB_INT2STR (sizeof(int2str)/sizeof(*int2str))
static void one_RtlIntegerToUnicodeString_test(int test_num, const int2str_t *int2str)
@@ -1673,7 +1664,7 @@ static void test_RtlIntegerToUnicodeString(void)
{
size_t test_num;
- for (test_num = 0; test_num < NB_INT2STR; test_num++)
+ for (test_num = 0; test_num < ARRAY_SIZE(int2str); test_num++)
one_RtlIntegerToUnicodeString_test(test_num, &int2str[test_num]);
}
@@ -1700,7 +1691,7 @@ static void test_RtlIntegerToChar(void)
NTSTATUS result;
size_t test_num;
- for (test_num = 0; test_num < NB_INT2STR; test_num++)
+ for (test_num = 0; test_num < ARRAY_SIZE(int2str); test_num++)
one_RtlIntegerToChar_test(test_num, &int2str[test_num]);
result = pRtlIntegerToChar(int2str[0].value, 20, int2str[0].MaximumLength, NULL);
diff --git a/dlls/ntdll/tests/string.c b/dlls/ntdll/tests/string.c
index 407bc0ffec..708d6e7b65 100644
--- a/dlls/ntdll/tests/string.c
+++ b/dlls/ntdll/tests/string.c
@@ -212,7 +212,6 @@ static const ulong2str_t ulong2str[] = {
{36, 62193781, "111111\0------------------------------------------------------------", 0x77},
{37, 71270178, "111111\0------------------------------------------------------------", 0x77},
};
-#define NB_ULONG2STR (sizeof(ulong2str)/sizeof(*ulong2str))
static void one_itoa_test(int test_num, const ulong2str_t *ulong2str)
@@ -276,7 +275,7 @@ static void test_ulongtoa(void)
{
int test_num;
- for (test_num = 0; test_num < NB_ULONG2STR; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(ulong2str); test_num++) {
if (ulong2str[test_num].mask & 0x01) {
one_itoa_test(test_num, &ulong2str[test_num]);
} /* if */
@@ -402,7 +401,7 @@ static void test_ulongtow(void)
int test_num;
LPWSTR result;
- for (test_num = 0; test_num < NB_ULONG2STR; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(ulong2str); test_num++) {
if (ulong2str[test_num].mask & 0x10) {
one_itow_test(test_num, &ulong2str[test_num]);
} /* if */
@@ -588,7 +587,6 @@ static const ulonglong2str_t ulonglong2str[] = {
{37, 71270178, "111111\0------------------------------------------------------------", 0x33},
{99, ULL(0x2,0x3c9e468c), "111111\0------------------------------------------------------------", 0x33},
};
-#define NB_ULONGLONG2STR (sizeof(ulonglong2str)/sizeof(*ulonglong2str))
static void one_i64toa_test(int test_num, const ulonglong2str_t *ulonglong2str)
@@ -642,7 +640,7 @@ static void test_ulonglongtoa(void)
{
int test_num;
- for (test_num = 0; test_num < NB_ULONGLONG2STR; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(ulonglong2str); test_num++) {
if (ulonglong2str[test_num].mask & 0x01) {
one_i64toa_test(test_num, &ulonglong2str[test_num]);
} /* if */
@@ -746,7 +744,7 @@ static void test_ulonglongtow(void)
int test_num;
LPWSTR result;
- for (test_num = 0; test_num < NB_ULONGLONG2STR; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(ulonglong2str); test_num++) {
if (ulonglong2str[test_num].mask & 0x10) {
one_i64tow_test(test_num, &ulonglong2str[test_num]);
} /* if */
@@ -885,7 +883,6 @@ static const str2long_t str2long[] = {
{ "", 0 }, /* empty string */
/* { NULL, 0 }, */ /* NULL as string */
};
-#define NB_STR2LONG (sizeof(str2long)/sizeof(*str2long))
static void test_wtoi(void)
@@ -894,7 +891,7 @@ static void test_wtoi(void)
UNICODE_STRING uni;
int result;
- for (test_num = 0; test_num < NB_STR2LONG; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(str2long); test_num++) {
pRtlCreateUnicodeStringFromAsciiz(&uni, str2long[test_num].str);
result = p_wtoi(uni.Buffer);
ok(result == str2long[test_num].value,
@@ -909,7 +906,7 @@ static void test_atoi(void)
int test_num;
int result;
- for (test_num = 0; test_num < NB_STR2LONG; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(str2long); test_num++) {
result = patoi(str2long[test_num].str);
ok(result == str2long[test_num].value,
"(test %d): call failed: _atoi(\"%s\") has result %d, expected: %d\n",
@@ -922,7 +919,7 @@ static void test_atol(void)
int test_num;
int result;
- for (test_num = 0; test_num < NB_STR2LONG; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(str2long); test_num++) {
result = patol(str2long[test_num].str);
ok(result == str2long[test_num].value,
"(test %d): call failed: _atol(\"%s\") has result %d, expected: %d\n",
@@ -936,7 +933,7 @@ static void test_wtol(void)
UNICODE_STRING uni;
LONG result;
- for (test_num = 0; test_num < NB_STR2LONG; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(str2long); test_num++) {
pRtlCreateUnicodeStringFromAsciiz(&uni, str2long[test_num].str);
result = p_wtol(uni.Buffer);
ok(result == str2long[test_num].value,
@@ -1068,7 +1065,6 @@ static const str2longlong_t str2longlong[] = {
{ "", 0 }, /* empty string */
/* { NULL, 0 }, */ /* NULL as string */
};
-#define NB_STR2LONGLONG (sizeof(str2longlong)/sizeof(*str2longlong))
static void test_atoi64(void)
@@ -1076,7 +1072,7 @@ static void test_atoi64(void)
int test_num;
LONGLONG result;
- for (test_num = 0; test_num < NB_STR2LONGLONG; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(str2longlong); test_num++) {
result = p_atoi64(str2longlong[test_num].str);
if (str2longlong[test_num].overflow)
ok(result == str2longlong[test_num].value ||
@@ -1100,7 +1096,7 @@ static void test_wtoi64(void)
UNICODE_STRING uni;
LONGLONG result;
- for (test_num = 0; test_num < NB_STR2LONGLONG; test_num++) {
+ for (test_num = 0; test_num < ARRAY_SIZE(str2longlong); test_num++) {
pRtlCreateUnicodeStringFromAsciiz(&uni, str2longlong[test_num].str);
result = p_wtoi64(uni.Buffer);
if (str2longlong[test_num].overflow)
--
2.14.4
June 21, 2018
[PATCH 1/2] ntdll/tests: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/ntdll/tests/directory.c | 4 ++--
dlls/ntdll/tests/exception.c | 16 +++++++---------
dlls/ntdll/tests/file.c | 4 ++--
dlls/ntdll/tests/info.c | 2 +-
dlls/ntdll/tests/om.c | 6 +++---
dlls/ntdll/tests/pipe.c | 4 ++--
dlls/ntdll/tests/rtl.c | 6 +++---
dlls/ntdll/tests/rtlstr.c | 10 +++++-----
dlls/ntdll/tests/string.c | 2 +-
dlls/ntdll/tests/threadpool.c | 14 +++++++-------
10 files changed, 33 insertions(+), 35 deletions(-)
diff --git a/dlls/ntdll/tests/directory.c b/dlls/ntdll/tests/directory.c
index f8f27f9d77..2c6170b8b4 100644
--- a/dlls/ntdll/tests/directory.c
+++ b/dlls/ntdll/tests/directory.c
@@ -74,8 +74,8 @@ static struct testfile_s {
{ 0, 0, FILE_ATTRIBUTE_DIRECTORY, {'.'}, ". directory" },
{ 0, 0, FILE_ATTRIBUTE_DIRECTORY, {'.','.'}, ".. directory" }
};
-static const int test_dir_count = sizeof(testfiles) / sizeof(testfiles[0]);
-static const int max_test_dir_size = sizeof(testfiles) / sizeof(testfiles[0]) + 5; /* size of above plus some for .. etc */
+static const int test_dir_count = ARRAY_SIZE(testfiles);
+static const int max_test_dir_size = ARRAY_SIZE(testfiles) + 5; /* size of above plus some for .. etc */
static const WCHAR dummyW[] = {'d','u','m','m','y',0};
static const WCHAR dotW[] = {'.',0};
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index e30cd593d7..5998f54b04 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -643,7 +643,7 @@ static void test_prot_fault(void)
{
unsigned int i;
- for (i = 0; i < sizeof(exceptions)/sizeof(exceptions[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(exceptions); i++)
{
if (is_wow64 && exceptions[i].wow64_broken && !strcmp( winetest_platform, "windows" ))
{
@@ -1734,7 +1734,7 @@ static void call_virtual_unwind( int testnum, const struct unwind_test *test )
for (j = 0; j < 16; j++)
{
- static const UINT nb_regs = sizeof(test->results[i].regs) / sizeof(test->results[i].regs[0]);
+ static const UINT nb_regs = ARRAY_SIZE(test->results[i].regs);
for (k = 0; k < nb_regs; k++)
{
@@ -1888,14 +1888,12 @@ static void test_virtual_unwind(void)
static const struct unwind_test tests[] =
{
- { function_0, sizeof(function_0), unwind_info_0,
- results_0, sizeof(results_0)/sizeof(results_0[0]) },
- { function_1, sizeof(function_1), unwind_info_1,
- results_1, sizeof(results_1)/sizeof(results_1[0]) }
+ { function_0, sizeof(function_0), unwind_info_0, results_0, ARRAY_SIZE(results_0) },
+ { function_1, sizeof(function_1), unwind_info_1, results_1, ARRAY_SIZE(results_1) }
};
unsigned int i;
- for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
call_virtual_unwind( i, &tests[i] );
}
@@ -2429,7 +2427,7 @@ static void test_prot_fault(void)
{
unsigned int i;
- for (i = 0; i < sizeof(exceptions)/sizeof(exceptions[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(exceptions); i++)
{
got_exception = 0;
run_exception_test(handler, &exceptions[i], &exceptions[i].code,
@@ -2567,7 +2565,7 @@ static void test_debug_registers(void)
HANDLE thread;
int i;
- for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
{
memset(&ctx, 0, sizeof(ctx));
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index f88d16b449..d9d029b7f3 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -563,7 +563,7 @@ static void delete_file_test(void)
ok(0, "couldn't get temp dir\n");
return;
}
- if (ret + sizeof(testdirW)/sizeof(WCHAR)-1 + sizeof(subdirW)/sizeof(WCHAR)-1 >= MAX_PATH)
+ if (ret + ARRAY_SIZE(testdirW)-1 + ARRAY_SIZE(subdirW)-1 >= MAX_PATH)
{
ok(0, "MAX_PATH exceeded in constructing paths\n");
return;
@@ -3379,7 +3379,7 @@ static void test_NtCreateFile(void)
attr.SecurityDescriptor = NULL;
attr.SecurityQualityOfService = NULL;
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
status = pNtCreateFile(&handle, GENERIC_READ, &attr, &io, NULL,
td[i].attrib_in, FILE_SHARE_READ|FILE_SHARE_WRITE,
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index 6c93c3cd58..4a2d9e6933 100644
--- a/dlls/ntdll/tests/info.c
+++ b/dlls/ntdll/tests/info.c
@@ -1613,7 +1613,7 @@ static void test_query_process_debug_flags(int argc, char **argv)
ok(!status, "NtQueryInformationProcess failed, status %#x.\n", status);
ok(debug_flags == TRUE, "Expected flag TRUE, got %x.\n", debug_flags);
- for (i = 0; i < sizeof(test_flags)/sizeof(test_flags[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(test_flags); i++)
{
DWORD expected_flags = !(test_flags[i] & DEBUG_ONLY_THIS_PROCESS);
sprintf(cmdline, "%s %s %s", argv[0], argv[1], "debuggee");
diff --git a/dlls/ntdll/tests/om.c b/dlls/ntdll/tests/om.c
index 43c5ee46d7..52b4a83968 100644
--- a/dlls/ntdll/tests/om.c
+++ b/dlls/ntdll/tests/om.c
@@ -650,7 +650,7 @@ static void test_name_limits(void)
/* named pipes */
memcpy( str.Buffer, pipeW, sizeof(pipeW) );
- for (i = 0; i < 65536 / sizeof(WCHAR); i++) str.Buffer[i + sizeof(pipeW)/sizeof(WCHAR)] = 'a';
+ for (i = 0; i < 65536 / sizeof(WCHAR); i++) str.Buffer[i + ARRAY_SIZE(pipeW)] = 'a';
str.Length = 0;
attr.RootDirectory = 0;
attr.Attributes = OBJ_CASE_INSENSITIVE;
@@ -703,7 +703,7 @@ static void test_name_limits(void)
/* mailslots */
memcpy( str.Buffer, mailslotW, sizeof(mailslotW) );
- for (i = 0; i < 65536 / sizeof(WCHAR); i++) str.Buffer[i + sizeof(mailslotW)/sizeof(WCHAR)] = 'a';
+ for (i = 0; i < 65536 / sizeof(WCHAR); i++) str.Buffer[i + ARRAY_SIZE(mailslotW)] = 'a';
str.Length = 0;
status = pNtCreateMailslotFile( &ret, GENERIC_ALL, &attr, &iosb, 0, 0, 0, NULL );
ok( status == STATUS_OBJECT_PATH_SYNTAX_BAD, "%u: NtCreateMailslotFile failed %x\n", str.Length, status );
@@ -744,7 +744,7 @@ static void test_name_limits(void)
/* registry keys */
memcpy( str.Buffer, registryW, sizeof(registryW) );
- for (i = 0; i < 65536 / sizeof(WCHAR); i++) str.Buffer[i + sizeof(registryW)/sizeof(WCHAR)] = 'a';
+ for (i = 0; i < 65536 / sizeof(WCHAR); i++) str.Buffer[i + ARRAY_SIZE(registryW)] = 'a';
str.Length = 0;
status = pNtCreateKey( &ret, GENERIC_ALL, &attr, 0, NULL, 0, NULL );
todo_wine
diff --git a/dlls/ntdll/tests/pipe.c b/dlls/ntdll/tests/pipe.c
index 2978274715..c8e6809423 100644
--- a/dlls/ntdll/tests/pipe.c
+++ b/dlls/ntdll/tests/pipe.c
@@ -230,8 +230,8 @@ static void test_create(void)
static const DWORD sharing[] = { FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE };
static const DWORD pipe_config[]= { 1, 0, 2 };
- for (j = 0; j < sizeof(sharing) / sizeof(DWORD); j++) {
- for (k = 0; k < sizeof(access) / sizeof(DWORD); k++) {
+ for (j = 0; j < ARRAY_SIZE(sharing); j++) {
+ for (k = 0; k < ARRAY_SIZE(access); k++) {
HANDLE hclient;
BOOL should_succeed = TRUE;
diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c
index 2e3a7de75d..db3dc9ff4e 100644
--- a/dlls/ntdll/tests/rtl.c
+++ b/dlls/ntdll/tests/rtl.c
@@ -680,7 +680,7 @@ static void test_RtlRandom(void)
}
seed = 0;
- for (i = 0; i < sizeof(res) / sizeof(res[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(res); i++)
{
res[i] = pRtlRandom(&seed);
ok(seed != res[i], "%i: seed is same as res %x\n", i, seed);
@@ -1226,7 +1226,7 @@ static void test_RtlIpv4StringToAddress(void)
{ "::1", STATUS_INVALID_PARAMETER, 0, { -1 } },
{ ":1", STATUS_INVALID_PARAMETER, 0, { -1 } },
};
- const int testcount = sizeof(tests) / sizeof(tests[0]);
+ const int testcount = ARRAY_SIZE(tests);
int i;
if (!pRtlIpv4StringToAddressA)
@@ -1787,7 +1787,7 @@ static void test_RtlDecompressBuffer(void)
ok(final_size == 0xdeadbeef, "got wrong final_size %u\n", final_size);
/* regular tests for RtlDecompressBuffer */
- for (i = 0; i < sizeof(test_lznt) / sizeof(test_lznt[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(test_lznt); i++)
{
trace("Running test %d (compressed_size=%u, uncompressed_size=%u, status=0x%08x)\n",
i, test_lznt[i].compressed_size, test_lznt[i].uncompressed_size, test_lznt[i].status);
diff --git a/dlls/ntdll/tests/rtlstr.c b/dlls/ntdll/tests/rtlstr.c
index 7f889dfa0d..53cc185939 100644
--- a/dlls/ntdll/tests/rtlstr.c
+++ b/dlls/ntdll/tests/rtlstr.c
@@ -1769,7 +1769,7 @@ static void test_RtlIsTextUnicode(void)
be_unicode = HeapAlloc(GetProcessHeap(), 0, sizeof(unicode) + sizeof(WCHAR));
be_unicode[0] = 0xfffe;
- for (i = 0; i < sizeof(unicode)/sizeof(unicode[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(unicode); i++)
{
be_unicode[i + 1] = (unicode[i] >> 8) | ((unicode[i] & 0xff) << 8);
}
@@ -1791,7 +1791,7 @@ static void test_RtlIsTextUnicode(void)
be_unicode_no_controls = HeapAlloc(GetProcessHeap(), 0, sizeof(unicode) + sizeof(WCHAR));
ok(be_unicode_no_controls != NULL, "Expected HeapAlloc to succeed.\n");
be_unicode_no_controls[0] = 0xfffe;
- for (i = 0; i < sizeof(unicode_no_controls)/sizeof(unicode_no_controls[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(unicode_no_controls); i++)
be_unicode_no_controls[i + 1] = (unicode_no_controls[i] >> 8) | ((unicode_no_controls[i] & 0xff) << 8);
@@ -2093,7 +2093,7 @@ static void test_RtlUnicodeToUTF8N(void)
const WCHAR special_string[] = { 'X',0x80,0xd800,0 };
const unsigned char special_expected[] = { 'X',0xc2,0x80,0xef,0xbf,0xbd,0 };
unsigned int input_len;
- const unsigned int test_count = sizeof(unicode_to_utf8) / sizeof(unicode_to_utf8[0]);
+ const unsigned int test_count = ARRAY_SIZE(unicode_to_utf8);
unsigned int i;
if (!pRtlUnicodeToUTF8N)
@@ -2374,7 +2374,7 @@ static void unicode_expect_(const WCHAR *out_string, ULONG buflen, ULONG out_cha
ok_(__FILE__, line)(buffer[i] == out_string[i],
"buffer[%d] = 0x%x, expected 0x%x\n",
i, buffer[i], out_string[i]);
- for (; i < sizeof(buffer) / sizeof(WCHAR); i++)
+ for (; i < ARRAY_SIZE(buffer); i++)
ok_(__FILE__, line)(buffer[i] == 0x5555,
"buffer[%d] = 0x%x, expected 0x5555\n",
i, buffer[i]);
@@ -2396,7 +2396,7 @@ static void test_RtlUTF8ToUnicodeN(void)
const char special_string[] = { 'X',0xc2,0x80,0xF0,0x90,0x80,0x80,0 };
const WCHAR special_expected[] = { 'X',0x80,0xd800,0xdc00,0 };
unsigned int input_len;
- const unsigned int test_count = sizeof(utf8_to_unicode) / sizeof(utf8_to_unicode[0]);
+ const unsigned int test_count = ARRAY_SIZE(utf8_to_unicode);
unsigned int i;
if (!pRtlUTF8ToUnicodeN)
diff --git a/dlls/ntdll/tests/string.c b/dlls/ntdll/tests/string.c
index 8fca5d46d5..407bc0ffec 100644
--- a/dlls/ntdll/tests/string.c
+++ b/dlls/ntdll/tests/string.c
@@ -1258,7 +1258,7 @@ static void test_bsearch(void)
int *x, l, i, j;
/* just try all array sizes */
- for (j=1;j<sizeof(arr)/sizeof(arr[0]);j++) {
+ for (j=1;j<ARRAY_SIZE(arr);j++) {
for (i=0;i<j;i++) {
l = arr[i];
x = p_bsearch (&l, arr, j, sizeof(arr[0]), intcomparefunc);
diff --git a/dlls/ntdll/tests/threadpool.c b/dlls/ntdll/tests/threadpool.c
index af0b6673d3..3bd2d994ec 100644
--- a/dlls/ntdll/tests/threadpool.c
+++ b/dlls/ntdll/tests/threadpool.c
@@ -1824,7 +1824,7 @@ static void test_tp_multi_wait(void)
environment.Pool = pool;
/* create semaphores and corresponding wait objects */
- for (i = 0; i < sizeof(semaphores)/sizeof(semaphores[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(semaphores); i++)
{
semaphores[i] = CreateSemaphoreW(NULL, 0, 1, NULL);
ok(semaphores[i] != NULL, "failed to create semaphore %i\n", i);
@@ -1838,7 +1838,7 @@ static void test_tp_multi_wait(void)
}
/* release all semaphores and wait for callback */
- for (i = 0; i < sizeof(semaphores)/sizeof(semaphores[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(semaphores); i++)
{
multi_wait_info.result = 0;
ReleaseSemaphore(semaphores[i], 1, NULL);
@@ -1851,7 +1851,7 @@ static void test_tp_multi_wait(void)
}
/* repeat the same test in reverse order */
- for (i = sizeof(semaphores)/sizeof(semaphores[0]) - 1; i >= 0; i--)
+ for (i = ARRAY_SIZE(semaphores) - 1; i >= 0; i--)
{
multi_wait_info.result = 0;
ReleaseSemaphore(semaphores[i], 1, NULL);
@@ -1865,13 +1865,13 @@ static void test_tp_multi_wait(void)
/* test timeout of wait objects */
multi_wait_info.result = 0;
- for (i = 0; i < sizeof(semaphores)/sizeof(semaphores[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(semaphores); i++)
{
when.QuadPart = (ULONGLONG)50 * -10000;
pTpSetWait(waits[i], semaphores[i], &when);
}
- for (i = 0; i < sizeof(semaphores)/sizeof(semaphores[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(semaphores); i++)
{
result = WaitForSingleObject(semaphore, 150);
ok(result == WAIT_OBJECT_0, "WaitForSingleObject returned %u\n", result);
@@ -1880,14 +1880,14 @@ static void test_tp_multi_wait(void)
ok(multi_wait_info.result >> 16, "expected multi_wait_info.result >> 16 != 0\n");
/* destroy the wait objects and semaphores while waiting */
- for (i = 0; i < sizeof(semaphores)/sizeof(semaphores[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(semaphores); i++)
{
pTpSetWait(waits[i], semaphores[i], NULL);
}
Sleep(50);
- for (i = 0; i < sizeof(semaphores)/sizeof(semaphores[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(semaphores); i++)
{
pTpReleaseWait(waits[i]);
NtClose(semaphores[i]);
--
2.14.4
June 21, 2018
[PATCH] wininet/tests: Use the available ARRAY_SIZE() macro
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/wininet/tests/ftp.c | 2 +-
dlls/wininet/tests/http.c | 10 ++++-----
dlls/wininet/tests/internet.c | 16 ++++++-------
dlls/wininet/tests/url.c | 52 +++++++++++++++++++++----------------------
dlls/wininet/tests/urlcache.c | 4 ++--
5 files changed, 42 insertions(+), 42 deletions(-)
diff --git a/dlls/wininet/tests/ftp.c b/dlls/wininet/tests/ftp.c
index d2118faded..6f50104f3b 100644
--- a/dlls/wininet/tests/ftp.c
+++ b/dlls/wininet/tests/ftp.c
@@ -735,7 +735,7 @@ static void test_command(HINTERNET hFtp, HINTERNET hConnect)
return;
}
- for (i = 0; i < sizeof(command_test) / sizeof(command_test[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(command_test); i++)
{
SetLastError(0xdeadbeef);
ret = pFtpCommandA(hFtp, FALSE, FTP_TRANSFER_TYPE_ASCII, command_test[i].cmd, 0, NULL);
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index 0524ddf3fd..ace8512399 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -172,7 +172,7 @@ static BOOL (WINAPI *pInternetGetSecurityInfoByURLA)(LPSTR,PCCERT_CHAIN_CONTEXT*
static int strcmp_wa(LPCWSTR strw, const char *stra)
{
WCHAR buf[512];
- MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, sizeof(buf)/sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, ARRAY_SIZE(buf));
return lstrcmpW(strw, buf);
}
@@ -4204,7 +4204,7 @@ static void test_http_status(int port)
DWORD i, size;
BOOL res;
- for(i=0; i < sizeof(http_status_tests)/sizeof(*http_status_tests); i++) {
+ for(i = 0; i < ARRAY_SIZE(http_status_tests); i++) {
send_buffer = http_status_tests[i].response_text;
open_simple_request(&req, "localhost", port, NULL, "/send_from_buffer");
@@ -6543,14 +6543,14 @@ static const struct notification async_send_request_ex_chunked_test[] =
static const struct notification_data notification_data[] = {
{
async_send_request_ex_chunked_test,
- sizeof(async_send_request_ex_chunked_test)/sizeof(async_send_request_ex_chunked_test[0]),
+ ARRAY_SIZE(async_send_request_ex_chunked_test),
"GET",
"test.winehq.org",
"tests/data.php"
},
{
async_send_request_ex_test,
- sizeof(async_send_request_ex_test)/sizeof(async_send_request_ex_test[0]),
+ ARRAY_SIZE(async_send_request_ex_test),
"POST",
"test.winehq.org",
"tests/post.php",
@@ -6565,7 +6565,7 @@ static const struct notification_data notification_data[] = {
},
{
async_send_request_ex_resolve_failure_test,
- sizeof(async_send_request_ex_resolve_failure_test)/sizeof(async_send_request_ex_resolve_failure_test[0]),
+ ARRAY_SIZE(async_send_request_ex_resolve_failure_test),
"GET",
"brokenhost",
"index.html",
diff --git a/dlls/wininet/tests/internet.c b/dlls/wininet/tests/internet.c
index 39c698f5db..7889e40ea8 100644
--- a/dlls/wininet/tests/internet.c
+++ b/dlls/wininet/tests/internet.c
@@ -629,7 +629,7 @@ static void test_cookie_url(void)
ok(!res && GetLastError() == ERROR_INVALID_PARAMETER,
"InternetGetCookeA failed: %u, expected ERROR_INVALID_PARAMETER\n", GetLastError());
- len = sizeof(bufw)/sizeof(*bufw);
+ len = ARRAY_SIZE(bufw);
res = InternetGetCookieW(about_blankW, NULL, bufw, &len);
ok(!res && GetLastError() == ERROR_INVALID_PARAMETER,
"InternetGetCookeW failed: %u, expected ERROR_INVALID_PARAMETER\n", GetLastError());
@@ -639,7 +639,7 @@ static void test_cookie_url(void)
ok(!res && GetLastError() == ERROR_INVALID_PARAMETER,
"InternetGetCookeExA failed: %u, expected ERROR_INVALID_PARAMETER\n", GetLastError());
- len = sizeof(bufw)/sizeof(*bufw);
+ len = ARRAY_SIZE(bufw);
res = pInternetGetCookieExW(about_blankW, NULL, bufw, &len, 0, NULL);
ok(!res && GetLastError() == ERROR_INVALID_PARAMETER,
"InternetGetCookeExW failed: %u, expected ERROR_INVALID_PARAMETER\n", GetLastError());
@@ -887,7 +887,7 @@ static void InternetTimeFromSystemTimeW_test(void)
/* test too small buffer size */
SetLastError(0xdeadbeef);
- ret = pInternetTimeFromSystemTimeW( &time, INTERNET_RFC1123_FORMAT, string, sizeof(string)/sizeof(string[0]) );
+ ret = pInternetTimeFromSystemTimeW( &time, INTERNET_RFC1123_FORMAT, string, ARRAY_SIZE(string));
error = GetLastError();
ok( !ret, "InternetTimeFromSystemTimeW should have returned FALSE\n" );
ok( error == ERROR_INSUFFICIENT_BUFFER,
@@ -1084,7 +1084,7 @@ static void test_PrivacyGetSetZonePreferenceW(void)
trace("template %u\n", old_template);
if(old_template == PRIVACY_TEMPLATE_ADVANCED) {
- pref_size = sizeof(pref)/sizeof(WCHAR);
+ pref_size = ARRAY_SIZE(pref);
ret = pPrivacyGetZonePreferenceW(zone, type, &old_template, pref, &pref_size);
ok(ret == 0, "expected ret == 0, got %u\n", ret);
}
@@ -1721,7 +1721,7 @@ static void test_InternetGetConnectedStateExW(void)
flags = 0;
buffer[0] = 0;
- res = pInternetGetConnectedStateExW(&flags, buffer, sizeof(buffer) / sizeof(buffer[0]), 0);
+ res = pInternetGetConnectedStateExW(&flags, buffer, ARRAY_SIZE(buffer), 0);
trace("Internet Connection: Flags 0x%02x - Name '%s'\n", flags, wine_dbgstr_w(buffer));
todo_wine
ok (flags & INTERNET_RAS_INSTALLED, "Missing RAS flag\n");
@@ -1755,21 +1755,21 @@ todo_wine
ok(!buffer[0], "Buffer must not change, got %02X\n", buffer[0]);
buffer[0] = 0;
- res = pInternetGetConnectedStateExW(NULL, buffer, sizeof(buffer) / sizeof(buffer[0]), 0);
+ res = pInternetGetConnectedStateExW(NULL, buffer, ARRAY_SIZE(buffer), 0);
ok(res == TRUE, "Expected TRUE, got %d\n", res);
sz = lstrlenW(buffer);
ok(sz > 0, "Expected a connection name\n");
buffer[0] = 0;
flags = 0;
- res = pInternetGetConnectedStateExW(&flags, buffer, sizeof(buffer) / sizeof(buffer[0]), 0);
+ res = pInternetGetConnectedStateExW(&flags, buffer, ARRAY_SIZE(buffer), 0);
ok(res == TRUE, "Expected TRUE, got %d\n", res);
ok(flags, "Expected at least one flag set\n");
sz = lstrlenW(buffer);
ok(sz > 0, "Expected a connection name\n");
flags = 0;
- res = pInternetGetConnectedStateExW(&flags, NULL, sizeof(buffer) / sizeof(buffer[0]), 0);
+ res = pInternetGetConnectedStateExW(&flags, NULL, ARRAY_SIZE(buffer), 0);
ok(res == TRUE, "Expected TRUE, got %d\n", res);
ok(flags, "Expected at least one flag set\n");
diff --git a/dlls/wininet/tests/url.c b/dlls/wininet/tests/url.c
index 0af58358eb..18c77b6647 100644
--- a/dlls/wininet/tests/url.c
+++ b/dlls/wininet/tests/url.c
@@ -672,17 +672,17 @@ static void InternetCrackUrlW_test(void)
memset(&comp, 0, sizeof comp);
comp.dwStructSize = sizeof(comp);
comp.lpszScheme = scheme;
- comp.dwSchemeLength = sizeof(scheme)/sizeof(scheme[0]);
+ comp.dwSchemeLength = ARRAY_SIZE(scheme);
comp.lpszHostName = host;
- comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
+ comp.dwHostNameLength = ARRAY_SIZE(host);
comp.lpszUserName = user;
- comp.dwUserNameLength = sizeof(user)/sizeof(user[0]);
+ comp.dwUserNameLength = ARRAY_SIZE(user);
comp.lpszPassword = pwd;
- comp.dwPasswordLength = sizeof(pwd)/sizeof(pwd[0]);
+ comp.dwPasswordLength = ARRAY_SIZE(pwd);
comp.lpszUrlPath = urlpart;
- comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
+ comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
comp.lpszExtraInfo = extra;
- comp.dwExtraInfoLength = sizeof(extra)/sizeof(extra[0]);
+ comp.dwExtraInfoLength = ARRAY_SIZE(extra);
SetLastError(0xdeadbeef);
r = InternetCrackUrlW(NULL, 0, 0, &comp );
@@ -721,9 +721,9 @@ static void InternetCrackUrlW_test(void)
memset(&comp, 0, sizeof comp);
comp.dwStructSize = sizeof comp;
comp.lpszHostName = host;
- comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
+ comp.dwHostNameLength = ARRAY_SIZE(host);
comp.lpszUrlPath = urlpart;
- comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
+ comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
r = InternetCrackUrlW(url, 0, 0, &comp );
ok( r, "failed to crack url\n");
@@ -739,11 +739,11 @@ static void InternetCrackUrlW_test(void)
memset(&comp, 0, sizeof comp);
comp.dwStructSize = sizeof comp;
comp.lpszHostName = host;
- comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
+ comp.dwHostNameLength = ARRAY_SIZE(host);
comp.lpszUrlPath = urlpart;
- comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
+ comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
comp.lpszExtraInfo = NULL;
- comp.dwExtraInfoLength = sizeof(extra)/sizeof(extra[0]);
+ comp.dwExtraInfoLength = ARRAY_SIZE(extra);
r = InternetCrackUrlW(url, 0, 0, &comp );
ok( r, "failed to crack url\n");
@@ -763,17 +763,17 @@ static void InternetCrackUrlW_test(void)
memset(&comp, 0, sizeof(comp));
comp.dwStructSize = sizeof(comp);
comp.lpszScheme = scheme;
- comp.dwSchemeLength = sizeof(scheme)/sizeof(scheme[0]);
+ comp.dwSchemeLength = ARRAY_SIZE(scheme);
comp.lpszHostName = host;
- comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
+ comp.dwHostNameLength = ARRAY_SIZE(host);
comp.lpszUserName = user;
- comp.dwUserNameLength = sizeof(user)/sizeof(user[0]);
+ comp.dwUserNameLength = ARRAY_SIZE(user);
comp.lpszPassword = pwd;
- comp.dwPasswordLength = sizeof(pwd)/sizeof(pwd[0]);
+ comp.dwPasswordLength = ARRAY_SIZE(pwd);
comp.lpszUrlPath = urlpart;
- comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
+ comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
comp.lpszExtraInfo = extra;
- comp.dwExtraInfoLength = sizeof(extra)/sizeof(extra[0]);
+ comp.dwExtraInfoLength = ARRAY_SIZE(extra);
r = InternetCrackUrlW(url2, 0, 0, &comp);
ok(!r, "InternetCrackUrl should have failed\n");
@@ -791,17 +791,17 @@ static void InternetCrackUrlW_test(void)
memset(&comp, 0, sizeof comp);
comp.dwStructSize = sizeof comp;
comp.lpszScheme = scheme;
- comp.dwSchemeLength = sizeof(scheme)/sizeof(scheme[0]);
+ comp.dwSchemeLength = ARRAY_SIZE(scheme);
comp.lpszHostName = host;
- comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
+ comp.dwHostNameLength = ARRAY_SIZE(host);
comp.lpszUserName = user;
- comp.dwUserNameLength = sizeof(user)/sizeof(user[0]);
+ comp.dwUserNameLength = ARRAY_SIZE(user);
comp.lpszPassword = pwd;
- comp.dwPasswordLength = sizeof(pwd)/sizeof(pwd[0]);
+ comp.dwPasswordLength = ARRAY_SIZE(pwd);
comp.lpszUrlPath = urlpart;
- comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
+ comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
comp.lpszExtraInfo = extra;
- comp.dwExtraInfoLength = sizeof(extra)/sizeof(extra[0]);
+ comp.dwExtraInfoLength = ARRAY_SIZE(extra);
r = InternetCrackUrlW(url3, 0, 0, &comp );
ok( r, "InternetCrackUrlW failed unexpectedly\n");
ok( host[0] == 'x', "host should be x.org\n");
@@ -812,9 +812,9 @@ static void InternetCrackUrlW_test(void)
memset(&comp, 0, sizeof(comp));
comp.dwStructSize = sizeof(comp);
comp.lpszHostName = host;
- comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
+ comp.dwHostNameLength = ARRAY_SIZE(host);
comp.lpszUrlPath = urlpart;
- comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
+ comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
r = InternetCrackUrlW(url3, 0, ICU_DECODE, &comp);
todo_wine ok(r, "InternetCrackUrlW failed unexpectedly\n");
todo_wine ok(!strcmp_wa(host, "x.org"), "host is %s, should be x.org\n", wine_dbgstr_w(host));
@@ -1224,7 +1224,7 @@ START_TEST(url)
return;
}
- for(i=0; i < sizeof(crack_url_tests)/sizeof(*crack_url_tests); i++)
+ for(i = 0; i < ARRAY_SIZE(crack_url_tests); i++)
test_crack_url(crack_url_tests+i);
test_long_url();
diff --git a/dlls/wininet/tests/urlcache.c b/dlls/wininet/tests/urlcache.c
index 310054b6a7..3799500489 100644
--- a/dlls/wininet/tests/urlcache.c
+++ b/dlls/wininet/tests/urlcache.c
@@ -891,13 +891,13 @@ static void test_urlcacheW(void)
if(ie10_cache) {
if(!MultiByteToWideChar(CP_ACP, 0, urls[6].encoded_url, -1,
- urls[6].url, sizeof(urls[6].url)/sizeof(WCHAR)))
+ urls[6].url, ARRAY_SIZE(urls[6].url)))
urls[6].url[0] = 0;
trace("converted url in test 6: %s\n", wine_dbgstr_w(urls[6].url));
}
- for(i=0; i<sizeof(urls)/sizeof(*urls); i++) {
+ for(i=0; i<ARRAY_SIZE(urls); i++) {
INTERNET_CACHE_ENTRY_INFOA *entry_infoA;
INTERNET_CACHE_ENTRY_INFOW *entry_infoW;
DWORD size;
--
2.14.4
June 21, 2018
[PATCH] appwiz.cpl: Support installing minor updates when installing addons
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/appwiz.cpl/addons.c | 5 +++++
1 file changed, 5 insertions(+)
June 21, 2018
Re: [PATCH 3/3] Add new test for DXTn volume textures.
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at
https://testbot.winehq.org/JobDetails.pl?Key=39289
Your paranoid android.
=== w1064 (64 bit visual) ===
visual.c:8645: Test failed: Got unexpected color 0x00007580 for quad 2 (different colors).
June 21, 2018
[PATCH 3/3] Add new test for DXTn volume textures.
by Connor McAdams
To properly test the functionality of DXTn volume textures, I have added
new tests for DXT1, DXT3, and DXT5 replacing the old DXT5 test. I also
added a function to get the alpha values of pixels, although there may
have been a reason one wasn't included in the first place, it's the only
real way to make sure the alpha is behaving properly on the formats.
---
dlls/d3d9/tests/visual.c | 190 ++++++++++++++++++++++++++++++++---------------
1 file changed, 131 insertions(+), 59 deletions(-)
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index b36c189..ec121b0 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -186,6 +186,31 @@ static void release_surface_readback(struct surface_readback *rb)
IDirect3DSurface9_Release(rb->surface);
}
+static DWORD getAlphaPixelColor(IDirect3DDevice9 *device, UINT x, UINT y)
+{
+ DWORD ret;
+ IDirect3DSurface9 *rt;
+ struct surface_readback rb;
+ HRESULT hr;
+
+ hr = IDirect3DDevice9_GetRenderTarget(device, 0, &rt);
+ if(FAILED(hr))
+ {
+ trace("Can't get the render target, hr %#x.\n", hr);
+ return 0xdeadbeed;
+ }
+
+ get_rt_readback(rt, &rb);
+ /* Remove the X channel for now. DirectX and OpenGL have different ideas how to treat it apparently, and it isn't
+ * really important for these tests
+ */
+ ret = get_readback_color(&rb, x, y) & 0xffffffff;
+ release_surface_readback(&rb);
+
+ IDirect3DSurface9_Release(rt);
+ return ret;
+}
+
static DWORD getPixelColor(IDirect3DDevice9 *device, UINT x, UINT y)
{
DWORD ret;
@@ -17741,22 +17766,39 @@ done:
DestroyWindow(window);
}
-static void volume_dxt5_test(void)
+static void volume_dxtn_test(void)
{
IDirect3DVolumeTexture9 *texture;
IDirect3DDevice9 *device;
D3DLOCKED_BOX box;
IDirect3D9 *d3d;
- unsigned int i;
+ unsigned int i, x;
ULONG refcount;
DWORD color;
HWND window;
HRESULT hr;
- static const char texture_data[] =
+ static const char dxt1_texture_data[] =
+ {
+ /* A 8x4x2 texture consisting of 4 4x4 blocks. The colors of the blocks are red, green, blue and white. */
+ 0x00, 0xF8, 0x00, 0xF8, 0xF0, 0xF0, 0xF0, 0xF0,
+ 0xE0, 0x07, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00
+ };
+ static const char dxt3_texture_data[] =
+ {
+ /* A 8x4x2 texture consisting of 4 4x4 blocks. The colors of the blocks are red, green, blue and white. The red block goes from
+ * 15 to 0 on alpha level. */
+ 0xFF, 0xEE, 0xFF, 0xEE, 0xFF, 0xEE, 0xFF, 0xEE, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xDD, 0xFF, 0xDD, 0xFF, 0xDD, 0xFF, 0xDD, 0xe0, 0x07, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xCC, 0xFF, 0xCC, 0xFF, 0xCC, 0xFF, 0xCC, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xBB, 0xFF, 0xBB, 0xFF, 0xBB, 0xFF, 0xBB, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00
+ };
+ static const char dxt5_texture_data[] =
{
/* A 8x4x2 texture consisting of 4 4x4 blocks. The colors of the blocks are red, green, blue and white. */
- 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0x80, 0x0D, 0xD8, 0x80, 0x0D, 0xD8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00
@@ -17778,70 +17820,100 @@ static void volume_dxt5_test(void)
{{ 1.0f, -1.0f, 1.0f}, { 1.0f, 0.0f, 0.75f}},
{{ 1.0f, 1.0f, 1.0f}, { 1.0f, 1.0f, 0.75f}},
};
- static const DWORD expected_colors[] = {0x00ff0000, 0x0000ff00, 0x000000ff, 0x00ffffff};
-
- window = create_window();
- d3d = Direct3DCreate9(D3D_SDK_VERSION);
- ok(!!d3d, "Failed to create a D3D object.\n");
- if (FAILED(IDirect3D9_CheckDeviceFormat(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
- D3DFMT_X8R8G8B8, 0, D3DRTYPE_VOLUMETEXTURE, D3DFMT_DXT5)))
+ static const DWORD expected_colors[3][8] = {
{
- skip("DXT5 volume textures are not supported, skipping test.\n");
- goto done;
- }
- if (!(device = create_device(d3d, window, window, TRUE)))
+ 0xFFFF0000, 0x00000000, 0xFF00FF00, 0xFF00FF00,
+ 0xFF0000FF, 0xFF0000FF, 0xFFFFFFFF, 0xFFFFFFFF,
+ },
{
- skip("Failed to create a D3D device, skipping tests.\n");
- goto done;
+ 0xFFFF0000, 0xEEFF0000, 0xFF00FF00, 0xDD00FF00,
+ 0xFF0000FF, 0xCC0000FF, 0xFFFFFFFF, 0xBBFFFFFF,
+ },
+ {
+ 0xFFFF0000, 0x00FF0000, 0xFF00FF00, 0xFF00FF00,
+ 0xFF0000FF, 0xFF0000FF, 0xFFFFFFFF, 0xFFFFFFFF
}
+ };
+ static const char *const dxtn[3] = {"DXT1", "DXT3", "DXT5"};
+ static const unsigned int fmt[3] = {D3DFMT_DXT1, D3DFMT_DXT3, D3DFMT_DXT5};
- hr = IDirect3DDevice9_CreateVolumeTexture(device, 8, 4, 2, 1, 0, D3DFMT_DXT5,
- D3DPOOL_MANAGED, &texture, NULL);
- ok(SUCCEEDED(hr), "Failed to create volume texture, hr %#x.\n", hr);
+ for (x = 0; x < 3; x++)
+ {
+ window = create_window();
+ d3d = Direct3DCreate9(D3D_SDK_VERSION);
+ ok(!!d3d, "Failed to create a D3D object.\n");
+ if (FAILED(IDirect3D9_CheckDeviceFormat(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
+ D3DFMT_A8B8G8R8, 0, D3DRTYPE_VOLUMETEXTURE, fmt[x])))
+ {
+ skip("%s volume textures are not supported, skipping test.\n", dxtn[x]);
+ continue;
+ }
+ if (!(device = create_device(d3d, window, window, TRUE)))
+ {
+ skip("Failed to create a D3D device, skipping tests.\n");
+ continue;
+ }
- hr = IDirect3DVolumeTexture9_LockBox(texture, 0, &box, NULL, 0);
- ok(SUCCEEDED(hr), "Failed to lock volume texture, hr %#x.\n", hr);
- memcpy(box.pBits, texture_data, sizeof(texture_data));
- hr = IDirect3DVolumeTexture9_UnlockBox(texture, 0);
- ok(SUCCEEDED(hr), "Failed to unlock volume texture, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_CreateVolumeTexture(device, 8, 4, 2, 1, 0, fmt[x],
+ D3DPOOL_MANAGED, &texture, NULL);
+ ok(SUCCEEDED(hr), "Failed to create volume texture, hr %#x.\n", hr);
- hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0));
- ok(SUCCEEDED(hr), "Failed to set FVF, hr %#x.\n", hr);
- hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *)texture);
- ok(SUCCEEDED(hr), "Failed to set texture, hr %#x.\n", hr);
- hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
- ok(SUCCEEDED(hr), "Failed to set color op, hr %#x.\n", hr);
- hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
- ok(SUCCEEDED(hr), "Failed to set color arg, hr %#x.\n", hr);
- hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
- ok(SUCCEEDED(hr), "Failed to set color op, hr %#x.\n", hr);
- hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
- ok(SUCCEEDED(hr), "Failed to set mag filter, hr %#x.\n", hr);
+ hr = IDirect3DVolumeTexture9_LockBox(texture, 0, &box, NULL, 0);
+ ok(SUCCEEDED(hr), "Failed to lock volume texture, hr %#x.\n", hr);
+ switch (x)
+ {
+ case 0:
+ memcpy(box.pBits, dxt1_texture_data, sizeof(dxt1_texture_data));
+ break;
+ case 1:
+ memcpy(box.pBits, dxt3_texture_data, sizeof(dxt3_texture_data));
+ break;
+ case 2:
+ memcpy(box.pBits, dxt5_texture_data, sizeof(dxt5_texture_data));
+ break;
+ }
+ hr = IDirect3DVolumeTexture9_UnlockBox(texture, 0);
+ ok(SUCCEEDED(hr), "Failed to unlock volume texture, hr %#x.\n", hr);
- hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00ff00ff, 1.0f, 0);
- ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
- hr = IDirect3DDevice9_BeginScene(device);
- ok(SUCCEEDED(hr), "Failed to begin scene, hr %#x.\n", hr);
- hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, &quads[0], sizeof(*quads));
- ok(SUCCEEDED(hr), "Failed to draw, hr %#x.\n", hr);
- hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, &quads[4], sizeof(*quads));
- ok(SUCCEEDED(hr), "Failed to draw, hr %#x.\n", hr);
- hr = IDirect3DDevice9_EndScene(device);
- ok(SUCCEEDED(hr), "Failed to end scene, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0));
+ ok(SUCCEEDED(hr), "Failed to set FVF, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *)texture);
+ ok(SUCCEEDED(hr), "Failed to set texture, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
+ ok(SUCCEEDED(hr), "Failed to set color op, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
+ ok(SUCCEEDED(hr), "Failed to set color arg, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
+ ok(SUCCEEDED(hr), "Failed to set color op, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
+ ok(SUCCEEDED(hr), "Failed to set mag filter, hr %#x.\n", hr);
- for (i = 0; i < 4; i++)
- {
- color = getPixelColor(device, 80 + 160 * i, 240);
- ok (color_match(color, expected_colors[i], 1),
- "Expected color 0x%08x, got 0x%08x, case %u.\n", expected_colors[i], color, i);
+ hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00ff00ff, 1.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_BeginScene(device);
+ ok(SUCCEEDED(hr), "Failed to begin scene, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, &quads[0], sizeof(*quads));
+ ok(SUCCEEDED(hr), "Failed to draw, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, &quads[4], sizeof(*quads));
+ ok(SUCCEEDED(hr), "Failed to draw, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_EndScene(device);
+ ok(SUCCEEDED(hr), "Failed to end scene, hr %#x.\n", hr);
+
+ for (i = 0; i < 8; i++)
+ {
+ color = getAlphaPixelColor(device, 40 + 80 * i, 240);
+ ok (color_match(color, expected_colors[x][i], 1),
+ "Expected color 0x%08x, got 0x%08x, case %u.\n", expected_colors[x][i], color, i);
+ }
+
+ hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
+ ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr);
+ IDirect3DVolumeTexture9_Release(texture);
+
+ refcount = IDirect3DDevice9_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
}
- hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
- ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr);
- IDirect3DVolumeTexture9_Release(texture);
- refcount = IDirect3DDevice9_Release(device);
- ok(!refcount, "Device has %u references left.\n", refcount);
-done:
IDirect3D9_Release(d3d);
DestroyWindow(window);
}
@@ -24131,7 +24203,7 @@ START_TEST(visual)
zenable_test();
fog_special_test();
volume_srgb_test();
- volume_dxt5_test();
+ volume_dxtn_test();
add_dirty_rect_test();
multisampled_depth_buffer_test();
resz_test();
--
2.7.4
June 21, 2018
[PATCH 2/3] Add format change before upload for non-volume textures
by Connor McAdams
This patch keeps non-volume DXTn textures from being converted to
b8g8r8a8. I have tested it and it does work converting them all, but the
GPU can handle them normally. Volume textures are the only ones the
GPU handles incorrectly.
---
dlls/wined3d/texture.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index c316906..a998b9c 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -1948,6 +1948,32 @@ void wined3d_texture_upload_data(struct wined3d_texture *texture, unsigned int s
bo.addr += src_box->left * format->byte_count;
}
+ if (format->id == WINED3DFMT_DXT5 || format->id == WINED3DFMT_DXT4 ||
+ format->id == WINED3DFMT_DXT3 || format->id == WINED3DFMT_DXT2 ||
+ format->id == WINED3DFMT_DXT1)
+ {
+ if (target == GL_TEXTURE_3D)
+ {
+ struct wined3d_format temp;
+
+ f = *format;
+ temp.upload = f.upload;
+ format = &f;
+ format = wined3d_get_format(gl_info, WINED3DFMT_B8G8R8A8_UNORM, WINED3DUSAGE_TEXTURE);
+ f = *format;
+ f.upload = temp.upload;
+ f.conv_byte_count = 4;
+ format = &f;
+ texture->resource.format_flags &= ~WINED3DFMT_FLAG_BLOCKS;
+ }
+ else
+ {
+ f = *format;
+ f.upload = NULL;
+ format = &f;
+ }
+ }
+
if (format->upload)
{
unsigned int dst_row_pitch, dst_slice_pitch;
--
2.7.4
June 21, 2018
[PATCH 1/3] Add decompression functions for DXT1, DXT3, and DXT5
by Connor McAdams
This adds decompression functions for DXT1, DXT3, and DXT5 formats,
which covers all the possible DXT formats. These are used for
decompressing DXTn volume textures, and converting them to b8g8r8a8.
---
dlls/wined3d/utils.c | 321 ++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 305 insertions(+), 16 deletions(-)
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 937c1bc..ce1ccdf 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -840,6 +840,305 @@ static void convert_s8_uint_d24_float(const BYTE *src, BYTE *dst, UINT src_row_p
}
}
+static void dxt5_decompress_block(const BYTE *src, BYTE *dst, UINT width, UINT height, UINT depth,
+ unsigned int x_pos, unsigned int y_pos, unsigned int z_pos, UINT dst_slice_pitch, UINT64 cur_block)
+{
+ DWORD alpha_lookup;
+ DWORD bgra;
+ DWORD temp;
+ UINT64 alpha_block, alpha_index, color_block, color_index;
+ DWORD *Dest;
+ const UINT64 *Source;
+ unsigned short color[2];
+ unsigned int i, x, y;
+ unsigned char alpha_val, color_val;
+ unsigned char alpha[8];
+ unsigned char r[4];
+ unsigned char g[4];
+ unsigned char b[4];
+
+ Source = (const UINT64 *)(src + cur_block * 16);
+ alpha_block = Source[0];
+ color_block = Source[1];
+
+ alpha[0] = alpha_block & 0xFF;
+ alpha[1] = (alpha_block >> 8) & 0xFF;
+
+ /* Generate alpha lookup values */
+ if (alpha[0] > alpha[1])
+ {
+ for (i = 0; i < 6; i++)
+ alpha[2 + i] = (((6 - i) * alpha[0]) + ((1 + i) * alpha[1])) / 7;
+ }
+ else if (alpha[0] <= alpha[1])
+ {
+ for (i = 0; i < 4; i++)
+ alpha[2 + i] = (((4 - i) * alpha[0]) + ((1 + i) * alpha[1])) / 5;
+ alpha[6] = 0;
+ alpha[7] = 255;
+ }
+
+ /* Generate color lookup values */
+ color[0] = color_block & 0xFFFF;
+ color[1] = (color_block >> 16) & 0xFFFF;
+
+ for (i = 0; i < 2; i++)
+ {
+ temp = (color[i] >> 11) * 255 + 16;
+ r[i] = (temp / 32 + temp) / 32;
+ temp = ((color[i] >> 5) & 0x3F) * 255 + 32;
+ g[i] = (temp / 64 + temp) / 64;
+ temp = (color[i] & 0x1F) * 255 + 16;
+ b[i] = (temp / 32 + temp) / 32;
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ r[2 + i] = (2 * r[0 + i] + r[1 - i]) / 3;
+ g[2 + i] = (2 * g[0 + i] + g[1 - i]) / 3;
+ b[2 + i] = (2 * b[0 + i] + b[1 - i]) / 3;
+ }
+
+ color_index = (color_block >> 32) & 0xFFFFFFFF;
+ alpha_index = (alpha_block >> 16);
+
+ Dest = (DWORD *)(dst + z_pos * dst_slice_pitch);
+
+ for (y = 0; y < 4; y++) {
+ if (y_pos + y >= height)
+ break;
+ for (x = 0; x < 4; x++) {
+ if (x_pos + x >= width)
+ break;
+
+ color_val = 0;
+ alpha_val = 0;
+ bgra = 0;
+
+ color_val = (color_index >> (y * 8));
+ color_val = (color_val >> (x * 2)) & 0x3;
+ alpha_lookup = (alpha_index >> (y * 12)) & 0xFFF;
+ alpha_val = (alpha_lookup >> (x * 3)) & 0x7;
+ bgra = ((alpha[alpha_val] << 24) | (r[color_val] << 16) | (g[color_val] << 8) | b[color_val]);
+ Dest[(y_pos + y) * width + (x_pos + x)] = bgra;
+ }
+ }
+}
+
+static void convert_dxt5_b8g8r8a8_unorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch,
+ UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth)
+{
+ UINT64 current_block;
+ unsigned int x, y, z;
+
+ current_block = 0;
+
+ for (z = 0; z < depth; z++)
+ {
+ for (y = 0; y < height; y += 4)
+ {
+ for (x = 0; x < width; x += 4)
+ {
+ dxt5_decompress_block(src, dst, width, height, depth, x, y, z, dst_slice_pitch, current_block);
+ current_block++;
+ }
+ }
+ }
+}
+
+static void dxt3_decompress_block(const BYTE *src, BYTE *dst, UINT width, UINT height, UINT depth,
+ unsigned int x_pos, unsigned int y_pos, unsigned int z_pos, UINT dst_slice_pitch, UINT64 cur_block)
+{
+ DWORD bgra;
+ DWORD temp;
+ UINT64 alpha_block, alpha_lookup, color_block, color_index;
+ DWORD *Dest;
+ const UINT64 *Source;
+ unsigned short color[2];
+ unsigned int i, x, y;
+ unsigned char alpha_val, color_val;
+ unsigned char r[4];
+ unsigned char g[4];
+ unsigned char b[4];
+
+ Source = (const UINT64 *)(src + cur_block * 16);
+ alpha_block = Source[0];
+ color_block = Source[1];
+
+ /* Generate color lookup values */
+ color[0] = color_block & 0xFFFF;
+ color[1] = (color_block >> 16) & 0xFFFF;
+
+ for (i = 0; i < 2; i++)
+ {
+ temp = (color[i] >> 11) * 255 + 16;
+ r[i] = (temp / 32 + temp) / 32;
+ temp = ((color[i] >> 5) & 0x3F) * 255 + 32;
+ g[i] = (temp / 64 + temp) / 64;
+ temp = (color[i] & 0x1F) * 255 + 16;
+ b[i] = (temp / 32 + temp) / 32;
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ r[2 + i] = (2 * r[0 + i] + r[1 - i]) / 3;
+ g[2 + i] = (2 * g[0 + i] + g[1 - i]) / 3;
+ b[2 + i] = (2 * b[0 + i] + b[1 - i]) / 3;
+ }
+
+ color_index = (color_block >> 32) & 0xFFFFFFFF;
+ Dest = (DWORD *)(dst + z_pos * dst_slice_pitch);
+
+ for (y = 0; y < 4; y++) {
+ if (y_pos + y >= height)
+ break;
+ for (x = 0; x < 4; x++) {
+ if (x_pos + x >= width)
+ break;
+
+ color_val = 0;
+ alpha_val = 0;
+ bgra = 0;
+
+ color_val = (color_index >> (y * 8));
+ color_val = (color_val >> (x * 2)) & 0x3;
+
+ alpha_lookup = (alpha_block >> (y * 16)) & 0xFFFF;
+ alpha_val = (alpha_lookup >> (x * 4)) & 0xF;
+ temp = alpha_val * 255 + 8;
+ alpha_val = (temp / 16 + temp) / 16;
+
+ bgra = ((alpha_val << 24) | (r[color_val] << 16) | (g[color_val] << 8) | b[color_val]);
+ Dest[(y_pos + y) * width + (x_pos + x)] = bgra;
+ }
+ }
+}
+
+static void convert_dxt3_b8g8r8a8_unorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch,
+ UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth)
+{
+ UINT64 current_block;
+ unsigned int x, y, z;
+
+ current_block = 0;
+
+ for (z = 0; z < depth; z++)
+ {
+ for (y = 0; y < height; y += 4)
+ {
+ for (x = 0; x < width; x += 4)
+ {
+ dxt3_decompress_block(src, dst, width, height, depth, x, y, z, dst_slice_pitch, current_block);
+ current_block++;
+ }
+ }
+ }
+}
+
+static void dxt1_decompress_block(const BYTE *src, BYTE *dst, UINT width, UINT height, UINT depth,
+ unsigned int x_pos, unsigned int y_pos, unsigned int z_pos, UINT dst_slice_pitch, UINT64 cur_block)
+{
+ DWORD bgra;
+ DWORD temp;
+ UINT64 color_block, color_index;
+ DWORD *Dest;
+ const UINT64 *Source;
+ unsigned short color[2];
+ unsigned int i, x, y;
+ unsigned char color_val;
+ unsigned char alpha;
+ unsigned char r[4];
+ unsigned char g[4];
+ unsigned char b[4];
+ unsigned char use_alpha;
+
+ Source = (const UINT64 *)(src + cur_block * 8);
+ color_block = Source[0];
+
+ /* Generate color lookup values */
+ color[0] = color_block & 0xFFFF;
+ color[1] = (color_block >> 16) & 0xFFFF;
+
+ for (i = 0; i < 2; i++)
+ {
+ temp = (color[i] >> 11) * 255 + 16;
+ r[i] = (temp / 32 + temp) / 32;
+ temp = ((color[i] >> 5) & 0x3F) * 255 + 32;
+ g[i] = (temp / 64 + temp) / 64;
+ temp = (color[i] & 0x1F) * 255 + 16;
+ b[i] = (temp / 32 + temp) / 32;
+ }
+
+ if (color[0] > color[1])
+ {
+ for (i = 0; i < 2; i++)
+ {
+ r[2 + i] = (2 * r[0 + i] + r[1 - i]) / 3;
+ g[2 + i] = (2 * g[0 + i] + g[1 - i]) / 3;
+ b[2 + i] = (2 * b[0 + i] + b[1 - i]) / 3;
+ }
+ use_alpha = 0;
+ }
+ else if (color[0] <= color[1])
+ {
+ r[2] = (r[0] + r[1]) / 2;
+ g[2] = (g[0] + g[1]) / 2;
+ b[2] = (b[0] + b[1]) / 2;
+
+ r[3] = 0;
+ g[3] = 0;
+ b[3] = 0;
+
+ use_alpha = 1;
+ }
+
+ color_index = (color_block >> 32) & 0xFFFFFFFF;
+ Dest = (DWORD *)(dst + z_pos * dst_slice_pitch);
+
+ for (y = 0; y < 4; y++) {
+ if (y_pos + y >= height)
+ break;
+ for (x = 0; x < 4; x++) {
+ if (x_pos + x >= width)
+ break;
+
+ color_val = 0;
+ bgra = 0;
+
+ color_val = (color_index >> (y * 8));
+ color_val = (color_val >> (x * 2)) & 0x3;
+ if (color_val == 3 && use_alpha == 1)
+ alpha = 0;
+ else
+ alpha = 255;
+
+ bgra = ((alpha << 24) | (r[color_val] << 16) | (g[color_val] << 8) | b[color_val]);
+ Dest[(y_pos + y) * width + (x_pos + x)] = bgra;
+ }
+ }
+}
+
+static void convert_dxt1_b8g8r8a8_unorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch,
+ UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth)
+{
+ UINT64 current_block;
+ unsigned int x, y, z;
+
+ current_block = 0;
+
+ for (z = 0; z < depth; z++)
+ {
+ for (y = 0; y < height; y += 4)
+ {
+ for (x = 0; x < width; x += 4)
+ {
+ dxt1_decompress_block(src, dst, width, height, depth, x, y, z, dst_slice_pitch, current_block);
+ current_block++;
+ }
+ }
+ }
+}
+
static void x8_d24_unorm_upload(const BYTE *src, BYTE *dst,
unsigned int src_row_pitch, unsigned int src_slice_pitch,
unsigned int dst_row_pitch, unsigned int dst_slice_pitch,
@@ -1118,27 +1417,27 @@ static const struct wined3d_format_texture_info format_texture_info[] =
GL_RGBA, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
| WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_COMPRESSED,
- EXT_TEXTURE_COMPRESSION_S3TC, NULL},
+ EXT_TEXTURE_COMPRESSION_S3TC, convert_dxt1_b8g8r8a8_unorm},
{WINED3DFMT_DXT2, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0,
GL_RGBA, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
| WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_COMPRESSED,
- EXT_TEXTURE_COMPRESSION_S3TC, NULL},
+ EXT_TEXTURE_COMPRESSION_S3TC, convert_dxt3_b8g8r8a8_unorm},
{WINED3DFMT_DXT3, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0,
GL_RGBA, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
| WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_COMPRESSED,
- EXT_TEXTURE_COMPRESSION_S3TC, NULL},
+ EXT_TEXTURE_COMPRESSION_S3TC, convert_dxt3_b8g8r8a8_unorm},
{WINED3DFMT_DXT4, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0,
GL_RGBA, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
| WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_COMPRESSED,
- EXT_TEXTURE_COMPRESSION_S3TC, NULL},
+ EXT_TEXTURE_COMPRESSION_S3TC, convert_dxt5_b8g8r8a8_unorm},
{WINED3DFMT_DXT5, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0,
GL_RGBA, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
| WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_COMPRESSED,
- EXT_TEXTURE_COMPRESSION_S3TC, NULL},
+ EXT_TEXTURE_COMPRESSION_S3TC, convert_dxt5_b8g8r8a8_unorm},
{WINED3DFMT_BC1_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0,
GL_RGBA, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
@@ -3394,17 +3693,7 @@ static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_
* for dx9 GPUs support it, some do not, so not supporting DXTn volumes is OK for d3d9.
*
* Note that GL_NV_texture_compression_vtc adds this functionality to OpenGL, but the
- * block layout is not compatible with the one used by d3d. See volume_dxt5_test. */
- idx = get_format_idx(WINED3DFMT_DXT1);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
- idx = get_format_idx(WINED3DFMT_DXT2);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
- idx = get_format_idx(WINED3DFMT_DXT3);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
- idx = get_format_idx(WINED3DFMT_DXT4);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
- idx = get_format_idx(WINED3DFMT_DXT5);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
+ * block layout is not compatible with the one used by d3d. See volume_dxtn_test. */
idx = get_format_idx(WINED3DFMT_BC1_UNORM);
gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
idx = get_format_idx(WINED3DFMT_BC1_UNORM_SRGB);
--
2.7.4
June 21, 2018
[PATCH 0/3] Add DXTn 3D texture support.
by Connor McAdams
This patch series adds support for using DXTn volume textures, by
decompressing and converting them using the CPU. This fixes issues with games
such as Halo Online, and others mentioned in the bugzilla page here:
https://bugs.winehq.org/show_bug.cgi?id=39253
Let me know what needs changed or fixed, this is my first patch, so I assume
it wont be perfect. :)
Thanks,
Connor McAdams (Conmanx360 in IRC)
Connor McAdams (3):
Add decompression functions for DXT1, DXT3, and DXT5
Add format change before upload for non-volume textures
Add new test for DXTn volume textures.
dlls/d3d9/tests/visual.c | 190 +++++++++++++++++++---------
dlls/wined3d/texture.c | 26 ++++
dlls/wined3d/utils.c | 321 ++++++++++++++++++++++++++++++++++++++++++++---
3 files changed, 462 insertions(+), 75 deletions(-)
--
2.7.4
June 21, 2018
[PATCH 2/2] msi: Add support for re-caching package
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/msi/action.c | 42 ++++++++++++++++++++++++++++++++++++++----
dlls/msi/msi.c | 27 +++++++++++++++++++++------
dlls/msi/msipriv.h | 4 +++-
dlls/msi/package.c | 14 ++++++++++++--
dlls/msi/tests/package.c | 6 +++---
5 files changed, 77 insertions(+), 16 deletions(-)
June 21, 2018
[PATCH 1/2] msi: Report error when cached installer has different version
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/msi/package.c | 114
+++++++++++++++++++++++++----------------------
dlls/msi/tests/package.c | 6 +--
2 files changed, 63 insertions(+), 57 deletions(-)
June 21, 2018
[PATCH] winex11.drv: Move condition to the proper place.
by Andrey Gusev
Signed-off-by: Andrey Gusev <andrey.goosev(a)gmail.com>
---
dlls/winex11.drv/event.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
index a0bfe052df..4aee41586f 100644
--- a/dlls/winex11.drv/event.c
+++ b/dlls/winex11.drv/event.c
@@ -1627,8 +1627,8 @@ static void EVENT_DropURLs( HWND hWnd, XClientMessageEvent *event )
PostMessageA( hWnd, WM_DROPFILES, (WPARAM)hDrop, 0L );
}
}
- if( p_data ) XFree(p_data);
}
+ if( p_data ) XFree(p_data);
}
--
2.17.1
June 21, 2018
[PATCH v2] comctl32/imagelist: fix ImageList_Read/Write.
by Denis Malikov
Fix for versions x600 and x620 and pointer calculation for mixing image and mask bits.
Tested on *.reg files extracted from:
- XP/2003 key HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\TrayNotify;
- Vista/7 key HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify
Signed-off-by: Denis Malikov <mdn40000(a)mail.ru>
---
dlls/comctl32/imagelist.c | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c
index a08d60752e..eadbf134b4 100644
--- a/dlls/comctl32/imagelist.c
+++ b/dlls/comctl32/imagelist.c
@@ -80,9 +80,11 @@ struct _IMAGELIST
BOOL color_table_set;
LONG ref; /* reference count */
+ USHORT usVersion; /* keep stream version here */
};
#define IMAGELIST_MAGIC 0x53414D58
+#define IMAGELIST_VERSION 0x101
/* Header used by ImageList_Read() and ImageList_Write() */
#include "pshpack2.h"
@@ -806,6 +808,7 @@ ImageList_Create (INT cx, INT cy, UINT flags,
himl->clrFg = CLR_DEFAULT;
himl->clrBk = CLR_NONE;
himl->color_table_set = FALSE;
+ himl->usVersion = 0;
/* initialize overlay mask indices */
for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++)
@@ -2267,7 +2270,9 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
return NULL;
if (ilHead.usMagic != (('L' << 8) | 'I'))
return NULL;
- if (ilHead.usVersion != 0x101) /* probably version? */
+ if (ilHead.usVersion != IMAGELIST_VERSION &&
+ ilHead.usVersion != 0x600 && /* XP/2003 version */
+ ilHead.usVersion != 0x620) /* Vista/7 version */
return NULL;
TRACE("cx %u, cy %u, flags 0x%04x, cCurImage %u, cMaxImage %u\n",
@@ -2277,6 +2282,9 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
if (!himl)
return NULL;
+ /* keep version from stream */
+ himl->usVersion = ilHead.usVersion;
+
if (!(image_bits = read_bitmap(pstm, image_info)))
{
WARN("failed to read bitmap from stream\n");
@@ -2296,23 +2304,25 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
{
DWORD *ptr = image_bits;
BYTE *mask_ptr = mask_bits;
- int stride = himl->cy * image_info->bmiHeader.biWidth;
+ int stride = himl->cy * (ilHead.usVersion != IMAGELIST_VERSION ? himl->cx : image_info->bmiHeader.biWidth);
+ int image_step = ilHead.usVersion != IMAGELIST_VERSION ? 1 : TILE_COUNT;
+ int mask_step = ilHead.usVersion != IMAGELIST_VERSION ? 4 : 8;
if (image_info->bmiHeader.biHeight > 0) /* bottom-up */
{
ptr += image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride;
- mask_ptr += (image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride) / 8;
+ mask_ptr += (image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride) / mask_step;
stride = -stride;
image_info->bmiHeader.biHeight = himl->cy;
}
else image_info->bmiHeader.biHeight = -himl->cy;
- for (i = 0; i < ilHead.cCurImage; i += TILE_COUNT)
+ for (i = 0; i < ilHead.cCurImage; i += image_step)
{
- add_dib_bits( himl, i, min( ilHead.cCurImage - i, TILE_COUNT ),
+ add_dib_bits( himl, i, min( ilHead.cCurImage - i, image_step ),
himl->cx, himl->cy, image_info, mask_info, ptr, mask_ptr );
ptr += stride;
- mask_ptr += stride / 8;
+ mask_ptr += stride / mask_step;
}
}
else
--
2.16.2.windows.1
June 21, 2018
[PATCH 7/7] ninput: Add RegisterOutputCallbackInteractionContext() stub.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/ninput/main.c | 13 +++++++++++++
dlls/ninput/ninput.spec | 2 +-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/dlls/ninput/main.c b/dlls/ninput/main.c
index 01703749d087..5d2be62fec21 100644
--- a/dlls/ninput/main.c
+++ b/dlls/ninput/main.c
@@ -148,6 +148,19 @@ HRESULT WINAPI SetInteractionConfigurationInteractionContext(HINTERACTIONCONTEXT
return S_OK;
}
+HRESULT WINAPI RegisterOutputCallbackInteractionContext(HINTERACTIONCONTEXT handle,
+ INTERACTION_CONTEXT_OUTPUT_CALLBACK callback, void *data)
+{
+ struct interaction_context *context = context_from_handle(handle);
+
+ FIXME("context %p, callback %p, data %p: stub!.\n", context, callback, data);
+
+ if (!context)
+ return E_HANDLE;
+
+ return S_OK;
+}
+
HRESULT WINAPI ProcessInertiaInteractionContext(HINTERACTIONCONTEXT context)
{
FIXME("context %p: stub!\n", context);
diff --git a/dlls/ninput/ninput.spec b/dlls/ninput/ninput.spec
index 70d296cc597f..e2897872b683 100644
--- a/dlls/ninput/ninput.spec
+++ b/dlls/ninput/ninput.spec
@@ -12,7 +12,7 @@
@ stub ProcessBufferedPacketsInteractionContext
@ stdcall ProcessInertiaInteractionContext(ptr)
@ stub ProcessPointerFramesInteractionContext
-@ stub RegisterOutputCallbackInteractionContext
+@ stdcall RegisterOutputCallbackInteractionContext(ptr ptr ptr)
@ stub RemovePointerInteractionContext
@ stub ResetInteractionContext
@ stub SetCrossSlideParametersInteractionContext
--
2.16.4
June 21, 2018
[PATCH 6/7] ninput: Add SetInteractionConfigurationInteractionContext() stub.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/ninput/main.c | 17 +++++++++++++++++
dlls/ninput/ninput.spec | 2 +-
dlls/ninput/tests/ninput.c | 36 ++++++++++++++++++++++++++++++++++++
3 files changed, 54 insertions(+), 1 deletion(-)
diff --git a/dlls/ninput/main.c b/dlls/ninput/main.c
index 90f9e7e0c4ee..01703749d087 100644
--- a/dlls/ninput/main.c
+++ b/dlls/ninput/main.c
@@ -131,6 +131,23 @@ HRESULT WINAPI SetPropertyInteractionContext(HINTERACTIONCONTEXT handle,
}
}
+HRESULT WINAPI SetInteractionConfigurationInteractionContext(HINTERACTIONCONTEXT handle,
+ UINT32 count, const INTERACTION_CONTEXT_CONFIGURATION *configuration)
+{
+ struct interaction_context *context = context_from_handle(handle);
+
+ FIXME("context %p, count %u, configuration %p: stub!.\n", context, count, configuration);
+
+ if (!context)
+ return E_HANDLE;
+ if (!count)
+ return E_INVALIDARG;
+ if (!configuration)
+ return E_POINTER;
+
+ return S_OK;
+}
+
HRESULT WINAPI ProcessInertiaInteractionContext(HINTERACTIONCONTEXT context)
{
FIXME("context %p: stub!\n", context);
diff --git a/dlls/ninput/ninput.spec b/dlls/ninput/ninput.spec
index 166e3d1ec8c1..70d296cc597f 100644
--- a/dlls/ninput/ninput.spec
+++ b/dlls/ninput/ninput.spec
@@ -17,7 +17,7 @@
@ stub ResetInteractionContext
@ stub SetCrossSlideParametersInteractionContext
@ stub SetInertiaParameterInteractionContext
-@ stub SetInteractionConfigurationInteractionContext
+@ stdcall SetInteractionConfigurationInteractionContext(ptr long ptr)
@ stub SetMouseWheelParameterInteractionContext
@ stub SetPivotInteractionContext
@ stdcall SetPropertyInteractionContext(ptr long long)
diff --git a/dlls/ninput/tests/ninput.c b/dlls/ninput/tests/ninput.c
index 156e3e898366..7fd389378b01 100644
--- a/dlls/ninput/tests/ninput.c
+++ b/dlls/ninput/tests/ninput.c
@@ -82,8 +82,44 @@ static void test_properties(void)
ok(hr == S_OK, "Failed to destroy context, hr %#x.\n", hr);
}
+static void test_configuration(void)
+{
+ HINTERACTIONCONTEXT context;
+ HRESULT hr;
+
+ static const INTERACTION_CONTEXT_CONFIGURATION config[] =
+ {
+ {
+ INTERACTION_ID_MANIPULATION,
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION |
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION_TRANSLATION_X |
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION_TRANSLATION_Y |
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION_SCALING |
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION_TRANSLATION_INERTIA |
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION_SCALING_INERTIA
+ },
+ };
+
+ hr = CreateInteractionContext(&context);
+ ok(hr == S_OK, "Failed to create context, hr %#x.\n", hr);
+
+ hr = SetInteractionConfigurationInteractionContext(NULL, 0, NULL);
+ ok(hr == E_HANDLE, "Got hr %#x.\n", hr);
+ hr = SetInteractionConfigurationInteractionContext(context, 0, NULL);
+ ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+ hr = SetInteractionConfigurationInteractionContext(context, 1, NULL);
+ ok(hr == E_POINTER, "Got hr %#x.\n", hr);
+
+ hr = SetInteractionConfigurationInteractionContext(context, ARRAY_SIZE(config), config);
+ ok(hr == S_OK, "Failed to set configuration, hr %#x.\n", hr);
+
+ hr = DestroyInteractionContext(context);
+ ok(hr == S_OK, "Failed to destroy context, hr %#x.\n", hr);
+}
+
START_TEST(ninput)
{
test_context();
test_properties();
+ test_configuration();
}
--
2.16.4
June 21, 2018
[PATCH 5/7] ninput: Implement SetPropertyInteractionContext().
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/ninput/main.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++
dlls/ninput/ninput.spec | 4 ++--
dlls/ninput/tests/ninput.c | 48 +++++++++++++++++++++++++++++++++++++
3 files changed, 109 insertions(+), 2 deletions(-)
diff --git a/dlls/ninput/main.c b/dlls/ninput/main.c
index 932d159ab390..90f9e7e0c4ee 100644
--- a/dlls/ninput/main.c
+++ b/dlls/ninput/main.c
@@ -72,6 +72,65 @@ HRESULT WINAPI DestroyInteractionContext(HINTERACTIONCONTEXT handle)
return S_OK;
}
+HRESULT WINAPI GetPropertyInteractionContext(HINTERACTIONCONTEXT handle,
+ INTERACTION_CONTEXT_PROPERTY property, UINT32 *value)
+{
+ struct interaction_context *context = context_from_handle(handle);
+
+ TRACE("context %p, property %#x, value %p.\n", context, property, value);
+
+ if (!context)
+ return E_HANDLE;
+ if (!value)
+ return E_POINTER;
+
+ switch (property)
+ {
+ case INTERACTION_CONTEXT_PROPERTY_MEASUREMENT_UNITS:
+ case INTERACTION_CONTEXT_PROPERTY_INTERACTION_UI_FEEDBACK:
+ FIXME("Unhandled property %#x.\n", property);
+ *value = 0;
+ return E_NOTIMPL;
+
+ case INTERACTION_CONTEXT_PROPERTY_FILTER_POINTERS:
+ *value = context->filter_pointers;
+ return S_OK;
+
+ default:
+ WARN("Invalid property %#x.\n", property);
+ return E_INVALIDARG;
+ }
+}
+
+HRESULT WINAPI SetPropertyInteractionContext(HINTERACTIONCONTEXT handle,
+ INTERACTION_CONTEXT_PROPERTY property, UINT32 value)
+{
+ struct interaction_context *context = context_from_handle(handle);
+
+ TRACE("context %p, property %#x, value %#x.\n", context, property, value);
+
+ if (!context)
+ return E_HANDLE;
+
+ switch (property)
+ {
+ case INTERACTION_CONTEXT_PROPERTY_MEASUREMENT_UNITS:
+ case INTERACTION_CONTEXT_PROPERTY_INTERACTION_UI_FEEDBACK:
+ FIXME("Unhandled property %#x.\n", property);
+ return E_NOTIMPL;
+
+ case INTERACTION_CONTEXT_PROPERTY_FILTER_POINTERS:
+ if (value != FALSE && value != TRUE)
+ return E_INVALIDARG;
+ context->filter_pointers = value;
+ return S_OK;
+
+ default:
+ WARN("Invalid property %#x.\n", property);
+ return E_INVALIDARG;
+ }
+}
+
HRESULT WINAPI ProcessInertiaInteractionContext(HINTERACTIONCONTEXT context)
{
FIXME("context %p: stub!\n", context);
diff --git a/dlls/ninput/ninput.spec b/dlls/ninput/ninput.spec
index fe7c6b3c53b3..166e3d1ec8c1 100644
--- a/dlls/ninput/ninput.spec
+++ b/dlls/ninput/ninput.spec
@@ -7,7 +7,7 @@
@ stub GetInertiaParameterInteractionContext
@ stub GetInteractionConfigurationInteractionContext
@ stub GetMouseWheelParameterInteractionContext
-@ stub GetPropertyInteractionContext
+@ stdcall GetPropertyInteractionContext(ptr long ptr)
@ stub GetStateInteractionContext
@ stub ProcessBufferedPacketsInteractionContext
@ stdcall ProcessInertiaInteractionContext(ptr)
@@ -20,5 +20,5 @@
@ stub SetInteractionConfigurationInteractionContext
@ stub SetMouseWheelParameterInteractionContext
@ stub SetPivotInteractionContext
-@ stub SetPropertyInteractionContext
+@ stdcall SetPropertyInteractionContext(ptr long long)
@ stub StopInteractionContext
diff --git a/dlls/ninput/tests/ninput.c b/dlls/ninput/tests/ninput.c
index d894ab8a847a..156e3e898366 100644
--- a/dlls/ninput/tests/ninput.c
+++ b/dlls/ninput/tests/ninput.c
@@ -35,7 +35,55 @@ static void test_context(void)
ok(hr == E_HANDLE, "Got hr %#x.\n", hr);
}
+static void test_properties(void)
+{
+ HINTERACTIONCONTEXT context;
+ UINT32 value;
+ HRESULT hr;
+
+ hr = CreateInteractionContext(&context);
+ ok(hr == S_OK, "Failed to create context, hr %#x.\n", hr);
+
+ hr = GetPropertyInteractionContext(context, INTERACTION_CONTEXT_PROPERTY_FILTER_POINTERS, &value);
+ ok(hr == S_OK, "Failed to get property, hr %#x.\n", hr);
+ ok(value == TRUE, "Got unexpected value %#x.\n", value);
+
+ hr = SetPropertyInteractionContext(context, INTERACTION_CONTEXT_PROPERTY_FILTER_POINTERS, TRUE);
+ ok(hr == S_OK, "Failed to set property, hr %#x.\n", hr);
+ hr = GetPropertyInteractionContext(context, INTERACTION_CONTEXT_PROPERTY_FILTER_POINTERS, &value);
+ ok(hr == S_OK, "Failed to get property, hr %#x.\n", hr);
+ ok(value == TRUE, "Got unexpected value %#x.\n", value);
+
+ hr = SetPropertyInteractionContext(context, INTERACTION_CONTEXT_PROPERTY_FILTER_POINTERS, FALSE);
+ ok(hr == S_OK, "Failed to set property, hr %#x.\n", hr);
+ hr = GetPropertyInteractionContext(context, INTERACTION_CONTEXT_PROPERTY_FILTER_POINTERS, &value);
+ ok(hr == S_OK, "Failed to get property, hr %#x.\n", hr);
+ ok(value == FALSE, "Got unexpected value %#x.\n", value);
+
+ hr = SetPropertyInteractionContext(context, INTERACTION_CONTEXT_PROPERTY_FILTER_POINTERS, 2);
+ ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+ hr = SetPropertyInteractionContext(context, INTERACTION_CONTEXT_PROPERTY_FILTER_POINTERS, 3);
+ ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+
+ hr = SetPropertyInteractionContext(context, 0xdeadbeef, 0);
+ ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+ hr = GetPropertyInteractionContext(context, 0xdeadbeef, &value);
+ ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+
+ hr = GetPropertyInteractionContext(context, INTERACTION_CONTEXT_PROPERTY_FILTER_POINTERS, NULL);
+ ok(hr == E_POINTER, "Got hr %#x.\n", hr);
+
+ hr = SetPropertyInteractionContext(NULL, INTERACTION_CONTEXT_PROPERTY_FILTER_POINTERS, FALSE);
+ ok(hr == E_HANDLE, "Got hr %#x.\n", hr);
+ hr = GetPropertyInteractionContext(NULL, INTERACTION_CONTEXT_PROPERTY_FILTER_POINTERS, &value);
+ ok(hr == E_HANDLE, "Got hr %#x.\n", hr);
+
+ hr = DestroyInteractionContext(context);
+ ok(hr == S_OK, "Failed to destroy context, hr %#x.\n", hr);
+}
+
START_TEST(ninput)
{
test_context();
+ test_properties();
}
--
2.16.4
June 21, 2018
[PATCH 4/7] ninput: Add ProcessInertiaInteractionContext() stub.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/ninput/main.c | 6 ++++++
dlls/ninput/ninput.spec | 2 +-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/dlls/ninput/main.c b/dlls/ninput/main.c
index 1aa3c4652b6e..932d159ab390 100644
--- a/dlls/ninput/main.c
+++ b/dlls/ninput/main.c
@@ -72,6 +72,12 @@ HRESULT WINAPI DestroyInteractionContext(HINTERACTIONCONTEXT handle)
return S_OK;
}
+HRESULT WINAPI ProcessInertiaInteractionContext(HINTERACTIONCONTEXT context)
+{
+ FIXME("context %p: stub!\n", context);
+ return E_NOTIMPL;
+}
+
BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, void *reserved)
{
TRACE("(%p, %d, %p)\n", inst, reason, reserved);
diff --git a/dlls/ninput/ninput.spec b/dlls/ninput/ninput.spec
index 0717cb1c2f47..fe7c6b3c53b3 100644
--- a/dlls/ninput/ninput.spec
+++ b/dlls/ninput/ninput.spec
@@ -10,7 +10,7 @@
@ stub GetPropertyInteractionContext
@ stub GetStateInteractionContext
@ stub ProcessBufferedPacketsInteractionContext
-@ stub ProcessInertiaInteractionContext
+@ stdcall ProcessInertiaInteractionContext(ptr)
@ stub ProcessPointerFramesInteractionContext
@ stub RegisterOutputCallbackInteractionContext
@ stub RemovePointerInteractionContext
--
2.16.4
June 21, 2018
[PATCH 3/7] ninput: Implement CreateInteractionContext().
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
For bug 44720
---
configure | 1 +
configure.ac | 1 +
dlls/ninput/Makefile.in | 1 +
dlls/ninput/main.c | 53 ++++++++++++++++++++++++++++++++++++++++---
dlls/ninput/ninput.spec | 4 ++--
dlls/ninput/tests/Makefile.in | 4 ++++
dlls/ninput/tests/ninput.c | 41 +++++++++++++++++++++++++++++++++
7 files changed, 100 insertions(+), 5 deletions(-)
create mode 100644 dlls/ninput/tests/Makefile.in
create mode 100644 dlls/ninput/tests/ninput.c
diff --git a/configure b/configure
index bcb660d56982..26aa115002d9 100755
--- a/configure
+++ b/configure
@@ -19023,6 +19023,7 @@ wine_fn_config_makefile dlls/netprofm enable_netprofm
wine_fn_config_makefile dlls/netprofm/tests enable_tests
wine_fn_config_makefile dlls/newdev enable_newdev
wine_fn_config_makefile dlls/ninput enable_ninput
+wine_fn_config_makefile dlls/ninput/tests enable_tests
wine_fn_config_makefile dlls/normaliz enable_normaliz
wine_fn_config_makefile dlls/npmshtml enable_npmshtml
wine_fn_config_makefile dlls/npptools enable_npptools
diff --git a/configure.ac b/configure.ac
index 469fa8d72977..0f7e130c322e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3522,6 +3522,7 @@ WINE_CONFIG_MAKEFILE(dlls/netprofm)
WINE_CONFIG_MAKEFILE(dlls/netprofm/tests)
WINE_CONFIG_MAKEFILE(dlls/newdev)
WINE_CONFIG_MAKEFILE(dlls/ninput)
+WINE_CONFIG_MAKEFILE(dlls/ninput/tests)
WINE_CONFIG_MAKEFILE(dlls/normaliz)
WINE_CONFIG_MAKEFILE(dlls/npmshtml)
WINE_CONFIG_MAKEFILE(dlls/npptools)
diff --git a/dlls/ninput/Makefile.in b/dlls/ninput/Makefile.in
index 3d3cc7fe85e8..8f1039b73c86 100644
--- a/dlls/ninput/Makefile.in
+++ b/dlls/ninput/Makefile.in
@@ -1,4 +1,5 @@
MODULE = ninput.dll
+IMPORTLIB = ninput
C_SRCS = \
main.c
diff --git a/dlls/ninput/main.c b/dlls/ninput/main.c
index 0f23128cfe4d..1aa3c4652b6e 100644
--- a/dlls/ninput/main.c
+++ b/dlls/ninput/main.c
@@ -22,19 +22,66 @@
#include "windef.h"
#include "winbase.h"
#include "wine/debug.h"
+#include "wine/heap.h"
+
+#include "interactioncontext.h"
WINE_DEFAULT_DEBUG_CHANNEL(ninput);
-BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD reason, LPVOID lpv)
+struct interaction_context
+{
+ BOOL filter_pointers;
+};
+
+static struct interaction_context *context_from_handle(HINTERACTIONCONTEXT handle)
+{
+ return (struct interaction_context *)handle;
+}
+
+HRESULT WINAPI CreateInteractionContext(HINTERACTIONCONTEXT *handle)
+{
+ struct interaction_context *context;
+
+ TRACE("handle %p.\n", handle);
+
+ if (!handle)
+ return E_POINTER;
+
+ if (!(context = heap_alloc(sizeof(*context))))
+ return E_OUTOFMEMORY;
+
+ context->filter_pointers = TRUE;
+
+ TRACE("Created context %p.\n", context);
+
+ *handle = (HINTERACTIONCONTEXT)context;
+
+ return S_OK;
+}
+
+HRESULT WINAPI DestroyInteractionContext(HINTERACTIONCONTEXT handle)
+{
+ struct interaction_context *context = context_from_handle(handle);
+
+ TRACE("context %p.\n", context);
+
+ if (!context)
+ return E_HANDLE;
+
+ heap_free(context);
+ return S_OK;
+}
+
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, void *reserved)
{
- TRACE("(%p, %d, %p)\n", hInstDLL, reason, lpv);
+ TRACE("(%p, %d, %p)\n", inst, reason, reserved);
switch (reason)
{
case DLL_WINE_PREATTACH:
return FALSE; /* prefer native version */
case DLL_PROCESS_ATTACH:
- DisableThreadLibraryCalls(hInstDLL);
+ DisableThreadLibraryCalls(inst);
break;
}
return TRUE;
diff --git a/dlls/ninput/ninput.spec b/dlls/ninput/ninput.spec
index 372beb20eb15..0717cb1c2f47 100644
--- a/dlls/ninput/ninput.spec
+++ b/dlls/ninput/ninput.spec
@@ -1,8 +1,8 @@
@ stub DefaultInputHandler
@ stub AddPointerInteractionContext
@ stub BufferPointerPacketsInteractionContext
-@ stub CreateInteractionContext
-@ stub DestroyInteractionContext
+@ stdcall CreateInteractionContext(ptr)
+@ stdcall DestroyInteractionContext(ptr)
@ stub GetCrossSlideParameterInteractionContext
@ stub GetInertiaParameterInteractionContext
@ stub GetInteractionConfigurationInteractionContext
diff --git a/dlls/ninput/tests/Makefile.in b/dlls/ninput/tests/Makefile.in
new file mode 100644
index 000000000000..9c0b44fa17dc
--- /dev/null
+++ b/dlls/ninput/tests/Makefile.in
@@ -0,0 +1,4 @@
+TESTDLL = ninput.dll
+IMPORTS = ninput
+
+C_SRCS = ninput.c
diff --git a/dlls/ninput/tests/ninput.c b/dlls/ninput/tests/ninput.c
new file mode 100644
index 000000000000..d894ab8a847a
--- /dev/null
+++ b/dlls/ninput/tests/ninput.c
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2018 Józef Kucia
+ *
+ * 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 "interactioncontext.h"
+#include "wine/test.h"
+
+static void test_context(void)
+{
+ HINTERACTIONCONTEXT context;
+ HRESULT hr;
+
+ hr = CreateInteractionContext(&context);
+ ok(hr == S_OK, "Failed to create context, hr %#x.\n", hr);
+ hr = DestroyInteractionContext(context);
+ ok(hr == S_OK, "Failed to destroy context, hr %#x.\n", hr);
+
+ hr = CreateInteractionContext(NULL);
+ ok(hr == E_POINTER, "Got hr %#x.\n", hr);
+ hr = DestroyInteractionContext(NULL);
+ ok(hr == E_HANDLE, "Got hr %#x.\n", hr);
+}
+
+START_TEST(ninput)
+{
+ test_context();
+}
--
2.16.4
June 21, 2018
[PATCH 2/7] include: Add interactioncontext.h.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
include/Makefile.in | 1 +
include/interactioncontext.h | 195 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 196 insertions(+)
create mode 100644 include/interactioncontext.h
diff --git a/include/Makefile.in b/include/Makefile.in
index 78ab095d77e7..72a701090047 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -314,6 +314,7 @@ SOURCES = \
inputscope.idl \
inseng.idl \
inspectable.idl \
+ interactioncontext.h \
intshcut.h \
ipexport.h \
iphlpapi.h \
diff --git a/include/interactioncontext.h b/include/interactioncontext.h
new file mode 100644
index 000000000000..a643b626cd7e
--- /dev/null
+++ b/include/interactioncontext.h
@@ -0,0 +1,195 @@
+/*
+ * Copyright 2018 Józef Kucia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef INTERACTION_CONTEXT_H
+#define INTERACTION_CONTEXT_H
+
+#include <windows.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+DECLARE_HANDLE(HINTERACTIONCONTEXT);
+
+typedef enum INTERACTION_CONTEXT_PROPERTY
+{
+ INTERACTION_CONTEXT_PROPERTY_MEASUREMENT_UNITS = 1,
+ INTERACTION_CONTEXT_PROPERTY_INTERACTION_UI_FEEDBACK = 2,
+ INTERACTION_CONTEXT_PROPERTY_FILTER_POINTERS = 3,
+ INTERACTION_CONTEXT_PROPERTY_MAX = 0xffffffff,
+} INTERACTION_CONTEXT_PROPERTY;
+
+typedef enum INTERACTION_ID
+{
+ INTERACTION_ID_NONE = 0,
+ INTERACTION_ID_MANIPULATION = 1,
+ INTERACTION_ID_TAP = 2,
+ INTERACTION_ID_SECONDARY_TAP = 3,
+ INTERACTION_ID_HOLD = 4,
+ INTERACTION_ID_DRAG = 5,
+ INTERACTION_ID_CROSS_SLIDE = 6,
+ INTERACTION_ID_MAX = 0xffffffff,
+} INTERACTION_ID;
+
+typedef enum INTERACTION_FLAGS
+{
+ INTERACTION_FLAG_NONE = 0x00000000,
+ INTERACTION_FLAG_BEGIN = 0x00000001,
+ INTERACTION_FLAG_END = 0x00000002,
+ INTERACTION_FLAG_CANCEL = 0x00000004,
+ INTERACTION_FLAG_INERTIA = 0x00000008,
+ INTERACTION_FLAG_MAX = 0xffffffff,
+} INTERACTION_FLAGS;
+
+typedef enum INTERACTION_CONFIGURATION_FLAGS
+{
+ INTERACTION_CONFIGURATION_FLAG_NONE = 0x00000000,
+
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION = 0x00000001,
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION_TRANSLATION_X = 0x00000002,
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION_TRANSLATION_Y = 0x00000004,
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION_ROTATION = 0x00000008,
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION_SCALING = 0x00000010,
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION_TRANSLATION_INERTIA = 0x00000020,
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION_ROTATION_INERTIA = 0x00000040,
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION_SCALING_INERTIA = 0x00000080,
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION_RAILS_X = 0x00000100,
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION_RAILS_Y = 0x00000200,
+ INTERACTION_CONFIGURATION_FLAG_MANIPULATION_EXACT = 0x00000400,
+
+ INTERACTION_CONFIGURATION_FLAG_TAP = 0x00000001,
+ INTERACTION_CONFIGURATION_FLAG_TAP_DOUBLE = 0x00000002,
+
+ INTERACTION_CONFIGURATION_FLAG_SECONDARY_TAP = 0x00000001,
+
+ INTERACTION_CONFIGURATION_FLAG_HOLD = 0x00000001,
+ INTERACTION_CONFIGURATION_FLAG_HOLD_MOUSE = 0x00000002,
+
+ INTERACTION_CONFIGURATION_FLAG_DRAG = 0x00000001,
+
+ INTERACTION_CONFIGURATION_FLAG_CROSS_SLIDE = 0x00000001,
+ INTERACTION_CONFIGURATION_FLAG_CROSS_SLIDE_HORIZONTAL = 0x00000002,
+ INTERACTION_CONFIGURATION_FLAG_CROSS_SLIDE_SELECT = 0x00000004,
+ INTERACTION_CONFIGURATION_FLAG_CROSS_SLIDE_SPEED_BUMP = 0x00000008,
+ INTERACTION_CONFIGURATION_FLAG_CROSS_SLIDE_REARRANGE = 0x00000010,
+ INTERACTION_CONFIGURATION_FLAG_CROSS_SLIDE_EXACT = 0x00000020,
+
+ INTERACTION_CONFIGURATION_FLAG_MAX = 0xffffffff,
+} INTERACTION_CONFIGURATION_FLAGS;
+
+typedef struct INTERACTION_CONTEXT_CONFIGURATION
+{
+ INTERACTION_ID interactionId;
+ INTERACTION_CONFIGURATION_FLAGS enable;
+
+} INTERACTION_CONTEXT_CONFIGURATION;
+
+typedef struct MANIPULATION_TRANSFORM
+{
+ float translationX;
+ float translationY;
+ float scale;
+ float expansion;
+ float rotation;
+} MANIPULATION_TRANSFORM;
+
+typedef struct MANIPULATION_VELOCITY
+{
+ float velocityX;
+ float velocityY;
+ float velocityExapnsion;
+ float velocityAngular;
+} MANIPULATION_VELOCITY;
+
+typedef enum MANIPULATION_RAILS_STATE
+{
+ MANIPULATION_RAILS_STATE_UNDECIDED = 0,
+ MANIPULATION_RAILS_STATE_FREE = 1,
+ MANIPULATION_RAILS_STATE_RAILED = 2,
+ MANIPULATION_RAILS_STATE_MAX = 0xffffffff,
+} MANIPULATION_RAILS_STATE;
+
+typedef struct INTERACTION_ARGUMENTS_MANIPULATION
+{
+ MANIPULATION_TRANSFORM delta;
+ MANIPULATION_TRANSFORM cumulative;
+ MANIPULATION_VELOCITY veolcity;
+ MANIPULATION_RAILS_STATE railsState;
+} INTERACTION_ARGUMENTS_MANIPULATION;
+
+typedef struct INTERACTION_ARGUMENTS_TAP
+{
+ UINT32 count;
+} INTERACTION_ARGUMENTS_TAP;
+
+typedef enum CROSS_SLIDE_FLAGS
+{
+ CROSS_SLIDE_FLAGS_NONE = 0x00000000,
+ CROSS_SLIDE_FLAGS_SELECT = 0x00000001,
+ CROSS_SLIDE_FLAGS_SPEED_BUMP = 0x00000002,
+ CROSS_SLIDE_FLAGS_REARRANGE = 0x00000004,
+ CROSS_SLIDE_FLAGS_MAX = 0xffffffff,
+} CROSS_SLIDE_FLAGS;
+
+typedef struct INTERACTION_ARGUMENTS_CROSS_SLIDE
+{
+ CROSS_SLIDE_FLAGS flags;
+} INTERACTION_ARGUMENTS_CROSS_SLIDE;
+
+typedef struct INTERACTION_CONTEXT_OUTPUT
+{
+ INTERACTION_ID interactionId;
+ INTERACTION_FLAGS interactionFlags;
+ POINTER_INPUT_TYPE inputType;
+ float x;
+ float y;
+ union
+ {
+ INTERACTION_ARGUMENTS_MANIPULATION manipulation;
+ INTERACTION_ARGUMENTS_TAP tap;
+ INTERACTION_ARGUMENTS_CROSS_SLIDE crossSlide;
+ } arguments;
+} INTERACTION_CONTEXT_OUTPUT;
+
+typedef void (CALLBACK *INTERACTION_CONTEXT_OUTPUT_CALLBACK)(void *data,
+ const INTERACTION_CONTEXT_OUTPUT *output);
+
+HRESULT WINAPI CreateInteractionContext(HINTERACTIONCONTEXT *context);
+HRESULT WINAPI DestroyInteractionContext(HINTERACTIONCONTEXT context);
+
+HRESULT WINAPI ProcessInertiaInteractionContext(HINTERACTIONCONTEXT context);
+
+HRESULT WINAPI RegisterOutputCallbackInteractionContext(HINTERACTIONCONTEXT context,
+ INTERACTION_CONTEXT_OUTPUT_CALLBACK callback, void *data);
+
+HRESULT WINAPI GetInteractionConfigurationInteractionContext(HINTERACTIONCONTEXT context,
+ UINT32 count, INTERACTION_CONTEXT_CONFIGURATION *configuration);
+HRESULT WINAPI SetInteractionConfigurationInteractionContext(HINTERACTIONCONTEXT context,
+ UINT32 count, const INTERACTION_CONTEXT_CONFIGURATION *configuration);
+
+HRESULT WINAPI GetPropertyInteractionContext(HINTERACTIONCONTEXT context,
+ INTERACTION_CONTEXT_PROPERTY proerty, UINT32 *value);
+HRESULT WINAPI SetPropertyInteractionContext(HINTERACTIONCONTEXT context,
+ INTERACTION_CONTEXT_PROPERTY property, UINT32 value);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* defined(__cplusplus) */
+
+#endif
--
2.16.4
June 21, 2018
[PATCH 1/7] include: Add POINTER_INPUT_TYPE.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
include/winuser.h | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/include/winuser.h b/include/winuser.h
index f546a4a1f3da..ceaf82dcb528 100644
--- a/include/winuser.h
+++ b/include/winuser.h
@@ -3377,6 +3377,15 @@ typedef struct tagPOINTER_DEVICE_INFO {
WCHAR productString[POINTER_DEVICE_PRODUCT_STRING_MAX];
} POINTER_DEVICE_INFO;
+enum tagPOINTER_INPUT_TYPE
+{
+ PT_POINTER = 1,
+ PT_TOUCH = 2,
+ PT_PEN = 3,
+ PT_MOUSE = 4,
+};
+typedef DWORD POINTER_INPUT_TYPE;
+
#if defined(_WINGDI_) && !defined(NOGDI)
WINUSERAPI LONG WINAPI ChangeDisplaySettingsA(LPDEVMODEA,DWORD);
WINUSERAPI LONG WINAPI ChangeDisplaySettingsW(LPDEVMODEW,DWORD);
--
2.16.4
June 21, 2018
[PATCH] shell32/tests: Don't test CommandLineToArgv() in test_argify().
by Zebediah Figura
This is essentially redundant. We should have tests for all behaviours of
CommandLineToArgv() above; the purpose of test_argify() is to test how
ShellExecute() et al. parses its parameters, and to show that this is
different from CommandLineToArgv().
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/shell32/tests/shlexec.c | 167 +++++++++++++++----------------------------
1 file changed, 59 insertions(+), 108 deletions(-)
diff --git a/dlls/shell32/tests/shlexec.c b/dlls/shell32/tests/shlexec.c
index c67cc46..ab77fa1 100644
--- a/dlls/shell32/tests/shlexec.c
+++ b/dlls/shell32/tests/shlexec.c
@@ -1418,8 +1418,8 @@ typedef struct
const char* verb;
const char* params;
int todo;
- cmdline_tests_t cmd;
- cmdline_tests_t broken;
+ const char *cmd;
+ const char *broken;
} argify_tests_t;
static const argify_tests_t argify_tests[] =
@@ -1429,33 +1429,28 @@ static const argify_tests_t argify_tests[] =
* parameters string, including the trailing spaces, no matter what
* arguments have already been used.
*/
- {"Params232S", "p2 p3 p4 ", 0xc2,
- {" p2 p3 \"p2\" \"p2 p3 p4 \"",
- {"", "p2", "p3", "p2", "p2 p3 p4 ", NULL}, 0}},
+ {"Params232S", "p2 p3 p4 ", TRUE,
+ " p2 p3 \"p2\" \"p2 p3 p4 \""},
/* Unquoted argument references like %2 don't automatically quote their
* argument. Similarly, when they are quoted they don't escape the quotes
* that their argument may contain.
*/
- {"Params232S", "\"p two\" p3 p4 ", 0x3f3,
- {" p two p3 \"p two\" \"\"p two\" p3 p4 \"",
- {"", "p", "two", "p3", "p two", "p", "two p3 p4 ", NULL}, 0}},
+ {"Params232S", "\"p two\" p3 p4 ", TRUE,
+ " p two p3 \"p two\" \"\"p two\" p3 p4 \""},
/* Only single digits are supported so only %1 to %9. Shown here with %20
* because %10 is a pain.
*/
- {"Params20", "p", 0,
- {" \"p0\"",
- {"", "p0", NULL}, 0}},
+ {"Params20", "p", FALSE,
+ " \"p0\""},
/* Only (double-)quotes have a special meaning. */
- {"Params23456", "'p2 p3` p4\\ $even", 0x40,
- {" \"'p2\" \"p3`\" \"p4\\\" \"$even\" \"\"",
- {"", "'p2", "p3`", "p4\" $even \"", NULL}, 0}},
+ {"Params23456", "'p2 p3` p4\\ $even", FALSE,
+ " \"'p2\" \"p3`\" \"p4\\\" \"$even\" \"\""},
- {"Params23456", "p=2 p-3 p4\tp4\rp4\np4", 0x1c2,
- {" \"p=2\" \"p-3\" \"p4\tp4\rp4\np4\" \"\" \"\"",
- {"", "p=2", "p-3", "p4\tp4\rp4\np4", "", "", NULL}, 0}},
+ {"Params23456", "p=2 p-3 p4\tp4\rp4\np4", TRUE,
+ " \"p=2\" \"p-3\" \"p4\tp4\rp4\np4\" \"\" \"\""},
/* In unquoted strings, quotes are treated are a parameter separator just
* like spaces! However they can be doubled to get a literal quote.
@@ -1463,125 +1458,102 @@ static const argify_tests_t argify_tests[] =
* 2n quotes -> n quotes
* 2n+1 quotes -> n quotes and a parameter separator
*/
- {"Params23456789", "one\"quote \"p four\" one\"quote p7", 0xff3,
- {" \"one\" \"quote\" \"p four\" \"one\" \"quote\" \"p7\" \"\" \"\"",
- {"", "one", "quote", "p four", "one", "quote", "p7", "", "", NULL}, 0}},
+ {"Params23456789", "one\"quote \"p four\" one\"quote p7", TRUE,
+ " \"one\" \"quote\" \"p four\" \"one\" \"quote\" \"p7\" \"\" \"\""},
- {"Params23456789", "two\"\"quotes \"p three\" two\"\"quotes p5", 0xf2,
- {" \"two\"quotes\" \"p three\" \"two\"quotes\" \"p5\" \"\" \"\" \"\" \"\"",
- {"", "twoquotes p", "three twoquotes", "p5", "", "", "", "", NULL}, 0}},
+ {"Params23456789", "two\"\"quotes \"p three\" two\"\"quotes p5", TRUE,
+ " \"two\"quotes\" \"p three\" \"two\"quotes\" \"p5\" \"\" \"\" \"\" \"\""},
- {"Params23456789", "three\"\"\"quotes \"p four\" three\"\"\"quotes p6", 0xff3,
- {" \"three\"\" \"quotes\" \"p four\" \"three\"\" \"quotes\" \"p6\" \"\" \"\"",
- {"", "three\"", "quotes", "p four", "three\"", "quotes", "p6", "", "", NULL}, 0}},
+ {"Params23456789", "three\"\"\"quotes \"p four\" three\"\"\"quotes p6", TRUE,
+ " \"three\"\" \"quotes\" \"p four\" \"three\"\" \"quotes\" \"p6\" \"\" \"\""},
- {"Params23456789", "four\"\"\"\"quotes \"p three\" four\"\"\"\"quotes p5", 0xf3,
- {" \"four\"\"quotes\" \"p three\" \"four\"\"quotes\" \"p5\" \"\" \"\" \"\" \"\"",
- {"", "four\"quotes p", "three fourquotes p5 \"", "", "", "", NULL}, 0}},
+ {"Params23456789", "four\"\"\"\"quotes \"p three\" four\"\"\"\"quotes p5", TRUE,
+ " \"four\"\"quotes\" \"p three\" \"four\"\"quotes\" \"p5\" \"\" \"\" \"\" \"\""},
/* Quoted strings cannot be continued by tacking on a non space character
* either.
*/
- {"Params23456", "\"p two\"p3 \"p four\"p5 p6", 0x1f3,
- {" \"p two\" \"p3\" \"p four\" \"p5\" \"p6\"",
- {"", "p two", "p3", "p four", "p5", "p6", NULL}, 0}},
+ {"Params23456", "\"p two\"p3 \"p four\"p5 p6", TRUE,
+ " \"p two\" \"p3\" \"p four\" \"p5\" \"p6\""},
/* In quoted strings, the quotes are halved and an odd number closes the
* string. Specifically:
* 2n quotes -> n quotes
* 2n+1 quotes -> n quotes and closes the string and hence the parameter
*/
- {"Params23456789", "\"one q\"uote \"p four\" \"one q\"uote p7", 0xff3,
- {" \"one q\" \"uote\" \"p four\" \"one q\" \"uote\" \"p7\" \"\" \"\"",
- {"", "one q", "uote", "p four", "one q", "uote", "p7", "", "", NULL}, 0}},
+ {"Params23456789", "\"one q\"uote \"p four\" \"one q\"uote p7", TRUE,
+ " \"one q\" \"uote\" \"p four\" \"one q\" \"uote\" \"p7\" \"\" \"\""},
- {"Params23456789", "\"two \"\" quotes\" \"p three\" \"two \"\" quotes\" p5", 0x1ff3,
- {" \"two \" quotes\" \"p three\" \"two \" quotes\" \"p5\" \"\" \"\" \"\" \"\"",
- {"", "two ", "quotes p", "three two", " quotes", "p5", "", "", "", "", NULL}, 0}},
+ {"Params23456789", "\"two \"\" quotes\" \"p three\" \"two \"\" quotes\" p5", TRUE,
+ " \"two \" quotes\" \"p three\" \"two \" quotes\" \"p5\" \"\" \"\" \"\" \"\""},
- {"Params23456789", "\"three q\"\"\"uotes \"p four\" \"three q\"\"\"uotes p7", 0xff3,
- {" \"three q\"\" \"uotes\" \"p four\" \"three q\"\" \"uotes\" \"p7\" \"\" \"\"",
- {"", "three q\"", "uotes", "p four", "three q\"", "uotes", "p7", "", "", NULL}, 0}},
+ {"Params23456789", "\"three q\"\"\"uotes \"p four\" \"three q\"\"\"uotes p7", TRUE,
+ " \"three q\"\" \"uotes\" \"p four\" \"three q\"\" \"uotes\" \"p7\" \"\" \"\""},
- {"Params23456789", "\"four \"\"\"\" quotes\" \"p three\" \"four \"\"\"\" quotes\" p5", 0xff3,
- {" \"four \"\" quotes\" \"p three\" \"four \"\" quotes\" \"p5\" \"\" \"\" \"\" \"\"",
- {"", "four \"", "quotes p", "three four", "", "quotes p5 \"", "", "", "", NULL}, 0}},
+ {"Params23456789", "\"four \"\"\"\" quotes\" \"p three\" \"four \"\"\"\" quotes\" p5", TRUE,
+ " \"four \"\" quotes\" \"p three\" \"four \"\" quotes\" \"p5\" \"\" \"\" \"\" \"\""},
/* The quoted string rules also apply to consecutive quotes at the start
* of a parameter but don't count the opening quote!
*/
- {"Params23456789", "\"\"twoquotes \"p four\" \"\"twoquotes p7", 0xbf3,
- {" \"\" \"twoquotes\" \"p four\" \"\" \"twoquotes\" \"p7\" \"\" \"\"",
- {"", "", "twoquotes", "p four", "", "twoquotes", "p7", "", "", NULL}, 0}},
+ {"Params23456789", "\"\"twoquotes \"p four\" \"\"twoquotes p7", TRUE,
+ " \"\" \"twoquotes\" \"p four\" \"\" \"twoquotes\" \"p7\" \"\" \"\""},
- {"Params23456789", "\"\"\"three quotes\" \"p three\" \"\"\"three quotes\" p5", 0x6f3,
- {" \"\"three quotes\" \"p three\" \"\"three quotes\" \"p5\" \"\" \"\" \"\" \"\"",
- {"", "three", "quotes p", "three \"three", "quotes p5 \"", "", "", "", NULL}, 0}},
+ {"Params23456789", "\"\"\"three quotes\" \"p three\" \"\"\"three quotes\" p5", TRUE,
+ " \"\"three quotes\" \"p three\" \"\"three quotes\" \"p5\" \"\" \"\" \"\" \"\""},
- {"Params23456789", "\"\"\"\"fourquotes \"p four\" \"\"\"\"fourquotes p7", 0xbf3,
- {" \"\"\" \"fourquotes\" \"p four\" \"\"\" \"fourquotes\" \"p7\" \"\" \"\"",
- {"", "\"", "fourquotes", "p four", "\"", "fourquotes", "p7", "", "", NULL}, 0}},
+ {"Params23456789", "\"\"\"\"fourquotes \"p four\" \"\"\"\"fourquotes p7", TRUE,
+ " \"\"\" \"fourquotes\" \"p four\" \"\"\" \"fourquotes\" \"p7\" \"\" \"\""},
/* An unclosed quoted string gets lost! */
- {"Params23456", "p2 \"p3\" \"p4 is lost", 0x1c3,
- {" \"p2\" \"p3\" \"\" \"\" \"\"",
- {"", "p2", "p3", "", "", "", NULL}, 0},
- {" \"p2\" \"p3\" \"p3\" \"\" \"\"",
- {"", "p2", "p3", "p3", "", "", NULL}, 0}},
+ {"Params23456", "p2 \"p3\" \"p4 is lost", TRUE,
+ " \"p2\" \"p3\" \"\" \"\" \"\"",
+ " \"p2\" \"p3\" \"p3\" \"\" \"\""}, /* NT4/2k */
/* Backslashes have no special meaning even when preceding quotes. All
* they do is start an unquoted string.
*/
- {"Params23456", "\\\"p\\three \"pfour\\\" pfive", 0x73,
- {" \"\\\" \"p\\three\" \"pfour\\\" \"pfive\" \"\"",
- {"", "\" p\\three pfour\"", "pfive", "", NULL}, 0}},
+ {"Params23456", "\\\"p\\three \"pfour\\\" pfive", TRUE,
+ " \"\\\" \"p\\three\" \"pfour\\\" \"pfive\" \"\""},
/* Environment variables are left untouched. */
- {"Params23456", "%TMPDIR% %t %c", 0,
- {" \"%TMPDIR%\" \"%t\" \"%c\" \"\" \"\"",
- {"", "%TMPDIR%", "%t", "%c", "", "", NULL}, 0}},
+ {"Params23456", "%TMPDIR% %t %c", FALSE,
+ " \"%TMPDIR%\" \"%t\" \"%c\" \"\" \"\""},
/* %~2 is equivalent to %*. However %~3 and higher include the spaces
* before the parameter!
* (but not the previous parameter's closing quote fortunately)
*/
- {"Params2345Etc", "p2 p3 \"p4\" p5 p6 ", 0x3f3,
- {" ~2=\"p2 p3 \"p4\" p5 p6 \" ~3=\" p3 \"p4\" p5 p6 \" ~4=\" \"p4\" p5 p6 \" ~5= p5 p6 ",
- {"", "~2=p2 p3 p4 p5 p6 ", "~3= p3 p4 p5 p6 ", "~4= p4 p5 p6 ", "~5=", "p5", "p6", NULL}, 0}},
+ {"Params2345Etc", "p2 p3 \"p4\" p5 p6 ", TRUE,
+ " ~2=\"p2 p3 \"p4\" p5 p6 \" ~3=\" p3 \"p4\" p5 p6 \" ~4=\" \"p4\" p5 p6 \" ~5= p5 p6 "},
/* %~n works even if there is no nth parameter. */
- {"Params9Etc", "p2 p3 p4 p5 p6 p7 p8 ", 0x12,
- {" ~9=\" \"",
- {"", "~9= ", NULL}, 0}},
+ {"Params9Etc", "p2 p3 p4 p5 p6 p7 p8 ", TRUE,
+ " ~9=\" \""},
- {"Params9Etc", "p2 p3 p4 p5 p6 p7 ", 0x12,
- {" ~9=\"\"",
- {"", "~9=", NULL}, 0}},
+ {"Params9Etc", "p2 p3 p4 p5 p6 p7 ", TRUE,
+ " ~9=\"\""},
/* The %~n directives also transmit the tenth parameter and beyond. */
- {"Params9Etc", "p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 and beyond!", 0x12,
- {" ~9=\" p9 p10 p11 and beyond!\"",
- {"", "~9= p9 p10 p11 and beyond!", NULL}, 0}},
+ {"Params9Etc", "p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 and beyond!", TRUE,
+ " ~9=\" p9 p10 p11 and beyond!\""},
/* Bad formatting directives lose their % sign, except those followed by
* a tilde! Environment variables are not expanded but lose their % sign.
*/
- {"ParamsBad", "p2 p3 p4 p5", 0x12,
- {" \"% - %~ %~0 %~1 %~a %~* a b c TMPDIR\"",
- {"", "% - %~ %~0 %~1 %~a %~* a b c TMPDIR", NULL}, 0}},
+ {"ParamsBad", "p2 p3 p4 p5", TRUE,
+ " \"% - %~ %~0 %~1 %~a %~* a b c TMPDIR\""},
- {NULL, NULL, 0, {NULL, {NULL}, 0}}
+ {0}
};
static void test_argify(void)
{
- BOOL has_cl2a = TRUE;
char fileA[MAX_PATH], params[2*MAX_PATH+12];
INT_PTR rc;
const argify_tests_t* test;
- const cmdline_tests_t *bad;
+ const char *bad;
const char* cmd;
- unsigned i, count;
/* Test with a long parameter */
for (rc = 0; rc < MAX_PATH; rc++)
@@ -1614,21 +1586,11 @@ static void test_argify(void)
test = argify_tests;
while (test->params)
{
- bad = test->broken.cmd ? &test->broken : &test->cmd;
+ bad = test->broken ? test->broken : test->cmd;
- /* trace("***** verb='%s' params='%s'\n", test->verb, test->params); */
rc = shell_execute_ex(SEE_MASK_DOENVSUBST, test->verb, fileA, test->params, NULL, NULL);
okShell(rc > 32, "failed: rc=%lu\n", rc);
- count = 0;
- while (test->cmd.args[count])
- count++;
- /* +4 for the shlexec arguments, -1 because of the added ""
- * argument for the CommandLineToArgvW() tests.
- */
- todo_wine_if(test->todo & 0x1)
- okChildInt("argcA", 4 + count - 1);
-
cmd = getChildString("Child", "cmdlineA");
/* Our commands are such that the verb immediately precedes the
* part we are interested in.
@@ -1636,20 +1598,9 @@ static void test_argify(void)
if (cmd) cmd = strstr(cmd, test->verb);
if (cmd) cmd += strlen(test->verb);
if (!cmd) cmd = "(null)";
- todo_wine_if(test->todo & 0x2)
- okShell(!strcmp(cmd, test->cmd.cmd) || broken(!strcmp(cmd, bad->cmd)),
- "the cmdline is '%s' instead of '%s'\n", cmd, test->cmd.cmd);
-
- for (i = 0; i < count - 1; i++)
- {
- char argname[18];
- sprintf(argname, "argvA%d", 4 + i);
- todo_wine_if(test->todo & (1 << (i+4)))
- okChildStringBroken(argname, test->cmd.args[i+1], bad->args[i+1]);
- }
-
- if (has_cl2a)
- has_cl2a = test_one_cmdline(&(test->cmd));
+ todo_wine_if(test->todo)
+ okShell(!strcmp(cmd, test->cmd) || broken(!strcmp(cmd, bad)),
+ "expected '%s', got '%s'\n", cmd, test->cmd);
test++;
}
}
--
2.7.4
June 21, 2018
[PATCH] gdi32/tests: Test writing to the default palette.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
Mostly to rule out one proposed reason for the ddraw test failures on Windows.
dlls/gdi32/tests/palette.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/dlls/gdi32/tests/palette.c b/dlls/gdi32/tests/palette.c
index 045f530..0043f55 100644
--- a/dlls/gdi32/tests/palette.c
+++ b/dlls/gdi32/tests/palette.c
@@ -142,6 +142,15 @@ static void test_palette_entries(void)
ok(res == 1, "GetPaletteEntries should have returned 1 but returned %d\n", res);
ok( palEntry.peFlags == getEntryResult.peFlags, "palEntry.peFlags (%#x) != getEntryResult.peFlags (%#x)\n", palEntry.peFlags, getEntryResult.peFlags );
+
+ /* Try setting the system palette */
+ hpal = GetStockObject(DEFAULT_PALETTE);
+ res = SetPaletteEntries(hpal, 0, 1, &palEntry);
+ ok(!res, "SetPaletteEntries() should have failed\n");
+
+ res = GetPaletteEntries(hpal, 0, 1, &getEntryResult);
+ ok(res == 1, "GetPaletteEntries should have returned 1 but returned %d\n", res);
+ ok(memcmp(&palEntry, &getEntryResult, sizeof(PALETTEENTRY)), "entries should not match\n");
}
static void test_halftone_palette(void)
--
2.7.4
June 21, 2018
[PATCH] po: Update Finnish translation.
by Lauri Kenttä
Signed-off-by: Lauri Kenttä <lauri.kentta(a)gmail.com>
---
po/fi.po | 2 ++
1 file changed, 2 insertions(+)
diff --git a/po/fi.po b/po/fi.po
index 7e8bb62be9..abe62894f7 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -14743,6 +14743,8 @@ msgid ""
"A program on your system has crashed, but WineDbg was unable to attach to "
"the process to obtain a backtrace."
msgstr ""
+"Ohjelma koneellasi kaatui, mutta WineDbg ei pystynyt liittymään siihen eikä "
+"keräämään virheenjäljitystietoja (backtrace)."
#: winedbg.rc:41
msgid "(unidentified)"
--
2.17.1
June 21, 2018
[PATCH 4/4] testbot/web: Allow sumitting jobs to verify patches compile on Wine.
by Francois Gouget
For now the Wine VMs are unchecked by default since all they do is a
compilation check which is mostly redundant with the regular build step.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/web/Submit.pl | 43 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 42 insertions(+), 1 deletion(-)
diff --git a/testbot/web/Submit.pl b/testbot/web/Submit.pl
index afebc722b..9fa252a11 100644
--- a/testbot/web/Submit.pl
+++ b/testbot/web/Submit.pl
@@ -244,10 +244,14 @@ sub GenerateFields($)
{
$VMs->AddFilter("Type", ["win64"]);
}
- else
+ elsif ($self->{FileType} eq "exe32")
{
$VMs->AddFilter("Type", ["win32", "win64"]);
}
+ else
+ {
+ $VMs->AddFilter("Type", ["win32", "win64", "wine"]);
+ }
if ($self->{ShowAll})
{
# All but the retired and deleted ones
@@ -272,6 +276,10 @@ sub GenerateFields($)
$Status = " [". $VM->Status ."]";
$Checked = undef;
}
+ elsif ($VM->Type eq "wine")
+ {
+ $Checked = undef;
+ }
if ($Checked and
($self->GetParam("Page") == 1 || $self->GetParam($FieldName)))
{
@@ -844,6 +852,39 @@ sub OnSubmit($)
}
}
+ if ($FileType eq "patchdlls")
+ {
+ my $Tasks;
+ my $VMs = CreateVMs();
+ $VMs->AddFilter("Type", ["wine"]);
+ my $SortedKeys = $VMs->SortKeysBySortOrder($VMs->GetKeys());
+ foreach my $VMKey (@$SortedKeys)
+ {
+ my $VM = $VMs->GetItem($VMKey);
+ my $FieldName = "vm_" . $self->CGI->escapeHTML($VMKey);
+ next if (!$self->GetParam($FieldName)); # skip unselected VMs
+
+ if (!$Tasks)
+ {
+ # First create the Wine test step
+ my $WineStep = $Steps->Add();
+ $WineStep->FileName($BaseName);
+ $WineStep->FileType($FileType);
+ $WineStep->InStaging(!1);
+ $WineStep->Type("build");
+ $WineStep->DebugLevel($self->GetParam("DebugLevel"));
+ $WineStep->ReportSuccessfulTests(defined($self->GetParam("ReportSuccessfulTests")));
+ $Tasks = $WineStep->Tasks;
+ }
+
+ # Then add a task for this VM
+ my $Task = $Tasks->Add();
+ $Task->VM($VM);
+ $Task->CmdLineArg("win32");
+ $Task->Timeout($WineReconfigTimeout);
+ }
+ }
+
# Now save it all (or whatever's left to save)
my ($ErrKey, $ErrProperty, $ErrMessage) = $Jobs->Save();
if (defined($ErrMessage))
--
2.17.1
June 21, 2018
[PATCH 3/4] testbot: Make sure the patches apply and compile in Wine.
by Francois Gouget
This adds the base infrastructure for later testing the patches on Wine.
This adds a "wine" VM type which applies to all VMs that can compile and
run Wine, regardless of the underlying operating system. Adapting to the
underlying operating system is thus the responsibility of the VM-side
scripts.
This also updates GetPatchImpacts() to detect non-Wine scripts (such as
TestBot patches) so the TestBot does not report them as bad patches
for failing to apply on top of Wine.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
Note: This requires updating the database with update37.sql, and
restarting the TestBot engine and web server.
testbot/bin/CheckForWinetestUpdate.pl | 47 ++-
testbot/bin/WineRunReconfig.pl | 36 +-
testbot/bin/WineRunWineTest.pl | 423 ++++++++++++++++++++
testbot/bin/build/WineReconfig.pl | 258 ++++++++++++
testbot/bin/build/WineTest.pl | 282 +++++++++++++
testbot/ddl/update37.sql | 4 +
testbot/ddl/winetestbot.sql | 2 +-
testbot/lib/WineTestBot/Config.pm | 9 +-
testbot/lib/WineTestBot/Engine/Scheduler.pm | 3 +-
testbot/lib/WineTestBot/PatchUtils.pm | 80 +++-
testbot/lib/WineTestBot/Patches.pm | 213 +++++-----
testbot/lib/WineTestBot/PendingPatchSets.pm | 14 +-
testbot/lib/WineTestBot/StepsTasks.pm | 2 +-
testbot/lib/WineTestBot/Tasks.pm | 5 +-
testbot/lib/WineTestBot/VMs.pm | 8 +-
15 files changed, 1234 insertions(+), 152 deletions(-)
create mode 100755 testbot/bin/WineRunWineTest.pl
create mode 100755 testbot/bin/build/WineReconfig.pl
create mode 100755 testbot/bin/build/WineTest.pl
create mode 100644 testbot/ddl/update37.sql
diff --git a/testbot/bin/CheckForWinetestUpdate.pl b/testbot/bin/CheckForWinetestUpdate.pl
index 80c57b9e1..74c59955f 100755
--- a/testbot/bin/CheckForWinetestUpdate.pl
+++ b/testbot/bin/CheckForWinetestUpdate.pl
@@ -63,7 +63,8 @@ my %WineTestUrls = (
64 => "http://test.winehq.org/builds/winetest64-latest.exe"
);
-my %TaskTypes = (build => 1, base32 => 1, winetest32 => 1, all64 => 1);
+my %TaskTypes = (build => 1, base32 => 1, winetest32 => 1, all64 => 1,
+ wine => 1);
my $Debug;
@@ -212,7 +213,7 @@ sub AddJob($$$)
my $Tasks = $NewStep->Tasks;
foreach my $VMKey (@{$VMs->SortKeysBySortOrder($VMs->GetKeys())})
{
- Debug(" $VMKey\n");
+ Debug(" $VMKey exe$Bits\n");
my $Task = $Tasks->Add();
$Task->VM($VMs->GetItem($VMKey));
$Task->Timeout($SuiteTimeout);
@@ -246,11 +247,23 @@ sub AddJob($$$)
return 1;
}
-sub AddReconfigJob()
+sub AddReconfigJob($)
{
- my $Remarks = "Update Wine to latest git";
+ my ($VMType) = @_;
+
+ my $Remarks = "Update the $VMType VMs";
Debug("Creating the '$Remarks' job\n");
+ my $VMs = CreateVMs();
+ $VMs->AddFilter("Type", [$VMType]);
+ $VMs->FilterEnabledRole();
+ if ($VMs->GetItemsCount() == 0)
+ {
+ # There is nothing to do
+ Debug(" Found no VM\n");
+ return 1;
+ }
+
# First create a new job
my $Jobs = CreateJobs();
my $NewJob = $Jobs->Add();
@@ -265,15 +278,16 @@ sub AddReconfigJob()
$NewStep->FileType("none");
$NewStep->InStaging(!1);
- # Add a task for the build VM
- my $VMs = CreateVMs();
- $VMs->AddFilter("Type", ["build"]);
- $VMs->AddFilter("Role", ["base"]);
- my $BuildVM = ${$VMs->GetItems()}[0];
- Debug(" ", $BuildVM->GetKey(), "\n");
- my $Task = $NewStep->Tasks->Add();
- $Task->VM($BuildVM);
- $Task->Timeout($ReconfigTimeout);
+ # And a task for each VM
+ my $SortedKeys = $VMs->SortKeysBySortOrder($VMs->GetKeys());
+ foreach my $VMKey (@$SortedKeys)
+ {
+ my $VM = $VMs->GetItem($VMKey);
+ Debug(" $VMKey $VMType reconfig\n");
+ my $Task = $NewStep->Tasks->Add();
+ $Task->VM($VM);
+ $Task->Timeout($ReconfigTimeout);
+ }
# Save it all
my ($ErrKey, $ErrProperty, $ErrMessage) = $Jobs->Save();
@@ -358,7 +372,8 @@ if (defined $Usage)
#
my $Rc = 0;
-if ($OptTypes{build} or $OptTypes{base32} or $OptTypes{winetest32})
+if ($OptTypes{build} or $OptTypes{base32} or $OptTypes{winetest32} or
+ $OptTypes{wine})
{
my ($Create, $LatestBaseName) = UpdateWineTest($OptCreate, 32);
if ($Create < 0)
@@ -370,9 +385,11 @@ if ($OptTypes{build} or $OptTypes{base32} or $OptTypes{winetest32})
# A new executable means there have been commits so update Wine. Create
# this job first purely to make the WineTestBot job queue look nice, and
# arbitrarily do it only for 32-bit executables to avoid redundant updates.
- $Rc = 1 if ($OptTypes{build} and !AddReconfigJob());
+ $Rc = 1 if ($OptTypes{build} and !AddReconfigJob("build"));
$Rc = 1 if ($OptTypes{base32} and !AddJob("base", $LatestBaseName, 32));
$Rc = 1 if ($OptTypes{winetest32} and !AddJob("", $LatestBaseName, 32));
+
+ $Rc = 1 if ($OptTypes{wine} and !AddReconfigJob("wine"));
}
}
diff --git a/testbot/bin/WineRunReconfig.pl b/testbot/bin/WineRunReconfig.pl
index 23b038a1f..e418e5bb9 100755
--- a/testbot/bin/WineRunReconfig.pl
+++ b/testbot/bin/WineRunReconfig.pl
@@ -5,7 +5,7 @@
# See the bin/build/Reconfig.pl script.
#
# Copyright 2009 Ge van Geldorp
-# Copyright 2013-2016 Francois Gouget
+# Copyright 2013-2018 Francois Gouget
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -312,9 +312,9 @@ sub FatalTAError($$)
# Check the VM and Step
#
-if ($VM->Type ne "build")
+if ($VM->Type ne "build" and $VM->Type ne "wine")
{
- FatalError("This is not a build VM! (" . $VM->Type . ")\n");
+ FatalError("This is neither a build nor a Wine VM! (" . $VM->Type . ")\n");
}
elsif (!$Debug and $VM->Status ne "running")
{
@@ -337,11 +337,12 @@ if ($Step->FileType ne "none")
# Use our own log so it can be used for reference
# even after another task has run.
-my $Script = "#!/bin/sh\n".
- "( set -x\n".
- " git pull &&\n".
- " ../bin/build/Reconfig.pl\n".
- ") >Reconfig.log 2>&1\n";
+my $Script = $VM->Type eq "wine" ? "WineReconfig.pl" : "Reconfig.pl";
+$Script = "#!/bin/sh\n".
+ "( set -x\n".
+ " git pull &&\n".
+ " ../bin/build/$Script\n".
+ ") >Reconfig.log 2>&1\n";
my $TA = $VM->GetAgent();
Debug(Elapsed($Start), " Sending the script: [$Script]\n");
if (!$TA->SendFileFromString($Script, "task", $TestAgent::SENDFILE_EXE))
@@ -410,16 +411,19 @@ elsif (!defined $TAError)
if ($NewStatus eq "completed")
{
use File::Copy;
- for my $Bitness ("32", "64")
+ if ($VM->Type eq "build")
{
- Debug(Elapsed($Start), " Retrieving the $Bitness bit TestLauncher to '$TaskDir/TestLauncher$Bitness.exe'\n");
- if ($TA->GetFile("../src/TestLauncher/TestLauncher$Bitness.exe", "$TaskDir/TestLauncher$Bitness.exe"))
+ for my $Bitness ("32", "64")
{
- copy "$TaskDir/TestLauncher$Bitness.exe", "$DataDir/latest/TestLauncher$Bitness.exe";
- }
- elsif (!defined $TAError)
- {
- $TAError = "An error occurred while retrieving the $Bitness bit TestLauncher: ". $TA->GetLastError();
+ Debug(Elapsed($Start), " Retrieving the $Bitness bit TestLauncher to '$TaskDir/TestLauncher$Bitness.exe'\n");
+ if ($TA->GetFile("../src/TestLauncher/TestLauncher$Bitness.exe", "$TaskDir/TestLauncher$Bitness.exe"))
+ {
+ copy "$TaskDir/TestLauncher$Bitness.exe", "$DataDir/latest/TestLauncher$Bitness.exe";
+ }
+ elsif (!defined $TAError)
+ {
+ $TAError = "An error occurred while retrieving the $Bitness bit TestLauncher: ". $TA->GetLastError();
+ }
}
}
diff --git a/testbot/bin/WineRunWineTest.pl b/testbot/bin/WineRunWineTest.pl
new file mode 100755
index 000000000..0aba7ecfc
--- /dev/null
+++ b/testbot/bin/WineRunWineTest.pl
@@ -0,0 +1,423 @@
+#!/usr/bin/perl -Tw
+# -*- Mode: Perl; perl-indent-level: 2; indent-tabs-mode: nil -*-
+#
+# Makes sure the Wine patches compile.
+# See the bin/build/WineTest.pl script.
+#
+# Copyright 2018 Francois Gouget
+#
+# 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
+
+use strict;
+
+sub BEGIN
+{
+ if ($0 !~ m=^/=)
+ {
+ # Turn $0 into an absolute path so it can safely be used in @INC
+ require Cwd;
+ $0 = Cwd::cwd() . "/$0";
+ }
+ if ($0 =~ m=^(/.*)/[^/]+/[^/]+$=)
+ {
+ $::RootDir = $1;
+ unshift @INC, "$::RootDir/lib";
+ }
+}
+my $Name0 = $0;
+$Name0 =~ s+^.*/++;
+
+
+use WineTestBot::Config;
+use WineTestBot::Jobs;
+use WineTestBot::PatchUtils;
+use WineTestBot::VMs;
+use WineTestBot::Log;
+use WineTestBot::LogUtils;
+use WineTestBot::Engine::Notify;
+
+
+#
+# Logging and error handling helpers
+#
+
+my $Debug;
+sub Debug(@)
+{
+ print STDERR @_ if ($Debug);
+}
+
+my $LogOnly;
+sub Error(@)
+{
+ print STDERR "$Name0:error: ", @_ if (!$LogOnly);
+ LogMsg @_;
+}
+
+
+#
+# Setup and command line processing
+#
+
+$ENV{PATH} = "/usr/bin:/bin";
+delete $ENV{ENV};
+
+my $Usage;
+sub ValidateNumber($$)
+{
+ my ($Name, $Value) = @_;
+
+ # Validate and untaint the value
+ return $1 if ($Value =~ /^(\d+)$/);
+ Error "$Value is not a valid $Name\n";
+ $Usage = 2;
+ return undef;
+}
+
+my ($JobId, $StepNo, $TaskNo);
+while (@ARGV)
+{
+ my $Arg = shift @ARGV;
+ if ($Arg eq "--debug")
+ {
+ $Debug = 1;
+ }
+ elsif ($Arg eq "--log-only")
+ {
+ $LogOnly = 1;
+ }
+ elsif ($Arg =~ /^(?:-\?|-h|--help)$/)
+ {
+ $Usage = 0;
+ last;
+ }
+ elsif ($Arg =~ /^-/)
+ {
+ Error "unknown option '$Arg'\n";
+ $Usage = 2;
+ last;
+ }
+ elsif (!defined $JobId)
+ {
+ $JobId = ValidateNumber('job id', $Arg);
+ }
+ elsif (!defined $StepNo)
+ {
+ $StepNo = ValidateNumber('step number', $Arg);
+ }
+ elsif (!defined $TaskNo)
+ {
+ $TaskNo = ValidateNumber('task number', $Arg);
+ }
+ else
+ {
+ Error "unexpected argument '$Arg'\n";
+ $Usage = 2;
+ last;
+ }
+}
+
+# Check parameters
+if (!defined $Usage)
+{
+ if (!defined $JobId || !defined $StepNo || !defined $TaskNo)
+ {
+ Error "you must specify the job id, step number and task number\n";
+ $Usage = 2;
+ }
+}
+if (defined $Usage)
+{
+ print "Usage: $Name0 [--debug] [--log-only] [--help] JobId StepNo TaskNo\n";
+ exit $Usage;
+}
+
+my $Job = CreateJobs()->GetItem($JobId);
+if (!defined $Job)
+{
+ Error "Job $JobId does not exist\n";
+ exit 1;
+}
+my $Step = $Job->Steps->GetItem($StepNo);
+if (!defined $Step)
+{
+ Error "Step $StepNo of job $JobId does not exist\n";
+ exit 1;
+}
+my $Task = $Step->Tasks->GetItem($TaskNo);
+if (!defined $Task)
+{
+ Error "Step $StepNo task $TaskNo of job $JobId does not exist\n";
+ exit 1;
+}
+my $TaskDir = $Task->CreateDir();
+my $VM = $Task->VM;
+
+
+my $Start = Time();
+LogMsg "Task $JobId/$StepNo/$TaskNo started\n";
+
+
+#
+# Error handling helpers
+#
+
+sub LogTaskError($)
+{
+ my ($ErrMessage) = @_;
+ Debug("$Name0:error: ", $ErrMessage);
+
+ if (open(my $ErrFile, ">>", "$TaskDir/err"))
+ {
+ print $ErrFile $ErrMessage;
+ close($ErrFile);
+ }
+ else
+ {
+ Error "Unable to open 'err' for writing: $!\n";
+ }
+}
+
+sub WrapUpAndExit($;$$)
+{
+ my ($Status, $Retry, $Timeout) = @_;
+ my $NewVMStatus = $Status eq 'queued' ? 'offline' : 'dirty';
+ my $VMResult = $Status eq "boterror" ? "boterror" :
+ $Status eq "queued" ? "error" :
+ $Timeout ? "timeout" : "";
+
+ my $TestFailures;
+ my $Tries = $Task->TestFailures || 0;
+ if ($Retry)
+ {
+ # This may be a transient error (e.g. a network glitch)
+ # so retry a few times to improve robustness
+ $Tries++;
+ if ($Task->CanRetry())
+ {
+ $Status = 'queued';
+ $TestFailures = $Tries;
+ }
+ else
+ {
+ LogTaskError("Giving up after $Tries run(s)\n");
+ }
+ }
+ elsif ($Tries >= 1)
+ {
+ LogTaskError("The previous $Tries run(s) terminated abnormally\n");
+ }
+
+ # Record result details that may be lost or overwritten by a later run
+ if ($VMResult)
+ {
+ $VMResult .= " $Tries $MaxTaskTries" if ($Retry);
+ $VM->RecordResult(undef, $VMResult);
+ }
+
+ # Update the Task and Job
+ $Task->Status($Status);
+ $Task->TestFailures($TestFailures);
+ if ($Status eq 'queued')
+ {
+ $Task->Started(undef);
+ $Task->Ended(undef);
+ # Leave the Task files around so they can be seen until the next run
+ }
+ else
+ {
+ $Task->Ended(time());
+ }
+ $Task->Save();
+ $Job->UpdateStatus();
+
+ # Get the up-to-date VM status and update it if nobody else changed it
+ $VM = CreateVMs()->GetItem($VM->GetKey());
+ if ($VM->Status eq 'running')
+ {
+ $VM->Status($NewVMStatus);
+ $VM->ChildDeadline(undef);
+ $VM->ChildPid(undef);
+ $VM->Save();
+ }
+
+ my $Result = $VM->Name .": ". $VM->Status ." Status: $Status Failures: ". (defined $TestFailures ? $TestFailures : "unset");
+ LogMsg "Task $JobId/$StepNo/$TaskNo done ($Result)\n";
+ Debug(Elapsed($Start), " Done. $Result\n");
+ exit($Status eq 'completed' ? 0 : 1);
+}
+
+sub FatalError($;$)
+{
+ my ($ErrMessage, $Retry) = @_;
+
+ LogMsg "$JobId/$StepNo/$TaskNo $ErrMessage";
+ LogTaskError($ErrMessage);
+
+ WrapUpAndExit('boterror', $Retry);
+}
+
+sub FatalTAError($$)
+{
+ my ($TA, $ErrMessage) = @_;
+ $ErrMessage .= ": ". $TA->GetLastError() if (defined $TA);
+
+ # A TestAgent operation failed, see if the VM is still accessible
+ my $IsPoweredOn = $VM->GetDomain()->IsPoweredOn();
+ if (!defined $IsPoweredOn)
+ {
+ # The VM host is not accessible anymore so mark the VM as offline and
+ # requeue the task. This does not count towards the task's tries limit
+ # since neither the VM nor the task are at fault.
+ Error("$ErrMessage\n");
+ WrapUpAndExit('queued');
+ }
+
+ my $Retry;
+ if ($IsPoweredOn)
+ {
+ LogMsg("$ErrMessage\n");
+ LogTaskError("$ErrMessage\n");
+ $ErrMessage = "The test VM has crashed, rebooted or lost connectivity (or the TestAgent server died)\n";
+ # Retry in case it was a temporary network glitch
+ $Retry = 1;
+ }
+ else
+ {
+ # Ignore the TestAgent error, it's irrelevant
+ $ErrMessage = "The test VM is powered off!\n";
+ }
+ FatalError($ErrMessage, $Retry);
+}
+
+
+#
+# Check the VM and Step
+#
+
+if ($VM->Type ne "wine")
+{
+ FatalError("This is not a Wine VM! (" . $VM->Type . ")\n");
+}
+elsif (!$Debug and $VM->Status ne "running")
+{
+ FatalError("The VM is not ready for use (" . $VM->Status . ")\n");
+}
+elsif (!$VM->GetDomain()->IsPoweredOn())
+{
+ FatalError("The VM is not powered on\n");
+}
+
+if ($Step->FileType ne "patchdlls")
+{
+ FatalError("Unexpected file type '". $Step->FileType ."' found\n");
+}
+
+
+#
+# Run the task
+#
+
+my $FileName = $Step->GetFullFileName();
+my $TA = $VM->GetAgent();
+Debug(Elapsed($Start), " Sending '$FileName'\n");
+if (!$TA->SendFile($FileName, "staging/patch.diff", 0))
+{
+ FatalTAError($TA, "Could not copy the patch to the VM");
+}
+my $Script = "#!/bin/sh\n".
+ "( set -x\n" .
+ " ../bin/build/WineTest.pl ". $Task->CmdLineArg ." build patch.diff\n".
+ ") >Task.log 2>&1\n";
+Debug(Elapsed($Start), " Sending the script: [$Script]\n");
+if (!$TA->SendFileFromString($Script, "task", $TestAgent::SENDFILE_EXE))
+{
+ FatalTAError($TA, "Could not send the task script to the VM");
+}
+
+Debug(Elapsed($Start), " Starting the script\n");
+my $Pid = $TA->Run(["./task"], 0);
+if (!$Pid)
+{
+ FatalTAError($TA, "Failed to start the task");
+}
+
+
+#
+# From that point on we want to at least try to grab the task
+# log before giving up
+#
+
+my ($NewStatus, $ErrMessage, $TAError, $TaskTimedOut);
+Debug(Elapsed($Start), " Waiting for the script (", $Task->Timeout, "s timeout)\n");
+if (!defined $TA->Wait($Pid, $Task->Timeout, 60))
+{
+ $ErrMessage = $TA->GetLastError();
+ if ($ErrMessage =~ /timed out waiting for the child process/)
+ {
+ $ErrMessage = "The task timed out\n";
+ $NewStatus = "badbuild";
+ $TaskTimedOut = 1;
+ }
+ else
+ {
+ $TAError = "An error occurred while waiting for the task to complete: $ErrMessage";
+ $ErrMessage = undef;
+ }
+}
+
+Debug(Elapsed($Start), " Retrieving 'Task.log'\n");
+if ($TA->GetFile("Task.log", "$TaskDir/log"))
+{
+ my $Result = ParseTaskLog("$TaskDir/log", "Task");
+ if ($Result eq "ok")
+ {
+ # We must have gotten the full log and the build did succeed.
+ # So forget any prior error.
+ $NewStatus = "completed";
+ $TAError = $ErrMessage = undef;
+ }
+ elsif ($Result eq "badpatch")
+ {
+ $NewStatus = "badpatch";
+ }
+ elsif ($Result =~ s/^nolog://)
+ {
+ FatalError("$Result\n", "retry");
+ }
+ else
+ {
+ # If the result line is missing we probably already have an error message
+ # that explains why.
+ $NewStatus = "badbuild";
+ }
+}
+elsif (!defined $TAError)
+{
+ $TAError = "An error occurred while retrieving the task log: ". $TA->GetLastError();
+}
+
+# Report the task errors even though they may have been caused by
+# TestAgent trouble.
+LogTaskError($ErrMessage) if (defined $ErrMessage);
+FatalTAError(undef, $TAError) if (defined $TAError);
+$TA->Disconnect();
+
+
+#
+# Wrap up
+#
+
+WrapUpAndExit($NewStatus, undef, $TaskTimedOut);
diff --git a/testbot/bin/build/WineReconfig.pl b/testbot/bin/build/WineReconfig.pl
new file mode 100755
index 000000000..b030051c6
--- /dev/null
+++ b/testbot/bin/build/WineReconfig.pl
@@ -0,0 +1,258 @@
+#!/usr/bin/perl -Tw
+# -*- Mode: Perl; perl-indent-level: 2; indent-tabs-mode: nil -*-
+#
+# Updates the Wine source from Git and rebuilds it.
+#
+# Copyright 2018 Francois Gouget
+#
+# 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
+
+use strict;
+
+sub BEGIN
+{
+ if ($0 !~ m=^/=)
+ {
+ # Turn $0 into an absolute path so it can safely be used in @INC
+ require Cwd;
+ $0 = Cwd::cwd() . "/$0";
+ }
+ if ($0 =~ m=^(/.*)/[^/]+/[^/]+/[^/]+$=)
+ {
+ $::RootDir = $1;
+ unshift @INC, "$::RootDir/lib";
+ }
+ $::BuildEnv = 1;
+}
+my $Name0 = $0;
+$Name0 =~ s+^.*/++;
+
+
+use WineTestBot::Config;
+use WineTestBot::PatchUtils;
+
+
+#
+# Logging and error handling helpers
+#
+
+sub InfoMsg(@)
+{
+ print @_;
+}
+
+sub LogMsg(@)
+{
+ print "Reconfig: ", @_;
+}
+
+sub Error(@)
+{
+ print STDERR "$Name0:error: ", @_;
+}
+
+
+#
+# Build helpers
+#
+
+my $ncpus;
+sub CountCPUs()
+{
+ if (open(my $fh, "<", "/proc/cpuinfo"))
+ {
+ # Linux
+ map { $ncpus++ if (/^processor/); } <$fh>;
+ close($fh);
+ }
+ $ncpus ||= 1;
+}
+
+sub BuildTestAgentd()
+{
+ # If testagentd already exists it's likely already running
+ # so don't rebuild it.
+ if (! -x "$BinDir/build/testagentd")
+ {
+ InfoMsg "\nBuilding the native testagentd\n";
+ system("cd '$::RootDir/src/testagentd' && set -x && ".
+ "time make -j$ncpus build");
+ if ($? != 0)
+ {
+ LogMsg "Build testagentd failed\n";
+ return !1;
+ }
+ }
+
+ return 1;
+}
+
+sub GitPull($)
+{
+ my ($Targets) = @_;
+ return 1 if (!$Targets->{update});
+
+ InfoMsg "\nUpdating the Wine source\n";
+ system("cd '$DataDir/wine' && git pull");
+ if ($? != 0)
+ {
+ LogMsg "Git pull failed\n";
+ return !1;
+ }
+
+ my $ErrMessage = UpdateWineData("$DataDir/wine");
+ if ($ErrMessage)
+ {
+ LogMsg "$ErrMessage\n";
+ return !1;
+ }
+
+ return 1;
+}
+
+sub BuildWine($$$$)
+{
+ my ($Targets, $NoRm, $Build, $Extras) = @_;
+
+ return 1 if (!$Targets->{$Build});
+ mkdir "$DataDir/build-$Build" if (!-d "$DataDir/build-$Build");
+
+ # If $NoRm is not set, rebuild from scratch to make sure cruft will not
+ # accumulate
+ InfoMsg "\nRebuilding the $Build Wine\n";
+ system("cd '$DataDir/build-$Build' && set -x && ".
+ ($NoRm ? "" : "rm -rf * && ") .
+ "time ../wine/configure $Extras --disable-winetest && ".
+ "time make -j$ncpus");
+ if ($? != 0)
+ {
+ LogMsg "The $Build build failed\n";
+ return !1;
+ }
+
+ return 1;
+}
+
+
+#
+# Setup and command line processing
+#
+
+$ENV{PATH} = "/usr/lib/ccache:/usr/bin:/bin";
+delete $ENV{ENV};
+
+my %AllTargets;
+map { $AllTargets{$_} = 1 } qw(update win32 wow32 wow64);
+
+my ($Usage, $TargetList, $NoRm);
+while (@ARGV)
+{
+ my $Arg = shift @ARGV;
+ if ($Arg eq "--no-rm")
+ {
+ $NoRm = 1;
+ }
+ elsif ($Arg =~ /^(?:-\?|-h|--help)$/)
+ {
+ $Usage = 0;
+ last;
+ }
+ elsif ($Arg =~ /^-/)
+ {
+ Error "unknown option '$Arg'\n";
+ $Usage = 2;
+ last;
+ }
+ elsif (!defined $TargetList)
+ {
+ $TargetList = $Arg;
+ }
+ else
+ {
+ Error "unexpected argument '$Arg'\n";
+ $Usage = 2;
+ last;
+ }
+}
+
+# Check and untaint parameters
+my $Targets;
+if (!defined $Usage)
+{
+ $TargetList = join(",", keys %AllTargets) if (!defined $TargetList);
+ foreach my $Target (split /,/, $TargetList)
+ {
+ if (!$AllTargets{$Target})
+ {
+ Error "invalid target name $Target\n";
+ $Usage = 2;
+ last;
+ }
+ $Targets->{$Target} = 1;
+ }
+}
+if (defined $Usage)
+{
+ if ($Usage)
+ {
+ Error "try '$Name0 --help' for more information\n";
+ exit $Usage;
+ }
+ print "Usage: $Name0 [--no-rm] [--help] [TARGETS]\n";
+ print "\n";
+ print "Performs all the tasks needed for the host to be ready to test new patches: update the Wine source and rebuild the Wine binaries.\n";
+ print "\n";
+ print "Where:\n";
+ print " TARGETS Is a comma-separated list of targets to process. By default all\n";
+ print " targets are processed.\n";
+ print " - update: Update Wine's source code.\n";
+ print " - win32: Rebuild the regular 32 bit Wine.\n";
+ print " - wow32: Rebuild the 32 bit WoW Wine.\n";
+ print " - wow64: Rebuild the 64 bit WoW Wine.\n";
+ print " --no-rm Don't rebuild from scratch.\n";
+ print " --help Shows this usage message.\n";
+ exit 0;
+}
+
+if (! -d "$DataDir/staging" and ! mkdir "$DataDir/staging")
+{
+ LogMsg "Unable to create '$DataDir/staging': $!\n";
+ exit(1);
+}
+
+if ($DataDir =~ /'/)
+{
+ LogMsg "The install path contains invalid characters\n";
+ exit(1);
+}
+
+
+#
+# Run the builds
+#
+
+CountCPUs();
+
+if (!BuildTestAgentd() ||
+ !GitPull($Targets) ||
+ !BuildWine($Targets, $NoRm, "win32", "") ||
+ !BuildWine($Targets, $NoRm, "wow64", "--enable-win64") ||
+ !BuildWine($Targets, $NoRm, "wow32", "--with-wine64='$DataDir/build-wow64'"))
+{
+ exit(1);
+}
+
+LogMsg "ok\n";
+exit;
diff --git a/testbot/bin/build/WineTest.pl b/testbot/bin/build/WineTest.pl
new file mode 100755
index 000000000..01396f9bf
--- /dev/null
+++ b/testbot/bin/build/WineTest.pl
@@ -0,0 +1,282 @@
+#!/usr/bin/perl
+# -*- Mode: Perl; perl-indent-level: 2; indent-tabs-mode: nil -*-
+#
+# Applies the patch and rebuilds Wine.
+#
+# This script does not use tainting (-T) because its whole purpose is to run
+# arbitrary user-provided code anyway.
+#
+# Copyright 2018 Francois Gouget
+#
+# 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
+
+use warnings;
+use strict;
+
+sub BEGIN
+{
+ if ($0 !~ m=^/=)
+ {
+ # Turn $0 into an absolute path so it can safely be used in @INC
+ require Cwd;
+ $0 = Cwd::cwd() . "/$0";
+ }
+ if ($0 =~ m=^(/.*)/[^/]+/[^/]+/[^/]+$=)
+ {
+ $::RootDir = $1;
+ unshift @INC, "$::RootDir/lib";
+ }
+ $::BuildEnv = 1;
+}
+my $Name0 = $0;
+$Name0 =~ s+^.*/++;
+
+
+use WineTestBot::Config;
+use WineTestBot::PatchUtils;
+use WineTestBot::Utils;
+
+
+#
+# Logging and error handling helpers
+#
+
+sub InfoMsg(@)
+{
+ print @_;
+}
+
+sub LogMsg(@)
+{
+ print "Task: ", @_;
+}
+
+sub Error(@)
+{
+ print STDERR "$Name0:error: ", @_;
+}
+
+
+#
+# Build helpers
+#
+
+my $ncpus;
+sub CountCPUs()
+{
+ if (open(my $fh, "<", "/proc/cpuinfo"))
+ {
+ # Linux
+ map { $ncpus++ if (/^processor/); } <$fh>;
+ close($fh);
+ }
+ $ncpus ||= 1;
+}
+
+sub ApplyPatch($)
+{
+ my ($PatchFile) = @_;
+
+ InfoMsg "Applying patch\n";
+ system("cd '$DataDir/wine' && set -x && ".
+ "git apply --verbose ". ShQuote($PatchFile) ." && ".
+ "git add -A");
+ if ($? != 0)
+ {
+ LogMsg "Patch failed to apply\n";
+ return undef;
+ }
+
+ my $Impacts = GetPatchImpact($PatchFile, "nounits");
+ if ($Impacts->{Makefiles})
+ {
+ InfoMsg "\nRunning make_makefiles\n";
+ system("cd '$DataDir/wine' && set -x && ./tools/make_makefiles");
+ if ($? != 0)
+ {
+ LogMsg "make_makefiles failed\n";
+ return undef;
+ }
+ }
+
+ if ($Impacts->{Autoconf} && !$Impacts->{HasConfigure})
+ {
+ InfoMsg "\nRunning autoconf\n";
+ system("cd '$DataDir/wine' && set -x && autoconf");
+ if ($? != 0)
+ {
+ LogMsg "Autoconf failed\n";
+ return undef;
+ }
+ }
+
+ return $Impacts;
+}
+
+sub BuildWine($$)
+{
+ my ($Targets, $Build) = @_;
+
+ return 1 if (!$Targets->{$Build});
+
+ InfoMsg "\nRebuilding the $Build Wine\n";
+ system("cd '$DataDir/build-$Build' && set -x && ".
+ "time make -j$ncpus");
+ if ($? != 0)
+ {
+ LogMsg "The $Build build failed\n";
+ return !1;
+ }
+
+ return 1;
+}
+
+
+#
+# Setup and command line processing
+#
+
+$ENV{PATH} = "/usr/lib/ccache:/usr/bin:/bin";
+delete $ENV{ENV};
+
+my %AllTargets;
+map { $AllTargets{$_} = 1 } qw(win32 wow32 wow64);
+
+my ($Usage, $TargetList, $Action, $FileName);
+while (@ARGV)
+{
+ my $Arg = shift @ARGV;
+ if ($Arg =~ /^(?:-\?|-h|--help)$/)
+ {
+ $Usage = 0;
+ last;
+ }
+ elsif ($Arg =~ /^-/)
+ {
+ Error "unknown option '$Arg'\n";
+ $Usage = 2;
+ last;
+ }
+ elsif (!defined $TargetList)
+ {
+ $TargetList = $Arg;
+ }
+ elsif (!defined $Action)
+ {
+ $Action = $Arg;
+ }
+ elsif (!defined $FileName)
+ {
+ if (IsValidFileName($Arg))
+ {
+ $FileName = "$DataDir/staging/$Arg";
+ if (!-r $FileName)
+ {
+ Error "'$Arg' is not readable\n";
+ $Usage = 2;
+ }
+ }
+ else
+ {
+ Error "invalid file name '$Arg'\n";
+ $Usage = 2;
+ last;
+ }
+ }
+ else
+ {
+ Error "unexpected argument '$Arg'\n";
+ $Usage = 2;
+ last;
+ }
+}
+
+# Check and untaint parameters
+my $Targets;
+if (!defined $Usage)
+{
+ if (defined $TargetList)
+ {
+ foreach my $Target (split /,/, $TargetList)
+ {
+ if (!$AllTargets{$Target})
+ {
+ Error "invalid target name $Target\n";
+ $Usage = 2;
+ }
+ $Targets->{$Target} = 1;
+ }
+ }
+ else
+ {
+ Error "specify at least one target\n";
+ $Usage = 2;
+ }
+
+ if (!defined $Action)
+ {
+ Error "you must specify the action to perform\n";
+ $Usage = 2;
+ }
+ elsif ($Action ne "build")
+ {
+ Error "invalid '$Action' action\n";
+ $Usage = 2;
+ }
+
+ if (!defined $FileName and $Action eq "build")
+ {
+ Error "you must provide a patch file\n";
+ $Usage = 2;
+ }
+}
+if (defined $Usage)
+{
+ print "Usage: $Name0 [--help] TARGETS build PATCH\n";
+ print "\n";
+ print "Applies the specified patch and rebuilds Wine.\n";
+ print "\n";
+ print "Where:\n";
+ print " TARGETS Is a comma-separated list of targets for the build.\n";
+ print " - win32: The regular 32 bit Wine build.\n";
+ print " - wow32: The 32 bit WoW Wine build.\n";
+ print " - wow64: The 64 bit WoW Wine build.\n";
+ print " build Verify that the patch compiles.\n";
+ print " PATCH Is the staging file containing the patch to test.\n";
+ print " --help Shows this usage message.\n";
+ exit $Usage;
+}
+
+if ($DataDir =~ /'/)
+{
+ LogMsg "The install path contains invalid characters\n";
+ exit(1);
+}
+
+
+#
+# Run the builds
+#
+
+CountCPUs();
+
+my $Impacts = ApplyPatch($FileName);
+exit(1) if (!$Impacts or
+ !BuildWine($Targets, "win32") or
+ !BuildWine($Targets, "wow64") or
+ !BuildWine($Targets, "wow32"));
+
+LogMsg "ok\n";
+exit;
diff --git a/testbot/ddl/update37.sql b/testbot/ddl/update37.sql
new file mode 100644
index 000000000..cfa50ce2e
--- /dev/null
+++ b/testbot/ddl/update37.sql
@@ -0,0 +1,4 @@
+USE winetestbot;
+
+ALTER TABLE VMs
+ MODIFY Type ENUM('win32', 'win64', 'build', 'wine') NOT NULL;
diff --git a/testbot/ddl/winetestbot.sql b/testbot/ddl/winetestbot.sql
index 1e7b1edd1..12b5dea1a 100644
--- a/testbot/ddl/winetestbot.sql
+++ b/testbot/ddl/winetestbot.sql
@@ -46,7 +46,7 @@ CREATE TABLE VMs
(
Name VARCHAR(20) NOT NULL,
SortOrder INT(3) NOT NULL,
- Type ENUM('win32', 'win64', 'build') NOT NULL,
+ Type ENUM('win32', 'win64', 'build', 'wine') NOT NULL,
Role ENUM('extra', 'base', 'winetest', 'retired', 'deleted') NOT NULL,
Status ENUM('dirty', 'reverting', 'sleeping', 'idle', 'running', 'off', 'offline', 'maintenance') NOT NULL,
Errors INT(2) NULL,
diff --git a/testbot/lib/WineTestBot/Config.pm b/testbot/lib/WineTestBot/Config.pm
index 66cb813ff..1ffff262f 100644
--- a/testbot/lib/WineTestBot/Config.pm
+++ b/testbot/lib/WineTestBot/Config.pm
@@ -31,7 +31,8 @@ use vars qw (@ISA @EXPORT @EXPORT_OK $UseSSL $LogDir $DataDir $BinDir
$MaxVMsWhenIdle $SleepAfterRevert $WaitForToolsInVM
$VMToolTimeout $MaxVMErrors $MaxTaskTries $AdminEMail $RobotEMail
$WinePatchToOverride $WinePatchCc $SuiteTimeout $SingleTimeout
- $BuildTimeout $ReconfigTimeout $TimeoutMargin $TagPrefix
+ $BuildTimeout $ReconfigTimeout $WineReconfigTimeout $TimeoutMargin
+ $TagPrefix
$MaxUnitSize $ProjectName $PatchesMailingList $LDAPServer
$LDAPBindDN $LDAPSearchBase $LDAPSearchFilter
$LDAPRealNameAttribute $LDAPEMailAttribute $AgentPort $Tunnel
@@ -45,7 +46,8 @@ require Exporter;
$MaxRunningVMs $MaxVMsWhenIdle $SleepAfterRevert $WaitForToolsInVM
$VMToolTimeout $MaxVMErrors $MaxTaskTries $AdminEMail
$RobotEMail $WinePatchToOverride $WinePatchCc $SuiteTimeout
- $SingleTimeout $BuildTimeout $ReconfigTimeout $TimeoutMargin
+ $SingleTimeout $BuildTimeout $ReconfigTimeout $WineReconfigTimeout
+ $TimeoutMargin
$TagPrefix $MaxUnitSize $ProjectName $PatchesMailingList
$LDAPServer $LDAPBindDN $LDAPSearchBase $LDAPSearchFilter
$LDAPRealNameAttribute $LDAPEMailAttribute $AgentPort $Tunnel
@@ -101,6 +103,9 @@ $BuildTimeout = 5 * 60;
# (in seconds). Note that this includes building the native Wine build tools,
# and the 32 and 64 bit test executables.
$ReconfigTimeout = (1 + 2 * 5) * 60;
+# How long to let a full Wine recompilation run before forcibly shutting it
+# down (in seconds).
+$WineReconfigTimeout = 20 * 60;
# How much to add to the task timeout to account for file transfers, etc.
$TimeoutMargin = 2 * 60;
# Maximum amount of traces for a test unit.
diff --git a/testbot/lib/WineTestBot/Engine/Scheduler.pm b/testbot/lib/WineTestBot/Engine/Scheduler.pm
index 159b10cf8..3ed86e28d 100644
--- a/testbot/lib/WineTestBot/Engine/Scheduler.pm
+++ b/testbot/lib/WineTestBot/Engine/Scheduler.pm
@@ -392,7 +392,8 @@ sub _CheckAndClassifyVMs()
20) + # extra
($VM->Type eq "build" ? 0 :
$VM->Type eq "win64" ? 1 :
- 2); # win32
+ $VM->Type eq "win32" ? 2 :
+ 3); # wine
}
# If a VM was in an inconsistent state, update the jobs status fields before
diff --git a/testbot/lib/WineTestBot/PatchUtils.pm b/testbot/lib/WineTestBot/PatchUtils.pm
index 3bf172125..1aeed6740 100644
--- a/testbot/lib/WineTestBot/PatchUtils.pm
+++ b/testbot/lib/WineTestBot/PatchUtils.pm
@@ -36,6 +36,22 @@ our @EXPORT = qw(GetPatchImpact UpdateWineData);
use WineTestBot::Config;
+# These paths are too generic to be proof that this is a Wine patch.
+my $AmbiguousPathsRe = join('|',
+ 'Makefile\.in$',
+ # aclocal.m4 gets special treatment
+ # configure gets special treatment
+ # configure.ac gets special treatment
+ 'include/Makefile\.in$',
+ 'include/config\.h\.in$',
+ 'po/',
+ 'tools/Makefile.in',
+ 'tools/config.guess',
+ 'tools/config.sub',
+ 'tools/install-sh',
+ 'tools/makedep.c',
+);
+
# Patches to these paths don't impact the Wine build. So ignore them.
my $IgnoredPathsRe = join('|',
'\.mailmap$',
@@ -53,6 +69,7 @@ my $IgnoredPathsRe = join('|',
'tools/winemaker/',
);
+
=pod
=over 12
@@ -75,6 +92,7 @@ sub UpdateWineData($)
}
my $_TimeStamp;
+my $_WineFiles;
my $_TestList;
=pod
@@ -83,7 +101,7 @@ my $_TestList;
=item C<_LoadWineFiles()>
Reads latest/winefiles.txt to build a per-module hashtable of the test unit
-files.
+files and a hashtable of all the Wine files.
=back
=cut
@@ -101,11 +119,13 @@ sub _LoadWineFiles()
$_TimeStamp = $MTime;
$_TestList = {};
+ $_WineFiles = {};
if (open(my $fh, "<", $FileName))
{
while (my $Line = <$fh>)
{
chomp $Line;
+ $_WineFiles->{$Line} = 1;
if ($Line =~ m~^\w+/([^/]+)/tests/([^/]+)$~)
{
@@ -121,11 +141,23 @@ sub _LoadWineFiles()
sub _HandleFile($$$)
{
- my ($Impacts, $Path, $Change) = @_;
+ my ($Impacts, $FilePath, $Change) = @_;
- if ($Path =~ m~^(dlls|programs)/([^/]+)/tests/([^/\s]+)$~)
+ if ($Change eq "new")
+ {
+ delete $Impacts->{DeletedFiles}->{$FilePath};
+ $Impacts->{NewFiles}->{$FilePath} = 1;
+ }
+ elsif ($Change eq "rm")
+ {
+ delete $Impacts->{NewFiles}->{$FilePath};
+ $Impacts->{DeletedFiles}->{$FilePath} = 1;
+ }
+
+ if ($FilePath =~ m~^(dlls|programs)/([^/]+)/tests/([^/\s]+)$~)
{
my ($Root, $Module, $File) = ($1, $2, $3);
+ $Impacts->{IsWinePatch} = 1;
$Impacts->{TestBuild} = 1;
my $Tests = $Impacts->{Tests};
@@ -163,8 +195,29 @@ sub _HandleFile($$$)
}
else
{
- # Figure out if this patch impacts the Wine build
- $Impacts->{WineBuild} = 1 if ($Path !~ /^(?:$IgnoredPathsRe)/);
+ my $WineFiles = $Impacts->{WineFiles} || $_WineFiles;
+ if ($WineFiles->{$FilePath})
+ {
+ if ($FilePath !~ /^(?:$AmbiguousPathsRe)/)
+ {
+ $Impacts->{IsWinePatch} = 1;
+ }
+ # Else this file exists in Wine but has a very common name so it may just
+ # as well belong to another repository. Still update WineBuild in case
+ # this patch really is for Wine.
+
+ if ($FilePath !~ /^(?:$IgnoredPathsRe)/)
+ {
+ $Impacts->{WineBuild} = 1;
+ }
+ # Else patches to this file don't impact the Wine build.
+ }
+ elsif ($FilePath =~ m~/Makefile.in$~ and $Change eq "new")
+ {
+ # This may or may not be a Wine patch but the new Makefile.in will be
+ # added to the build by make_makefiles.
+ $Impacts->{WineBuild} = $Impacts->{Makefiles} = 1;
+ }
}
}
@@ -195,6 +248,21 @@ sub GetPatchImpact($;$$)
if ($PastImpacts)
{
+ if ($PastImpacts->{WineBuild} or $PastImpacts->{TestBuild})
+ {
+ # Update the list of Wine files so we correctly recognize patchset parts
+ # that modify new Wine files.
+ my $WineFiles = $PastImpacts->{WineFiles} || $_WineFiles;
+ map { $Impacts->{WineFiles}->{$_} = 1 } keys %{$WineFiles};
+ map { $Impacts->{WineFiles}->{$_} = 1 } keys %{$PastImpacts->{NewFiles}};
+ map { delete $Impacts->{WineFiles}->{$_} } keys %{$PastImpacts->{DeletedFiles}};
+ }
+ else
+ {
+ $Impacts->{NewFiles} = $PastImpacts->{NewFiles};
+ $Impacts->{DeletedFiles} = $PastImpacts->{DeletedFiles};
+ }
+
foreach my $PastInfo (values %{$PastImpacts->{Tests}})
{
if ($PastInfo->{Files})
@@ -207,6 +275,7 @@ sub GetPatchImpact($;$$)
}
}
}
+
my ($Path, $Change);
while (my $Line = <$fh>)
{
@@ -221,6 +290,7 @@ sub GetPatchImpact($;$$)
elsif ($Line =~ m=^--- \w+/tools/make_makefiles$=)
{
$Impacts->{WineBuild} = $Impacts->{Makefiles} = 1;
+ $Impacts->{IsWinePatch} = 1;
}
elsif ($Line =~ m=^--- /dev/null$=)
{
diff --git a/testbot/lib/WineTestBot/Patches.pm b/testbot/lib/WineTestBot/Patches.pm
index 258aa2c19..03a0ebf16 100644
--- a/testbot/lib/WineTestBot/Patches.pm
+++ b/testbot/lib/WineTestBot/Patches.pm
@@ -135,32 +135,24 @@ sub Submit($$$)
my $PastImpacts;
$PastImpacts = GetPatchImpact($PatchFileName) if ($IsSet);
my $Impacts = GetPatchImpact("$DataDir/patches/" . $self->Id, undef, $PastImpacts);
- if (!$Impacts->{UnitCount})
- {
- $self->Disposition(($IsSet ? "Part" : "Patch") .
- " doesn't affect tests");
- return undef;
- }
- my $User;
- my $Users = CreateUsers();
- if (defined($self->FromEMail))
+ if (!$Impacts->{WineBuild} and !$Impacts->{TestBuild})
{
- $Users->AddFilter("EMail", [$self->FromEMail]);
- if (! $Users->IsEmpty())
+ if ($Impacts->{IsWinePatch})
{
- $User = @{$Users->GetItems()}[0];
+ $self->Disposition(($IsSet ? "Part does" : "Does")
+ ." not impact the Wine build");
}
- }
- if (! defined($User))
- {
- $User = GetBatchUser();
+ else
+ {
+ $self->Disposition(($IsSet ? "Part is not" : "Not") ." a Wine patch");
+ }
+ return undef;
}
# Create a new job for this patch
my $Jobs = CreateJobs();
my $NewJob = $Jobs->Add();
- $NewJob->User($User);
$NewJob->Priority(6);
my $PropertyDescriptor = $Jobs->GetPropertyDescriptorByName("Remarks");
my $Subject = $self->Subject;
@@ -171,84 +163,137 @@ sub Submit($$$)
$PropertyDescriptor->GetMaxLength()));
$NewJob->Patch($self);
- # Add build step to the job
- my $BuildStep = $NewJob->Steps->Add();
- $BuildStep->FileName("patch.diff");
- $BuildStep->FileType("patchdlls"); # This is irrelevant now
- $BuildStep->InStaging(!1);
- $BuildStep->Type("build");
- $BuildStep->DebugLevel(0);
-
- # Add build task
- my $VMs = CreateVMs();
- $VMs->AddFilter("Type", ["build"]);
- $VMs->AddFilter("Role", ["base"]);
- my $BuildVM = ${$VMs->GetItems()}[0];
- my $Task = $BuildStep->Tasks->Add();
- $Task->VM($BuildVM);
- $Task->Timeout($BuildTimeout);
-
- # Save the build step so the others can reference it.
- my ($ErrKey, $ErrProperty, $ErrMessage) = $Jobs->Save();
- if (defined($ErrMessage))
+ my $User;
+ my $Users = CreateUsers();
+ if (defined $self->FromEMail)
{
- $self->Disposition("Failed to submit build step");
- return $ErrMessage;
+ $Users->AddFilter("EMail", [$self->FromEMail]);
+ $User = @{$Users->GetItems()}[0] if (!$Users->IsEmpty());
}
+ $NewJob->User($User || GetBatchUser());
- # Stage the patch so it can be picked up by the job
- if (!link($PatchFileName, "$DataDir/staging/job". $NewJob->Id ."_patch.diff"))
+ my $BuildVMs = CreateVMs();
+ $BuildVMs->AddFilter("Type", ["build"]);
+ $BuildVMs->AddFilter("Role", ["base"]);
+ if ($Impacts->{UnitCount} and !$BuildVMs->IsEmpty())
{
- $self->Disposition("Failed to stage the patch file");
- return $!;
- }
+ # Create the Build Step
+ my $BuildStep = $NewJob->Steps->Add();
+ $BuildStep->FileName("patch.diff");
+ $BuildStep->FileType("patchdlls");
+ $BuildStep->InStaging(!1);
+ $BuildStep->Type("build");
+ $BuildStep->DebugLevel(0);
+
+ # Add build task
+ my $BuildVM = ${$BuildVMs->GetItems()}[0];
+ my $Task = $BuildStep->Tasks->Add();
+ $Task->VM($BuildVM);
+ $Task->Timeout($BuildTimeout);
+
+ # Save the build step so the others can reference it.
+ my ($ErrKey, $ErrProperty, $ErrMessage) = $Jobs->Save();
+ if (defined($ErrMessage))
+ {
+ $self->Disposition("Failed to submit build step");
+ return $ErrMessage;
+ }
- foreach my $Module (sort keys %{$Impacts->{Tests}})
- {
- my $TestInfo = $Impacts->{Tests}->{$Module};
- foreach my $Unit (sort keys %{$TestInfo->{Units}})
+ # Create steps for the Windows tests
+ foreach my $Module (sort keys %{$Impacts->{Tests}})
{
- # Add 32 and 64-bit tasks
- foreach my $Bits ("32", "64")
+ my $TestInfo = $Impacts->{Tests}->{$Module};
+ foreach my $Unit (sort keys %{$TestInfo->{Units}})
{
- $VMs = CreateVMs();
- $VMs->AddFilter("Type", $Bits eq "32" ? ["win32", "win64"] : ["win64"]);
- $VMs->AddFilter("Role", ["base"]);
- if (@{$VMs->GetKeys()})
+ foreach my $Bits ("32", "64")
{
- # Create the corresponding Step
- my $NewStep = $NewJob->Steps->Add();
- $NewStep->PreviousNo($BuildStep->No);
- my $FileName = $TestInfo->{ExeBase};
- $FileName .= "64" if ($Bits eq "64");
- $NewStep->FileName("$FileName.exe");
- $NewStep->FileType("exe$Bits");
- $NewStep->InStaging(!1);
-
- # And a task for each VM
- my $Tasks = $NewStep->Tasks;
- my $SortedKeys = $VMs->SortKeysBySortOrder($VMs->GetKeys());
- foreach my $VMKey (@$SortedKeys)
+ my $WinVMs = CreateVMs();
+ $WinVMs->AddFilter("Type", $Bits eq "32" ? ["win32", "win64"] : ["win64"]);
+ $WinVMs->AddFilter("Role", ["base"]);
+ if (!$WinVMs->IsEmpty())
{
- my $VM = $VMs->GetItem($VMKey);
- my $Task = $Tasks->Add();
- $Task->VM($VM);
- $Task->Timeout($SingleTimeout);
- $Task->CmdLineArg($Unit);
+ # Create one Step per (module, unit, bitness) combination
+ my $NewStep = $NewJob->Steps->Add();
+ $NewStep->PreviousNo($BuildStep->No);
+ my $FileName = $TestInfo->{ExeBase};
+ $FileName .= "64" if ($Bits eq "64");
+ $NewStep->FileName("$FileName.exe");
+ $NewStep->FileType("exe$Bits");
+ $NewStep->InStaging(!1);
+
+ # And a task for each VM
+ my $Tasks = $NewStep->Tasks;
+ my $SortedKeys = $WinVMs->SortKeysBySortOrder($WinVMs->GetKeys());
+ foreach my $VMKey (@$SortedKeys)
+ {
+ my $VM = $WinVMs->GetItem($VMKey);
+ my $Task = $Tasks->Add();
+ $Task->VM($VM);
+ $Task->Timeout($SingleTimeout);
+ $Task->CmdLineArg($Unit);
+ }
}
}
}
}
}
+ my $WineVMs = CreateVMs();
+ $WineVMs->AddFilter("Type", ["wine"]);
+ $WineVMs->AddFilter("Role", ["base"]);
+ if (!$WineVMs->IsEmpty())
+ {
+ # Add a Wine step to the job
+ my $NewStep = $NewJob->Steps->Add();
+ $NewStep->FileName("patch.diff");
+ $NewStep->FileType("patchdlls");
+ $NewStep->InStaging(!1);
+ $NewStep->DebugLevel(0);
+
+ # And a task for each VM
+ my $Tasks = $NewStep->Tasks;
+ my $SortedKeys = $WineVMs->SortKeysBySortOrder($WineVMs->GetKeys());
+ foreach my $VMKey (@$SortedKeys)
+ {
+ my $VM = $WineVMs->GetItem($VMKey);
+ my $Task = $Tasks->Add();
+ $Task->VM($VM);
+ # Only verify that the win32 version compiles
+ $Task->Timeout($WineReconfigTimeout);
+ $Task->CmdLineArg("win32");
+ }
+ }
+
+ if ($NewJob->Steps->IsEmpty())
+ {
+ # This may be a Wine patch but there is no suitable VM to test it!
+ if ($Impacts->{UnitCount})
+ {
+ $self->Disposition("No build or test VM!");
+ }
+ else
+ {
+ $self->Disposition(($IsSet ? "Part does" : "Does") ." not impact the ".
+ ($WineVMs->IsEmpty() ? "Windows " : "") ."tests");
+ }
+ return undef;
+ }
+
# Save it all
- ($ErrKey, $ErrProperty, $ErrMessage) = $Jobs->Save();
+ my ($ErrKey, $ErrProperty, $ErrMessage) = $Jobs->Save();
if (defined $ErrMessage)
{
$self->Disposition("Failed to submit job");
return $ErrMessage;
}
+ # Stage the patch so it can be picked up by the job
+ if (!link($PatchFileName, "$DataDir/staging/job". $NewJob->Id ."_patch.diff"))
+ {
+ $self->Disposition("Failed to stage the patch file");
+ return $!;
+ }
+
# Switch Status to staging to indicate we are done setting up the job
$NewJob->Status("staging");
($ErrKey, $ErrProperty, $ErrMessage) = $Jobs->Save();
@@ -348,27 +393,6 @@ sub IsPatch($$)
return !1;
}
-sub IsTestPatch($$)
-{
- my ($self, $Body) = @_;
-
- if (open(BODY, "<" . $Body->path))
- {
- my $Line;
- while (defined($Line = <BODY>))
- {
- if ($Line =~ m/^\+\+\+ .*\/(dlls|programs)\/[^\/]+\/tests\/[^\/\s]+/)
- {
- close BODY;
- return 1;
- }
- }
- close BODY;
- }
-
- return !1;
-}
-
=pod
=over 12
@@ -412,7 +436,6 @@ sub NewPatch($$$)
my $ErrMessage;
if (scalar(@PatchBodies) == 1)
{
- $Patch->AffectsTests($self->IsTestPatch($PatchBodies[0]));
my $Subject = $Patch->Subject;
$Subject =~ s/32\/64//;
$Subject =~ s/64\/32//;
diff --git a/testbot/lib/WineTestBot/PendingPatchSets.pm b/testbot/lib/WineTestBot/PendingPatchSets.pm
index bfd05e4a3..fc22a8687 100644
--- a/testbot/lib/WineTestBot/PendingPatchSets.pm
+++ b/testbot/lib/WineTestBot/PendingPatchSets.pm
@@ -248,8 +248,7 @@ sub NewSubmission($$)
if (! $Set->CheckSubsetComplete($PartNo))
{
- $Patch->Disposition($Patch->AffectsTests ? "Set not complete yet" :
- "Patch doesn't affect tests");
+ $Patch->Disposition("Set not complete yet");
}
else
{
@@ -260,16 +259,11 @@ sub NewSubmission($$)
my $Part = $Parts->GetItem($PartNo);
if (defined($Part))
{
- if ($Part->Patch->AffectsTests)
+ $ErrMessage = $Set->SubmitSubset($PartNo, $Part->Patch);
+ if (!defined $ErrMessage)
{
- $ErrMessage = $Set->SubmitSubset($PartNo, $Part->Patch);
+ (my $ErrProperty, $ErrMessage) = $Part->Patch->Save();
}
- else
- {
- $Part->Patch->Disposition("Patch doesn't affect tests");
- }
- my $ErrProperty;
- ($ErrProperty, $ErrMessage) = $Part->Patch->Save();
}
else
{
diff --git a/testbot/lib/WineTestBot/StepsTasks.pm b/testbot/lib/WineTestBot/StepsTasks.pm
index 84c5a005f..05854bca7 100644
--- a/testbot/lib/WineTestBot/StepsTasks.pm
+++ b/testbot/lib/WineTestBot/StepsTasks.pm
@@ -78,7 +78,7 @@ sub GetTitle($)
{
$Title .= "64 bit ";
}
- $Title .= $self->CmdLineArg;
+ $Title .= $self->CmdLineArg || "";
}
elsif ($self->Type eq "build")
{
diff --git a/testbot/lib/WineTestBot/Tasks.pm b/testbot/lib/WineTestBot/Tasks.pm
index afd4fb4d3..54ebf5360 100644
--- a/testbot/lib/WineTestBot/Tasks.pm
+++ b/testbot/lib/WineTestBot/Tasks.pm
@@ -177,8 +177,9 @@ sub Run($$)
my ($self, $Step) = @_;
my ($JobId, $StepNo, $TaskNo) = @{$self->GetMasterKey()};
- my $Script = $Step->Type eq "build" ? "Build" :
- $Step->Type eq "reconfig" ? "Reconfig" :
+ my $Script = $Step->Type eq "reconfig" ? "Reconfig" :
+ $self->VM->Type eq "wine" ? "WineTest" :
+ $Step->Type eq "build" ? "Build" :
"Task";
my $Args = ["$BinDir/${ProjectName}Run$Script.pl", "--log-only",
$JobId, $StepNo, $TaskNo];
diff --git a/testbot/lib/WineTestBot/VMs.pm b/testbot/lib/WineTestBot/VMs.pm
index 2f494cb81..cf7bd5ab7 100644
--- a/testbot/lib/WineTestBot/VMs.pm
+++ b/testbot/lib/WineTestBot/VMs.pm
@@ -306,10 +306,10 @@ sub Validate($)
{
my ($self) = @_;
- if ($self->Type ne "win32" && $self->Type ne "win64" &&
- ($self->Role eq "winetest" || $self->Role eq "extra"))
+ if ($self->Type !~ /^(?:win32|win64|wine)$/ and
+ $self->Role =~ /^(?:extra|winetest)$/)
{
- return ("Role", "Only win32 and win64 VMs can have a role of '" . $self->Role . "'");
+ return ("Role", "Only win32, win64 and wine VMs can have a role of '" . $self->Role . "'");
}
return $self->SUPER::Validate();
}
@@ -664,7 +664,7 @@ sub CreateItem($)
my @PropertyDescriptors = (
CreateBasicPropertyDescriptor("Name", "VM name", 1, 1, "A", 20),
CreateBasicPropertyDescriptor("SortOrder", "Display order", !1, 1, "N", 3),
- CreateEnumPropertyDescriptor("Type", "Type of VM", !1, 1, ['win32', 'win64', 'build']),
+ CreateEnumPropertyDescriptor("Type", "Type of VM", !1, 1, ['win32', 'win64', 'build', 'wine']),
CreateEnumPropertyDescriptor("Role", "VM Role", !1, 1, ['extra', 'base', 'winetest', 'retired', 'deleted']),
CreateEnumPropertyDescriptor("Status", "Current status", !1, 1, ['dirty', 'reverting', 'sleeping', 'idle', 'running', 'off', 'offline', 'maintenance']),
CreateBasicPropertyDescriptor("Errors", "Errors", !1, !1, "N", 2),
--
2.17.1
June 21, 2018
[PATCH 2/4] testbot/WineRun*: Improve the VM and Step validation.
by Francois Gouget
Check that the VM is of the expected type. Also the VM should always be
powered on (for powered off snapshots LibvirtTool.pl is responsible for
powering on the VM), even when debugging.
Move the Step validation next to the VM one.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineRunBuild.pl | 15 ++++++++++++---
testbot/bin/WineRunReconfig.pl | 15 ++++++++++++---
testbot/bin/WineRunTask.pl | 24 ++++++++++++++----------
3 files changed, 38 insertions(+), 16 deletions(-)
diff --git a/testbot/bin/WineRunBuild.pl b/testbot/bin/WineRunBuild.pl
index 60af32c73..ff04ded0c 100755
--- a/testbot/bin/WineRunBuild.pl
+++ b/testbot/bin/WineRunBuild.pl
@@ -309,18 +309,27 @@ sub FatalTAError($$)
#
-# Check the VM
+# Check the VM and Step
#
-if (!$Debug and $VM->Status ne "running")
+if ($VM->Type ne "build")
+{
+ FatalError("This is not a build VM! (" . $VM->Type . ")\n");
+}
+elsif (!$Debug and $VM->Status ne "running")
{
FatalError("The VM is not ready for use (" . $VM->Status . ")\n");
}
-elsif ($Debug and !$VM->GetDomain()->IsPoweredOn())
+elsif (!$VM->GetDomain()->IsPoweredOn())
{
FatalError("The VM is not powered on\n");
}
+if ($Step->FileType ne "patchdlls")
+{
+ FatalError("Unexpected file type '". $Step->FileType ."' found\n");
+}
+
#
# Figure out what to build
diff --git a/testbot/bin/WineRunReconfig.pl b/testbot/bin/WineRunReconfig.pl
index 2e338c975..23b038a1f 100755
--- a/testbot/bin/WineRunReconfig.pl
+++ b/testbot/bin/WineRunReconfig.pl
@@ -309,18 +309,27 @@ sub FatalTAError($$)
#
-# Check the VM
+# Check the VM and Step
#
-if (!$Debug and $VM->Status ne "running")
+if ($VM->Type ne "build")
+{
+ FatalError("This is not a build VM! (" . $VM->Type . ")\n");
+}
+elsif (!$Debug and $VM->Status ne "running")
{
FatalError("The VM is not ready for use (" . $VM->Status . ")\n");
}
-elsif ($Debug and !$VM->GetDomain()->IsPoweredOn())
+elsif (!$VM->GetDomain()->IsPoweredOn())
{
FatalError("The VM is not powered on\n");
}
+if ($Step->FileType ne "none")
+{
+ FatalError("Unexpected file type '". $Step->FileType ."' found\n");
+}
+
#
# Run the build
diff --git a/testbot/bin/WineRunTask.pl b/testbot/bin/WineRunTask.pl
index 3f5a3ee8d..7604e73ad 100755
--- a/testbot/bin/WineRunTask.pl
+++ b/testbot/bin/WineRunTask.pl
@@ -364,18 +364,27 @@ sub FatalTAError($$;$)
#
-# Check the VM
+# Check the VM and Step
#
-if (!$Debug and $VM->Status ne "running")
+if ($VM->Type ne "win32" and $VM->Type ne "win64")
+{
+ FatalError("This is not a Windows VM! (" . $VM->Type . ")\n");
+}
+elsif (!$Debug and $VM->Status ne "running")
{
FatalError("The VM is not ready for use (" . $VM->Status . ")\n");
}
-elsif ($Debug and !$VM->GetDomain()->IsPoweredOn())
+elsif (!$VM->GetDomain()->IsPoweredOn())
{
FatalError("The VM is not powered on\n");
}
+if ($Step->FileType ne "exe32" and $Step->FileType ne "exe64")
+{
+ FatalError("Unexpected file type '". $Step->FileType ."' found\n");
+}
+
#
# Setup the VM
@@ -395,11 +404,6 @@ if (!$TA->SetTime())
}
}
-my $FileType = $Step->FileType;
-if ($FileType ne "exe32" && $FileType ne "exe64")
-{
- FatalError("Unexpected file type $FileType found\n");
-}
my $FileName = $Step->FileName;
Debug(Elapsed($Start), " Sending '". $Step->GetFullFileName() ."'\n");
if (!$TA->SendFile($Step->GetFullFileName(), $FileName, 0))
@@ -418,7 +422,7 @@ if ($Step->ReportSuccessfulTests)
my $IsWineTest = 1;
if ($Step->Type eq "single")
{
- my $TestLauncher = "TestLauncher" . ($FileType eq "exe64" ? "64" : "32") . ".exe";
+ my $TestLauncher = "TestLauncher" . ($Step->FileType eq "exe64" ? "64" : "32") . ".exe";
Debug(Elapsed($Start), " Sending 'latest/$TestLauncher'\n");
if (!$TA->SendFile("$DataDir/latest/$TestLauncher", $TestLauncher, 0))
{
@@ -450,7 +454,7 @@ elsif ($Step->Type eq "suite")
$Tag =~ s/[^a-zA-Z0-9]/-/g;
if ($VM->Type eq "win64")
{
- $Tag .= "-" . ($FileType eq "exe64" ? "64" : "32");
+ $Tag .= "-" . ($Step->FileType eq "exe64" ? "64" : "32");
}
if (defined($WebHostName))
{
--
2.17.1
June 21, 2018
[PATCH 1/4] testbot: Build the per-module test unit list from the list of Wine files.
by Francois Gouget
This also caches winefiles.txt so it is only reloaded when it changes.
Also stop generating and retrieving testlist.txt since it is not
needed anymore. If desired testlist.txt can be deleted for cleanup.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineRunReconfig.pl | 10 -----
testbot/lib/WineTestBot/PatchUtils.pm | 62 +++++++++++++--------------
2 files changed, 31 insertions(+), 41 deletions(-)
diff --git a/testbot/bin/WineRunReconfig.pl b/testbot/bin/WineRunReconfig.pl
index 2950799d5..2e338c975 100755
--- a/testbot/bin/WineRunReconfig.pl
+++ b/testbot/bin/WineRunReconfig.pl
@@ -414,16 +414,6 @@ if ($NewStatus eq "completed")
}
}
- Debug(Elapsed($Start), " Retrieving the updated test list '$TaskDir/testlist.txt'\n");
- if ($TA->GetFile("testlist.txt", "$TaskDir/testlist.txt"))
- {
- copy "$TaskDir/testlist.txt", "$DataDir/latest/testlist.txt";
- }
- elsif (!defined $TAError)
- {
- $TAError = "An error occurred while retrieving the test list: ". $TA->GetLastError();
- }
-
Debug(Elapsed($Start), " Retrieving the list of Wine files '$TaskDir/winefiles.txt'\n");
if ($TA->GetFile("latest/winefiles.txt", "$TaskDir/winefiles.txt"))
{
diff --git a/testbot/lib/WineTestBot/PatchUtils.pm b/testbot/lib/WineTestBot/PatchUtils.pm
index f83df6087..3bf172125 100644
--- a/testbot/lib/WineTestBot/PatchUtils.pm
+++ b/testbot/lib/WineTestBot/PatchUtils.pm
@@ -58,8 +58,8 @@ my $IgnoredPathsRe = join('|',
=item C<UpdateWineData()>
-Updates the summary information about the Wine source such as the list of
-tests (testlist.txt) and the full list of Wine files.
+Updates information about the Wine source, such as the list of Wine files,
+for use by the TestBot server.
=back
=cut
@@ -72,51 +72,51 @@ sub UpdateWineData($)
my $ErrMessage = `cd '$WineDir' && git ls-tree -r --name-only HEAD 2>&1 >'$DataDir/latest/winefiles.txt'`;
return $ErrMessage if ($? != 0);
-
- if (open(my $fh, ">", "$DataDir/testlist.txt"))
- {
- foreach my $TestFile (glob("$WineDir/*/*/tests/*.c"),
- glob("$WineDir/*/*/tests/*.spec"))
- {
- next if ($TestFile =~ m=/testlist\.c$=);
- $TestFile =~ s=^$WineDir/==;
- print $fh "$TestFile\n";
- }
- close($fh);
- return undef;
- }
-
- return "Could not open 'testlist.txt' for writing: $!";
}
+my $_TimeStamp;
+my $_TestList;
+
=pod
=over 12
-=item C<GetTestList()>
+=item C<_LoadWineFiles()>
-Returns a hashtable containing the list of the source files for a given module.
-This structure is built from the latest/testlist.txt file.
+Reads latest/winefiles.txt to build a per-module hashtable of the test unit
+files.
=back
=cut
-sub GetTestList()
+sub _LoadWineFiles()
{
- my $TestList = {};
- if (open(my $File, "<", "$DataDir/latest/testlist.txt"))
+ my $FileName = "$DataDir/latest/winefiles.txt";
+ my $MTime = (stat($FileName))[9] || 0;
+
+ if ($_TestList and $_TimeStamp == $MTime)
{
- while (my $TestFileName = <$File>)
+ # The file has not changed since we loaded it
+ return;
+ }
+
+ $_TimeStamp = $MTime;
+ $_TestList = {};
+ if (open(my $fh, "<", $FileName))
+ {
+ while (my $Line = <$fh>)
{
- chomp $TestFileName;
- if ($TestFileName =~ m~^\w+/([^/]+)/tests/([^/]+)$~)
+ chomp $Line;
+
+ if ($Line =~ m~^\w+/([^/]+)/tests/([^/]+)$~)
{
my ($Module, $File) = ($1, $2);
- $TestList->{$Module}->{$File} = 1;
+ next if ($File eq "testlist.c");
+ next if ($File !~ /\.(?:c|spec)$/);
+ $_TestList->{$Module}->{$File} = 1;
}
}
- close($File);
+ close($fh);
}
- return $TestList;
}
sub _HandleFile($$$)
@@ -154,8 +154,7 @@ sub _HandleFile($$$)
if (!$Tests->{$Module}->{Files})
{
- my $TestList = ( $Impacts->{TestList} ||= GetTestList() );
- foreach my $File (keys %{$TestList->{$Module}})
+ foreach my $File (keys %{$_TestList->{$Module}})
{
$Tests->{$Module}->{Files}->{$File} = 0; # not modified
}
@@ -192,6 +191,7 @@ sub GetPatchImpact($;$$)
NoUnits => $NoUnits,
Tests => {},
};
+ _LoadWineFiles();
if ($PastImpacts)
{
--
2.17.1
June 21, 2018