Author: tkreuzer
Date: Wed May 2 02:04:47 2007
New Revision: 26619
URL:
http://svn.reactos.org/svn/reactos?rev=26619&view=rev
Log:
Extpen implementation:
- give GDI_OBJECT_TYPE_EXTPEN a sizeof(GDIBRUSHOBJ) and EXTPEN_Cleanup function in
GDI_OBJ_INFO table
- define PENOBJ_AllocExtPen, PENOBJ_FreeExtPen, PENOBJ_LockExtPen needed by
IntGdiExtCreatePen
- create A Tag for extpen for tagged pool that holds style dwords
- implement IntGdiExtCreatePen
- implement EXTPEN_Cleanup, freeing the stylebuffer
- implement NtGdiExtCreatePen
- make CreateStockObjects, NtGdiCreatePen(Indirect) call IntGdiExtCreatePen
- remove IntGdiCreatePenIndirect
Modified:
trunk/reactos/subsystems/win32/win32k/include/intgdi.h
trunk/reactos/subsystems/win32/win32k/include/pen.h
trunk/reactos/subsystems/win32/win32k/include/tags.h
trunk/reactos/subsystems/win32/win32k/objects/gdiobj.c
trunk/reactos/subsystems/win32/win32k/objects/pen.c
trunk/reactos/subsystems/win32/win32k/objects/stockobj.c
trunk/reactos/subsystems/win32/win32k/stubs/stubs.c
trunk/reactos/subsystems/win32/win32k/win32k.rbuild
Modified: trunk/reactos/subsystems/win32/win32k/include/intgdi.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/in…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/intgdi.h (original)
+++ trunk/reactos/subsystems/win32/win32k/include/intgdi.h Wed May 2 02:04:47 2007
@@ -49,8 +49,8 @@
/* Pen functions */
-HPEN FASTCALL
-IntGdiCreatePenIndirect(PLOGPEN lgpn);
+HPEN STDCALL
+IntGdiExtCreatePen(DWORD, DWORD, IN ULONG, IN ULONG, IN ULONG_PTR, IN ULONG_PTR, DWORD,
PULONG, IN ULONG, IN BOOL, IN OPTIONAL HBRUSH);
VOID FASTCALL
IntGdiSetSolidPenColor(HPEN hPen, COLORREF Color);
Modified: trunk/reactos/subsystems/win32/win32k/include/pen.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/in…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/pen.h (original)
+++ trunk/reactos/subsystems/win32/win32k/include/pen.h Wed May 2 02:04:47 2007
@@ -9,8 +9,12 @@
#define PENOBJ_AllocPen() ((HPEN)GDIOBJ_AllocObj(GdiHandleTable, GDI_OBJECT_TYPE_PEN))
#define PENOBJ_FreePen(hBMObj) GDIOBJ_FreeObj(GdiHandleTable, (HGDIOBJ) hBMObj,
GDI_OBJECT_TYPE_PEN)
#define PENOBJ_LockPen(hBMObj) ((PGDIBRUSHOBJ)GDIOBJ_LockObj(GdiHandleTable, (HGDIOBJ)
hBMObj, GDI_OBJECT_TYPE_PEN))
+#define PENOBJ_AllocExtPen() ((HPEN)GDIOBJ_AllocObj(GdiHandleTable,
GDI_OBJECT_TYPE_EXTPEN))
+#define PENOBJ_FreeExtPen(hBMObj) GDIOBJ_FreeObj(GdiHandleTable, (HGDIOBJ) hBMObj,
GDI_OBJECT_TYPE_EXTPEN)
+#define PENOBJ_LockExtPen(hBMObj) ((PGDIBRUSHOBJ)GDIOBJ_LockObj(GdiHandleTable, (HGDIOBJ)
hBMObj, GDI_OBJECT_TYPE_EXTPEN))
#define PENOBJ_UnlockPen(pPenObj) GDIOBJ_UnlockObjByPtr(GdiHandleTable, pPenObj)
INT STDCALL PEN_GetObject(PGDIBRUSHOBJ hPen, INT Count, PLOGPEN Buffer);
+BOOL INTERNAL_CALL EXTPEN_Cleanup(PVOID ObjectBody);
#endif
Modified: trunk/reactos/subsystems/win32/win32k/include/tags.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/in…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/tags.h (original)
+++ trunk/reactos/subsystems/win32/win32k/include/tags.h Wed May 2 02:04:47 2007
@@ -43,6 +43,7 @@
#define TAG_PRINT TAG('P', 'R', 'N', 'T') /* print */
#define TAG_REGION TAG('R', 'G', 'N', 'O') /* region */
#define TAG_GDITEXT TAG('T', 'X', 'T', 'O') /* text */
+#define TAG_EXTPEN TAG('X', 'P', 'E', 'N') /* extpen */
/* Eng objects */
#define TAG_CLIPOBJ TAG('C', 'L', 'P', 'O') /* clip
object */
Modified: trunk/reactos/subsystems/win32/win32k/objects/gdiobj.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ob…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/gdiobj.c (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/gdiobj.c Wed May 2 02:04:47 2007
@@ -80,7 +80,7 @@
{GDI_OBJECT_TYPE_DCE, sizeof(DCE), DCE_Cleanup},
{GDI_OBJECT_TYPE_DIRECTDRAW, sizeof(DD_DIRECTDRAW), DD_Cleanup},
{GDI_OBJECT_TYPE_DD_SURFACE, sizeof(DD_SURFACE), DDSURF_Cleanup},
- {GDI_OBJECT_TYPE_EXTPEN, 0, GDI_CleanupDummy},
+ {GDI_OBJECT_TYPE_EXTPEN, sizeof(GDIBRUSHOBJ), EXTPEN_Cleanup},
{GDI_OBJECT_TYPE_METADC, 0, GDI_CleanupDummy},
{GDI_OBJECT_TYPE_METAFILE, 0, GDI_CleanupDummy},
{GDI_OBJECT_TYPE_ENHMETAFILE, 0, GDI_CleanupDummy},
Modified: trunk/reactos/subsystems/win32/win32k/objects/pen.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ob…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/pen.c (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/pen.c Wed May 2 02:04:47 2007
@@ -27,19 +27,37 @@
/* PRIVATE FUNCTIONS **********************************************************/
-HPEN FASTCALL
-IntGdiCreatePenIndirect(PLOGPEN LogPen)
+HPEN STDCALL
+IntGdiExtCreatePen(
+ DWORD dwPenStyle,
+ DWORD dwWidth,
+ IN ULONG ulBrushStyle,
+ IN ULONG ulColor,
+ IN ULONG_PTR ulClientHatch,
+ IN ULONG_PTR ulHatch,
+ DWORD dwStyleCount,
+ PULONG pStyle,
+ IN ULONG cjDIB,
+ IN BOOL bOldStylePen,
+ IN OPTIONAL HBRUSH hbrush)
{
HPEN hPen;
PGDIBRUSHOBJ PenObject;
- static const WORD wPatternAlternate[] = {0x5555};
- static const WORD wPatternDash[] = {0x0F0F};
- static const WORD wPatternDot[] = {0x3333};
-
- if (LogPen->lopnStyle > PS_INSIDEFRAME)
- return 0;
-
- hPen = PENOBJ_AllocPen();
+ static const BYTE PatternAlternate[] = {0x55, 0x55, 0x55};
+ static const BYTE PatternDash[] = {0xFF, 0xFF, 0xC0};
+ static const BYTE PatternDot[] = {0xE3, 0x8E, 0x38};
+ static const BYTE PatternDashDot[] = {0xFF, 0x81, 0xC0};
+ static const BYTE PatternDashDotDot[] = {0xFF, 0x8E, 0x38};
+
+ if (bOldStylePen)
+ {
+ hPen = PENOBJ_AllocPen();
+ }
+ else
+ {
+ hPen = PENOBJ_AllocExtPen();
+ }
+
if (!hPen)
{
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
@@ -47,13 +65,29 @@
return 0;
}
- PenObject = PENOBJ_LockPen(hPen);
+ if (bOldStylePen)
+ {
+ PenObject = PENOBJ_LockPen(hPen);
+ }
+ else
+ {
+ PenObject = PENOBJ_LockExtPen(hPen);
+ }
/* FIXME - Handle PenObject == NULL!!! */
- PenObject->ptPenWidth = LogPen->lopnWidth;
- PenObject->ulPenStyle = LogPen->lopnStyle;
- PenObject->BrushAttr.lbColor = LogPen->lopnColor;
- PenObject->flAttrs = GDIBRUSH_IS_OLDSTYLEPEN;
- switch (LogPen->lopnStyle)
+
+ PenObject->ptPenWidth.x = dwWidth;
+ PenObject->ptPenWidth.y = 0;
+ PenObject->ulPenStyle = dwPenStyle;
+ PenObject->BrushAttr.lbColor = ulColor;
+ PenObject->ulStyle = ulBrushStyle;
+ // FIXME: copy the bitmap first ?
+ PenObject->hbmClient = (HANDLE)ulClientHatch;
+ PenObject->dwStyleCount = dwStyleCount;
+ PenObject->pStyle = pStyle;
+
+ PenObject->flAttrs = bOldStylePen? GDIBRUSH_IS_OLDSTYLEPEN : GDIBRUSH_IS_PEN;
+
+ switch (dwPenStyle & PS_STYLE_MASK)
{
case PS_NULL:
PenObject->flAttrs |= GDIBRUSH_IS_NULL;
@@ -65,17 +99,27 @@
case PS_ALTERNATE:
PenObject->flAttrs |= GDIBRUSH_IS_BITMAP;
- PenObject->hbmPattern = NtGdiCreateBitmap(8, 1, 1, 1,
(LPBYTE)wPatternAlternate);
+ PenObject->hbmPattern = NtGdiCreateBitmap(24, 1, 1, 1,
(LPBYTE)PatternAlternate);
break;
case PS_DOT:
PenObject->flAttrs |= GDIBRUSH_IS_BITMAP;
- PenObject->hbmPattern = NtGdiCreateBitmap(8, 1, 1, 1, (LPBYTE)wPatternDot);
+ PenObject->hbmPattern = NtGdiCreateBitmap(24, 1, 1, 1, (LPBYTE)PatternDot);
break;
case PS_DASH:
PenObject->flAttrs |= GDIBRUSH_IS_BITMAP;
- PenObject->hbmPattern = NtGdiCreateBitmap(8, 1, 1, 1, (LPBYTE)wPatternDash);
+ PenObject->hbmPattern = NtGdiCreateBitmap(24, 1, 1, 1, (LPBYTE)PatternDash);
+ break;
+
+ case PS_DASHDOT:
+ PenObject->flAttrs |= GDIBRUSH_IS_BITMAP;
+ PenObject->hbmPattern = NtGdiCreateBitmap(24, 1, 1, 1,
(LPBYTE)PatternDashDot);
+ break;
+
+ case PS_DASHDOTDOT:
+ PenObject->flAttrs |= GDIBRUSH_IS_BITMAP;
+ PenObject->hbmPattern = NtGdiCreateBitmap(24, 1, 1, 1,
(LPBYTE)PatternDashDotDot);
break;
case PS_INSIDEFRAME:
@@ -83,34 +127,91 @@
PenObject->flAttrs |= GDIBRUSH_IS_SOLID;
break;
+ case PS_USERSTYLE:
+ /* FIXME: what style here? */
+ PenObject->flAttrs |= 0;
+ break;
+
default:
- DPRINT1("FIXME: IntGdiCreatePenIndirect is UNIMPLEMENTED pen
%x\n",LogPen->lopnStyle);
- }
-
+ DPRINT1("IntGdiExtCreatePen unknown penstyle %x\n", dwPenStyle);
+ }
PENOBJ_UnlockPen(PenObject);
return hPen;
}
+VOID FASTCALL
+IntGdiSetSolidPenColor(HPEN hPen, COLORREF Color)
+{
+ PGDIBRUSHOBJ PenObject;
+
+ PenObject = PENOBJ_LockPen(hPen);
+ if (PenObject)
+ {
+ if (PenObject->flAttrs & GDIBRUSH_IS_SOLID)
+ {
+ PenObject->BrushAttr.lbColor = Color & 0xFFFFFF;
+ }
+ PENOBJ_UnlockPen(PenObject);
+ }
+}
+
INT STDCALL
-PEN_GetObject(PGDIBRUSHOBJ PenObject, INT Count, PLOGPEN Buffer)
-{
-
- LOGPEN LogPen;
-
- if( Buffer == NULL ) return sizeof(LOGPEN);
- if (Count < sizeof(LOGPEN)) return 0;
- if (Count > sizeof(LOGPEN)) Count = sizeof(LOGPEN);
-
- if( Buffer == NULL ) return sizeof(LOGPEN);
-
- LogPen.lopnWidth = PenObject->ptPenWidth;
- LogPen.lopnStyle = PenObject->ulPenStyle;
- LogPen.lopnColor = PenObject->BrushAttr.lbColor;
- memcpy(Buffer, &LogPen, Count);
-
- return Count;
-
+PEN_GetObject(PGDIBRUSHOBJ pPenObject, INT cbCount, PLOGPEN pBuffer)
+{
+ PLOGPEN pLogPen;
+ PEXTLOGPEN pExtLogPen;
+ INT cbRetCount;
+
+ if (pPenObject->flAttrs & GDIBRUSH_IS_OLDSTYLEPEN)
+ {
+ cbRetCount = sizeof(LOGPEN);
+ if (pBuffer)
+ {
+ if (cbCount < cbRetCount) return 0;
+ pLogPen = (PLOGPEN)pBuffer;
+ pLogPen->lopnWidth = pPenObject->ptPenWidth;
+ pLogPen->lopnStyle = pPenObject->ulPenStyle;
+ pLogPen->lopnColor = pPenObject->BrushAttr.lbColor;
+ }
+ }
+ else
+ {
+ // FIXME: Can we trust in dwStyleCount being <= 16?
+ cbRetCount = sizeof(EXTLOGPEN) - sizeof(DWORD) + pPenObject->dwStyleCount *
sizeof(DWORD);
+ if (pBuffer)
+ {
+ INT i;
+
+ if (cbCount < cbRetCount) return 0;
+ pExtLogPen = (PEXTLOGPEN)pBuffer;
+ pExtLogPen->elpPenStyle = pPenObject->ulPenStyle;
+ pExtLogPen->elpWidth = pPenObject->ptPenWidth.x;
+ pExtLogPen->elpBrushStyle = pPenObject->ulStyle;
+ pExtLogPen->elpColor = pPenObject->BrushAttr.lbColor;
+ pExtLogPen->elpHatch = (ULONG_PTR)pPenObject->hbmClient;
+ pExtLogPen->elpNumEntries = pPenObject->dwStyleCount;
+ for (i = 0; i < pExtLogPen->elpNumEntries; i++)
+ {
+ pExtLogPen->elpStyleEntry[i] = pPenObject->pStyle[i];
+ }
+ }
+ }
+
+ return cbRetCount;
+}
+
+BOOL INTERNAL_CALL
+EXTPEN_Cleanup(PVOID ObjectBody)
+{
+ PGDIBRUSHOBJ pPenObject = (PGDIBRUSHOBJ)ObjectBody;
+
+ /* Free the kmode Styles array */
+ if (pPenObject->pStyle)
+ {
+ ExFreePool(pPenObject->pStyle);
+ }
+ return TRUE;
}
/* PUBLIC FUNCTIONS ***********************************************************/
@@ -122,20 +223,28 @@
COLORREF Color,
IN HBRUSH hbr)
{
- LOGPEN LogPen;
-
- LogPen.lopnStyle = PenStyle;
- LogPen.lopnWidth.x = Width;
- LogPen.lopnWidth.y = 0;
- LogPen.lopnColor = Color;
-
- return IntGdiCreatePenIndirect(&LogPen);
+ if (PenStyle > PS_INSIDEFRAME)
+ {
+ PenStyle = PS_SOLID;
+ }
+
+ return IntGdiExtCreatePen(PenStyle,
+ Width,
+ BS_SOLID,
+ Color,
+ 0,
+ 0,
+ 0,
+ NULL,
+ 0,
+ TRUE,
+ 0);
}
HPEN STDCALL
NtGdiCreatePenIndirect(CONST PLOGPEN LogPen)
{
- LOGPEN SafeLogPen;
+ LOGPEN SafeLogPen = {0};
NTSTATUS Status = STATUS_SUCCESS;
_SEH_TRY
@@ -157,46 +266,89 @@
return 0;
}
- return IntGdiCreatePenIndirect(&SafeLogPen);
+ return IntGdiExtCreatePen(SafeLogPen.lopnStyle,
+ SafeLogPen.lopnWidth.x,
+ BS_SOLID,
+ SafeLogPen.lopnColor,
+ 0,
+ 0,
+ 0,
+ NULL,
+ 0,
+ TRUE,
+ 0);
}
HPEN STDCALL
NtGdiExtCreatePen(
- DWORD PenStyle,
- DWORD Width,
- IN ULONG iBrushStyle,
+ DWORD dwPenStyle,
+ DWORD ulWidth,
+ IN ULONG ulBrushStyle,
IN ULONG ulColor,
- IN ULONG_PTR lClientHatch,
- IN ULONG_PTR lHatch,
- DWORD StyleCount,
- PULONG Style,
+ IN ULONG_PTR ulClientHatch,
+ IN ULONG_PTR ulHatch,
+ DWORD dwStyleCount,
+ PULONG pUnsafeStyle,
IN ULONG cjDIB,
IN BOOL bOldStylePen,
- IN OPTIONAL HBRUSH hbrush)
-{
- LOGPEN LogPen;
-
- if (PenStyle & PS_USERSTYLE)
- PenStyle = (PenStyle & ~PS_STYLE_MASK) | PS_SOLID;
-
- LogPen.lopnStyle = PenStyle & PS_STYLE_MASK;
- LogPen.lopnWidth.x = Width;
- LogPen.lopnColor = ulColor;
-
- return IntGdiCreatePenIndirect(&LogPen);
-}
-
-VOID FASTCALL
-IntGdiSetSolidPenColor(HPEN hPen, COLORREF Color)
-{
- PGDIBRUSHOBJ PenObject;
-
- PenObject = PENOBJ_LockPen(hPen);
- if (PenObject->flAttrs & GDIBRUSH_IS_SOLID)
- {
- PenObject->BrushAttr.lbColor = Color & 0xFFFFFF;
- }
- PENOBJ_UnlockPen(PenObject);
-}
+ IN OPTIONAL HBRUSH hBrush)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ DWORD* pSafeStyle = NULL;
+ HPEN hPen;
+
+ if (dwStyleCount > 16)
+ {
+ return 0;
+ }
+
+ if (dwStyleCount > 0)
+ {
+ pSafeStyle = ExAllocatePoolWithTag(NonPagedPool, dwStyleCount * sizeof(DWORD),
TAG_EXTPEN);
+ if (!pSafeStyle)
+ {
+ SetLastNtError(ERROR_NOT_ENOUGH_MEMORY);
+ return 0;
+ }
+ _SEH_TRY
+ {
+ ProbeForRead(pUnsafeStyle, dwStyleCount * sizeof(DWORD), 1);
+ RtlCopyMemory(pSafeStyle,
+ pUnsafeStyle,
+ dwStyleCount * sizeof(DWORD));
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END
+ if(!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
+ ExFreePool(pSafeStyle);
+ return 0;
+ }
+ }
+
+ hPen = IntGdiExtCreatePen(dwPenStyle,
+ ulWidth,
+ ulBrushStyle,
+ ulColor,
+ ulClientHatch,
+ ulHatch,
+ dwStyleCount,
+ pSafeStyle,
+ cjDIB,
+ bOldStylePen,
+ hBrush);
+
+ if ((!hPen) && (pSafeStyle))
+ {
+ ExFreePool(pSafeStyle);
+ }
+
+ return hPen;
+}
+
/* EOF */
Modified: trunk/reactos/subsystems/win32/win32k/objects/stockobj.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ob…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/stockobj.c (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/stockobj.c Wed May 2 02:04:47 2007
@@ -130,9 +130,9 @@
StockObjects[BLACK_BRUSH] = IntGdiCreateSolidBrush(RGB(0,0,0));
StockObjects[NULL_BRUSH] = IntGdiCreateNullBrush();
- StockObjects[WHITE_PEN] = IntGdiCreatePenIndirect(&WhitePen);
- StockObjects[BLACK_PEN] = IntGdiCreatePenIndirect(&BlackPen);
- StockObjects[NULL_PEN] = IntGdiCreatePenIndirect(&NullPen);
+ StockObjects[WHITE_PEN] = IntGdiExtCreatePen(WhitePen.lopnStyle, WhitePen.lopnWidth.x,
BS_SOLID, WhitePen.lopnColor, 0, 0, 0, NULL, 0, TRUE, NULL);
+ StockObjects[BLACK_PEN] = IntGdiExtCreatePen(BlackPen.lopnStyle, BlackPen.lopnWidth.x,
BS_SOLID, BlackPen.lopnColor, 0, 0, 0, NULL, 0, TRUE, NULL);
+ StockObjects[NULL_PEN] = IntGdiExtCreatePen(NullPen.lopnStyle, NullPen.lopnWidth.x,
BS_SOLID, NullPen.lopnColor, 0, 0, 0, NULL, 0, TRUE, NULL);
(void) TextIntCreateFontIndirect(&OEMFixedFont,
(HFONT*)&StockObjects[OEM_FIXED_FONT]);
(void) TextIntCreateFontIndirect(&AnsiFixedFont,
(HFONT*)&StockObjects[ANSI_FIXED_FONT]);
@@ -296,7 +296,7 @@
if(SysColorPens[i] == NULL)
{
Pen.lopnColor = SysColors[i];
- SysColorPens[i] = IntGdiCreatePenIndirect(&Pen);
+ SysColorPens[i] = IntGdiExtCreatePen(Pen.lopnStyle, Pen.lopnWidth.x, BS_SOLID,
Pen.lopnColor, 0, 0, 0, NULL, 0, TRUE, NULL);
if(SysColorPens[i] != NULL)
{
GDIOBJ_ConvertToStockObj(GdiHandleTable, (HGDIOBJ*)&SysColorPens[i]);
Modified: trunk/reactos/subsystems/win32/win32k/stubs/stubs.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/st…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/stubs/stubs.c (original)
+++ trunk/reactos/subsystems/win32/win32k/stubs/stubs.c Wed May 2 02:04:47 2007
@@ -60,6 +60,7 @@
return EngUnmapFontFileFD ( iFile );
}
+#if 0
/*
* @unimplemented
*/
@@ -82,6 +83,7 @@
UNIMPLEMENTED;
return FALSE;
}
+#endif
/*
* @unimplemented
Modified: trunk/reactos/subsystems/win32/win32k/win32k.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/wi…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/win32k.rbuild (original)
+++ trunk/reactos/subsystems/win32/win32k/win32k.rbuild Wed May 2 02:04:47 2007
@@ -65,6 +65,7 @@
<file>semaphor.c</file>
<file>sort.c</file>
<file>surface.c</file>
+ <file>engtext.c</file>
<file>transblt.c</file>
<file>engwindow.c</file>
<file>xlate.c</file>