/*
* 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