unsigned Gradient::hash() const { if (m_cachedHash) return m_cachedHash; struct { AffineTransform gradientSpaceTransformation; FloatPoint p0; FloatPoint p1; float r0; float r1; float aspectRatio; int lastStop; GradientSpreadMethod spreadMethod; bool radial; } parameters; // StringHasher requires that the memory it hashes be a multiple of two in size. COMPILE_ASSERT(!(sizeof(parameters) % 2), Gradient_parameters_size_should_be_multiple_of_two); COMPILE_ASSERT(!(sizeof(ColorStop) % 2), Color_stop_size_should_be_multiple_of_two); // Ensure that any padding in the struct is zero-filled, so it will not affect the hash value. memset(¶meters, 0, sizeof(parameters)); parameters.gradientSpaceTransformation = m_gradientSpaceTransformation; parameters.p0 = m_p0; parameters.p1 = m_p1; parameters.r0 = m_r0; parameters.r1 = m_r1; parameters.aspectRatio = m_aspectRatio; parameters.lastStop = m_lastStop; parameters.spreadMethod = m_spreadMethod; parameters.radial = m_radial; unsigned parametersHash = StringHasher::hashMemory(¶meters, sizeof(parameters)); unsigned stopHash = StringHasher::hashMemory(m_stops.data(), m_stops.size() * sizeof(ColorStop)); m_cachedHash = pairIntHash(parametersHash, stopHash); return m_cachedHash; }
static unsigned hash(const FontPlatformDataCacheKey& fontKey) { return pairIntHash(CaseFoldingHash::hash(fontKey.m_family), fontKey.m_fontDescriptionKey.computeHash()); }