30 , fSupportBilerpAtlas{recorder->
priv().caps()->supportBilerpFromGlyphAtlas()}
31 , fAtlasConfig{recorder->
priv().caps()->maxTextureSize(),
32 recorder->
priv().caps()->glyphCacheTextureMaximumBytes()} {
47 fAtlases[i] =
nullptr;
56template <
typename INT_TYPE>
64 int rowWritesLeft =
width;
65 const uint8_t*
s = src;
67 while (rowWritesLeft > 0) {
69 for (
int x = 7;
x >= 0 && rowWritesLeft; --
x, --rowWritesLeft) {
70 *
d++ = (mask & (1 <<
x)) ? (INT_TYPE)(~0UL) : 0;
73 dst =
reinterpret_cast<INT_TYPE*
>(
reinterpret_cast<intptr_t
>(dst) + dstRowBytes);
82 const void* src = glyph.
image();
86 if (maskFormat == expectedMaskFormat) {
93 memcpy(dst, src,
width * bbp);
94 src = (
const char*) src + srcRB;
95 dst = (
char*) dst + dstRB;
98 memcpy(dst, src, dstRB *
height);
102 const uint8_t* bits =
reinterpret_cast<const uint8_t*
>(src);
103 switch (expectedMaskFormat) {
104 case MaskFormat::kA8: {
105 uint8_t* bytes =
reinterpret_cast<uint8_t*
>(dst);
109 case MaskFormat::kA565: {
110 uint16_t*
rgb565 =
reinterpret_cast<uint16_t*
>(dst);
118 }
else if (maskFormat == MaskFormat::kA565 &&
119 expectedMaskFormat == MaskFormat::kARGB) {
123 static constexpr SkMasks masks{
124 {0b1111'1000'0000'0000, 11, 5},
125 {0b0000'0111'1110'0000, 5, 6},
126 {0b0000'0000'0001'1111, 0, 5},
131 char* dstRow = (
char*)dst;
135 uint16_t color565 = 0;
136 memcpy(&color565, src, a565Bpp);
138 uint32_t colorRGBA = masks.getRed(color565) |
139 (masks.getGreen(color565) << 8) |
140 (masks.getBlue(color565) << 16) |
142 memcpy(dst, &colorRGBA, argbBpp);
143 src = (
const char*)src + a565Bpp;
144 dst = (
char*)dst + argbBpp;
154 if (MaskFormat::kA565 ==
format &&
159 format = MaskFormat::kARGB;
169#if !defined(SK_DISABLE_SDF_TEXT)
175 if (skGlyph.
image() ==
nullptr) {
181 MaskFormat expectedMaskFormat = this->resolveMaskFormat(glyphFormat);
185 switch (srcPadding) {
189 if (fSupportBilerpAtlas) {
199#if !defined(SK_DISABLE_SDF_TEXT)
213 const int width = skGlyph.
width() + 2*padding;
215 int rowBytes =
width * bytesPerPixel;
216 size_t size =
height * rowBytes;
220 void* dataPtr = storage.
get();
224 dataPtr = (
char*)(dataPtr) + rowBytes + bytesPerPixel;
229 DrawAtlas* atlas = this->getAtlas(expectedMaskFormat);
230 auto errorCode = atlas->addToAtlas(fRecorder,
245 if (fAtlases[i] && !fAtlases[i]->
recordUploads(dc, fRecorder)) {
267 fAtlases[i] =
nullptr;
275 int index = MaskFormatToAtlasIndex(
format);
276 if (fAtlases[index] ==
nullptr) {
285 fAllowMultitexturing,
288 if (!fAtlases[index]) {
299 fAtlases[i]->compact(tokenTracker->nextFlushToken());
312std::tuple<bool, int> GlyphVector::regenerateAtlasForGraphite(
int begin,
321 unsigned int numActiveProxies;
323 atlasManager->getProxies(maskFormat, &numActiveProxies);
325 SkDebugf(
"Could not allocate backing texture for atlas\n");
329 uint64_t currentAtlasGen = atlasManager->atlasGeneration(maskFormat);
333 if (fAtlasGeneration != currentAtlasGen) {
336 fBulkUseUpdater.reset();
342 int glyphsPlacedInAtlas = 0;
344 for (
const Variant& variant :
glyphs) {
345 Glyph* gpuGlyph = variant.glyph;
348 if (!atlasManager->hasGlyph(maskFormat, gpuGlyph)) {
350 auto code = atlasManager->addGlyphToAtlas(skGlyph, gpuGlyph, srcPadding);
351 if (code != DrawAtlas::ErrorCode::kSucceeded) {
352 success = code != DrawAtlas::ErrorCode::kError;
356 atlasManager->addGlyphToBulkAndSetUseToken(
357 &fBulkUseUpdater, maskFormat, gpuGlyph,
358 tokenTracker->nextFlushToken());
359 glyphsPlacedInAtlas++;
363 if (success &&
begin + glyphsPlacedInAtlas ==
SkCount(fGlyphs)) {
366 fAtlasGeneration = atlasManager->atlasGeneration(maskFormat);
369 return {success, glyphsPlacedInAtlas};
375 atlasManager->setUseTokenBulk(fBulkUseUpdater,
376 tokenTracker->nextFlushToken(),
static const uint16_t rgb565[kNumPixels]
#define SK_ABORT(message,...)
@ kRGB_565_SkColorType
pixel with 5 bits red, 6 bits green, 5 bits blue, in 16-bit word
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
#define SK_DistanceFieldInset
static SkColorType colorType(AImageDecoder *decoder, const AImageDecoderHeaderInfo *headerInfo)
SK_API int SkColorTypeBytesPerPixel(SkColorType ct)
static void sk_bzero(void *buffer, size_t size)
constexpr int SkCount(const Container &c)
SkMask::Format maskFormat() const
const void * image() const
void insetSrc(int padding)
PlotLocator plotLocator() const
bool add(const skgpu::AtlasLocator &atlasLocator)
TextAtlasManager * textAtlasManager() const
bool allowMultipleAtlasTextures() const
virtual TextureInfo getDefaultSampledTextureInfo(SkColorType, Mipmapped mipmapped, Protected, Renderable) const =0
const SkSL::ShaderCaps * shaderCaps() const
SkISize plotDimensions(MaskFormat type) const
SkISize atlasDimensions(MaskFormat type) const
void setLastUseToken(const AtlasLocator &atlasLocator, AtlasToken token)
bool hasID(const PlotLocator &plotLocator)
static std::unique_ptr< DrawAtlas > Make(SkColorType ct, size_t bpp, int width, int height, int plotWidth, int plotHeight, AtlasGenerationCounter *generationCounter, AllowMultitexturing allowMultitexturing, PlotEvictionCallback *evictor, std::string_view label)
TokenTracker * tokenTracker()
sktext::gpu::StrikeCache * strikeCache()
AtlasProvider * atlasProvider()
const Caps * caps() const
void setAtlasDimensionsToMinimum_ForTesting()
DrawAtlas::ErrorCode addGlyphToAtlas(const SkGlyph &, sktext::gpu::Glyph *, int srcPadding)
bool recordUploads(DrawContext *dc)
void addGlyphToBulkAndSetUseToken(BulkUsePlotUpdater *, MaskFormat, sktext::gpu::Glyph *, AtlasToken)
TextAtlasManager(Recorder *)
bool hasGlyph(MaskFormat, sktext::gpu::Glyph *)
skgpu::AtlasLocator fAtlasLocator
static skgpu::MaskFormat FormatFromSkGlyph(SkMask::Format format)
const SkPackedGlyphID fPackedID
static const char * begin(const StringSlice &s)
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE auto & d
FlPixelBufferTexturePrivate * priv
uint32_t uint32_t * format
static void get_packed_glyph_image(const SkGlyph &glyph, int dstRB, MaskFormat expectedMaskFormat, void *dst)
static void expand_bits(INT_TYPE *dst, const uint8_t *src, int width, int height, int dstRowBytes, int srcRowBytes)
constexpr int MaskFormatBytesPerPixel(MaskFormat format)
static constexpr SkColorType MaskFormatToColorType(MaskFormat format)
static const int kMaskFormatCount
constexpr int32_t width() const
constexpr int32_t height() const
@ kBW_Format
1bit per pixel mask (e.g. monochrome)