diff options
author | Steve Block <steveblock@google.com> | 2010-02-02 14:57:50 +0000 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2010-02-04 15:06:55 +0000 |
commit | d0825bca7fe65beaee391d30da42e937db621564 (patch) | |
tree | 7461c49eb5844ffd1f35d1ba2c8b7584c1620823 /WebCore/platform/graphics/cg/GradientCG.cpp | |
parent | 3db770bd97c5a59b6c7574ca80a39e5a51c1defd (diff) | |
download | external_webkit-d0825bca7fe65beaee391d30da42e937db621564.zip external_webkit-d0825bca7fe65beaee391d30da42e937db621564.tar.gz external_webkit-d0825bca7fe65beaee391d30da42e937db621564.tar.bz2 |
Merge webkit.org at r54127 : Initial merge by git
Change-Id: Ib661abb595522f50ea406f72d3a0ce17f7193c82
Diffstat (limited to 'WebCore/platform/graphics/cg/GradientCG.cpp')
-rw-r--r-- | WebCore/platform/graphics/cg/GradientCG.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/WebCore/platform/graphics/cg/GradientCG.cpp b/WebCore/platform/graphics/cg/GradientCG.cpp index 05a0aad..e9b5de7 100644 --- a/WebCore/platform/graphics/cg/GradientCG.cpp +++ b/WebCore/platform/graphics/cg/GradientCG.cpp @@ -36,10 +36,15 @@ namespace WebCore { void Gradient::platformDestroy() { +#ifdef BUILDING_ON_TIGER CGShadingRelease(m_gradient); +#else + CGGradientRelease(m_gradient); +#endif m_gradient = 0; } +#ifdef BUILDING_ON_TIGER static void gradientCallback(void* info, const CGFloat* in, CGFloat* out) { float r, g, b, a; @@ -69,11 +74,55 @@ CGShadingRef Gradient::platformGradient() return m_gradient; } +#else +CGGradientRef Gradient::platformGradient() +{ + if (m_gradient) + return m_gradient; + + static CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + + sortStopsIfNecessary(); + + const int cReservedStops = 3; + Vector<CGFloat, 4 * cReservedStops> colorComponents; + colorComponents.reserveCapacity(m_stops.size() * 4); // RGBA components per stop + + Vector<CGFloat, cReservedStops> locations; + locations.reserveCapacity(m_stops.size()); + + for (size_t i = 0; i < m_stops.size(); ++i) { + colorComponents.uncheckedAppend(m_stops[i].red); + colorComponents.uncheckedAppend(m_stops[i].green); + colorComponents.uncheckedAppend(m_stops[i].blue); + colorComponents.uncheckedAppend(m_stops[i].alpha); + + locations.uncheckedAppend(m_stops[i].stop); + } + + m_gradient = CGGradientCreateWithColorComponents(colorSpace, colorComponents.data(), locations.data(), m_stops.size()); + + return m_gradient; +} +#endif void Gradient::fill(GraphicsContext* context, const FloatRect& rect) { context->clip(rect); + paint(context); +} + +void Gradient::paint(GraphicsContext* context) +{ +#ifdef BUILDING_ON_TIGER CGContextDrawShading(context->platformContext(), platformGradient()); +#else + CGGradientDrawingOptions extendOptions = kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation; + if (m_radial) + CGContextDrawRadialGradient(context->platformContext(), platformGradient(), m_p0, m_r0, m_p1, m_r1, extendOptions); + else + CGContextDrawLinearGradient(context->platformContext(), platformGradient(), m_p0, m_p1, extendOptions); +#endif } } //namespace |