GradientBlackBerry.cpp [plain text]
#include "config.h"
#include "Gradient.h"
#include "AffineTransform.h"
#include "GraphicsContext.h"
#include "GraphicsContext3D.h"
#include "KURL.h"
#include "NotImplemented.h"
#include "TransformationMatrix.h"
#include <BlackBerryPlatformGraphicsContext.h>
#include <stdio.h>
#include <wtf/Assertions.h>
#include <wtf/MathExtras.h>
#include <wtf/Vector.h>
namespace WebCore {
static size_t totalStopsNeeded(const Gradient::ColorStop* stopData, size_t count)
{
const Gradient::ColorStop* stop = stopData;
size_t countUsed = count;
if (count < 1 || stop->stop > 0.0)
countUsed++;
stop += count - 1;
if (count < 1 || stop->stop < 1.0)
countUsed++;
return countUsed;
}
static void fillStops(const Gradient::ColorStop* stopData, size_t count, float* pos, unsigned* colors)
{
const Gradient::ColorStop* stop = stopData;
size_t start = 0;
if (count < 1) {
pos[0] = 0.0;
colors[0] = 0;
start = 1;
} else if (stop->stop > 0.0) {
pos[0] = 0.0;
colors[0] = Color(stop->red, stop->green, stop->blue, stop->alpha).rgb();
start = 1;
}
for (size_t i = start; i < start + count; i++) {
pos[i] = stop->stop;
colors[i] = Color(stop->red, stop->green, stop->blue, stop->alpha).rgb();
++stop;
}
if (count < 1 || (--stop)->stop < 1.0) {
pos[start + count] = 1.0;
colors[start + count] = colors[start + count - 1];
}
}
BlackBerry::Platform::Graphics::Gradient* Gradient::platformGradient()
{
if (m_gradient)
return m_gradient;
if (m_radial)
m_gradient = BlackBerry::Platform::Graphics::Gradient::createRadialGradient(m_p0, m_p1, m_r0, m_r1, m_aspectRatio, (BlackBerry::Platform::Graphics::Gradient::SpreadMethod)m_spreadMethod);
else
m_gradient = BlackBerry::Platform::Graphics::Gradient::createLinearGradient(m_p0, m_p1, (BlackBerry::Platform::Graphics::Gradient::SpreadMethod)m_spreadMethod);
sortStopsIfNecessary();
ASSERT(m_stopsSorted);
size_t countUsed = totalStopsNeeded(m_stops.data(), m_stops.size());
ASSERT(countUsed >= 2);
ASSERT(countUsed >= m_stops.size());
Vector<float> pos(countUsed);
Vector<unsigned> colors(countUsed);
fillStops(m_stops.data(), m_stops.size(), pos.data(), colors.data());
m_gradient->setColorStops(pos.data(), colors.data(), countUsed);
if (!m_gradientSpaceTransformation.isIdentity())
m_gradient->setLocalMatrix(reinterpret_cast<const double*>(&m_gradientSpaceTransformation));
return m_gradient;
}
void Gradient::platformDestroy()
{
delete m_gradient;
m_gradient = 0;
}
void Gradient::fill(GraphicsContext* context, const FloatRect& rect)
{
platformGradient()->fill(context->platformContext(), rect);
}
void Gradient::setPlatformGradientSpaceTransform(const AffineTransform& gradientSpaceTransformation)
{
platformGradient()->setLocalMatrix(reinterpret_cast<const double*>(&gradientSpaceTransformation));
}
}