summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/mac
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-05-06 11:45:16 +0100
committerSteve Block <steveblock@google.com>2011-05-12 13:44:10 +0100
commitcad810f21b803229eb11403f9209855525a25d57 (patch)
tree29a6fd0279be608e0fe9ffe9841f722f0f4e4269 /WebCore/platform/graphics/mac
parent121b0cf4517156d0ac5111caf9830c51b69bae8f (diff)
downloadexternal_webkit-cad810f21b803229eb11403f9209855525a25d57.zip
external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.gz
external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.bz2
Merge WebKit at r75315: Initial merge by git.
Change-Id: I570314b346ce101c935ed22a626b48c2af266b84
Diffstat (limited to 'WebCore/platform/graphics/mac')
-rw-r--r--WebCore/platform/graphics/mac/ColorMac.h54
-rw-r--r--WebCore/platform/graphics/mac/ColorMac.mm112
-rw-r--r--WebCore/platform/graphics/mac/ComplexTextController.cpp565
-rw-r--r--WebCore/platform/graphics/mac/ComplexTextController.h193
-rw-r--r--WebCore/platform/graphics/mac/ComplexTextControllerATSUI.cpp340
-rw-r--r--WebCore/platform/graphics/mac/ComplexTextControllerCoreText.cpp173
-rw-r--r--WebCore/platform/graphics/mac/FloatPointMac.mm45
-rw-r--r--WebCore/platform/graphics/mac/FloatRectMac.mm45
-rw-r--r--WebCore/platform/graphics/mac/FloatSizeMac.mm45
-rw-r--r--WebCore/platform/graphics/mac/FontCacheMac.mm217
-rw-r--r--WebCore/platform/graphics/mac/FontComplexTextMac.cpp127
-rw-r--r--WebCore/platform/graphics/mac/FontCustomPlatformData.cpp122
-rw-r--r--WebCore/platform/graphics/mac/FontCustomPlatformData.h60
-rw-r--r--WebCore/platform/graphics/mac/FontMac.mm209
-rw-r--r--WebCore/platform/graphics/mac/GlyphPageTreeNodeMac.cpp162
-rw-r--r--WebCore/platform/graphics/mac/GraphicsContext3DMac.mm256
-rw-r--r--WebCore/platform/graphics/mac/GraphicsContextMac.mm193
-rw-r--r--WebCore/platform/graphics/mac/IconMac.mm90
-rw-r--r--WebCore/platform/graphics/mac/ImageMac.mm124
-rw-r--r--WebCore/platform/graphics/mac/IntPointMac.mm44
-rw-r--r--WebCore/platform/graphics/mac/IntRectMac.mm49
-rw-r--r--WebCore/platform/graphics/mac/IntSizeMac.mm44
-rw-r--r--WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h216
-rw-r--r--WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm1673
-rw-r--r--WebCore/platform/graphics/mac/MediaPlayerProxy.h118
-rw-r--r--WebCore/platform/graphics/mac/SimpleFontDataATSUI.mm77
-rw-r--r--WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp77
-rw-r--r--WebCore/platform/graphics/mac/SimpleFontDataMac.mm504
-rw-r--r--WebCore/platform/graphics/mac/WebGLLayer.h52
-rw-r--r--WebCore/platform/graphics/mac/WebGLLayer.mm167
-rw-r--r--WebCore/platform/graphics/mac/WebLayer.h55
-rw-r--r--WebCore/platform/graphics/mac/WebLayer.mm234
-rw-r--r--WebCore/platform/graphics/mac/WebTiledLayer.h44
-rw-r--r--WebCore/platform/graphics/mac/WebTiledLayer.mm91
34 files changed, 0 insertions, 6577 deletions
diff --git a/WebCore/platform/graphics/mac/ColorMac.h b/WebCore/platform/graphics/mac/ColorMac.h
deleted file mode 100644
index b68b157..0000000
--- a/WebCore/platform/graphics/mac/ColorMac.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2007 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef ColorMac_h
-#define ColorMac_h
-
-#include "Color.h"
-
-#ifdef __OBJC__
-@class NSColor;
-#else
-class NSColor;
-#endif
-
-namespace WebCore {
-
- // These functions assume NSColors are in DeviceRGB colorspace
- Color colorFromNSColor(NSColor *);
- NSColor *nsColor(const Color&);
-
- bool usesTestModeFocusRingColor();
- void setUsesTestModeFocusRingColor(bool);
-
- // Focus ring color used for testing purposes.
- RGBA32 oldAquaFocusRingColor();
-
-}
-
-#endif
diff --git a/WebCore/platform/graphics/mac/ColorMac.mm b/WebCore/platform/graphics/mac/ColorMac.mm
deleted file mode 100644
index 07d6353..0000000
--- a/WebCore/platform/graphics/mac/ColorMac.mm
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#import "config.h"
-#import "ColorMac.h"
-
-#import <wtf/RetainPtr.h>
-#import <wtf/StdLibExtras.h>
-
-namespace WebCore {
-
-// NSColor calls don't throw, so no need to block Cocoa exceptions in this file
-
-static bool useOldAquaFocusRingColor;
-
-RGBA32 oldAquaFocusRingColor()
-{
- return 0xFF7DADD9;
-}
-
-void setUsesTestModeFocusRingColor(bool newValue)
-{
- useOldAquaFocusRingColor = newValue;
-}
-
-bool usesTestModeFocusRingColor()
-{
- return useOldAquaFocusRingColor;
-}
-
-static RGBA32 makeRGBAFromNSColor(NSColor *c)
-{
- CGFloat redComponent;
- CGFloat greenComponent;
- CGFloat blueComponent;
- CGFloat alpha;
- [c getRed:&redComponent green:&greenComponent blue:&blueComponent alpha:&alpha];
-
- return makeRGBA(255 * redComponent, 255 * greenComponent, 255 * blueComponent, 255 * alpha);
-}
-
-Color colorFromNSColor(NSColor *c)
-{
- return Color(makeRGBAFromNSColor(c));
-}
-
-NSColor *nsColor(const Color& color)
-{
- RGBA32 c = color.rgb();
- switch (c) {
- case 0: {
- // Need this to avoid returning nil because cachedRGBAValues will default to 0.
- DEFINE_STATIC_LOCAL(RetainPtr<NSColor>, clearColor, ([NSColor colorWithDeviceRed:0 green:0 blue:0 alpha:0]));
- return clearColor.get();
- }
- case Color::black: {
- DEFINE_STATIC_LOCAL(RetainPtr<NSColor>, blackColor, ([NSColor colorWithDeviceRed:0 green:0 blue:0 alpha:1]));
- return blackColor.get();
- }
- case Color::white: {
- DEFINE_STATIC_LOCAL(RetainPtr<NSColor>, whiteColor, ([NSColor colorWithDeviceRed:1 green:1 blue:1 alpha:1]));
- return whiteColor.get();
- }
- default: {
- const int cacheSize = 32;
- static unsigned cachedRGBAValues[cacheSize];
- static RetainPtr<NSColor>* cachedColors = new RetainPtr<NSColor>[cacheSize];
-
- for (int i = 0; i != cacheSize; ++i) {
- if (cachedRGBAValues[i] == c)
- return cachedColors[i].get();
- }
-
- NSColor *result = [NSColor colorWithDeviceRed:static_cast<CGFloat>(color.red()) / 255
- green:static_cast<CGFloat>(color.green()) / 255
- blue:static_cast<CGFloat>(color.blue()) / 255
- alpha:static_cast<CGFloat>(color.alpha()) / 255];
-
- static int cursor;
- cachedRGBAValues[cursor] = c;
- cachedColors[cursor] = result;
- if (++cursor == cacheSize)
- cursor = 0;
- return result;
- }
- }
-}
-
-
-} // namespace WebCore
diff --git a/WebCore/platform/graphics/mac/ComplexTextController.cpp b/WebCore/platform/graphics/mac/ComplexTextController.cpp
deleted file mode 100644
index 206fd5f..0000000
--- a/WebCore/platform/graphics/mac/ComplexTextController.cpp
+++ /dev/null
@@ -1,565 +0,0 @@
-/*
- * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "ComplexTextController.h"
-
-#include <ApplicationServices/ApplicationServices.h>
-#include "CharacterNames.h"
-#include "FloatSize.h"
-#include "Font.h"
-#include "TextBreakIterator.h"
-
-#include <wtf/StdLibExtras.h>
-
-#if defined(BUILDING_ON_LEOPARD)
-// Undefined when compiling agains the 10.5 SDK.
-#define kCTVersionNumber10_6 0x00030000
-#endif
-
-using namespace std;
-
-namespace WebCore {
-
-static inline CGFloat roundCGFloat(CGFloat f)
-{
- if (sizeof(CGFloat) == sizeof(float))
- return roundf(static_cast<float>(f));
- return static_cast<CGFloat>(round(f));
-}
-
-static inline CGFloat ceilCGFloat(CGFloat f)
-{
- if (sizeof(CGFloat) == sizeof(float))
- return ceilf(static_cast<float>(f));
- return static_cast<CGFloat>(ceil(f));
-}
-
-ComplexTextController::ComplexTextController(const Font* font, const TextRun& run, bool mayUseNaturalWritingDirection, HashSet<const SimpleFontData*>* fallbackFonts, bool forTextEmphasis)
- : m_font(*font)
- , m_run(run)
- , m_mayUseNaturalWritingDirection(mayUseNaturalWritingDirection)
- , m_forTextEmphasis(forTextEmphasis)
- , m_currentCharacter(0)
- , m_end(run.length())
- , m_totalWidth(0)
- , m_runWidthSoFar(0)
- , m_numGlyphsSoFar(0)
- , m_currentRun(0)
- , m_glyphInCurrentRun(0)
- , m_characterInCurrentGlyph(0)
- , m_finalRoundingWidth(0)
- , m_padding(run.padding())
- , m_fallbackFonts(fallbackFonts)
- , m_minGlyphBoundingBoxX(numeric_limits<float>::max())
- , m_maxGlyphBoundingBoxX(numeric_limits<float>::min())
- , m_minGlyphBoundingBoxY(numeric_limits<float>::max())
- , m_maxGlyphBoundingBoxY(numeric_limits<float>::min())
- , m_lastRoundingGlyph(0)
-{
- if (!m_padding)
- m_padPerSpace = 0;
- else {
- int numSpaces = 0;
- for (int s = 0; s < m_run.length(); s++) {
- if (Font::treatAsSpace(m_run[s]))
- numSpaces++;
- }
-
- if (!numSpaces)
- m_padPerSpace = 0;
- else
- m_padPerSpace = m_padding / numSpaces;
- }
-
- collectComplexTextRuns();
- adjustGlyphsAndAdvances();
-}
-
-int ComplexTextController::offsetForPosition(float h, bool includePartialGlyphs)
-{
- if (h >= m_totalWidth)
- return m_run.ltr() ? m_end : 0;
- if (h < 0)
- return m_run.ltr() ? 0 : m_end;
-
- CGFloat x = h;
-
- size_t runCount = m_complexTextRuns.size();
- size_t offsetIntoAdjustedGlyphs = 0;
-
- for (size_t r = 0; r < runCount; ++r) {
- const ComplexTextRun& complexTextRun = *m_complexTextRuns[r];
- for (unsigned j = 0; j < complexTextRun.glyphCount(); ++j) {
- CGFloat adjustedAdvance = m_adjustedAdvances[offsetIntoAdjustedGlyphs + j].width;
- if (x < adjustedAdvance) {
- CFIndex hitGlyphStart = complexTextRun.indexAt(j);
- CFIndex hitGlyphEnd;
- if (m_run.ltr())
- hitGlyphEnd = max<CFIndex>(hitGlyphStart, j + 1 < complexTextRun.glyphCount() ? complexTextRun.indexAt(j + 1) : static_cast<CFIndex>(complexTextRun.stringLength()));
- else
- hitGlyphEnd = max<CFIndex>(hitGlyphStart, j > 0 ? complexTextRun.indexAt(j - 1) : static_cast<CFIndex>(complexTextRun.stringLength()));
-
- // FIXME: Instead of dividing the glyph's advance equally between the characters, this
- // could use the glyph's "ligature carets". However, there is no Core Text API to get the
- // ligature carets.
- CFIndex hitIndex = hitGlyphStart + (hitGlyphEnd - hitGlyphStart) * (m_run.ltr() ? x / adjustedAdvance : 1 - x / adjustedAdvance);
- int stringLength = complexTextRun.stringLength();
- TextBreakIterator* cursorPositionIterator = cursorMovementIterator(complexTextRun.characters(), stringLength);
- int clusterStart;
- if (isTextBreak(cursorPositionIterator, hitIndex))
- clusterStart = hitIndex;
- else {
- clusterStart = textBreakPreceding(cursorPositionIterator, hitIndex);
- if (clusterStart == TextBreakDone)
- clusterStart = 0;
- }
-
- if (!includePartialGlyphs)
- return complexTextRun.stringLocation() + clusterStart;
-
- int clusterEnd = textBreakFollowing(cursorPositionIterator, hitIndex);
- if (clusterEnd == TextBreakDone)
- clusterEnd = stringLength;
-
- CGFloat clusterWidth;
- // FIXME: The search stops at the boundaries of complexTextRun. In theory, it should go on into neighboring ComplexTextRuns
- // derived from the same CTLine. In practice, we do not expect there to be more than one CTRun in a CTLine, as no
- // reordering and on font fallback should occur within a CTLine.
- if (clusterEnd - clusterStart > 1) {
- clusterWidth = adjustedAdvance;
- int firstGlyphBeforeCluster = j - 1;
- while (firstGlyphBeforeCluster >= 0 && complexTextRun.indexAt(firstGlyphBeforeCluster) >= clusterStart && complexTextRun.indexAt(firstGlyphBeforeCluster) < clusterEnd) {
- CGFloat width = m_adjustedAdvances[offsetIntoAdjustedGlyphs + firstGlyphBeforeCluster].width;
- clusterWidth += width;
- x += width;
- firstGlyphBeforeCluster--;
- }
- unsigned firstGlyphAfterCluster = j + 1;
- while (firstGlyphAfterCluster < complexTextRun.glyphCount() && complexTextRun.indexAt(firstGlyphAfterCluster) >= clusterStart && complexTextRun.indexAt(firstGlyphAfterCluster) < clusterEnd) {
- clusterWidth += m_adjustedAdvances[offsetIntoAdjustedGlyphs + firstGlyphAfterCluster].width;
- firstGlyphAfterCluster++;
- }
- } else {
- clusterWidth = adjustedAdvance / (hitGlyphEnd - hitGlyphStart);
- x -= clusterWidth * (m_run.ltr() ? hitIndex - hitGlyphStart : hitGlyphEnd - hitIndex - 1);
- }
- if (x <= clusterWidth / 2)
- return complexTextRun.stringLocation() + (m_run.ltr() ? clusterStart : clusterEnd);
- else
- return complexTextRun.stringLocation() + (m_run.ltr() ? clusterEnd : clusterStart);
- }
- x -= adjustedAdvance;
- }
- offsetIntoAdjustedGlyphs += complexTextRun.glyphCount();
- }
-
- ASSERT_NOT_REACHED();
- return 0;
-}
-
-void ComplexTextController::collectComplexTextRuns()
-{
- if (!m_end)
- return;
-
- // We break up glyph run generation for the string by FontData and (if needed) the use of small caps.
- const UChar* cp = m_run.characters();
-
- if (m_font.isSmallCaps())
- m_smallCapsBuffer.resize(m_end);
-
- unsigned indexOfFontTransition = m_run.rtl() ? m_end - 1 : 0;
- const UChar* curr = m_run.rtl() ? cp + m_end - 1 : cp;
- const UChar* end = m_run.rtl() ? cp - 1 : cp + m_end;
-
- GlyphData glyphData;
- GlyphData nextGlyphData;
-
- bool isSurrogate = U16_IS_SURROGATE(*curr);
- if (isSurrogate) {
- if (m_run.ltr()) {
- if (!U16_IS_SURROGATE_LEAD(curr[0]) || curr + 1 == end || !U16_IS_TRAIL(curr[1]))
- return;
- nextGlyphData = m_font.glyphDataForCharacter(U16_GET_SUPPLEMENTARY(curr[0], curr[1]), false);
- } else {
- if (!U16_IS_TRAIL(curr[0]) || curr -1 == end || !U16_IS_SURROGATE_LEAD(curr[-1]))
- return;
- nextGlyphData = m_font.glyphDataForCharacter(U16_GET_SUPPLEMENTARY(curr[-1], curr[0]), false);
- }
- } else
- nextGlyphData = m_font.glyphDataForCharacter(*curr, false);
-
- UChar newC = 0;
-
- bool isSmallCaps;
- bool nextIsSmallCaps = !isSurrogate && m_font.isSmallCaps() && !(U_GET_GC_MASK(*curr) & U_GC_M_MASK) && (newC = u_toupper(*curr)) != *curr;
-
- if (nextIsSmallCaps)
- m_smallCapsBuffer[curr - cp] = newC;
-
- while (true) {
- curr = m_run.rtl() ? curr - (isSurrogate ? 2 : 1) : curr + (isSurrogate ? 2 : 1);
- if (curr == end)
- break;
-
- glyphData = nextGlyphData;
- isSmallCaps = nextIsSmallCaps;
- int index = curr - cp;
- isSurrogate = U16_IS_SURROGATE(*curr);
- UChar c = *curr;
- bool forceSmallCaps = !isSurrogate && isSmallCaps && (U_GET_GC_MASK(c) & U_GC_M_MASK);
- if (isSurrogate) {
- if (m_run.ltr()) {
- if (!U16_IS_SURROGATE_LEAD(curr[0]) || curr + 1 == end || !U16_IS_TRAIL(curr[1]))
- return;
- nextGlyphData = m_font.glyphDataForCharacter(U16_GET_SUPPLEMENTARY(curr[0], curr[1]), false);
- } else {
- if (!U16_IS_TRAIL(curr[0]) || curr -1 == end || !U16_IS_SURROGATE_LEAD(curr[-1]))
- return;
- nextGlyphData = m_font.glyphDataForCharacter(U16_GET_SUPPLEMENTARY(curr[-1], curr[0]), false);
- }
- } else
- nextGlyphData = m_font.glyphDataForCharacter(*curr, false, forceSmallCaps ? SmallCapsVariant : AutoVariant);
-
- if (!isSurrogate && m_font.isSmallCaps()) {
- nextIsSmallCaps = forceSmallCaps || (newC = u_toupper(c)) != c;
- if (nextIsSmallCaps)
- m_smallCapsBuffer[index] = forceSmallCaps ? c : newC;
- }
-
- if (nextGlyphData.fontData != glyphData.fontData || nextIsSmallCaps != isSmallCaps || !nextGlyphData.glyph != !glyphData.glyph) {
- int itemStart = m_run.rtl() ? index + 1 : static_cast<int>(indexOfFontTransition);
- int itemLength = m_run.rtl() ? indexOfFontTransition - index : index - indexOfFontTransition;
- collectComplexTextRunsForCharacters((isSmallCaps ? m_smallCapsBuffer.data() : cp) + itemStart, itemLength, itemStart, glyphData.glyph ? glyphData.fontData : 0);
- indexOfFontTransition = index;
- }
- }
-
- int itemLength = m_run.rtl() ? indexOfFontTransition + 1 : m_end - indexOfFontTransition;
- if (itemLength) {
- int itemStart = m_run.rtl() ? 0 : indexOfFontTransition;
- collectComplexTextRunsForCharacters((nextIsSmallCaps ? m_smallCapsBuffer.data() : cp) + itemStart, itemLength, itemStart, nextGlyphData.glyph ? nextGlyphData.fontData : 0);
- }
-}
-
-#if USE(CORE_TEXT) && USE(ATSUI)
-static inline bool shouldUseATSUIAPI()
-{
- enum TypeRenderingAPIToUse { UnInitialized, UseATSUI, UseCoreText };
- static TypeRenderingAPIToUse apiToUse = UnInitialized;
-
- if (UNLIKELY(apiToUse == UnInitialized)) {
- if (&CTGetCoreTextVersion != 0 && CTGetCoreTextVersion() >= kCTVersionNumber10_6)
- apiToUse = UseCoreText;
- else
- apiToUse = UseATSUI;
- }
-
- return apiToUse == UseATSUI;
-}
-#endif
-
-CFIndex ComplexTextController::ComplexTextRun::indexAt(size_t i) const
-{
-#if USE(CORE_TEXT) && USE(ATSUI)
- return shouldUseATSUIAPI() ? m_atsuiIndices[i] : m_coreTextIndices[i];
-#elif USE(ATSUI)
- return m_atsuiIndices[i];
-#elif USE(CORE_TEXT)
- return m_coreTextIndices[i];
-#endif
-}
-
-void ComplexTextController::collectComplexTextRunsForCharacters(const UChar* cp, unsigned length, unsigned stringLocation, const SimpleFontData* fontData)
-{
-#if USE(CORE_TEXT) && USE(ATSUI)
- if (shouldUseATSUIAPI())
- return collectComplexTextRunsForCharactersATSUI(cp, length, stringLocation, fontData);
- return collectComplexTextRunsForCharactersCoreText(cp, length, stringLocation, fontData);
-#elif USE(ATSUI)
- return collectComplexTextRunsForCharactersATSUI(cp, length, stringLocation, fontData);
-#elif USE(CORE_TEXT)
- return collectComplexTextRunsForCharactersCoreText(cp, length, stringLocation, fontData);
-#endif
-}
-
-ComplexTextController::ComplexTextRun::ComplexTextRun(const SimpleFontData* fontData, const UChar* characters, unsigned stringLocation, size_t stringLength, bool ltr)
- : m_fontData(fontData)
- , m_characters(characters)
- , m_stringLocation(stringLocation)
- , m_stringLength(stringLength)
- , m_isMonotonic(true)
-{
-#if USE(CORE_TEXT) && USE(ATSUI)
- shouldUseATSUIAPI() ? createTextRunFromFontDataATSUI(ltr) : createTextRunFromFontDataCoreText(ltr);
-#elif USE(ATSUI)
- createTextRunFromFontDataATSUI(ltr);
-#elif USE(CORE_TEXT)
- createTextRunFromFontDataCoreText(ltr);
-#endif
-}
-
-void ComplexTextController::ComplexTextRun::setIsNonMonotonic()
-{
- ASSERT(m_isMonotonic);
- m_isMonotonic = false;
-
- Vector<bool, 64> mappedIndices(m_stringLength);
- for (size_t i = 0; i < m_glyphCount; ++i) {
- ASSERT(indexAt(i) < static_cast<CFIndex>(m_stringLength));
- mappedIndices[indexAt(i)] = true;
- }
-
- m_glyphEndOffsets.grow(m_glyphCount);
- for (size_t i = 0; i < m_glyphCount; ++i) {
- CFIndex nextMappedIndex = m_stringLength;
- for (size_t j = indexAt(i) + 1; j < m_stringLength; ++j) {
- if (mappedIndices[j]) {
- nextMappedIndex = j;
- break;
- }
- }
- m_glyphEndOffsets[i] = nextMappedIndex;
- }
-}
-
-void ComplexTextController::advance(unsigned offset, GlyphBuffer* glyphBuffer)
-{
- if (static_cast<int>(offset) > m_end)
- offset = m_end;
-
- if (offset <= m_currentCharacter)
- return;
-
- m_currentCharacter = offset;
-
- size_t runCount = m_complexTextRuns.size();
-
- bool ltr = m_run.ltr();
-
- unsigned k = ltr ? m_numGlyphsSoFar : m_adjustedGlyphs.size() - 1 - m_numGlyphsSoFar;
- while (m_currentRun < runCount) {
- const ComplexTextRun& complexTextRun = *m_complexTextRuns[ltr ? m_currentRun : runCount - 1 - m_currentRun];
- size_t glyphCount = complexTextRun.glyphCount();
- unsigned g = ltr ? m_glyphInCurrentRun : glyphCount - 1 - m_glyphInCurrentRun;
- while (m_glyphInCurrentRun < glyphCount) {
- unsigned glyphStartOffset = complexTextRun.indexAt(g);
- unsigned glyphEndOffset;
- if (complexTextRun.isMonotonic()) {
- if (ltr)
- glyphEndOffset = max<unsigned>(glyphStartOffset, g + 1 < glyphCount ? static_cast<unsigned>(complexTextRun.indexAt(g + 1)) : complexTextRun.stringLength());
- else
- glyphEndOffset = max<unsigned>(glyphStartOffset, g > 0 ? static_cast<unsigned>(complexTextRun.indexAt(g - 1)) : complexTextRun.stringLength());
- } else
- glyphEndOffset = complexTextRun.endOffsetAt(g);
-
- CGSize adjustedAdvance = m_adjustedAdvances[k];
-
- if (glyphStartOffset + complexTextRun.stringLocation() >= m_currentCharacter)
- return;
-
- if (glyphBuffer && !m_characterInCurrentGlyph)
- glyphBuffer->add(m_adjustedGlyphs[k], complexTextRun.fontData(), adjustedAdvance);
-
- unsigned oldCharacterInCurrentGlyph = m_characterInCurrentGlyph;
- m_characterInCurrentGlyph = min(m_currentCharacter - complexTextRun.stringLocation(), glyphEndOffset) - glyphStartOffset;
- // FIXME: Instead of dividing the glyph's advance equially between the characters, this
- // could use the glyph's "ligature carets". However, there is no Core Text API to get the
- // ligature carets.
- if (glyphStartOffset == glyphEndOffset) {
- // When there are multiple glyphs per character we need to advance by the full width of the glyph.
- ASSERT(m_characterInCurrentGlyph == oldCharacterInCurrentGlyph);
- m_runWidthSoFar += adjustedAdvance.width;
- } else
- m_runWidthSoFar += adjustedAdvance.width * (m_characterInCurrentGlyph - oldCharacterInCurrentGlyph) / (glyphEndOffset - glyphStartOffset);
-
- if (glyphEndOffset + complexTextRun.stringLocation() > m_currentCharacter)
- return;
-
- m_numGlyphsSoFar++;
- m_glyphInCurrentRun++;
- m_characterInCurrentGlyph = 0;
- if (ltr) {
- g++;
- k++;
- } else {
- g--;
- k--;
- }
- }
- m_currentRun++;
- m_glyphInCurrentRun = 0;
- }
- if (!ltr && m_numGlyphsSoFar == m_adjustedAdvances.size())
- m_runWidthSoFar += m_finalRoundingWidth;
-}
-
-void ComplexTextController::adjustGlyphsAndAdvances()
-{
- CGFloat widthSinceLastRounding = 0;
- size_t runCount = m_complexTextRuns.size();
- for (size_t r = 0; r < runCount; ++r) {
- ComplexTextRun& complexTextRun = *m_complexTextRuns[r];
- unsigned glyphCount = complexTextRun.glyphCount();
- const SimpleFontData* fontData = complexTextRun.fontData();
-
- const CGGlyph* glyphs = complexTextRun.glyphs();
- const CGSize* advances = complexTextRun.advances();
-
- bool lastRun = r + 1 == runCount;
- const UChar* cp = complexTextRun.characters();
- CGFloat roundedSpaceWidth = roundCGFloat(fontData->spaceWidth());
- bool roundsAdvances = !m_font.isPrinterFont() && fontData->platformData().roundsGlyphAdvances();
- bool hasExtraSpacing = (m_font.letterSpacing() || m_font.wordSpacing() || m_padding) && !m_run.spacingDisabled();
- CGPoint glyphOrigin = CGPointZero;
- CFIndex lastCharacterIndex = m_run.ltr() ? numeric_limits<CFIndex>::min() : numeric_limits<CFIndex>::max();
- bool isMonotonic = true;
-
- for (unsigned i = 0; i < glyphCount; i++) {
- CFIndex characterIndex = complexTextRun.indexAt(i);
- if (m_run.ltr()) {
- if (characterIndex < lastCharacterIndex)
- isMonotonic = false;
- } else {
- if (characterIndex > lastCharacterIndex)
- isMonotonic = false;
- }
- UChar ch = *(cp + characterIndex);
- bool lastGlyph = lastRun && i + 1 == glyphCount;
- UChar nextCh;
- if (lastGlyph)
- nextCh = ' ';
- else if (i + 1 < glyphCount)
- nextCh = *(cp + complexTextRun.indexAt(i + 1));
- else
- nextCh = *(m_complexTextRuns[r + 1]->characters() + m_complexTextRuns[r + 1]->indexAt(0));
-
- bool treatAsSpace = Font::treatAsSpace(ch);
- CGGlyph glyph = treatAsSpace ? fontData->spaceGlyph() : glyphs[i];
- CGSize advance = treatAsSpace ? CGSizeMake(fontData->spaceWidth(), advances[i].height) : advances[i];
-
- if (ch == '\t' && m_run.allowTabs()) {
- float tabWidth = m_font.tabWidth(*fontData);
- advance.width = tabWidth - fmodf(m_run.xPos() + m_totalWidth + widthSinceLastRounding, tabWidth);
- } else if (ch == zeroWidthSpace || (Font::treatAsZeroWidthSpace(ch) && !treatAsSpace)) {
- advance.width = 0;
- glyph = fontData->spaceGlyph();
- }
-
- float roundedAdvanceWidth = roundf(advance.width);
- if (roundsAdvances)
- advance.width = roundedAdvanceWidth;
-
- advance.width += fontData->syntheticBoldOffset();
-
- // 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 glyphs that
- // match the width of the space glyph have the same width as the space glyph.
- if (roundedAdvanceWidth == roundedSpaceWidth && (fontData->pitch() == FixedPitch || glyph == fontData->spaceGlyph()) && m_run.applyWordRounding())
- advance.width = fontData->adjustedSpaceWidth();
-
- if (hasExtraSpacing) {
- // If we're a glyph with an advance, go ahead and add in letter-spacing.
- // That way we weed out zero width lurkers. This behavior matches the fast text code path.
- if (advance.width && m_font.letterSpacing())
- advance.width += m_font.letterSpacing();
-
- // Handle justification and word-spacing.
- if (treatAsSpace) {
- // Account for padding. WebCore uses space padding to justify text.
- // We distribute the specified padding over the available spaces in the run.
- if (m_padding) {
- // Use leftover padding if not evenly divisible by number of spaces.
- if (m_padding < m_padPerSpace) {
- advance.width += m_padding;
- m_padding = 0;
- } else {
- float previousPadding = m_padding;
- m_padding -= m_padPerSpace;
- advance.width += roundf(previousPadding) - roundf(m_padding);
- }
- }
-
- // Account for word-spacing.
- if (characterIndex > 0 && !Font::treatAsSpace(*m_run.data(characterIndex - 1)) && m_font.wordSpacing())
- advance.width += m_font.wordSpacing();
- }
- }
-
- // Deal with the float/integer impedance mismatch between CG and WebCore. "Words" (characters
- // followed by a character defined by isRoundingHackCharacter()) are always an integer width.
- // We adjust the width of the last character of a "word" to ensure an integer width.
- // Force characters that are used to determine word boundaries for the rounding hack
- // to be integer width, so the following words will start on an integer boundary.
- if (m_run.applyWordRounding() && Font::isRoundingHackCharacter(ch))
- advance.width = ceilCGFloat(advance.width);
-
- // Check to see if the next character is a "rounding hack character", if so, adjust the
- // width so that the total run width will be on an integer boundary.
- if ((m_run.applyWordRounding() && !lastGlyph && Font::isRoundingHackCharacter(nextCh)) || (m_run.applyRunRounding() && lastGlyph)) {
- CGFloat totalWidth = widthSinceLastRounding + advance.width;
- widthSinceLastRounding = ceilCGFloat(totalWidth);
- CGFloat extraWidth = widthSinceLastRounding - totalWidth;
- if (m_run.ltr())
- advance.width += extraWidth;
- else {
- if (m_lastRoundingGlyph)
- m_adjustedAdvances[m_lastRoundingGlyph - 1].width += extraWidth;
- else
- m_finalRoundingWidth = extraWidth;
- m_lastRoundingGlyph = m_adjustedAdvances.size() + 1;
- }
- m_totalWidth += widthSinceLastRounding;
- widthSinceLastRounding = 0;
- } else
- widthSinceLastRounding += advance.width;
-
- // FIXME: Combining marks should receive a text emphasis mark if they are combine with a space.
- if (m_forTextEmphasis && (!Font::canReceiveTextEmphasis(ch) || (U_GET_GC_MASK(ch) & U_GC_M_MASK)))
- glyph = 0;
-
- advance.height *= -1;
- m_adjustedAdvances.append(advance);
- m_adjustedGlyphs.append(glyph);
-
- FloatRect glyphBounds = fontData->boundsForGlyph(glyph);
- glyphBounds.move(glyphOrigin.x, glyphOrigin.y);
- m_minGlyphBoundingBoxX = min(m_minGlyphBoundingBoxX, glyphBounds.x());
- m_maxGlyphBoundingBoxX = max(m_maxGlyphBoundingBoxX, glyphBounds.right());
- m_minGlyphBoundingBoxY = min(m_minGlyphBoundingBoxY, glyphBounds.y());
- m_maxGlyphBoundingBoxY = max(m_maxGlyphBoundingBoxY, glyphBounds.bottom());
- glyphOrigin.x += advance.width;
- glyphOrigin.y += advance.height;
-
- lastCharacterIndex = characterIndex;
- }
- if (!isMonotonic)
- complexTextRun.setIsNonMonotonic();
- }
- m_totalWidth += widthSinceLastRounding;
-}
-
-} // namespace WebCore
diff --git a/WebCore/platform/graphics/mac/ComplexTextController.h b/WebCore/platform/graphics/mac/ComplexTextController.h
deleted file mode 100644
index 9cf80a6..0000000
--- a/WebCore/platform/graphics/mac/ComplexTextController.h
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef ComplexTextController_h
-#define ComplexTextController_h
-
-#include <ApplicationServices/ApplicationServices.h>
-#include "GlyphBuffer.h"
-#include <wtf/HashSet.h>
-#include <wtf/PassRefPtr.h>
-#include <wtf/RefCounted.h>
-#include <wtf/RetainPtr.h>
-#include <wtf/Vector.h>
-#include <wtf/unicode/Unicode.h>
-
-namespace WebCore {
-
-class Font;
-class SimpleFontData;
-class TextRun;
-
-// ComplexTextController is responsible for rendering and measuring glyphs for
-// complex scripts on OS X.
-// The underlying API can be selected at compile time based on USE(ATSUI) and
-// USE(CORE_TEXT). If both are defined then the Core Text APIs are used for
-// OS Versions >= 10.6, ATSUI is used otherwise.
-class ComplexTextController {
-public:
- ComplexTextController(const Font*, const TextRun&, bool mayUseNaturalWritingDirection = false, HashSet<const SimpleFontData*>* fallbackFonts = 0, bool forTextEmphasis = false);
-
- // Advance and emit glyphs up to the specified character.
- void advance(unsigned to, GlyphBuffer* = 0);
-
- // Compute the character offset for a given x coordinate.
- int offsetForPosition(float x, bool includePartialGlyphs);
-
- // Returns the width of everything we've consumed so far.
- float runWidthSoFar() const { return m_runWidthSoFar; }
-
- float totalWidth() const { return m_totalWidth; }
-
- // Extra width to the left of the leftmost glyph.
- float finalRoundingWidth() const { return m_finalRoundingWidth; }
-
- float minGlyphBoundingBoxX() const { return m_minGlyphBoundingBoxX; }
- float maxGlyphBoundingBoxX() const { return m_maxGlyphBoundingBoxX; }
- float minGlyphBoundingBoxY() const { return m_minGlyphBoundingBoxY; }
- float maxGlyphBoundingBoxY() const { return m_maxGlyphBoundingBoxY; }
-
-private:
- class ComplexTextRun : public RefCounted<ComplexTextRun> {
- public:
-#if USE(CORE_TEXT)
- static PassRefPtr<ComplexTextRun> create(CTRunRef ctRun, const SimpleFontData* fontData, const UChar* characters, unsigned stringLocation, size_t stringLength)
- {
- return adoptRef(new ComplexTextRun(ctRun, fontData, characters, stringLocation, stringLength));
- }
-#endif
-#if USE(ATSUI)
- static PassRefPtr<ComplexTextRun> create(ATSUTextLayout atsuTextLayout, const SimpleFontData* fontData, const UChar* characters, unsigned stringLocation, size_t stringLength, bool ltr, bool directionalOverride)
- {
- return adoptRef(new ComplexTextRun(atsuTextLayout, fontData, characters, stringLocation, stringLength, ltr, directionalOverride));
- }
-#endif
- static PassRefPtr<ComplexTextRun> create(const SimpleFontData* fontData, const UChar* characters, unsigned stringLocation, size_t stringLength, bool ltr)
- {
- return adoptRef(new ComplexTextRun(fontData, characters, stringLocation, stringLength, ltr));
- }
-
- unsigned glyphCount() const { return m_glyphCount; }
- const SimpleFontData* fontData() const { return m_fontData; }
- const UChar* characters() const { return m_characters; }
- unsigned stringLocation() const { return m_stringLocation; }
- size_t stringLength() const { return m_stringLength; }
- ALWAYS_INLINE CFIndex indexAt(size_t i) const;
- CFIndex endOffsetAt(size_t i) const { ASSERT(!m_isMonotonic); return m_glyphEndOffsets[i]; }
- const CGGlyph* glyphs() const { return m_glyphs; }
- const CGSize* advances() const { return m_advances; }
- bool isMonotonic() const { return m_isMonotonic; }
- void setIsNonMonotonic();
-
- private:
-#if USE(CORE_TEXT)
- ComplexTextRun(CTRunRef, const SimpleFontData*, const UChar* characters, unsigned stringLocation, size_t stringLength);
- void createTextRunFromFontDataCoreText(bool ltr);
-#endif
-#if USE(ATSUI)
- ComplexTextRun(ATSUTextLayout, const SimpleFontData*, const UChar* characters, unsigned stringLocation, size_t stringLength, bool ltr, bool directionalOverride);
- void createTextRunFromFontDataATSUI(bool ltr);
-#endif
- ComplexTextRun(const SimpleFontData*, const UChar* characters, unsigned stringLocation, size_t stringLength, bool ltr);
-
-#if USE(ATSUI)
-#ifdef BUILDING_ON_TIGER
- typedef UInt32 URefCon;
-#endif
- static OSStatus overrideLayoutOperation(ATSULayoutOperationSelector, ATSULineRef, URefCon, void*, ATSULayoutOperationCallbackStatus*);
-#endif
-
-#if USE(CORE_TEXT)
- RetainPtr<CTRunRef> m_coreTextRun;
-#endif
- unsigned m_glyphCount;
- const SimpleFontData* m_fontData;
- const UChar* m_characters;
- unsigned m_stringLocation;
- size_t m_stringLength;
-#if USE(CORE_TEXT)
- Vector<CFIndex, 64> m_coreTextIndicesVector;
- const CFIndex* m_coreTextIndices;
-#endif
-#if USE(ATSUI)
- Vector<CFIndex, 64> m_atsuiIndices;
-#endif
- Vector<CFIndex, 64> m_glyphEndOffsets;
- Vector<CGGlyph, 64> m_glyphsVector;
- const CGGlyph* m_glyphs;
- Vector<CGSize, 64> m_advancesVector;
- const CGSize* m_advances;
-#if USE(ATSUI)
- bool m_directionalOverride;
-#endif
- bool m_isMonotonic;
- };
-
- void collectComplexTextRuns();
-
- // collectComplexTextRunsForCharacters() is a stub function that calls through to the ATSUI or Core Text variants based
- // on the API in use.
- void collectComplexTextRunsForCharacters(const UChar*, unsigned length, unsigned stringLocation, const SimpleFontData*);
- void collectComplexTextRunsForCharactersATSUI(const UChar*, unsigned length, unsigned stringLocation, const SimpleFontData*);
- void collectComplexTextRunsForCharactersCoreText(const UChar*, unsigned length, unsigned stringLocation, const SimpleFontData*);
- void adjustGlyphsAndAdvances();
-
- const Font& m_font;
- const TextRun& m_run;
- bool m_mayUseNaturalWritingDirection;
- bool m_forTextEmphasis;
-
- Vector<UChar, 256> m_smallCapsBuffer;
-
- Vector<RefPtr<ComplexTextRun>, 16> m_complexTextRuns;
- Vector<CGSize, 256> m_adjustedAdvances;
- Vector<CGGlyph, 256> m_adjustedGlyphs;
-
- unsigned m_currentCharacter;
- int m_end;
-
- CGFloat m_totalWidth;
-
- float m_runWidthSoFar;
- unsigned m_numGlyphsSoFar;
- size_t m_currentRun;
- unsigned m_glyphInCurrentRun;
- unsigned m_characterInCurrentGlyph;
- float m_finalRoundingWidth;
- float m_padding;
- float m_padPerSpace;
-
- HashSet<const SimpleFontData*>* m_fallbackFonts;
-
- float m_minGlyphBoundingBoxX;
- float m_maxGlyphBoundingBoxX;
- float m_minGlyphBoundingBoxY;
- float m_maxGlyphBoundingBoxY;
-
- unsigned m_lastRoundingGlyph;
-};
-
-} // namespace WebCore
-
-#endif // ComplexTextController_h
diff --git a/WebCore/platform/graphics/mac/ComplexTextControllerATSUI.cpp b/WebCore/platform/graphics/mac/ComplexTextControllerATSUI.cpp
deleted file mode 100644
index c24a914..0000000
--- a/WebCore/platform/graphics/mac/ComplexTextControllerATSUI.cpp
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
- * (C) 1999 Antti Koivisto (koivisto@kde.org)
- * (C) 2000 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "config.h"
-#include "ComplexTextController.h"
-
-#if USE(ATSUI)
-
-#include "CharacterNames.h"
-#include "Font.h"
-#include "ShapeArabic.h"
-
-#ifdef __LP64__
-// ATSUTextInserted() is SPI in 64-bit.
-extern "C" {
-OSStatus ATSUTextInserted(ATSUTextLayout iTextLayout, UniCharArrayOffset iInsertionLocation, UniCharCount iInsertionLength);
-}
-#endif
-
-using namespace WTF::Unicode;
-
-namespace WebCore {
-
-OSStatus ComplexTextController::ComplexTextRun::overrideLayoutOperation(ATSULayoutOperationSelector, ATSULineRef atsuLineRef, URefCon refCon, void*, ATSULayoutOperationCallbackStatus* callbackStatus)
-{
- ComplexTextRun* complexTextRun = reinterpret_cast<ComplexTextRun*>(refCon);
- OSStatus status;
- ItemCount count;
- ATSLayoutRecord* layoutRecords;
-
- status = ATSUDirectGetLayoutDataArrayPtrFromLineRef(atsuLineRef, kATSUDirectDataLayoutRecordATSLayoutRecordCurrent, true, reinterpret_cast<void**>(&layoutRecords), &count);
- if (status != noErr) {
- *callbackStatus = kATSULayoutOperationCallbackStatusContinue;
- return status;
- }
-
- count--;
- ItemCount j = 0;
- CFIndex indexOffset = 0;
-
- if (complexTextRun->m_directionalOverride) {
- j++;
- count -= 2;
- indexOffset = -1;
- }
-
- complexTextRun->m_glyphCount = count;
- complexTextRun->m_glyphsVector.reserveCapacity(count);
- complexTextRun->m_advancesVector.reserveCapacity(count);
- complexTextRun->m_atsuiIndices.reserveCapacity(count);
-
- bool atBeginning = true;
- CGFloat lastX = 0;
-
- for (ItemCount i = 0; i < count; ++i, ++j) {
- if (layoutRecords[j].glyphID == kATSDeletedGlyphcode) {
- complexTextRun->m_glyphCount--;
- continue;
- }
- complexTextRun->m_glyphsVector.uncheckedAppend(layoutRecords[j].glyphID);
- complexTextRun->m_atsuiIndices.uncheckedAppend(layoutRecords[j].originalOffset / 2 + indexOffset);
- CGFloat x = FixedToFloat(layoutRecords[j].realPos);
- if (!atBeginning)
- complexTextRun->m_advancesVector.uncheckedAppend(CGSizeMake(x - lastX, 0));
- lastX = x;
- atBeginning = false;
- }
-
- complexTextRun->m_advancesVector.uncheckedAppend(CGSizeMake(FixedToFloat(layoutRecords[j].realPos) - lastX, 0));
-
- complexTextRun->m_glyphs = complexTextRun->m_glyphsVector.data();
- complexTextRun->m_advances = complexTextRun->m_advancesVector.data();
-
- status = ATSUDirectReleaseLayoutDataArrayPtr(atsuLineRef, kATSUDirectDataLayoutRecordATSLayoutRecordCurrent, reinterpret_cast<void**>(&layoutRecords));
- *callbackStatus = kATSULayoutOperationCallbackStatusContinue;
- return noErr;
-}
-
-static inline bool isArabicLamWithAlefLigature(UChar c)
-{
- return c >= 0xfef5 && c <= 0xfefc;
-}
-
-static void shapeArabic(const UChar* source, UChar* dest, unsigned totalLength)
-{
- unsigned shapingStart = 0;
- while (shapingStart < totalLength) {
- unsigned shapingEnd;
- // We do not want to pass a Lam with Alef ligature followed by a space to the shaper,
- // since we want to be able to identify this sequence as the result of shaping a Lam
- // followed by an Alef and padding with a space.
- bool foundLigatureSpace = false;
- for (shapingEnd = shapingStart; !foundLigatureSpace && shapingEnd < totalLength - 1; ++shapingEnd)
- foundLigatureSpace = isArabicLamWithAlefLigature(source[shapingEnd]) && source[shapingEnd + 1] == ' ';
- shapingEnd++;
-
- UErrorCode shapingError = U_ZERO_ERROR;
- unsigned charsWritten = shapeArabic(source + shapingStart, shapingEnd - shapingStart, dest + shapingStart, shapingEnd - shapingStart, U_SHAPE_LETTERS_SHAPE | U_SHAPE_LENGTH_FIXED_SPACES_NEAR, &shapingError);
-
- if (U_SUCCESS(shapingError) && charsWritten == shapingEnd - shapingStart) {
- for (unsigned j = shapingStart; j < shapingEnd - 1; ++j) {
- if (isArabicLamWithAlefLigature(dest[j]) && dest[j + 1] == ' ')
- dest[++j] = zeroWidthSpace;
- }
- if (foundLigatureSpace) {
- dest[shapingEnd] = ' ';
- shapingEnd++;
- } else if (isArabicLamWithAlefLigature(dest[shapingEnd - 1])) {
- // u_shapeArabic quirk: if the last two characters in the source string are a Lam and an Alef,
- // the space is put at the beginning of the string, despite U_SHAPE_LENGTH_FIXED_SPACES_NEAR.
- ASSERT(dest[shapingStart] == ' ');
- dest[shapingStart] = zeroWidthSpace;
- }
- } else {
- // Something went wrong. Abandon shaping and just copy the rest of the buffer.
- LOG_ERROR("u_shapeArabic failed(%d)", shapingError);
- shapingEnd = totalLength;
- memcpy(dest + shapingStart, source + shapingStart, (shapingEnd - shapingStart) * sizeof(UChar));
- }
- shapingStart = shapingEnd;
- }
-}
-
-ComplexTextController::ComplexTextRun::ComplexTextRun(ATSUTextLayout atsuTextLayout, const SimpleFontData* fontData, const UChar* characters, unsigned stringLocation, size_t stringLength, bool ltr, bool directionalOverride)
- : m_fontData(fontData)
- , m_characters(characters)
- , m_stringLocation(stringLocation)
- , m_stringLength(stringLength)
- , m_directionalOverride(directionalOverride)
- , m_isMonotonic(true)
-{
- OSStatus status;
-
- status = ATSUSetTextLayoutRefCon(atsuTextLayout, reinterpret_cast<URefCon>(this));
-
- ATSLineLayoutOptions lineLayoutOptions = kATSLineKeepSpacesOutOfMargin | kATSLineHasNoHangers;
-
- Boolean rtl = !ltr;
-
- Vector<UChar, 256> substituteCharacters;
- bool shouldCheckForMirroring = !ltr && !fontData->m_ATSUMirrors;
- bool shouldCheckForArabic = !fontData->shapesArabic();
- bool shouldShapeArabic = false;
-
- bool mirrored = false;
- for (size_t i = 0; i < stringLength; ++i) {
- if (shouldCheckForMirroring) {
- UChar mirroredChar = u_charMirror(characters[i]);
- if (mirroredChar != characters[i]) {
- if (!mirrored) {
- mirrored = true;
- substituteCharacters.grow(stringLength);
- memcpy(substituteCharacters.data(), characters, stringLength * sizeof(UChar));
- ATSUTextMoved(atsuTextLayout, substituteCharacters.data());
- }
- substituteCharacters[i] = mirroredChar;
- }
- }
- if (shouldCheckForArabic && isArabicChar(characters[i])) {
- shouldCheckForArabic = false;
- shouldShapeArabic = true;
- }
- }
-
- if (shouldShapeArabic) {
- Vector<UChar, 256> shapedArabic(stringLength);
- shapeArabic(substituteCharacters.isEmpty() ? characters : substituteCharacters.data(), shapedArabic.data(), stringLength);
- substituteCharacters.swap(shapedArabic);
- ATSUTextMoved(atsuTextLayout, substituteCharacters.data());
- }
-
- if (directionalOverride) {
- UChar override = ltr ? leftToRightOverride : rightToLeftOverride;
- if (substituteCharacters.isEmpty()) {
- substituteCharacters.grow(stringLength + 2);
- substituteCharacters[0] = override;
- memcpy(substituteCharacters.data() + 1, characters, stringLength * sizeof(UChar));
- substituteCharacters[stringLength + 1] = popDirectionalFormatting;
- ATSUTextMoved(atsuTextLayout, substituteCharacters.data());
- } else {
- substituteCharacters.prepend(override);
- substituteCharacters.append(popDirectionalFormatting);
- }
- ATSUTextInserted(atsuTextLayout, 0, 2);
- }
-
- ATSULayoutOperationOverrideSpecifier overrideSpecifier;
- overrideSpecifier.operationSelector = kATSULayoutOperationPostLayoutAdjustment;
- overrideSpecifier.overrideUPP = overrideLayoutOperation;
-
- ATSUAttributeTag tags[] = { kATSULineLayoutOptionsTag, kATSULineDirectionTag, kATSULayoutOperationOverrideTag };
- ByteCount sizes[] = { sizeof(ATSLineLayoutOptions), sizeof(Boolean), sizeof(ATSULayoutOperationOverrideSpecifier) };
- ATSUAttributeValuePtr values[] = { &lineLayoutOptions, &rtl, &overrideSpecifier };
-
- status = ATSUSetLayoutControls(atsuTextLayout, 3, tags, sizes, values);
-
- ItemCount boundsCount;
- status = ATSUGetGlyphBounds(atsuTextLayout, 0, 0, 0, m_stringLength, kATSUseFractionalOrigins, 0, 0, &boundsCount);
-
- status = ATSUDisposeTextLayout(atsuTextLayout);
-}
-
-void ComplexTextController::ComplexTextRun::createTextRunFromFontDataATSUI(bool ltr)
-{
- m_atsuiIndices.reserveCapacity(m_stringLength);
- unsigned r = 0;
- while (r < m_stringLength) {
- m_atsuiIndices.uncheckedAppend(r);
- if (U_IS_SURROGATE(m_characters[r])) {
- ASSERT(r + 1 < m_stringLength);
- ASSERT(U_IS_SURROGATE_LEAD(m_characters[r]));
- ASSERT(U_IS_TRAIL(m_characters[r + 1]));
- r += 2;
- } else
- r++;
- }
- m_glyphCount = m_atsuiIndices.size();
- if (!ltr) {
- for (unsigned r = 0, end = m_glyphCount - 1; r < m_glyphCount / 2; ++r, --end)
- std::swap(m_atsuiIndices[r], m_atsuiIndices[end]);
- }
-
- m_glyphsVector.fill(0, m_glyphCount);
- m_glyphs = m_glyphsVector.data();
- m_advancesVector.fill(CGSizeMake(m_fontData->widthForGlyph(0), 0), m_glyphCount);
- m_advances = m_advancesVector.data();
-}
-
-static bool fontHasMirroringInfo(ATSUFontID fontID)
-{
- ByteCount propTableSize;
- OSStatus status = ATSFontGetTable(fontID, 'prop', 0, 0, 0, &propTableSize);
- if (status == noErr) // naively assume that if a 'prop' table exists then it contains mirroring info
- return true;
- else if (status != kATSInvalidFontTableAccess) // anything other than a missing table is logged as an error
- LOG_ERROR("ATSFontGetTable failed (%d)", static_cast<int>(status));
-
- return false;
-}
-
-static void disableLigatures(const SimpleFontData* fontData, ATSUStyle atsuStyle, TypesettingFeatures typesettingFeatures)
-{
- // Don't be too aggressive: if the font doesn't contain 'a', then assume that any ligatures it contains are
- // in characters that always go through ATSUI, and therefore allow them. Geeza Pro is an example.
- // See bugzilla 5166.
- if ((typesettingFeatures & Ligatures) || (fontData->orientation() == Horizontal && fontData->platformData().allowsLigatures()))
- return;
-
- ATSUFontFeatureType featureTypes[] = { kLigaturesType };
- ATSUFontFeatureSelector featureSelectors[] = { kCommonLigaturesOffSelector };
- OSStatus status = ATSUSetFontFeatures(atsuStyle, 1, featureTypes, featureSelectors);
- if (status != noErr)
- LOG_ERROR("ATSUSetFontFeatures failed (%d) -- ligatures remain enabled", static_cast<int>(status));
-}
-
-static ATSUStyle initializeATSUStyle(const SimpleFontData* fontData, TypesettingFeatures typesettingFeatures)
-{
- unsigned key = typesettingFeatures + 1;
- pair<HashMap<unsigned, ATSUStyle>::iterator, bool> addResult = fontData->m_ATSUStyleMap.add(key, 0);
- ATSUStyle& atsuStyle = addResult.first->second;
- if (!addResult.second)
- return atsuStyle;
-
- ATSUFontID fontID = fontData->platformData().ctFont() ? CTFontGetPlatformFont(fontData->platformData().ctFont(), 0) : 0;
- if (!fontID) {
- LOG_ERROR("unable to get ATSUFontID for %p", fontData->platformData().font());
- fontData->m_ATSUStyleMap.remove(addResult.first);
- return 0;
- }
-
- OSStatus status = ATSUCreateStyle(&atsuStyle);
- if (status != noErr)
- LOG_ERROR("ATSUCreateStyle failed (%d)", static_cast<int>(status));
-
- Fixed fontSize = FloatToFixed(fontData->platformData().m_size);
- Fract kerningInhibitFactor = FloatToFract(1);
- static CGAffineTransform verticalFlip = CGAffineTransformMakeScale(1, -1);
-
- ByteCount styleSizes[4] = { sizeof(fontSize), sizeof(fontID), sizeof(verticalFlip), sizeof(kerningInhibitFactor) };
- ATSUAttributeTag styleTags[4] = { kATSUSizeTag, kATSUFontTag, kATSUFontMatrixTag, kATSUKerningInhibitFactorTag };
- ATSUAttributeValuePtr styleValues[4] = { &fontSize, &fontID, &verticalFlip, &kerningInhibitFactor };
-
- bool allowKerning = typesettingFeatures & Kerning;
- status = ATSUSetAttributes(atsuStyle, allowKerning ? 3 : 4, styleTags, styleSizes, styleValues);
- if (status != noErr)
- LOG_ERROR("ATSUSetAttributes failed (%d)", static_cast<int>(status));
-
- fontData->m_ATSUMirrors = fontHasMirroringInfo(fontID);
-
- disableLigatures(fontData, atsuStyle, typesettingFeatures);
- return atsuStyle;
-}
-
-void ComplexTextController::collectComplexTextRunsForCharactersATSUI(const UChar* cp, unsigned length, unsigned stringLocation, const SimpleFontData* fontData)
-{
- if (!fontData) {
- // Create a run of missing glyphs from the primary font.
- m_complexTextRuns.append(ComplexTextRun::create(m_font.primaryFont(), cp, stringLocation, length, m_run.ltr()));
- return;
- }
-
- if (m_fallbackFonts && fontData != m_font.primaryFont())
- m_fallbackFonts->add(fontData);
-
- ATSUStyle atsuStyle = initializeATSUStyle(fontData, m_font.typesettingFeatures());
-
- OSStatus status;
- ATSUTextLayout atsuTextLayout;
- UniCharCount runLength = length;
-
- status = ATSUCreateTextLayoutWithTextPtr(cp, 0, length, length, 1, &runLength, &atsuStyle, &atsuTextLayout);
- if (status != noErr) {
- LOG_ERROR("ATSUCreateTextLayoutWithTextPtr failed with error %d", static_cast<int>(status));
- return;
- }
- m_complexTextRuns.append(ComplexTextRun::create(atsuTextLayout, fontData, cp, stringLocation, length, m_run.ltr(), m_run.directionalOverride()));
-}
-
-} // namespace WebCore
-
-#endif // USE(ATSUI)
diff --git a/WebCore/platform/graphics/mac/ComplexTextControllerCoreText.cpp b/WebCore/platform/graphics/mac/ComplexTextControllerCoreText.cpp
deleted file mode 100644
index 42e7897..0000000
--- a/WebCore/platform/graphics/mac/ComplexTextControllerCoreText.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "ComplexTextController.h"
-#include "WebCoreSystemInterface.h"
-
-#if USE(CORE_TEXT)
-
-#include "Font.h"
-
-#if defined(BUILDING_ON_LEOPARD)
-// The following symbols are SPI in 10.5.
-extern "C" {
-void CTRunGetAdvances(CTRunRef run, CFRange range, CGSize buffer[]);
-const CGSize* CTRunGetAdvancesPtr(CTRunRef run);
-extern const CFStringRef kCTTypesetterOptionForcedEmbeddingLevel;
-}
-#endif
-
-namespace WebCore {
-
-ComplexTextController::ComplexTextRun::ComplexTextRun(CTRunRef ctRun, const SimpleFontData* fontData, const UChar* characters, unsigned stringLocation, size_t stringLength)
- : m_coreTextRun(ctRun)
- , m_fontData(fontData)
- , m_characters(characters)
- , m_stringLocation(stringLocation)
- , m_stringLength(stringLength)
- , m_isMonotonic(true)
-{
- m_glyphCount = CTRunGetGlyphCount(m_coreTextRun.get());
- m_coreTextIndices = CTRunGetStringIndicesPtr(m_coreTextRun.get());
- if (!m_coreTextIndices) {
- m_coreTextIndicesVector.grow(m_glyphCount);
- CTRunGetStringIndices(m_coreTextRun.get(), CFRangeMake(0, 0), m_coreTextIndicesVector.data());
- m_coreTextIndices = m_coreTextIndicesVector.data();
- }
-
- m_glyphs = CTRunGetGlyphsPtr(m_coreTextRun.get());
- if (!m_glyphs) {
- m_glyphsVector.grow(m_glyphCount);
- CTRunGetGlyphs(m_coreTextRun.get(), CFRangeMake(0, 0), m_glyphsVector.data());
- m_glyphs = m_glyphsVector.data();
- }
-
- m_advances = CTRunGetAdvancesPtr(m_coreTextRun.get());
- if (!m_advances) {
- m_advancesVector.grow(m_glyphCount);
- CTRunGetAdvances(m_coreTextRun.get(), CFRangeMake(0, 0), m_advancesVector.data());
- m_advances = m_advancesVector.data();
- }
-}
-
-// Missing glyphs run constructor. Core Text will not generate a run of missing glyphs, instead falling back on
-// glyphs from LastResort. We want to use the primary font's missing glyph in order to match the fast text code path.
-void ComplexTextController::ComplexTextRun::createTextRunFromFontDataCoreText(bool ltr)
-{
- m_coreTextIndicesVector.reserveInitialCapacity(m_stringLength);
- unsigned r = 0;
- while (r < m_stringLength) {
- m_coreTextIndicesVector.uncheckedAppend(r);
- if (U_IS_SURROGATE(m_characters[r])) {
- ASSERT(r + 1 < m_stringLength);
- ASSERT(U_IS_SURROGATE_LEAD(m_characters[r]));
- ASSERT(U_IS_TRAIL(m_characters[r + 1]));
- r += 2;
- } else
- r++;
- }
- m_glyphCount = m_coreTextIndicesVector.size();
- if (!ltr) {
- for (unsigned r = 0, end = m_glyphCount - 1; r < m_glyphCount / 2; ++r, --end)
- std::swap(m_coreTextIndicesVector[r], m_coreTextIndicesVector[end]);
- }
- m_coreTextIndices = m_coreTextIndicesVector.data();
-
- // Synthesize a run of missing glyphs.
- m_glyphsVector.fill(0, m_glyphCount);
- m_glyphs = m_glyphsVector.data();
- m_advancesVector.fill(CGSizeMake(m_fontData->widthForGlyph(0), 0), m_glyphCount);
- m_advances = m_advancesVector.data();
-}
-
-struct ProviderInfo {
- const UChar* cp;
- unsigned length;
- CFDictionaryRef attributes;
-};
-
-static const UniChar* provideStringAndAttributes(CFIndex stringIndex, CFIndex* charCount, CFDictionaryRef* attributes, void* refCon)
-{
- ProviderInfo* info = static_cast<struct ProviderInfo*>(refCon);
- if (stringIndex < 0 || static_cast<unsigned>(stringIndex) >= info->length)
- return 0;
-
- *charCount = info->length - stringIndex;
- *attributes = info->attributes;
- return info->cp + stringIndex;
-}
-
-void ComplexTextController::collectComplexTextRunsForCharactersCoreText(const UChar* cp, unsigned length, unsigned stringLocation, const SimpleFontData* fontData)
-{
- if (!fontData) {
- // Create a run of missing glyphs from the primary font.
- m_complexTextRuns.append(ComplexTextRun::create(m_font.primaryFont(), cp, stringLocation, length, m_run.ltr()));
- return;
- }
-
- if (m_fallbackFonts && fontData != m_font.primaryFont())
- m_fallbackFonts->add(fontData);
-
- RetainPtr<CTLineRef> line;
-
- if (!m_mayUseNaturalWritingDirection || m_run.directionalOverride()) {
- static const void* optionKeys[] = { kCTTypesetterOptionForcedEmbeddingLevel };
- const short ltrForcedEmbeddingLevelValue = 0;
- const short rtlForcedEmbeddingLevelValue = 1;
- static const void* ltrOptionValues[] = { CFNumberCreate(kCFAllocatorDefault, kCFNumberShortType, &ltrForcedEmbeddingLevelValue) };
- static const void* rtlOptionValues[] = { CFNumberCreate(kCFAllocatorDefault, kCFNumberShortType, &rtlForcedEmbeddingLevelValue) };
- static CFDictionaryRef ltrTypesetterOptions = CFDictionaryCreate(kCFAllocatorDefault, optionKeys, ltrOptionValues, WTF_ARRAY_LENGTH(optionKeys), &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
- static CFDictionaryRef rtlTypesetterOptions = CFDictionaryCreate(kCFAllocatorDefault, optionKeys, rtlOptionValues, WTF_ARRAY_LENGTH(optionKeys), &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
-
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
- ProviderInfo info = { cp, length, fontData->getCFStringAttributes(m_font.typesettingFeatures()) };
- RetainPtr<CTTypesetterRef> typesetter(AdoptCF, wkCreateCTTypesetterWithUniCharProviderAndOptions(&provideStringAndAttributes, 0, &info, m_run.ltr() ? ltrTypesetterOptions : rtlTypesetterOptions));
-#else
- RetainPtr<CFStringRef> string(AdoptCF, CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, cp, length, kCFAllocatorNull));
- RetainPtr<CFAttributedStringRef> attributedString(AdoptCF, CFAttributedStringCreate(kCFAllocatorDefault, string.get(), fontData->getCFStringAttributes(m_font.typesettingFeatures())));
- RetainPtr<CTTypesetterRef> typesetter(AdoptCF, CTTypesetterCreateWithAttributedStringAndOptions(attributedString.get(), m_run.ltr() ? ltrTypesetterOptions : rtlTypesetterOptions));
-#endif
-
- line.adoptCF(CTTypesetterCreateLine(typesetter.get(), CFRangeMake(0, 0)));
- } else {
- ProviderInfo info = { cp, length, fontData->getCFStringAttributes(m_font.typesettingFeatures()) };
-
- line.adoptCF(wkCreateCTLineWithUniCharProvider(&provideStringAndAttributes, 0, &info));
- }
-
- CFArrayRef runArray = CTLineGetGlyphRuns(line.get());
-
- CFIndex runCount = CFArrayGetCount(runArray);
-
- for (CFIndex r = 0; r < runCount; r++) {
- CTRunRef ctRun = static_cast<CTRunRef>(CFArrayGetValueAtIndex(runArray, r));
- ASSERT(CFGetTypeID(ctRun) == CTRunGetTypeID());
- m_complexTextRuns.append(ComplexTextRun::create(ctRun, fontData, cp, stringLocation, length));
- }
-}
-
-} // namespace WebCore
-
-#endif // USE(CORE_TEXT)
diff --git a/WebCore/platform/graphics/mac/FloatPointMac.mm b/WebCore/platform/graphics/mac/FloatPointMac.mm
deleted file mode 100644
index 2f73314..0000000
--- a/WebCore/platform/graphics/mac/FloatPointMac.mm
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2006 Apple Computer, Inc. All rights reserved.
- * Copyright (C) 2005 Nokia. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "FloatPoint.h"
-
-namespace WebCore {
-
-#ifndef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES
-
-FloatPoint::FloatPoint(const NSPoint& p) : m_x(p.x), m_y(p.y)
-{
-}
-
-FloatPoint::operator NSPoint() const
-{
- return NSMakePoint(m_x, m_y);
-}
-
-#endif
-
-}
diff --git a/WebCore/platform/graphics/mac/FloatRectMac.mm b/WebCore/platform/graphics/mac/FloatRectMac.mm
deleted file mode 100644
index 1d6b045..0000000
--- a/WebCore/platform/graphics/mac/FloatRectMac.mm
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2003, 2006 Apple Computer, Inc. All rights reserved.
- * Copyright (C) 2005 Nokia. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "FloatRect.h"
-
-namespace WebCore {
-
-#ifndef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES
-
-FloatRect::FloatRect(const NSRect& r) : m_location(r.origin), m_size(r.size)
-{
-}
-
-FloatRect::operator NSRect() const
-{
- return NSMakeRect(x(), y(), width(), height());
-}
-
-#endif
-
-}
diff --git a/WebCore/platform/graphics/mac/FloatSizeMac.mm b/WebCore/platform/graphics/mac/FloatSizeMac.mm
deleted file mode 100644
index 01efbe9..0000000
--- a/WebCore/platform/graphics/mac/FloatSizeMac.mm
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2003, 2006 Apple Computer, Inc. All rights reserved.
- * Copyright (C) 2005 Nokia. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "FloatSize.h"
-
-namespace WebCore {
-
-#ifndef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES
-
-FloatSize::FloatSize(const NSSize& s) : m_width(s.width), m_height(s.height)
-{
-}
-
-FloatSize::operator NSSize() const
-{
- return NSMakeSize(m_width, m_height);
-}
-
-#endif
-
-}
diff --git a/WebCore/platform/graphics/mac/FontCacheMac.mm b/WebCore/platform/graphics/mac/FontCacheMac.mm
deleted file mode 100644
index 068bd8e..0000000
--- a/WebCore/platform/graphics/mac/FontCacheMac.mm
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
- * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#import "config.h"
-#import "FontCache.h"
-
-#import "Font.h"
-#import "SimpleFontData.h"
-#import "FontPlatformData.h"
-#import "WebCoreSystemInterface.h"
-#import "WebFontCache.h"
-#import <AppKit/AppKit.h>
-#import <wtf/StdLibExtras.h>
-
-#ifdef BUILDING_ON_TIGER
-typedef int NSInteger;
-#endif
-
-namespace WebCore {
-
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
-static void fontCacheRegisteredFontsChangedNotificationCallback(CFNotificationCenterRef, void* observer, CFStringRef name, const void *, CFDictionaryRef)
-{
- ASSERT_UNUSED(observer, observer == fontCache());
- ASSERT_UNUSED(name, CFEqual(name, kCTFontManagerRegisteredFontsChangedNotification));
- fontCache()->invalidate();
-}
-#else
-static void fontCacheATSNotificationCallback(ATSFontNotificationInfoRef, void*)
-{
- fontCache()->invalidate();
-}
-#endif
-
-void FontCache::platformInit()
-{
- wkSetUpFontCache();
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
- CFNotificationCenterAddObserver(CFNotificationCenterGetLocalCenter(), this, fontCacheRegisteredFontsChangedNotificationCallback, kCTFontManagerRegisteredFontsChangedNotification, 0, CFNotificationSuspensionBehaviorDeliverImmediately);
-#else
- // kCTFontManagerRegisteredFontsChangedNotification does not exist on Leopard and earlier.
- // FIXME: Passing kATSFontNotifyOptionReceiveWhileSuspended may be an overkill and does not seem to work anyway.
- ATSFontNotificationSubscribe(fontCacheATSNotificationCallback, kATSFontNotifyOptionReceiveWhileSuspended, 0, 0);
-#endif
-}
-
-static int toAppKitFontWeight(FontWeight fontWeight)
-{
- static int appKitFontWeights[] = {
- 2, // FontWeight100
- 3, // FontWeight200
- 4, // FontWeight300
- 5, // FontWeight400
- 6, // FontWeight500
- 8, // FontWeight600
- 9, // FontWeight700
- 10, // FontWeight800
- 12, // FontWeight900
- };
- return appKitFontWeights[fontWeight];
-}
-
-static inline bool isAppKitFontWeightBold(NSInteger appKitFontWeight)
-{
- return appKitFontWeight >= 7;
-}
-
-const SimpleFontData* FontCache::getFontDataForCharacters(const Font& font, const UChar* characters, int length)
-{
- const FontPlatformData& platformData = font.fontDataAt(0)->fontDataForCharacter(characters[0])->platformData();
- NSFont *nsFont = platformData.font();
-
- NSString *string = [[NSString alloc] initWithCharactersNoCopy:const_cast<UChar*>(characters) length:length freeWhenDone:NO];
- NSFont *substituteFont = wkGetFontInLanguageForRange(nsFont, string, NSMakeRange(0, length));
- [string release];
-
- if (!substituteFont && length == 1)
- substituteFont = wkGetFontInLanguageForCharacter(nsFont, characters[0]);
- if (!substituteFont)
- return 0;
-
- // Use the family name from the AppKit-supplied substitute font, requesting the
- // traits, weight, and size we want. One way this does better than the original
- // AppKit request is that it takes synthetic bold and oblique into account.
- // But it does create the possibility that we could end up with a font that
- // doesn't actually cover the characters we need.
-
- NSFontManager *fontManager = [NSFontManager sharedFontManager];
-
- NSFontTraitMask traits;
- NSInteger weight;
- CGFloat size;
-
- if (nsFont) {
- traits = [fontManager traitsOfFont:nsFont];
- if (platformData.m_syntheticBold)
- traits |= NSBoldFontMask;
- if (platformData.m_syntheticOblique)
- traits |= NSFontItalicTrait;
- weight = [fontManager weightOfFont:nsFont];
- size = [nsFont pointSize];
- } else {
- // For custom fonts nsFont is nil.
- traits = font.italic() ? NSFontItalicTrait : 0;
- weight = toAppKitFontWeight(font.weight());
- size = font.pixelSize();
- }
-
- if (NSFont *bestVariation = [fontManager fontWithFamily:[substituteFont familyName] traits:traits weight:weight size:size])
- substituteFont = bestVariation;
-
- substituteFont = font.fontDescription().usePrinterFont() ? [substituteFont printerFont] : [substituteFont screenFont];
-
- NSFontTraitMask substituteFontTraits = [fontManager traitsOfFont:substituteFont];
- NSInteger substituteFontWeight = [fontManager weightOfFont:substituteFont];
-
- FontPlatformData alternateFont(substituteFont, platformData.size(),
- !font.isPlatformFont() && isAppKitFontWeightBold(weight) && !isAppKitFontWeightBold(substituteFontWeight),
- !font.isPlatformFont() && (traits & NSFontItalicTrait) && !(substituteFontTraits & NSFontItalicTrait),
- platformData.m_orientation);
- return getCachedFontData(&alternateFont);
-}
-
-SimpleFontData* FontCache::getSimilarFontPlatformData(const Font& font)
-{
- // Attempt to find an appropriate font using a match based on
- // the presence of keywords in the the requested names. For example, we'll
- // match any name that contains "Arabic" to Geeza Pro.
- SimpleFontData* simpleFontData = 0;
- const FontFamily* currFamily = &font.fontDescription().family();
- while (currFamily && !simpleFontData) {
- if (currFamily->family().length()) {
- static String* matchWords[3] = { new String("Arabic"), new String("Pashto"), new String("Urdu") };
- DEFINE_STATIC_LOCAL(AtomicString, geezaStr, ("Geeza Pro"));
- for (int j = 0; j < 3 && !simpleFontData; ++j)
- if (currFamily->family().contains(*matchWords[j], false))
- simpleFontData = getCachedFontData(font.fontDescription(), geezaStr);
- }
- currFamily = currFamily->next();
- }
-
- return simpleFontData;
-}
-
-SimpleFontData* FontCache::getLastResortFallbackFont(const FontDescription& fontDescription)
-{
- DEFINE_STATIC_LOCAL(AtomicString, timesStr, ("Times"));
-
- // FIXME: Would be even better to somehow get the user's default font here. For now we'll pick
- // the default that the user would get without changing any prefs.
- SimpleFontData* simpleFontData = getCachedFontData(fontDescription, timesStr);
- if (simpleFontData)
- return simpleFontData;
-
- // The Times fallback will almost always work, but in the highly unusual case where
- // the user doesn't have it, we fall back on Lucida Grande because that's
- // guaranteed to be there, according to Nathan Taylor. This is good enough
- // to avoid a crash at least.
- DEFINE_STATIC_LOCAL(AtomicString, lucidaGrandeStr, ("Lucida Grande"));
- return getCachedFontData(fontDescription, lucidaGrandeStr);
-}
-
-void FontCache::getTraitsInFamily(const AtomicString& familyName, Vector<unsigned>& traitsMasks)
-{
- [WebFontCache getTraits:traitsMasks inFamily:familyName];
-}
-
-FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family)
-{
- NSFontTraitMask traits = fontDescription.italic() ? NSFontItalicTrait : 0;
- NSInteger weight = toAppKitFontWeight(fontDescription.weight());
- float size = fontDescription.computedPixelSize();
-
- NSFont *nsFont = [WebFontCache fontWithFamily:family traits:traits weight:weight size:size];
- if (!nsFont)
- return 0;
-
- NSFontManager *fontManager = [NSFontManager sharedFontManager];
- NSFontTraitMask actualTraits = 0;
- if (fontDescription.italic())
- actualTraits = [fontManager traitsOfFont:nsFont];
- NSInteger actualWeight = [fontManager weightOfFont:nsFont];
-
- NSFont *platformFont = fontDescription.usePrinterFont() ? [nsFont printerFont] : [nsFont screenFont];
- bool syntheticBold = isAppKitFontWeightBold(weight) && !isAppKitFontWeightBold(actualWeight);
- bool syntheticOblique = (traits & NSFontItalicTrait) && !(actualTraits & NSFontItalicTrait);
-
- return new FontPlatformData(platformFont, size, syntheticBold, syntheticOblique, fontDescription.orientation());
-}
-
-} // namespace WebCore
diff --git a/WebCore/platform/graphics/mac/FontComplexTextMac.cpp b/WebCore/platform/graphics/mac/FontComplexTextMac.cpp
deleted file mode 100644
index ca006d9..0000000
--- a/WebCore/platform/graphics/mac/FontComplexTextMac.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "Font.h"
-
-#include "ComplexTextController.h"
-#include "FontFallbackList.h"
-#include "GlyphBuffer.h"
-#include "GraphicsContext.h"
-#include "IntRect.h"
-#include "SimpleFontData.h"
-#include <wtf/MathExtras.h>
-
-using namespace std;
-
-namespace WebCore {
-
-FloatRect Font::selectionRectForComplexText(const TextRun& run, const FloatPoint& point, int h,
- int from, int to) const
-{
- ComplexTextController controller(this, run);
- controller.advance(from);
- float beforeWidth = controller.runWidthSoFar();
- controller.advance(to);
- float afterWidth = controller.runWidthSoFar();
-
- // Using roundf() rather than ceilf() for the right edge as a compromise to ensure correct caret positioning
- if (run.rtl()) {
- float totalWidth = controller.totalWidth();
- return FloatRect(point.x() + floorf(totalWidth - afterWidth), point.y(), roundf(totalWidth - beforeWidth) - floorf(totalWidth - afterWidth), h);
- }
-
- return FloatRect(point.x() + floorf(beforeWidth), point.y(), roundf(afterWidth) - floorf(beforeWidth), h);
-}
-
-float Font::getGlyphsAndAdvancesForComplexText(const TextRun& run, int from, int to, GlyphBuffer& glyphBuffer, ForTextEmphasisOrNot forTextEmphasis) const
-{
- float initialAdvance;
-
- ComplexTextController controller(this, run, false, 0, forTextEmphasis);
- controller.advance(from);
- float beforeWidth = controller.runWidthSoFar();
- controller.advance(to, &glyphBuffer);
-
- if (glyphBuffer.isEmpty())
- return 0;
-
- float afterWidth = controller.runWidthSoFar();
-
- if (run.rtl()) {
- initialAdvance = controller.totalWidth() + controller.finalRoundingWidth() - afterWidth;
- for (int i = 0, end = glyphBuffer.size() - 1; i < glyphBuffer.size() / 2; ++i, --end)
- glyphBuffer.swap(i, end);
- } else
- initialAdvance = beforeWidth;
-
- return initialAdvance;
-}
-
-void Font::drawComplexText(GraphicsContext* context, const TextRun& run, const FloatPoint& point, int from, int to) const
-{
- // This glyph buffer holds our glyphs + advances + font data for each glyph.
- GlyphBuffer glyphBuffer;
-
- float startX = point.x() + getGlyphsAndAdvancesForComplexText(run, from, to, glyphBuffer);
-
- // We couldn't generate any glyphs for the run. Give up.
- if (glyphBuffer.isEmpty())
- return;
-
- // Draw the glyph buffer now at the starting point returned in startX.
- FloatPoint startPoint(startX, point.y());
- drawGlyphBuffer(context, glyphBuffer, startPoint);
-}
-
-void Font::drawEmphasisMarksForComplexText(GraphicsContext* context, const TextRun& run, const AtomicString& mark, const FloatPoint& point, int from, int to) const
-{
- GlyphBuffer glyphBuffer;
- float initialAdvance = getGlyphsAndAdvancesForComplexText(run, from, to, glyphBuffer, ForTextEmphasis);
-
- if (glyphBuffer.isEmpty())
- return;
-
- drawEmphasisMarks(context, glyphBuffer, mark, FloatPoint(point.x() + initialAdvance, point.y()));
-}
-
-float Font::floatWidthForComplexText(const TextRun& run, HashSet<const SimpleFontData*>* fallbackFonts, GlyphOverflow* glyphOverflow) const
-{
- ComplexTextController controller(this, run, true, fallbackFonts);
- if (glyphOverflow) {
- glyphOverflow->top = max<int>(glyphOverflow->top, ceilf(-controller.minGlyphBoundingBoxY()) - ascent());
- glyphOverflow->bottom = max<int>(glyphOverflow->bottom, ceilf(controller.maxGlyphBoundingBoxY()) - descent());
- glyphOverflow->left = max<int>(0, ceilf(-controller.minGlyphBoundingBoxX()));
- glyphOverflow->right = max<int>(0, ceilf(controller.maxGlyphBoundingBoxX() - controller.totalWidth()));
- }
- return controller.totalWidth();
-}
-
-int Font::offsetForPositionForComplexText(const TextRun& run, float x, bool includePartialGlyphs) const
-{
- ComplexTextController controller(this, run);
- return controller.offsetForPosition(x, includePartialGlyphs);
-}
-
-} // namespace WebCore
diff --git a/WebCore/platform/graphics/mac/FontCustomPlatformData.cpp b/WebCore/platform/graphics/mac/FontCustomPlatformData.cpp
deleted file mode 100644
index d04d0e4..0000000
--- a/WebCore/platform/graphics/mac/FontCustomPlatformData.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2007, 2008, 2010 Apple Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- */
-
-#include "config.h"
-#include "FontCustomPlatformData.h"
-
-#include "FontPlatformData.h"
-#include "OpenTypeSanitizer.h"
-#include "SharedBuffer.h"
-#include "WOFFFileFormat.h"
-#include <ApplicationServices/ApplicationServices.h>
-
-namespace WebCore {
-
-FontCustomPlatformData::~FontCustomPlatformData()
-{
-#if defined(BUILDING_ON_TIGER) || defined(BUILDING_ON_LEOPARD)
- if (m_atsContainer)
- ATSFontDeactivate(m_atsContainer, NULL, kATSOptionFlagsDefault);
-#endif
- CGFontRelease(m_cgFont);
-}
-
-FontPlatformData FontCustomPlatformData::fontPlatformData(int size, bool bold, bool italic, FontOrientation orientation, FontRenderingMode)
-{
- return FontPlatformData(m_cgFont, size, bold, italic, orientation);
-}
-
-FontCustomPlatformData* createFontCustomPlatformData(SharedBuffer* buffer)
-{
- ASSERT_ARG(buffer, buffer);
-
-#if ENABLE(OPENTYPE_SANITIZER)
- OpenTypeSanitizer sanitizer(buffer);
- RefPtr<SharedBuffer> transcodeBuffer = sanitizer.sanitize();
- if (!transcodeBuffer)
- return 0; // validation failed.
- buffer = transcodeBuffer.get();
-#else
- RefPtr<SharedBuffer> sfntBuffer;
- if (isWOFF(buffer)) {
- Vector<char> sfnt;
- if (!convertWOFFToSfnt(buffer, sfnt))
- return 0;
-
- sfntBuffer = SharedBuffer::adoptVector(sfnt);
- buffer = sfntBuffer.get();
- }
-#endif
-
- ATSFontContainerRef containerRef = 0;
-
- RetainPtr<CGFontRef> cgFontRef;
-
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
- RetainPtr<CFDataRef> bufferData(AdoptCF, buffer->createCFData());
- RetainPtr<CGDataProviderRef> dataProvider(AdoptCF, CGDataProviderCreateWithCFData(bufferData.get()));
-
- cgFontRef.adoptCF(CGFontCreateWithDataProvider(dataProvider.get()));
- if (!cgFontRef)
- return 0;
-#else
- // Use ATS to activate the font.
-
- // The value "3" means that the font is private and can't be seen by anyone else.
- ATSFontActivateFromMemory((void*)buffer->data(), buffer->size(), 3, kATSFontFormatUnspecified, NULL, kATSOptionFlagsDefault, &containerRef);
- if (!containerRef)
- return 0;
- ItemCount fontCount;
- ATSFontFindFromContainer(containerRef, kATSOptionFlagsDefault, 0, NULL, &fontCount);
-
- // We just support the first font in the list.
- if (fontCount == 0) {
- ATSFontDeactivate(containerRef, NULL, kATSOptionFlagsDefault);
- return 0;
- }
-
- ATSFontRef fontRef = 0;
- ATSFontFindFromContainer(containerRef, kATSOptionFlagsDefault, 1, &fontRef, NULL);
- if (!fontRef) {
- ATSFontDeactivate(containerRef, NULL, kATSOptionFlagsDefault);
- return 0;
- }
-
- cgFontRef.adoptCF(CGFontCreateWithPlatformFont(&fontRef));
-#ifndef BUILDING_ON_TIGER
- // Workaround for <rdar://problem/5675504>.
- if (cgFontRef && !CGFontGetNumberOfGlyphs(cgFontRef.get()))
- cgFontRef = 0;
-#endif
- if (!cgFontRef) {
- ATSFontDeactivate(containerRef, NULL, kATSOptionFlagsDefault);
- return 0;
- }
-#endif // !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
-
- return new FontCustomPlatformData(containerRef, cgFontRef.releaseRef());
-}
-
-bool FontCustomPlatformData::supportsFormat(const String& format)
-{
- return equalIgnoringCase(format, "truetype") || equalIgnoringCase(format, "opentype") || equalIgnoringCase(format, "woff");
-}
-
-}
diff --git a/WebCore/platform/graphics/mac/FontCustomPlatformData.h b/WebCore/platform/graphics/mac/FontCustomPlatformData.h
deleted file mode 100644
index c11858c..0000000
--- a/WebCore/platform/graphics/mac/FontCustomPlatformData.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2007 Apple Computer, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef FontCustomPlatformData_h
-#define FontCustomPlatformData_h
-
-#include "FontOrientation.h"
-#include "FontRenderingMode.h"
-#include <CoreFoundation/CFBase.h>
-#include <wtf/Forward.h>
-#include <wtf/Noncopyable.h>
-
-typedef struct CGFont* CGFontRef;
-typedef UInt32 ATSFontContainerRef;
-typedef UInt32 ATSFontRef;
-
-namespace WebCore {
-
-class FontPlatformData;
-class SharedBuffer;
-
-struct FontCustomPlatformData : Noncopyable {
- FontCustomPlatformData(ATSFontContainerRef container, CGFontRef cgFont)
- : m_atsContainer(container)
- , m_cgFont(cgFont)
- {
- }
-
- ~FontCustomPlatformData();
-
- FontPlatformData fontPlatformData(int size, bool bold, bool italic, FontOrientation = Horizontal, FontRenderingMode = NormalRenderingMode);
-
- static bool supportsFormat(const String&);
-
- ATSFontContainerRef m_atsContainer;
- CGFontRef m_cgFont;
-};
-
-FontCustomPlatformData* createFontCustomPlatformData(SharedBuffer*);
-
-}
-
-#endif
diff --git a/WebCore/platform/graphics/mac/FontMac.mm b/WebCore/platform/graphics/mac/FontMac.mm
deleted file mode 100644
index 8519667..0000000
--- a/WebCore/platform/graphics/mac/FontMac.mm
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
- * (C) 1999 Antti Koivisto (koivisto@kde.org)
- * (C) 2000 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2003, 2006, 2007, 2008, 2009, 2010 Apple Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#import "config.h"
-#import "Font.h"
-
-#import "GlyphBuffer.h"
-#import "GraphicsContext.h"
-#import "Logging.h"
-#import "SimpleFontData.h"
-#import "WebCoreSystemInterface.h"
-#import <AppKit/AppKit.h>
-
-#define SYNTHETIC_OBLIQUE_ANGLE 14
-
-#ifdef __LP64__
-#define URefCon void*
-#else
-#define URefCon UInt32
-#endif
-
-using namespace std;
-
-namespace WebCore {
-
-bool Font::canReturnFallbackFontsForComplexText()
-{
- return true;
-}
-
-static void showGlyphsWithAdvances(const SimpleFontData* font, CGContextRef context, const CGGlyph* glyphs, const CGSize* advances, size_t count)
-{
- const FontPlatformData& platformData = font->platformData();
- if (!platformData.isColorBitmapFont()) {
- CGAffineTransform savedMatrix;
- bool isVertical = font->orientation() == Vertical;
-
- if (isVertical) {
- CGAffineTransform rotateLeftTransform = CGAffineTransformMake(0, -1, 1, 0, 0, 0);
-
- savedMatrix = CGContextGetTextMatrix(context);
- CGAffineTransform runMatrix = CGAffineTransformConcat(savedMatrix, rotateLeftTransform);
- // Move start point to put glyphs into original region.
- runMatrix.tx = savedMatrix.tx + font->ascent();
- runMatrix.ty = savedMatrix.ty + font->descent();
- CGContextSetTextMatrix(context, runMatrix);
- }
-
- CGContextShowGlyphsWithAdvances(context, glyphs, advances, count);
-
- if (isVertical)
- CGContextSetTextMatrix(context, savedMatrix);
- }
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
- else {
- if (!count)
- return;
-
- Vector<CGPoint, 256> positions(count);
- CGAffineTransform matrix = CGAffineTransformInvert(CGContextGetTextMatrix(context));
- positions[0] = CGPointZero;
- for (size_t i = 1; i < count; ++i) {
- CGSize advance = CGSizeApplyAffineTransform(advances[i - 1], matrix);
- positions[i].x = positions[i - 1].x + advance.width;
- positions[i].y = positions[i - 1].y + advance.height;
- }
- CTFontDrawGlyphs(platformData.ctFont(), glyphs, positions.data(), count, context);
- }
-#endif
-}
-
-void Font::drawGlyphs(GraphicsContext* context, const SimpleFontData* font, const GlyphBuffer& glyphBuffer, int from, int numGlyphs, const FloatPoint& point) const
-{
- CGContextRef cgContext = context->platformContext();
-
- bool shouldSmoothFonts = true;
- bool changeFontSmoothing = false;
-
- switch(fontDescription().fontSmoothing()) {
- case Antialiased: {
- context->setShouldAntialias(true);
- shouldSmoothFonts = false;
- changeFontSmoothing = true;
- break;
- }
- case SubpixelAntialiased: {
- context->setShouldAntialias(true);
- shouldSmoothFonts = true;
- changeFontSmoothing = true;
- break;
- }
- case NoSmoothing: {
- context->setShouldAntialias(false);
- shouldSmoothFonts = false;
- changeFontSmoothing = true;
- break;
- }
- case AutoSmoothing: {
- // For the AutoSmooth case, don't do anything! Keep the default settings.
- break;
- }
- default:
- ASSERT_NOT_REACHED();
- }
-
- if (!shouldUseSmoothing()) {
- shouldSmoothFonts = false;
- changeFontSmoothing = true;
- }
-
- bool originalShouldUseFontSmoothing = false;
- if (changeFontSmoothing) {
- originalShouldUseFontSmoothing = wkCGContextGetShouldSmoothFonts(cgContext);
- CGContextSetShouldSmoothFonts(cgContext, shouldSmoothFonts);
- }
-
- const FontPlatformData& platformData = font->platformData();
- NSFont* drawFont;
- if (!isPrinterFont()) {
- drawFont = [platformData.font() screenFont];
- if (drawFont != platformData.font())
- // We are getting this in too many places (3406411); use ERROR so it only prints on debug versions for now. (We should debug this also, eventually).
- LOG_ERROR("Attempting to set non-screen font (%@) when drawing to screen. Using screen font anyway, may result in incorrect metrics.",
- [[[platformData.font() fontDescriptor] fontAttributes] objectForKey:NSFontNameAttribute]);
- } else {
- drawFont = [platformData.font() printerFont];
- if (drawFont != platformData.font())
- NSLog(@"Attempting to set non-printer font (%@) when printing. Using printer font anyway, may result in incorrect metrics.",
- [[[platformData.font() fontDescriptor] fontAttributes] objectForKey:NSFontNameAttribute]);
- }
-
- CGContextSetFont(cgContext, platformData.cgFont());
-
- CGAffineTransform matrix = CGAffineTransformIdentity;
- if (drawFont && !platformData.isColorBitmapFont())
- memcpy(&matrix, [drawFont matrix], sizeof(matrix));
- matrix.b = -matrix.b;
- matrix.d = -matrix.d;
- if (platformData.m_syntheticOblique)
- matrix = CGAffineTransformConcat(matrix, CGAffineTransformMake(1, 0, -tanf(SYNTHETIC_OBLIQUE_ANGLE * acosf(0) / 90), 1, 0, 0));
- CGContextSetTextMatrix(cgContext, matrix);
-
- if (drawFont) {
- wkSetCGFontRenderingMode(cgContext, drawFont);
- CGContextSetFontSize(cgContext, 1.0f);
- } else
- CGContextSetFontSize(cgContext, platformData.m_size);
-
-
- FloatSize shadowOffset;
- float shadowBlur;
- Color shadowColor;
- ColorSpace shadowColorSpace;
- ColorSpace fillColorSpace = context->fillColorSpace();
- context->getShadow(shadowOffset, shadowBlur, shadowColor, shadowColorSpace);
-
- bool hasSimpleShadow = context->textDrawingMode() == TextModeFill && shadowColor.isValid() && !shadowBlur && !platformData.isColorBitmapFont() && (!context->shadowsIgnoreTransforms() || context->getCTM().isIdentityOrTranslationOrFlipped());
- if (hasSimpleShadow) {
- // Paint simple shadows ourselves instead of relying on CG shadows, to avoid losing subpixel antialiasing.
- context->clearShadow();
- Color fillColor = context->fillColor();
- Color shadowFillColor(shadowColor.red(), shadowColor.green(), shadowColor.blue(), shadowColor.alpha() * fillColor.alpha() / 255);
- context->setFillColor(shadowFillColor, shadowColorSpace);
- float shadowTextX = point.x() + shadowOffset.width();
- // If shadows are ignoring transforms, then we haven't applied the Y coordinate flip yet, so down is negative.
- float shadowTextY = point.y() + shadowOffset.height() * (context->shadowsIgnoreTransforms() ? -1 : 1);
- CGContextSetTextPosition(cgContext, shadowTextX, shadowTextY);
- showGlyphsWithAdvances(font, cgContext, glyphBuffer.glyphs(from), glyphBuffer.advances(from), numGlyphs);
- if (font->syntheticBoldOffset()) {
- CGContextSetTextPosition(cgContext, shadowTextX + font->syntheticBoldOffset(), shadowTextY);
- showGlyphsWithAdvances(font, cgContext, glyphBuffer.glyphs(from), glyphBuffer.advances(from), numGlyphs);
- }
- context->setFillColor(fillColor, fillColorSpace);
- }
-
- CGContextSetTextPosition(cgContext, point.x(), point.y());
- showGlyphsWithAdvances(font, cgContext, glyphBuffer.glyphs(from), glyphBuffer.advances(from), numGlyphs);
- if (font->syntheticBoldOffset()) {
- CGContextSetTextPosition(cgContext, point.x() + font->syntheticBoldOffset(), point.y());
- showGlyphsWithAdvances(font, cgContext, glyphBuffer.glyphs(from), glyphBuffer.advances(from), numGlyphs);
- }
-
- if (hasSimpleShadow)
- context->setShadow(shadowOffset, shadowBlur, shadowColor, shadowColorSpace);
-
- if (changeFontSmoothing)
- CGContextSetShouldSmoothFonts(cgContext, originalShouldUseFontSmoothing);
-}
-
-}
diff --git a/WebCore/platform/graphics/mac/GlyphPageTreeNodeMac.cpp b/WebCore/platform/graphics/mac/GlyphPageTreeNodeMac.cpp
deleted file mode 100644
index 5388c24..0000000
--- a/WebCore/platform/graphics/mac/GlyphPageTreeNodeMac.cpp
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "GlyphPageTreeNode.h"
-#include "Font.h"
-
-#include "SimpleFontData.h"
-#include "WebCoreSystemInterface.h"
-#include <ApplicationServices/ApplicationServices.h>
-
-namespace WebCore {
-
-#ifndef BUILDING_ON_TIGER
-static bool shouldUseCoreText(UChar* buffer, unsigned bufferLength, const SimpleFontData* fontData)
-{
- if (fontData->orientation() == Vertical && !fontData->isBrokenIdeographFont()) {
- // Ideographs don't have a vertical variant.
- for (unsigned i = 0; i < bufferLength; ++i) {
- if (!Font::isCJKIdeograph(buffer[i]))
- return true;
- }
- }
-
- return false;
-}
-#endif
-
-bool GlyphPage::fill(unsigned offset, unsigned length, UChar* buffer, unsigned bufferLength, const SimpleFontData* fontData)
-{
- bool haveGlyphs = false;
-
-#ifndef BUILDING_ON_TIGER
- if (!shouldUseCoreText(buffer, bufferLength, fontData)) {
- Vector<CGGlyph, 512> glyphs(bufferLength);
- wkGetGlyphsForCharacters(fontData->platformData().cgFont(), buffer, glyphs.data(), bufferLength);
- for (unsigned i = 0; i < length; ++i) {
- if (!glyphs[i])
- setGlyphDataForIndex(offset + i, 0, 0);
- else {
- setGlyphDataForIndex(offset + i, glyphs[i], fontData);
- haveGlyphs = true;
- }
- }
- } else {
- // We ask CoreText for possible vertical variant glyphs
- RetainPtr<CFStringRef> string(AdoptCF, CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, buffer, bufferLength, kCFAllocatorNull));
- RetainPtr<CFAttributedStringRef> attributedString(AdoptCF, CFAttributedStringCreate(kCFAllocatorDefault, string.get(), fontData->getCFStringAttributes(0)));
- RetainPtr<CTLineRef> line(AdoptCF, CTLineCreateWithAttributedString(attributedString.get()));
-
- CFArrayRef runArray = CTLineGetGlyphRuns(line.get());
- CFIndex runCount = CFArrayGetCount(runArray);
-
- // Initialize glyph entries
- for (unsigned index = 0; index < length; ++index)
- setGlyphDataForIndex(offset + index, 0, 0);
-
- Vector<CGGlyph, 512> glyphVector;
- Vector<CFIndex, 512> indexVector;
- bool done = false;
- for (CFIndex r = 0; r < runCount && !done ; ++r) {
- // CTLine could map characters over multiple fonts using its own font fallback list.
- // We need to pick runs that use the exact font we need, i.e., fontData->platformData().ctFont().
- CTRunRef ctRun = static_cast<CTRunRef>(CFArrayGetValueAtIndex(runArray, r));
- ASSERT(CFGetTypeID(ctRun) == CTRunGetTypeID());
-
- CFDictionaryRef attributes = CTRunGetAttributes(ctRun);
- CTFontRef runFont = static_cast<CTFontRef>(CFDictionaryGetValue(attributes, kCTFontAttributeName));
- RetainPtr<CGFontRef> runCGFont(AdoptCF, CTFontCopyGraphicsFont(runFont, 0));
- // Use CGFont here as CFEqual for CTFont counts all attributes for font.
- if (CFEqual(fontData->platformData().cgFont(), runCGFont.get())) {
- // This run uses the font we want. Extract glyphs.
- CFIndex glyphCount = CTRunGetGlyphCount(ctRun);
- const CGGlyph* glyphs = CTRunGetGlyphsPtr(ctRun);
- if (!glyphs) {
- glyphVector.resize(glyphCount);
- CTRunGetGlyphs(ctRun, CFRangeMake(0, 0), glyphVector.data());
- glyphs = glyphVector.data();
- }
- const CFIndex* stringIndices = CTRunGetStringIndicesPtr(ctRun);
- if (!stringIndices) {
- indexVector.resize(glyphCount);
- CTRunGetStringIndices(ctRun, CFRangeMake(0, 0), indexVector.data());
- stringIndices = indexVector.data();
- }
-
- for (CFIndex i = 0; i < glyphCount; ++i) {
- if (stringIndices[i] >= static_cast<CFIndex>(length)) {
- done = true;
- break;
- }
- if (glyphs[i]) {
- setGlyphDataForIndex(offset + stringIndices[i], glyphs[i], fontData);
- haveGlyphs = true;
- }
- }
- }
- }
- }
-#else
- // Use an array of long so we get good enough alignment.
- long glyphVector[(GLYPH_VECTOR_SIZE + sizeof(long) - 1) / sizeof(long)];
-
- OSStatus status = wkInitializeGlyphVector(GlyphPage::size, &glyphVector);
- if (status != noErr)
- // This should never happen, perhaps indicates a bad font! If it does the
- // font substitution code will find an alternate font.
- return false;
-
- wkConvertCharToGlyphs(fontData->m_styleGroup, buffer, bufferLength, &glyphVector);
-
- unsigned numGlyphs = wkGetGlyphVectorNumGlyphs(&glyphVector);
- if (numGlyphs != length) {
- // This should never happen, perhaps indicates a bad font?
- // If it does happen, the font substitution code will find an alternate font.
- wkClearGlyphVector(&glyphVector);
- return false;
- }
-
- ATSLayoutRecord* glyphRecord = (ATSLayoutRecord*)wkGetGlyphVectorFirstRecord(glyphVector);
- for (unsigned i = 0; i < length; i++) {
- Glyph glyph = glyphRecord->glyphID;
- if (!glyph)
- setGlyphDataForIndex(offset + i, 0, 0);
- else {
- setGlyphDataForIndex(offset + i, glyph, fontData);
- haveGlyphs = true;
- }
- glyphRecord = (ATSLayoutRecord *)((char *)glyphRecord + wkGetGlyphVectorRecordSize(glyphVector));
- }
- wkClearGlyphVector(&glyphVector);
-#endif
-
- return haveGlyphs;
-}
-
-} // namespace WebCore
diff --git a/WebCore/platform/graphics/mac/GraphicsContext3DMac.mm b/WebCore/platform/graphics/mac/GraphicsContext3DMac.mm
deleted file mode 100644
index 321d0ef..0000000
--- a/WebCore/platform/graphics/mac/GraphicsContext3DMac.mm
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#if ENABLE(3D_CANVAS)
-
-#include "GraphicsContext3D.h"
-
-#import "BlockExceptions.h"
-
-#include "ANGLE/ShaderLang.h"
-#include "ArrayBuffer.h"
-#include "ArrayBufferView.h"
-#include "CanvasRenderingContext.h"
-#include <CoreGraphics/CGBitmapContext.h>
-#include "Extensions3DOpenGL.h"
-#include "Float32Array.h"
-#include "GraphicsContext.h"
-#include "HTMLCanvasElement.h"
-#include "ImageBuffer.h"
-#include "Int32Array.h"
-#include "NotImplemented.h"
-#include <OpenGL/CGLRenderers.h>
-#include <OpenGL/gl.h>
-#include "Uint8Array.h"
-#include "WebGLLayer.h"
-#include "WebGLObject.h"
-#include <wtf/UnusedParam.h>
-#include <wtf/text/CString.h>
-
-namespace WebCore {
-
-static void setPixelFormat(Vector<CGLPixelFormatAttribute>& attribs, int colorBits, int depthBits, bool accelerated, bool supersample, bool closest)
-{
- attribs.clear();
-
- attribs.append(kCGLPFAColorSize);
- attribs.append(static_cast<CGLPixelFormatAttribute>(colorBits));
- attribs.append(kCGLPFADepthSize);
- attribs.append(static_cast<CGLPixelFormatAttribute>(depthBits));
-
- if (accelerated)
- attribs.append(kCGLPFAAccelerated);
- else {
- attribs.append(kCGLPFARendererID);
- attribs.append(static_cast<CGLPixelFormatAttribute>(kCGLRendererGenericFloatID));
- }
-
- if (supersample)
- attribs.append(kCGLPFASupersample);
-
- if (closest)
- attribs.append(kCGLPFAClosestPolicy);
-
- attribs.append(static_cast<CGLPixelFormatAttribute>(0));
-}
-
-PassRefPtr<GraphicsContext3D> GraphicsContext3D::create(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, GraphicsContext3D::RenderStyle renderStyle)
-{
- // This implementation doesn't currently support rendering directly to the HostWindow.
- if (renderStyle == RenderDirectlyToHostWindow)
- return 0;
- RefPtr<GraphicsContext3D> context = adoptRef(new GraphicsContext3D(attrs, hostWindow, false));
- return context->m_contextObj ? context.release() : 0;
-}
-
-GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, bool)
- : m_currentWidth(0)
- , m_currentHeight(0)
- , m_attrs(attrs)
- , m_contextObj(0)
- , m_texture(0)
- , m_fbo(0)
- , m_depthStencilBuffer(0)
- , m_boundFBO(0)
- , m_multisampleFBO(0)
- , m_multisampleDepthStencilBuffer(0)
- , m_multisampleColorBuffer(0)
-{
- UNUSED_PARAM(hostWindow);
-
- Vector<CGLPixelFormatAttribute> attribs;
- CGLPixelFormatObj pixelFormatObj = 0;
- GLint numPixelFormats = 0;
-
- // We will try:
- //
- // 1) 32 bit RGBA/32 bit depth/accelerated/supersampled
- // 2) 32 bit RGBA/32 bit depth/accelerated
- // 3) 32 bit RGBA/16 bit depth/accelerated
- // 4) closest to 32 bit RGBA/16 bit depth/software renderer
- //
- // If none of that works, we simply fail and set m_contextObj to 0.
-
- setPixelFormat(attribs, 32, 32, true, true, false);
- CGLChoosePixelFormat(attribs.data(), &pixelFormatObj, &numPixelFormats);
- if (numPixelFormats == 0) {
- setPixelFormat(attribs, 32, 32, true, false, false);
- CGLChoosePixelFormat(attribs.data(), &pixelFormatObj, &numPixelFormats);
-
- if (numPixelFormats == 0) {
- setPixelFormat(attribs, 32, 16, true, false, false);
- CGLChoosePixelFormat(attribs.data(), &pixelFormatObj, &numPixelFormats);
-
- if (numPixelFormats == 0) {
- setPixelFormat(attribs, 32, 16, false, false, true);
- CGLChoosePixelFormat(attribs.data(), &pixelFormatObj, &numPixelFormats);
-
- if (numPixelFormats == 0) {
- // Could not find an acceptable renderer - fail
- return;
- }
- }
- }
- }
-
- CGLError err = CGLCreateContext(pixelFormatObj, 0, &m_contextObj);
- CGLDestroyPixelFormat(pixelFormatObj);
-
- if (err != kCGLNoError || !m_contextObj) {
- // Could not create the context - fail
- m_contextObj = 0;
- return;
- }
-
- // Set the current context to the one given to us.
- CGLSetCurrentContext(m_contextObj);
-
- validateAttributes();
-
- // Create the WebGLLayer
- BEGIN_BLOCK_OBJC_EXCEPTIONS
- m_webGLLayer.adoptNS([[WebGLLayer alloc] initWithGraphicsContext3D:this]);
-#ifndef NDEBUG
- [m_webGLLayer.get() setName:@"WebGL Layer"];
-#endif
- END_BLOCK_OBJC_EXCEPTIONS
-
- // create a texture to render into
- ::glGenTextures(1, &m_texture);
- ::glBindTexture(GL_TEXTURE_2D, m_texture);
- ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
- ::glBindTexture(GL_TEXTURE_2D, 0);
-
- // create an FBO
- ::glGenFramebuffersEXT(1, &m_fbo);
- ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
-
- m_boundFBO = m_fbo;
- if (!m_attrs.antialias && (m_attrs.stencil || m_attrs.depth))
- ::glGenRenderbuffersEXT(1, &m_depthStencilBuffer);
-
- // create an multisample FBO
- if (m_attrs.antialias) {
- ::glGenFramebuffersEXT(1, &m_multisampleFBO);
- ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_multisampleFBO);
- m_boundFBO = m_multisampleFBO;
- ::glGenRenderbuffersEXT(1, &m_multisampleColorBuffer);
- if (m_attrs.stencil || m_attrs.depth)
- ::glGenRenderbuffersEXT(1, &m_multisampleDepthStencilBuffer);
- }
-
- // ANGLE initialization.
-
- TBuiltInResource ANGLEResources;
-
- ANGLEResources.MaxVertexAttribs = 0;
- getIntegerv(GraphicsContext3D::MAX_VERTEX_ATTRIBS, &ANGLEResources.MaxVertexAttribs);
- ANGLEResources.MaxVertexUniformVectors = 0;
- getIntegerv(GraphicsContext3D::MAX_VERTEX_UNIFORM_VECTORS, &ANGLEResources.MaxVertexUniformVectors);
- ANGLEResources.MaxVaryingVectors = 0;
- getIntegerv(GraphicsContext3D::MAX_VARYING_VECTORS, &ANGLEResources.MaxVaryingVectors);
- ANGLEResources.MaxVertexTextureImageUnits = 0;
- getIntegerv(GraphicsContext3D::MAX_VERTEX_TEXTURE_IMAGE_UNITS, &ANGLEResources.MaxVertexTextureImageUnits);
- ANGLEResources.MaxCombinedTextureImageUnits = 0;
- getIntegerv(GraphicsContext3D::MAX_COMBINED_TEXTURE_IMAGE_UNITS, &ANGLEResources.MaxCombinedTextureImageUnits);
- ANGLEResources.MaxTextureImageUnits = 0;
- getIntegerv(GraphicsContext3D::MAX_TEXTURE_IMAGE_UNITS, &ANGLEResources.MaxTextureImageUnits);
- ANGLEResources.MaxFragmentUniformVectors = 0;
- getIntegerv(GraphicsContext3D::MAX_FRAGMENT_UNIFORM_VECTORS, &ANGLEResources.MaxFragmentUniformVectors);
-
- // Always set to 1 for OpenGL ES.
- ANGLEResources.MaxDrawBuffers = 1;
-
- m_compiler.setResources(ANGLEResources);
-
- ::glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
- ::glEnable(GL_POINT_SPRITE);
-
- ::glClearColor(0, 0, 0, 0);
-}
-
-GraphicsContext3D::~GraphicsContext3D()
-{
- if (m_contextObj) {
- CGLSetCurrentContext(m_contextObj);
- ::glDeleteTextures(1, &m_texture);
- if (m_attrs.antialias) {
- ::glDeleteRenderbuffersEXT(1, &m_multisampleColorBuffer);
- if (m_attrs.stencil || m_attrs.depth)
- ::glDeleteRenderbuffersEXT(1, &m_multisampleDepthStencilBuffer);
- ::glDeleteFramebuffersEXT(1, &m_multisampleFBO);
- } else {
- if (m_attrs.stencil || m_attrs.depth)
- ::glDeleteRenderbuffersEXT(1, &m_depthStencilBuffer);
- }
- ::glDeleteFramebuffersEXT(1, &m_fbo);
- CGLSetCurrentContext(0);
- CGLDestroyContext(m_contextObj);
- }
-}
-
-void GraphicsContext3D::makeContextCurrent()
-{
- if (!m_contextObj)
- return;
-
- CGLContextObj currentContext = CGLGetCurrentContext();
- if (currentContext != m_contextObj)
- CGLSetCurrentContext(m_contextObj);
-}
-
-bool GraphicsContext3D::isGLES2Compliant() const
-{
- return false;
-}
-
-}
-
-#endif // ENABLE(3D_CANVAS)
diff --git a/WebCore/platform/graphics/mac/GraphicsContextMac.mm b/WebCore/platform/graphics/mac/GraphicsContextMac.mm
deleted file mode 100644
index 6a4fa03..0000000
--- a/WebCore/platform/graphics/mac/GraphicsContextMac.mm
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2003, 2004, 2005, 2006, 2010 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#import "config.h"
-#import "GraphicsContext.h"
-
-#import "GraphicsContextPlatformPrivateCG.h"
-#import <AppKit/AppKit.h>
-#import <wtf/StdLibExtras.h>
-
-#import "LocalCurrentGraphicsContext.h"
-#import "WebCoreSystemInterface.h"
-
-@class NSColor;
-
-// FIXME: More of this should use CoreGraphics instead of AppKit.
-// FIXME: More of this should move into GraphicsContextCG.cpp.
-
-namespace WebCore {
-
-// NSColor, NSBezierPath, and NSGraphicsContext
-// calls in this file are all exception-safe, so we don't block
-// exceptions for those.
-
-static void drawFocusRingToContext(CGContextRef context, CGPathRef focusRingPath, CGColorRef color, int radius)
-{
-#ifdef BUILDING_ON_TIGER
- CGContextBeginTransparencyLayer(context, 0);
-#endif
- CGContextBeginPath(context);
- CGContextAddPath(context, focusRingPath);
- wkDrawFocusRing(context, color, radius);
-#ifdef BUILDING_ON_TIGER
- CGContextEndTransparencyLayer(context);
-#endif
-}
-
-void GraphicsContext::drawFocusRing(const Path& path, int width, int /*offset*/, const Color& color)
-{
- // FIXME: Use 'offset' for something? http://webkit.org/b/49909
-
- if (paintingDisabled())
- return;
-
- int radius = (width - 1) / 2;
- CGColorRef colorRef = color.isValid() ? cachedCGColor(color, ColorSpaceDeviceRGB) : 0;
-
- drawFocusRingToContext(platformContext(), path.platformPath(), colorRef, radius);
-}
-
-void GraphicsContext::drawFocusRing(const Vector<IntRect>& rects, int width, int offset, const Color& color)
-{
- if (paintingDisabled())
- return;
-
- int radius = (width - 1) / 2;
- offset += radius;
- CGColorRef colorRef = color.isValid() ? cachedCGColor(color, ColorSpaceDeviceRGB) : 0;
-
- RetainPtr<CGMutablePathRef> focusRingPath(AdoptCF, CGPathCreateMutable());
- unsigned rectCount = rects.size();
- for (unsigned i = 0; i < rectCount; i++)
- CGPathAddRect(focusRingPath.get(), 0, CGRectInset(rects[i], -offset, -offset));
-
- drawFocusRingToContext(platformContext(), focusRingPath.get(), colorRef, radius);
-}
-
-#ifdef BUILDING_ON_TIGER // Post-Tiger's setPlatformCompositeOperation() is defined in GraphicsContextCG.cpp.
-void GraphicsContext::setPlatformCompositeOperation(CompositeOperator op)
-{
- if (paintingDisabled())
- return;
- NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
- [[NSGraphicsContext graphicsContextWithGraphicsPort:platformContext() flipped:YES]
- setCompositingOperation:(NSCompositingOperation)op];
- [pool drain];
-}
-#endif
-
-static NSColor* createPatternColor(NSString* name, NSColor* defaultColor, bool& usingDot)
-{
- NSImage *image = [NSImage imageNamed:name];
- ASSERT(image); // if image is not available, we want to know
- NSColor *color = (image ? [NSColor colorWithPatternImage:image] : nil);
- if (color)
- usingDot = true;
- else
- color = defaultColor;
- return color;
-}
-
-// WebKit on Mac is a standard platform component, so it must use the standard platform artwork for underline.
-void GraphicsContext::drawLineForTextChecking(const IntPoint& point, int width, TextCheckingLineStyle style)
-{
- if (paintingDisabled())
- return;
-
- // These are the same for misspelling or bad grammar.
- int patternHeight = cMisspellingLineThickness;
- int patternWidth = cMisspellingLinePatternWidth;
-
- bool usingDot;
- NSColor *patternColor;
- switch (style) {
- case TextCheckingSpellingLineStyle:
- {
- // Constants for spelling pattern color.
- static bool usingDotForSpelling = false;
- DEFINE_STATIC_LOCAL(RetainPtr<NSColor>, spellingPatternColor, (createPatternColor(@"SpellingDot", [NSColor redColor], usingDotForSpelling)));
- usingDot = usingDotForSpelling;
- patternColor = spellingPatternColor.get();
- break;
- }
- case TextCheckingGrammarLineStyle:
- {
- // Constants for grammar pattern color.
- static bool usingDotForGrammar = false;
- DEFINE_STATIC_LOCAL(RetainPtr<NSColor>, grammarPatternColor, (createPatternColor(@"GrammarDot", [NSColor greenColor], usingDotForGrammar)));
- usingDot = usingDotForGrammar;
- patternColor = grammarPatternColor.get();
- break;
- }
-#if PLATFORM(MAC) && !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
- // To support correction panel.
- case TextCheckingReplacementLineStyle:
- {
- // Constants for spelling pattern color.
- static bool usingDotForSpelling = false;
- DEFINE_STATIC_LOCAL(RetainPtr<NSColor>, spellingPatternColor, (createPatternColor(@"CorrectionDot", [NSColor blueColor], usingDotForSpelling)));
- usingDot = usingDotForSpelling;
- patternColor = spellingPatternColor.get();
- break;
- }
-#endif
- default:
- return;
- }
-
- // Make sure to draw only complete dots.
- // NOTE: Code here used to shift the underline to the left and increase the width
- // to make sure everything gets underlined, but that results in drawing out of
- // bounds (e.g. when at the edge of a view) and could make it appear that the
- // space between adjacent misspelled words was underlined.
- if (usingDot) {
- // allow slightly more considering that the pattern ends with a transparent pixel
- int widthMod = width % patternWidth;
- if (patternWidth - widthMod > cMisspellingLinePatternGapWidth)
- width -= widthMod;
- }
-
- // FIXME: This code should not use NSGraphicsContext currentContext
- // In order to remove this requirement we will need to use CGPattern instead of NSColor
- // FIXME: This code should not be using wkSetPatternPhaseInUserSpace, as this approach is wrong
- // for transforms.
-
- // Draw underline.
- LocalCurrentGraphicsContext localContext(this);
- NSGraphicsContext *currentContext = [NSGraphicsContext currentContext];
- CGContextRef context = (CGContextRef)[currentContext graphicsPort];
- CGContextSaveGState(context);
-
- [patternColor set];
-
- wkSetPatternPhaseInUserSpace(context, point);
-
- NSRectFillUsingOperation(NSMakeRect(point.x(), point.y(), width, patternHeight), NSCompositeSourceOver);
-
- CGContextRestoreGState(context);
-}
-
-}
diff --git a/WebCore/platform/graphics/mac/IconMac.mm b/WebCore/platform/graphics/mac/IconMac.mm
deleted file mode 100644
index bc8c312..0000000
--- a/WebCore/platform/graphics/mac/IconMac.mm
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- */
-
-#import "config.h"
-#import "Icon.h"
-
-#import "GraphicsContext.h"
-#import "LocalCurrentGraphicsContext.h"
-#import "PlatformString.h"
-#import <wtf/PassRefPtr.h>
-
-namespace WebCore {
-
-Icon::Icon(NSImage *image)
- : m_nsImage(image)
-{
- // Need this because WebCore uses AppKit's flipped coordinate system exclusively.
- [image setFlipped:YES];
-}
-
-Icon::~Icon()
-{
-}
-
-// FIXME: Move the code to ChromeClient::iconForFiles().
-PassRefPtr<Icon> Icon::createIconForFiles(const Vector<String>& filenames)
-{
- if (filenames.isEmpty())
- return 0;
-
- bool useIconFromFirstFile;
-#ifdef BUILDING_ON_TIGER
- // FIXME: find a better image for multiple files to use on Tiger.
- useIconFromFirstFile = true;
-#else
- useIconFromFirstFile = filenames.size() == 1;
-#endif
- if (useIconFromFirstFile) {
- // Don't pass relative filenames -- we don't want a result that depends on the current directory.
- // Need 0U here to disambiguate String::operator[] from operator(NSString*, int)[]
- if (filenames[0].isEmpty() || filenames[0][0U] != '/')
- return 0;
-
- NSImage* image = [[NSWorkspace sharedWorkspace] iconForFile:filenames[0]];
- if (!image)
- return 0;
-
- return adoptRef(new Icon(image));
- }
-#ifdef BUILDING_ON_TIGER
- return 0;
-#else
- NSImage* image = [NSImage imageNamed:NSImageNameMultipleDocuments];
- if (!image)
- return 0;
-
- return adoptRef(new Icon(image));
-#endif
-}
-
-void Icon::paint(GraphicsContext* context, const IntRect& rect)
-{
- if (context->paintingDisabled())
- return;
-
- LocalCurrentGraphicsContext localCurrentGC(context);
-
- [m_nsImage.get() drawInRect:rect
- fromRect:NSMakeRect(0, 0, [m_nsImage.get() size].width, [m_nsImage.get() size].height)
- operation:NSCompositeSourceOver fraction:1.0f];
-}
-
-}
diff --git a/WebCore/platform/graphics/mac/ImageMac.mm b/WebCore/platform/graphics/mac/ImageMac.mm
deleted file mode 100644
index 6ad3080..0000000
--- a/WebCore/platform/graphics/mac/ImageMac.mm
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#import "config.h"
-#import "BitmapImage.h"
-
-#import "FloatRect.h"
-#import "GraphicsContext.h"
-#import "PlatformString.h"
-#import "SharedBuffer.h"
-
-@interface WebCoreBundleFinder : NSObject
-@end
-
-@implementation WebCoreBundleFinder
-@end
-
-namespace WebCore {
-
-void BitmapImage::initPlatformData()
-{
-}
-
-void BitmapImage::invalidatePlatformData()
-{
- if (m_frames.size() != 1)
- return;
-
- m_nsImage = 0;
- m_tiffRep = 0;
-}
-
-PassRefPtr<Image> Image::loadPlatformResource(const char *name)
-{
- NSBundle *bundle = [NSBundle bundleForClass:[WebCoreBundleFinder class]];
- NSString *imagePath = [bundle pathForResource:[NSString stringWithUTF8String:name] ofType:@"tiff"];
- NSData *namedImageData = [NSData dataWithContentsOfFile:imagePath];
- if (namedImageData) {
- RefPtr<Image> image = BitmapImage::create();
- image->setData(SharedBuffer::wrapNSData(namedImageData), true);
- return image.release();
- }
-
- // We have reports indicating resource loads are failing, but we don't yet know the root cause(s).
- // Two theories are bad installs (image files are missing), and too-many-open-files.
- // See rdar://5607381
- ASSERT_NOT_REACHED();
- return Image::nullImage();
-}
-
-CFDataRef BitmapImage::getTIFFRepresentation()
-{
- if (m_tiffRep)
- return m_tiffRep.get();
-
- unsigned numFrames = frameCount();
-
- // If numFrames is zero, we know for certain this image doesn't have valid data
- // Even though the call to CGImageDestinationCreateWithData will fail and we'll handle it gracefully,
- // in certain circumstances that call will spam the console with an error message
- if (!numFrames)
- return 0;
-
- Vector<CGImageRef> images;
- for (unsigned i = 0; i < numFrames; ++i ) {
- CGImageRef cgImage = frameAtIndex(i);
- if (cgImage)
- images.append(cgImage);
- }
-
- unsigned numValidFrames = images.size();
-
- RetainPtr<CFMutableDataRef> data(AdoptCF, CFDataCreateMutable(0, 0));
- // FIXME: Use type kCGImageTypeIdentifierTIFF constant once is becomes available in the API
- RetainPtr<CGImageDestinationRef> destination(AdoptCF, CGImageDestinationCreateWithData(data.get(), CFSTR("public.tiff"), numValidFrames, 0));
-
- if (!destination)
- return 0;
-
- for (unsigned i = 0; i < numValidFrames; ++i)
- CGImageDestinationAddImage(destination.get(), images[i], 0);
-
- CGImageDestinationFinalize(destination.get());
-
- m_tiffRep = data;
- return m_tiffRep.get();
-}
-
-NSImage* BitmapImage::getNSImage()
-{
- if (m_nsImage)
- return m_nsImage.get();
-
- CFDataRef data = getTIFFRepresentation();
- if (!data)
- return 0;
-
- m_nsImage.adoptNS([[NSImage alloc] initWithData:(NSData*)data]);
- return m_nsImage.get();
-}
-
-}
diff --git a/WebCore/platform/graphics/mac/IntPointMac.mm b/WebCore/platform/graphics/mac/IntPointMac.mm
deleted file mode 100644
index 7a2e730..0000000
--- a/WebCore/platform/graphics/mac/IntPointMac.mm
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "IntPoint.h"
-
-namespace WebCore {
-
-#ifndef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES
-
-IntPoint::IntPoint(const NSPoint& p) : m_x(static_cast<int>(p.x)), m_y(static_cast<int>(p.y))
-{
-}
-
-IntPoint::operator NSPoint() const
-{
- return NSMakePoint(m_x, m_y);
-}
-
-#endif
-
-}
diff --git a/WebCore/platform/graphics/mac/IntRectMac.mm b/WebCore/platform/graphics/mac/IntRectMac.mm
deleted file mode 100644
index 738618a..0000000
--- a/WebCore/platform/graphics/mac/IntRectMac.mm
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2003, 2006 Apple Computer, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "IntRect.h"
-
-namespace WebCore {
-
-#ifndef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES
-
-IntRect::operator NSRect() const
-{
- return NSMakeRect(x(), y(), width(), height());
-}
-
-IntRect enclosingIntRect(const NSRect& rect)
-{
- int l = static_cast<int>(floorf(rect.origin.x));
- int t = static_cast<int>(floorf(rect.origin.y));
- int r = static_cast<int>(ceilf(NSMaxX(rect)));
- int b = static_cast<int>(ceilf(NSMaxY(rect)));
- return IntRect(l, t, r - l, b - t);
-}
-
-#endif
-
-}
diff --git a/WebCore/platform/graphics/mac/IntSizeMac.mm b/WebCore/platform/graphics/mac/IntSizeMac.mm
deleted file mode 100644
index c7dcd88..0000000
--- a/WebCore/platform/graphics/mac/IntSizeMac.mm
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "IntSize.h"
-
-namespace WebCore {
-
-#ifndef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES
-
-IntSize::IntSize(const NSSize& s) : m_width(static_cast<int>(s.width)), m_height(static_cast<int>(s.height))
-{
-}
-
-IntSize::operator NSSize() const
-{
- return NSMakeSize(m_width, m_height);
-}
-
-#endif
-
-}
diff --git a/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h b/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h
deleted file mode 100644
index 95ab456..0000000
--- a/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef MediaPlayerPrivateQTKit_h
-#define MediaPlayerPrivateQTKit_h
-
-#if ENABLE(VIDEO)
-
-#include "MediaPlayerPrivate.h"
-#include "Timer.h"
-#include "FloatSize.h"
-#include <wtf/RetainPtr.h>
-
-#ifdef __OBJC__
-#import <QTKit/QTTime.h>
-@class QTMovie;
-@class QTMovieView;
-@class QTMovieLayer;
-@class QTVideoRendererWebKitOnly;
-@class WebCoreMovieObserver;
-#else
-class QTMovie;
-class QTMovieView;
-class QTTime;
-class QTMovieLayer;
-class QTVideoRendererWebKitOnly;
-class WebCoreMovieObserver;
-#endif
-
-#ifndef DRAW_FRAME_RATE
-#define DRAW_FRAME_RATE 0
-#endif
-
-namespace WebCore {
-
-class MediaPlayerPrivateQTKit : public MediaPlayerPrivateInterface {
-public:
- static void registerMediaEngine(MediaEngineRegistrar);
-
- void repaint();
- void loadStateChanged();
- void rateChanged();
- void sizeChanged();
- void timeChanged();
- void didEnd();
-
-private:
- MediaPlayerPrivateQTKit(MediaPlayer*);
- ~MediaPlayerPrivateQTKit();
-
- // engine support
- static MediaPlayerPrivateInterface* create(MediaPlayer* player);
- static void getSupportedTypes(HashSet<String>& types);
- static MediaPlayer::SupportsType supportsType(const String& type, const String& codecs);
- static bool isAvailable();
-
- PlatformMedia platformMedia() const;
-#if USE(ACCELERATED_COMPOSITING)
- PlatformLayer* platformLayer() const;
-#endif
-
- IntSize naturalSize() const;
- bool hasVideo() const;
- bool hasAudio() const;
- bool supportsFullscreen() const;
-
- void load(const String& url);
- void cancelLoad();
- void loadInternal(const String& url);
- void resumeLoad();
-
- void play();
- void pause();
- void prepareToPlay();
-
- bool paused() const;
- bool seeking() const;
-
- float duration() const;
- float currentTime() const;
- void seek(float time);
-
- void setRate(float);
- void setVolume(float);
- void setPreservesPitch(bool);
-
- bool hasClosedCaptions() const;
- void setClosedCaptionsVisible(bool);
-
- void setPreload(MediaPlayer::Preload);
-
- MediaPlayer::NetworkState networkState() const { return m_networkState; }
- MediaPlayer::ReadyState readyState() const { return m_readyState; }
-
- PassRefPtr<TimeRanges> buffered() const;
- float maxTimeSeekable() const;
- unsigned bytesLoaded() const;
- unsigned totalBytes() const;
-
- void setVisible(bool);
- void setSize(const IntSize&);
-
- virtual bool hasAvailableVideoFrame() const;
-
- void paint(GraphicsContext*, const IntRect&);
- void paintCurrentFrameInContext(GraphicsContext*, const IntRect&);
- virtual void prepareForRendering();
-
-
-#if USE(ACCELERATED_COMPOSITING)
- bool supportsAcceleratedRendering() const;
- void acceleratedRenderingStateChanged();
-#endif
-
- bool hasSingleSecurityOrigin() const;
- MediaPlayer::MovieLoadType movieLoadType() const;
-
- void createQTMovie(const String& url);
- void createQTMovie(NSURL *, NSDictionary *movieAttributes);
-
- enum MediaRenderingMode { MediaRenderingNone, MediaRenderingMovieView, MediaRenderingSoftwareRenderer, MediaRenderingMovieLayer };
- MediaRenderingMode currentRenderingMode() const;
- MediaRenderingMode preferredRenderingMode() const;
-
- void setUpVideoRendering();
- void tearDownVideoRendering();
- bool hasSetUpVideoRendering() const;
-
- void createQTMovieView();
- void detachQTMovieView();
-
- enum QTVideoRendererMode { QTVideoRendererModeDefault, QTVideoRendererModeListensForNewImages };
- void createQTVideoRenderer(QTVideoRendererMode rendererMode);
- void destroyQTVideoRenderer();
-
- void createQTMovieLayer();
- void destroyQTMovieLayer();
-
- QTTime createQTTime(float time) const;
-
- void updateStates();
- void doSeek();
- void cancelSeek();
- void seekTimerFired(Timer<MediaPlayerPrivateQTKit>*);
- float maxTimeLoaded() const;
- void disableUnsupportedTracks();
-
- void sawUnsupportedTracks();
- void cacheMovieScale();
- bool metaDataAvailable() const { return m_qtMovie && m_readyState >= MediaPlayer::HaveMetadata; }
-
- bool isReadyForVideoSetup() const;
-
- virtual float mediaTimeForTimeValue(float) const;
-
- virtual double maximumDurationToCacheMediaTime() const { return 5; }
-
- MediaPlayer* m_player;
- RetainPtr<QTMovie> m_qtMovie;
- RetainPtr<QTMovieView> m_qtMovieView;
- RetainPtr<QTVideoRendererWebKitOnly> m_qtVideoRenderer;
- RetainPtr<WebCoreMovieObserver> m_objcObserver;
- String m_movieURL;
- float m_seekTo;
- Timer<MediaPlayerPrivateQTKit> m_seekTimer;
- MediaPlayer::NetworkState m_networkState;
- MediaPlayer::ReadyState m_readyState;
- IntRect m_rect;
- FloatSize m_scaleFactor;
- unsigned m_enabledTrackCount;
- unsigned m_totalTrackCount;
- float m_reportedDuration;
- float m_cachedDuration;
- float m_timeToRestore;
- RetainPtr<QTMovieLayer> m_qtVideoLayer;
- MediaPlayer::Preload m_preload;
- bool m_startedPlaying;
- bool m_isStreaming;
- bool m_visible;
- bool m_hasUnsupportedTracks;
- bool m_videoFrameHasDrawn;
- bool m_delayingLoad;
- bool m_isAllowedToRender;
-#if DRAW_FRAME_RATE
- int m_frameCountWhilePlaying;
- double m_timeStartedPlaying;
- double m_timeStoppedPlaying;
-#endif
-};
-
-}
-
-#endif
-#endif
diff --git a/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm b/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm
deleted file mode 100644
index 2361f6a..0000000
--- a/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm
+++ /dev/null
@@ -1,1673 +0,0 @@
-/*
- * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#import "config.h"
-
-#if ENABLE(VIDEO)
-
-#import "MediaPlayerPrivateQTKit.h"
-
-#ifdef BUILDING_ON_TIGER
-#import "AutodrainedPool.h"
-#endif
-
-#import "BlockExceptions.h"
-#import "FrameView.h"
-#import "GraphicsContext.h"
-#import "KURL.h"
-#import "MIMETypeRegistry.h"
-#import "SoftLinking.h"
-#import "TimeRanges.h"
-#import "WebCoreSystemInterface.h"
-#import <QTKit/QTKit.h>
-#import <objc/objc-runtime.h>
-#import <wtf/UnusedParam.h>
-
-#if USE(ACCELERATED_COMPOSITING)
-#include "GraphicsLayer.h"
-#endif
-
-#if DRAW_FRAME_RATE
-#import "Font.h"
-#import "Frame.h"
-#import "Document.h"
-#import "RenderObject.h"
-#import "RenderStyle.h"
-#endif
-
-#ifdef BUILDING_ON_TIGER
-static IMP method_setImplementation(Method m, IMP imp)
-{
- IMP result = m->method_imp;
- m->method_imp = imp;
- return result;
-}
-#endif
-
-SOFT_LINK_FRAMEWORK(QTKit)
-
-SOFT_LINK(QTKit, QTMakeTime, QTTime, (long long timeValue, long timeScale), (timeValue, timeScale))
-
-SOFT_LINK_CLASS(QTKit, QTMovie)
-SOFT_LINK_CLASS(QTKit, QTMovieView)
-SOFT_LINK_CLASS(QTKit, QTMovieLayer)
-
-SOFT_LINK_POINTER(QTKit, QTTrackMediaTypeAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMediaTypeAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMediaTypeBase, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMediaTypeMPEG, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMediaTypeSound, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMediaTypeText, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMediaTypeVideo, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieAskUnresolvedDataRefsAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieLoopsAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieDataSizeAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieDidEndNotification, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieHasVideoAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieHasAudioAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieIsActiveAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieLoadStateAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieLoadStateDidChangeNotification, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieNaturalSizeAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieCurrentSizeAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMoviePreventExternalURLLinksAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieRateChangesPreservePitchAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieRateDidChangeNotification, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieSizeDidChangeNotification, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieTimeDidChangeNotification, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieTimeScaleAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieURLAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieVolumeDidChangeNotification, NSString *)
-SOFT_LINK_POINTER(QTKit, QTSecurityPolicyNoCrossSiteAttribute, NSString *)
-SOFT_LINK_POINTER(QTKit, QTVideoRendererWebKitOnlyNewImageAvailableNotification, NSString *)
-#ifndef BUILDING_ON_TIGER
-SOFT_LINK_POINTER(QTKit, QTMovieApertureModeClean, NSString *)
-SOFT_LINK_POINTER(QTKit, QTMovieApertureModeAttribute, NSString *)
-#endif
-
-#define QTMovie getQTMovieClass()
-#define QTMovieView getQTMovieViewClass()
-#define QTMovieLayer getQTMovieLayerClass()
-
-#define QTTrackMediaTypeAttribute getQTTrackMediaTypeAttribute()
-#define QTMediaTypeAttribute getQTMediaTypeAttribute()
-#define QTMediaTypeBase getQTMediaTypeBase()
-#define QTMediaTypeMPEG getQTMediaTypeMPEG()
-#define QTMediaTypeSound getQTMediaTypeSound()
-#define QTMediaTypeText getQTMediaTypeText()
-#define QTMediaTypeVideo getQTMediaTypeVideo()
-#define QTMovieAskUnresolvedDataRefsAttribute getQTMovieAskUnresolvedDataRefsAttribute()
-#define QTMovieLoopsAttribute getQTMovieLoopsAttribute()
-#define QTMovieDataSizeAttribute getQTMovieDataSizeAttribute()
-#define QTMovieDidEndNotification getQTMovieDidEndNotification()
-#define QTMovieHasVideoAttribute getQTMovieHasVideoAttribute()
-#define QTMovieHasAudioAttribute getQTMovieHasAudioAttribute()
-#define QTMovieIsActiveAttribute getQTMovieIsActiveAttribute()
-#define QTMovieLoadStateAttribute getQTMovieLoadStateAttribute()
-#define QTMovieLoadStateDidChangeNotification getQTMovieLoadStateDidChangeNotification()
-#define QTMovieNaturalSizeAttribute getQTMovieNaturalSizeAttribute()
-#define QTMovieCurrentSizeAttribute getQTMovieCurrentSizeAttribute()
-#define QTMoviePreventExternalURLLinksAttribute getQTMoviePreventExternalURLLinksAttribute()
-#define QTMovieRateChangesPreservePitchAttribute getQTMovieRateChangesPreservePitchAttribute()
-#define QTMovieRateDidChangeNotification getQTMovieRateDidChangeNotification()
-#define QTMovieSizeDidChangeNotification getQTMovieSizeDidChangeNotification()
-#define QTMovieTimeDidChangeNotification getQTMovieTimeDidChangeNotification()
-#define QTMovieTimeScaleAttribute getQTMovieTimeScaleAttribute()
-#define QTMovieURLAttribute getQTMovieURLAttribute()
-#define QTMovieVolumeDidChangeNotification getQTMovieVolumeDidChangeNotification()
-#define QTSecurityPolicyNoCrossSiteAttribute getQTSecurityPolicyNoCrossSiteAttribute()
-#define QTVideoRendererWebKitOnlyNewImageAvailableNotification getQTVideoRendererWebKitOnlyNewImageAvailableNotification()
-#ifndef BUILDING_ON_TIGER
-#define QTMovieApertureModeClean getQTMovieApertureModeClean()
-#define QTMovieApertureModeAttribute getQTMovieApertureModeAttribute()
-#endif
-
-// Older versions of the QTKit header don't have these constants.
-#if !defined QTKIT_VERSION_MAX_ALLOWED || QTKIT_VERSION_MAX_ALLOWED <= QTKIT_VERSION_7_0
-enum {
- QTMovieLoadStateError = -1L,
- QTMovieLoadStateLoaded = 2000L,
- QTMovieLoadStatePlayable = 10000L,
- QTMovieLoadStatePlaythroughOK = 20000L,
- QTMovieLoadStateComplete = 100000L
-};
-#endif
-
-@interface FakeQTMovieView : NSObject
-- (WebCoreMovieObserver *)delegate;
-@end
-
-using namespace WebCore;
-using namespace std;
-
-@interface WebCoreMovieObserver : NSObject
-{
- MediaPlayerPrivateQTKit* m_callback;
- NSView* m_view;
- BOOL m_delayCallbacks;
-}
--(id)initWithCallback:(MediaPlayerPrivateQTKit*)callback;
--(void)disconnect;
--(void)setView:(NSView*)view;
--(void)repaint;
--(void)setDelayCallbacks:(BOOL)shouldDelay;
--(void)loadStateChanged:(NSNotification *)notification;
--(void)rateChanged:(NSNotification *)notification;
--(void)sizeChanged:(NSNotification *)notification;
--(void)timeChanged:(NSNotification *)notification;
--(void)didEnd:(NSNotification *)notification;
-@end
-
-@protocol WebKitVideoRenderingDetails
--(void)setMovie:(id)movie;
--(void)drawInRect:(NSRect)rect;
-@end
-
-namespace WebCore {
-
-#ifdef BUILDING_ON_TIGER
-static const long minimumQuickTimeVersion = 0x07300000; // 7.3
-#endif
-
-
-MediaPlayerPrivateInterface* MediaPlayerPrivateQTKit::create(MediaPlayer* player)
-{
- return new MediaPlayerPrivateQTKit(player);
-}
-
-void MediaPlayerPrivateQTKit::registerMediaEngine(MediaEngineRegistrar registrar)
-{
- if (isAvailable())
- registrar(create, getSupportedTypes, supportsType);
-}
-
-MediaPlayerPrivateQTKit::MediaPlayerPrivateQTKit(MediaPlayer* player)
- : m_player(player)
- , m_objcObserver(AdoptNS, [[WebCoreMovieObserver alloc] initWithCallback:this])
- , m_seekTo(-1)
- , m_seekTimer(this, &MediaPlayerPrivateQTKit::seekTimerFired)
- , m_networkState(MediaPlayer::Empty)
- , m_readyState(MediaPlayer::HaveNothing)
- , m_rect()
- , m_scaleFactor(1, 1)
- , m_enabledTrackCount(0)
- , m_totalTrackCount(0)
- , m_reportedDuration(-1)
- , m_cachedDuration(-1)
- , m_timeToRestore(-1)
- , m_preload(MediaPlayer::Auto)
- , m_startedPlaying(false)
- , m_isStreaming(false)
- , m_visible(false)
- , m_hasUnsupportedTracks(false)
- , m_videoFrameHasDrawn(false)
- , m_isAllowedToRender(false)
-#if DRAW_FRAME_RATE
- , m_frameCountWhilePlaying(0)
- , m_timeStartedPlaying(0)
- , m_timeStoppedPlaying(0)
-#endif
-{
-}
-
-MediaPlayerPrivateQTKit::~MediaPlayerPrivateQTKit()
-{
- tearDownVideoRendering();
-
- [[NSNotificationCenter defaultCenter] removeObserver:m_objcObserver.get()];
- [m_objcObserver.get() disconnect];
-}
-
-void MediaPlayerPrivateQTKit::createQTMovie(const String& url)
-{
- NSURL *cocoaURL = KURL(ParsedURLString, url);
- NSMutableDictionary *movieAttributes = [NSMutableDictionary dictionaryWithObjectsAndKeys:
- cocoaURL, QTMovieURLAttribute,
- [NSNumber numberWithBool:m_player->preservesPitch()], QTMovieRateChangesPreservePitchAttribute,
- [NSNumber numberWithBool:YES], QTMoviePreventExternalURLLinksAttribute,
- [NSNumber numberWithBool:YES], QTSecurityPolicyNoCrossSiteAttribute,
- [NSNumber numberWithBool:NO], QTMovieAskUnresolvedDataRefsAttribute,
- [NSNumber numberWithBool:NO], QTMovieLoopsAttribute,
-#ifndef BUILDING_ON_TIGER
- QTMovieApertureModeClean, QTMovieApertureModeAttribute,
-#endif
- nil];
-
-#if !defined(BUILDING_ON_LEOPARD)
- CFDictionaryRef proxySettings = CFNetworkCopySystemProxySettings();
- CFArrayRef proxiesForURL = CFNetworkCopyProxiesForURL((CFURLRef)cocoaURL, proxySettings);
- BOOL willUseProxy = YES;
-
- if (!proxiesForURL || !CFArrayGetCount(proxiesForURL))
- willUseProxy = NO;
-
- if (CFArrayGetCount(proxiesForURL) == 1) {
- CFDictionaryRef proxy = (CFDictionaryRef)CFArrayGetValueAtIndex(proxiesForURL, 0);
- ASSERT(CFGetTypeID(proxy) == CFDictionaryGetTypeID());
-
- CFStringRef proxyType = (CFStringRef)CFDictionaryGetValue(proxy, kCFProxyTypeKey);
- ASSERT(CFGetTypeID(proxyType) == CFStringGetTypeID());
-
- if (CFStringCompare(proxyType, kCFProxyTypeNone, 0) == kCFCompareEqualTo)
- willUseProxy = NO;
- }
-
- if (!willUseProxy) {
- // Only pass the QTMovieOpenForPlaybackAttribute flag if there are no proxy servers, due
- // to rdar://problem/7531776.
- [movieAttributes setObject:[NSNumber numberWithBool:YES] forKey:@"QTMovieOpenForPlaybackAttribute"];
- }
-
- if (proxiesForURL)
- CFRelease(proxiesForURL);
- if (proxySettings)
- CFRelease(proxySettings);
-#endif
-
- createQTMovie(cocoaURL, movieAttributes);
-}
-
-static void disableComponentsOnce()
-{
- static bool sComponentsDisabled = false;
- if (sComponentsDisabled)
- return;
- sComponentsDisabled = true;
-
- // eat/PDF and grip/PDF components must be disabled twice since they are registered twice
- // with different flags. However, there is currently a bug in 64-bit QTKit (<rdar://problem/8378237>)
- // which causes subsequent disable component requests of exactly the same type to be ignored if
- // QTKitServer has not yet started. As a result, we must pass in exactly the flags we want to
- // disable per component. As a failsafe, if in the future these flags change, we will disable the
- // PDF components for a third time with a wildcard flags field:
- uint32_t componentsToDisable[11][5] = {
- {'eat ', 'TEXT', 'text', 0, 0},
- {'eat ', 'TXT ', 'text', 0, 0},
- {'eat ', 'utxt', 'text', 0, 0},
- {'eat ', 'TEXT', 'tx3g', 0, 0},
- {'eat ', 'PDF ', 'vide', 0x44802, 0},
- {'eat ', 'PDF ', 'vide', 0x45802, 0},
- {'eat ', 'PDF ', 'vide', 0, 0},
- {'grip', 'PDF ', 'appl', 0x844a00, 0},
- {'grip', 'PDF ', 'appl', 0x845a00, 0},
- {'grip', 'PDF ', 'appl', 0, 0},
- {'imdc', 'pdf ', 'appl', 0, 0},
- };
-
- for (size_t i = 0; i < WTF_ARRAY_LENGTH(componentsToDisable); ++i)
- wkQTMovieDisableComponent(componentsToDisable[i]);
-}
-
-void MediaPlayerPrivateQTKit::createQTMovie(NSURL *url, NSDictionary *movieAttributes)
-{
- disableComponentsOnce();
-
- [[NSNotificationCenter defaultCenter] removeObserver:m_objcObserver.get()];
-
- bool recreating = false;
- if (m_qtMovie) {
- recreating = true;
- destroyQTVideoRenderer();
- m_qtMovie = 0;
- }
-
- // Disable rtsp streams for now, <rdar://problem/5693967>
- if (protocolIs([url scheme], "rtsp"))
- return;
-
- NSError *error = nil;
- m_qtMovie.adoptNS([[QTMovie alloc] initWithAttributes:movieAttributes error:&error]);
-
- if (!m_qtMovie)
- return;
-
- [m_qtMovie.get() setVolume:m_player->volume()];
-
- if (recreating && hasVideo())
- createQTVideoRenderer(QTVideoRendererModeListensForNewImages);
-
- [[NSNotificationCenter defaultCenter] addObserver:m_objcObserver.get()
- selector:@selector(loadStateChanged:)
- name:QTMovieLoadStateDidChangeNotification
- object:m_qtMovie.get()];
-
- // In updateState(), we track when maxTimeLoaded() == duration().
- // In newer version of QuickTime, a notification is emitted when maxTimeLoaded changes.
- // In older version of QuickTime, QTMovieLoadStateDidChangeNotification be fired.
- if (NSString *maxTimeLoadedChangeNotification = wkQTMovieMaxTimeLoadedChangeNotification()) {
- [[NSNotificationCenter defaultCenter] addObserver:m_objcObserver.get()
- selector:@selector(loadStateChanged:)
- name:maxTimeLoadedChangeNotification
- object:m_qtMovie.get()];
- }
-
- [[NSNotificationCenter defaultCenter] addObserver:m_objcObserver.get()
- selector:@selector(rateChanged:)
- name:QTMovieRateDidChangeNotification
- object:m_qtMovie.get()];
- [[NSNotificationCenter defaultCenter] addObserver:m_objcObserver.get()
- selector:@selector(sizeChanged:)
- name:QTMovieSizeDidChangeNotification
- object:m_qtMovie.get()];
- [[NSNotificationCenter defaultCenter] addObserver:m_objcObserver.get()
- selector:@selector(timeChanged:)
- name:QTMovieTimeDidChangeNotification
- object:m_qtMovie.get()];
- [[NSNotificationCenter defaultCenter] addObserver:m_objcObserver.get()
- selector:@selector(didEnd:)
- name:QTMovieDidEndNotification
- object:m_qtMovie.get()];
-}
-
-static void mainThreadSetNeedsDisplay(id self, SEL)
-{
- id view = [self superview];
- ASSERT(!view || [view isKindOfClass:[QTMovieView class]]);
- if (!view || ![view isKindOfClass:[QTMovieView class]])
- return;
-
- FakeQTMovieView *movieView = static_cast<FakeQTMovieView *>(view);
- WebCoreMovieObserver* delegate = [movieView delegate];
- ASSERT(!delegate || [delegate isKindOfClass:[WebCoreMovieObserver class]]);
- if (!delegate || ![delegate isKindOfClass:[WebCoreMovieObserver class]])
- return;
-
- [delegate repaint];
-}
-
-static Class QTVideoRendererClass()
-{
- static Class QTVideoRendererWebKitOnlyClass = NSClassFromString(@"QTVideoRendererWebKitOnly");
- return QTVideoRendererWebKitOnlyClass;
-}
-
-void MediaPlayerPrivateQTKit::createQTMovieView()
-{
- detachQTMovieView();
-
- static bool addedCustomMethods = false;
- if (!m_player->inMediaDocument() && !addedCustomMethods) {
- Class QTMovieContentViewClass = NSClassFromString(@"QTMovieContentView");
- ASSERT(QTMovieContentViewClass);
-
- Method mainThreadSetNeedsDisplayMethod = class_getInstanceMethod(QTMovieContentViewClass, @selector(_mainThreadSetNeedsDisplay));
- ASSERT(mainThreadSetNeedsDisplayMethod);
-
- method_setImplementation(mainThreadSetNeedsDisplayMethod, reinterpret_cast<IMP>(mainThreadSetNeedsDisplay));
- addedCustomMethods = true;
- }
-
- // delay callbacks as we *will* get notifications during setup
- [m_objcObserver.get() setDelayCallbacks:YES];
-
- m_qtMovieView.adoptNS([[QTMovieView alloc] init]);
- setSize(m_player->size());
- NSView* parentView = m_player->frameView()->documentView();
- [parentView addSubview:m_qtMovieView.get()];
-#ifdef BUILDING_ON_TIGER
- // setDelegate: isn't a public call in Tiger, so use performSelector to keep the compiler happy
- [m_qtMovieView.get() performSelector:@selector(setDelegate:) withObject:m_objcObserver.get()];
-#else
- [m_qtMovieView.get() setDelegate:m_objcObserver.get()];
-#endif
- [m_objcObserver.get() setView:m_qtMovieView.get()];
- [m_qtMovieView.get() setMovie:m_qtMovie.get()];
- [m_qtMovieView.get() setControllerVisible:NO];
- [m_qtMovieView.get() setPreservesAspectRatio:NO];
- // the area not covered by video should be transparent
- [m_qtMovieView.get() setFillColor:[NSColor clearColor]];
-
- // If we're in a media document, allow QTMovieView to render in its default mode;
- // otherwise tell it to draw synchronously.
- // Note that we expect mainThreadSetNeedsDisplay to be invoked only when synchronous drawing is requested.
- if (!m_player->inMediaDocument())
- wkQTMovieViewSetDrawSynchronously(m_qtMovieView.get(), YES);
-
- [m_objcObserver.get() setDelayCallbacks:NO];
-}
-
-void MediaPlayerPrivateQTKit::detachQTMovieView()
-{
- if (m_qtMovieView) {
- [m_objcObserver.get() setView:nil];
-#ifdef BUILDING_ON_TIGER
- // setDelegate: isn't a public call in Tiger, so use performSelector to keep the compiler happy
- [m_qtMovieView.get() performSelector:@selector(setDelegate:) withObject:nil];
-#else
- [m_qtMovieView.get() setDelegate:nil];
-#endif
- [m_qtMovieView.get() removeFromSuperview];
- m_qtMovieView = nil;
- }
-}
-
-void MediaPlayerPrivateQTKit::createQTVideoRenderer(QTVideoRendererMode rendererMode)
-{
- destroyQTVideoRenderer();
-
- m_qtVideoRenderer.adoptNS([[QTVideoRendererClass() alloc] init]);
- if (!m_qtVideoRenderer)
- return;
-
- // associate our movie with our instance of QTVideoRendererWebKitOnly
- [(id<WebKitVideoRenderingDetails>)m_qtVideoRenderer.get() setMovie:m_qtMovie.get()];
-
- if (rendererMode == QTVideoRendererModeListensForNewImages) {
- // listen to QTVideoRendererWebKitOnly's QTVideoRendererWebKitOnlyNewImageDidBecomeAvailableNotification
- [[NSNotificationCenter defaultCenter] addObserver:m_objcObserver.get()
- selector:@selector(newImageAvailable:)
- name:QTVideoRendererWebKitOnlyNewImageAvailableNotification
- object:m_qtVideoRenderer.get()];
- }
-}
-
-void MediaPlayerPrivateQTKit::destroyQTVideoRenderer()
-{
- if (!m_qtVideoRenderer)
- return;
-
- // stop observing the renderer's notifications before we toss it
- [[NSNotificationCenter defaultCenter] removeObserver:m_objcObserver.get()
- name:QTVideoRendererWebKitOnlyNewImageAvailableNotification
- object:m_qtVideoRenderer.get()];
-
- // disassociate our movie from our instance of QTVideoRendererWebKitOnly
- [(id<WebKitVideoRenderingDetails>)m_qtVideoRenderer.get() setMovie:nil];
-
- m_qtVideoRenderer = nil;
-}
-
-void MediaPlayerPrivateQTKit::createQTMovieLayer()
-{
-#if USE(ACCELERATED_COMPOSITING)
- if (!m_qtMovie)
- return;
-
- ASSERT(supportsAcceleratedRendering());
-
- if (!m_qtVideoLayer) {
- m_qtVideoLayer.adoptNS([[QTMovieLayer alloc] init]);
- if (!m_qtVideoLayer)
- return;
-
- [m_qtVideoLayer.get() setMovie:m_qtMovie.get()];
-#ifndef NDEBUG
- [(CALayer *)m_qtVideoLayer.get() setName:@"Video layer"];
-#endif
- // The layer will get hooked up via RenderLayerBacking::updateGraphicsLayerConfiguration().
- }
-#endif
-}
-
-void MediaPlayerPrivateQTKit::destroyQTMovieLayer()
-{
-#if USE(ACCELERATED_COMPOSITING)
- if (!m_qtVideoLayer)
- return;
-
- // disassociate our movie from our instance of QTMovieLayer
- [m_qtVideoLayer.get() setMovie:nil];
- m_qtVideoLayer = nil;
-#endif
-}
-
-MediaPlayerPrivateQTKit::MediaRenderingMode MediaPlayerPrivateQTKit::currentRenderingMode() const
-{
- if (m_qtMovieView)
- return MediaRenderingMovieView;
-
- if (m_qtVideoLayer)
- return MediaRenderingMovieLayer;
-
- if (m_qtVideoRenderer)
- return MediaRenderingSoftwareRenderer;
-
- return MediaRenderingNone;
-}
-
-MediaPlayerPrivateQTKit::MediaRenderingMode MediaPlayerPrivateQTKit::preferredRenderingMode() const
-{
- if (!m_player->frameView() || !m_qtMovie)
- return MediaRenderingNone;
-
- if (m_player->inMediaDocument() || !QTVideoRendererClass())
- return MediaRenderingMovieView;
-
-#if USE(ACCELERATED_COMPOSITING)
- if (supportsAcceleratedRendering() && m_player->mediaPlayerClient()->mediaPlayerRenderingCanBeAccelerated(m_player))
- return MediaRenderingMovieLayer;
-#endif
-
- return MediaRenderingSoftwareRenderer;
-}
-
-void MediaPlayerPrivateQTKit::setUpVideoRendering()
-{
- if (!isReadyForVideoSetup())
- return;
-
- MediaRenderingMode currentMode = currentRenderingMode();
- MediaRenderingMode preferredMode = preferredRenderingMode();
- if (currentMode == preferredMode && currentMode != MediaRenderingNone)
- return;
-
- if (currentMode != MediaRenderingNone)
- tearDownVideoRendering();
-
- switch (preferredMode) {
- case MediaRenderingMovieView:
- createQTMovieView();
- break;
- case MediaRenderingNone:
- case MediaRenderingSoftwareRenderer:
- createQTVideoRenderer(QTVideoRendererModeListensForNewImages);
- break;
- case MediaRenderingMovieLayer:
- createQTMovieLayer();
- break;
- }
-
- // If using a movie layer, inform the client so the compositing tree is updated.
- if (currentMode == MediaRenderingMovieLayer || preferredMode == MediaRenderingMovieLayer)
- m_player->mediaPlayerClient()->mediaPlayerRenderingModeChanged(m_player);
-}
-
-void MediaPlayerPrivateQTKit::tearDownVideoRendering()
-{
- if (m_qtMovieView)
- detachQTMovieView();
- if (m_qtVideoRenderer)
- destroyQTVideoRenderer();
- if (m_qtVideoLayer)
- destroyQTMovieLayer();
-}
-
-bool MediaPlayerPrivateQTKit::hasSetUpVideoRendering() const
-{
- return m_qtMovieView
- || m_qtVideoLayer
- || m_qtVideoRenderer;
-}
-
-QTTime MediaPlayerPrivateQTKit::createQTTime(float time) const
-{
- if (!metaDataAvailable())
- return QTMakeTime(0, 600);
- long timeScale = [[m_qtMovie.get() attributeForKey:QTMovieTimeScaleAttribute] longValue];
- return QTMakeTime(time * timeScale, timeScale);
-}
-
-void MediaPlayerPrivateQTKit::resumeLoad()
-{
- m_delayingLoad = false;
-
- if (!m_movieURL.isNull())
- loadInternal(m_movieURL);
-}
-
-void MediaPlayerPrivateQTKit::load(const String& url)
-{
- m_movieURL = url;
-
- // If the element is not supposed to load any data return immediately because QTKit
- // doesn't have API to throttle loading.
- if (m_preload == MediaPlayer::None) {
- m_delayingLoad = true;
- return;
- }
-
- loadInternal(url);
-}
-
-void MediaPlayerPrivateQTKit::loadInternal(const String& url)
-{
- if (m_networkState != MediaPlayer::Loading) {
- m_networkState = MediaPlayer::Loading;
- m_player->networkStateChanged();
- }
- if (m_readyState != MediaPlayer::HaveNothing) {
- m_readyState = MediaPlayer::HaveNothing;
- m_player->readyStateChanged();
- }
- cancelSeek();
- m_videoFrameHasDrawn = false;
-
- [m_objcObserver.get() setDelayCallbacks:YES];
-
- createQTMovie(url);
-
- [m_objcObserver.get() loadStateChanged:nil];
- [m_objcObserver.get() setDelayCallbacks:NO];
-}
-
-void MediaPlayerPrivateQTKit::prepareToPlay()
-{
- if (!m_qtMovie || m_delayingLoad)
- resumeLoad();
-}
-
-PlatformMedia MediaPlayerPrivateQTKit::platformMedia() const
-{
- PlatformMedia pm;
- pm.type = PlatformMedia::QTMovieType;
- pm.media.qtMovie = m_qtMovie.get();
- return pm;
-}
-
-#if USE(ACCELERATED_COMPOSITING)
-PlatformLayer* MediaPlayerPrivateQTKit::platformLayer() const
-{
- return m_qtVideoLayer.get();
-}
-#endif
-
-void MediaPlayerPrivateQTKit::play()
-{
- if (!metaDataAvailable())
- return;
- m_startedPlaying = true;
-#if DRAW_FRAME_RATE
- m_frameCountWhilePlaying = 0;
-#endif
- [m_objcObserver.get() setDelayCallbacks:YES];
- [m_qtMovie.get() setRate:m_player->rate()];
- [m_objcObserver.get() setDelayCallbacks:NO];
-}
-
-void MediaPlayerPrivateQTKit::pause()
-{
- if (!metaDataAvailable())
- return;
- m_startedPlaying = false;
-#if DRAW_FRAME_RATE
- m_timeStoppedPlaying = [NSDate timeIntervalSinceReferenceDate];
-#endif
- [m_objcObserver.get() setDelayCallbacks:YES];
- [m_qtMovie.get() stop];
- [m_objcObserver.get() setDelayCallbacks:NO];
-}
-
-float MediaPlayerPrivateQTKit::duration() const
-{
- if (!metaDataAvailable())
- return 0;
-
- if (m_cachedDuration != -1.0f)
- return m_cachedDuration;
-
- QTTime time = [m_qtMovie.get() duration];
- if (time.flags == kQTTimeIsIndefinite)
- return numeric_limits<float>::infinity();
- return static_cast<float>(time.timeValue) / time.timeScale;
-}
-
-float MediaPlayerPrivateQTKit::currentTime() const
-{
- if (!metaDataAvailable())
- return 0;
- QTTime time = [m_qtMovie.get() currentTime];
- return static_cast<float>(time.timeValue) / time.timeScale;
-}
-
-void MediaPlayerPrivateQTKit::seek(float time)
-{
- // Nothing to do if we are already in the middle of a seek to the same time.
- if (time == m_seekTo)
- return;
-
- cancelSeek();
-
- if (!metaDataAvailable())
- return;
-
- if (time > duration())
- time = duration();
-
- m_seekTo = time;
- if (maxTimeSeekable() >= m_seekTo)
- doSeek();
- else
- m_seekTimer.start(0, 0.5f);
-}
-
-void MediaPlayerPrivateQTKit::doSeek()
-{
- QTTime qttime = createQTTime(m_seekTo);
- // setCurrentTime generates several event callbacks, update afterwards
- [m_objcObserver.get() setDelayCallbacks:YES];
- float oldRate = [m_qtMovie.get() rate];
-
- if (oldRate)
- [m_qtMovie.get() setRate:0];
- [m_qtMovie.get() setCurrentTime:qttime];
-
- // restore playback only if not at end, otherwise QTMovie will loop
- float timeAfterSeek = currentTime();
- if (oldRate && timeAfterSeek < duration())
- [m_qtMovie.get() setRate:oldRate];
-
- cancelSeek();
- [m_objcObserver.get() setDelayCallbacks:NO];
-}
-
-void MediaPlayerPrivateQTKit::cancelSeek()
-{
- m_seekTo = -1;
- m_seekTimer.stop();
-}
-
-void MediaPlayerPrivateQTKit::seekTimerFired(Timer<MediaPlayerPrivateQTKit>*)
-{
- if (!metaDataAvailable()|| !seeking() || currentTime() == m_seekTo) {
- cancelSeek();
- updateStates();
- m_player->timeChanged();
- return;
- }
-
- if (maxTimeSeekable() >= m_seekTo)
- doSeek();
- else {
- MediaPlayer::NetworkState state = networkState();
- if (state == MediaPlayer::Empty || state == MediaPlayer::Loaded) {
- cancelSeek();
- updateStates();
- m_player->timeChanged();
- }
- }
-}
-
-bool MediaPlayerPrivateQTKit::paused() const
-{
- if (!metaDataAvailable())
- return true;
- return [m_qtMovie.get() rate] == 0;
-}
-
-bool MediaPlayerPrivateQTKit::seeking() const
-{
- if (!metaDataAvailable())
- return false;
- return m_seekTo >= 0;
-}
-
-IntSize MediaPlayerPrivateQTKit::naturalSize() const
-{
- if (!metaDataAvailable())
- return IntSize();
-
- // In spite of the name of this method, return QTMovieNaturalSizeAttribute transformed by the
- // initial movie scale because the spec says intrinsic size is:
- //
- // ... the dimensions of the resource in CSS pixels after taking into account the resource's
- // dimensions, aspect ratio, clean aperture, resolution, and so forth, as defined for the
- // format used by the resource
-
- NSSize naturalSize = [[m_qtMovie.get() attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
- return IntSize(naturalSize.width * m_scaleFactor.width(), naturalSize.height * m_scaleFactor.height());
-}
-
-bool MediaPlayerPrivateQTKit::hasVideo() const
-{
- if (!metaDataAvailable())
- return false;
- return [[m_qtMovie.get() attributeForKey:QTMovieHasVideoAttribute] boolValue];
-}
-
-bool MediaPlayerPrivateQTKit::hasAudio() const
-{
- if (!m_qtMovie)
- return false;
- return [[m_qtMovie.get() attributeForKey:QTMovieHasAudioAttribute] boolValue];
-}
-
-bool MediaPlayerPrivateQTKit::supportsFullscreen() const
-{
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
- return true;
-#else
- // See <rdar://problem/7389945>
- return false;
-#endif
-}
-
-void MediaPlayerPrivateQTKit::setVolume(float volume)
-{
- if (m_qtMovie)
- [m_qtMovie.get() setVolume:volume];
-}
-
-bool MediaPlayerPrivateQTKit::hasClosedCaptions() const
-{
- if (!metaDataAvailable())
- return false;
- return wkQTMovieHasClosedCaptions(m_qtMovie.get());
-}
-
-void MediaPlayerPrivateQTKit::setClosedCaptionsVisible(bool closedCaptionsVisible)
-{
- if (metaDataAvailable()) {
- wkQTMovieSetShowClosedCaptions(m_qtMovie.get(), closedCaptionsVisible);
-
-#if USE(ACCELERATED_COMPOSITING) && (!defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD))
- if (closedCaptionsVisible && m_qtVideoLayer) {
- // Captions will be rendered upside down unless we flag the movie as flipped (again). See <rdar://7408440>.
- [m_qtVideoLayer.get() setGeometryFlipped:YES];
- }
-#endif
- }
-}
-
-void MediaPlayerPrivateQTKit::setRate(float rate)
-{
- if (m_qtMovie)
- [m_qtMovie.get() setRate:rate];
-}
-
-void MediaPlayerPrivateQTKit::setPreservesPitch(bool preservesPitch)
-{
- if (!m_qtMovie)
- return;
-
- // QTMovieRateChangesPreservePitchAttribute cannot be changed dynamically after QTMovie creation.
- // If the passed in value is different than what already exists, we need to recreate the QTMovie for it to take effect.
- if ([[m_qtMovie.get() attributeForKey:QTMovieRateChangesPreservePitchAttribute] boolValue] == preservesPitch)
- return;
-
- RetainPtr<NSDictionary> movieAttributes(AdoptNS, [[m_qtMovie.get() movieAttributes] mutableCopy]);
- ASSERT(movieAttributes);
- [movieAttributes.get() setValue:[NSNumber numberWithBool:preservesPitch] forKey:QTMovieRateChangesPreservePitchAttribute];
- m_timeToRestore = currentTime();
-
- createQTMovie([movieAttributes.get() valueForKey:QTMovieURLAttribute], movieAttributes.get());
-}
-
-PassRefPtr<TimeRanges> MediaPlayerPrivateQTKit::buffered() const
-{
- RefPtr<TimeRanges> timeRanges = TimeRanges::create();
- float loaded = maxTimeLoaded();
- if (loaded > 0)
- timeRanges->add(0, loaded);
- return timeRanges.release();
-}
-
-float MediaPlayerPrivateQTKit::maxTimeSeekable() const
-{
- if (!metaDataAvailable())
- return 0;
-
- // infinite duration means live stream
- if (isinf(duration()))
- return 0;
-
- return wkQTMovieMaxTimeSeekable(m_qtMovie.get());
-}
-
-float MediaPlayerPrivateQTKit::maxTimeLoaded() const
-{
- if (!metaDataAvailable())
- return 0;
- return wkQTMovieMaxTimeLoaded(m_qtMovie.get());
-}
-
-unsigned MediaPlayerPrivateQTKit::bytesLoaded() const
-{
- float dur = duration();
- if (!dur)
- return 0;
- return totalBytes() * maxTimeLoaded() / dur;
-}
-
-unsigned MediaPlayerPrivateQTKit::totalBytes() const
-{
- if (!metaDataAvailable())
- return 0;
- return [[m_qtMovie.get() attributeForKey:QTMovieDataSizeAttribute] intValue];
-}
-
-void MediaPlayerPrivateQTKit::cancelLoad()
-{
- // FIXME: Is there a better way to check for this?
- if (m_networkState < MediaPlayer::Loading || m_networkState == MediaPlayer::Loaded)
- return;
-
- tearDownVideoRendering();
- m_qtMovie = nil;
-
- updateStates();
-}
-
-void MediaPlayerPrivateQTKit::cacheMovieScale()
-{
- NSSize initialSize = NSZeroSize;
- NSSize naturalSize = [[m_qtMovie.get() attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
-
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
- // QTMovieCurrentSizeAttribute is not allowed with instances of QTMovie that have been
- // opened with QTMovieOpenForPlaybackAttribute, so ask for the display transform attribute instead.
- NSAffineTransform *displayTransform = [m_qtMovie.get() attributeForKey:@"QTMoviePreferredTransformAttribute"];
- if (displayTransform)
- initialSize = [displayTransform transformSize:naturalSize];
- else {
- initialSize.width = naturalSize.width;
- initialSize.height = naturalSize.height;
- }
-#else
- initialSize = [[m_qtMovie.get() attributeForKey:QTMovieCurrentSizeAttribute] sizeValue];
-#endif
-
- if (naturalSize.width)
- m_scaleFactor.setWidth(initialSize.width / naturalSize.width);
- if (naturalSize.height)
- m_scaleFactor.setHeight(initialSize.height / naturalSize.height);
-}
-
-bool MediaPlayerPrivateQTKit::isReadyForVideoSetup() const
-{
- return m_readyState >= MediaPlayer::HaveMetadata && m_player->visible();
-}
-
-void MediaPlayerPrivateQTKit::prepareForRendering()
-{
- if (m_isAllowedToRender)
- return;
- m_isAllowedToRender = true;
-
- if (!hasSetUpVideoRendering())
- setUpVideoRendering();
-
- // If using a movie layer, inform the client so the compositing tree is updated. This is crucial if the movie
- // has a poster, as it will most likely not have a layer and we will now be rendering frames to the movie layer.
- if (currentRenderingMode() == MediaRenderingMovieLayer || preferredRenderingMode() == MediaRenderingMovieLayer)
- m_player->mediaPlayerClient()->mediaPlayerRenderingModeChanged(m_player);
-}
-
-void MediaPlayerPrivateQTKit::updateStates()
-{
- MediaPlayer::NetworkState oldNetworkState = m_networkState;
- MediaPlayer::ReadyState oldReadyState = m_readyState;
-
- long loadState = m_qtMovie ? [[m_qtMovie.get() attributeForKey:QTMovieLoadStateAttribute] longValue] : static_cast<long>(QTMovieLoadStateError);
-
- if (loadState >= QTMovieLoadStateLoaded && m_readyState < MediaPlayer::HaveMetadata) {
- disableUnsupportedTracks();
- if (m_player->inMediaDocument()) {
- if (!m_enabledTrackCount || m_hasUnsupportedTracks) {
- // This has a type of media that we do not handle directly with a <video>
- // element, eg. a rtsp track or QuickTime VR. Tell the MediaPlayerClient
- // that we noticed.
- sawUnsupportedTracks();
- return;
- }
- } else if (!m_enabledTrackCount)
- loadState = QTMovieLoadStateError;
-
- if (loadState != QTMovieLoadStateError) {
- wkQTMovieSelectPreferredAlternates(m_qtMovie.get());
- cacheMovieScale();
- MediaPlayer::MovieLoadType movieType = movieLoadType();
- m_isStreaming = movieType == MediaPlayer::StoredStream || movieType == MediaPlayer::LiveStream;
- }
- }
-
- // If this movie is reloading and we mean to restore the current time/rate, this might be the right time to do it.
- if (loadState >= QTMovieLoadStateLoaded && oldNetworkState < MediaPlayer::Loaded && m_timeToRestore != -1.0f) {
- QTTime qttime = createQTTime(m_timeToRestore);
- m_timeToRestore = -1.0f;
-
- // Disable event callbacks from setCurrentTime for restoring time in a recreated video
- [m_objcObserver.get() setDelayCallbacks:YES];
- [m_qtMovie.get() setCurrentTime:qttime];
- [m_qtMovie.get() setRate:m_player->rate()];
- [m_objcObserver.get() setDelayCallbacks:NO];
- }
-
- BOOL completelyLoaded = !m_isStreaming && (loadState >= QTMovieLoadStateComplete);
-
- // Note: QT indicates that we are fully loaded with QTMovieLoadStateComplete.
- // However newer versions of QT do not, so we check maxTimeLoaded against duration.
- if (!completelyLoaded && !m_isStreaming && metaDataAvailable())
- completelyLoaded = maxTimeLoaded() == duration();
-
- if (completelyLoaded) {
- // "Loaded" is reserved for fully buffered movies, never the case when streaming
- m_networkState = MediaPlayer::Loaded;
- m_readyState = MediaPlayer::HaveEnoughData;
- } else if (loadState >= QTMovieLoadStatePlaythroughOK) {
- m_readyState = MediaPlayer::HaveEnoughData;
- m_networkState = MediaPlayer::Loading;
- } else if (loadState >= QTMovieLoadStatePlayable) {
- // FIXME: This might not work correctly in streaming case, <rdar://problem/5693967>
- m_readyState = currentTime() < maxTimeLoaded() ? MediaPlayer::HaveFutureData : MediaPlayer::HaveCurrentData;
- m_networkState = MediaPlayer::Loading;
- } else if (loadState >= QTMovieLoadStateLoaded) {
- m_readyState = MediaPlayer::HaveMetadata;
- m_networkState = MediaPlayer::Loading;
- } else if (loadState > QTMovieLoadStateError) {
- m_readyState = MediaPlayer::HaveNothing;
- m_networkState = MediaPlayer::Loading;
- } else {
- // Loading or decoding failed.
-
- if (m_player->inMediaDocument()) {
- // Something went wrong in the loading of media within a standalone file.
- // This can occur with chained refmovies pointing to streamed media.
- sawUnsupportedTracks();
- return;
- }
-
- float loaded = maxTimeLoaded();
- if (!loaded)
- m_readyState = MediaPlayer::HaveNothing;
-
- if (!m_enabledTrackCount)
- m_networkState = MediaPlayer::FormatError;
- else {
- // FIXME: We should differentiate between load/network errors and decode errors <rdar://problem/5605692>
- if (loaded > 0)
- m_networkState = MediaPlayer::DecodeError;
- else
- m_readyState = MediaPlayer::HaveNothing;
- }
- }
-
- if (isReadyForVideoSetup() && !hasSetUpVideoRendering())
- setUpVideoRendering();
-
- if (seeking())
- m_readyState = m_readyState >= MediaPlayer::HaveMetadata ? MediaPlayer::HaveMetadata : MediaPlayer::HaveNothing;
-
- // Streaming movies don't use the network when paused.
- if (m_isStreaming && m_readyState >= MediaPlayer::HaveMetadata && m_networkState >= MediaPlayer::Loading && [m_qtMovie.get() rate] == 0)
- m_networkState = MediaPlayer::Idle;
-
- if (m_networkState != oldNetworkState)
- m_player->networkStateChanged();
-
- if (m_readyState != oldReadyState)
- m_player->readyStateChanged();
-
- if (loadState >= QTMovieLoadStateLoaded) {
- float dur = duration();
- if (dur != m_reportedDuration) {
- if (m_reportedDuration != -1.0f)
- m_player->durationChanged();
- m_reportedDuration = dur;
- }
- }
-}
-
-void MediaPlayerPrivateQTKit::loadStateChanged()
-{
- if (!m_hasUnsupportedTracks)
- updateStates();
-}
-
-void MediaPlayerPrivateQTKit::rateChanged()
-{
- if (m_hasUnsupportedTracks)
- return;
-
- updateStates();
- m_player->rateChanged();
-}
-
-void MediaPlayerPrivateQTKit::sizeChanged()
-{
- if (!m_hasUnsupportedTracks)
- m_player->sizeChanged();
-}
-
-void MediaPlayerPrivateQTKit::timeChanged()
-{
- if (m_hasUnsupportedTracks)
- return;
-
- // It may not be possible to seek to a specific time in a streamed movie. When seeking in a
- // stream QuickTime sets the movie time to closest time possible and posts a timechanged
- // notification. Update m_seekTo so we can detect when the seek completes.
- if (m_seekTo != -1)
- m_seekTo = currentTime();
-
- m_timeToRestore = -1.0f;
- updateStates();
- m_player->timeChanged();
-}
-
-void MediaPlayerPrivateQTKit::didEnd()
-{
- if (m_hasUnsupportedTracks)
- return;
-
- m_startedPlaying = false;
-#if DRAW_FRAME_RATE
- m_timeStoppedPlaying = [NSDate timeIntervalSinceReferenceDate];
-#endif
-
- // Hang onto the current time and use it as duration from now on since QuickTime is telling us we
- // are at the end. Do this because QuickTime sometimes reports one time for duration and stops
- // playback at another time, which causes problems in HTMLMediaElement. QTKit's 'ended' event
- // fires when playing in reverse so don't update duration when at time zero!
- float now = currentTime();
- if (now > 0)
- m_cachedDuration = now;
-
- updateStates();
- m_player->timeChanged();
-}
-
-void MediaPlayerPrivateQTKit::setSize(const IntSize&)
-{
- // Don't resize the view now because [view setFrame] also resizes the movie itself, and because
- // the renderer calls this function immediately when we report a size change (QTMovieSizeDidChangeNotification)
- // we can get into a feedback loop observing the size change and resetting the size, and this can cause
- // QuickTime to miss resetting a movie's size when the media size changes (as happens with an rtsp movie
- // once the rtsp server sends the track sizes). Instead we remember the size passed to paint() and resize
- // the view when it changes.
- // <rdar://problem/6336092> REGRESSION: rtsp movie does not resize correctly
-}
-
-void MediaPlayerPrivateQTKit::setVisible(bool b)
-{
- if (m_visible != b) {
- m_visible = b;
- if (b)
- setUpVideoRendering();
- else
- tearDownVideoRendering();
- }
-}
-
-bool MediaPlayerPrivateQTKit::hasAvailableVideoFrame() const
-{
- // When using a QTMovieLayer return true as soon as the movie reaches QTMovieLoadStatePlayable
- // because although we don't *know* when the first frame has decoded, by the time we get and
- // process the notification a frame should have propagated the VisualContext and been set on
- // the layer.
- if (currentRenderingMode() == MediaRenderingMovieLayer)
- return m_readyState >= MediaPlayer::HaveCurrentData;
-
- // When using the software renderer QuickTime signals that a frame is available so we might as well
- // wait until we know that a frame has been drawn.
- return m_videoFrameHasDrawn;
-}
-
-void MediaPlayerPrivateQTKit::repaint()
-{
- if (m_hasUnsupportedTracks)
- return;
-
-#if DRAW_FRAME_RATE
- if (m_startedPlaying) {
- m_frameCountWhilePlaying++;
- // to eliminate preroll costs from our calculation,
- // our frame rate calculation excludes the first frame drawn after playback starts
- if (1==m_frameCountWhilePlaying)
- m_timeStartedPlaying = [NSDate timeIntervalSinceReferenceDate];
- }
-#endif
- m_videoFrameHasDrawn = true;
- m_player->repaint();
-}
-
-void MediaPlayerPrivateQTKit::paintCurrentFrameInContext(GraphicsContext* context, const IntRect& r)
-{
- id qtVideoRenderer = m_qtVideoRenderer.get();
- if (!qtVideoRenderer && currentRenderingMode() == MediaRenderingMovieLayer) {
- // We're being told to render into a context, but we already have the
- // MovieLayer going. This probably means we've been called from <canvas>.
- // Set up a QTVideoRenderer to use, but one that doesn't register for
- // update callbacks. That way, it won't bother us asking to repaint.
- createQTVideoRenderer(QTVideoRendererModeDefault);
- qtVideoRenderer = m_qtVideoRenderer.get();
- }
- paint(context, r);
-}
-
-void MediaPlayerPrivateQTKit::paint(GraphicsContext* context, const IntRect& r)
-{
- if (context->paintingDisabled() || m_hasUnsupportedTracks)
- return;
- NSView *view = m_qtMovieView.get();
- id qtVideoRenderer = m_qtVideoRenderer.get();
- if (!view && !qtVideoRenderer)
- return;
-
- [m_objcObserver.get() setDelayCallbacks:YES];
- BEGIN_BLOCK_OBJC_EXCEPTIONS;
- context->save();
- context->translate(r.x(), r.y() + r.height());
- context->scale(FloatSize(1.0f, -1.0f));
- context->setImageInterpolationQuality(InterpolationLow);
- IntRect paintRect(IntPoint(0, 0), IntSize(r.width(), r.height()));
-
-#ifdef BUILDING_ON_TIGER
- AutodrainedPool pool;
-#endif
- NSGraphicsContext* newContext = [NSGraphicsContext graphicsContextWithGraphicsPort:context->platformContext() flipped:NO];
-
- // draw the current video frame
- if (qtVideoRenderer) {
- [NSGraphicsContext saveGraphicsState];
- [NSGraphicsContext setCurrentContext:newContext];
- [(id<WebKitVideoRenderingDetails>)qtVideoRenderer drawInRect:paintRect];
- [NSGraphicsContext restoreGraphicsState];
- } else {
- if (m_rect != r) {
- m_rect = r;
- if (m_player->inMediaDocument()) {
- // the QTMovieView needs to be placed in the proper location for document mode
- [view setFrame:m_rect];
- }
- else {
- // We don't really need the QTMovieView in any specific location so let's just get it out of the way
- // where it won't intercept events or try to bring up the context menu.
- IntRect farAwayButCorrectSize(m_rect);
- farAwayButCorrectSize.move(-1000000, -1000000);
- [view setFrame:farAwayButCorrectSize];
- }
- }
-
- if (m_player->inMediaDocument()) {
- // If we're using a QTMovieView in a media document, the view may get layer-backed. AppKit won't update
- // the layer hosting correctly if we call displayRectIgnoringOpacity:inContext:, so use displayRectIgnoringOpacity:
- // in this case. See <rdar://problem/6702882>.
- [view displayRectIgnoringOpacity:paintRect];
- } else
- [view displayRectIgnoringOpacity:paintRect inContext:newContext];
- }
-
-#if DRAW_FRAME_RATE
- // Draw the frame rate only after having played more than 10 frames.
- if (m_frameCountWhilePlaying > 10) {
- Frame* frame = m_player->frameView() ? m_player->frameView()->frame() : NULL;
- Document* document = frame ? frame->document() : NULL;
- RenderObject* renderer = document ? document->renderer() : NULL;
- RenderStyle* styleToUse = renderer ? renderer->style() : NULL;
- if (styleToUse) {
- double frameRate = (m_frameCountWhilePlaying - 1) / ( m_startedPlaying ? ([NSDate timeIntervalSinceReferenceDate] - m_timeStartedPlaying) :
- (m_timeStoppedPlaying - m_timeStartedPlaying) );
- String text = String::format("%1.2f", frameRate);
- TextRun textRun(text.characters(), text.length());
- const Color color(255, 0, 0);
- context->scale(FloatSize(1.0f, -1.0f));
- context->setStrokeColor(color, styleToUse->colorSpace());
- context->setStrokeStyle(SolidStroke);
- context->setStrokeThickness(1.0f);
- context->setFillColor(color, styleToUse->colorSpace());
- context->drawText(styleToUse->font(), textRun, IntPoint(2, -3));
- }
- }
-#endif
-
- context->restore();
- END_BLOCK_OBJC_EXCEPTIONS;
- [m_objcObserver.get() setDelayCallbacks:NO];
-}
-
-static void addFileTypesToCache(NSArray * fileTypes, HashSet<String> &cache)
-{
- int count = [fileTypes count];
- for (int n = 0; n < count; n++) {
- CFStringRef ext = reinterpret_cast<CFStringRef>([fileTypes objectAtIndex:n]);
- RetainPtr<CFStringRef> uti(AdoptCF, UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, ext, NULL));
- if (!uti)
- continue;
- RetainPtr<CFStringRef> mime(AdoptCF, UTTypeCopyPreferredTagWithClass(uti.get(), kUTTagClassMIMEType));
- if (mime)
- cache.add(mime.get());
-
- // -movieFileTypes: returns both file extensions and OSTypes. The later are surrounded by single
- // quotes, eg. 'MooV', so don't bother looking at those.
- if (CFStringGetCharacterAtIndex(ext, 0) != '\'') {
- // UTI is missing many media related MIME types supported by QTKit (see rdar://6434168), and not all
- // web servers use the MIME type UTI returns for an extension (see rdar://7875393), so even if UTI
- // has a type for this extension add any types in hard coded table in the MIME type regsitry.
- Vector<String> typesForExtension = MIMETypeRegistry::getMediaMIMETypesForExtension(ext);
- unsigned count = typesForExtension.size();
- for (unsigned ndx = 0; ndx < count; ++ndx) {
- if (!cache.contains(typesForExtension[ndx]))
- cache.add(typesForExtension[ndx]);
- }
- }
- }
-}
-
-static HashSet<String> mimeCommonTypesCache()
-{
- DEFINE_STATIC_LOCAL(HashSet<String>, cache, ());
- static bool typeListInitialized = false;
-
- if (!typeListInitialized) {
- typeListInitialized = true;
- NSArray* fileTypes = [QTMovie movieFileTypes:QTIncludeCommonTypes];
- addFileTypesToCache(fileTypes, cache);
- }
-
- return cache;
-}
-
-static HashSet<String> mimeModernTypesCache()
-{
- DEFINE_STATIC_LOCAL(HashSet<String>, cache, ());
- static bool typeListInitialized = false;
-
- if (!typeListInitialized) {
- typeListInitialized = true;
- NSArray* fileTypes = [QTMovie movieFileTypes:(QTMovieFileTypeOptions)wkQTIncludeOnlyModernMediaFileTypes()];
- addFileTypesToCache(fileTypes, cache);
- }
-
- return cache;
-}
-
-void MediaPlayerPrivateQTKit::getSupportedTypes(HashSet<String>& supportedTypes)
-{
- supportedTypes = mimeModernTypesCache();
-
- // Note: this method starts QTKitServer if it isn't already running when in 64-bit because it has to return the list
- // of every MIME type supported by QTKit.
- HashSet<String> commonTypes = mimeCommonTypesCache();
- HashSet<String>::const_iterator it = commonTypes.begin();
- HashSet<String>::const_iterator end = commonTypes.end();
- for (; it != end; ++it)
- supportedTypes.add(*it);
-}
-
-MediaPlayer::SupportsType MediaPlayerPrivateQTKit::supportsType(const String& type, const String& codecs)
-{
- // Only return "IsSupported" if there is no codecs parameter for now as there is no way to ask QT if it supports an
- // extended MIME type yet.
-
- // We check the "modern" type cache first, as it doesn't require QTKitServer to start.
- if (mimeModernTypesCache().contains(type) || mimeCommonTypesCache().contains(type))
- return codecs.isEmpty() ? MediaPlayer::MayBeSupported : MediaPlayer::IsSupported;
-
- return MediaPlayer::IsNotSupported;
-}
-
-bool MediaPlayerPrivateQTKit::isAvailable()
-{
-#ifdef BUILDING_ON_TIGER
- SInt32 version;
- OSErr result;
- result = Gestalt(gestaltQuickTime, &version);
- if (result != noErr) {
- LOG_ERROR("No QuickTime available. Disabling <video> and <audio> support.");
- return false;
- }
- if (version < minimumQuickTimeVersion) {
- LOG_ERROR("QuickTime version %x detected, at least %x required. Disabling <video> and <audio> support.", version, minimumQuickTimeVersion);
- return false;
- }
- return true;
-#else
- // On 10.5 and higher, QuickTime will always be new enough for <video> and <audio> support, so we just check that the framework can be loaded.
- return QTKitLibrary();
-#endif
-}
-
-void MediaPlayerPrivateQTKit::disableUnsupportedTracks()
-{
- if (!m_qtMovie) {
- m_enabledTrackCount = 0;
- m_totalTrackCount = 0;
- return;
- }
-
- static HashSet<String>* allowedTrackTypes = 0;
- if (!allowedTrackTypes) {
- allowedTrackTypes = new HashSet<String>;
- allowedTrackTypes->add(QTMediaTypeVideo);
- allowedTrackTypes->add(QTMediaTypeSound);
- allowedTrackTypes->add(QTMediaTypeText);
- allowedTrackTypes->add(QTMediaTypeBase);
- allowedTrackTypes->add(QTMediaTypeMPEG);
- allowedTrackTypes->add("clcp"); // Closed caption
- allowedTrackTypes->add("sbtl"); // Subtitle
- allowedTrackTypes->add("odsm"); // MPEG-4 object descriptor stream
- allowedTrackTypes->add("sdsm"); // MPEG-4 scene description stream
- allowedTrackTypes->add("tmcd"); // timecode
- allowedTrackTypes->add("tc64"); // timcode-64
- allowedTrackTypes->add("tmet"); // timed metadata
- }
-
- NSArray *tracks = [m_qtMovie.get() tracks];
-
- m_totalTrackCount = [tracks count];
- m_enabledTrackCount = m_totalTrackCount;
- for (unsigned trackIndex = 0; trackIndex < m_totalTrackCount; trackIndex++) {
- // Grab the track at the current index. If there isn't one there, then
- // we can move onto the next one.
- QTTrack *track = [tracks objectAtIndex:trackIndex];
- if (!track)
- continue;
-
- // Check to see if the track is disabled already, we should move along.
- // We don't need to re-disable it.
- if (![track isEnabled]) {
- --m_enabledTrackCount;
- continue;
- }
-
- // Get the track's media type.
- NSString *mediaType = [track attributeForKey:QTTrackMediaTypeAttribute];
- if (!mediaType)
- continue;
-
- // Test whether the media type is in our white list.
- if (!allowedTrackTypes->contains(mediaType)) {
- // If this track type is not allowed, then we need to disable it.
- [track setEnabled:NO];
- --m_enabledTrackCount;
- m_hasUnsupportedTracks = true;
- }
-
- // Disable chapter tracks. These are most likely to lead to trouble, as
- // they will be composited under the video tracks, forcing QT to do extra
- // work.
- QTTrack *chapterTrack = [track performSelector:@selector(chapterlist)];
- if (!chapterTrack)
- continue;
-
- // Try to grab the media for the track.
- QTMedia *chapterMedia = [chapterTrack media];
- if (!chapterMedia)
- continue;
-
- // Grab the media type for this track.
- id chapterMediaType = [chapterMedia attributeForKey:QTMediaTypeAttribute];
- if (!chapterMediaType)
- continue;
-
- // Check to see if the track is a video track. We don't care about
- // other non-video tracks.
- if (![chapterMediaType isEqual:QTMediaTypeVideo])
- continue;
-
- // Check to see if the track is already disabled. If it is, we
- // should move along.
- if (![chapterTrack isEnabled])
- continue;
-
- // Disable the evil, evil track.
- [chapterTrack setEnabled:NO];
- --m_enabledTrackCount;
- m_hasUnsupportedTracks = true;
- }
-}
-
-void MediaPlayerPrivateQTKit::sawUnsupportedTracks()
-{
- m_hasUnsupportedTracks = true;
- m_player->mediaPlayerClient()->mediaPlayerSawUnsupportedTracks(m_player);
-}
-
-#if USE(ACCELERATED_COMPOSITING)
-bool MediaPlayerPrivateQTKit::supportsAcceleratedRendering() const
-{
- // Also don't claim to support accelerated rendering when in the media document, as we will then render
- // via QTMovieView which is already accelerated.
- return isReadyForVideoSetup() && getQTMovieLayerClass() != Nil && !m_player->inMediaDocument();
-}
-
-void MediaPlayerPrivateQTKit::acceleratedRenderingStateChanged()
-{
- // Set up or change the rendering path if necessary.
- setUpVideoRendering();
-}
-#endif
-
-bool MediaPlayerPrivateQTKit::hasSingleSecurityOrigin() const
-{
- // We tell quicktime to disallow resources that come from different origins
- // so we know all media is single origin.
- return true;
-}
-
-MediaPlayer::MovieLoadType MediaPlayerPrivateQTKit::movieLoadType() const
-{
- if (!m_qtMovie)
- return MediaPlayer::Unknown;
-
- MediaPlayer::MovieLoadType movieType = (MediaPlayer::MovieLoadType)wkQTMovieGetType(m_qtMovie.get());
-
- // Can't include WebKitSystemInterface from WebCore so we can't get the enum returned
- // by wkQTMovieGetType, but at least verify that the value is in the valid range.
- ASSERT(movieType >= MediaPlayer::Unknown && movieType <= MediaPlayer::LiveStream);
-
- return movieType;
-}
-
-void MediaPlayerPrivateQTKit::setPreload(MediaPlayer::Preload preload)
-{
- m_preload = preload;
- if (m_delayingLoad && m_preload != MediaPlayer::None)
- resumeLoad();
-}
-
-float MediaPlayerPrivateQTKit::mediaTimeForTimeValue(float timeValue) const
-{
- if (!metaDataAvailable())
- return timeValue;
-
- QTTime qttime = createQTTime(timeValue);
- return static_cast<float>(qttime.timeValue) / qttime.timeScale;
-}
-
-} // namespace WebCore
-
-@implementation WebCoreMovieObserver
-
-- (id)initWithCallback:(MediaPlayerPrivateQTKit*)callback
-{
- m_callback = callback;
- return [super init];
-}
-
-- (void)disconnect
-{
- [NSObject cancelPreviousPerformRequestsWithTarget:self];
- m_callback = 0;
-}
-
--(NSMenu*)menuForEventDelegate:(NSEvent*)theEvent
-{
- // Get the contextual menu from the QTMovieView's superview, the frame view
- return [[m_view superview] menuForEvent:theEvent];
-}
-
--(void)setView:(NSView*)view
-{
- m_view = view;
-}
-
--(void)repaint
-{
- if (m_delayCallbacks)
- [self performSelector:_cmd withObject:nil afterDelay:0.];
- else if (m_callback)
- m_callback->repaint();
-}
-
-- (void)loadStateChanged:(NSNotification *)unusedNotification
-{
- UNUSED_PARAM(unusedNotification);
- if (m_delayCallbacks)
- [self performSelector:_cmd withObject:nil afterDelay:0];
- else
- m_callback->loadStateChanged();
-}
-
-- (void)rateChanged:(NSNotification *)unusedNotification
-{
- UNUSED_PARAM(unusedNotification);
- if (m_delayCallbacks)
- [self performSelector:_cmd withObject:nil afterDelay:0];
- else
- m_callback->rateChanged();
-}
-
-- (void)sizeChanged:(NSNotification *)unusedNotification
-{
- UNUSED_PARAM(unusedNotification);
- if (m_delayCallbacks)
- [self performSelector:_cmd withObject:nil afterDelay:0];
- else
- m_callback->sizeChanged();
-}
-
-- (void)timeChanged:(NSNotification *)unusedNotification
-{
- UNUSED_PARAM(unusedNotification);
- if (m_delayCallbacks)
- [self performSelector:_cmd withObject:nil afterDelay:0];
- else
- m_callback->timeChanged();
-}
-
-- (void)didEnd:(NSNotification *)unusedNotification
-{
- UNUSED_PARAM(unusedNotification);
- if (m_delayCallbacks)
- [self performSelector:_cmd withObject:nil afterDelay:0];
- else
- m_callback->didEnd();
-}
-
-- (void)newImageAvailable:(NSNotification *)unusedNotification
-{
- UNUSED_PARAM(unusedNotification);
- [self repaint];
-}
-
-- (void)setDelayCallbacks:(BOOL)shouldDelay
-{
- m_delayCallbacks = shouldDelay;
-}
-
-@end
-
-#endif
diff --git a/WebCore/platform/graphics/mac/MediaPlayerProxy.h b/WebCore/platform/graphics/mac/MediaPlayerProxy.h
deleted file mode 100644
index cc7ec95..0000000
--- a/WebCore/platform/graphics/mac/MediaPlayerProxy.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef MediaPlayerProxy_h
-#define MediaPlayerProxy_h
-
-#ifdef __OBJC__
-@class WebMediaPlayerProxy;
-#else
-class WebMediaPlayerProxy;
-#endif
-
-enum MediaPlayerProxyNotificationType {
-
- MediaPlayerNotificationMediaValidated = 1,
- MediaPlayerNotificationMediaFailedToValidate,
-
- MediaPlayerNotificationStartUsingNetwork,
- MediaPlayerNotificationStopUsingNetwork,
-
- MediaPlayerNotificationEnteredFullscreen,
- MediaPlayerNotificationExitedFullscreen,
-
- MediaPlayerNotificationReadyForInspection,
- MediaPlayerNotificationReadyForPlayback,
- MediaPlayerNotificationDidPlayToTheEnd,
-
- MediaPlayerNotificationPlaybackFailed,
-
- MediaPlayerNotificationStreamLikelyToKeepUp,
- MediaPlayerNotificationStreamUnlikelyToKeepUp,
- MediaPlayerNotificationStreamBufferFull,
- MediaPlayerNotificationStreamRanDry,
- MediaPlayerNotificationFileLoaded,
-
- MediaPlayerNotificationSizeDidChange,
- MediaPlayerNotificationVolumeDidChange,
- MediaPlayerNotificationMutedDidChange,
- MediaPlayerNotificationTimeJumped,
-
- MediaPlayerNotificationPlayPauseButtonPressed,
-};
-
-#ifdef __OBJC__
-@interface NSObject (WebMediaPlayerProxy)
-
-- (int)_interfaceVersion;
-
-- (void)_disconnect;
-
-- (void)_load:(NSURL *)url;
-- (void)_cancelLoad;
-
-- (void)_setPoster:(NSURL *)url;
-
-- (void)_play;
-- (void)_pause;
-
-- (NSSize)_naturalSize;
-
-- (BOOL)_hasVideo;
-- (BOOL)_hasAudio;
-
-- (NSTimeInterval)_duration;
-
-- (double)_currentTime;
-- (void)_setCurrentTime:(double)time;
-- (BOOL)_seeking;
-
-- (void)_setEndTime:(double)time;
-
-- (float)_rate;
-- (void)_setRate:(float)rate;
-
-- (float)_volume;
-- (void)_setVolume:(float)newVolume;
-
-- (BOOL)_muted;
-- (void)_setMuted:(BOOL)muted;
-
-- (float)_maxTimeBuffered;
-- (float)_maxTimeSeekable;
-- (NSArray *)_bufferedTimeRanges;
-
-- (int)_dataRate;
-
-- (BOOL)_totalBytesKnown;
-- (unsigned)_totalBytes;
-- (unsigned)_bytesLoaded;
-
-- (NSArray *)_mimeTypes;
-
-@end
-#endif
-
-#endif
diff --git a/WebCore/platform/graphics/mac/SimpleFontDataATSUI.mm b/WebCore/platform/graphics/mac/SimpleFontDataATSUI.mm
deleted file mode 100644
index 4b2e7b2..0000000
--- a/WebCore/platform/graphics/mac/SimpleFontDataATSUI.mm
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved.
- * Copyright (C) 2006 Alexey Proskuryakov
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#import "config.h"
-#import "SimpleFontData.h"
-
-#if USE(ATSUI)
-
-#import "Font.h"
-#import "FontCache.h"
-#import "FontDescription.h"
-#import <ApplicationServices/ApplicationServices.h>
-#import <AppKit/AppKit.h>
-#import <wtf/Assertions.h>
-
-using namespace std;
-
-namespace WebCore {
-
-void SimpleFontData::checkShapesArabic() const
-{
- ASSERT(!m_checkedShapesArabic);
-
- m_checkedShapesArabic = true;
-
- ATSUFontID fontID = m_platformData.ctFont() ? CTFontGetPlatformFont(m_platformData.ctFont(), 0) : 0;
- if (!fontID) {
- LOG_ERROR("unable to get ATSUFontID for %@", m_platformData.font());
- return;
- }
-
- // This function is called only on fonts that contain Arabic glyphs. Our
- // heuristic is that if such a font has a glyph metamorphosis table, then
- // it includes shaping information for Arabic.
- FourCharCode tables[] = { 'morx', 'mort' };
- for (size_t i = 0; i < WTF_ARRAY_LENGTH(tables); ++i) {
- ByteCount tableSize;
- OSStatus status = ATSFontGetTable(fontID, tables[i], 0, 0, 0, &tableSize);
- if (status == noErr) {
- m_shapesArabic = true;
- return;
- }
-
- if (status != kATSInvalidFontTableAccess)
- LOG_ERROR("ATSFontGetTable failed (%d)", status);
- }
-}
-
-} // namespace WebCore
-
-#endif
diff --git a/WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp b/WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp
deleted file mode 100644
index 452bd54..0000000
--- a/WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved.
- * Copyright (C) 2006 Alexey Proskuryakov
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#import "config.h"
-#import "SimpleFontData.h"
-
-#import "Font.h"
-#import "FontCache.h"
-#import "FontDescription.h"
-#import <ApplicationServices/ApplicationServices.h>
-
-using namespace std;
-
-namespace WebCore {
-
-CFDictionaryRef SimpleFontData::getCFStringAttributes(TypesettingFeatures typesettingFeatures) const
-{
- unsigned key = typesettingFeatures + 1;
- pair<HashMap<unsigned, RetainPtr<CFDictionaryRef> >::iterator, bool> addResult = m_CFStringAttributes.add(key, RetainPtr<CFDictionaryRef>());
- RetainPtr<CFDictionaryRef>& attributesDictionary = addResult.first->second;
- if (!addResult.second)
- return attributesDictionary.get();
-
- bool allowLigatures = (orientation() == Horizontal && platformData().allowsLigatures()) || (typesettingFeatures & Ligatures);
-
- static const int ligaturesNotAllowedValue = 0;
- static CFNumberRef ligaturesNotAllowed = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &ligaturesNotAllowedValue);
-
- static const int ligaturesAllowedValue = 1;
- static CFNumberRef ligaturesAllowed = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &ligaturesAllowedValue);
-
- if (!(typesettingFeatures & Kerning)) {
- static const float kerningAdjustmentValue = 0;
- static CFNumberRef kerningAdjustment = CFNumberCreate(kCFAllocatorDefault, kCFNumberFloatType, &kerningAdjustmentValue);
- static const void* keysWithKerningDisabled[] = { kCTFontAttributeName, kCTKernAttributeName, kCTLigatureAttributeName, kCTVerticalFormsAttributeName };
- const void* valuesWithKerningDisabled[] = { platformData().ctFont(), kerningAdjustment, allowLigatures
- ? ligaturesAllowed : ligaturesNotAllowed, orientation() == Vertical ? kCFBooleanTrue : kCFBooleanFalse };
- attributesDictionary.adoptCF(CFDictionaryCreate(0, keysWithKerningDisabled, valuesWithKerningDisabled,
- WTF_ARRAY_LENGTH(keysWithKerningDisabled), &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
- } else {
- // By omitting the kCTKernAttributeName attribute, we get Core Text's standard kerning.
- static const void* keysWithKerningEnabled[] = { kCTFontAttributeName, kCTLigatureAttributeName, kCTVerticalFormsAttributeName };
- const void* valuesWithKerningEnabled[] = { platformData().ctFont(), allowLigatures ? ligaturesAllowed : ligaturesNotAllowed, orientation() == Vertical ? kCFBooleanTrue : kCFBooleanFalse };
- attributesDictionary.adoptCF(CFDictionaryCreate(0, keysWithKerningEnabled, valuesWithKerningEnabled,
- WTF_ARRAY_LENGTH(keysWithKerningEnabled), &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
- }
-
- return attributesDictionary.get();
-}
-
-} // namespace WebCore
diff --git a/WebCore/platform/graphics/mac/SimpleFontDataMac.mm b/WebCore/platform/graphics/mac/SimpleFontDataMac.mm
deleted file mode 100644
index 92585c6..0000000
--- a/WebCore/platform/graphics/mac/SimpleFontDataMac.mm
+++ /dev/null
@@ -1,504 +0,0 @@
-/*
- * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved.
- * Copyright (C) 2006 Alexey Proskuryakov
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#import "config.h"
-#import "SimpleFontData.h"
-
-#import "BlockExceptions.h"
-#import "Color.h"
-#import "FloatRect.h"
-#import "Font.h"
-#import "FontCache.h"
-#import "FontDescription.h"
-#import "SharedBuffer.h"
-#import "WebCoreSystemInterface.h"
-#import <AppKit/AppKit.h>
-#import <ApplicationServices/ApplicationServices.h>
-#import <float.h>
-#import <unicode/uchar.h>
-#import <wtf/Assertions.h>
-#import <wtf/StdLibExtras.h>
-#import <wtf/RetainPtr.h>
-#import <wtf/UnusedParam.h>
-
-@interface NSFont (WebAppKitSecretAPI)
-- (BOOL)_isFakeFixedPitch;
-@end
-
-using namespace std;
-
-namespace WebCore {
-
-const float smallCapsFontSizeMultiplier = 0.7f;
-static inline float scaleEmToUnits(float x, unsigned unitsPerEm) { return x / unitsPerEm; }
-
-static bool initFontData(SimpleFontData* fontData)
-{
- if (!fontData->platformData().cgFont())
- return false;
-
-#ifdef BUILDING_ON_TIGER
- ATSUStyle fontStyle;
- if (ATSUCreateStyle(&fontStyle) != noErr)
- return false;
-
- ATSUFontID fontId = fontData->platformData().m_atsuFontID;
- if (!fontId) {
- ATSUDisposeStyle(fontStyle);
- return false;
- }
-
- ATSUAttributeTag tag = kATSUFontTag;
- ByteCount size = sizeof(ATSUFontID);
- ATSUFontID *valueArray[1] = {&fontId};
- OSStatus status = ATSUSetAttributes(fontStyle, 1, &tag, &size, (void* const*)valueArray);
- if (status != noErr) {
- ATSUDisposeStyle(fontStyle);
- return false;
- }
-
- if (wkGetATSStyleGroup(fontStyle, &fontData->m_styleGroup) != noErr) {
- ATSUDisposeStyle(fontStyle);
- return false;
- }
-
- ATSUDisposeStyle(fontStyle);
-#endif
-
- return true;
-}
-
-static NSString *webFallbackFontFamily(void)
-{
- DEFINE_STATIC_LOCAL(RetainPtr<NSString>, webFallbackFontFamily, ([[NSFont systemFontOfSize:16.0f] familyName]));
- return webFallbackFontFamily.get();
-}
-
-#if !ERROR_DISABLED
-#if defined(__LP64__) || (!defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD))
-static NSString* pathFromFont(NSFont*)
-{
- // FMGetATSFontRefFromFont is not available. As pathFromFont is only used for debugging purposes,
- // returning nil is acceptable.
- return nil;
-}
-#else
-static NSString* pathFromFont(NSFont *font)
-{
-#ifndef BUILDING_ON_TIGER
- ATSFontRef atsFont = FMGetATSFontRefFromFont(CTFontGetPlatformFont(toCTFontRef(font), 0));
-#else
- ATSFontRef atsFont = FMGetATSFontRefFromFont(wkGetNSFontATSUFontId(font));
-#endif
- FSRef fileRef;
-
-#ifndef BUILDING_ON_TIGER
- OSStatus status = ATSFontGetFileReference(atsFont, &fileRef);
- if (status != noErr)
- return nil;
-#else
- FSSpec oFile;
- OSStatus status = ATSFontGetFileSpecification(atsFont, &oFile);
- if (status != noErr)
- return nil;
-
- status = FSpMakeFSRef(&oFile, &fileRef);
- if (status != noErr)
- return nil;
-#endif
-
- UInt8 filePathBuffer[PATH_MAX];
- status = FSRefMakePath(&fileRef, filePathBuffer, PATH_MAX);
- if (status == noErr)
- return [NSString stringWithUTF8String:(const char*)filePathBuffer];
-
- return nil;
-}
-#endif // __LP64__
-#endif // !ERROR_DISABLED
-
-void SimpleFontData::platformInit()
-{
-#ifdef BUILDING_ON_TIGER
- m_styleGroup = 0;
-#endif
-#if USE(ATSUI)
- m_ATSUMirrors = false;
- m_checkedShapesArabic = false;
- m_shapesArabic = false;
-#endif
-
- m_syntheticBoldOffset = m_platformData.m_syntheticBold ? 1.0f : 0.f;
-
- bool failedSetup = false;
- if (!initFontData(this)) {
- // Ack! Something very bad happened, like a corrupt font.
- // Try looking for an alternate 'base' font for this renderer.
-
- // Special case hack to use "Times New Roman" in place of "Times".
- // "Times RO" is a common font whose family name is "Times".
- // It overrides the normal "Times" family font.
- // It also appears to have a corrupt regular variant.
- NSString *fallbackFontFamily;
- if ([[m_platformData.font() familyName] isEqual:@"Times"])
- fallbackFontFamily = @"Times New Roman";
- else
- fallbackFontFamily = webFallbackFontFamily();
-
- // Try setting up the alternate font.
- // This is a last ditch effort to use a substitute font when something has gone wrong.
-#if !ERROR_DISABLED
- RetainPtr<NSFont> initialFont = m_platformData.font();
-#endif
- if (m_platformData.font())
- m_platformData.setFont([[NSFontManager sharedFontManager] convertFont:m_platformData.font() toFamily:fallbackFontFamily]);
- else
- m_platformData.setFont([NSFont fontWithName:fallbackFontFamily size:m_platformData.size()]);
-#if !ERROR_DISABLED
- NSString *filePath = pathFromFont(initialFont.get());
- if (!filePath)
- filePath = @"not known";
-#endif
- if (!initFontData(this)) {
- if ([fallbackFontFamily isEqual:@"Times New Roman"]) {
- // OK, couldn't setup Times New Roman as an alternate to Times, fallback
- // on the system font. If this fails we have no alternative left.
- m_platformData.setFont([[NSFontManager sharedFontManager] convertFont:m_platformData.font() toFamily:webFallbackFontFamily()]);
- if (!initFontData(this)) {
- // We tried, Times, Times New Roman, and the system font. No joy. We have to give up.
- LOG_ERROR("unable to initialize with font %@ at %@", initialFont.get(), filePath);
- failedSetup = true;
- }
- } else {
- // We tried the requested font and the system font. No joy. We have to give up.
- LOG_ERROR("unable to initialize with font %@ at %@", initialFont.get(), filePath);
- failedSetup = true;
- }
- }
-
- // Report the problem.
- LOG_ERROR("Corrupt font detected, using %@ in place of %@ located at \"%@\".",
- [m_platformData.font() familyName], [initialFont.get() familyName], filePath);
- }
-
- // If all else fails, try to set up using the system font.
- // This is probably because Times and Times New Roman are both unavailable.
- if (failedSetup) {
- m_platformData.setFont([NSFont systemFontOfSize:[m_platformData.font() pointSize]]);
- LOG_ERROR("failed to set up font, using system font %s", m_platformData.font());
- initFontData(this);
- }
-
- int iAscent;
- int iDescent;
- int iLineGap;
-#ifdef BUILDING_ON_TIGER
- wkGetFontMetrics(m_platformData.cgFont(), &iAscent, &iDescent, &iLineGap, &m_unitsPerEm);
-#else
- iAscent = CGFontGetAscent(m_platformData.cgFont());
- iDescent = CGFontGetDescent(m_platformData.cgFont());
- iLineGap = CGFontGetLeading(m_platformData.cgFont());
- m_unitsPerEm = CGFontGetUnitsPerEm(m_platformData.cgFont());
-#endif
-
- float pointSize = m_platformData.m_size;
- float fAscent = scaleEmToUnits(iAscent, m_unitsPerEm) * pointSize;
- float fDescent = -scaleEmToUnits(iDescent, m_unitsPerEm) * pointSize;
- float fLineGap = scaleEmToUnits(iLineGap, m_unitsPerEm) * pointSize;
-
- // We need to adjust Times, Helvetica, and Courier to closely match the
- // vertical metrics of their Microsoft counterparts that are the de facto
- // web standard. The AppKit adjustment of 20% is too big and is
- // incorrectly added to line spacing, so we use a 15% adjustment instead
- // and add it to the ascent.
- NSString *familyName = [m_platformData.font() familyName];
- if ([familyName isEqualToString:@"Times"] || [familyName isEqualToString:@"Helvetica"] || [familyName isEqualToString:@"Courier"])
- fAscent += floorf(((fAscent + fDescent) * 0.15f) + 0.5f);
- else if ([familyName isEqualToString:@"Geeza Pro"]) {
- // Geeza Pro has glyphs that draw slightly above the ascent or far below the descent. Adjust
- // those vertical metrics to better match reality, so that diacritics at the bottom of one line
- // do not overlap diacritics at the top of the next line.
- fAscent *= 1.08f;
- fDescent *= 2.f;
- }
-
- m_ascent = lroundf(fAscent);
- m_descent = lroundf(fDescent);
- m_lineGap = lroundf(fLineGap);
- m_lineSpacing = m_ascent + m_descent + m_lineGap;
-
- // Hack Hiragino line metrics to allow room for marked text underlines.
- // <rdar://problem/5386183>
- if (m_descent < 3 && m_lineGap >= 3 && [familyName hasPrefix:@"Hiragino"]) {
- m_lineGap -= 3 - m_descent;
- m_descent = 3;
- }
-
- if (m_orientation == Vertical) {
- // Ignore vertical orientation when the font doesn't support vertical metrics.
- // The check doesn't look neat but this is what AppKit does for vertical writing...
- RetainPtr<CFArrayRef> tableTags(AdoptCF, CTFontCopyAvailableTables(m_platformData.ctFont(), kCTFontTableOptionExcludeSynthetic));
- CFIndex numTables = CFArrayGetCount(tableTags.get());
- bool found = false;
- for (CFIndex index = 0; index < numTables; ++index) {
- CTFontTableTag tag = (CTFontTableTag)(uintptr_t)CFArrayGetValueAtIndex(tableTags.get(), index);
- if (tag == kCTFontTableVhea || tag == kCTFontTableVORG) {
- found = true;
- break;
- }
- }
-
- if (found == false)
- m_orientation = Horizontal;
- }
-
- // Measure the actual character "x", because AppKit synthesizes X height rather than getting it from the font.
- // Unfortunately, NSFont will round this for us so we don't quite get the right value.
- GlyphPage* glyphPageZero = GlyphPageTreeNode::getRootChild(this, 0)->page();
- NSGlyph xGlyph = glyphPageZero ? glyphPageZero->glyphDataForCharacter('x').glyph : 0;
- if (xGlyph) {
- CGRect xBox = platformBoundsForGlyph(xGlyph);
- // Use the maximum of either width or height because "x" is nearly square
- // and web pages that foolishly use this metric for width will be laid out
- // poorly if we return an accurate height. Classic case is Times 13 point,
- // which has an "x" that is 7x6 pixels.
- m_xHeight = static_cast<float>(max(CGRectGetMaxX(xBox), -CGRectGetMinY(xBox)));
- } else {
-#ifndef BUILDING_ON_TIGER
- m_xHeight = static_cast<float>(CGFontGetXHeight(m_platformData.cgFont())) / m_unitsPerEm;
-#else
- m_xHeight = m_platformData.font() ? [m_platformData.font() xHeight] : 0;
-#endif
- // CGFontGetXHeight() returns a wrong value for "Apple Symbols" font (a float close to 0, but not strictly 0).
- // The following code makes a guess for m_xHeight in that case.
- // The int cast is a workaround for the "almost" zero value returned by CGFontGetXHeight().
- if (!static_cast<int>(m_xHeight) && fAscent)
- m_xHeight = 2 * fAscent / 3;
- }
-}
-
-static CFDataRef copyFontTableForTag(FontPlatformData& platformData, FourCharCode tableName)
-{
-#ifdef BUILDING_ON_TIGER
- ATSFontRef atsFont = FMGetATSFontRefFromFont(platformData.m_atsuFontID);
-
- ByteCount tableSize;
- if (ATSFontGetTable(atsFont, tableName, 0, 0, NULL, &tableSize) != noErr)
- return 0;
-
- CFMutableDataRef data = CFDataCreateMutable(kCFAllocatorDefault, tableSize);
- if (!data)
- return 0;
-
- CFDataIncreaseLength(data, tableSize);
- if (ATSFontGetTable(atsFont, tableName, 0, tableSize, CFDataGetMutableBytePtr(data), &tableSize) != noErr) {
- CFRelease(data);
- return 0;
- }
-
- return data;
-#else
- return CGFontCopyTableForTag(platformData.cgFont(), tableName);
-#endif
-}
-
-void SimpleFontData::platformCharWidthInit()
-{
- m_avgCharWidth = 0;
- m_maxCharWidth = 0;
-
- RetainPtr<CFDataRef> os2Table(AdoptCF, copyFontTableForTag(m_platformData, 'OS/2'));
- if (os2Table && CFDataGetLength(os2Table.get()) >= 4) {
- const UInt8* os2 = CFDataGetBytePtr(os2Table.get());
- SInt16 os2AvgCharWidth = os2[2] * 256 + os2[3];
- m_avgCharWidth = scaleEmToUnits(os2AvgCharWidth, m_unitsPerEm) * m_platformData.m_size;
- }
-
- RetainPtr<CFDataRef> headTable(AdoptCF, copyFontTableForTag(m_platformData, 'head'));
- if (headTable && CFDataGetLength(headTable.get()) >= 42) {
- const UInt8* head = CFDataGetBytePtr(headTable.get());
- ushort uxMin = head[36] * 256 + head[37];
- ushort uxMax = head[40] * 256 + head[41];
- SInt16 xMin = static_cast<SInt16>(uxMin);
- SInt16 xMax = static_cast<SInt16>(uxMax);
- float diff = static_cast<float>(xMax - xMin);
- m_maxCharWidth = scaleEmToUnits(diff, m_unitsPerEm) * m_platformData.m_size;
- }
-
- // Fallback to a cross-platform estimate, which will populate these values if they are non-positive.
- initCharWidths();
-}
-
-void SimpleFontData::platformDestroy()
-{
- if (!isCustomFont() && m_derivedFontData) {
- // These come from the cache.
- if (m_derivedFontData->smallCaps)
- fontCache()->releaseFontData(m_derivedFontData->smallCaps.leakPtr());
-
- if (m_derivedFontData->emphasisMark)
- fontCache()->releaseFontData(m_derivedFontData->emphasisMark.leakPtr());
- }
-
-#ifdef BUILDING_ON_TIGER
- if (m_styleGroup)
- wkReleaseStyleGroup(m_styleGroup);
-#endif
-#if USE(ATSUI)
- HashMap<unsigned, ATSUStyle>::iterator end = m_ATSUStyleMap.end();
- for (HashMap<unsigned, ATSUStyle>::iterator it = m_ATSUStyleMap.begin(); it != end; ++it)
- ATSUDisposeStyle(it->second);
-#endif
-}
-
-SimpleFontData* SimpleFontData::scaledFontData(const FontDescription& fontDescription, float scaleFactor) const
-{
- if (isCustomFont()) {
- FontPlatformData scaledFontData(m_platformData);
- scaledFontData.m_size = scaledFontData.m_size * scaleFactor;
- return new SimpleFontData(scaledFontData, true, false);
- }
-
- BEGIN_BLOCK_OBJC_EXCEPTIONS;
- float size = m_platformData.size() * scaleFactor;
- FontPlatformData scaledFontData([[NSFontManager sharedFontManager] convertFont:m_platformData.font() toSize:size], size);
-
- // AppKit resets the type information (screen/printer) when you convert a font to a different size.
- // We have to fix up the font that we're handed back.
- scaledFontData.setFont(fontDescription.usePrinterFont() ? [scaledFontData.font() printerFont] : [scaledFontData.font() screenFont]);
-
- if (scaledFontData.font()) {
- NSFontManager *fontManager = [NSFontManager sharedFontManager];
- NSFontTraitMask fontTraits = [fontManager traitsOfFont:m_platformData.font()];
-
- if (m_platformData.m_syntheticBold)
- fontTraits |= NSBoldFontMask;
- if (m_platformData.m_syntheticOblique)
- fontTraits |= NSItalicFontMask;
-
- NSFontTraitMask scaledFontTraits = [fontManager traitsOfFont:scaledFontData.font()];
- scaledFontData.m_syntheticBold = (fontTraits & NSBoldFontMask) && !(scaledFontTraits & NSBoldFontMask);
- scaledFontData.m_syntheticOblique = (fontTraits & NSItalicFontMask) && !(scaledFontTraits & NSItalicFontMask);
-
- return fontCache()->getCachedFontData(&scaledFontData);
- }
- END_BLOCK_OBJC_EXCEPTIONS;
-
- return 0;
-}
-
-SimpleFontData* SimpleFontData::smallCapsFontData(const FontDescription& fontDescription) const
-{
- if (!m_derivedFontData)
- m_derivedFontData = DerivedFontData::create(isCustomFont());
- if (!m_derivedFontData->smallCaps)
- m_derivedFontData->smallCaps = scaledFontData(fontDescription, smallCapsFontSizeMultiplier);
-
- return m_derivedFontData->smallCaps.get();
-}
-
-SimpleFontData* SimpleFontData::emphasisMarkFontData(const FontDescription& fontDescription) const
-{
- if (!m_derivedFontData)
- m_derivedFontData = DerivedFontData::create(isCustomFont());
- if (!m_derivedFontData->emphasisMark)
- m_derivedFontData->emphasisMark = scaledFontData(fontDescription, .5f);
-
- return m_derivedFontData->emphasisMark.get();
-}
-
-bool SimpleFontData::containsCharacters(const UChar* characters, int length) const
-{
- NSString *string = [[NSString alloc] initWithCharactersNoCopy:const_cast<unichar*>(characters) length:length freeWhenDone:NO];
- NSCharacterSet *set = [[m_platformData.font() coveredCharacterSet] invertedSet];
- bool result = set && [string rangeOfCharacterFromSet:set].location == NSNotFound;
- [string release];
- return result;
-}
-
-void SimpleFontData::determinePitch()
-{
- NSFont* f = m_platformData.font();
- // Special case Osaka-Mono.
- // According to <rdar://problem/3999467>, we should treat Osaka-Mono as fixed pitch.
- // Note that the AppKit does not report Osaka-Mono as fixed pitch.
-
- // Special case MS-PGothic.
- // According to <rdar://problem/4032938>, we should not treat MS-PGothic as fixed pitch.
- // Note that AppKit does report MS-PGothic as fixed pitch.
-
- // Special case MonotypeCorsiva
- // According to <rdar://problem/5454704>, we should not treat MonotypeCorsiva as fixed pitch.
- // Note that AppKit does report MonotypeCorsiva as fixed pitch.
-
- NSString *name = [f fontName];
- m_treatAsFixedPitch = ([f isFixedPitch] || [f _isFakeFixedPitch] ||
- [name caseInsensitiveCompare:@"Osaka-Mono"] == NSOrderedSame) &&
- [name caseInsensitiveCompare:@"MS-PGothic"] != NSOrderedSame &&
- [name caseInsensitiveCompare:@"MonotypeCorsiva"] != NSOrderedSame;
-}
-
-FloatRect SimpleFontData::platformBoundsForGlyph(Glyph glyph) const
-{
- FloatRect boundingBox;
-#ifndef BUILDING_ON_TIGER
- boundingBox = CTFontGetBoundingRectsForGlyphs(m_platformData.ctFont(),
- orientation() == Vertical ? kCTFontVerticalOrientation : kCTFontHorizontalOrientation, &glyph, 0, 1);
- boundingBox.setY(-boundingBox.bottom());
-#else
- // FIXME: Custom fonts don't have NSFonts, so this function doesn't compute correct bounds for these on Tiger.
- if (!m_platformData.font())
- return boundingBox;
- boundingBox = [m_platformData.font() boundingRectForGlyph:glyph];
- boundingBox.setY(-boundingBox.bottom());
-#endif
- if (m_syntheticBoldOffset)
- boundingBox.setWidth(boundingBox.width() + m_syntheticBoldOffset);
-
- return boundingBox;
-}
-
-float SimpleFontData::platformWidthForGlyph(Glyph glyph) const
-{
- CGSize advance;
- if (orientation() == Horizontal || m_isBrokenIdeographFont) {
- NSFont* font = platformData().font();
- float pointSize = platformData().m_size;
- CGAffineTransform m = CGAffineTransformMakeScale(pointSize, pointSize);
- if (!wkGetGlyphTransformedAdvances(platformData().cgFont(), font, &m, &glyph, &advance)) {
- LOG_ERROR("Unable to cache glyph widths for %@ %f", [font displayName], pointSize);
- advance.width = 0;
- }
- } else
- CTFontGetAdvancesForGlyphs(m_platformData.ctFont(), kCTFontVerticalOrientation, &glyph, &advance, 1);
-
- return advance.width + m_syntheticBoldOffset;
-}
-
-} // namespace WebCore
diff --git a/WebCore/platform/graphics/mac/WebGLLayer.h b/WebCore/platform/graphics/mac/WebGLLayer.h
deleted file mode 100644
index 6440b71..0000000
--- a/WebCore/platform/graphics/mac/WebGLLayer.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef WebGLLayer_h
-#define WebGLLayer_h
-
-#if USE(ACCELERATED_COMPOSITING)
-
-#import <QuartzCore/QuartzCore.h>
-
-namespace WebCore {
- class GraphicsLayer;
- class GraphicsContext3D;
-}
-
-@interface WebGLLayer : CAOpenGLLayer
-{
- WebCore::GraphicsLayer* m_layerOwner;
- WebCore::GraphicsContext3D* m_context;
-}
-
-- (id)initWithGraphicsContext3D:(WebCore::GraphicsContext3D*)context;
-
-- (CGImageRef)copyImageSnapshotWithColorSpace:(CGColorSpaceRef)colorSpace;
-
-@end
-
-#endif // USE(ACCELERATED_COMPOSITING)
-
-#endif // WebGLLayer_h
diff --git a/WebCore/platform/graphics/mac/WebGLLayer.mm b/WebCore/platform/graphics/mac/WebGLLayer.mm
deleted file mode 100644
index 12c6f0d..0000000
--- a/WebCore/platform/graphics/mac/WebGLLayer.mm
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#if USE(ACCELERATED_COMPOSITING)
-#if ENABLE(3D_CANVAS)
-
-#import "WebGLLayer.h"
-
-#import "GraphicsContext3D.h"
-#import "GraphicsLayer.h"
-#import <OpenGL/OpenGL.h>
-#import <wtf/FastMalloc.h>
-#import <wtf/RetainPtr.h>
-#import <wtf/UnusedParam.h>
-
-using namespace WebCore;
-
-@implementation WebGLLayer
-
--(id)initWithGraphicsContext3D:(GraphicsContext3D*)context
-{
- m_context = context;
- self = [super init];
- return self;
-}
-
--(CGLPixelFormatObj)copyCGLPixelFormatForDisplayMask:(uint32_t)mask
-{
- // FIXME: The mask param tells you which display (on a multi-display system)
- // is to be used. But since we are now getting the pixel format from the
- // Canvas CGL context, we don't use it. This seems to do the right thing on
- // one multi-display system. But there may be cases where this is not the case.
- // If needed we will have to set the display mask in the Canvas CGLContext and
- // make sure it matches.
- UNUSED_PARAM(mask);
- return CGLRetainPixelFormat(CGLGetPixelFormat(m_context->platformGraphicsContext3D()));
-}
-
--(CGLContextObj)copyCGLContextForPixelFormat:(CGLPixelFormatObj)pixelFormat
-{
- CGLContextObj contextObj;
- CGLCreateContext(pixelFormat, m_context->platformGraphicsContext3D(), &contextObj);
- return contextObj;
-}
-
--(void)drawInCGLContext:(CGLContextObj)glContext pixelFormat:(CGLPixelFormatObj)pixelFormat forLayerTime:(CFTimeInterval)timeInterval displayTime:(const CVTimeStamp *)timeStamp
-{
- m_context->prepareTexture();
-
- CGLSetCurrentContext(glContext);
-
- CGRect frame = [self frame];
-
- // draw the FBO into the layer
- glViewport(0, 0, frame.size.width, frame.size.height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-1, 1, -1, 1, -1, 1);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, m_context->platformTexture());
-
- glBegin(GL_TRIANGLE_FAN);
- glTexCoord2f(0, 0);
- glVertex2f(-1, -1);
- glTexCoord2f(1, 0);
- glVertex2f(1, -1);
- glTexCoord2f(1, 1);
- glVertex2f(1, 1);
- glTexCoord2f(0, 1);
- glVertex2f(-1, 1);
- glEnd();
-
- glBindTexture(GL_TEXTURE_2D, 0);
- glDisable(GL_TEXTURE_2D);
-
- // Call super to finalize the drawing. By default all it does is call glFlush().
- [super drawInCGLContext:glContext pixelFormat:pixelFormat forLayerTime:timeInterval displayTime:timeStamp];
-}
-
-static void freeData(void *, const void *data, size_t /* size */)
-{
- fastFree(const_cast<void *>(data));
-}
-
--(CGImageRef)copyImageSnapshotWithColorSpace:(CGColorSpaceRef)colorSpace
-{
- CGLSetCurrentContext(m_context->platformGraphicsContext3D());
-
- RetainPtr<CGColorSpaceRef> imageColorSpace = colorSpace;
- if (!imageColorSpace)
- imageColorSpace.adoptCF(CGColorSpaceCreateDeviceRGB());
-
- CGRect layerBounds = CGRectIntegral([self bounds]);
-
- size_t width = layerBounds.size.width;
- size_t height = layerBounds.size.height;
-
- size_t rowBytes = (width * 4 + 15) & ~15;
- size_t dataSize = rowBytes * height;
- void* data = fastMalloc(dataSize);
- if (!data)
- return 0;
-
- glPixelStorei(GL_PACK_ROW_LENGTH, rowBytes / 4);
- glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
-
- CGDataProviderRef provider = CGDataProviderCreateWithData(0, data, dataSize, freeData);
- CGImageRef image = CGImageCreate(width, height, 8, 32, rowBytes, imageColorSpace.get(),
- kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host,
- provider, 0, true,
- kCGRenderingIntentDefault);
- CGDataProviderRelease(provider);
- return image;
-}
-
-- (void)display
-{
- [super display];
- if (m_layerOwner)
- m_layerOwner->didDisplay(self);
-}
-
-@end
-
-@implementation WebGLLayer(WebGLLayerAdditions)
-
--(void)setLayerOwner:(GraphicsLayer*)aLayer
-{
- m_layerOwner = aLayer;
-}
-
--(GraphicsLayer*)layerOwner
-{
- return m_layerOwner;
-}
-
-@end
-
-#endif // ENABLE(3D_CANVAS)
-#endif // USE(ACCELERATED_COMPOSITING)
diff --git a/WebCore/platform/graphics/mac/WebLayer.h b/WebCore/platform/graphics/mac/WebLayer.h
deleted file mode 100644
index 62d69fc..0000000
--- a/WebCore/platform/graphics/mac/WebLayer.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef WebLayer_h
-#define WebLayer_h
-
-#if USE(ACCELERATED_COMPOSITING)
-
-#import <QuartzCore/QuartzCore.h>
-
-namespace WebCore {
- class GraphicsLayer;
-}
-
-#if defined(BUILDING_ON_LEOPARD)
-@interface CALayer(WebLayerInternal)
-- (CGAffineTransform)contentsTransform;
-- (void)setContentsTransform:(CGAffineTransform)t;
-@end
-#endif
-
-@interface WebLayer : CALayer
-{
-}
-@end
-
-// Functions allows us to share implementation across WebTiledLayer and WebLayer
-void drawLayerContents(CGContextRef, CALayer *, WebCore::GraphicsLayer*);
-void setLayerNeedsDisplayInRect(CALayer *, WebCore::GraphicsLayer*, CGRect);
-
-#endif // USE(ACCELERATED_COMPOSITING)
-
-#endif // WebLayer_h
diff --git a/WebCore/platform/graphics/mac/WebLayer.mm b/WebCore/platform/graphics/mac/WebLayer.mm
deleted file mode 100644
index 128e63b..0000000
--- a/WebCore/platform/graphics/mac/WebLayer.mm
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#if USE(ACCELERATED_COMPOSITING)
-
-#import "WebLayer.h"
-
-#import "GraphicsContext.h"
-#import "GraphicsLayerCA.h"
-#import "PlatformCALayer.h"
-#import <objc/objc-runtime.h>
-#import <QuartzCore/QuartzCore.h>
-#import <wtf/UnusedParam.h>
-
-using namespace WebCore;
-
-@implementation WebLayer
-
-void drawLayerContents(CGContextRef context, CALayer *layer, WebCore::GraphicsLayer* layerContents)
-{
- if (!layerContents)
- return;
-
- CGContextSaveGState(context);
-
- CGRect layerBounds = [layer bounds];
- if (layerContents->contentsOrientation() == WebCore::GraphicsLayer::CompositingCoordinatesBottomUp) {
- CGContextScaleCTM(context, 1, -1);
- CGContextTranslateCTM(context, 0, -layerBounds.size.height);
- }
-
- if (layerContents->client()) {
- [NSGraphicsContext saveGraphicsState];
-
- // Set up an NSGraphicsContext for the context, so that parts of AppKit that rely on
- // the current NSGraphicsContext (e.g. NSCell drawing) get the right one.
- NSGraphicsContext* layerContext = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:YES];
- [NSGraphicsContext setCurrentContext:layerContext];
-
- GraphicsContext graphicsContext(context);
-
- if (!layerContents->contentsOpaque()) {
- // Turn off font smoothing to improve the appearance of text rendered onto a transparent background.
- graphicsContext.setShouldSmoothFonts(false);
- }
-
- // It's important to get the clip from the context, because it may be significantly
- // smaller than the layer bounds (e.g. tiled layers)
- CGRect clipBounds = CGContextGetClipBoundingBox(context);
- IntRect clip(enclosingIntRect(clipBounds));
- layerContents->paintGraphicsLayerContents(graphicsContext, clip);
-
- [NSGraphicsContext restoreGraphicsState];
- }
-#ifndef NDEBUG
- else {
- ASSERT_NOT_REACHED();
-
- // FIXME: ideally we'd avoid calling -setNeedsDisplay on a layer that is a plain color,
- // so CA never makes backing store for it (which is what -setNeedsDisplay will do above).
- CGContextSetRGBFillColor(context, 0.0f, 1.0f, 0.0f, 1.0f);
- CGContextFillRect(context, layerBounds);
- }
-#endif
-
- if (layerContents->showRepaintCounter()) {
- bool isTiledLayer = [layer isKindOfClass:[CATiledLayer class]];
-
- char text[16]; // that's a lot of repaints
- snprintf(text, sizeof(text), "%d", layerContents->incrementRepaintCount());
-
- CGContextSaveGState(context);
- if (isTiledLayer)
- CGContextSetRGBFillColor(context, 0.0f, 1.0f, 0.0f, 0.8f);
- else
- CGContextSetRGBFillColor(context, 1.0f, 0.0f, 0.0f, 0.8f);
-
- CGRect aBounds = layerBounds;
-
- aBounds.size.width = 10 + 12 * strlen(text);
- aBounds.size.height = 25;
- CGContextFillRect(context, aBounds);
-
- CGContextSetRGBFillColor(context, 0.0f, 0.0f, 0.0f, 1.0f);
-
- CGContextSetTextMatrix(context, CGAffineTransformMakeScale(1.0f, -1.0f));
- CGContextSelectFont(context, "Helvetica", 25, kCGEncodingMacRoman);
- CGContextShowTextAtPoint(context, aBounds.origin.x + 3.0f, aBounds.origin.y + 20.0f, text, strlen(text));
-
- CGContextRestoreGState(context);
- }
-
- CGContextRestoreGState(context);
-}
-
-void setLayerNeedsDisplayInRect(CALayer *layer, WebCore::GraphicsLayer* layerContents, CGRect rect)
-{
- if (layerContents && layerContents->client() && layerContents->drawsContent()) {
- struct objc_super layerSuper = { layer, class_getSuperclass(object_getClass(layer)) };
-#if defined(BUILDING_ON_LEOPARD)
- rect = CGRectApplyAffineTransform(rect, [layer contentsTransform]);
-#else
- if (layerContents->contentsOrientation() == WebCore::GraphicsLayer::CompositingCoordinatesBottomUp)
- rect.origin.y = [layer bounds].size.height - rect.origin.y - rect.size.height;
-#endif
- objc_msgSendSuper(&layerSuper, @selector(setNeedsDisplayInRect:), rect);
-
-#ifndef NDEBUG
- if (layerContents->showRepaintCounter()) {
- CGRect bounds = [layer bounds];
- CGRect indicatorRect = CGRectMake(bounds.origin.x, bounds.origin.y, 46, 25);
-#if defined(BUILDING_ON_LEOPARD)
- indicatorRect = CGRectApplyAffineTransform(indicatorRect, [layer contentsTransform]);
-#else
- if (layerContents->contentsOrientation() == WebCore::GraphicsLayer::CompositingCoordinatesBottomUp)
- indicatorRect.origin.y = [layer bounds].size.height - indicatorRect.origin.y - indicatorRect.size.height;
-#endif
- objc_msgSendSuper(&layerSuper, @selector(setNeedsDisplayInRect:), indicatorRect);
- }
-#endif
- }
-}
-
-// Disable default animations
-- (id<CAAction>)actionForKey:(NSString *)key
-{
- UNUSED_PARAM(key);
- return nil;
-}
-
-- (void)setNeedsDisplay
-{
- PlatformCALayer* layer = PlatformCALayer::platformCALayer(self);
- if (layer && layer->owner() && layer->owner()->client() && layer->owner()->drawsContent())
- [super setNeedsDisplay];
-}
-
-- (void)setNeedsDisplayInRect:(CGRect)dirtyRect
-{
- PlatformCALayer* layer = PlatformCALayer::platformCALayer(self);
- if (layer)
- setLayerNeedsDisplayInRect(self, layer->owner(), dirtyRect);
-}
-
-- (void)display
-{
- [super display];
- PlatformCALayer* layer = PlatformCALayer::platformCALayer(self);
- if (layer && layer->owner())
- layer->owner()->didDisplay(self);
-}
-
-- (void)drawInContext:(CGContextRef)context
-{
- PlatformCALayer* layer = PlatformCALayer::platformCALayer(self);
- if (layer)
- drawLayerContents(context, self, layer->owner());
-}
-
-@end // implementation WebLayer
-
-#pragma mark -
-
-#ifndef NDEBUG
-
-@implementation CALayer(ExtendedDescription)
-
-- (NSString*)_descriptionWithPrefix:(NSString*)inPrefix
-{
- CGRect aBounds = [self bounds];
- CGPoint aPos = [self position];
-
- NSString* selfString = [NSString stringWithFormat:@"%@<%@ 0x%08x> \"%@\" bounds(%.1f, %.1f, %.1f, %.1f) pos(%.1f, %.1f), sublayers=%d masking=%d",
- inPrefix,
- [self class],
- self,
- [self name],
- aBounds.origin.x, aBounds.origin.y, aBounds.size.width, aBounds.size.height,
- aPos.x, aPos.y,
- [[self sublayers] count],
- [self masksToBounds]];
-
- NSMutableString* curDesc = [NSMutableString stringWithString:selfString];
-
- if ([[self sublayers] count] > 0)
- [curDesc appendString:@"\n"];
-
- NSString* sublayerPrefix = [inPrefix stringByAppendingString:@"\t"];
-
- NSEnumerator* sublayersEnum = [[self sublayers] objectEnumerator];
- CALayer* curLayer;
- while ((curLayer = [sublayersEnum nextObject]))
- [curDesc appendString:[curLayer _descriptionWithPrefix:sublayerPrefix]];
-
- if ([[self sublayers] count] == 0)
- [curDesc appendString:@"\n"];
-
- return curDesc;
-}
-
-- (NSString*)extendedDescription
-{
- return [self _descriptionWithPrefix:@""];
-}
-
-@end // implementation WebLayer(ExtendedDescription)
-
-#endif // NDEBUG
-
-#endif // USE(ACCELERATED_COMPOSITING)
diff --git a/WebCore/platform/graphics/mac/WebTiledLayer.h b/WebCore/platform/graphics/mac/WebTiledLayer.h
deleted file mode 100644
index 6f559e3..0000000
--- a/WebCore/platform/graphics/mac/WebTiledLayer.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef WebTiledLayer_h
-#define WebTiledLayer_h
-
-#if USE(ACCELERATED_COMPOSITING)
-
-#import "WebLayer.h"
-
-@interface WebTiledLayer : CATiledLayer
-{
-}
-
-// implements WebLayerAdditions
-
-@end
-
-#endif // USE(ACCELERATED_COMPOSITING)
-
-#endif // WebTiledLayer_h
-
diff --git a/WebCore/platform/graphics/mac/WebTiledLayer.mm b/WebCore/platform/graphics/mac/WebTiledLayer.mm
deleted file mode 100644
index bf35431..0000000
--- a/WebCore/platform/graphics/mac/WebTiledLayer.mm
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#if USE(ACCELERATED_COMPOSITING)
-
-#import "WebTiledLayer.h"
-
-#import "GraphicsContext.h"
-#import "GraphicsLayerCA.h"
-#import "PlatformCALayer.h"
-#import <wtf/UnusedParam.h>
-
-using namespace WebCore;
-
-@implementation WebTiledLayer
-
-// Set a zero duration for the fade in of tiles
-+ (CFTimeInterval)fadeDuration
-{
- return 0;
-}
-
-// Make sure that tiles are drawn on the main thread
-+ (BOOL)shouldDrawOnMainThread
-{
- return YES;
-}
-
-// Disable default animations
-- (id<CAAction>)actionForKey:(NSString *)key
-{
- UNUSED_PARAM(key);
- return nil;
-}
-
-- (void)setNeedsDisplay
-{
- PlatformCALayer* layer = PlatformCALayer::platformCALayer(self);
- if (layer && layer->owner() && layer->owner()->client() && layer->owner()->drawsContent())
- [super setNeedsDisplay];
-}
-
-- (void)setNeedsDisplayInRect:(CGRect)dirtyRect
-{
- PlatformCALayer* layer = PlatformCALayer::platformCALayer(self);
- if (layer)
- setLayerNeedsDisplayInRect(self, layer->owner(), dirtyRect);
-}
-
-- (void)display
-{
- [super display];
- PlatformCALayer* layer = PlatformCALayer::platformCALayer(self);
- if (layer && layer->owner())
- layer->owner()->didDisplay(self);
-}
-
-- (void)drawInContext:(CGContextRef)context
-{
- PlatformCALayer* layer = PlatformCALayer::platformCALayer(self);
- if (layer)
- drawLayerContents(context, self, layer->owner());
-}
-
-@end // implementation WebTiledLayer
-
-#endif // USE(ACCELERATED_COMPOSITING)