SkRecord: text blobs
Other text as blobs to follow. https://gold.skia.org/search2?issue=1417703009&unt=true&query=source_type%3Dgm&master=false&include=true BUG=skia: Review URL: https://codereview.chromium.org/1417703009
This commit is contained in:
parent
7f97a76b80
commit
81919d3c67
@ -20,6 +20,7 @@
|
|||||||
#include "SkRemote.h"
|
#include "SkRemote.h"
|
||||||
#include "SkShader.h"
|
#include "SkShader.h"
|
||||||
#include "SkTHash.h"
|
#include "SkTHash.h"
|
||||||
|
#include "SkTextBlob.h"
|
||||||
|
|
||||||
namespace SkRemote {
|
namespace SkRemote {
|
||||||
|
|
||||||
@ -358,6 +359,22 @@ namespace SkRemote {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void onDrawTextBlob(const SkTextBlob* text,
|
||||||
|
SkScalar x,
|
||||||
|
SkScalar y,
|
||||||
|
const SkPaint& paint) override {
|
||||||
|
SkPoint offset{x,y};
|
||||||
|
auto t = this->id(text);
|
||||||
|
auto common = this->commonIDs(paint);
|
||||||
|
|
||||||
|
if (paint.getStyle() == SkPaint::kFill_Style) {
|
||||||
|
fEncoder->fillText(t, offset, common);
|
||||||
|
} else {
|
||||||
|
// TODO: handle kStrokeAndFill_Style
|
||||||
|
fEncoder->strokeText(t, offset, common, this->id(Stroke::CreateFrom(paint)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void onDrawText(const void* text, size_t byteLength,
|
void onDrawText(const void* text, size_t byteLength,
|
||||||
SkScalar x, SkScalar y, const SkPaint& paint) override {
|
SkScalar x, SkScalar y, const SkPaint& paint) override {
|
||||||
// Text-as-paths is a temporary hack.
|
// Text-as-paths is a temporary hack.
|
||||||
@ -432,19 +449,20 @@ namespace SkRemote {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define O override
|
#define O override
|
||||||
ID define(const SkMatrix& v) O {return this->define(Type::kMatrix, &fMatrix, v);}
|
ID define(const SkMatrix& v)O{return this->define(Type::kMatrix, &fMatrix, v);}
|
||||||
ID define(const Misc& v) O {return this->define(Type::kMisc, &fMisc, v);}
|
ID define(const Misc& v)O{return this->define(Type::kMisc, &fMisc, v);}
|
||||||
ID define(const SkPath& v) O {return this->define(Type::kPath, &fPath, v);}
|
ID define(const SkPath& v)O{return this->define(Type::kPath, &fPath, v);}
|
||||||
ID define(const Stroke& v) O {return this->define(Type::kStroke, &fStroke, v);}
|
ID define(const Stroke& v)O{return this->define(Type::kStroke, &fStroke, v);}
|
||||||
ID define(SkPathEffect* v) O {return this->define(Type::kPathEffect, &fPathEffect, v);}
|
ID define(const SkTextBlob* v)O{return this->define(Type::kTextBlob, &fTextBlob, v);}
|
||||||
ID define(SkShader* v) O {return this->define(Type::kShader, &fShader, v);}
|
ID define(SkPathEffect* v)O{return this->define(Type::kPathEffect, &fPathEffect, v);}
|
||||||
ID define(SkXfermode* v) O {return this->define(Type::kXfermode, &fXfermode, v);}
|
ID define(SkShader* v)O{return this->define(Type::kShader, &fShader, v);}
|
||||||
ID define(SkMaskFilter* v) O {return this->define(Type::kMaskFilter, &fMaskFilter, v);}
|
ID define(SkXfermode* v)O{return this->define(Type::kXfermode, &fXfermode, v);}
|
||||||
ID define(SkColorFilter* v) O {return this->define(Type::kColorFilter, &fColorFilter, v);}
|
ID define(SkMaskFilter* v)O{return this->define(Type::kMaskFilter, &fMaskFilter, v);}
|
||||||
ID define(SkRasterizer* v) O {return this->define(Type::kRasterizer, &fRasterizer, v);}
|
ID define(SkColorFilter* v)O{return this->define(Type::kColorFilter, &fColorFilter, v);}
|
||||||
ID define(SkDrawLooper* v) O {return this->define(Type::kDrawLooper, &fDrawLooper, v);}
|
ID define(SkRasterizer* v)O{return this->define(Type::kRasterizer, &fRasterizer, v);}
|
||||||
ID define(SkImageFilter* v) O {return this->define(Type::kImageFilter, &fImageFilter, v);}
|
ID define(SkDrawLooper* v)O{return this->define(Type::kDrawLooper, &fDrawLooper, v);}
|
||||||
ID define(SkAnnotation* v) O {return this->define(Type::kAnnotation, &fAnnotation, v);}
|
ID define(SkImageFilter* v)O{return this->define(Type::kImageFilter, &fImageFilter, v);}
|
||||||
|
ID define(SkAnnotation* v)O{return this->define(Type::kAnnotation, &fAnnotation, v);}
|
||||||
#undef O
|
#undef O
|
||||||
|
|
||||||
|
|
||||||
@ -454,6 +472,7 @@ namespace SkRemote {
|
|||||||
case Type::kMisc: return fMisc .remove(id);
|
case Type::kMisc: return fMisc .remove(id);
|
||||||
case Type::kPath: return fPath .remove(id);
|
case Type::kPath: return fPath .remove(id);
|
||||||
case Type::kStroke: return fStroke .remove(id);
|
case Type::kStroke: return fStroke .remove(id);
|
||||||
|
case Type::kTextBlob: return fTextBlob .remove(id);
|
||||||
case Type::kPathEffect: return fPathEffect .remove(id);
|
case Type::kPathEffect: return fPathEffect .remove(id);
|
||||||
case Type::kShader: return fShader .remove(id);
|
case Type::kShader: return fShader .remove(id);
|
||||||
case Type::kXfermode: return fXfermode .remove(id);
|
case Type::kXfermode: return fXfermode .remove(id);
|
||||||
@ -506,6 +525,18 @@ namespace SkRemote {
|
|||||||
fStroke.find(stroke).applyTo(&paint);
|
fStroke.find(stroke).applyTo(&paint);
|
||||||
fCanvas->drawPath(fPath.find(path), paint);
|
fCanvas->drawPath(fPath.find(path), paint);
|
||||||
}
|
}
|
||||||
|
void fillText(ID text, SkPoint offset, CommonIDs common) override {
|
||||||
|
SkPaint paint;
|
||||||
|
paint.setStyle(SkPaint::kFill_Style);
|
||||||
|
this->applyCommon(common, &paint);
|
||||||
|
fCanvas->drawTextBlob(fTextBlob.find(text), offset.x(), offset.y(), paint);
|
||||||
|
}
|
||||||
|
void strokeText(ID text, SkPoint offset, CommonIDs common, ID stroke) override {
|
||||||
|
SkPaint paint;
|
||||||
|
this->applyCommon(common, &paint);
|
||||||
|
fStroke.find(stroke).applyTo(&paint);
|
||||||
|
fCanvas->drawTextBlob(fTextBlob.find(text), offset.x(), offset.y(), paint);
|
||||||
|
}
|
||||||
|
|
||||||
// Maps ID -> T.
|
// Maps ID -> T.
|
||||||
template <typename T, Type kType>
|
template <typename T, Type kType>
|
||||||
@ -572,19 +603,20 @@ namespace SkRemote {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
IDMap<SkMatrix , Type::kMatrix > fMatrix;
|
IDMap<SkMatrix , Type::kMatrix > fMatrix;
|
||||||
IDMap<Misc , Type::kMisc > fMisc;
|
IDMap<Misc , Type::kMisc > fMisc;
|
||||||
IDMap<SkPath , Type::kPath > fPath;
|
IDMap<SkPath , Type::kPath > fPath;
|
||||||
IDMap<Stroke , Type::kStroke > fStroke;
|
IDMap<Stroke , Type::kStroke > fStroke;
|
||||||
ReffedIDMap<SkPathEffect , Type::kPathEffect > fPathEffect;
|
ReffedIDMap<const SkTextBlob, Type::kTextBlob > fTextBlob;
|
||||||
ReffedIDMap<SkShader , Type::kShader > fShader;
|
ReffedIDMap<SkPathEffect , Type::kPathEffect > fPathEffect;
|
||||||
ReffedIDMap<SkXfermode , Type::kXfermode > fXfermode;
|
ReffedIDMap<SkShader , Type::kShader > fShader;
|
||||||
ReffedIDMap<SkMaskFilter , Type::kMaskFilter > fMaskFilter;
|
ReffedIDMap<SkXfermode , Type::kXfermode > fXfermode;
|
||||||
ReffedIDMap<SkColorFilter, Type::kColorFilter> fColorFilter;
|
ReffedIDMap<SkMaskFilter , Type::kMaskFilter > fMaskFilter;
|
||||||
ReffedIDMap<SkRasterizer , Type::kRasterizer > fRasterizer;
|
ReffedIDMap<SkColorFilter , Type::kColorFilter> fColorFilter;
|
||||||
ReffedIDMap<SkDrawLooper , Type::kDrawLooper > fDrawLooper;
|
ReffedIDMap<SkRasterizer , Type::kRasterizer > fRasterizer;
|
||||||
ReffedIDMap<SkImageFilter, Type::kImageFilter> fImageFilter;
|
ReffedIDMap<SkDrawLooper , Type::kDrawLooper > fDrawLooper;
|
||||||
ReffedIDMap<SkAnnotation , Type::kAnnotation > fAnnotation;
|
ReffedIDMap<SkImageFilter , Type::kImageFilter> fImageFilter;
|
||||||
|
ReffedIDMap<SkAnnotation , Type::kAnnotation > fAnnotation;
|
||||||
|
|
||||||
SkCanvas* fCanvas;
|
SkCanvas* fCanvas;
|
||||||
uint64_t fNextID = 0;
|
uint64_t fNextID = 0;
|
||||||
@ -610,8 +642,9 @@ namespace SkRemote {
|
|||||||
fMatrix .foreach(undef);
|
fMatrix .foreach(undef);
|
||||||
fMisc .foreach(undef);
|
fMisc .foreach(undef);
|
||||||
fPath .foreach(undef);
|
fPath .foreach(undef);
|
||||||
fPathEffect .foreach(undef);
|
|
||||||
fStroke .foreach(undef);
|
fStroke .foreach(undef);
|
||||||
|
fTextBlob .foreach(undef);
|
||||||
|
fPathEffect .foreach(undef);
|
||||||
fShader .foreach(undef);
|
fShader .foreach(undef);
|
||||||
fXfermode .foreach(undef);
|
fXfermode .foreach(undef);
|
||||||
fMaskFilter .foreach(undef);
|
fMaskFilter .foreach(undef);
|
||||||
@ -632,19 +665,20 @@ namespace SkRemote {
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
ID define(const SkMatrix& v) override { return this->define(&fMatrix , v); }
|
ID define(const SkMatrix& v) override { return this->define(&fMatrix , v); }
|
||||||
ID define(const Misc& v) override { return this->define(&fMisc , v); }
|
ID define(const Misc& v) override { return this->define(&fMisc , v); }
|
||||||
ID define(const SkPath& v) override { return this->define(&fPath , v); }
|
ID define(const SkPath& v) override { return this->define(&fPath , v); }
|
||||||
ID define(const Stroke& v) override { return this->define(&fStroke , v); }
|
ID define(const Stroke& v) override { return this->define(&fStroke , v); }
|
||||||
ID define(SkPathEffect* v) override { return this->define(&fPathEffect , v); }
|
ID define(const SkTextBlob* v) override { return this->define(&fTextBlob , v); }
|
||||||
ID define(SkShader* v) override { return this->define(&fShader , v); }
|
ID define(SkPathEffect* v) override { return this->define(&fPathEffect , v); }
|
||||||
ID define(SkXfermode* v) override { return this->define(&fXfermode , v); }
|
ID define(SkShader* v) override { return this->define(&fShader , v); }
|
||||||
ID define(SkMaskFilter* v) override { return this->define(&fMaskFilter , v); }
|
ID define(SkXfermode* v) override { return this->define(&fXfermode , v); }
|
||||||
ID define(SkColorFilter* v) override { return this->define(&fColorFilter, v); }
|
ID define(SkMaskFilter* v) override { return this->define(&fMaskFilter , v); }
|
||||||
ID define(SkRasterizer* v) override { return this->define(&fRasterizer , v); }
|
ID define(SkColorFilter* v) override { return this->define(&fColorFilter, v); }
|
||||||
ID define(SkDrawLooper* v) override { return this->define(&fDrawLooper , v); }
|
ID define(SkRasterizer* v) override { return this->define(&fRasterizer , v); }
|
||||||
ID define(SkImageFilter* v) override { return this->define(&fImageFilter, v); }
|
ID define(SkDrawLooper* v) override { return this->define(&fDrawLooper , v); }
|
||||||
ID define(SkAnnotation* v) override { return this->define(&fAnnotation , v); }
|
ID define(SkImageFilter* v) override { return this->define(&fImageFilter, v); }
|
||||||
|
ID define(SkAnnotation* v) override { return this->define(&fAnnotation , v); }
|
||||||
|
|
||||||
void undefine(ID) override {}
|
void undefine(ID) override {}
|
||||||
|
|
||||||
@ -665,6 +699,12 @@ namespace SkRemote {
|
|||||||
void strokePath(ID path, CommonIDs common, ID stroke) override {
|
void strokePath(ID path, CommonIDs common, ID stroke) override {
|
||||||
fWrapped->strokePath(path, common, stroke);
|
fWrapped->strokePath(path, common, stroke);
|
||||||
}
|
}
|
||||||
|
void fillText(ID text, SkPoint offset, CommonIDs common) override {
|
||||||
|
fWrapped->fillText(text, offset, common);
|
||||||
|
}
|
||||||
|
void strokeText(ID text, SkPoint offset, CommonIDs common, ID stroke) override {
|
||||||
|
fWrapped->strokeText(text, offset, common, stroke);
|
||||||
|
}
|
||||||
|
|
||||||
// Maps const T* -> ID, and refs the key.
|
// Maps const T* -> ID, and refs the key.
|
||||||
template <typename T, Type kType>
|
template <typename T, Type kType>
|
||||||
@ -695,19 +735,20 @@ namespace SkRemote {
|
|||||||
SkTHashMap<const T*, ID> fMap;
|
SkTHashMap<const T*, ID> fMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
SkTHashMap<SkMatrix, ID> fMatrix;
|
SkTHashMap<SkMatrix, ID> fMatrix;
|
||||||
SkTHashMap<Misc, ID, MiscHash> fMisc;
|
SkTHashMap<Misc, ID, MiscHash> fMisc;
|
||||||
SkTHashMap<SkPath, ID> fPath;
|
SkTHashMap<SkPath, ID> fPath;
|
||||||
SkTHashMap<Stroke, ID> fStroke;
|
SkTHashMap<Stroke, ID> fStroke;
|
||||||
RefKeyMap<SkPathEffect , Type::kPathEffect > fPathEffect;
|
RefKeyMap<const SkTextBlob, Type::kTextBlob > fTextBlob;
|
||||||
RefKeyMap<SkShader , Type::kShader > fShader;
|
RefKeyMap<SkPathEffect , Type::kPathEffect > fPathEffect;
|
||||||
RefKeyMap<SkXfermode , Type::kXfermode > fXfermode;
|
RefKeyMap<SkShader , Type::kShader > fShader;
|
||||||
RefKeyMap<SkMaskFilter , Type::kMaskFilter > fMaskFilter;
|
RefKeyMap<SkXfermode , Type::kXfermode > fXfermode;
|
||||||
RefKeyMap<SkColorFilter, Type::kColorFilter> fColorFilter;
|
RefKeyMap<SkMaskFilter , Type::kMaskFilter > fMaskFilter;
|
||||||
RefKeyMap<SkRasterizer , Type::kRasterizer > fRasterizer;
|
RefKeyMap<SkColorFilter , Type::kColorFilter> fColorFilter;
|
||||||
RefKeyMap<SkDrawLooper , Type::kDrawLooper > fDrawLooper;
|
RefKeyMap<SkRasterizer , Type::kRasterizer > fRasterizer;
|
||||||
RefKeyMap<SkImageFilter, Type::kImageFilter> fImageFilter;
|
RefKeyMap<SkDrawLooper , Type::kDrawLooper > fDrawLooper;
|
||||||
RefKeyMap<SkAnnotation , Type::kAnnotation > fAnnotation;
|
RefKeyMap<SkImageFilter , Type::kImageFilter> fImageFilter;
|
||||||
|
RefKeyMap<SkAnnotation , Type::kAnnotation > fAnnotation;
|
||||||
|
|
||||||
Encoder* fWrapped;
|
Encoder* fWrapped;
|
||||||
};
|
};
|
||||||
|
@ -17,6 +17,7 @@ class SkCanvas;
|
|||||||
class SkMatrix;
|
class SkMatrix;
|
||||||
class SkPath;
|
class SkPath;
|
||||||
class SkShader;
|
class SkShader;
|
||||||
|
class SkTextBlob;
|
||||||
class SkXfermode;
|
class SkXfermode;
|
||||||
|
|
||||||
// TODO: document
|
// TODO: document
|
||||||
@ -65,19 +66,20 @@ namespace SkRemote {
|
|||||||
struct Encoder {
|
struct Encoder {
|
||||||
virtual ~Encoder() {}
|
virtual ~Encoder() {}
|
||||||
|
|
||||||
virtual ID define(const SkMatrix&) = 0;
|
virtual ID define(const SkMatrix&) = 0;
|
||||||
virtual ID define(const Misc&) = 0;
|
virtual ID define(const Misc&) = 0;
|
||||||
virtual ID define(const SkPath&) = 0;
|
virtual ID define(const SkPath&) = 0;
|
||||||
virtual ID define(const Stroke&) = 0;
|
virtual ID define(const Stroke&) = 0;
|
||||||
virtual ID define(SkPathEffect*) = 0;
|
virtual ID define(const SkTextBlob*) = 0;
|
||||||
virtual ID define(SkShader*) = 0;
|
virtual ID define(SkPathEffect*) = 0;
|
||||||
virtual ID define(SkXfermode*) = 0;
|
virtual ID define(SkShader*) = 0;
|
||||||
virtual ID define(SkMaskFilter*) = 0;
|
virtual ID define(SkXfermode*) = 0;
|
||||||
virtual ID define(SkColorFilter*) = 0;
|
virtual ID define(SkMaskFilter*) = 0;
|
||||||
virtual ID define(SkRasterizer*) = 0;
|
virtual ID define(SkColorFilter*) = 0;
|
||||||
virtual ID define(SkDrawLooper*) = 0;
|
virtual ID define(SkRasterizer*) = 0;
|
||||||
virtual ID define(SkImageFilter*) = 0;
|
virtual ID define(SkDrawLooper*) = 0;
|
||||||
virtual ID define(SkAnnotation*) = 0;
|
virtual ID define(SkImageFilter*) = 0;
|
||||||
|
virtual ID define(SkAnnotation*) = 0;
|
||||||
|
|
||||||
virtual void undefine(ID) = 0;
|
virtual void undefine(ID) = 0;
|
||||||
|
|
||||||
@ -93,9 +95,11 @@ namespace SkRemote {
|
|||||||
|
|
||||||
virtual void setMatrix(ID matrix) = 0;
|
virtual void setMatrix(ID matrix) = 0;
|
||||||
|
|
||||||
virtual void clipPath(ID path, SkRegion::Op, bool aa) = 0;
|
virtual void clipPath(ID path, SkRegion::Op, bool aa) = 0;
|
||||||
virtual void fillPath(ID path, CommonIDs) = 0;
|
virtual void fillPath(ID path, CommonIDs) = 0;
|
||||||
virtual void strokePath(ID path, CommonIDs, ID stroke) = 0;
|
virtual void strokePath(ID path, CommonIDs, ID stroke) = 0;
|
||||||
|
virtual void fillText(ID text, SkPoint, CommonIDs) = 0;
|
||||||
|
virtual void strokeText(ID text, SkPoint, CommonIDs, ID stroke) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// None of these factories take ownership of their arguments.
|
// None of these factories take ownership of their arguments.
|
||||||
|
@ -19,6 +19,7 @@ namespace SkRemote {
|
|||||||
kMisc,
|
kMisc,
|
||||||
kPath,
|
kPath,
|
||||||
kStroke,
|
kStroke,
|
||||||
|
kTextBlob,
|
||||||
kPathEffect,
|
kPathEffect,
|
||||||
kShader,
|
kShader,
|
||||||
kXfermode,
|
kXfermode,
|
||||||
|
Loading…
Reference in New Issue
Block a user