/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrTextContext_DEFINED #define GrTextContext_DEFINED #include "GrDistanceFieldAdjustTable.h" #include "GrGeometryProcessor.h" #include "GrTextTarget.h" #include "SkGlyphRun.h" #if GR_TEST_UTILS #include "GrDrawOpTest.h" #endif class GrDrawOp; class GrTextBlobCache; class SkGlyph; class GrTextBlob; /* * Renders text using some kind of an atlas, ie BitmapText or DistanceField text */ class GrTextContext { public: struct Options { /** * Below this size (in device space) distance field text will not be used. Negative means * use a default value. */ SkScalar fMinDistanceFieldFontSize = -1.f; /** * Above this size (in device space) distance field text will not be used and glyphs will * be rendered from outline as individual paths. Negative means use a default value. */ SkScalar fMaxDistanceFieldFontSize = -1.f; /** Forces all distance field vertices to use 3 components, not just when in perspective. */ bool fDistanceFieldVerticesAlwaysHaveW = false; }; static std::unique_ptr<GrTextContext> Make(const Options& options); void drawGlyphRunList(GrContext*, GrTextTarget*, const GrClip&, const SkMatrix& viewMatrix, const SkSurfaceProps&, const SkGlyphRunList&); std::unique_ptr<GrDrawOp> createOp_TestingOnly(GrContext*, GrTextContext*, GrRenderTargetContext*, const SkPaint&, const SkFont&, const SkMatrix& viewMatrix, const char* text, int x, int y); static void SanitizeOptions(Options* options); static bool CanDrawAsDistanceFields(const SkPaint&, const SkFont&, const SkMatrix& viewMatrix, const SkSurfaceProps& props, bool contextSupportsDistanceFieldText, const Options& options); static void InitDistanceFieldPaint(SkScalar textSize, const SkMatrix& viewMatrix, const Options& options, GrTextBlob* blob, SkPaint* skPaint, SkFont* skFont, SkScalar* textRatio, SkScalerContextFlags* flags); private: GrTextContext(const Options& options); // sets up the descriptor on the blob and returns a detached cache. Client must attach static SkColor ComputeCanonicalColor(const SkPaint&, bool lcd); // Determines if we need to use fake gamma (and contrast boost): static SkScalerContextFlags ComputeScalerContextFlags(const GrColorSpaceInfo&); const GrDistanceFieldAdjustTable* dfAdjustTable() const { return fDistanceAdjustTable.get(); } sk_sp<const GrDistanceFieldAdjustTable> fDistanceAdjustTable; Options fOptions; #if GR_TEST_UTILS static const SkScalerContextFlags kTextBlobOpScalerContextFlags = SkScalerContextFlags::kFakeGammaAndBoostContrast; GR_DRAW_OP_TEST_FRIEND(GrAtlasTextOp); #endif }; #endif // GrTextContext_DEFINED