Author: jimtabor
Date: Tue Nov 4 06:49:49 2008
New Revision: 37185
URL:
http://svn.reactos.org/svn/reactos?rev=37185&view=rev
Log:
- Fix code page and charector set support. More miscellaneous changes and fixes.
Modified:
trunk/reactos/dll/win32/gdi32/objects/font.c
trunk/reactos/include/psdk/wingdi.h
trunk/reactos/include/reactos/win32k/ntgdityp.h
trunk/reactos/subsystems/win32/win32k/include/text.h
trunk/reactos/subsystems/win32/win32k/objects/dc.c
trunk/reactos/subsystems/win32/win32k/objects/font.c
trunk/reactos/subsystems/win32/win32k/objects/freetype.c
trunk/reactos/subsystems/win32/win32k/objects/text.c
trunk/reactos/subsystems/win32/win32k/stubs/stubs.c
Modified: trunk/reactos/dll/win32/gdi32/objects/font.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdi32/objects/fo…
==============================================================================
--- trunk/reactos/dll/win32/gdi32/objects/font.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/gdi32/objects/font.c [iso-8859-1] Tue Nov 4 06:49:49 2008
@@ -16,46 +16,45 @@
/*
* For TranslateCharsetInfo
*/
-#define FS(x) {{0,0,0,0},{0x1<<(x),0}}
#define MAXTCIINDEX 32
static const CHARSETINFO FONT_tci[MAXTCIINDEX] = {
/* ANSI */
- { ANSI_CHARSET, 1252, FS(0)},
- { EASTEUROPE_CHARSET, 1250, FS(1)},
- { RUSSIAN_CHARSET, 1251, FS(2)},
- { GREEK_CHARSET, 1253, FS(3)},
- { TURKISH_CHARSET, 1254, FS(4)},
- { HEBREW_CHARSET, 1255, FS(5)},
- { ARABIC_CHARSET, 1256, FS(6)},
- { BALTIC_CHARSET, 1257, FS(7)},
- { VIETNAMESE_CHARSET, 1258, FS(8)},
+ { ANSI_CHARSET, 1252, {{0,0,0,0},{FS_LATIN1,0}} },
+ { EASTEUROPE_CHARSET, 1250, {{0,0,0,0},{FS_LATIN2,0}} },
+ { RUSSIAN_CHARSET, 1251, {{0,0,0,0},{FS_CYRILLIC,0}} },
+ { GREEK_CHARSET, 1253, {{0,0,0,0},{FS_GREEK,0}} },
+ { TURKISH_CHARSET, 1254, {{0,0,0,0},{FS_TURKISH,0}} },
+ { HEBREW_CHARSET, 1255, {{0,0,0,0},{FS_HEBREW,0}} },
+ { ARABIC_CHARSET, 1256, {{0,0,0,0},{FS_ARABIC,0}} },
+ { BALTIC_CHARSET, 1257, {{0,0,0,0},{FS_BALTIC,0}} },
+ { VIETNAMESE_CHARSET, 1258, {{0,0,0,0},{FS_VIETNAMESE,0}} },
/* reserved by ANSI */
- { DEFAULT_CHARSET, 0, FS(0)},
- { DEFAULT_CHARSET, 0, FS(0)},
- { DEFAULT_CHARSET, 0, FS(0)},
- { DEFAULT_CHARSET, 0, FS(0)},
- { DEFAULT_CHARSET, 0, FS(0)},
- { DEFAULT_CHARSET, 0, FS(0)},
- { DEFAULT_CHARSET, 0, FS(0)},
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
/* ANSI and OEM */
- { THAI_CHARSET, 874, FS(16)},
- { SHIFTJIS_CHARSET, 932, FS(17)},
- { GB2312_CHARSET, 936, FS(18)},
- { HANGEUL_CHARSET, 949, FS(19)},
- { CHINESEBIG5_CHARSET, 950, FS(20)},
- { JOHAB_CHARSET, 1361, FS(21)},
+ { THAI_CHARSET, 874, {{0,0,0,0},{FS_THAI,0}} },
+ { SHIFTJIS_CHARSET, 932, {{0,0,0,0},{FS_JISJAPAN,0}} },
+ { GB2312_CHARSET, 936, {{0,0,0,0},{FS_CHINESESIMP,0}} },
+ { HANGEUL_CHARSET, 949, {{0,0,0,0},{FS_WANSUNG,0}} },
+ { CHINESEBIG5_CHARSET, 950, {{0,0,0,0},{FS_CHINESETRAD,0}} },
+ { JOHAB_CHARSET, 1361, {{0,0,0,0},{FS_JOHAB,0}} },
/* reserved for alternate ANSI and OEM */
- { DEFAULT_CHARSET, 0, FS(0)},
- { DEFAULT_CHARSET, 0, FS(0)},
- { DEFAULT_CHARSET, 0, FS(0)},
- { DEFAULT_CHARSET, 0, FS(0)},
- { DEFAULT_CHARSET, 0, FS(0)},
- { DEFAULT_CHARSET, 0, FS(0)},
- { DEFAULT_CHARSET, 0, FS(0)},
- { DEFAULT_CHARSET, 0, FS(0)},
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
/* reserved for system */
- { DEFAULT_CHARSET, 0, FS(0)},
- { SYMBOL_CHARSET, CP_SYMBOL, FS(31)},
+ { DEFAULT_CHARSET, 0, {{0,0,0,0},{FS_LATIN1,0}} },
+ { SYMBOL_CHARSET, CP_SYMBOL, {{0,0,0,0},{FS_SYMBOL,0}} }
};
#define INITIAL_FAMILY_COUNT 64
Modified: trunk/reactos/include/psdk/wingdi.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/psdk/wingdi.h?rev=…
==============================================================================
--- trunk/reactos/include/psdk/wingdi.h [iso-8859-1] (original)
+++ trunk/reactos/include/psdk/wingdi.h [iso-8859-1] Tue Nov 4 06:49:49 2008
@@ -503,6 +503,7 @@
#define FS_HEBREW 32
#define FS_ARABIC 64
#define FS_BALTIC 128
+#define FS_VIETNAMESE 256
#define FS_THAI 0x10000
#define FS_JISJAPAN 0x20000
#define FS_CHINESESIMP 0x40000
Modified: trunk/reactos/include/reactos/win32k/ntgdityp.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/win32k/ntg…
==============================================================================
--- trunk/reactos/include/reactos/win32k/ntgdityp.h [iso-8859-1] (original)
+++ trunk/reactos/include/reactos/win32k/ntgdityp.h [iso-8859-1] Tue Nov 4 06:49:49 2008
@@ -389,6 +389,8 @@
FLOAT f;
ULONG l;
} gxf_long;
+
+#define CFONT_REALIZATION 0x0080
typedef struct _CFONT
{
Modified: trunk/reactos/subsystems/win32/win32k/include/text.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/in…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/text.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/text.h [iso-8859-1] Tue Nov 4 06:49:49
2008
@@ -96,9 +96,8 @@
INT FASTCALL IntGetOutlineTextMetrics(PFONTGDI,UINT,OUTLINETEXTMETRICW *);
BOOL FASTCALL ftGdiGetRasterizerCaps(LPRASTERIZER_STATUS);
BOOL FASTCALL
TextIntGetTextExtentPoint(PDC,PTEXTOBJ,LPCWSTR,int,int,LPINT,LPINT,LPSIZE);
-DWORD FASTCALL IntGdiGetCharSet(HDC);
BOOL FASTCALL ftGdiGetTextMetricsW(HDC,PTMW_INTERNAL);
-DWORD FASTCALL ftGetFontLanguageInfo(PDC);
+DWORD FASTCALL IntGetFontLanguageInfo(PDC);
INT FASTCALL ftGdiGetTextCharsetInfo(PDC,PFONTSIGNATURE,DWORD);
DWORD FASTCALL ftGetFontUnicodeRanges(PFONTGDI, PGLYPHSET);
DWORD FASTCALL ftGdiGetFontData(PFONTGDI,DWORD,DWORD,PVOID,DWORD);
Modified: trunk/reactos/subsystems/win32/win32k/objects/dc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ob…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/dc.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/dc.c [iso-8859-1] Tue Nov 4 06:49:49
2008
@@ -849,6 +849,8 @@
NewDC->erclWindow.bottom = ((PGDIDEVICE)NewDC->pPDev)->GDIInfo.ulVertRes;
NewDC->DcLevel.flPath &= ~DCPATH_CLOCKWISE; // Default is CCW.
+ nDc_Attr->iCS_CP = ftGdiGetTextCharsetInfo(NewDC,NULL,0);
+
DC_UnlockDc( NewDC );
hVisRgn = NtGdiCreateRectRgn(0, 0,
((PGDIDEVICE)NewDC->pPDev)->GDIInfo.ulHorzRes,
@@ -877,7 +879,6 @@
NewDC->DC_Type = DC_TYPE_INFO;
DC_UnlockDc( NewDC );
}
- nDc_Attr->iCS_CP = IntGdiGetCharSet(hNewDC);
return hNewDC;
}
@@ -2413,7 +2414,7 @@
case GdiGetEMFRestorDc:
break;
case GdiGetFontLanguageInfo:
- SafeResult = ftGetFontLanguageInfo(dc);
+ SafeResult = IntGetFontLanguageInfo(dc);
break;
case GdiGetIsMemDc:
SafeResult = dc->DC_Type;
Modified: trunk/reactos/subsystems/win32/win32k/objects/font.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ob…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/font.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/font.c [iso-8859-1] Tue Nov 4 06:49:49
2008
@@ -23,7 +23,6 @@
switch (Count)
{
-
case sizeof(ENUMLOGFONTEXDVW):
RtlCopyMemory( (LPENUMLOGFONTEXDVW) Buffer,
&TFont->logfont,
@@ -55,6 +54,58 @@
return Count;
}
+DWORD
+FASTCALL
+IntGetFontLanguageInfo(PDC Dc)
+{
+ PDC_ATTR Dc_Attr;
+ FONTSIGNATURE fontsig;
+ static const DWORD GCP_DBCS_MASK=0x003F0000,
+ GCP_DIACRITIC_MASK=0x00000000,
+ FLI_GLYPHS_MASK=0x00000000,
+ GCP_GLYPHSHAPE_MASK=0x00000040,
+ GCP_KASHIDA_MASK=0x00000000,
+ GCP_LIGATE_MASK=0x00000000,
+ GCP_USEKERNING_MASK=0x00000000,
+ GCP_REORDER_MASK=0x00000060;
+
+ DWORD result=0;
+
+ ftGdiGetTextCharsetInfo( Dc, &fontsig, 0 );
+
+ /* We detect each flag we return using a bitmask on the Codepage Bitfields */
+ if( (fontsig.fsCsb[0]&GCP_DBCS_MASK)!=0 )
+ result|=GCP_DBCS;
+
+ if( (fontsig.fsCsb[0]&GCP_DIACRITIC_MASK)!=0 )
+ result|=GCP_DIACRITIC;
+
+ if( (fontsig.fsCsb[0]&FLI_GLYPHS_MASK)!=0 )
+ result|=FLI_GLYPHS;
+
+ if( (fontsig.fsCsb[0]&GCP_GLYPHSHAPE_MASK)!=0 )
+ result|=GCP_GLYPHSHAPE;
+
+ if( (fontsig.fsCsb[0]&GCP_KASHIDA_MASK)!=0 )
+ result|=GCP_KASHIDA;
+
+ if( (fontsig.fsCsb[0]&GCP_LIGATE_MASK)!=0 )
+ result|=GCP_LIGATE;
+
+ if( (fontsig.fsCsb[0]&GCP_USEKERNING_MASK)!=0 )
+ result|=GCP_USEKERNING;
+
+ Dc_Attr = Dc->pDc_Attr;
+ if(!Dc_Attr) Dc_Attr = &Dc->Dc_Attr;
+
+ /* this might need a test for a HEBREW- or ARABIC_CHARSET as well */
+ if ( Dc_Attr->lTextAlign & TA_RTLREADING )
+ if( (fontsig.fsCsb[0]&GCP_REORDER_MASK)!=0 )
+ result|=GCP_REORDER;
+
+ return result;
+}
+
PTEXTOBJ
FASTCALL
RealizeFontInit(HFONT hFont)
@@ -114,14 +165,14 @@
Status = MmCopyFromCaller(SafeFileName.Buffer + 4, src, SafeFileName.MaximumLength - (4
* sizeof(WCHAR)));
if(!NT_SUCCESS(Status))
{
- ExFreePool(SafeFileName.Buffer);
+ ExFreePoolWithTag(SafeFileName.Buffer, TAG_STRING);
SetLastNtError(Status);
return 0;
}
Ret = IntGdiAddFontResource(&SafeFileName, (DWORD)fl);
- ExFreePool(SafeFileName.Buffer);
+ ExFreePoolWithTag(SafeFileName.Buffer, TAG_STRING);
return Ret;
}
@@ -223,8 +274,8 @@
}
FontGdi = ObjToGDI(TextObj->Font, FONT);
-
Size = ftGetFontUnicodeRanges( FontGdi, NULL);
+
if (Size && pgs)
{
pgsSafe = ExAllocatePoolWithTag(PagedPool, Size, TAG_GDITEXT);
@@ -376,48 +427,48 @@
NTSTATUS Status;
dc = DC_LockDc(hDC);
- if (dc == NULL)
- {
- SetLastWin32Error(ERROR_INVALID_HANDLE);
- return 0;
- }
+ if (!dc)
+ {
+ SetLastWin32Error(ERROR_INVALID_HANDLE);
+ return 0;
+ }
Dc_Attr = dc->pDc_Attr;
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
hFont = Dc_Attr->hlfntNew;
TextObj = RealizeFontInit(hFont);
DC_UnlockDc(dc);
- if (TextObj == NULL)
- {
- SetLastWin32Error(ERROR_INVALID_HANDLE);
- return 0;
- }
+ if (!TextObj)
+ {
+ SetLastWin32Error(ERROR_INVALID_HANDLE);
+ return 0;
+ }
FontGDI = ObjToGDI(TextObj->Font, FONT);
TEXTOBJ_UnlockText(TextObj);
Size = IntGetOutlineTextMetrics(FontGDI, 0, NULL);
if (!otm) return Size;
if (Size > Data)
- {
+ {
SetLastWin32Error(ERROR_INSUFFICIENT_BUFFER);
return 0;
- }
+ }
potm = ExAllocatePoolWithTag(PagedPool, Size, TAG_GDITEXT);
- if (NULL == potm)
- {
+ if (!potm)
+ {
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
return 0;
- }
+ }
IntGetOutlineTextMetrics(FontGDI, Size, potm);
if (otm)
- {
- Status = MmCopyToCaller(otm, potm, Size);
- if (! NT_SUCCESS(Status))
- {
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
- ExFreePool(potm);
- return 0;
- }
- }
- ExFreePool(potm);
+ {
+ Status = MmCopyToCaller(otm, potm, Size);
+ if (! NT_SUCCESS(Status))
+ {
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ ExFreePoolWithTag(potm,TAG_GDITEXT);
+ return 0;
+ }
+ }
+ ExFreePoolWithTag(potm,TAG_GDITEXT);
return Size;
}
@@ -486,7 +537,7 @@
{
SetLastNtError(Status);
/* Free the string buffer for the safe filename */
- ExFreePool(SafeFileNames.Buffer);
+
ExFreePoolWithTag(SafeFileNames.Buffer,TAG('R','T','S','U'));
return FALSE;
}
@@ -517,9 +568,77 @@
}
/* Free the string for the safe filenames */
- ExFreePool(SafeFileNames.Buffer);
+
ExFreePoolWithTag(SafeFileNames.Buffer,TAG('R','T','S','U'));
return bRet;
+}
+
+ /*
+ * @unimplemented
+ */
+BOOL
+APIENTRY
+NtGdiGetRealizationInfo(
+ IN HDC hdc,
+ OUT PREALIZATION_INFO pri,
+ IN HFONT hf)
+{
+ PDC pDc;
+ PTEXTOBJ pTextObj;
+ PFONTGDI pFontGdi;
+ BOOL Ret = FALSE;
+ INT i = 0;
+ REALIZATION_INFO ri;
+
+ pDc = DC_LockDc(hdc);
+ if (!pDc)
+ {
+ SetLastWin32Error(ERROR_INVALID_HANDLE);
+ return 0;
+ }
+ pTextObj = RealizeFontInit(hf);
+ pFontGdi = ObjToGDI(pTextObj->Font, FONT);
+ TEXTOBJ_UnlockText(pTextObj);
+ DC_UnlockDc(pDc);
+
+ Ret = ftGdiRealizationInfo(pFontGdi, &ri);
+ if (Ret)
+ {
+ if (pri)
+ {
+ NTSTATUS Status = STATUS_SUCCESS;
+ _SEH_TRY
+ {
+ ProbeForWrite(pri, sizeof(REALIZATION_INFO), 1);
+ RtlCopyMemory(pri, &ri, sizeof(REALIZATION_INFO));
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END
+
+ if(!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
+ return FALSE;
+ }
+ }
+ do
+ {
+ if (GdiHandleTable->cfPublic[i].hf == hf)
+ {
+ GdiHandleTable->cfPublic[i].iTechnology = ri.iTechnology;
+ GdiHandleTable->cfPublic[i].iUniq = ri.iUniq;
+ GdiHandleTable->cfPublic[i].dwUnknown = ri.dwUnknown;
+ GdiHandleTable->cfPublic[i].dwCFCount = GdiHandleTable->dwCFCount;
+ GdiHandleTable->cfPublic[i].fl |= CFONT_REALIZATION;
+ }
+ i++;
+ }
+ while ( i < GDI_CFONT_MAX );
+ }
+ return Ret;
}
HFONT
Modified: trunk/reactos/subsystems/win32/win32k/objects/freetype.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ob…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/freetype.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/freetype.c [iso-8859-1] Tue Nov 4
06:49:49 2008
@@ -50,6 +50,12 @@
#define NDEBUG
#include <debug.h>
+#ifndef FT_MAKE_TAG
+#define FT_MAKE_TAG( ch0, ch1, ch2, ch3 ) \
+ ( ((DWORD)(BYTE)(ch0) << 24) | ((DWORD)(BYTE)(ch1) << 16) | \
+ ((DWORD)(BYTE)(ch2) << 8) | (DWORD)(BYTE)(ch3) )
+#endif
+
FT_Library library;
typedef struct _FONT_ENTRY {
@@ -107,7 +113,6 @@
* For TranslateCharsetInfo
*/
#define CP_SYMBOL 42
-#define FS_VIETNAMESE 0x00000100L
#define MAXTCIINDEX 32
static const CHARSETINFO FontTci[MAXTCIINDEX] = {
/* ANSI */
@@ -381,7 +386,7 @@
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
return 0;
}
- memcpy(FontGDI->Filename, FileName->Buffer, FileName->Length);
+ RtlCopyMemory(FontGDI->Filename, FileName->Buffer, FileName->Length);
FontGDI->Filename[FileName->Length / sizeof(WCHAR)] = L'\0';
FontGDI->face = Face;
@@ -486,7 +491,7 @@
}
*NewFont = TextObj->BaseObject.hHmgr;
- memcpy(&TextObj->logfont.elfEnumLogfontEx.elfLogFont, lf, sizeof(LOGFONTW));
+ RtlCopyMemory(&TextObj->logfont.elfEnumLogfontEx.elfLogFont, lf,
sizeof(LOGFONTW));
if (lf->lfEscapement != lf->lfOrientation)
{
/* this should really depend on whether GM_ADVANCED is set */
@@ -547,10 +552,10 @@
return FALSE;
}
- if (MAXTCIINDEX <= Index || DEFAULT_CHARSET == FontTci[Index].ciCharset)
- {
- return FALSE;
- }
+ if (Index >= MAXTCIINDEX || DEFAULT_CHARSET == FontTci[Index].ciCharset)
+ {
+ return FALSE;
+ }
RtlCopyMemory(Cs, &FontTci[Index], sizeof(CHARSETINFO));
@@ -796,7 +801,7 @@
RtlCopyMemory(&Otm->otmTextMetrics, &FontGDI->TextMetric,
sizeof(TEXTMETRICW));
Otm->otmFiller = 0;
- memcpy(&Otm->otmPanoseNumber, pOS2->panose, PANOSE_COUNT);
+ RtlCopyMemory(&Otm->otmPanoseNumber, pOS2->panose, PANOSE_COUNT);
Otm->otmfsSelection = pOS2->fsSelection;
Otm->otmfsType = pOS2->fsType;
Otm->otmsCharSlopeRise = pHori->caret_Slope_Rise;
@@ -939,21 +944,21 @@
UNICODE_STRING StyleW;
TT_OS2 *pOS2;
FONTSIGNATURE fs;
- DWORD fs_fsCsb0;
CHARSETINFO CharSetInfo;
unsigned i, Size;
OUTLINETEXTMETRICW *Otm;
LOGFONTW *Lf;
TEXTMETRICW *TM;
NEWTEXTMETRICW *Ntm;
+ DWORD fs0;
RtlZeroMemory(Info, sizeof(FONTFAMILYINFO));
Size = IntGetOutlineTextMetrics(FontGDI, 0, NULL);
Otm = ExAllocatePoolWithTag(PagedPool, Size, TAG_GDITEXT);
- if (NULL == Otm)
- {
- return;
- }
+ if (!Otm)
+ {
+ return;
+ }
IntGetOutlineTextMetrics(FontGDI, Size, Otm);
Lf = &Info->EnumLogFontEx.elfLogFont;
@@ -991,14 +996,10 @@
Ntm->tmPitchAndFamily = TM->tmPitchAndFamily;
Ntm->tmCharSet = TM->tmCharSet;
Ntm->ntmFlags = TM->tmItalic ? NTM_ITALIC : 0;
- if (550 < TM->tmWeight)
- {
- Ntm->ntmFlags |= NTM_BOLD;
- }
- if (0 == Ntm->ntmFlags)
- {
- Ntm->ntmFlags = NTM_REGULAR;
- }
+
+ if (550 < TM->tmWeight) Ntm->ntmFlags |= NTM_BOLD;
+
+ if (0 == Ntm->ntmFlags) Ntm->ntmFlags = NTM_REGULAR;
Ntm->ntmSizeEM = Otm->otmEMSquare;
Ntm->ntmCellHeight = 0;
@@ -1006,10 +1007,9 @@
Info->FontType = (0 != (TM->tmPitchAndFamily & TMPF_TRUETYPE)
? TRUETYPE_FONTTYPE : 0);
+
if (0 == (TM->tmPitchAndFamily & TMPF_VECTOR))
- {
- Info->FontType |= RASTER_FONTTYPE;
- }
+ Info->FontType |= RASTER_FONTTYPE;
ExFreePool(Otm);
@@ -1026,76 +1026,64 @@
pOS2 = FT_Get_Sfnt_Table(FontGDI->face, ft_sfnt_os2);
IntUnLockFreeType;
if (NULL != pOS2)
- {
- Info->NewTextMetricEx.ntmFontSig.fsCsb[0] = pOS2->ulCodePageRange1;
- Info->NewTextMetricEx.ntmFontSig.fsCsb[1] = pOS2->ulCodePageRange2;
- Info->NewTextMetricEx.ntmFontSig.fsUsb[0] = pOS2->ulUnicodeRange1;
- Info->NewTextMetricEx.ntmFontSig.fsUsb[1] = pOS2->ulUnicodeRange2;
- Info->NewTextMetricEx.ntmFontSig.fsUsb[2] = pOS2->ulUnicodeRange3;
- Info->NewTextMetricEx.ntmFontSig.fsUsb[3] = pOS2->ulUnicodeRange4;
-
- fs_fsCsb0 = pOS2->ulCodePageRange1;
- if (0 == pOS2->version)
+ {
+ fs.fsCsb[0] = pOS2->ulCodePageRange1;
+ fs.fsCsb[1] = pOS2->ulCodePageRange2;
+ fs.fsUsb[0] = pOS2->ulUnicodeRange1;
+ fs.fsUsb[1] = pOS2->ulUnicodeRange2;
+ fs.fsUsb[2] = pOS2->ulUnicodeRange3;
+ fs.fsUsb[3] = pOS2->ulUnicodeRange4;
+
+ if (0 == pOS2->version)
+ {
+ FT_UInt Dummy;
+
+ if (FT_Get_First_Char(FontGDI->face, &Dummy) < 0x100)
+ fs.fsCsb[0] |= FS_LATIN1;
+ else
+ fs.fsCsb[0] |= FS_SYMBOL;
+ }
+ if (fs.fsCsb[0] == 0)
+ { /* let's see if we can find any interesting cmaps */
+ for (i = 0; i < FontGDI->face->num_charmaps; i++)
{
- FT_UInt Dummy;
-
- if (FT_Get_First_Char(FontGDI->face, &Dummy) < 0x100)
- {
- fs_fsCsb0 |= 1;
- }
- else
- {
- fs_fsCsb0 |= 1L << 31;
- }
+ switch (FontGDI->face->charmaps[i]->encoding)
+ {
+ case FT_ENCODING_UNICODE:
+ case FT_ENCODING_APPLE_ROMAN:
+ fs.fsCsb[0] |= FS_LATIN1;
+ break;
+ case FT_ENCODING_MS_SYMBOL:
+ fs.fsCsb[0] |= FS_SYMBOL;
+ break;
+ default:
+ break;
+ }
}
- if (0 == fs_fsCsb0)
- { /* let's see if we can find any interesting cmaps */
- for (i = 0; i < FontGDI->face->num_charmaps; i++)
- {
- switch (FontGDI->face->charmaps[i]->encoding)
- {
- case ft_encoding_unicode:
- case ft_encoding_apple_roman:
- fs_fsCsb0 |= 1;
- break;
- case ft_encoding_symbol:
- fs_fsCsb0 |= 1L << 31;
- break;
- default:
- break;
- }
- }
+ }
+ for (i = 0; i < MAXTCIINDEX; i++)
+ {
+ fs0 = 1L << i;
+ if (fs.fsCsb[0] & fs0)
+ {
+ if (!IntTranslateCharsetInfo(&fs0, &CharSetInfo, TCI_SRCFONTSIG))
+ {
+ CharSetInfo.ciCharset = DEFAULT_CHARSET;
+ }
+ if (DEFAULT_CHARSET != CharSetInfo.ciCharset)
+ {
+ Info->EnumLogFontEx.elfLogFont.lfCharSet = CharSetInfo.ciCharset;
+ if (NULL != ElfScripts[i])
+ wcscpy(Info->EnumLogFontEx.elfScript, ElfScripts[i]);
+ else
+ {
+ DPRINT1("Unknown elfscript for bit %d\n", i);
+ }
+ }
}
-
- for(i = 0; i < 32; i++)
- {
- if (0 != (fs_fsCsb0 & (1L << i)))
- {
- fs.fsCsb[0] = 1L << i;
- fs.fsCsb[1] = 0;
- if (! IntTranslateCharsetInfo(fs.fsCsb, &CharSetInfo, TCI_SRCFONTSIG))
- {
- CharSetInfo.ciCharset = DEFAULT_CHARSET;
- }
- if (31 == i)
- {
- CharSetInfo.ciCharset = SYMBOL_CHARSET;
- }
- if (DEFAULT_CHARSET != CharSetInfo.ciCharset)
- {
- Info->EnumLogFontEx.elfLogFont.lfCharSet = CharSetInfo.ciCharset;
- if (NULL != ElfScripts[i])
- {
- wcscpy(Info->EnumLogFontEx.elfScript, ElfScripts[i]);
- }
- else
- {
- DPRINT1("Unknown elfscript for bit %d\n", i);
- }
- }
- }
- }
- }
+ }
+ Info->NewTextMetricEx.ntmFontSig = fs;
+ }
}
static int FASTCALL
@@ -2203,35 +2191,6 @@
return TRUE;
}
-DWORD
-FASTCALL
-IntGdiGetCharSet(HDC hDC)
-{
- UINT cp = 0;
- CHARSETINFO csi;
- DWORD charset = NtGdiGetTextCharsetInfo(hDC,NULL,0);
- if (IntTranslateCharsetInfo(&charset, &csi, TCI_SRCCHARSET))
- cp = csi.ciACP;
- else
- {
- switch(charset)
- {
- case ANSI_CHARSET:
- break;
- case OEM_CHARSET:
- cp = 1;
- break;
- case DEFAULT_CHARSET:
- cp = 0;
- break;
- default:
- DPRINT1("Can't find codepage for charset %d\n", charset);
- break;
- }
- }
- DPRINT("charset %d => cp %d\n", charset, LOWORD(cp));
- return (MAKELONG(cp, charset));
-}
INT
FASTCALL
@@ -2249,19 +2208,20 @@
TT_OS2 *pOS2;
FT_Face Face;
CHARSETINFO csi;
- DWORD charset;
+ DWORD cp;
DWORD fs0;
+ USHORT usACP, usOEM;
Dc_Attr = Dc->pDc_Attr;
if(!Dc_Attr) Dc_Attr = &Dc->Dc_Attr;
hFont = Dc_Attr->hlfntNew;
TextObj = RealizeFontInit(hFont);
- if ( TextObj == NULL)
- {
- SetLastWin32Error(ERROR_INVALID_HANDLE);
- return Ret;
- }
+ if (!TextObj)
+ {
+ SetLastWin32Error(ERROR_INVALID_HANDLE);
+ return Ret;
+ }
FontGdi = ObjToGDI(TextObj->Font, FONT);
Face = FontGdi->face;
TEXTOBJ_UnlockText(TextObj);
@@ -2312,7 +2272,10 @@
RtlCopyMemory(lpSig, &fs, sizeof(FONTSIGNATURE));
}
- if (IntTranslateCharsetInfo(&charset, &csi, TCI_SRCCODEPAGE))
+ RtlGetDefaultCodePage(&usACP, &usOEM);
+ cp = usACP;
+
+ if (IntTranslateCharsetInfo(&cp, &csi, TCI_SRCCODEPAGE))
if (csi.fs.fsCsb[0] & fs.fsCsb[0])
{
DPRINT("Hit 1\n");
@@ -2333,12 +2296,12 @@
goto Exit;
}
else
- DPRINT("TCI failing on %x\n", fs0);
+ DPRINT1("TCI failing on %x\n", fs0);
}
}
Exit:
- DPRINT("CharSet %d CodePage %d\n",Ret, csi.ciACP);
- return Ret;
+ DPRINT("CharSet %d CodePage %d\n",csi.ciCharset, csi.ciACP);
+ return (MAKELONG(csi.ciACP, csi.ciCharset));
}
@@ -2409,59 +2372,6 @@
}
-DWORD
-FASTCALL
-ftGetFontLanguageInfo(PDC Dc)
-{
- PDC_ATTR Dc_Attr;
- FONTSIGNATURE fontsig;
- static const DWORD GCP_DBCS_MASK=0x003F0000,
- GCP_DIACRITIC_MASK=0x00000000,
- FLI_GLYPHS_MASK=0x00000000,
- GCP_GLYPHSHAPE_MASK=0x00000040,
- GCP_KASHIDA_MASK=0x00000000,
- GCP_LIGATE_MASK=0x00000000,
- GCP_USEKERNING_MASK=0x00000000,
- GCP_REORDER_MASK=0x00000060;
-
- DWORD result=0;
-
- ftGdiGetTextCharsetInfo( Dc, &fontsig, 0 );
-
- /* We detect each flag we return using a bitmask on the Codepage Bitfields */
- if( (fontsig.fsCsb[0]&GCP_DBCS_MASK)!=0 )
- result|=GCP_DBCS;
-
- if( (fontsig.fsCsb[0]&GCP_DIACRITIC_MASK)!=0 )
- result|=GCP_DIACRITIC;
-
- if( (fontsig.fsCsb[0]&FLI_GLYPHS_MASK)!=0 )
- result|=FLI_GLYPHS;
-
- if( (fontsig.fsCsb[0]&GCP_GLYPHSHAPE_MASK)!=0 )
- result|=GCP_GLYPHSHAPE;
-
- if( (fontsig.fsCsb[0]&GCP_KASHIDA_MASK)!=0 )
- result|=GCP_KASHIDA;
-
- if( (fontsig.fsCsb[0]&GCP_LIGATE_MASK)!=0 )
- result|=GCP_LIGATE;
-
- if( (fontsig.fsCsb[0]&GCP_USEKERNING_MASK)!=0 )
- result|=GCP_USEKERNING;
-
- Dc_Attr = Dc->pDc_Attr;
- if(!Dc_Attr) Dc_Attr = &Dc->Dc_Attr;
-
- /* this might need a test for a HEBREW- or ARABIC_CHARSET as well */
- if ( Dc_Attr->lTextAlign & TA_RTLREADING )
- if( (fontsig.fsCsb[0]&GCP_REORDER_MASK)!=0 )
- result|=GCP_REORDER;
-
- return result;
-}
-
-
BOOL
FASTCALL
ftGdiGetTextMetricsW(
@@ -2749,6 +2659,7 @@
IntFontType(PFONTGDI Font)
{
PS_FontInfoRec psfInfo;
+ FT_ULong tmp_size = 0;
if (FT_HAS_MULTIPLE_MASTERS(Font->face))
Font->FontObj.flFontType |= FO_MULTIPLEMASTER;
@@ -2765,6 +2676,11 @@
if (!FT_Get_PS_Font_Info(Font->face, &psfInfo ))
{
Font->FontObj.flFontType |= FO_POSTSCRIPT;
+ }
+ /* check for the presence of the 'CFF ' table to check if the font is Type1
*/
+ if (!FT_Load_Sfnt_Table(Font->face,
FT_MAKE_TAG('C','F','F',' '), 0, NULL, &tmp_size))
+ {
+ Font->FontObj.flFontType |= (FO_CFF|FO_POSTSCRIPT);
}
}
@@ -2979,14 +2895,14 @@
case 1: /* Copy the full font name */
Size = wcslen(Info.EnumLogFontEx.elfFullName) + 1;
Size = min(Size , LF_FULLFACESIZE) * sizeof(WCHAR);
- memcpy(pBuffer, Info.EnumLogFontEx.elfFullName, Size);
+ RtlCopyMemory(pBuffer, Info.EnumLogFontEx.elfFullName, Size);
// FIXME: Do we have to zeroterminate?
*pdwBytes = Size;
break;
case 2: /* Copy a LOGFONTW structure */
Info.EnumLogFontEx.elfLogFont.lfWidth = 0;
- memcpy(pBuffer, &Info.EnumLogFontEx.elfLogFont, sizeof(LOGFONTW));
+ RtlCopyMemory(pBuffer, &Info.EnumLogFontEx.elfLogFont,
sizeof(LOGFONTW));
*pdwBytes = sizeof(LOGFONTW);
break;
Modified: trunk/reactos/subsystems/win32/win32k/objects/text.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ob…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/text.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/text.c [iso-8859-1] Tue Nov 4 06:49:49
2008
@@ -21,7 +21,7 @@
{
PDC Dc;
PDC_ATTR Dc_Attr;
- DWORD cscp = IntGdiGetCharSet(hDC);
+ DWORD cscp;
// If here, update everything!
Dc = DC_LockDc(hDC);
if (!Dc)
@@ -29,6 +29,7 @@
SetLastWin32Error(ERROR_INVALID_HANDLE);
return 0;
}
+ cscp = ftGdiGetTextCharsetInfo(Dc,NULL,0);
Dc_Attr = Dc->pDc_Attr;
if (!Dc_Attr) Dc_Attr = &Dc->Dc_Attr;
Dc_Attr->iCS_CP = cscp;
@@ -96,10 +97,13 @@
if (!lpSig) pfsSafe = NULL;
- Ret = ftGdiGetTextCharsetInfo( Dc, pfsSafe, dwFlags);
+ Ret = HIWORD(ftGdiGetTextCharsetInfo( Dc, pfsSafe, dwFlags));
if (lpSig)
{
+ if (Ret == DEFAULT_CHARSET)
+ RtlZeroMemory(pfsSafe, sizeof(FONTSIGNATURE));
+
_SEH_TRY
{
ProbeForWrite( lpSig,
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 [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/stubs/stubs.c [iso-8859-1] Tue Nov 4 06:49:49
2008
@@ -2125,20 +2125,6 @@
*/
BOOL
APIENTRY
-NtGdiGetRealizationInfo(
- IN HDC hdc,
- OUT PREALIZATION_INFO pri,
- IN HFONT hf)
-{
- UNIMPLEMENTED;
- return FALSE;
-}
-
- /*
- * @unimplemented
- */
-BOOL
-APIENTRY
NtGdiDrawStream(
IN HDC hdcDst,
IN ULONG cjIn,