summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/graphics')
-rw-r--r--WebCore/platform/graphics/android/GradientAndroid.cpp15
-rw-r--r--WebCore/platform/graphics/android/GraphicsContextAndroid.cpp75
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)