void CanvasGradient::getColor(float value, float* r, float* g, float* b, float* a) { ASSERT(value >= 0); ASSERT(value <= 1); if (value <= 0) { *r = m_stops.first().red; *g = m_stops.first().green; *b = m_stops.first().blue; *a = m_stops.first().alpha; return; } if (value >= 1) { *r = m_stops.last().red; *g = m_stops.last().green; *b = m_stops.last().blue; *a = m_stops.last().alpha; return; } // Find stop before and stop after and interpolate. int stop = findStop(value); const ColorStop& lastStop = m_stops[stop]; const ColorStop& nextStop = m_stops[stop + 1]; float stopFraction = (value - lastStop.stop) / (nextStop.stop - lastStop.stop); *r = lastStop.red + (nextStop.red - lastStop.red) * stopFraction; *g = lastStop.green + (nextStop.green - lastStop.green) * stopFraction; *b = lastStop.blue + (nextStop.blue - lastStop.blue) * stopFraction; *a = lastStop.alpha + (nextStop.alpha - lastStop.alpha) * stopFraction; }
void Gradient::getColor(float value, float* r, float* g, float* b, float* a) const { ASSERT(value >= 0); ASSERT(value <= 1); if (m_stops.isEmpty()) { *r = 0; *g = 0; *b = 0; *a = 0; return; } if (!m_stopsSorted) { if (m_stops.size()) { //AJB: Original code was calling std::stable_sort. That could call the global new in order to allocate memory. //Replace it with the eastl::merege_sort and give it a allocator if it needs to allocate memory. //+ 5/13/09 CSidhall - Removed dependance on EASTL with a modified internal sort // Precious code: // EA::WebKit::EASTLAllocator allocator; // eastl::merge_sort(m_stops.begin(), m_stops.end(), allocator, compareStops); EA::Internal::merge_sort(m_stops.data(), m_stops.size(), compareStops); //- CS } m_stopsSorted = true; } if (value <= 0 || value <= m_stops.first().stop) { *r = m_stops.first().red; *g = m_stops.first().green; *b = m_stops.first().blue; *a = m_stops.first().alpha; return; } if (value >= 1 || value >= m_stops.last().stop) { *r = m_stops.last().red; *g = m_stops.last().green; *b = m_stops.last().blue; *a = m_stops.last().alpha; return; } // Find stop before and stop after and interpolate. int stop = findStop(value); const ColorStop& lastStop = m_stops[stop]; const ColorStop& nextStop = m_stops[stop + 1]; float stopFraction = (value - lastStop.stop) / (nextStop.stop - lastStop.stop); *r = lastStop.red + (nextStop.red - lastStop.red) * stopFraction; *g = lastStop.green + (nextStop.green - lastStop.green) * stopFraction; *b = lastStop.blue + (nextStop.blue - lastStop.blue) * stopFraction; *a = lastStop.alpha + (nextStop.alpha - lastStop.alpha) * stopFraction; }
void Gradient::getColor(float value, float* r, float* g, float* b, float* a) const { ASSERT(value >= 0); ASSERT(value <= 1); if (m_stops.isEmpty()) { *r = 0; *g = 0; *b = 0; *a = 0; return; } if (!m_stopsSorted) { if (m_stops.size()) std::stable_sort(m_stops.begin(), m_stops.end(), compareStops); m_stopsSorted = true; } if (value <= 0 || value <= m_stops.first().stop) { *r = m_stops.first().red; *g = m_stops.first().green; *b = m_stops.first().blue; *a = m_stops.first().alpha; return; } if (value >= 1 || value >= m_stops.last().stop) { *r = m_stops.last().red; *g = m_stops.last().green; *b = m_stops.last().blue; *a = m_stops.last().alpha; return; } // Find stop before and stop after and interpolate. int stop = findStop(value); const ColorStop& lastStop = m_stops[stop]; const ColorStop& nextStop = m_stops[stop + 1]; float stopFraction = (value - lastStop.stop) / (nextStop.stop - lastStop.stop); *r = lastStop.red + (nextStop.red - lastStop.red) * stopFraction; *g = lastStop.green + (nextStop.green - lastStop.green) * stopFraction; *b = lastStop.blue + (nextStop.blue - lastStop.blue) * stopFraction; *a = lastStop.alpha + (nextStop.alpha - lastStop.alpha) * stopFraction; }