Changeset 166364 in webkit


Ignore:
Timestamp:
Mar 27, 2014 11:06:21 AM (10 years ago)
Author:
fred.wang@free.fr
Message:

Operator stretching: expose a math data API
https://bugs.webkit.org/show_bug.cgi?id=130572

Reviewed by Chris Fleizach.

We expose a new SimpleFontData API to give access to the data from the
OpenType MATH table using a font cache. The class OpenTypeMathData will
be implemented in bug 130324. On Darwin platform, we also implement the
missing FontPlatformData::openTypeTable function which will be necessary
to load the OpenType MATH table. The changes are intended to be used
for MathML operator stretching (bug 130322) so tests are not added yet.

  • CMakeLists.txt: add new OpenTypeMathData files.
  • WebCore.vcxproj/WebCore.vcxproj: ditto.
  • WebCore.vcxproj/WebCore.vcxproj.filters: ditto.
  • WebCore.xcodeproj/project.pbxproj: ditto.
  • platform/graphics/FontCache.cpp: We add a FontCache::getMathData function to implement a cache for the math data.

We make the math and vertical data share the same key for the cache.
(WebCore::fontMathDataCacheInstance):
(WebCore::FontCache::getMathData):
(WebCore::fontVerticalDataCacheInstance):

  • platform/graphics/FontCache.h: We declare FontCache::getMathData and FontFileKey on all platforms.
  • platform/graphics/FontPlatformData.cpp:

(WebCore::FontPlatformData::openTypeTable): We implement openTypeTable() on Darwin platform.

  • platform/graphics/FontPlatformData.h: We expose openTypeTable() on Darwin platform.
  • platform/graphics/SimpleFontData.cpp: We initialize m_mathData from the font cache.

(WebCore::SimpleFontData::SimpleFontData):

  • platform/graphics/SimpleFontData.h: We expose a mathData() function to access the MATH data.
  • platform/graphics/opentype/OpenTypeMathData.cpp: Added. This is a new class that will be used to parse the data from the OpenType MATH table.

(WebCore::OpenTypeMathData::OpenTypeMathData):

  • platform/graphics/opentype/OpenTypeMathData.h: Added.

(WebCore::OpenTypeMathData::create):
(WebCore::OpenTypeMathData::hasMathData):

Location:
trunk/Source/WebCore
Files:
2 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/CMakeLists.txt

    r166360 r166364  
    19501950    platform/graphics/filters/SourceGraphic.cpp
    19511951    platform/graphics/filters/SpotLightSource.cpp
     1952
     1953    platform/graphics/opentype/OpenTypeMathData.cpp
    19521954
    19531955    platform/graphics/texmap/TextureMapper.cpp
  • trunk/Source/WebCore/ChangeLog

    r166362 r166364  
     12014-03-27  Frédéric Wang  <fred.wang@free.fr>
     2
     3        Operator stretching: expose a math data API
     4        https://bugs.webkit.org/show_bug.cgi?id=130572
     5
     6        Reviewed by Chris Fleizach.
     7
     8        We expose a new SimpleFontData API to give access to the data from the
     9        OpenType MATH table using a font cache. The class OpenTypeMathData will
     10        be implemented in bug 130324. On Darwin platform, we also implement the
     11        missing FontPlatformData::openTypeTable function which will be necessary
     12        to load the OpenType MATH table. The changes are intended to be used
     13        for MathML operator stretching (bug 130322) so tests are not added yet.
     14
     15        * CMakeLists.txt: add new OpenTypeMathData files.
     16        * WebCore.vcxproj/WebCore.vcxproj: ditto.
     17        * WebCore.vcxproj/WebCore.vcxproj.filters: ditto.
     18        * WebCore.xcodeproj/project.pbxproj: ditto.
     19        * platform/graphics/FontCache.cpp: We add a FontCache::getMathData function to implement a cache for the math data.
     20        We make the math and vertical data share the same key for the cache.
     21        (WebCore::fontMathDataCacheInstance):
     22        (WebCore::FontCache::getMathData):
     23        (WebCore::fontVerticalDataCacheInstance):
     24        * platform/graphics/FontCache.h: We declare FontCache::getMathData and FontFileKey on all platforms.
     25        * platform/graphics/FontPlatformData.cpp:
     26        (WebCore::FontPlatformData::openTypeTable): We implement openTypeTable() on Darwin platform.
     27        * platform/graphics/FontPlatformData.h: We expose openTypeTable() on Darwin platform.
     28        * platform/graphics/SimpleFontData.cpp: We initialize m_mathData from the font cache.
     29        (WebCore::SimpleFontData::SimpleFontData):
     30        * platform/graphics/SimpleFontData.h: We expose a mathData() function to access the MATH data.
     31        * platform/graphics/opentype/OpenTypeMathData.cpp: Added. This is a new class that will be used to parse the data from the OpenType MATH table.
     32        (WebCore::OpenTypeMathData::OpenTypeMathData):
     33        * platform/graphics/opentype/OpenTypeMathData.h: Added.
     34        (WebCore::OpenTypeMathData::create):
     35        (WebCore::OpenTypeMathData::hasMathData):
     36
    1372014-03-27  Brent Fulgham  <bfulgham@apple.com>
    238
  • trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj

    r166360 r166364  
    79507950    <ClCompile Include="..\platform\graphics\win\IntSizeWin.cpp" />
    79517951    <ClCompile Include="..\platform\graphics\win\MediaPlayerPrivateFullscreenWindow.cpp" />
     7952    <ClCompile Include="..\platform\graphics\opentype\OpenTypeMathData.cpp" />
    79527953    <ClCompile Include="..\platform\graphics\opentype\OpenTypeUtilities.cpp" />
    79537954    <ClCompile Include="..\platform\graphics\opentype\OpenTypeVerticalData.cpp" />
     
    1937419375    <ClInclude Include="..\platform\graphics\win\LocalWindowsContext.h" />
    1937519376    <CustomBuildStep Include="..\platform\graphics\win\MediaPlayerPrivateFullscreenWindow.h" />
     19377    <ClInclude Include="..\platform\graphics\opentype\OpenTypeMathData.h" />
    1937619378    <ClInclude Include="..\platform\graphics\opentype\OpenTypeTypes.h" />
    1937719379    <ClInclude Include="..\platform\graphics\opentype\OpenTypeUtilities.h" />
  • trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters

    r166360 r166364  
    14771477      <Filter>platform\graphics\win</Filter>
    14781478    </ClCompile>
     1479    <ClCompile Include="..\platform\graphics\opentype\OpenTypeMathData.cpp">
     1480      <Filter>platform\graphics\win</Filter>
     1481    </ClCompile>
    14791482    <ClCompile Include="..\platform\graphics\opentype\OpenTypeUtilities.cpp">
    14801483      <Filter>platform\graphics\win</Filter>
     
    84338436    </ClInclude>
    84348437    <ClInclude Include="..\platform\graphics\win\LocalWindowsContext.h">
     8438      <Filter>platform\graphics\win</Filter>
     8439    </ClInclude>
     8440    <ClInclude Include="..\platform\graphics\opentype\OpenTypeMathData.h">
    84358441      <Filter>platform\graphics\win</Filter>
    84368442    </ClInclude>
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r166360 r166364  
    45944594                B2C3DA640D006CD600EF6F26 /* SimpleFontData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B2C3DA530D006CD600EF6F26 /* SimpleFontData.cpp */; };
    45954595                B2C3DA650D006CD600EF6F26 /* SimpleFontData.h in Headers */ = {isa = PBXBuildFile; fileRef = B2C3DA540D006CD600EF6F26 /* SimpleFontData.h */; settings = {ATTRIBUTES = (Private, ); }; };
     4596                B2D3DA640D006CD600EF6F27 /* OpenTypeMathData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B2D3DA530D006CD600EF6F27 /* OpenTypeMathData.cpp */; };
     4597                B2D3DA650D006CD600EF6F27 /* OpenTypeMathData.h in Headers */ = {isa = PBXBuildFile; fileRef = B2D3DA540D006CD600EF6F27 /* OpenTypeMathData.h */; settings = {ATTRIBUTES = (Private, ); }; };
    45964598                B2C3DA660D006CD600EF6F26 /* FontDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = B2C3DA550D006CD600EF6F26 /* FontDescription.h */; settings = {ATTRIBUTES = (Private, ); }; };
    45974599                B2C3DA670D006CD600EF6F26 /* FontGlyphs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B2C3DA560D006CD600EF6F26 /* FontGlyphs.cpp */; };
     
    1184511847                B2C3DA530D006CD600EF6F26 /* SimpleFontData.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SimpleFontData.cpp; sourceTree = "<group>"; };
    1184611848                B2C3DA540D006CD600EF6F26 /* SimpleFontData.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SimpleFontData.h; sourceTree = "<group>"; };
     11849                B2D3DA530D006CD600EF6F27 /* OpenTypeMathData.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = opentype/OpenTypeMathData.cpp; sourceTree = "<group>"; };
     11850                B2D3DA540D006CD600EF6F27 /* OpenTypeMathData.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = opentype/OpenTypeMathData.h; sourceTree = "<group>"; };
    1184711851                B2C3DA550D006CD600EF6F26 /* FontDescription.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FontDescription.h; sourceTree = "<group>"; };
    1184811852                B2C3DA560D006CD600EF6F26 /* FontGlyphs.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = FontGlyphs.cpp; sourceTree = "<group>"; };
     
    2013720141                                B2C3DA530D006CD600EF6F26 /* SimpleFontData.cpp */,
    2013820142                                B2C3DA540D006CD600EF6F26 /* SimpleFontData.h */,
     20143                                B2D3DA530D006CD600EF6F27 /* OpenTypeMathData.cpp */,
     20144                                B2D3DA540D006CD600EF6F27 /* OpenTypeMathData.h */,
    2013920145                                CD641EB21818F5ED00EE4C41 /* SourceBufferPrivate.h */,
    2014020146                                CDC61DA0180867D8004B913F /* SourceBufferPrivate.h */,
     
    2548025486                                41D168EE10226E89009BC827 /* SharedWorkerThread.h in Headers */,
    2548125487                                B2C3DA650D006CD600EF6F26 /* SimpleFontData.h in Headers */,
     25488                                B2D3DA650D006CD600EF6F27 /* OpenTypeMathData.h in Headers */,
    2548225489                                E48944A3180B57D800F165D8 /* SimpleLineLayout.h in Headers */,
    2548325490                                E4E9B11D1814569C003ACCDF /* SimpleLineLayoutFunctions.h in Headers */,
     
    2884428851                                41D168ED10226E89009BC827 /* SharedWorkerThread.cpp in Sources */,
    2884528852                                B2C3DA640D006CD600EF6F26 /* SimpleFontData.cpp in Sources */,
     28853                                B2D3DA640D006CD600EF6F27 /* OpenTypeMathData.cpp in Sources */,
    2884628854                                163E88F7118A39D200ED9231 /* SimpleFontDataCoreText.cpp in Sources */,
    2884728855                                37E65950163B10C200EB4574 /* SimpleFontDataIOS.mm in Sources */,
  • trunk/Source/WebCore/platform/graphics/FontCache.cpp

    r166179 r166364  
    3535#include "FontPlatformData.h"
    3636#include "FontSelector.h"
     37#include "OpenTypeMathData.h"
    3738#include "WebKitFontFamilyNames.h"
    3839#include <wtf/HashMap.h>
     
    267268}
    268269
    269 #if ENABLE(OPENTYPE_VERTICAL)
    270 struct FontVerticalDataCacheKeyHash {
     270struct FontFileCacheKeyHash {
    271271    static unsigned hash(const FontCache::FontFileKey& fontFileKey)
    272272    {
     
    282282};
    283283
    284 struct FontVerticalDataCacheKeyTraits : WTF::GenericHashTraits<FontCache::FontFileKey> {
     284struct FontFileCacheKeyTraits : WTF::GenericHashTraits<FontCache::FontFileKey> {
    285285    static const bool emptyValueIsZero = true;
    286286    static const bool needsDestruction = true;
     
    300300};
    301301
    302 typedef HashMap<FontCache::FontFileKey, RefPtr<OpenTypeVerticalData>, FontVerticalDataCacheKeyHash, FontVerticalDataCacheKeyTraits> FontVerticalDataCache;
    303 
    304 FontVerticalDataCache& fontVerticalDataCacheInstance()
     302typedef HashMap<FontCache::FontFileKey, RefPtr<OpenTypeMathData>, FontFileCacheKeyHash, FontFileCacheKeyTraits> FontMathDataCache;
     303
     304static FontMathDataCache& fontMathDataCacheInstance()
     305{
     306    static NeverDestroyed<FontMathDataCache> fontMathDataCache;
     307    return fontMathDataCache;
     308}
     309
     310PassRefPtr<OpenTypeMathData> FontCache::getMathData(const FontFileKey& key, const FontPlatformData& fontData)
     311{
     312    FontMathDataCache& fontMathDataCache = fontMathDataCacheInstance();
     313    FontMathDataCache::iterator result = fontMathDataCache.find(key);
     314    if (result != fontMathDataCache.end())
     315        return result.get()->value;
     316
     317    RefPtr<OpenTypeMathData> mathData = OpenTypeMathData::create(fontData);
     318    if (!mathData->hasMathData())
     319        mathData.clear();
     320    fontMathDataCache.set(key, mathData);
     321    return mathData;
     322}
     323
     324#if ENABLE(OPENTYPE_VERTICAL)
     325typedef HashMap<FontCache::FontFileKey, RefPtr<OpenTypeVerticalData>, FontFileCacheKeyHash, FontFileCacheKeyTraits> FontVerticalDataCache;
     326
     327static FontVerticalDataCache& fontVerticalDataCacheInstance()
    305328{
    306329    static NeverDestroyed<FontVerticalDataCache> fontVerticalDataCache;
  • trunk/Source/WebCore/platform/graphics/FontCache.h

    r166179 r166364  
    5555class FontData;
    5656class FontSelector;
     57class OpenTypeMathData;
    5758class OpenTypeVerticalData;
    5859class SimpleFontData;
     
    152153#endif
    153154
     155    typedef AtomicString FontFileKey;
     156    PassRefPtr<OpenTypeMathData> getMathData(const FontFileKey&, const FontPlatformData&);
    154157#if ENABLE(OPENTYPE_VERTICAL)
    155     typedef AtomicString FontFileKey;
    156158    PassRefPtr<OpenTypeVerticalData> getVerticalData(const FontFileKey&, const FontPlatformData&);
    157159#endif
  • trunk/Source/WebCore/platform/graphics/FontPlatformData.cpp

    r166179 r166364  
    2727#include <wtf/text/StringHash.h>
    2828#include <wtf/text/WTFString.h>
     29
     30#if OS(DARWIN) && USE(CG)
     31#include "SharedBuffer.h"
     32#include <CoreGraphics/CGFont.h>
     33#endif
    2934
    3035namespace WebCore {
     
    170175}
    171176
     177#if OS(DARWIN) && USE(CG)
     178PassRefPtr<SharedBuffer> FontPlatformData::openTypeTable(uint32_t table) const
     179{
     180    if (CFDataRef data = CGFontCopyTableForTag(cgFont(), table))
     181        return SharedBuffer::wrapCFData(data);
     182   
     183    return nullptr;
    172184}
     185#endif
     186
     187}
  • trunk/Source/WebCore/platform/graphics/FontPlatformData.h

    r166179 r166364  
    217217    }
    218218
    219 #if PLATFORM(WIN) && (USE(CG) || USE(CAIRO))
     219#if (OS(DARWIN) && USE(CG)) || (PLATFORM(WIN) && (USE(CG) || USE(CAIRO)))
    220220    PassRefPtr<SharedBuffer> openTypeTable(uint32_t table) const;
    221221#endif
  • trunk/Source/WebCore/platform/graphics/SimpleFontData.cpp

    r166179 r166364  
    3333#include "Font.h"
    3434#include "FontCache.h"
     35#include "OpenTypeMathData.h"
    3536#include <wtf/MathExtras.h>
    3637
     
    5354    , m_isTextOrientationFallback(isTextOrientationFallback)
    5455    , m_isBrokenIdeographFallback(false)
     56    , m_mathData(nullptr)
    5557#if ENABLE(OPENTYPE_VERTICAL)
    5658    , m_verticalData(0)
     
    6163    platformGlyphInit();
    6264    platformCharWidthInit();
     65
     66    bool tryMathData = false;
     67#if PLATFORM(WIN) && (USE(CG) || USE(CAIRO))
     68    tryMathData = platformData.hfont();
     69#elif OS(DARWIN) && USE(CG)
     70    tryMathData = platformData.font();
     71#elif USE(FREETYPE)
     72    tryMathData = platformData.hash();
     73#endif
     74    if (tryMathData)
     75        m_mathData = fontCache()->getMathData(String::number(platformData.hash()), platformData);
     76
    6377#if ENABLE(OPENTYPE_VERTICAL)
    6478    if (platformData.orientation() == Vertical && !isTextOrientationFallback) {
     
    7791    , m_isTextOrientationFallback(false)
    7892    , m_isBrokenIdeographFallback(false)
     93    , m_mathData(nullptr)
    7994#if ENABLE(OPENTYPE_VERTICAL)
    8095    , m_verticalData(0)
  • trunk/Source/WebCore/platform/graphics/SimpleFontData.h

    r166179 r166364  
    3333#include "GlyphMetricsMap.h"
    3434#include "GlyphPageTreeNode.h"
     35#include "OpenTypeMathData.h"
    3536#if ENABLE(OPENTYPE_VERTICAL)
    3637#include "OpenTypeVerticalData.h"
     
    9394
    9495    const FontPlatformData& platformData() const { return m_platformData; }
     96    const OpenTypeMathData* mathData() const { return m_mathData ? m_mathData.get() : nullptr; }
    9597#if ENABLE(OPENTYPE_VERTICAL)
    9698    const OpenTypeVerticalData* verticalData() const { return m_verticalData.get(); }
     
    260262    bool m_isTextOrientationFallback;
    261263    bool m_isBrokenIdeographFallback;
     264    RefPtr<OpenTypeMathData> m_mathData;
    262265#if ENABLE(OPENTYPE_VERTICAL)
    263266    RefPtr<OpenTypeVerticalData> m_verticalData;
Note: See TracChangeset for help on using the changeset viewer.