18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007, 2008 Apple Computer, Inc.  All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Alp Toker <alp@atoker.com>
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Gradient.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSParser.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h"
322bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "PlatformContextCairo.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <cairo.h>
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Gradient::platformDestroy()
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_gradient) {
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cairo_pattern_destroy(m_gradient);
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_gradient = 0;
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectcairo_pattern_t* Gradient::platformGradient()
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_gradient)
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_gradient;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_radial)
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_gradient = cairo_pattern_create_radial(m_p0.x(), m_p0.y(), m_r0, m_p1.x(), m_p1.y(), m_r1);
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_gradient = cairo_pattern_create_linear(m_p0.x(), m_p0.y(), m_p1.x(), m_p1.y());
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<ColorStop>::iterator stopIterator = m_stops.begin();
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (stopIterator != m_stops.end()) {
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cairo_pattern_add_color_stop_rgba(m_gradient, stopIterator->stop, stopIterator->red, stopIterator->green, stopIterator->blue, stopIterator->alpha);
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ++stopIterator;
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    switch (m_spreadMethod) {
628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case SpreadMethodPad:
638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        cairo_pattern_set_extend(m_gradient, CAIRO_EXTEND_PAD);
648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        break;
658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case SpreadMethodReflect:
668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        cairo_pattern_set_extend(m_gradient, CAIRO_EXTEND_REFLECT);
678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        break;
688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case SpreadMethodRepeat:
698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        cairo_pattern_set_extend(m_gradient, CAIRO_EXTEND_REPEAT);
708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        break;
718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    cairo_matrix_t matrix = m_gradientSpaceTransformation;
748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    cairo_matrix_invert(&matrix);
758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    cairo_pattern_set_matrix(m_gradient, &matrix);
768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_gradient;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
80545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid Gradient::setPlatformGradientSpaceTransform(const AffineTransform& gradientSpaceTransformation)
81545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
82545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (m_gradient) {
83545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        cairo_matrix_t matrix = gradientSpaceTransformation;
84545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        cairo_matrix_invert(&matrix);
85545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        cairo_pattern_set_matrix(m_gradient, &matrix);
86545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
87545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
88545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Gradient::fill(GraphicsContext* context, const FloatRect& rect)
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
912bde8e466a4451c7319e3a072d118917957d6554Steve Block    cairo_t* cr = context->platformContext()->cr();
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    context->save();
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cairo_set_source(cr, platformGradient());
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cairo_rectangle(cr, rect.x(), rect.y(), rect.width(), rect.height());
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cairo_fill(cr);
975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    context->restore();
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} //namespace
101