WebCore:
[WebKit-https.git] / WebCore / platform / graphics / win / UniscribeController.cpp
index 689f5ca2a5075f413b25eca8cfda90535f36f56f..849636922db5895847f27f90379f76826694ddd8 100644 (file)
@@ -101,6 +101,8 @@ void UniscribeController::advance(unsigned offset, GlyphBuffer* glyphBuffer)
     if (length <= 0)
         return;
 
+    unsigned baseCharacter = m_currentCharacter;
+
     // We break up itemization of the string by fontData and (if needed) the use of small caps.
 
     // FIXME: It's inconsistent that we use logical order when itemizing, since this
@@ -146,8 +148,9 @@ void UniscribeController::advance(unsigned offset, GlyphBuffer* glyphBuffer)
         }
 
         if (nextFontData != fontData || nextIsSmallCaps != isSmallCaps) {
-            int itemStart = m_run.rtl() ? index : indexOfFontTransition;
+            int itemStart = m_run.rtl() ? index + 1 : indexOfFontTransition;
             int itemLength = m_run.rtl() ? indexOfFontTransition - index : index - indexOfFontTransition;
+            m_currentCharacter = baseCharacter + itemStart;
             itemizeShapeAndPlace((isSmallCaps ? smallCapsBuffer.data() : cp) + itemStart, itemLength, fontData, glyphBuffer);
             indexOfFontTransition = index;
         }
@@ -156,8 +159,11 @@ void UniscribeController::advance(unsigned offset, GlyphBuffer* glyphBuffer)
     int itemLength = m_run.rtl() ? indexOfFontTransition + 1 : length - indexOfFontTransition;
     if (itemLength) {
         int itemStart = m_run.rtl() ? 0 : indexOfFontTransition;
+        m_currentCharacter = baseCharacter + itemStart;
         itemizeShapeAndPlace((nextIsSmallCaps ? smallCapsBuffer.data() : cp) + itemStart, itemLength, nextFontData, glyphBuffer);
     }
+
+    m_currentCharacter = baseCharacter + length;
 }
 
 void UniscribeController::itemizeShapeAndPlace(const UChar* cp, unsigned length, const SimpleFontData* fontData, GlyphBuffer* glyphBuffer)
@@ -183,8 +189,6 @@ void UniscribeController::itemizeShapeAndPlace(const UChar* cp, unsigned length,
                 return;
         }
     }
-
-    m_currentCharacter += length;
 }
 
 void UniscribeController::resetControlAndState()
@@ -418,25 +422,9 @@ bool UniscribeController::shape(const UChar* str, int len, SCRIPT_ITEM item, con
 
     if (FAILED(shapeResult))
         return false;
-    
-    // FIXME: We need to do better than this.  Falling back on the entire item is not good enough.
-    // We may still have missing glyphs even if we succeeded.  We need to treat missing glyphs as
-    // a failure so that we will fall back to another font.
-    bool containsMissingGlyphs = false;
-    SCRIPT_FONTPROPERTIES* fontProperties = fontData->scriptFontProperties();
-    for (int i = 0; i < glyphCount; i++) {
-        WORD glyph = glyphs[i];
-        if (glyph == fontProperties->wgDefault) {
-            containsMissingGlyphs = true;
-            break;
-        }
-    }
-
-    if (containsMissingGlyphs)
-        return false;
 
-    glyphs.resize(glyphCount);
-    visualAttributes.resize(glyphCount);
+    glyphs.shrink(glyphCount);
+    visualAttributes.shrink(glyphCount);
 
     return true;
 }