Author: tkreuzer
Date: Fri May 20 19:04:57 2011
New Revision: 51828

URL: http://svn.reactos.org/svn/reactos?rev=51828&view=rev
Log:
[GDI FONT DRIVER]
- Due to the ret^Z^Z^Z unfavourable behaviour of FT_Get_Advances to return 
either font units or fractional pixels without a way to distinguish, use 
FT_Get_Advances only for the fast case (in this case we always get font units) 
und implement the slow version seperately.
- fast version is if 0ed, since conversion is missing yet
- If used in Windows, the driver now provides proper metrics
- set lNonLinearExtLeading and lNonLinearIntLeading to 0x80000000, this seems 
to be some default value, needs more investigation

Modified:
    branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/glyph.c
    branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.c

Modified: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/glyph.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/glyph.c?rev=51828&r1=51827&r2=51828&view=diff
==============================================================================
--- branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/glyph.c 
[iso-8859-1] (original)
+++ branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/glyph.c 
[iso-8859-1] Fri May 20 19:04:57 2011
@@ -150,7 +150,7 @@
      * space to device space. Since we use FT_Set_Char_Size, which allows
      * higher precision than FT_Set_Pixel_Sizes, we need to convert into
      * points. So we multiply our scaling coefficients with 72 divided by
-     * the device resolution. We also need a 26.4 fixpoint value, so we
+     * the device resolution. We also need a 26.6 fixpoint value, so we
      * multiply with 64. */
     FLOATOBJ_MulLong(&efScaleX, 64 * pface->ifiex.ifi.fwdUnitsPerEm * 72);
     FLOATOBJ_DivLong(&efScaleX, pfo->sizLogResPpi.cx);
@@ -176,7 +176,7 @@
     /* Check if there is rotation / skewing (cannot use iComplexity!?) */
     if (!FLOATOBJ_bIsNull(&fxform.eM12) || !FLOATOBJ_bIsNull(&fxform.eM21))
     {
-        __debugbreak();
+        //__debugbreak();
 
         /* Create a transformation matrix that is applied after the character
          * scaling. We simply use the normalized base vectors and convert them
@@ -330,8 +330,8 @@
         /* Copy the quantized matrix from the font structure */
         pfddm->fdxQuantized = pfont->fdxQuantized;
 
-        pfddm->lNonLinearExtLeading =   0x00000000;
-        pfddm->lNonLinearIntLeading =   0x00000080; // FIXME
+        pfddm->lNonLinearExtLeading =   0x80000000;
+        pfddm->lNonLinearIntLeading =   0x80000000; // FIXME
         pfddm->lNonLinearMaxCharWidth = 0x80000000;
         pfddm->lNonLinearAvgCharWidth = 0x80000000;
 
@@ -341,7 +341,8 @@
     }
 
     TRACE("pfddm->fxMaxAscender=%ld, yScale=%ld, height=%ld\n",
-          pfddm->fxMaxAscender, pfont->sizlScale.cy, 
(pfont->sizlScale.cy+32)/64);
+          pfddm->fxMaxAscender, pfont->sizlScale.cy,
+          (pfont->sizlScale.cy+32)/64);
 //__debugbreak();
 
     /* Return the size of the structure */
@@ -686,28 +687,53 @@
 
     //TRACE("FtfdQueryAdvanceWidths\n");
 
-    // FIXME: layout horizontal/vertical
-    fl = (iMode == QAW_GETEASYWIDTHS) ? FT_ADVANCE_FLAG_FAST_ONLY : 0;
-//      | (ftface->face_flags & FT_FACE_FLAG_VERTICAL) ? 
FT_LOAD_VERTICAL_LAYOUT : 0;
-fl = 0;
-
-    /* Loop all requested glyphs */
-    for (i = 0; i < cGlyphs; i++)
-    {
-        /* Query advance width */
-        fterror = FT_Get_Advance(ftface, (FT_UInt)phg[i], fl, &advance);
-        if (fterror || advance > 0x0FFFF000)
+    /* The selected glyph will be changed */
+    pfont->hgSelected = -1;
+
+    /* Check if fast version is requested */
+    if (0 && iMode == QAW_GETEASYWIDTHS)
+    {
+        fl = FT_ADVANCE_FLAG_FAST_ONLY;
+
+        /* Check if the font layout is vertical */
+        if (ftface->face_flags & FT_FACE_FLAG_VERTICAL)
         {
-            WARN("Failed to query advance width hg=%lx, fl=0x%lx\n",
-                     phg[i], fl);
-            pusWidths[i] = 0xffff;
-            bResult = FALSE;
+            fl |= FT_LOAD_VERTICAL_LAYOUT;
         }
-        else
+
+        /* Loop all requested glyphs */
+        for (i = 0; i < cGlyphs; i++)
         {
-            /* Transform from 16.16 points to 28.4 pixels */
-            pusWidths[i] = (USHORT)((advance * 72 / pfo->sizLogResPpi.cx) >> 
12);
-            //TRACE("Got advance width: hg=%lx, adv=%lx->%ld\n", phg[i], 
advance, pt.x);
+            /* Query advance width */
+            fterror = FT_Get_Advances(ftface, (FT_UInt)phg[i], 1, fl, 
&advance);
+            if (fterror || advance > 0xFFFF)
+            {
+                pusWidths[i] = 0xffff;
+                bResult = FALSE;
+            }
+            else
+            {
+                pusWidths[i] = (USHORT)(advance >> 2);
+                //TRACE("Got advance width: hg=%lx, adv=%lx->%ld\n", phg[i], 
advance, pt.x);
+            }
+        }
+    }
+    else
+    {
+        /* Loop all requested glyphs */
+        for (i = 0; i < cGlyphs; i++)
+        {
+            /* Load the glyph */
+            fterror = FT_Load_Glyph(ftface, (FT_UInt)phg[i], 0);
+            if (fterror)
+            {
+                pusWidths[i] = 0xffff;
+                bResult = FALSE; // FIXME: return FALSE or DDI_ERROR?
+            }
+            else
+            {
+                pusWidths[i] = (USHORT)ftface->glyph->advance.x >> 2;
+            }
         }
     }
 

Modified: branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.c?rev=51828&r1=51827&r2=51828&view=diff
==============================================================================
--- branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.c 
[iso-8859-1] (original)
+++ branches/GSoC_2011/GdiFontDriver/drivers/video/font/ftfd/tttables.c 
[iso-8859-1] Fri May 20 19:04:57 2011
@@ -273,11 +273,13 @@
     FD_KERNINGPAIR *pkp2)
 {
     ULONG ul1, ul2;
+
+    /* Calculate the values for the 2 kerning pairs */
     ul1 = pkp1->wcFirst + 65536 * pkp1->wcSecond;
     ul2 = pkp2->wcFirst + 65536 * pkp2->wcSecond;
-    if (ul1 < ul2) return -1;
-    if (ul1 > ul2) return 1;
-    return 0;
+
+    /* Return the comparison result */
+    return (ul1 < ul2) ? -1 : ((ul1 > ul2) ? 1 : 0);
 }
 
 
@@ -314,7 +316,6 @@
     nTables = GETW(&pKernTable->nTables);
     ulLastAddress = (ULONG_PTR)pKernTable + cjSize;
 
-
     /* Loop all subtables */
     pSubTable = &pKernTable->subtable;
     for (i = 0; i < nTables; i++)
@@ -322,7 +323,7 @@
         /* Check if the subtable is accessible */
         if ((ULONG_PTR)pSubTable + sizeof(TT_KERNING_SUBTABLE) > ulLastAddress)
         {
-            __debugbreak();
+            WARN("kern table outside the file\n");
             return;
         }
 
@@ -330,7 +331,7 @@
         cjSize = GETW(&pSubTable->usLength);
         if ((ULONG_PTR)pSubTable + cjSize > ulLastAddress)
         {
-            __debugbreak();
+            WARN("kern table exceeds size of the file\n");
             return;
         }
 
@@ -341,7 +342,7 @@
             cPairs += GETW(&pSubTable->format0.nPairs);
             if ((ULONG_PTR)&pSubTable->format0.akernpair[cPairs] > 
ulLastAddress)
             {
-                __debugbreak();
+                WARN("Number of kerning pairs too large for table size\n");
                 return;
             }
         }


Reply via email to