Author: jimtabor
Date: Mon Jan 4 21:44:48 2010
New Revision: 44932
URL:
http://svn.reactos.org/svn/reactos?rev=44932&view=rev
Log:
- Sorry I thought I turn the debug off.region.c
Modified:
trunk/reactos/subsystems/win32/win32k/objects/font.c
trunk/reactos/subsystems/win32/win32k/objects/region.c
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] Mon Jan 4 21:44:48
2010
@@ -75,7 +75,19 @@
return Count;
}
-
+/*
+
+ It is recommended that an application use the GetFontLanguageInfo function
+ to determine whether the GCP_DIACRITIC, GCP_DBCS, GCP_USEKERNING, GCP_LIGATE,
+ GCP_REORDER, GCP_GLYPHSHAPE, and GCP_KASHIDA values are valid for the
+ currently selected font. If not valid, GetCharacterPlacement ignores the
+ value.
+
+ M$ must use a preset "compiled in" support for each language based releases.
+ ReactOS uses FreeType, this will need to be supported. ATM this is hard coded
+ for GCPCLASS_LATIN!
+
+ */
DWORD
FASTCALL
GreGetCharacterPlacementW(
@@ -86,7 +98,14 @@
LPGCP_RESULTSW pgcpw,
DWORD dwFlags)
{
+ GCP_RESULTSW gcpwSave;
+ UINT i, nSet, cSet;
+// INT *lpDx, *tmpDxCaretPos;
+ INT *tmpDxCaretPos;
+ LONG Cx;
SIZE Size = {0,0};
+
+ DPRINT1("GreGCPW Start\n");
if (!pgcpw)
{
@@ -94,8 +113,170 @@
return MAKELONG(Size.cx, Size.cy);
return 0;
}
- UNIMPLEMENTED;
- return 0;
+
+ RtlCopyMemory(&gcpwSave, pgcpw, sizeof(GCP_RESULTSW));
+
+ cSet = nSet = nCount;
+
+ if ( nCount > gcpwSave.nGlyphs ) cSet = gcpwSave.nGlyphs;
+
+ /* GCP_JUSTIFY may only be used in conjunction with GCP_MAXEXTENT. */
+ if ( dwFlags & GCP_JUSTIFY) dwFlags |= GCP_MAXEXTENT;
+
+ if ( !gcpwSave.lpDx && gcpwSave.lpCaretPos )
+ tmpDxCaretPos = gcpwSave.lpCaretPos;
+ else
+ tmpDxCaretPos = gcpwSave.lpDx;
+
+ if ( !GreGetTextExtentExW( hdc,
+ pwsz,
+ cSet,
+ nMaxExtent,
+ ((dwFlags & GCP_MAXEXTENT) ? (PULONG) &cSet : NULL),
+ (PULONG) tmpDxCaretPos,
+ &Size,
+ 0) )
+ {
+ return 0;
+ }
+
+ nSet = cSet;
+
+ if ( tmpDxCaretPos && nSet > 0)
+ {
+// lpDx = tmpDxCaretPos + 4 * nSet - 4;
+// lpDx = tmpDxCaretPos[nSet - 1];
+/* while ( lpDx > tmpDxCaretPos )
+ {
+ *lpDx -= *lpDx - 4;
+ lpDx -= 4;
+ }*/
+ for (i = (nSet - 1); i > 0; i--)
+ {
+ tmpDxCaretPos[i] -= tmpDxCaretPos[i - 1];
+ }
+ }
+
+ if ( !(dwFlags & GCP_MAXEXTENT) || nSet )
+ {
+ if ( (dwFlags & GCP_USEKERNING) &&
+ ( gcpwSave.lpDx ||
+ gcpwSave.lpCaretPos ) &&
+ nSet >= 2 )
+ {
+ DWORD Count;
+ LPKERNINGPAIR pKP;
+
+ Count = GreGetKerningPairs( hdc, 0, NULL);
+ if (Count)
+ {
+ pKP = ExAllocatePoolWithTag(PagedPool, Count * sizeof(KERNINGPAIR),
GDITAG_TEXT);
+ if (pKP)
+ {
+ if ( GreGetKerningPairs( hdc, Count, pKP) != Count)
+ {
+ ExFreePoolWithTag( pKP, GDITAG_TEXT);
+ return 0;
+ }
+
+ if ( (ULONG_PTR)(pKP) < ((ULONG_PTR)(pKP) + (ULONG_PTR)(Count *
sizeof(KERNINGPAIR))) )
+ {
+ DPRINT1("We Need to Do Something HERE!\n");
+ }
+
+ ExFreePoolWithTag( pKP, GDITAG_TEXT);
+
+ if ( dwFlags & GCP_MAXEXTENT )
+ {
+// Cx = Size.cx;
+ if ( Size.cx > nMaxExtent )
+ {
+// lpDx = tmpDxCaretPos + 4 * nSet - 4;
+// lpDx = tmpDxCaretPos[nSet - 1];
+/*
+ while ( 1 )
+ {
+ if ( !nSet ) break;
+
+ Cx -= *lpDx;
+ --nSet;
+ lpDx -= 4;
+
+ Size.cx = Cx;
+
+ if ( Cx <= nMaxExtent ) break;
+ }*/
+ for (Cx = Size.cx; nSet > 0; nSet--)
+ {
+ Cx -= tmpDxCaretPos[nSet - 1];
+ Size.cx = Cx;
+ if ( Cx <= nMaxExtent ) break;
+ }
+ }
+ if ( !nSet )
+ {
+ pgcpw->nGlyphs = 0;
+ pgcpw->nMaxFit = 0;
+ return 0;
+ }
+ }
+ }
+ }
+ }
+
+ if ( (dwFlags & GCP_JUSTIFY) &&
+ ( gcpwSave.lpDx ||
+ gcpwSave.lpCaretPos ) &&
+ nSet )
+ {
+ DPRINT1("We Need to Do Something HERE 2!\n");
+ }
+
+ if ( gcpwSave.lpDx && gcpwSave.lpCaretPos )
+ RtlCopyMemory( gcpwSave.lpCaretPos, gcpwSave.lpDx, nSet * sizeof(LONG));
+
+ if ( gcpwSave.lpCaretPos )
+ {
+ int pos = 0;
+ i = 0;
+ if ( nSet > 0 )
+ {
+ do
+ {
+ Cx = gcpwSave.lpCaretPos[i];
+ gcpwSave.lpCaretPos[i] = pos;
+ pos += Cx;
+ ++i;
+ }
+ while ( i < nSet );
+ }
+ }
+
+ if ( gcpwSave.lpOutString )
+ RtlCopyMemory(gcpwSave.lpOutString, pwsz, nSet * sizeof(WCHAR));
+
+ if ( gcpwSave.lpClass )
+ RtlFillMemory(gcpwSave.lpClass, nSet, GCPCLASS_LATIN);
+
+ if ( gcpwSave.lpOrder )
+ {
+ for (i = 0; i < nSet; i++)
+ gcpwSave.lpOrder[i] = i;
+ }
+
+ if ( gcpwSave.lpGlyphs )
+ {
+ if ( GreGetGlyphIndicesW( hdc, pwsz, nSet, gcpwSave.lpGlyphs, 0, 0) == GDI_ERROR
)
+ {
+ nSet = 0;
+ Size.cx = 0;
+ Size.cy = 0;
+ }
+ }
+ pgcpw->nGlyphs = nSet;
+ pgcpw->nMaxFit = nSet;
+ }
+ return MAKELONG(Size.cx, Size.cy);
}
INT
@@ -313,8 +494,12 @@
IN OUT LPGCP_RESULTSW pgcpw,
IN DWORD dwFlags)
{
- UNIMPLEMENTED;
- return 0;
+ return GreGetCharacterPlacementW( hdc,
+ pwsz,
+ nCount,
+ nMaxExtent,
+ pgcpw,
+ dwFlags);
}
DWORD
Modified: trunk/reactos/subsystems/win32/win32k/objects/region.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ob…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/region.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/region.c [iso-8859-1] Mon Jan 4
21:44:48 2010
@@ -2525,7 +2525,7 @@
}
else
{
- DPRINT1("SetRectRgn NULL Count: %d \n", rgn->rdh.nCount);
+ DPRINT("SetRectRgn NULL Count: %d \n", rgn->rdh.nCount);
EMPTY_REGION(rgn);
}
}