/platform/external/webkit/WebCore/css/CSSSegmentedFontFace.cpp

https://github.com/aharish/totoro-gb-opensource-update2 · C++ · 135 lines · 93 code · 17 blank · 25 comment · 19 complexity · 4ee23eef81c85b50e8b29a83254adb33 MD5 · raw file

  1. /*
  2. * Copyright (C) 2008 Apple Inc. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. * 1. Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * 2. Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. *
  13. * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
  14. * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  15. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  16. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
  17. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  18. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  19. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  20. * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  21. * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  22. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  23. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  24. */
  25. #include "config.h"
  26. #include "CSSSegmentedFontFace.h"
  27. #include "CSSFontFace.h"
  28. #include "CSSFontSelector.h"
  29. #include "FontDescription.h"
  30. #include "SegmentedFontData.h"
  31. #include "SimpleFontData.h"
  32. namespace WebCore {
  33. CSSSegmentedFontFace::CSSSegmentedFontFace(CSSFontSelector* fontSelector)
  34. : m_fontSelector(fontSelector)
  35. {
  36. }
  37. CSSSegmentedFontFace::~CSSSegmentedFontFace()
  38. {
  39. pruneTable();
  40. unsigned size = m_fontFaces.size();
  41. for (unsigned i = 0; i < size; i++)
  42. m_fontFaces[i]->removedFromSegmentedFontFace(this);
  43. }
  44. void CSSSegmentedFontFace::pruneTable()
  45. {
  46. // Make sure the glyph page tree prunes out all uses of this custom font.
  47. if (m_fontDataTable.isEmpty())
  48. return;
  49. HashMap<unsigned, SegmentedFontData*>::iterator end = m_fontDataTable.end();
  50. for (HashMap<unsigned, SegmentedFontData*>::iterator it = m_fontDataTable.begin(); it != end; ++it)
  51. GlyphPageTreeNode::pruneTreeCustomFontData(it->second);
  52. deleteAllValues(m_fontDataTable);
  53. m_fontDataTable.clear();
  54. }
  55. bool CSSSegmentedFontFace::isLoaded() const
  56. {
  57. unsigned size = m_fontFaces.size();
  58. for (unsigned i = 0; i < size; i++) {
  59. if (!m_fontFaces[i]->isLoaded())
  60. return false;
  61. }
  62. return true;
  63. }
  64. bool CSSSegmentedFontFace::isValid() const
  65. {
  66. unsigned size = m_fontFaces.size();
  67. for (unsigned i = 0; i < size; i++) {
  68. if (!m_fontFaces[i]->isValid())
  69. return false;
  70. }
  71. return true;
  72. }
  73. void CSSSegmentedFontFace::fontLoaded(CSSFontFace*)
  74. {
  75. pruneTable();
  76. }
  77. void CSSSegmentedFontFace::appendFontFace(PassRefPtr<CSSFontFace> fontFace)
  78. {
  79. pruneTable();
  80. fontFace->addedToSegmentedFontFace(this);
  81. m_fontFaces.append(fontFace);
  82. }
  83. FontData* CSSSegmentedFontFace::getFontData(const FontDescription& fontDescription)
  84. {
  85. if (!isValid())
  86. return 0;
  87. FontTraitsMask desiredTraitsMask = fontDescription.traitsMask();
  88. unsigned hashKey = fontDescription.computedPixelSize() << FontTraitsMaskWidth | desiredTraitsMask;
  89. SegmentedFontData* fontData = m_fontDataTable.get(hashKey);
  90. if (fontData)
  91. return fontData;
  92. fontData = new SegmentedFontData();
  93. unsigned size = m_fontFaces.size();
  94. for (unsigned i = 0; i < size; i++) {
  95. FontTraitsMask traitsMask = m_fontFaces[i]->traitsMask();
  96. bool syntheticBold = !(traitsMask & (FontWeight600Mask | FontWeight700Mask | FontWeight800Mask | FontWeight900Mask)) && (desiredTraitsMask & (FontWeight600Mask | FontWeight700Mask | FontWeight800Mask | FontWeight900Mask));
  97. bool syntheticItalic = !(traitsMask & FontStyleItalicMask) && (desiredTraitsMask & FontStyleItalicMask);
  98. if (const FontData* faceFontData = m_fontFaces[i]->getFontData(fontDescription, syntheticBold, syntheticItalic)) {
  99. ASSERT(!faceFontData->isSegmented());
  100. const Vector<CSSFontFace::UnicodeRange>& ranges = m_fontFaces[i]->ranges();
  101. unsigned numRanges = ranges.size();
  102. if (!numRanges)
  103. fontData->appendRange(FontDataRange(0, 0x7FFFFFFF, static_cast<const SimpleFontData*>(faceFontData)));
  104. else {
  105. for (unsigned j = 0; j < numRanges; ++j)
  106. fontData->appendRange(FontDataRange(ranges[j].from(), ranges[j].to(), static_cast<const SimpleFontData*>(faceFontData)));
  107. }
  108. }
  109. }
  110. if (fontData->numRanges())
  111. m_fontDataTable.set(hashKey, fontData);
  112. else {
  113. delete fontData;
  114. fontData = 0;
  115. }
  116. return fontData;
  117. }
  118. }