SkShader* Gradient::getShader(SkShader::TileMode mode) { if (NULL == m_gradient) m_gradient = new PlatformGradientRec; else if (mode == m_gradient->m_tileMode) return m_gradient->m_shader; // need to ensure that the m_stops array is sorted. We call getColor() // which, as a side effect, does the sort. // TODO: refactor Gradient.h to formally expose a sort method { float r, g, b, a; this->getColor(0, &r, &g, &b, &a); } SkPoint pts[2] = { m_p0, m_p1 }; // convert to SkPoint const size_t count = m_stops.size(); SkAutoMalloc storage(count * (sizeof(SkColor) + sizeof(SkScalar))); SkColor* colors = (SkColor*)storage.get(); SkScalar* pos = (SkScalar*)(colors + count); Vector<ColorStop>::iterator iter = m_stops.begin(); for (int i = 0; iter != m_stops.end(); i++) { pos[i] = SkFloatToScalar(iter->stop); colors[i] = SkColorSetARGB(F2B(iter->alpha), F2B(iter->red), F2B(iter->green), F2B(iter->blue)); ++iter; } SkShader* s; if (m_radial) s = SkGradientShader::CreateTwoPointRadial(pts[0], SkFloatToScalar(m_r0), pts[1], SkFloatToScalar(m_r1), colors, pos, count, mode); else s = SkGradientShader::CreateLinear(pts, colors, pos, count, mode); if (NULL == s) s = new SkColorShader(0); // zap our previous shader, if present SkSafeUnref(m_gradient->m_shader); m_gradient->m_shader = s; m_gradient->m_tileMode = mode; SkMatrix matrix = m_gradientSpaceTransformation; s->setLocalMatrix(matrix); return s; }
SkShader* Gradient::getShader(SkShader::TileMode mode) { if (NULL == m_gradient) { m_gradient = new PlatformGradientRec; } else if (m_gradient->m_tileMode == mode) { return m_gradient->m_shader; } SkPoint pts[2]; android_setpt(&pts[0], m_p0); android_setpt(&pts[1], m_p1); size_t count = m_stops.size(); SkAutoMalloc storage(count * (sizeof(SkColor) + sizeof(SkScalar))); SkColor* colors = (SkColor*)storage.get(); SkScalar* pos = (SkScalar*)(colors + count); Vector<ColorStop>::iterator iter = m_stops.begin(); int i = -1; while (i++, iter != m_stops.end()) { pos[i] = SkFloatToScalar(iter->stop); colors[i] = SkColorSetARGB(F2B(iter->alpha), F2B(iter->red), F2B(iter->green), F2B(iter->blue)); ++iter; } SkShader* s; if (0 == count) { // it seems the spec says a zero-size gradient draws transparent s = new SkColorShader(0); } else if (m_radial) { s = SkGradientShader::CreateRadial(pts[0], SkFloatToScalar(m_r0), colors, pos, count, mode); } else { s = SkGradientShader::CreateLinear(pts, colors, pos, count, mode); } m_gradient->m_shader->safeUnref(); m_gradient->m_shader = s; m_gradient->m_tileMode = mode; return s; }
C4B(L32A32_FLOAT, RG32_FLOAT, C0, C0, C0, C1, FLOAT, 32_32, T), C4B(L32A32_SINT, RG32_SINT, C0, C0, C0, C1, SINT, 32_32, T), C4B(L32A32_UINT, RG32_UINT, C0, C0, C0, C1, UINT, 32_32, T), F3B(DXT1_RGB, NONE, C0, C1, C2, xx, UNORM, DXT1, T), F3B(DXT1_SRGB, NONE, C0, C1, C2, xx, UNORM, DXT1, T), C4B(DXT1_RGBA, NONE, C0, C1, C2, C3, UNORM, DXT1, T), C4B(DXT1_SRGBA, NONE, C0, C1, C2, C3, UNORM, DXT1, T), C4B(DXT3_RGBA, NONE, C0, C1, C2, C3, UNORM, DXT3, T), C4B(DXT3_SRGBA, NONE, C0, C1, C2, C3, UNORM, DXT3, T), C4B(DXT5_RGBA, NONE, C0, C1, C2, C3, UNORM, DXT5, T), C4B(DXT5_SRGBA, NONE, C0, C1, C2, C3, UNORM, DXT5, T), F1B(RGTC1_UNORM, NONE, C0, xx, xx, xx, UNORM, RGTC1, T), F1B(RGTC1_SNORM, NONE, C0, xx, xx, xx, SNORM, RGTC1, T), F2B(RGTC2_UNORM, NONE, C0, C1, xx, xx, UNORM, RGTC2, T), F2B(RGTC2_SNORM, NONE, C0, C1, xx, xx, SNORM, RGTC2, T), F3B(LATC1_UNORM, NONE, C0, C0, C0, xx, UNORM, RGTC1, T), F3B(LATC1_SNORM, NONE, C0, C0, C0, xx, SNORM, RGTC1, T), C4B(LATC2_UNORM, NONE, C0, C0, C0, C1, UNORM, RGTC2, T), C4B(LATC2_SNORM, NONE, C0, C0, C0, C1, SNORM, RGTC2, T), C4B(BPTC_RGBA_UNORM, NONE, C0, C1, C2, C3, UNORM, BPTC, t), C4B(BPTC_SRGBA, NONE, C0, C1, C2, C3, UNORM, BPTC, t), F3B(BPTC_RGB_FLOAT, NONE, C0, C1, C2, xx, FLOAT, BPTC_FLOAT, t), F3B(BPTC_RGB_UFLOAT, NONE, C0, C1, C2, xx, FLOAT, BPTC_UFLOAT, t), C4A(R32G32B32A32_FLOAT, RGBA32_FLOAT, C0, C1, C2, C3, FLOAT, 32_32_32_32, IBV, 0), C4A(R32G32B32A32_UNORM, NONE, C0, C1, C2, C3, UNORM, 32_32_32_32, TV, 0), C4A(R32G32B32A32_SNORM, NONE, C0, C1, C2, C3, SNORM, 32_32_32_32, TV, 0),
static SkColor makeSkColor(float a, float r, float g, float b) { return SkColorSetARGB(F2B(a), F2B(r), F2B(g), F2B(b)); }