experimental framework for investigating DrawTextEx behaviour

Medland, Bill Bill.Medland at accpac.com
Thu Jan 17 13:41:01 CST 2002


-------------- next part --------------
Bill Medland (medbi01 at accpac.com)
An experimental testbed for the DrawText(Ex) functions

Index: wine/libtest/Makefile.in
===================================================================
RCS file: /home/wine/wine/libtest/Makefile.in,v
retrieving revision 1.23
diff -u -r1.23 Makefile.in
--- wine/libtest/Makefile.in	2002/01/14 18:34:01	1.23
+++ wine/libtest/Makefile.in	2002/01/17 17:51:28
@@ -5,7 +5,8 @@
 SRCDIR     = @srcdir@
 VPATH      = @srcdir@
 MODULE     = none
-PROGRAMS   = expand hello hello2 hello3 hello4 hello5 new rolex vartest volinfo
+PROGRAMS   = expand hello hello2 hello3 hello4 hello5 new rolex vartest volinfo\
+             drawtext
 ALL_LIBS   = $(LIBWINE) $(LIBS)
 
 C_SRCS = \
@@ -18,7 +19,8 @@
 	new.c \
 	rolex.c \
 	vartest.c \
-	volinfo.c
+	volinfo.c \
+	drawtext.c
 
 SPEC_SRCS = \
 	expand.spec \
@@ -30,7 +32,8 @@
 	new.spec \
 	rolex.spec \
 	vartest.spec \
-	volinfo.spec
+	volinfo.spec \
+	drawtext.spec
 
 RC_SRCS = \
 	hello3res.rc
@@ -89,6 +92,12 @@
 volinfo.so: volinfo.o volinfo.spec.o
 	$(LDSHARED) $(LDDLLFLAGS) -o volinfo.so $+ $(ALL_LIBS)
 
+drawtext.spec.c: drawtext.spec drawtext.o $(WINEBUILD)
+	$(LDPATH) $(WINEBUILD) @DLLFLAGS@ -L $(DLLDIR) -sym drawtext.o -o drawtext.spec.c -spec drawtext.spec
+drawtext.so: drawtext.o drawtext.spec.o
+	$(LDSHARED) $(LDDLLFLAGS) -o drawtext.so $+ $(ALL_LIBS)
+
+$(PROGRAMS):
 $(PROGRAMS):
 	$(LN_S) $(TOPOBJDIR)/wine $@
 
--- /dev/null	Fri Mar 23 20:37:44 2001
+++ wine/libtest/drawtext.spec	Thu Jan 17 10:58:16 2002
@@ -0,0 +1,8 @@
+name	drawtext
+mode	guiexe
+type	win32
+
+import	user32.dll
+import	gdi32.dll
+import	kernel32.dll
+import	ntdll.dll

--- /dev/null	Fri Mar 23 20:37:44 2001
+++ wine/libtest/drawtext.c	Thu Jan 17 11:48:43 2002
@@ -0,0 +1,282 @@
+/*------------------------------------------------------------
+   drawtext.c -- Test the DrawText functions - Based on
+   HELLOWIN.C -- Displays "Hello, Windows 95!" in client area
+                 (c) Charles Petzold, 1996
+
+drawtext is a program that exercises the capabilities of the DrawText and
+DrawTextEx functions in order to provide information for and testing of the
+Wine product.
+
+Calling:
+drawtext ?
+or
+drawtext [<page setting>[<Tab setting>[<Left Margin>[<Right Margin>]]] "Text"
+
+To be done:
+1. Add the flags e.g. reset_text to the arguments
+2. Improve the text modification reporting especially to see what happens
+   after the \0 inserted during word ellipsification.
+
+  ------------------------------------------------------------*/
+
+#include <windows.h>
+#include <stdio.h>
+
+#define countof(a) (sizeof(a)/sizeof(a[0]))
+
+LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
+
+static int page_settings = 0;
+static int tab_setting = 8;
+static int left_margin = 0;
+static int right_margin = 0;
+static int helpmode;
+static int reset_rect = 1; // If DT_CALCRECT then reset the rectangle before
+                           // doing the display
+static int reset_text = 1;
+static int widen_chars = 0; // Set to widen each character
+static char argText[512];
+static char *pText;
+static int modify_noted [32];
+static int modify_noted_c [32];
+static FILE *log = NULL;
+
+
+/* Read the next integer from **p and update **p past it and any trailing space
+ */
+int NextInt (const char **p, int def_val)
+{
+    while (**p && isspace(**p)) (*p)++;
+
+    if (**p && isdigit (**p))
+    {
+        def_val = atoi (*p);
+        while (**p && isdigit (**p)) (*p)++;
+        while (**p && isspace(**p)) (*p)++;
+    }
+    return def_val;
+}
+
+int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
+                    PSTR szCmdLine, int iCmdShow)
+{
+    static char szAppName[] = "drawtext 1.0" ;
+    HWND        hwnd ;
+    MSG         msg ;
+    WNDCLASSEX  wndclass ;
+
+    {
+        int i;
+        for (i=32; i--;) {modify_noted[i] = 0; modify_noted_c[i] = 0;}
+    }
+
+    log = fopen ("drawtext.log","w");
+    if (!log) exit(1);
+
+    if (! (helpmode = (szCmdLine[0] == '?')))
+    {
+        const char *pCmd = szCmdLine;
+
+        page_settings = NextInt (&pCmd, 0);
+        tab_setting = NextInt (&pCmd, 8);
+        left_margin = NextInt (&pCmd, 0);
+        right_margin = NextInt (&pCmd, 0);
+
+        pCmd= strchr (pCmd, '\"');
+        if (pCmd)
+        {
+            char *paText = argText;
+
+            pCmd++;
+            while (*pCmd && *pCmd != '\"')
+            {
+                if (paText - argText >= countof (argText) -1) exit (2);
+                if (*pCmd == '\\')
+                {
+                    pCmd++;
+                    *paText = (*pCmd == 'n') ? '\n' :
+                              (*pCmd == 'r') ? '\r' :
+                              (*pCmd == 't') ? '\t' :
+                              (*pCmd == '\"') ? '\"' :
+                              (*pCmd == '\'') ? '\'' :
+                              (*pCmd == '\\') ? '\\' :
+                              *pCmd;
+                    pCmd++; paText++;
+                }
+                else
+                    *paText++ = *pCmd++;
+            }
+            *paText = '\0';
+            pText = argText;
+        }
+        else
+        {
+            pText = NULL;
+        }
+    }
+
+    wndclass.cbSize        = sizeof (wndclass) ;
+    wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
+    wndclass.lpfnWndProc   = WndProc ;
+    wndclass.cbClsExtra    = 0 ;
+    wndclass.cbWndExtra    = 0 ;
+    wndclass.hInstance     = hInstance ;
+    wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
+    wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
+    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
+    wndclass.lpszMenuName  = NULL ;
+    wndclass.lpszClassName = szAppName ;
+    wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;
+
+    RegisterClassEx (&wndclass) ;
+
+    hwnd = CreateWindow (szAppName,         // window class name
+                    "The drawtext Program V1.0",     // window caption
+                    WS_OVERLAPPEDWINDOW,     // window style
+                    CW_USEDEFAULT,           // initial x position
+                    CW_USEDEFAULT,           // initial y position
+                    CW_USEDEFAULT,           // initial x size
+                    CW_USEDEFAULT,           // initial y size
+                    NULL,                    // parent window handle
+                    NULL,                    // window menu handle
+                    hInstance,               // program instance handle
+                    NULL) ;                     // creation parameters
+
+    ShowWindow (hwnd, iCmdShow) ;
+    UpdateWindow (hwnd) ;
+
+    while (GetMessage (&msg, NULL, 0, 0))
+    {
+        TranslateMessage (&msg) ;
+        DispatchMessage (&msg) ;
+    }
+    return msg.wParam ;
+}
+
+LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
+{
+     HDC         hdc ;
+     PAINTSTRUCT ps ;
+     RECT        rect ;
+     static CHAR str1 [] = "Hello To Everyone\n OutThere, Wine!";
+     int row, column, settings;
+     static char helptext [] = 
+"drawtext [n [t [l [r]]]] [\"text\"]\n"
+"will call DrawTextEx with the 32 patterns of DT_EDITCONTROL, DT_WORDBREAK,"
+" DT_NOCLIP, DT_WORD_ELLIPSIS and DT_END_ELLIPSIS combined with the settings"
+" defined by n.  For example set n to 32 for DT_SINGLELINE, 1 for DT_CENTER"
+" etc. \n"
+"t, l and r are respectively the tab setting, left and right margins,\n"
+"You may add your own text within double quotes, using \\n, \\r, \\t, \\\","
+" \\' and \\\\ for newline, tab etc.\n"
+"Depending on the state of the Wine argument processing you may need to escape"
+" the first and last \" and accept that you will get a trailing \" displayed.\n"
+"If the settings include DT_CALCRECT then the dimensions will be displayed"
+" in a column to the right and the text will then be displayed without the"
+" DT_CALCRECT.\n"
+"Certain log messages may be written to drawtext.log, especially if"
+" DT_MODIFYSTRING is specified."
+;
+     DRAWTEXTPARAMS dtp;
+     char TmpText [countof(argText)]; /* in case DT_MODIFYSTRING is used */
+
+     switch (iMsg)
+          {
+          case WM_PAINT :
+               hdc = BeginPaint (hwnd, &ps) ;
+
+               if (helpmode)
+               {
+                   GetClientRect (hwnd, &rect);
+                   DrawText (hdc, helptext, -1, &rect,
+                             DT_EDITCONTROL | DT_WORDBREAK);
+               }
+               else
+               {
+
+               TextOut (hdc, 0, 0, "drawtext ? for help", 19);
+               TextOut (hdc, 400, 0, "DT_EDITCONTROL", 14);
+               TextOut (hdc, 200, 15, "DT_WORDBREAK", 12);
+               TextOut (hdc, 500, 15, "DT_WORDBREAK", 12);
+               TextOut (hdc, 0,  40, "------",6);
+               TextOut (hdc, 0, 104, "----ee",6);
+               TextOut (hdc, 0, 168, "--we--",6);
+               TextOut (hdc, 0, 232, "--weee",6);
+               TextOut (hdc, 0, 316, "nc----",6);
+               TextOut (hdc, 0, 360, "nc--ee",6);
+               TextOut (hdc, 0, 424, "ncwe--",6);
+               TextOut (hdc, 0, 488, "ncweee",6);
+
+               if (widen_chars) SetTextCharacterExtra (hdc, 5);
+               SetBkColor (hdc, RGB (0,0,255));
+               SetTextColor (hdc, RGB (255,255,255));
+               dtp.cbSize = sizeof (dtp);
+               dtp.iTabLength = tab_setting;
+               dtp.iLeftMargin = left_margin;
+               dtp.iRightMargin = right_margin;
+               for (settings = 0; settings < 32; settings++)
+               {
+                   row = settings % 8; column = settings / 8;
+
+                   SetRect (&rect,  50 + 150*column, 40 + 64 * row,
+                                   150 + 150*column, 72 + 64 * row); 
+
+                   strcpy (TmpText, pText ? pText : str1);
+                   DrawTextEx (hdc, TmpText, -1, &rect,
+                               (column / 2 ? DT_EDITCONTROL : 0) |
+                               (column % 2 ? DT_WORDBREAK : 0) |
+                               (row / 4 ? DT_NOCLIP : 0) |
+                               ((row / 2) % 2 ? DT_WORD_ELLIPSIS : 0) |
+                               (row % 2 ? DT_END_ELLIPSIS : 0) |
+                               page_settings,
+                               &dtp); 
+                   if (!modify_noted[settings] &&
+                       strcmp (TmpText, pText ? pText : str1) != 0)
+                   {
+                       const char *pWhen;
+                       modify_noted[settings] = 1;
+                       if (page_settings & DT_CALCRECT)
+                           pWhen = "during calcrect";
+                       else
+                           pWhen = "during display";
+                       fprintf (log, "Modified %s on setting %d to %s\n",
+                                pWhen, settings, TmpText);
+                   }
+                   if (page_settings & DT_CALCRECT)
+                   {
+                       char buf[12];
+                       sprintf (buf, "%4.dx%4.d", rect.right - rect.left, rect.bottom - rect.top);
+                       TextOut (hdc, 600, 40+64*row+16*column, buf, strlen(buf));
+                       if (reset_rect)
+                           SetRect (&rect,  50 + 150*column, 40 + 64 * row,
+                                           150 + 150*column, 72 + 64 * row); 
+                       if (reset_text) strcpy (TmpText, pText ? pText : str1);
+                       DrawTextEx (hdc, TmpText, -1, &rect, (
+                                   (column / 2 ? DT_EDITCONTROL : 0) |
+                                   (column % 2 ? DT_WORDBREAK : 0) |
+                                   (row / 4 ? DT_NOCLIP : 0) |
+                                   ((row / 2) % 2 ? DT_WORD_ELLIPSIS : 0) |
+                                   (row % 2 ? DT_END_ELLIPSIS : 0) |
+                                   page_settings) & ~DT_CALCRECT,
+                                   &dtp); 
+                       if (!modify_noted_c[settings] &&
+                           strcmp (TmpText, pText ? pText : str1) != 0)
+                       {
+                           modify_noted_c[settings] = 1;
+                           fprintf (log, "Modified during display on setting %d to %s\n",
+                                    settings, TmpText);
+                       }
+                   }
+               }
+               }
+
+               EndPaint (hwnd, &ps) ;
+               return 0 ;
+
+          case WM_DESTROY :
+               PostQuitMessage (0) ;
+               return 0 ;
+          }
+
+     return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
+}


More information about the wine-patches mailing list