Fix glyph width access on win32 to not depend on the UChar.
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 May 2006 20:31:53 +0000 (20:31 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 May 2006 20:31:53 +0000 (20:31 +0000)
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@14541 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/bindings/scripts/CodeGeneratorJS.pm
WebCore/platform/Font.cpp
WebCore/platform/FontData.cpp
WebCore/platform/FontData.h
WebCore/platform/mac/FontDataMac.mm
WebCore/platform/win/FontDataWin.cpp

index 3bbe7299c80ce6231d2d372b1ed8c307cc4270e1..bd31d37c77ac48fa91e14285c18a7dffd446c4d4 100644 (file)
@@ -1,3 +1,25 @@
+2006-05-23  Dave Hyatt <hyatt@apple.com>
+
+        Fix the JS autogeneration for WebCore so that the hashtables
+        are correct on Win32.
+
+        Switch to using GetCharWidthI so that we can obtain widths
+        for glyphs instead of having to obtain them from UChars.
+
+        Reviewed by eric (autogeneration) and maciej (fonts)
+
+        * bindings/scripts/CodeGeneratorJS.pm:
+        * platform/Font.cpp:
+        (WebCore::WidthIterator::advance):
+        * platform/FontData.cpp:
+        (WebCore::m_smallCapsFontData):
+        (WebCore::FontData::widthForGlyph):
+        * platform/FontData.h:
+        * platform/mac/FontDataMac.mm:
+        (-[NSFont WebCore]):
+        * platform/win/FontDataWin.cpp:
+        (WebCore::FontData::platformWidthForGlyph):
+
 2006-05-23  Levi Weintraub  <lweintraub@apple.com>
 
         Reviewed by Hyatt.
index 101c8ba6f5829bbf720ec8a112776f5dee17b7a8..d2907c4c0803fb4d1fadd3f508cb45479f3583d1 100644 (file)
@@ -75,6 +75,11 @@ sub finish
   $object->WriteData();
 }
 
+sub leftShift($$) {
+    my ($value, $distance) = @_;
+    return (($value << $distance) & 0xFFFFFFFF);
+}
+
 # Params: 'domClass' struct
 sub GenerateInterface
 {
@@ -1209,8 +1214,8 @@ sub GenerateHashValue
   # Main loop
   for (; $l > 0; $l--) {
     $hash   += ord($chars[$s]);
-    my $tmp = (ord($chars[$s+1]) << 11) ^ $hash;
-    $hash   = (($hash << 16)% $EXP2_32) ^ $tmp;
+    my $tmp = leftShift(ord($chars[$s+1]), 11) ^ $hash;
+    $hash   = (leftShift($hash, 16)% $EXP2_32) ^ $tmp;
     $s += 2;
     $hash += $hash >> 11;
   }
@@ -1218,18 +1223,18 @@ sub GenerateHashValue
   # Handle end case
   if ($rem !=0) {
     $hash += ord($chars[$s]);
-    $hash ^= (($hash << 11)% $EXP2_32);
+    $hash ^= (leftShift($hash, 11)% $EXP2_32);
     $hash += $hash >> 17;
   }
 
   # Force "avalanching" of final 127 bits
-  $hash ^= ($hash << 3);
+  $hash ^= leftShift($hash, 3);
   $hash += ($hash >> 5);
   $hash = ($hash% $EXP2_32);
-  $hash ^= (($hash << 2)% $EXP2_32);
+  $hash ^= (leftShift($hash, 2)% $EXP2_32);
   $hash += ($hash >> 15);
   $hash = $hash% $EXP2_32;
-  $hash ^= (($hash << 10)% $EXP2_32);
+  $hash ^= (leftShift($hash, 10)% $EXP2_32);
   
   # this avoids ever returning a hash code of 0, since that is used to
   # signal "hash not computed yet", using a value that is likely to be
index 1731317f6abd2037d1d29a8fdd6412bbb1ca6b43..009a0ed0baad8a54d4e266c9f9f9ab15cfd75dca 100644 (file)
@@ -206,7 +206,7 @@ void WidthIterator::advance(int offset, GlyphBuffer* glyphBuffer)
         if (c == '\t' && m_style.tabWidth())
             width = m_style.tabWidth() - fmodf(m_style.xPos() + runWidthSoFar, m_style.tabWidth());
         else {
-            width = fontData->widthForGlyph(glyph, c);
+            width = fontData->widthForGlyph(glyph);
             // We special case spaces in two ways when applying word rounding.
             // First, we round spaces to an adjusted width in all fonts.
             // Second, in fixed-pitch fonts we ensure that all characters that
index 99cded5c74d3a55be3db987b0639a0bb67b20a46..2c3bd9fe8004e0e3164b6a1a6f46159e5956408a 100644 (file)
@@ -46,7 +46,7 @@ FontData::FontData(const FontPlatformData& f)
     // If the font is monospace or fake monospace we ceil to ensure that 
     // every character and the space are the same width.  Otherwise we round.
     m_spaceGlyph = m_characterToGlyphMap.glyphDataForCharacter(' ', this).glyph;
-    float width = widthForGlyph(m_spaceGlyph, ' ');
+    float width = widthForGlyph(m_spaceGlyph);
     m_spaceWidth = width;
     determinePitch();
     m_adjustedSpaceWidth = m_treatAsFixedPitch ? ceilf(width) : roundf(width);
@@ -60,13 +60,13 @@ FontData::~FontData()
     // it will be deleted then, so we don't need to do anything here.
 }
 
-float FontData::widthForGlyph(Glyph glyph, UChar c) const
+float FontData::widthForGlyph(Glyph glyph) const
 {
     float width = m_glyphToWidthMap.widthForGlyph(glyph);
     if (width != cGlyphWidthUnknown)
         return width;
     
-    width = platformWidthForGlyph(glyph, c);
+    width = platformWidthForGlyph(glyph);
     m_glyphToWidthMap.setWidthForGlyph(glyph, width);
     
     return width;
index fffdc006e52c11b0d73a252b880c01f4cd304eb1..9057bcc27b9ca49f30c0425dcb92eb868467c749 100644 (file)
@@ -58,8 +58,8 @@ public:
     int lineGap() const { return m_lineGap; }
     float xHeight() const { return m_xHeight; }
 
-    float widthForGlyph(Glyph glyph, UChar c) const;
-    float platformWidthForGlyph(Glyph glyph, UChar c) const;
+    float widthForGlyph(Glyph) const;
+    float platformWidthForGlyph(Glyph) const;
 
     bool containsCharacters(const UChar* characters, int length) const;
 
index cec860d325fc64b537e40aa1061a8f71238b0bb3..9d1e3106fca6dc98457c62e0b502f04c6e62d49e 100644 (file)
@@ -303,7 +303,7 @@ void FontData::determinePitch()
           ![name caseInsensitiveCompare:@"MS-PGothic"] == NSOrderedSame;
 }
 
-float FontData::platformWidthForGlyph(Glyph glyph, UChar) const
+float FontData::platformWidthForGlyph(Glyph glyph) const
 {
     NSFont *font = m_font.font;
     float pointSize = [font pointSize];
index 24ecdf1db7235552f83eac43e2cd50c3b7f4ed71..77d24d4be1984e7292c66d649f5fc2a73eb23abd 100755 (executable)
@@ -111,7 +111,7 @@ void FontData::determinePitch()
     ReleaseDC(0, dc);
 }
 
-float FontData::platformWidthForGlyph(Glyph, UChar c) const
+float FontData::platformWidthForGlyph(Glyph glyph) const
 {
     HDC dc = GetDC(0);
     SaveDC(dc);
@@ -119,15 +119,9 @@ float FontData::platformWidthForGlyph(Glyph, UChar c) const
     cairo_scaled_font_t* scaledFont = m_font.scaledFont();
     cairo_win32_scaled_font_select_font(scaledFont, dc);
 
-    // Get the width of the character.
     int width;
-    GCP_RESULTS results;
-    memset(&results, 0, sizeof(GCP_RESULTS));
-    results.lStructSize = sizeof(GCP_RESULTS);
-    results.nGlyphs = 1;
-    results.lpDx = &width;
-    GetCharacterPlacement(dc, &c, 1, 0, &results, 0);\r
-    \r
+    GetCharWidthI(dc, glyph, 1, 0, &width);\r
+\r
     cairo_win32_scaled_font_done_font(scaledFont);
 
     RestoreDC(dc, -1);