Index: src/core/SkLiteDL.cpp |
diff --git a/src/core/SkLiteDL.cpp b/src/core/SkLiteDL.cpp |
index 0592e7622d8272344bfff1a0d98a7657f38b0307..c634d4825a33a724fa230444fbe7e2466351eeaf 100644 |
--- a/src/core/SkLiteDL.cpp |
+++ b/src/core/SkLiteDL.cpp |
@@ -43,20 +43,6 @@ static D* pod(T* op, size_t offset = 0) { |
return SkTAddOffset<D>(op+1, offset); |
} |
-// Convert images and image-based shaders to textures. |
-static void optimize_for(GrContext* ctx, SkPaint* paint, sk_sp<const SkImage>* image = nullptr) { |
- SkMatrix matrix; |
- SkShader::TileMode xy[2]; |
- if (auto shader = paint->getShader()) |
- if (auto image = shader->isAImage(&matrix, xy)) { // TODO: compose shaders, etc. |
- paint->setShader(image->makeTextureImage(ctx)->makeShader(xy[0], xy[1], &matrix)); |
- } |
- |
- if (image) { |
- *image = (*image)->makeTextureImage(ctx); |
- } |
-} |
- |
// Pre-cache lazy non-threadsafe fields on SkPath and/or SkMatrix. |
static void make_threadsafe(SkPath* path, SkMatrix* matrix) { |
if (path) { path->updateBoundsCache(); } |
@@ -80,10 +66,7 @@ namespace { |
#undef M |
struct Op { |
- // These are never called, only used to distinguish Ops that implement |
- // them from those that don't by return type: the real methods return void. |
- int optimizeFor(GrContext*) { sk_throw(); return 0;} |
- int makeThreadsafe() { sk_throw(); return 0;} |
+ void makeThreadsafe() {} |
uint32_t type : 8; |
uint32_t skip : 24; |
@@ -114,7 +97,6 @@ namespace { |
void draw(SkCanvas* c, const SkMatrix&) { |
c->saveLayer({ maybe_unset(bounds), &paint, backdrop.get(), flags }); |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
}; |
struct Concat final : Op { |
@@ -182,7 +164,6 @@ namespace { |
DrawPaint(const SkPaint& paint) : paint(paint) {} |
SkPaint paint; |
void draw(SkCanvas* c, const SkMatrix&) { c->drawPaint(paint); } |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
}; |
struct DrawPath final : Op { |
static const auto kType = Type::DrawPath; |
@@ -190,7 +171,6 @@ namespace { |
SkPath path; |
SkPaint paint; |
void draw(SkCanvas* c, const SkMatrix&) { c->drawPath(path, paint); } |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
void makeThreadsafe() { make_threadsafe(&path, nullptr); } |
}; |
struct DrawRect final : Op { |
@@ -199,7 +179,6 @@ namespace { |
SkRect rect; |
SkPaint paint; |
void draw(SkCanvas* c, const SkMatrix&) { c->drawRect(rect, paint); } |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
}; |
struct DrawOval final : Op { |
static const auto kType = Type::DrawOval; |
@@ -207,7 +186,6 @@ namespace { |
SkRect oval; |
SkPaint paint; |
void draw(SkCanvas* c, const SkMatrix&) { c->drawOval(oval, paint); } |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
}; |
struct DrawRRect final : Op { |
static const auto kType = Type::DrawRRect; |
@@ -215,7 +193,6 @@ namespace { |
SkRRect rrect; |
SkPaint paint; |
void draw(SkCanvas* c, const SkMatrix&) { c->drawRRect(rrect, paint); } |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
}; |
struct DrawDRRect final : Op { |
static const auto kType = Type::DrawDRRect; |
@@ -224,7 +201,6 @@ namespace { |
SkRRect outer, inner; |
SkPaint paint; |
void draw(SkCanvas* c, const SkMatrix&) { c->drawDRRect(outer, inner, paint); } |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
}; |
struct DrawAnnotation final : Op { |
@@ -267,7 +243,6 @@ namespace { |
void draw(SkCanvas* c, const SkMatrix&) { |
c->drawPicture(picture.get(), &matrix, has_paint ? &paint : nullptr); |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
void makeThreadsafe() { make_threadsafe(nullptr, &matrix); } |
}; |
struct DrawShadowedPicture final : Op { |
@@ -285,7 +260,6 @@ namespace { |
c->drawShadowedPicture(picture.get(), &matrix, &paint); |
#endif |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
void makeThreadsafe() { make_threadsafe(nullptr, &matrix); } |
}; |
@@ -299,7 +273,6 @@ namespace { |
SkScalar x,y; |
SkPaint paint; |
void draw(SkCanvas* c, const SkMatrix&) { c->drawImage(image.get(), x,y, &paint); } |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint, &image); } |
}; |
struct DrawImageNine final : Op { |
static const auto kType = Type::DrawImageNine; |
@@ -315,7 +288,6 @@ namespace { |
void draw(SkCanvas* c, const SkMatrix&) { |
c->drawImageNine(image.get(), center, dst, &paint); |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint, &image); } |
}; |
struct DrawImageRect final : Op { |
static const auto kType = Type::DrawImageRect; |
@@ -332,7 +304,6 @@ namespace { |
void draw(SkCanvas* c, const SkMatrix&) { |
c->drawImageRect(image.get(), src, dst, &paint, constraint); |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint, &image); } |
}; |
struct DrawImageLattice final : Op { |
static const auto kType = Type::DrawImageLattice; |
@@ -350,7 +321,6 @@ namespace { |
ydivs = pod<int>(this, xs*sizeof(int)); |
c->drawImageLattice(image.get(), {xdivs, xs, ydivs, ys}, dst, &paint); |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint, &image); } |
}; |
struct DrawText final : Op { |
@@ -363,7 +333,6 @@ namespace { |
void draw(SkCanvas* c, const SkMatrix&) { |
c->drawText(pod<void>(this), bytes, x,y, paint); |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
}; |
struct DrawPosText final : Op { |
static const auto kType = Type::DrawPosText; |
@@ -377,7 +346,6 @@ namespace { |
auto text = pod<void>(this, n*sizeof(SkPoint)); |
c->drawPosText(text, bytes, points, paint); |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
}; |
struct DrawPosTextH final : Op { |
static const auto kType = Type::DrawPosTextH; |
@@ -392,7 +360,6 @@ namespace { |
auto text = pod<void>(this, n*sizeof(SkScalar)); |
c->drawPosTextH(text, bytes, xs, y, paint); |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
}; |
struct DrawTextOnPath final : Op { |
static const auto kType = Type::DrawTextOnPath; |
@@ -408,7 +375,6 @@ namespace { |
void draw(SkCanvas* c, const SkMatrix&) { |
c->drawTextOnPath(pod<void>(this), bytes, path, &matrix, paint); |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
void makeThreadsafe() { make_threadsafe(&path, &matrix); } |
}; |
struct DrawTextRSXform final : Op { |
@@ -424,7 +390,6 @@ namespace { |
c->drawTextRSXform(pod<void>(this), bytes, pod<SkRSXform>(this, bytes), |
maybe_unset(cull), paint); |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
}; |
struct DrawTextBlob final : Op { |
static const auto kType = Type::DrawTextBlob; |
@@ -436,7 +401,6 @@ namespace { |
void draw(SkCanvas* c, const SkMatrix&) { |
c->drawTextBlob(blob.get(), x,y, paint); |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
}; |
struct DrawPatch final : Op { |
@@ -459,7 +423,6 @@ namespace { |
c->drawPatch(cubics, has_colors ? colors : nullptr, has_texs ? texs : nullptr, |
xfermode.get(), paint); |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
}; |
struct DrawPoints final : Op { |
static const auto kType = Type::DrawPoints; |
@@ -471,7 +434,6 @@ namespace { |
void draw(SkCanvas* c, const SkMatrix&) { |
c->drawPoints(mode, count, pod<SkPoint>(this), paint); |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
}; |
struct DrawVertices final : Op { |
static const auto kType = Type::DrawVertices; |
@@ -510,7 +472,6 @@ namespace { |
c->drawVertices(mode, count, vertices, texs, colors, xfermode.get(), |
indices, nindices, paint); |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
}; |
struct DrawAtlas final : Op { |
static const auto kType = Type::DrawAtlas; |
@@ -535,7 +496,6 @@ namespace { |
c->drawAtlas(atlas.get(), xforms, texs, colors, count, xfermode, |
maybe_unset(cull), &paint); |
} |
- void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint, &atlas); } |
}; |
} |
@@ -742,24 +702,15 @@ void SkLiteDL::drawAtlas(const SkImage* atlas, const SkRSXform xforms[], const S |
colors, colors ? count : 0); |
} |
-typedef void(* draw_fn)(void*, SkCanvas*, const SkMatrix&); |
-typedef void(*grcontext_fn)(void*, GrContext*); |
-typedef void(* void_fn)(void*); |
+typedef void(*draw_fn)(void*, SkCanvas*, const SkMatrix&); |
+typedef void(*void_fn)(void*); |
// All ops implement draw(). |
#define M(T) [](void* op, SkCanvas* c, const SkMatrix& original) { ((T*)op)->draw(c, original); }, |
static const draw_fn draw_fns[] = { TYPES(M) }; |
#undef M |
-// Ops that implement optimizeFor() or makeThreadsafe() return void from those functions; |
-// the (throwing) defaults return int. |
-#define M(T) std::is_void<decltype(((T*)nullptr)->optimizeFor(nullptr))>::value \ |
- ? [](void* op, GrContext* ctx) { ((T*)op)->optimizeFor(ctx); } : (grcontext_fn)nullptr, |
-static const grcontext_fn optimize_for_fns[] = { TYPES(M) }; |
-#undef M |
- |
-#define M(T) std::is_void<decltype(((T*)nullptr)->makeThreadsafe())>::value \ |
- ? [](void* op) { ((T*)op)->makeThreadsafe(); } : (void_fn)nullptr, |
+#define M(T) [](void* op) { ((T*)op)->makeThreadsafe(); }, |
static const void_fn make_threadsafe_fns[] = { TYPES(M) }; |
#undef M |
@@ -775,12 +726,8 @@ static const void_fn make_threadsafe_fns[] = { TYPES(M) }; |
static const void_fn dtor_fns[] = { TYPES(M) }; |
#undef M |
-void SkLiteDL::onDraw(SkCanvas* canvas) { |
- SkMatrix original = canvas->getTotalMatrix(); |
- this->map(draw_fns, canvas, original); |
-} |
-void SkLiteDL::optimizeFor (GrContext* ctx) { this->map(optimize_for_fns, ctx); } |
-void SkLiteDL::makeThreadsafe() { this->map(make_threadsafe_fns); } |
+void SkLiteDL::onDraw(SkCanvas* canvas) { this->map(draw_fns, canvas, canvas->getTotalMatrix()); } |
+void SkLiteDL::makeThreadsafe() { this->map(make_threadsafe_fns); } |
SkRect SkLiteDL::onGetBounds() { |
return fBounds; |