Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Friends | List of all members
sktext::gpu::SubRunContainer Class Reference

#include <SubRunContainer.h>

Public Types

enum  SubRunCreationBehavior { kAddSubRuns , kStrikeCalculationsOnly }
 

Public Member Functions

 SubRunContainer (const SkMatrix &initialPositionMatrix)
 
 SubRunContainer ()=delete
 
 SubRunContainer (const SubRunContainer &)=delete
 
SubRunContaineroperator= (const SubRunContainer &)=delete
 
 SubRunContainer (SubRunContainer &&)=delete
 
SubRunContaineroperator= (SubRunContainer &&)=delete
 
void flattenAllocSizeHint (SkWriteBuffer &buffer) const
 
void flattenRuns (SkWriteBuffer &buffer) const
 
void draw (SkCanvas *, SkPoint drawOrigin, const SkPaint &, const SkRefCnt *subRunStorage, const AtlasDrawDelegate &) const
 
const SkMatrixinitialPosition () const
 
bool isEmpty () const
 
bool canReuse (const SkPaint &paint, const SkMatrix &positionMatrix) const
 

Static Public Member Functions

static int AllocSizeHintFromBuffer (SkReadBuffer &buffer)
 
static SubRunContainerOwner MakeFromBufferInAlloc (SkReadBuffer &buffer, const SkStrikeClient *client, SubRunAllocator *alloc)
 
static SubRunContainerOwner MakeInAlloc (const GlyphRunList &glyphRunList, const SkMatrix &positionMatrix, const SkPaint &runPaint, SkStrikeDeviceInfo strikeDeviceInfo, StrikeForGPUCacheInterface *strikeCache, sktext::gpu::SubRunAllocator *alloc, SubRunCreationBehavior creationBehavior, const char *tag)
 
static size_t EstimateAllocSize (const GlyphRunList &glyphRunList)
 

Friends

class TextBlobTools
 

Detailed Description

Definition at line 205 of file SubRunContainer.h.

Member Enumeration Documentation

◆ SubRunCreationBehavior

Enumerator
kAddSubRuns 
kStrikeCalculationsOnly 

Definition at line 224 of file SubRunContainer.h.

Constructor & Destructor Documentation

◆ SubRunContainer() [1/4]

sktext::gpu::SubRunContainer::SubRunContainer ( const SkMatrix initialPositionMatrix)
explicit

Definition at line 1363 of file SubRunContainer.cpp.

1364 : fInitialPositionMatrix{initialPositionMatrix} {}

◆ SubRunContainer() [2/4]

sktext::gpu::SubRunContainer::SubRunContainer ( )
delete

◆ SubRunContainer() [3/4]

sktext::gpu::SubRunContainer::SubRunContainer ( const SubRunContainer )
delete

◆ SubRunContainer() [4/4]

sktext::gpu::SubRunContainer::SubRunContainer ( SubRunContainer &&  )
delete

Member Function Documentation

◆ AllocSizeHintFromBuffer()

int sktext::gpu::SubRunContainer::AllocSizeHintFromBuffer ( SkReadBuffer buffer)
static

Definition at line 1374 of file SubRunContainer.cpp.

1374 {
1375 int subRunsSizeHint = buffer.readInt();
1376
1377 // Since the hint doesn't affect correctness, if it looks fishy just pick a reasonable
1378 // value.
1379 if (subRunsSizeHint < 0 || (1 << 16) < subRunsSizeHint) {
1380 subRunsSizeHint = 128;
1381 }
1382 return subRunsSizeHint;
1383}
static const uint8_t buffer[]

◆ canReuse()

bool sktext::gpu::SubRunContainer::canReuse ( const SkPaint paint,
const SkMatrix positionMatrix 
) const

Definition at line 1985 of file SubRunContainer.cpp.

1985 {
1986 for (const SubRun& subRun : fSubRuns) {
1987 if (!subRun.canReuse(paint, positionMatrix)) {
1988 return false;
1989 }
1990 }
1991 return true;
1992}
const Paint & paint

◆ draw()

void sktext::gpu::SubRunContainer::draw ( SkCanvas canvas,
SkPoint  drawOrigin,
const SkPaint paint,
const SkRefCnt subRunStorage,
const AtlasDrawDelegate atlasDelegate 
) const

Definition at line 1975 of file SubRunContainer.cpp.

1979 {
1980 for (auto& subRun : fSubRuns) {
1981 subRun.draw(canvas, drawOrigin, paint, sk_ref_sp(subRunStorage), atlasDelegate);
1982 }
1983}
sk_sp< T > sk_ref_sp(T *obj)
Definition SkRefCnt.h:381

◆ EstimateAllocSize()

size_t sktext::gpu::SubRunContainer::EstimateAllocSize ( const GlyphRunList glyphRunList)
static

Definition at line 1418 of file SubRunContainer.cpp.

1418 {
1419 // The difference in alignment from the per-glyph data to the SubRun;
1420 constexpr size_t alignDiff = alignof(DirectMaskSubRun) - alignof(SkPoint);
1421 constexpr size_t vertexDataToSubRunPadding = alignDiff > 0 ? alignDiff : 0;
1422 size_t totalGlyphCount = glyphRunList.totalGlyphCount();
1423 // This is optimized for DirectMaskSubRun which is by far the most common case.
1424 return totalGlyphCount * sizeof(SkPoint)
1425 + GlyphVector::GlyphVectorSize(totalGlyphCount)
1426 + glyphRunList.runCount() * (sizeof(DirectMaskSubRun) + vertexDataToSubRunPadding)
1427 + sizeof(SubRunContainer);
1428}
size_t runCount() const
Definition GlyphRun.h:89
size_t totalGlyphCount() const
Definition GlyphRun.h:90
static size_t GlyphVectorSize(size_t count)
Definition GlyphVector.h:72

◆ flattenAllocSizeHint()

void sktext::gpu::SubRunContainer::flattenAllocSizeHint ( SkWriteBuffer buffer) const

Definition at line 1366 of file SubRunContainer.cpp.

1366 {
1367 int unflattenSizeHint = 0;
1368 for (auto& subrun : fSubRuns) {
1369 unflattenSizeHint += subrun.unflattenSize();
1370 }
1371 buffer.writeInt(unflattenSizeHint);
1372}

◆ flattenRuns()

void sktext::gpu::SubRunContainer::flattenRuns ( SkWriteBuffer buffer) const

Definition at line 1385 of file SubRunContainer.cpp.

1385 {
1386 buffer.writeMatrix(fInitialPositionMatrix);
1387 int subRunCount = 0;
1388 for ([[maybe_unused]] auto& subRun : fSubRuns) {
1389 subRunCount += 1;
1390 }
1391 buffer.writeInt(subRunCount);
1392 for (auto& subRun : fSubRuns) {
1393 subRun.flatten(buffer);
1394 }
1395}

◆ initialPosition()

const SkMatrix & sktext::gpu::SubRunContainer::initialPosition ( ) const
inline

Definition at line 241 of file SubRunContainer.h.

241{ return fInitialPositionMatrix; }

◆ isEmpty()

bool sktext::gpu::SubRunContainer::isEmpty ( ) const
inline

Definition at line 242 of file SubRunContainer.h.

242{ return fSubRuns.isEmpty(); }

◆ MakeFromBufferInAlloc()

SubRunContainerOwner sktext::gpu::SubRunContainer::MakeFromBufferInAlloc ( SkReadBuffer buffer,
const SkStrikeClient client,
SubRunAllocator alloc 
)
static

Definition at line 1397 of file SubRunContainer.cpp.

1399 {
1400 SkMatrix positionMatrix;
1401 buffer.readMatrix(&positionMatrix);
1402 if (!buffer.isValid()) { return nullptr; }
1403 SubRunContainerOwner container = alloc->makeUnique<SubRunContainer>(positionMatrix);
1404
1405 int subRunCount = buffer.readInt();
1406 SkASSERT(subRunCount > 0);
1407 if (!buffer.validate(subRunCount > 0)) { return nullptr; }
1408 for (int i = 0; i < subRunCount; ++i) {
1409 auto subRunOwner = SubRun::MakeFromBuffer(buffer, alloc, client);
1410 if (!buffer.validate(subRunOwner != nullptr)) { return nullptr; }
1411 if (subRunOwner != nullptr) {
1412 container->fSubRuns.append(std::move(subRunOwner));
1413 }
1414 }
1415 return container;
1416}
#define SkASSERT(cond)
Definition SkAssert.h:116
std::unique_ptr< T, Destroyer > makeUnique(Args &&... args)
static SubRunOwner MakeFromBuffer(SkReadBuffer &buffer, sktext::gpu::SubRunAllocator *alloc, const SkStrikeClient *client)
std::unique_ptr< SubRunContainer, SubRunAllocator::Destroyer > SubRunContainerOwner

◆ MakeInAlloc()

SubRunContainerOwner sktext::gpu::SubRunContainer::MakeInAlloc ( const GlyphRunList glyphRunList,
const SkMatrix positionMatrix,
const SkPaint runPaint,
SkStrikeDeviceInfo  strikeDeviceInfo,
StrikeForGPUCacheInterface strikeCache,
sktext::gpu::SubRunAllocator alloc,
SubRunCreationBehavior  creationBehavior,
const char *  tag 
)
static

Definition at line 1680 of file SubRunContainer.cpp.

1688 {
1689 SkASSERT(alloc != nullptr);
1690 SkASSERT(strikeDeviceInfo.fSDFTControl != nullptr);
1691
1692 SubRunContainerOwner container = alloc->makeUnique<SubRunContainer>(positionMatrix);
1693 // If there is no SDFT description ignore all SubRuns.
1694 if (strikeDeviceInfo.fSDFTControl == nullptr) {
1695 return container;
1696 }
1697
1698 const SkSurfaceProps deviceProps = strikeDeviceInfo.fSurfaceProps;
1699 const SkScalerContextFlags scalerContextFlags = strikeDeviceInfo.fScalerContextFlags;
1700#if !defined(SK_DISABLE_SDF_TEXT)
1701 const SDFTControl SDFTControl = *strikeDeviceInfo.fSDFTControl;
1702 const SkScalar maxMaskSize = SDFTControl.maxSize();
1703#else
1704 const SkScalar maxMaskSize = 256;
1705#endif
1706
1707 // TODO: hoist the buffer structure to the GlyphRunBuilder. The buffer structure here is
1708 // still begin tuned, and this is expected to be slower until tuned.
1709 const int maxGlyphRunSize = glyphRunList.maxGlyphRunSize();
1710
1711 // Accepted buffers.
1712 STArray<64, SkPackedGlyphID> acceptedPackedGlyphIDs;
1713 STArray<64, SkGlyphID> acceptedGlyphIDs;
1714 STArray<64, SkPoint> acceptedPositions;
1715 STArray<64, SkMask::Format> acceptedFormats;
1716 acceptedPackedGlyphIDs.resize(maxGlyphRunSize);
1717 acceptedGlyphIDs.resize(maxGlyphRunSize);
1718 acceptedPositions.resize(maxGlyphRunSize);
1719 acceptedFormats.resize(maxGlyphRunSize);
1720
1721 // Rejected buffers.
1722 STArray<64, SkGlyphID> rejectedGlyphIDs;
1723 STArray<64, SkPoint> rejectedPositions;
1724 rejectedGlyphIDs.resize(maxGlyphRunSize);
1725 rejectedPositions.resize(maxGlyphRunSize);
1726 const auto rejectedBuffer = SkMakeZip(rejectedGlyphIDs, rejectedPositions);
1727
1728 const SkPoint glyphRunListLocation = glyphRunList.sourceBounds().center();
1729
1730 // Handle all the runs in the glyphRunList
1731 for (auto& glyphRun : glyphRunList) {
1733 const SkFont& runFont = glyphRun.font();
1734
1735 const SkScalar approximateDeviceTextSize =
1736 // Since the positionMatrix has the origin prepended, use the plain
1737 // sourceBounds from above.
1738 SkFontPriv::ApproximateTransformedTextSize(runFont, positionMatrix,
1739 glyphRunListLocation);
1740
1741 // Atlas mask cases - SDFT and direct mask
1742 // Only consider using direct or SDFT drawing if not drawing hairlines and not too big.
1743 if ((runPaint.getStyle() != SkPaint::kStroke_Style || runPaint.getStrokeWidth() != 0) &&
1744 approximateDeviceTextSize < maxMaskSize) {
1745
1746#if !defined(SK_DISABLE_SDF_TEXT)
1747 // SDFT case
1748 if (SDFTControl.isSDFT(approximateDeviceTextSize, runPaint, positionMatrix)) {
1749 // Process SDFT - This should be the .009% case.
1750 const auto& [strikeSpec, strikeToSourceScale, matrixRange] =
1751 make_sdft_strike_spec(
1752 runFont, runPaint, deviceProps, positionMatrix,
1753 glyphRunListLocation, SDFTControl);
1754
1755 if (!SkScalarNearlyZero(strikeToSourceScale)) {
1756 sk_sp<StrikeForGPU> strike = strikeSpec.findOrCreateScopedStrike(strikeCache);
1757
1758 // The creationMatrix needs to scale the strike data when inverted and
1759 // multiplied by the positionMatrix. The final CTM should be:
1760 // [positionMatrix][scale by strikeToSourceScale],
1761 // which should equal the following because of the transform during the vertex
1762 // calculation,
1763 // [positionMatrix][creationMatrix]^-1.
1764 // So, the creation matrix needs to be
1765 // [scale by 1/strikeToSourceScale].
1766 SkMatrix creationMatrix =
1767 SkMatrix::Scale(1.f/strikeToSourceScale, 1.f/strikeToSourceScale);
1768
1769 auto acceptedBuffer = SkMakeZip(acceptedPackedGlyphIDs, acceptedPositions);
1770 auto [accepted, rejected, creationBounds] = prepare_for_SDFT_drawing(
1771 strike.get(), creationMatrix, source, acceptedBuffer, rejectedBuffer);
1772 source = rejected;
1773
1774 if (creationBehavior == kAddSubRuns && !accepted.empty()) {
1775 container->fSubRuns.append(SDFTSubRun::Make(
1776 accepted,
1777 runFont,
1778 strike->strikePromise(),
1779 creationMatrix,
1780 creationBounds,
1781 matrixRange,
1782 alloc));
1783 }
1784 }
1785 }
1786#endif // !defined(SK_DISABLE_SDF_TEXT)
1787
1788 // Direct Mask case
1789 // Handle all the directly mapped mask subruns.
1790 if (!source.empty() && !positionMatrix.hasPerspective()) {
1791 // Process masks including ARGB - this should be the 99.99% case.
1792 // This will handle medium size emoji that are sharing the run with SDFT drawn text.
1793 // If things are too big they will be passed along to the drawing of last resort
1794 // below.
1796 runFont, runPaint, deviceProps, scalerContextFlags, positionMatrix);
1797
1798 sk_sp<StrikeForGPU> strike = strikeSpec.findOrCreateScopedStrike(strikeCache);
1799
1800 auto acceptedBuffer = SkMakeZip(acceptedPackedGlyphIDs,
1801 acceptedPositions,
1802 acceptedFormats);
1803 auto [accepted, rejected, creationBounds] = prepare_for_direct_mask_drawing(
1804 strike.get(), positionMatrix, source, acceptedBuffer, rejectedBuffer);
1805 source = rejected;
1806
1807 if (creationBehavior == kAddSubRuns && !accepted.empty()) {
1808 auto addGlyphsWithSameFormat =
1809 [&, bounds = creationBounds](
1812 container->fSubRuns.append(
1813 DirectMaskSubRun::Make(bounds,
1814 subrun,
1815 container->initialPosition(),
1816 strike->strikePromise(),
1817 format,
1818 alloc));
1819 };
1820 add_multi_mask_format(addGlyphsWithSameFormat, accepted);
1821 }
1822 }
1823 }
1824
1825 // Drawable case
1826 // Handle all the drawable glyphs - usually large or perspective color glyphs.
1827 if (!source.empty()) {
1828 auto [strikeSpec, strikeToSourceScale] =
1829 SkStrikeSpec::MakePath(runFont, runPaint, deviceProps, scalerContextFlags);
1830
1831 if (!SkScalarNearlyZero(strikeToSourceScale)) {
1832 sk_sp<StrikeForGPU> strike = strikeSpec.findOrCreateScopedStrike(strikeCache);
1833
1834 auto acceptedBuffer = SkMakeZip(acceptedGlyphIDs, acceptedPositions);
1835 auto [accepted, rejected] =
1836 prepare_for_drawable_drawing(strike.get(), source, acceptedBuffer, rejectedBuffer);
1837 source = rejected;
1838
1839 if (creationBehavior == kAddSubRuns && !accepted.empty()) {
1840 container->fSubRuns.append(
1841 DrawableSubRun::Make(
1842 accepted,
1843 strikeToSourceScale,
1844 strike->strikePromise(),
1845 alloc));
1846 }
1847 }
1848 }
1849
1850 // Path case
1851 // Handle path subruns. Mainly, large or large perspective glyphs with no color.
1852 if (!source.empty()) {
1853 auto [strikeSpec, strikeToSourceScale] =
1854 SkStrikeSpec::MakePath(runFont, runPaint, deviceProps, scalerContextFlags);
1855
1856 if (!SkScalarNearlyZero(strikeToSourceScale)) {
1857 sk_sp<StrikeForGPU> strike = strikeSpec.findOrCreateScopedStrike(strikeCache);
1858
1859 auto acceptedBuffer = SkMakeZip(acceptedGlyphIDs, acceptedPositions);
1860 auto [accepted, rejected] =
1861 prepare_for_path_drawing(strike.get(), source, acceptedBuffer, rejectedBuffer);
1862 source = rejected;
1863
1864 if (creationBehavior == kAddSubRuns && !accepted.empty()) {
1865 container->fSubRuns.append(
1866 PathSubRun::Make(accepted,
1867 has_some_antialiasing(runFont),
1868 strikeToSourceScale,
1869 strike->strikePromise(),
1870 alloc));
1871 }
1872 }
1873 }
1874
1875 // Drawing of last resort case
1876 // Draw all the rest of the rejected glyphs from above. This scales out of the atlas to
1877 // the screen, so quality will suffer. This mainly handles large color or perspective
1878 // color not handled by Drawables.
1879 if (!source.empty() && !SkScalarNearlyZero(approximateDeviceTextSize)) {
1880 // Creation matrix will be changed below to meet the following criteria:
1881 // * No perspective - the font scaler and the strikes can't handle perspective masks.
1882 // * Fits atlas - creationMatrix will be conditioned so that the maximum glyph
1883 // dimension for this run will be < kMaxBilerpAtlasDimension.
1884 SkMatrix creationMatrix = positionMatrix;
1885
1886 // Condition creationMatrix for perspective.
1887 if (creationMatrix.hasPerspective()) {
1888 // Find a scale factor that reduces pixelation caused by keystoning.
1889 SkPoint center = glyphRunList.sourceBounds().center();
1890 SkScalar maxAreaScale = SkMatrixPriv::DifferentialAreaScale(creationMatrix, center);
1891 SkScalar perspectiveFactor = 1;
1892 if (SkIsFinite(maxAreaScale) && !SkScalarNearlyZero(maxAreaScale)) {
1893 perspectiveFactor = SkScalarSqrt(maxAreaScale);
1894 }
1895
1896 // Masks can not be created in perspective. Create a non-perspective font with a
1897 // scale that will support the perspective keystoning.
1898 creationMatrix = SkMatrix::Scale(perspectiveFactor, perspectiveFactor);
1899 }
1900
1901 // Reduce to make a one pixel border for the bilerp padding.
1902 static const constexpr SkScalar kMaxBilerpAtlasDimension =
1904
1905 // Get the raw glyph IDs to simulate device drawing to figure the maximum device
1906 // dimension.
1907 const SkSpan<const SkGlyphID> glyphs = get_glyphIDs(source);
1908
1909 // maxGlyphDimension always returns an integer even though the return type is SkScalar.
1910 auto maxGlyphDimension = [&](const SkMatrix& m) {
1912 runFont, runPaint, deviceProps, scalerContextFlags, m);
1913 const sk_sp<StrikeForGPU> gaugingStrike =
1914 strikeSpec.findOrCreateScopedStrike(strikeCache);
1915 const SkScalar maxDimension =
1916 find_maximum_glyph_dimension(gaugingStrike.get(), glyphs);
1917 // TODO: There is a problem where a small character (say .) and a large
1918 // character (say M) are in the same run. If the run is scaled to be very
1919 // large, then the M may return 0 because its dimensions are > 65535, but
1920 // the small character produces regular result because its largest dimension
1921 // is < 65535. This will create an improper scale factor causing the M to be
1922 // too large to fit in the atlas. Tracked by skia:13714.
1923 return maxDimension;
1924 };
1925
1926 // Condition the creationMatrix so that glyphs fit in the atlas.
1927 for (SkScalar maxDimension = maxGlyphDimension(creationMatrix);
1928 kMaxBilerpAtlasDimension < maxDimension;
1929 maxDimension = maxGlyphDimension(creationMatrix))
1930 {
1931 // The SkScalerContext has a limit of 65536 maximum dimension.
1932 // reductionFactor will always be < 1 because
1933 // maxDimension > kMaxBilerpAtlasDimension, and because maxDimension will always
1934 // be an integer the reduction factor will always be at most 254 / 255.
1935 SkScalar reductionFactor = kMaxBilerpAtlasDimension / maxDimension;
1936 creationMatrix.postScale(reductionFactor, reductionFactor);
1937 }
1938
1939 // Draw using the creationMatrix.
1941 runFont, runPaint, deviceProps, scalerContextFlags, creationMatrix);
1942
1943 sk_sp<StrikeForGPU> strike = strikeSpec.findOrCreateScopedStrike(strikeCache);
1944
1945 auto acceptedBuffer =
1946 SkMakeZip(acceptedPackedGlyphIDs, acceptedPositions, acceptedFormats);
1947 auto [accepted, rejected, creationBounds] =
1948 prepare_for_mask_drawing(
1949 strike.get(), creationMatrix, source, acceptedBuffer, rejectedBuffer);
1950 source = rejected;
1951
1952 if (creationBehavior == kAddSubRuns && !accepted.empty()) {
1953
1954 auto addGlyphsWithSameFormat =
1955 [&, bounds = creationBounds](
1958 container->fSubRuns.append(
1959 TransformedMaskSubRun::Make(subrun,
1960 container->initialPosition(),
1961 strike->strikePromise(),
1962 creationMatrix,
1963 bounds,
1964 format,
1965 alloc));
1966 };
1967 add_multi_mask_format(addGlyphsWithSameFormat, accepted);
1968 }
1969 }
1970 }
1971
1972 return container;
1973}
uint16_t glyphs[5]
static bool SkIsFinite(T x, Pack... values)
static bool SkScalarNearlyZero(SkScalar x, SkScalar tolerance=SK_ScalarNearlyZero)
Definition SkScalar.h:101
#define SkScalarSqrt(x)
Definition SkScalar.h:42
SkScalerContextFlags
constexpr auto SkMakeZip(Ts &&... ts)
Definition SkZip.h:212
static SkScalar center(float pos0, float pos1)
bool empty() const
Definition SkBitmap.h:210
static SkScalar ApproximateTransformedTextSize(const SkFont &font, const SkMatrix &matrix, const SkPoint &textLocation)
Definition SkFont.cpp:366
static constexpr uint16_t kSkSideTooBigForAtlas
Definition SkGlyph.h:333
static SkScalar DifferentialAreaScale(const SkMatrix &m, const SkPoint &p)
static SkMatrix Scale(SkScalar sx, SkScalar sy)
Definition SkMatrix.h:75
SkMatrix & postScale(SkScalar sx, SkScalar sy, SkScalar px, SkScalar py)
Definition SkMatrix.cpp:360
bool hasPerspective() const
Definition SkMatrix.h:312
Style getStyle() const
Definition SkPaint.h:204
@ kStroke_Style
set to stroke geometry
Definition SkPaint.h:194
SkScalar getStrokeWidth() const
Definition SkPaint.h:300
sk_sp< sktext::StrikeForGPU > findOrCreateScopedStrike(sktext::StrikeForGPUCacheInterface *cache) const
static SkStrikeSpec MakeTransformMask(const SkFont &font, const SkPaint &paint, const SkSurfaceProps &surfaceProps, SkScalerContextFlags scalerContextFlags, const SkMatrix &deviceMatrix)
static SkStrikeSpec MakeMask(const SkFont &font, const SkPaint &paint, const SkSurfaceProps &surfaceProps, SkScalerContextFlags scalerContextFlags, const SkMatrix &deviceMatrix)
static std::tuple< SkStrikeSpec, SkScalar > MakePath(const SkFont &font, const SkPaint &paint, const SkSurfaceProps &surfaceProps, SkScalerContextFlags scalerContextFlags)
Definition SkZip.h:25
T * get() const
Definition SkRefCnt.h:303
void resize(size_t count)
Definition SkTArray.h:418
SkRect sourceBounds() const
Definition GlyphRun.h:115
size_t maxGlyphRunSize() const
Definition GlyphRun.h:97
bool isSDFT(SkScalar approximateDeviceTextSize, const SkPaint &paint, const SkMatrix &matrix) const
SkScalar maxSize() const
Definition SDFTControl.h:54
SkBitmap source
Definition examples.cpp:28
float SkScalar
Definition extension.cpp:12
uint32_t uint32_t * format
Optional< SkRect > bounds
Definition SkRecords.h:189
constexpr SkPoint center() const
Definition SkRect.h:792
const SkSurfaceProps fSurfaceProps
Definition SkDevice.h:80
const SkScalerContextFlags fScalerContextFlags
Definition SkDevice.h:81
const sktext::gpu::SDFTControl *const fSDFTControl
Definition SkDevice.h:83

◆ operator=() [1/2]

SubRunContainer & sktext::gpu::SubRunContainer::operator= ( const SubRunContainer )
delete

◆ operator=() [2/2]

SubRunContainer & sktext::gpu::SubRunContainer::operator= ( SubRunContainer &&  )
delete

Friends And Related Symbol Documentation

◆ TextBlobTools

friend class TextBlobTools
friend

Definition at line 246 of file SubRunContainer.h.


The documentation for this class was generated from the following files: