diff options
Diffstat (limited to 'WebCore/platform/graphics')
-rw-r--r-- | WebCore/platform/graphics/android/GradientAndroid.cpp | 15 | ||||
-rw-r--r-- | WebCore/platform/graphics/android/GraphicsContextAndroid.cpp | 75 |
2 files changed, 48 insertions, 42 deletions
diff --git a/WebCore/platform/graphics/android/GradientAndroid.cpp b/WebCore/platform/graphics/android/GradientAndroid.cpp index af7f5ee..71b7f73 100644 --- a/WebCore/platform/graphics/android/GradientAndroid.cpp +++ b/WebCore/platform/graphics/android/GradientAndroid.cpp @@ -39,7 +39,7 @@ class PlatformGradientRec { public: PlatformGradientRec() : m_shader(NULL) {} ~PlatformGradientRec() { m_shader->safeUnref(); } - + SkShader* m_shader; SkShader::TileMode m_tileMode; }; @@ -49,6 +49,7 @@ namespace WebCore { void Gradient::platformDestroy() { delete m_gradient; + m_gradient = 0; } static U8CPU F2B(float x) @@ -64,23 +65,23 @@ SkShader* Gradient::getShader(SkShader::TileMode mode) { } 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), + colors[i] = SkColorSetARGB(F2B(iter->alpha), F2B(iter->red), F2B(iter->green), F2B(iter->blue)); - ++iter; + ++iter; } - + SkShader* s; if (0 == count) { // it seems the spec says a zero-size gradient draws transparent @@ -110,6 +111,6 @@ void Gradient::fill(GraphicsContext* context, const FloatRect& rect) paint.setShader(this->getShader(mode)); android_gc2canvas(context)->drawRect(*android_setrect(&r, rect), paint); } - + } //namespace diff --git a/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp b/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp index 171ed77..c2e0f02 100644 --- a/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp +++ b/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp @@ -297,6 +297,41 @@ private: State& operator=(const State&); }; +static SkShader::TileMode SpreadMethod2TileMode(GradientSpreadMethod sm) { + SkShader::TileMode mode = SkShader::kClamp_TileMode; + + switch (sm) { + case SpreadMethodPad: + mode = SkShader::kClamp_TileMode; + break; + case SpreadMethodReflect: + mode = SkShader::kMirror_TileMode; + break; + case SpreadMethodRepeat: + mode = SkShader::kRepeat_TileMode; + break; + } + return mode; +} + +static void extactShader(SkPaint* paint, ColorSpace cs, Pattern* pat, + Gradient* grad, GradientSpreadMethod sm) { + switch (cs) { + case PatternColorSpace: + // createPlatformPattern() returns a new inst + paint->setShader(pat->createPlatformPattern( + AffineTransform()))->safeUnref(); + break; + case GradientColorSpace: { + // grad->getShader() returns a cached obj + paint->setShader(grad->getShader(SpreadMethod2TileMode(sm))); + break; + } + default: + break; + } +} + //////////////////////////////////////////////////////////////////////////////////////////////// GraphicsContext* GraphicsContext::createOffscreenContext(int width, int height) @@ -628,6 +663,11 @@ void GraphicsContext::fillRect(const FloatRect& rect) android_setrect(&r, rect); m_data->setup_paint_fill(&paint); + + extactShader(&paint, m_common->state.fillColorSpace, + m_common->state.fillPattern.get(), + m_common->state.fillGradient.get(), spreadMethod()); + GC2Canvas(this)->drawRect(r, paint); } @@ -1011,41 +1051,6 @@ void GraphicsContext::drawPath() { this->strokePath(); } -static SkShader::TileMode SpreadMethod2TileMode(GradientSpreadMethod sm) { - SkShader::TileMode mode = SkShader::kClamp_TileMode; - - switch (sm) { - case SpreadMethodPad: - mode = SkShader::kClamp_TileMode; - break; - case SpreadMethodReflect: - mode = SkShader::kMirror_TileMode; - break; - case SpreadMethodRepeat: - mode = SkShader::kRepeat_TileMode; - break; - } - return mode; -} - -void extactShader(SkPaint* paint, ColorSpace cs, Pattern* pat, Gradient* grad, - GradientSpreadMethod sm) { - switch (cs) { - case PatternColorSpace: - // createPlatformPattern() returns a new inst - paint->setShader(pat->createPlatformPattern( - AffineTransform()))->safeUnref(); - break; - case GradientColorSpace: { - // grad->getShader() returns a cached obj - paint->setShader(grad->getShader(SpreadMethod2TileMode(sm))); - break; - } - default: - break; - } -} - void GraphicsContext::fillPath() { SkPath* path = m_data->getPath(); if (paintingDisabled() || !path) |