#include "src/text/gpu/SubRunContainer.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkDrawable.h"
#include "include/core/SkFont.h"
#include "include/core/SkMaskFilter.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPath.h"
#include "include/core/SkPathEffect.h"
#include "include/core/SkPoint.h"
#include "include/core/SkRect.h"
#include "include/core/SkScalar.h"
#include "include/core/SkStrokeRec.h"
#include "include/core/SkSurfaceProps.h"
#include "include/core/SkTypes.h"
#include "include/effects/SkDashPathEffect.h"
#include "include/private/base/SkFloatingPoint.h"
#include "include/private/base/SkOnce.h"
#include "include/private/base/SkTArray.h"
#include "include/private/base/SkTLogic.h"
#include "include/private/base/SkTo.h"
#include "src/base/SkZip.h"
#include "src/core/SkDevice.h"
#include "src/core/SkDistanceFieldGen.h"
#include "src/core/SkEnumerate.h"
#include "src/core/SkFontPriv.h"
#include "src/core/SkGlyph.h"
#include "src/core/SkMask.h"
#include "src/core/SkMaskFilterBase.h"
#include "src/core/SkMatrixPriv.h"
#include "src/core/SkReadBuffer.h"
#include "src/core/SkScalerContext.h"
#include "src/core/SkStrike.h"
#include "src/core/SkStrikeCache.h"
#include "src/core/SkStrikeSpec.h"
#include "src/core/SkWriteBuffer.h"
#include "src/gpu/AtlasTypes.h"
#include "src/text/GlyphRun.h"
#include "src/text/StrikeForGPU.h"
#include "src/text/gpu/Glyph.h"
#include "src/text/gpu/GlyphVector.h"
#include "src/text/gpu/SDFMaskFilter.h"
#include "src/text/gpu/SubRunAllocator.h"
#include "src/text/gpu/SubRunControl.h"
#include "src/text/gpu/VertexFiller.h"
#include <algorithm>
#include <climits>
#include <cstdint>
#include <initializer_list>
#include <new>
#include <optional>
#include <vector>
#if defined(SK_GANESH) || defined(SK_USE_LEGACY_GANESH_TEXT_APIS)
#include "include/core/SkRRect.h"
#include "include/private/SkColorData.h"
#include "include/private/gpu/ganesh/GrTypesPriv.h"
#include "src/core/SkPaintPriv.h"
#include "src/gpu/ganesh/GrClip.h"
#include "src/gpu/ganesh/GrColorInfo.h"
#include "src/gpu/ganesh/GrFragmentProcessor.h"
#include "src/gpu/ganesh/GrPaint.h"
#include "src/gpu/ganesh/SkGr.h"
#include "src/gpu/ganesh/SurfaceDrawContext.h"
#include "src/gpu/ganesh/effects/GrDistanceFieldGeoProc.h"
#include "src/gpu/ganesh/ops/AtlasTextOp.h"
class GrRecordingContext;
AtlasTextOp;
#endif
usingnamespaceskia_private;
usingnamespaceskglyph;
namespace sktext::gpu {
enum SubRun::SubRunStreamTag : int { … };
}
MaskFormat;
usingnamespacesktext;
usingnamespacesktext::gpu;
namespace {
#if defined(SK_GANESH) || defined(SK_USE_LEGACY_GANESH_TEXT_APIS)
SkPMColor4f calculate_colors(skgpu::ganesh::SurfaceDrawContext* sdc,
const SkPaint& paint,
const SkMatrix& matrix,
MaskFormat maskFormat,
GrPaint* grPaint) { … }
SkMatrix position_matrix(const SkMatrix& drawMatrix, SkPoint drawOrigin) { … }
#endif
SkSpan<const SkPackedGlyphID> get_packedIDs(SkZip<const SkPackedGlyphID, const SkPoint> accepted) { … }
SkSpan<const SkGlyphID> get_glyphIDs(SkZip<const SkGlyphID, const SkPoint> accepted) { … }
template <typename U>
SkSpan<const SkPoint> get_positions(SkZip<U, const SkPoint> accepted) { … }
class PathOpSubmitter { … };
int PathOpSubmitter::unflattenSize() const { … }
void PathOpSubmitter::flatten(SkWriteBuffer& buffer) const { … }
std::optional<PathOpSubmitter> PathOpSubmitter::MakeFromBuffer(SkReadBuffer& buffer,
SubRunAllocator* alloc,
const SkStrikeClient* client) { … }
PathOpSubmitter::PathOpSubmitter(
bool isAntiAliased,
SkScalar strikeToSourceScale,
SkSpan<SkPoint> positions,
SkSpan<IDOrPath> idsOrPaths,
SkStrikePromise&& strikePromise)
: … { … }
PathOpSubmitter::~PathOpSubmitter() { … }
PathOpSubmitter PathOpSubmitter::Make(SkZip<const SkGlyphID, const SkPoint> accepted,
bool isAntiAliased,
SkScalar strikeToSourceScale,
SkStrikePromise&& strikePromise,
SubRunAllocator* alloc) { … }
void
PathOpSubmitter::submitDraws(SkCanvas* canvas, SkPoint drawOrigin, const SkPaint& paint) const { … }
class PathSubRun final : public SubRun { … };
int PathSubRun::unflattenSize() const { … }
void PathSubRun::doFlatten(SkWriteBuffer& buffer) const { … }
SubRunOwner PathSubRun::MakeFromBuffer(SkReadBuffer& buffer,
SubRunAllocator* alloc,
const SkStrikeClient* client) { … }
class DrawableOpSubmitter { … };
int DrawableOpSubmitter::unflattenSize() const { … }
void DrawableOpSubmitter::flatten(SkWriteBuffer& buffer) const { … }
std::optional<DrawableOpSubmitter> DrawableOpSubmitter::MakeFromBuffer(
SkReadBuffer& buffer, SubRunAllocator* alloc, const SkStrikeClient* client) { … }
DrawableOpSubmitter::DrawableOpSubmitter(
SkScalar strikeToSourceScale,
SkSpan<SkPoint> positions,
SkSpan<IDOrDrawable> idsOrDrawables,
SkStrikePromise&& strikePromise)
: … { … }
void
DrawableOpSubmitter::submitDraws(SkCanvas* canvas, SkPoint drawOrigin,const SkPaint& paint) const { … }
class DrawableSubRun : public SubRun { … };
int DrawableSubRun::unflattenSize() const { … }
void DrawableSubRun::doFlatten(SkWriteBuffer& buffer) const { … }
SubRunOwner DrawableSubRun::MakeFromBuffer(SkReadBuffer& buffer,
SubRunAllocator* alloc,
const SkStrikeClient* client) { … }
bool DrawableSubRun::canReuse(const SkPaint& paint, const SkMatrix& positionMatrix) const { … }
const AtlasSubRun* DrawableSubRun::testingOnly_atlasSubRun() const { … }
#if defined(SK_GANESH) || defined(SK_USE_LEGACY_GANESH_TEXT_APIS)
enum ClipMethod { … };
std::tuple<ClipMethod, SkIRect>
calculate_clip(const GrClip* clip, SkRect deviceBounds, SkRect glyphBounds) { … }
#endif
class DirectMaskSubRun final : public SubRun, public AtlasSubRun { … };
class TransformedMaskSubRun final : public SubRun, public AtlasSubRun { … };
bool has_some_antialiasing(const SkFont& font ) { … }
#if !defined(SK_DISABLE_SDF_TEXT)
#if defined(SK_GANESH) || defined(SK_USE_LEGACY_GANESH_TEXT_APIS)
static std::tuple<AtlasTextOp::MaskType, uint32_t, bool> calculate_sdf_parameters(
const skgpu::ganesh::SurfaceDrawContext& sdc,
const SkMatrix& drawMatrix,
bool useLCDText,
bool isAntiAliased) { … }
#endif
class SDFTSubRun final : public SubRun, public AtlasSubRun { … };
#endif
template<typename AddSingleMaskFormat>
void add_multi_mask_format(
AddSingleMaskFormat addSingleMaskFormat,
SkZip<const SkPackedGlyphID, const SkPoint, const SkMask::Format> accepted) { … }
}
namespace sktext::gpu {
SubRun::~SubRun() = default;
void SubRun::flatten(SkWriteBuffer& buffer) const { … }
SubRunOwner SubRun::MakeFromBuffer(SkReadBuffer& buffer,
SubRunAllocator* alloc,
const SkStrikeClient* client) { … }
SubRunContainer::SubRunContainer(const SkMatrix& initialPositionMatrix)
: … { … }
void SubRunContainer::flattenAllocSizeHint(SkWriteBuffer& buffer) const { … }
int SubRunContainer::AllocSizeHintFromBuffer(SkReadBuffer& buffer) { … }
void SubRunContainer::flattenRuns(SkWriteBuffer& buffer) const { … }
SubRunContainerOwner SubRunContainer::MakeFromBufferInAlloc(SkReadBuffer& buffer,
const SkStrikeClient* client,
SubRunAllocator* alloc) { … }
size_t SubRunContainer::EstimateAllocSize(const GlyphRunList& glyphRunList) { … }
SkScalar find_maximum_glyph_dimension(StrikeForGPU* strike, SkSpan<const SkGlyphID> glyphs) { … }
#if !defined(SK_DISABLE_SDF_TEXT)
std::tuple<SkZip<const SkPackedGlyphID, const SkPoint>, SkZip<SkGlyphID, SkPoint>, SkRect>
prepare_for_SDFT_drawing(StrikeForGPU* strike,
const SkMatrix& creationMatrix,
SkZip<const SkGlyphID, const SkPoint> source,
SkZip<SkPackedGlyphID, SkPoint> acceptedBuffer,
SkZip<SkGlyphID, SkPoint> rejectedBuffer) { … }
#endif
std::tuple<SkZip<const SkPackedGlyphID, const SkPoint, const SkMask::Format>,
SkZip<SkGlyphID, SkPoint>,
SkRect>
prepare_for_direct_mask_drawing(StrikeForGPU* strike,
const SkMatrix& positionMatrix,
SkZip<const SkGlyphID, const SkPoint> source,
SkZip<SkPackedGlyphID, SkPoint, SkMask::Format> acceptedBuffer,
SkZip<SkGlyphID, SkPoint> rejectedBuffer) { … }
std::tuple<SkZip<const SkPackedGlyphID, const SkPoint, const SkMask::Format>,
SkZip<SkGlyphID, SkPoint>,
SkRect>
prepare_for_mask_drawing(StrikeForGPU* strike,
const SkMatrix& creationMatrix,
SkZip<const SkGlyphID, const SkPoint> source,
SkZip<SkPackedGlyphID, SkPoint, SkMask::Format> acceptedBuffer,
SkZip<SkGlyphID, SkPoint> rejectedBuffer) { … }
std::tuple<SkZip<const SkGlyphID, const SkPoint>, SkZip<SkGlyphID, SkPoint>>
prepare_for_path_drawing(StrikeForGPU* strike,
SkZip<const SkGlyphID, const SkPoint> source,
SkZip<SkGlyphID, SkPoint> acceptedBuffer,
SkZip<SkGlyphID, SkPoint> rejectedBuffer) { … }
std::tuple<SkZip<const SkGlyphID, const SkPoint>, SkZip<SkGlyphID, SkPoint>>
prepare_for_drawable_drawing(StrikeForGPU* strike,
SkZip<const SkGlyphID, const SkPoint> source,
SkZip<SkGlyphID, SkPoint> acceptedBuffer,
SkZip<SkGlyphID, SkPoint> rejectedBuffer) { … }
#if !defined(SK_DISABLE_SDF_TEXT)
static std::tuple<SkStrikeSpec, SkScalar, sktext::gpu::SDFTMatrixRange>
make_sdft_strike_spec(const SkFont& font, const SkPaint& paint,
const SkSurfaceProps& surfaceProps, const SkMatrix& deviceMatrix,
const SkPoint& textLocation, const sktext::gpu::SubRunControl& control) { … }
#endif
SubRunContainerOwner SubRunContainer::MakeInAlloc(
const GlyphRunList& glyphRunList,
const SkMatrix& positionMatrix,
const SkPaint& runPaint,
SkStrikeDeviceInfo strikeDeviceInfo,
StrikeForGPUCacheInterface* strikeCache,
SubRunAllocator* alloc,
SubRunCreationBehavior creationBehavior,
const char* tag) { … }
void SubRunContainer::draw(SkCanvas* canvas,
SkPoint drawOrigin,
const SkPaint& paint,
const SkRefCnt* subRunStorage,
const AtlasDrawDelegate& atlasDelegate) const { … }
bool SubRunContainer::canReuse(const SkPaint& paint, const SkMatrix& positionMatrix) const { … }
SkSpan<SkPoint> MakePointsFromBuffer(SkReadBuffer& buffer, SubRunAllocator* alloc) { … }
}