| Index: src/gpu/GrPathRendering.cpp
|
| diff --git a/src/gpu/GrPathRendering.cpp b/src/gpu/GrPathRendering.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ed9a1e640f6dda64e11805aa13257e08a1c7ed7f
|
| --- /dev/null
|
| +++ b/src/gpu/GrPathRendering.cpp
|
| @@ -0,0 +1,79 @@
|
| +/*
|
| + * Copyright 2014 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "GrPathRendering.h"
|
| +#include "SkDescriptor.h"
|
| +#include "SkGlyph.h"
|
| +#include "SkMatrix.h"
|
| +#include "SkTypeface.h"
|
| +#include "GrPathRange.h"
|
| +
|
| +class GlyphGenerator : public GrPathRange::PathGenerator {
|
| +public:
|
| + GlyphGenerator(const SkTypeface& typeface, const SkDescriptor& desc)
|
| + : fDesc(desc.copy()),
|
| + fScalerContext(typeface.createScalerContext(fDesc)) {
|
| + fFlipMatrix.setScale(1, -1);
|
| + }
|
| +
|
| + virtual ~GlyphGenerator() {
|
| + SkDescriptor::Free(fDesc);
|
| + }
|
| +
|
| + virtual int getNumPaths() {
|
| + return fScalerContext->getGlyphCount();
|
| + }
|
| +
|
| + virtual void generatePath(int glyphID, SkPath* out) {
|
| + SkGlyph skGlyph;
|
| + skGlyph.init(SkGlyph::MakeID(glyphID));
|
| + fScalerContext->getMetrics(&skGlyph);
|
| +
|
| + fScalerContext->getPath(skGlyph, out);
|
| + out->transform(fFlipMatrix); // Load glyphs with the inverted y-direction.
|
| + }
|
| +
|
| + virtual bool isEqualTo(const SkDescriptor& desc) const {
|
| + return fDesc->equals(desc);
|
| + }
|
| +
|
| +private:
|
| + SkDescriptor* const fDesc;
|
| + const SkAutoTDelete<SkScalerContext> fScalerContext;
|
| + SkMatrix fFlipMatrix;
|
| +};
|
| +
|
| +GrPathRange* GrPathRendering::createGlyphs(const SkTypeface* typeface,
|
| + const SkDescriptor* desc,
|
| + const SkStrokeRec& stroke) {
|
| + if (NULL == typeface) {
|
| + typeface = SkTypeface::GetDefaultTypeface();
|
| + SkASSERT(NULL != typeface);
|
| + }
|
| +
|
| + if (desc) {
|
| + SkAutoTUnref<GlyphGenerator> generator(SkNEW_ARGS(GlyphGenerator, (*typeface, *desc)));
|
| + return this->createPathRange(generator, stroke);
|
| + }
|
| +
|
| + SkScalerContextRec rec;
|
| + memset(&rec, 0, sizeof(rec));
|
| + rec.fFontID = typeface->uniqueID();
|
| + rec.fTextSize = SkPaint::kCanonicalTextSizeForPaths;
|
| + rec.fPreScaleX = rec.fPost2x2[0][0] = rec.fPost2x2[1][1] = SK_Scalar1;
|
| + // Don't bake stroke information into the glyphs, we'll let the GPU do the stroking.
|
| +
|
| + SkAutoDescriptor ad(sizeof(rec) + SkDescriptor::ComputeOverhead(1));
|
| + SkDescriptor* genericDesc = ad.getDesc();
|
| +
|
| + genericDesc->init();
|
| + genericDesc->addEntry(kRec_SkDescriptorTag, sizeof(rec), &rec);
|
| + genericDesc->computeChecksum();
|
| +
|
| + SkAutoTUnref<GlyphGenerator> generator(SkNEW_ARGS(GlyphGenerator, (*typeface, *genericDesc)));
|
| + return this->createPathRange(generator, stroke);
|
| +}
|
|
|