Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(263)

Unified Diff: src/gpu/GrStencilAndCoverTextContext.cpp

Issue 213123014: Revert of Implement text rendering with NVPR (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/GrStencilAndCoverTextContext.h ('k') | src/gpu/SkGpuDevice.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrStencilAndCoverTextContext.cpp
diff --git a/src/gpu/GrStencilAndCoverTextContext.cpp b/src/gpu/GrStencilAndCoverTextContext.cpp
deleted file mode 100644
index 8b9abac466567be41fb664baa72f9d172dc0d0ec..0000000000000000000000000000000000000000
--- a/src/gpu/GrStencilAndCoverTextContext.cpp
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * 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 "GrStencilAndCoverTextContext.h"
-#include "GrDrawTarget.h"
-#include "GrFontScaler.h"
-#include "GrGpu.h"
-#include "GrPath.h"
-#include "GrTextStrike.h"
-#include "GrTextStrike_impl.h"
-#include "SkAutoKern.h"
-#include "SkDraw.h"
-#include "SkGlyphCache.h"
-#include "SkGpuDevice.h"
-#include "SkPath.h"
-
-static const int kBaseSCFontSize = 64;
-static const int kMaxReservedGlyphs = 64;
-
-GrStencilAndCoverTextContext::GrStencilAndCoverTextContext(
- GrContext* context, const SkDeviceProperties& properties)
- : GrTextContext(context, properties)
- , fStroke(SkStrokeRec::kFill_InitStyle) {
-}
-
-GrStencilAndCoverTextContext::~GrStencilAndCoverTextContext() {
-}
-
-void GrStencilAndCoverTextContext::drawText(const GrPaint& paint,
- const SkPaint& skPaint,
- const char text[],
- size_t byteLength,
- SkScalar x, SkScalar y) {
- SkASSERT(byteLength == 0 || text != NULL);
-
- // nothing to draw
- if (text == NULL || byteLength == 0 /*|| fRC->isEmpty()*/) {
- return;
- }
-
- this->init(paint, skPaint, byteLength);
-
-
- SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc();
- SkAutoGlyphCache autoCache(fSkPaint, &fDeviceProperties, NULL);
- SkGlyphCache* cache = autoCache.getCache();
- GrFontScaler* scaler = GetGrFontScaler(cache);
- GrTextStrike* strike =
- fContext->getFontCache()->getStrike(scaler, true);
-
- const char* stop = text + byteLength;
-
- // Measure first if needed.
- if (fSkPaint.getTextAlign() != SkPaint::kLeft_Align) {
- SkFixed stopX = 0;
- SkFixed stopY = 0;
-
- const char* textPtr = text;
- while (textPtr < stop) {
- // don't need x, y here, since all subpixel variants will have the
- // same advance
- const SkGlyph& glyph = glyphCacheProc(cache, &textPtr, 0, 0);
-
- stopX += glyph.fAdvanceX;
- stopY += glyph.fAdvanceY;
- }
- SkASSERT(textPtr == stop);
-
- SkScalar alignX = SkFixedToScalar(stopX) * fTextRatio;
- SkScalar alignY = SkFixedToScalar(stopY) * fTextRatio;
-
- if (fSkPaint.getTextAlign() == SkPaint::kCenter_Align) {
- alignX = SkScalarHalf(alignX);
- alignY = SkScalarHalf(alignY);
- }
-
- x -= alignX;
- y -= alignY;
- }
-
- SkAutoKern autokern;
-
- SkFixed fx = SkScalarToFixed(x) + SK_FixedHalf;
- SkFixed fy = SkScalarToFixed(y) + SK_FixedHalf;
- SkFixed fixedSizeRatio = SkScalarToFixed(fTextRatio);
-
- while (text < stop) {
- const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0);
-
- fx += SkFixedMul_portable(autokern.adjust(glyph), fixedSizeRatio);
-
- if (glyph.fWidth) {
- this->appendGlyph(GrGlyph::Pack(glyph.getGlyphID(),
- glyph.getSubXFixed(),
- glyph.getSubYFixed()),
- SkPoint::Make(SkFixedToScalar(fx),
- SkFixedToScalar(fy)),
- strike,
- scaler);
- }
-
- fx += SkFixedMul_portable(glyph.fAdvanceX, fixedSizeRatio);
- fy += SkFixedMul_portable(glyph.fAdvanceY, fixedSizeRatio);
- }
-
- this->finish();
-}
-
-void GrStencilAndCoverTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPaint,
- const char text[],
- size_t byteLength,
- const SkScalar pos[],
- SkScalar constY,
- int scalarsPerPosition) {
- SkASSERT(byteLength == 0 || text != NULL);
- SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition);
-
- // nothing to draw
- if (text == NULL || byteLength == 0/* || fRC->isEmpty()*/) {
- return;
- }
-
- this->init(paint, skPaint, byteLength);
-
- SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc();
-
- SkAutoGlyphCache autoCache(fSkPaint, &fDeviceProperties, NULL);
- SkGlyphCache* cache = autoCache.getCache();
- GrFontScaler* scaler = GetGrFontScaler(cache);
- GrTextStrike* strike =
- fContext->getFontCache()->getStrike(scaler, true);
-
- const char* stop = text + byteLength;
-
- SkTDArray<const GrPath*> paths;
- SkTDArray<SkMatrix> transforms;
-
- if (SkPaint::kLeft_Align == fSkPaint.getTextAlign()) {
- while (text < stop) {
- // the last 2 parameters are ignored
- const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0);
-
- if (glyph.fWidth) {
- SkScalar x = pos[0];
- SkScalar y = scalarsPerPosition == 1 ? constY : pos[1];
- this->appendGlyph(GrGlyph::Pack(glyph.getGlyphID(),
- glyph.getSubXFixed(),
- glyph.getSubYFixed()),
- SkPoint::Make(x, y),
- strike,
- scaler);
- }
-
- pos += scalarsPerPosition;
- }
- } else {
- int alignShift = SkPaint::kCenter_Align == fSkPaint.getTextAlign() ? 1 : 0;
- while (text < stop) {
- // the last 2 parameters are ignored
- const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0);
-
- if (glyph.fWidth) {
- SkScalar x = pos[0];
- SkScalar y = scalarsPerPosition == 1 ? constY : pos[1];
- x -= SkFixedToScalar((glyph.fAdvanceX >> alignShift));
- y -= SkFixedToScalar((glyph.fAdvanceY >> alignShift));
-
- this->appendGlyph(GrGlyph::Pack(glyph.getGlyphID(),
- glyph.getSubXFixed(),
- glyph.getSubYFixed()),
- SkPoint::Make(x, y),
- strike,
- scaler);
- }
- pos += scalarsPerPosition;
- }
- }
-
- this->finish();
-}
-
-bool GrStencilAndCoverTextContext::canDraw(const SkPaint& paint) {
- return !paint.getRasterizer()
- && !paint.getMaskFilter()
- && (paint.getStyle() == SkPaint::kFill_Style
- || paint.getStrokeWidth() > 0);
-
-}
-
-static bool has_thick_frame(const SkPaint& paint) {
- return paint.getStrokeWidth() > 0 &&
- paint.getStyle() != SkPaint::kFill_Style;
-}
-
-void GrStencilAndCoverTextContext::init(const GrPaint& paint,
- const SkPaint& skPaint,
- size_t textByteLength) {
- GrTextContext::init(paint, skPaint);
- fTextRatio = fSkPaint.getTextSize() / kBaseSCFontSize;
- fSkPaint.setTextSize(SkIntToScalar(kBaseSCFontSize));
- fSkPaint.setLCDRenderText(false);
- fSkPaint.setAutohinted(false);
- fSkPaint.setSubpixelText(true);
- if (has_thick_frame(fSkPaint)) {
- // Compensate the glyphs being scaled up by fTextRatio, by scaling the
- // stroke down.
- fSkPaint.setStrokeWidth(fSkPaint.getStrokeWidth() / fTextRatio);
- }
- fStroke = SkStrokeRec(fSkPaint);
-
- // Make glyph cache produce paths geometry for fill. We will stroke them
- // by passing fStroke to drawPath.
- fSkPaint.setStyle(SkPaint::kFill_Style);
-
- fStateRestore.set(fDrawTarget->drawState());
-
- fDrawTarget->drawState()->setFromPaint(fPaint, fContext->getMatrix(),
- fContext->getRenderTarget());
-
- GR_STATIC_CONST_SAME_STENCIL(kStencilPass,
- kZero_StencilOp,
- kZero_StencilOp,
- kNotEqual_StencilFunc,
- 0xffff,
- 0x0000,
- 0xffff);
-
- *fDrawTarget->drawState()->stencil() = kStencilPass;
-
- size_t reserveAmount;
- switch (skPaint.getTextEncoding()) {
- default:
- SkASSERT(false);
- case SkPaint::kUTF8_TextEncoding:
- reserveAmount = textByteLength;
- break;
- case SkPaint::kUTF16_TextEncoding:
- reserveAmount = textByteLength / 2;
- break;
- case SkPaint::kUTF32_TextEncoding:
- case SkPaint::kGlyphID_TextEncoding:
- reserveAmount = textByteLength / 4;
- break;
- }
- fPaths.setReserve(reserveAmount);
- fTransforms.setReserve(reserveAmount);
-}
-
-inline void GrStencilAndCoverTextContext::appendGlyph(GrGlyph::PackedID glyphID,
- const SkPoint& pos,
- GrTextStrike* strike,
- GrFontScaler* scaler) {
- GrGlyph* glyph = strike->getGlyph(glyphID, scaler);
-
- if (scaler->getGlyphPath(glyph->glyphID(), &fTmpPath)) {
- *fPaths.append() = fContext->createPath(fTmpPath, fStroke);
- SkMatrix* t = fTransforms.append();
- t->setTranslate(pos.fX, pos.fY);
- t->preScale(fTextRatio, fTextRatio);
- }
-}
-
-void GrStencilAndCoverTextContext::finish() {
- if (fPaths.count() > 0) {
- fDrawTarget->drawPaths(static_cast<size_t>(fPaths.count()),
- fPaths.begin(), fTransforms.begin(),
- SkPath::kWinding_FillType, fStroke.getStyle());
- for (int i = 0; i < fPaths.count(); ++i) {
- fPaths[i]->unref();
- }
- if (fPaths.count() > kMaxReservedGlyphs) {
- fPaths.reset();
- fTransforms.reset();
- } else {
- fPaths.rewind();
- fTransforms.rewind();
- }
- }
- fTmpPath.reset();
-
- fDrawTarget->drawState()->stencil()->setDisabled();
- fStateRestore.set(NULL);
- GrTextContext::finish();
-}
-
« no previous file with comments | « src/gpu/GrStencilAndCoverTextContext.h ('k') | src/gpu/SkGpuDevice.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698