Do vertex color adjustment before atlas calculations
The atlas calculations and the color adjustment are do not interact, and this has to happen no matter how many times the atlas is adjusted. Change-Id: I571ca4bf18b133bea390787e5f58aef6334bdedb Reviewed-on: https://skia-review.googlesource.com/c/skia/+/261543 Commit-Queue: Herb Derby <herb@google.com> Reviewed-by: Brian Osman <brianosman@google.com>
This commit is contained in:
parent
91fd46a0f9
commit
6ca4f31896
@ -110,6 +110,7 @@ public:
|
||||
bool needsTransform() const;
|
||||
|
||||
void updateTranslation(SkVector translation);
|
||||
void updateColor(GrColor newColor);
|
||||
|
||||
// df properties
|
||||
void setUseLCDText(bool useLCDText);
|
||||
@ -281,8 +282,8 @@ bool GrTextBlob::SubRun::hasW() const {
|
||||
|
||||
void GrTextBlob::SubRun::updateTranslation(SkVector translation) {
|
||||
size_t vertexStride = this->vertexStride();
|
||||
for(size_t i = 0; i < fGlyphs.size(); i++) {
|
||||
SkPoint* vertexCursor = reinterpret_cast<SkPoint*>(quadStart(i));
|
||||
for(size_t quad = 0; quad < fGlyphs.size(); quad++) {
|
||||
SkPoint* vertexCursor = reinterpret_cast<SkPoint*>(quadStart(quad));
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
*vertexCursor += translation;
|
||||
vertexCursor = SkTAddOffset<SkPoint>(vertexCursor, vertexStride);
|
||||
@ -290,6 +291,19 @@ void GrTextBlob::SubRun::updateTranslation(SkVector translation) {
|
||||
}
|
||||
}
|
||||
|
||||
void GrTextBlob::SubRun::updateColor(GrColor newColor) {
|
||||
size_t vertexStride = this->vertexStride();
|
||||
size_t colorOffset = this->colorOffset();
|
||||
for(size_t quad = 0; quad < fGlyphs.size(); quad++) {
|
||||
GrColor* colorCursor = SkTAddOffset<GrColor>(quadStart(quad), colorOffset);
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
*colorCursor = newColor;
|
||||
colorCursor = SkTAddOffset<GrColor>(colorCursor, vertexStride);
|
||||
}
|
||||
}
|
||||
this->fColor = newColor;
|
||||
}
|
||||
|
||||
void GrTextBlob::SubRun::setUseLCDText(bool useLCDText) { fFlags.useLCDText = useLCDText; }
|
||||
bool GrTextBlob::SubRun::hasUseLCDText() const { return fFlags.useLCDText; }
|
||||
void GrTextBlob::SubRun::setAntiAliased(bool antiAliased) { fFlags.antiAliased = antiAliased; }
|
||||
@ -786,17 +800,6 @@ void GrTextBlob::processSourceMasks(const SkZip<SkGlyphVariant, SkPoint>& drawab
|
||||
}
|
||||
|
||||
// -- GrTextBlob::VertexRegenerator ----------------------------------------------------------------
|
||||
static void regen_colors(char* vertex, size_t vertexStride, GrColor color) {
|
||||
// This is a bit wonky, but sometimes we have LCD text, in which case we won't have color
|
||||
// vertices, hence vertexStride - sizeof(SkIPoint16)
|
||||
size_t colorOffset = vertexStride - sizeof(SkIPoint16) - sizeof(GrColor);
|
||||
GrColor* vcolor = reinterpret_cast<GrColor*>(vertex + colorOffset);
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
*vcolor = color;
|
||||
vcolor = SkTAddOffset<GrColor>(vcolor, vertexStride);
|
||||
}
|
||||
}
|
||||
|
||||
static void regen_texcoords(char* vertex, size_t vertexStride, const GrGlyph* glyph,
|
||||
bool useDistanceFields) {
|
||||
// This is a bit wonky, but sometimes we have LCD text, in which case we won't have color
|
||||
@ -899,7 +902,9 @@ GrTextBlob::VertexRegenerator::VertexRegenerator(GrResourceProvider* resourcePro
|
||||
// updating our cache of the GrGlyph*s, we drop our ref on the old strike
|
||||
fActions.regenTextureCoordinates = fSubRun->strike()->isAbandoned();
|
||||
fActions.regenStrike = fSubRun->strike()->isAbandoned();
|
||||
fActions.regenColor = kARGB_GrMaskFormat != fSubRun->maskFormat() && fSubRun->color() != color;
|
||||
if (kARGB_GrMaskFormat != fSubRun->maskFormat() && fSubRun->color() != color) {
|
||||
fSubRun->updateColor(color);
|
||||
}
|
||||
if (fDrawTranslation.x() != 0.f || fDrawTranslation.y() != 0.f) {
|
||||
fSubRun->updateTranslation(fDrawTranslation);
|
||||
}
|
||||
@ -966,9 +971,6 @@ bool GrTextBlob::VertexRegenerator::doRegen(GrTextBlob::VertexRegenerator::Resul
|
||||
tokenTracker->nextDrawToken());
|
||||
}
|
||||
|
||||
if (fActions.regenColor) {
|
||||
regen_colors(currVertex, vertexStride, fColor);
|
||||
}
|
||||
if (fActions.regenTextureCoordinates) {
|
||||
regen_texcoords(currVertex, vertexStride, glyph, fSubRun->drawAsDistanceFields());
|
||||
}
|
||||
@ -1000,8 +1002,7 @@ bool GrTextBlob::VertexRegenerator::regenerate(GrTextBlob::VertexRegenerator::Re
|
||||
fActions.regenTextureCoordinates |= fSubRun->atlasGeneration() != currentAtlasGen;
|
||||
|
||||
if (fActions.regenStrike
|
||||
|fActions.regenTextureCoordinates
|
||||
|fActions.regenColor) {
|
||||
|fActions.regenTextureCoordinates) {
|
||||
return this->doRegen(result);
|
||||
} else {
|
||||
auto vertexStride = fSubRun->vertexStride();
|
||||
|
@ -332,10 +332,9 @@ private:
|
||||
GrColor fColor;
|
||||
SkVector fDrawTranslation;
|
||||
struct {
|
||||
bool regenColor:1;
|
||||
bool regenTextureCoordinates:1;
|
||||
bool regenStrike:1;
|
||||
} fActions = {false, false, false};
|
||||
} fActions = {false, false};
|
||||
int fCurrGlyph = 0;
|
||||
bool fBrokenRun = false;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user