Merge pull request #87971 from bruvzg/font_no_image_dup
[TextServer / Font] Do not duplicate images to prevent unnecessary embedding.
This commit is contained in:
commit
eac054f1cc
|
@ -3300,6 +3300,18 @@ void Image::set_pixel(int p_x, int p_y, const Color &p_color) {
|
||||||
_set_color_at_ofs(data.ptrw(), ofs, p_color);
|
_set_color_at_ofs(data.ptrw(), ofs, p_color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const uint8_t *Image::ptr() const {
|
||||||
|
return data.ptr();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *Image::ptrw() {
|
||||||
|
return data.ptrw();
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t Image::data_size() const {
|
||||||
|
return data.size();
|
||||||
|
}
|
||||||
|
|
||||||
void Image::adjust_bcs(float p_brightness, float p_contrast, float p_saturation) {
|
void Image::adjust_bcs(float p_brightness, float p_contrast, float p_saturation) {
|
||||||
ERR_FAIL_COND_MSG(!_can_modify(format), "Cannot adjust_bcs in compressed or custom image formats.");
|
ERR_FAIL_COND_MSG(!_can_modify(format), "Cannot adjust_bcs in compressed or custom image formats.");
|
||||||
|
|
||||||
|
|
|
@ -426,6 +426,10 @@ public:
|
||||||
void set_pixelv(const Point2i &p_point, const Color &p_color);
|
void set_pixelv(const Point2i &p_point, const Color &p_color);
|
||||||
void set_pixel(int p_x, int p_y, const Color &p_color);
|
void set_pixel(int p_x, int p_y, const Color &p_color);
|
||||||
|
|
||||||
|
const uint8_t *ptr() const;
|
||||||
|
uint8_t *ptrw();
|
||||||
|
int64_t data_size() const;
|
||||||
|
|
||||||
void adjust_bcs(float p_brightness, float p_contrast, float p_saturation);
|
void adjust_bcs(float p_brightness, float p_contrast, float p_saturation);
|
||||||
|
|
||||||
void set_as_black();
|
void set_as_black();
|
||||||
|
|
|
@ -807,7 +807,10 @@ _FORCE_INLINE_ TextServerAdvanced::FontTexturePosition TextServerAdvanced::find_
|
||||||
|
|
||||||
ShelfPackTexture *ct = p_data->textures.ptrw();
|
ShelfPackTexture *ct = p_data->textures.ptrw();
|
||||||
for (int32_t i = 0; i < p_data->textures.size(); i++) {
|
for (int32_t i = 0; i < p_data->textures.size(); i++) {
|
||||||
if (p_image_format != ct[i].format) {
|
if (ct[i].image.is_null()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (p_image_format != ct[i].image->get_format()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (mw > ct[i].texture_w || mh > ct[i].texture_h) { // Too big for this texture.
|
if (mw > ct[i].texture_w || mh > ct[i].texture_h) { // Too big for this texture.
|
||||||
|
@ -838,12 +841,11 @@ _FORCE_INLINE_ TextServerAdvanced::FontTexturePosition TextServerAdvanced::find_
|
||||||
}
|
}
|
||||||
|
|
||||||
ShelfPackTexture tex = ShelfPackTexture(texsize, texsize);
|
ShelfPackTexture tex = ShelfPackTexture(texsize, texsize);
|
||||||
tex.format = p_image_format;
|
tex.image = Image::create_empty(texsize, texsize, false, p_image_format);
|
||||||
tex.imgdata.resize(texsize * texsize * p_color_size);
|
|
||||||
{
|
{
|
||||||
// Zero texture.
|
// Zero texture.
|
||||||
uint8_t *w = tex.imgdata.ptrw();
|
uint8_t *w = tex.image->ptrw();
|
||||||
ERR_FAIL_COND_V(texsize * texsize * p_color_size > tex.imgdata.size(), ret);
|
ERR_FAIL_COND_V(texsize * texsize * p_color_size > tex.image->data_size(), ret);
|
||||||
// Initialize the texture to all-white pixels to prevent artifacts when the
|
// Initialize the texture to all-white pixels to prevent artifacts when the
|
||||||
// font is displayed at a non-default scale with filtering enabled.
|
// font is displayed at a non-default scale with filtering enabled.
|
||||||
if (p_color_size == 2) {
|
if (p_color_size == 2) {
|
||||||
|
@ -1020,12 +1022,12 @@ _FORCE_INLINE_ TextServerAdvanced::FontGlyph TextServerAdvanced::rasterize_msdf(
|
||||||
msdfgen::msdfErrorCorrection(image, shape, projection, p_pixel_range, config);
|
msdfgen::msdfErrorCorrection(image, shape, projection, p_pixel_range, config);
|
||||||
|
|
||||||
{
|
{
|
||||||
uint8_t *wr = tex.imgdata.ptrw();
|
uint8_t *wr = tex.image->ptrw();
|
||||||
|
|
||||||
for (int i = 0; i < h; i++) {
|
for (int i = 0; i < h; i++) {
|
||||||
for (int j = 0; j < w; j++) {
|
for (int j = 0; j < w; j++) {
|
||||||
int ofs = ((i + tex_pos.y + p_rect_margin * 2) * tex.texture_w + j + tex_pos.x + p_rect_margin * 2) * 4;
|
int ofs = ((i + tex_pos.y + p_rect_margin * 2) * tex.texture_w + j + tex_pos.x + p_rect_margin * 2) * 4;
|
||||||
ERR_FAIL_COND_V(ofs >= tex.imgdata.size(), FontGlyph());
|
ERR_FAIL_COND_V(ofs >= tex.image->data_size(), FontGlyph());
|
||||||
wr[ofs + 0] = (uint8_t)(CLAMP(image(j, i)[0] * 256.f, 0.f, 255.f));
|
wr[ofs + 0] = (uint8_t)(CLAMP(image(j, i)[0] * 256.f, 0.f, 255.f));
|
||||||
wr[ofs + 1] = (uint8_t)(CLAMP(image(j, i)[1] * 256.f, 0.f, 255.f));
|
wr[ofs + 1] = (uint8_t)(CLAMP(image(j, i)[1] * 256.f, 0.f, 255.f));
|
||||||
wr[ofs + 2] = (uint8_t)(CLAMP(image(j, i)[2] * 256.f, 0.f, 255.f));
|
wr[ofs + 2] = (uint8_t)(CLAMP(image(j, i)[2] * 256.f, 0.f, 255.f));
|
||||||
|
@ -1086,12 +1088,12 @@ _FORCE_INLINE_ TextServerAdvanced::FontGlyph TextServerAdvanced::rasterize_bitma
|
||||||
ShelfPackTexture &tex = p_data->textures.write[tex_pos.index];
|
ShelfPackTexture &tex = p_data->textures.write[tex_pos.index];
|
||||||
|
|
||||||
{
|
{
|
||||||
uint8_t *wr = tex.imgdata.ptrw();
|
uint8_t *wr = tex.image->ptrw();
|
||||||
|
|
||||||
for (int i = 0; i < h; i++) {
|
for (int i = 0; i < h; i++) {
|
||||||
for (int j = 0; j < w; j++) {
|
for (int j = 0; j < w; j++) {
|
||||||
int ofs = ((i + tex_pos.y + p_rect_margin * 2) * tex.texture_w + j + tex_pos.x + p_rect_margin * 2) * color_size;
|
int ofs = ((i + tex_pos.y + p_rect_margin * 2) * tex.texture_w + j + tex_pos.x + p_rect_margin * 2) * color_size;
|
||||||
ERR_FAIL_COND_V(ofs >= tex.imgdata.size(), FontGlyph());
|
ERR_FAIL_COND_V(ofs >= tex.image->data_size(), FontGlyph());
|
||||||
switch (bitmap.pixel_mode) {
|
switch (bitmap.pixel_mode) {
|
||||||
case FT_PIXEL_MODE_MONO: {
|
case FT_PIXEL_MODE_MONO: {
|
||||||
int byte = i * bitmap.pitch + (j >> 3);
|
int byte = i * bitmap.pitch + (j >> 3);
|
||||||
|
@ -2751,16 +2753,15 @@ void TextServerAdvanced::_font_set_texture_image(const RID &p_font_rid, const Ve
|
||||||
|
|
||||||
ShelfPackTexture &tex = fd->cache[size]->textures.write[p_texture_index];
|
ShelfPackTexture &tex = fd->cache[size]->textures.write[p_texture_index];
|
||||||
|
|
||||||
tex.imgdata = p_image->get_data();
|
tex.image = p_image;
|
||||||
tex.texture_w = p_image->get_width();
|
tex.texture_w = p_image->get_width();
|
||||||
tex.texture_h = p_image->get_height();
|
tex.texture_h = p_image->get_height();
|
||||||
tex.format = p_image->get_format();
|
|
||||||
|
|
||||||
Ref<Image> img = Image::create_from_data(tex.texture_w, tex.texture_h, false, tex.format, tex.imgdata);
|
Ref<Image> img = p_image;
|
||||||
if (fd->mipmaps) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
|
img = p_image->duplicate();
|
||||||
img->generate_mipmaps();
|
img->generate_mipmaps();
|
||||||
}
|
}
|
||||||
|
|
||||||
tex.texture = ImageTexture::create_from_image(img);
|
tex.texture = ImageTexture::create_from_image(img);
|
||||||
tex.dirty = false;
|
tex.dirty = false;
|
||||||
}
|
}
|
||||||
|
@ -2775,7 +2776,7 @@ Ref<Image> TextServerAdvanced::_font_get_texture_image(const RID &p_font_rid, co
|
||||||
ERR_FAIL_INDEX_V(p_texture_index, fd->cache[size]->textures.size(), Ref<Image>());
|
ERR_FAIL_INDEX_V(p_texture_index, fd->cache[size]->textures.size(), Ref<Image>());
|
||||||
|
|
||||||
const ShelfPackTexture &tex = fd->cache[size]->textures[p_texture_index];
|
const ShelfPackTexture &tex = fd->cache[size]->textures[p_texture_index];
|
||||||
return Image::create_from_data(tex.texture_w, tex.texture_h, false, tex.format, tex.imgdata);
|
return tex.image;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextServerAdvanced::_font_set_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const PackedInt32Array &p_offsets) {
|
void TextServerAdvanced::_font_set_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const PackedInt32Array &p_offsets) {
|
||||||
|
@ -3144,8 +3145,9 @@ RID TextServerAdvanced::_font_get_glyph_texture_rid(const RID &p_font_rid, const
|
||||||
if (gl[p_glyph | mod].texture_idx != -1) {
|
if (gl[p_glyph | mod].texture_idx != -1) {
|
||||||
if (fd->cache[size]->textures[gl[p_glyph | mod].texture_idx].dirty) {
|
if (fd->cache[size]->textures[gl[p_glyph | mod].texture_idx].dirty) {
|
||||||
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl[p_glyph | mod].texture_idx];
|
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl[p_glyph | mod].texture_idx];
|
||||||
Ref<Image> img = Image::create_from_data(tex.texture_w, tex.texture_h, false, tex.format, tex.imgdata);
|
Ref<Image> img = tex.image;
|
||||||
if (fd->mipmaps) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
|
img = tex.image->duplicate();
|
||||||
img->generate_mipmaps();
|
img->generate_mipmaps();
|
||||||
}
|
}
|
||||||
if (tex.texture.is_null()) {
|
if (tex.texture.is_null()) {
|
||||||
|
@ -3190,8 +3192,9 @@ Size2 TextServerAdvanced::_font_get_glyph_texture_size(const RID &p_font_rid, co
|
||||||
if (gl[p_glyph | mod].texture_idx != -1) {
|
if (gl[p_glyph | mod].texture_idx != -1) {
|
||||||
if (fd->cache[size]->textures[gl[p_glyph | mod].texture_idx].dirty) {
|
if (fd->cache[size]->textures[gl[p_glyph | mod].texture_idx].dirty) {
|
||||||
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl[p_glyph | mod].texture_idx];
|
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl[p_glyph | mod].texture_idx];
|
||||||
Ref<Image> img = Image::create_from_data(tex.texture_w, tex.texture_h, false, tex.format, tex.imgdata);
|
Ref<Image> img = tex.image;
|
||||||
if (fd->mipmaps) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
|
img = tex.image->duplicate();
|
||||||
img->generate_mipmaps();
|
img->generate_mipmaps();
|
||||||
}
|
}
|
||||||
if (tex.texture.is_null()) {
|
if (tex.texture.is_null()) {
|
||||||
|
@ -3583,15 +3586,16 @@ void TextServerAdvanced::_font_draw_glyph(const RID &p_font_rid, const RID &p_ca
|
||||||
if (gl.texture_idx != -1) {
|
if (gl.texture_idx != -1) {
|
||||||
Color modulate = p_color;
|
Color modulate = p_color;
|
||||||
#ifdef MODULE_FREETYPE_ENABLED
|
#ifdef MODULE_FREETYPE_ENABLED
|
||||||
if (fd->cache[size]->face && (fd->cache[size]->textures[gl.texture_idx].format == Image::FORMAT_RGBA8) && !lcd_aa && !fd->msdf) {
|
if (fd->cache[size]->face && fd->cache[size]->textures[gl.texture_idx].image.is_valid() && (fd->cache[size]->textures[gl.texture_idx].image->get_format() == Image::FORMAT_RGBA8) && !lcd_aa && !fd->msdf) {
|
||||||
modulate.r = modulate.g = modulate.b = 1.0;
|
modulate.r = modulate.g = modulate.b = 1.0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (RenderingServer::get_singleton() != nullptr) {
|
if (RenderingServer::get_singleton() != nullptr) {
|
||||||
if (fd->cache[size]->textures[gl.texture_idx].dirty) {
|
if (fd->cache[size]->textures[gl.texture_idx].dirty) {
|
||||||
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl.texture_idx];
|
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl.texture_idx];
|
||||||
Ref<Image> img = Image::create_from_data(tex.texture_w, tex.texture_h, false, tex.format, tex.imgdata);
|
Ref<Image> img = tex.image;
|
||||||
if (fd->mipmaps) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
|
img = tex.image->duplicate();
|
||||||
img->generate_mipmaps();
|
img->generate_mipmaps();
|
||||||
}
|
}
|
||||||
if (tex.texture.is_null()) {
|
if (tex.texture.is_null()) {
|
||||||
|
@ -3693,15 +3697,16 @@ void TextServerAdvanced::_font_draw_glyph_outline(const RID &p_font_rid, const R
|
||||||
if (gl.texture_idx != -1) {
|
if (gl.texture_idx != -1) {
|
||||||
Color modulate = p_color;
|
Color modulate = p_color;
|
||||||
#ifdef MODULE_FREETYPE_ENABLED
|
#ifdef MODULE_FREETYPE_ENABLED
|
||||||
if (fd->cache[size]->face && (fd->cache[size]->textures[gl.texture_idx].format == Image::FORMAT_RGBA8) && !lcd_aa && !fd->msdf) {
|
if (fd->cache[size]->face && fd->cache[size]->textures[gl.texture_idx].image.is_valid() && (fd->cache[size]->textures[gl.texture_idx].image->get_format() == Image::FORMAT_RGBA8) && !lcd_aa && !fd->msdf) {
|
||||||
modulate.r = modulate.g = modulate.b = 1.0;
|
modulate.r = modulate.g = modulate.b = 1.0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (RenderingServer::get_singleton() != nullptr) {
|
if (RenderingServer::get_singleton() != nullptr) {
|
||||||
if (fd->cache[size]->textures[gl.texture_idx].dirty) {
|
if (fd->cache[size]->textures[gl.texture_idx].dirty) {
|
||||||
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl.texture_idx];
|
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl.texture_idx];
|
||||||
Ref<Image> img = Image::create_from_data(tex.texture_w, tex.texture_h, false, tex.format, tex.imgdata);
|
Ref<Image> img = tex.image;
|
||||||
if (fd->mipmaps) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
|
img = tex.image->duplicate();
|
||||||
img->generate_mipmaps();
|
img->generate_mipmaps();
|
||||||
}
|
}
|
||||||
if (tex.texture.is_null()) {
|
if (tex.texture.is_null()) {
|
||||||
|
|
|
@ -206,8 +206,7 @@ class TextServerAdvanced : public TextServerExtension {
|
||||||
int32_t texture_w = 1024;
|
int32_t texture_w = 1024;
|
||||||
int32_t texture_h = 1024;
|
int32_t texture_h = 1024;
|
||||||
|
|
||||||
Image::Format format;
|
Ref<Image> image;
|
||||||
PackedByteArray imgdata;
|
|
||||||
Ref<ImageTexture> texture;
|
Ref<ImageTexture> texture;
|
||||||
bool dirty = true;
|
bool dirty = true;
|
||||||
|
|
||||||
|
|
|
@ -242,7 +242,10 @@ _FORCE_INLINE_ TextServerFallback::FontTexturePosition TextServerFallback::find_
|
||||||
|
|
||||||
ShelfPackTexture *ct = p_data->textures.ptrw();
|
ShelfPackTexture *ct = p_data->textures.ptrw();
|
||||||
for (int32_t i = 0; i < p_data->textures.size(); i++) {
|
for (int32_t i = 0; i < p_data->textures.size(); i++) {
|
||||||
if (p_image_format != ct[i].format) {
|
if (ct[i].image.is_null()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (p_image_format != ct[i].image->get_format()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (mw > ct[i].texture_w || mh > ct[i].texture_h) { // Too big for this texture.
|
if (mw > ct[i].texture_w || mh > ct[i].texture_h) { // Too big for this texture.
|
||||||
|
@ -274,12 +277,11 @@ _FORCE_INLINE_ TextServerFallback::FontTexturePosition TextServerFallback::find_
|
||||||
}
|
}
|
||||||
|
|
||||||
ShelfPackTexture tex = ShelfPackTexture(texsize, texsize);
|
ShelfPackTexture tex = ShelfPackTexture(texsize, texsize);
|
||||||
tex.format = p_image_format;
|
tex.image = Image::create_empty(texsize, texsize, false, p_image_format);
|
||||||
tex.imgdata.resize(texsize * texsize * p_color_size);
|
|
||||||
{
|
{
|
||||||
// Zero texture.
|
// Zero texture.
|
||||||
uint8_t *w = tex.imgdata.ptrw();
|
uint8_t *w = tex.image->ptrw();
|
||||||
ERR_FAIL_COND_V(texsize * texsize * p_color_size > tex.imgdata.size(), ret);
|
ERR_FAIL_COND_V(texsize * texsize * p_color_size > tex.image->data_size(), ret);
|
||||||
// Initialize the texture to all-white pixels to prevent artifacts when the
|
// Initialize the texture to all-white pixels to prevent artifacts when the
|
||||||
// font is displayed at a non-default scale with filtering enabled.
|
// font is displayed at a non-default scale with filtering enabled.
|
||||||
if (p_color_size == 2) {
|
if (p_color_size == 2) {
|
||||||
|
@ -456,12 +458,12 @@ _FORCE_INLINE_ TextServerFallback::FontGlyph TextServerFallback::rasterize_msdf(
|
||||||
msdfgen::msdfErrorCorrection(image, shape, projection, p_pixel_range, config);
|
msdfgen::msdfErrorCorrection(image, shape, projection, p_pixel_range, config);
|
||||||
|
|
||||||
{
|
{
|
||||||
uint8_t *wr = tex.imgdata.ptrw();
|
uint8_t *wr = tex.image->ptrw();
|
||||||
|
|
||||||
for (int i = 0; i < h; i++) {
|
for (int i = 0; i < h; i++) {
|
||||||
for (int j = 0; j < w; j++) {
|
for (int j = 0; j < w; j++) {
|
||||||
int ofs = ((i + tex_pos.y + p_rect_margin * 2) * tex.texture_w + j + tex_pos.x + p_rect_margin * 2) * 4;
|
int ofs = ((i + tex_pos.y + p_rect_margin * 2) * tex.texture_w + j + tex_pos.x + p_rect_margin * 2) * 4;
|
||||||
ERR_FAIL_COND_V(ofs >= tex.imgdata.size(), FontGlyph());
|
ERR_FAIL_COND_V(ofs >= tex.image->data_size(), FontGlyph());
|
||||||
wr[ofs + 0] = (uint8_t)(CLAMP(image(j, i)[0] * 256.f, 0.f, 255.f));
|
wr[ofs + 0] = (uint8_t)(CLAMP(image(j, i)[0] * 256.f, 0.f, 255.f));
|
||||||
wr[ofs + 1] = (uint8_t)(CLAMP(image(j, i)[1] * 256.f, 0.f, 255.f));
|
wr[ofs + 1] = (uint8_t)(CLAMP(image(j, i)[1] * 256.f, 0.f, 255.f));
|
||||||
wr[ofs + 2] = (uint8_t)(CLAMP(image(j, i)[2] * 256.f, 0.f, 255.f));
|
wr[ofs + 2] = (uint8_t)(CLAMP(image(j, i)[2] * 256.f, 0.f, 255.f));
|
||||||
|
@ -521,12 +523,12 @@ _FORCE_INLINE_ TextServerFallback::FontGlyph TextServerFallback::rasterize_bitma
|
||||||
ShelfPackTexture &tex = p_data->textures.write[tex_pos.index];
|
ShelfPackTexture &tex = p_data->textures.write[tex_pos.index];
|
||||||
|
|
||||||
{
|
{
|
||||||
uint8_t *wr = tex.imgdata.ptrw();
|
uint8_t *wr = tex.image->ptrw();
|
||||||
|
|
||||||
for (int i = 0; i < h; i++) {
|
for (int i = 0; i < h; i++) {
|
||||||
for (int j = 0; j < w; j++) {
|
for (int j = 0; j < w; j++) {
|
||||||
int ofs = ((i + tex_pos.y + p_rect_margin * 2) * tex.texture_w + j + tex_pos.x + p_rect_margin * 2) * color_size;
|
int ofs = ((i + tex_pos.y + p_rect_margin * 2) * tex.texture_w + j + tex_pos.x + p_rect_margin * 2) * color_size;
|
||||||
ERR_FAIL_COND_V(ofs >= tex.imgdata.size(), FontGlyph());
|
ERR_FAIL_COND_V(ofs >= tex.image->data_size(), FontGlyph());
|
||||||
switch (bitmap.pixel_mode) {
|
switch (bitmap.pixel_mode) {
|
||||||
case FT_PIXEL_MODE_MONO: {
|
case FT_PIXEL_MODE_MONO: {
|
||||||
int byte = i * bitmap.pitch + (j >> 3);
|
int byte = i * bitmap.pitch + (j >> 3);
|
||||||
|
@ -1745,16 +1747,15 @@ void TextServerFallback::_font_set_texture_image(const RID &p_font_rid, const Ve
|
||||||
|
|
||||||
ShelfPackTexture &tex = fd->cache[size]->textures.write[p_texture_index];
|
ShelfPackTexture &tex = fd->cache[size]->textures.write[p_texture_index];
|
||||||
|
|
||||||
tex.imgdata = p_image->get_data();
|
tex.image = p_image;
|
||||||
tex.texture_w = p_image->get_width();
|
tex.texture_w = p_image->get_width();
|
||||||
tex.texture_h = p_image->get_height();
|
tex.texture_h = p_image->get_height();
|
||||||
tex.format = p_image->get_format();
|
|
||||||
|
|
||||||
Ref<Image> img = Image::create_from_data(tex.texture_w, tex.texture_h, false, tex.format, tex.imgdata);
|
Ref<Image> img = p_image;
|
||||||
if (fd->mipmaps) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
|
img = p_image->duplicate();
|
||||||
img->generate_mipmaps();
|
img->generate_mipmaps();
|
||||||
}
|
}
|
||||||
|
|
||||||
tex.texture = ImageTexture::create_from_image(img);
|
tex.texture = ImageTexture::create_from_image(img);
|
||||||
tex.dirty = false;
|
tex.dirty = false;
|
||||||
}
|
}
|
||||||
|
@ -1769,7 +1770,7 @@ Ref<Image> TextServerFallback::_font_get_texture_image(const RID &p_font_rid, co
|
||||||
ERR_FAIL_INDEX_V(p_texture_index, fd->cache[size]->textures.size(), Ref<Image>());
|
ERR_FAIL_INDEX_V(p_texture_index, fd->cache[size]->textures.size(), Ref<Image>());
|
||||||
|
|
||||||
const ShelfPackTexture &tex = fd->cache[size]->textures[p_texture_index];
|
const ShelfPackTexture &tex = fd->cache[size]->textures[p_texture_index];
|
||||||
return Image::create_from_data(tex.texture_w, tex.texture_h, false, tex.format, tex.imgdata);
|
return tex.image;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextServerFallback::_font_set_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const PackedInt32Array &p_offsets) {
|
void TextServerFallback::_font_set_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const PackedInt32Array &p_offsets) {
|
||||||
|
@ -2124,8 +2125,9 @@ RID TextServerFallback::_font_get_glyph_texture_rid(const RID &p_font_rid, const
|
||||||
if (gl[p_glyph | mod].texture_idx != -1) {
|
if (gl[p_glyph | mod].texture_idx != -1) {
|
||||||
if (fd->cache[size]->textures[gl[p_glyph | mod].texture_idx].dirty) {
|
if (fd->cache[size]->textures[gl[p_glyph | mod].texture_idx].dirty) {
|
||||||
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl[p_glyph | mod].texture_idx];
|
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl[p_glyph | mod].texture_idx];
|
||||||
Ref<Image> img = Image::create_from_data(tex.texture_w, tex.texture_h, false, tex.format, tex.imgdata);
|
Ref<Image> img = tex.image;
|
||||||
if (fd->mipmaps) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
|
img = tex.image->duplicate();
|
||||||
img->generate_mipmaps();
|
img->generate_mipmaps();
|
||||||
}
|
}
|
||||||
if (tex.texture.is_null()) {
|
if (tex.texture.is_null()) {
|
||||||
|
@ -2170,8 +2172,9 @@ Size2 TextServerFallback::_font_get_glyph_texture_size(const RID &p_font_rid, co
|
||||||
if (gl[p_glyph | mod].texture_idx != -1) {
|
if (gl[p_glyph | mod].texture_idx != -1) {
|
||||||
if (fd->cache[size]->textures[gl[p_glyph | mod].texture_idx].dirty) {
|
if (fd->cache[size]->textures[gl[p_glyph | mod].texture_idx].dirty) {
|
||||||
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl[p_glyph | mod].texture_idx];
|
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl[p_glyph | mod].texture_idx];
|
||||||
Ref<Image> img = Image::create_from_data(tex.texture_w, tex.texture_h, false, tex.format, tex.imgdata);
|
Ref<Image> img = tex.image;
|
||||||
if (fd->mipmaps) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
|
img = tex.image->duplicate();
|
||||||
img->generate_mipmaps();
|
img->generate_mipmaps();
|
||||||
}
|
}
|
||||||
if (tex.texture.is_null()) {
|
if (tex.texture.is_null()) {
|
||||||
|
@ -2518,15 +2521,16 @@ void TextServerFallback::_font_draw_glyph(const RID &p_font_rid, const RID &p_ca
|
||||||
if (gl.texture_idx != -1) {
|
if (gl.texture_idx != -1) {
|
||||||
Color modulate = p_color;
|
Color modulate = p_color;
|
||||||
#ifdef MODULE_FREETYPE_ENABLED
|
#ifdef MODULE_FREETYPE_ENABLED
|
||||||
if (fd->cache[size]->face && (fd->cache[size]->textures[gl.texture_idx].format == Image::FORMAT_RGBA8) && !lcd_aa && !fd->msdf) {
|
if (fd->cache[size]->face && fd->cache[size]->textures[gl.texture_idx].image.is_valid() && (fd->cache[size]->textures[gl.texture_idx].image->get_format() == Image::FORMAT_RGBA8) && !lcd_aa && !fd->msdf) {
|
||||||
modulate.r = modulate.g = modulate.b = 1.0;
|
modulate.r = modulate.g = modulate.b = 1.0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (RenderingServer::get_singleton() != nullptr) {
|
if (RenderingServer::get_singleton() != nullptr) {
|
||||||
if (fd->cache[size]->textures[gl.texture_idx].dirty) {
|
if (fd->cache[size]->textures[gl.texture_idx].dirty) {
|
||||||
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl.texture_idx];
|
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl.texture_idx];
|
||||||
Ref<Image> img = Image::create_from_data(tex.texture_w, tex.texture_h, false, tex.format, tex.imgdata);
|
Ref<Image> img = tex.image;
|
||||||
if (fd->mipmaps) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
|
img = tex.image->duplicate();
|
||||||
img->generate_mipmaps();
|
img->generate_mipmaps();
|
||||||
}
|
}
|
||||||
if (tex.texture.is_null()) {
|
if (tex.texture.is_null()) {
|
||||||
|
@ -2628,15 +2632,16 @@ void TextServerFallback::_font_draw_glyph_outline(const RID &p_font_rid, const R
|
||||||
if (gl.texture_idx != -1) {
|
if (gl.texture_idx != -1) {
|
||||||
Color modulate = p_color;
|
Color modulate = p_color;
|
||||||
#ifdef MODULE_FREETYPE_ENABLED
|
#ifdef MODULE_FREETYPE_ENABLED
|
||||||
if (fd->cache[size]->face && (fd->cache[size]->textures[gl.texture_idx].format == Image::FORMAT_RGBA8) && !lcd_aa && !fd->msdf) {
|
if (fd->cache[size]->face && fd->cache[size]->textures[gl.texture_idx].image.is_valid() && (fd->cache[size]->textures[gl.texture_idx].image->get_format() == Image::FORMAT_RGBA8) && !lcd_aa && !fd->msdf) {
|
||||||
modulate.r = modulate.g = modulate.b = 1.0;
|
modulate.r = modulate.g = modulate.b = 1.0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (RenderingServer::get_singleton() != nullptr) {
|
if (RenderingServer::get_singleton() != nullptr) {
|
||||||
if (fd->cache[size]->textures[gl.texture_idx].dirty) {
|
if (fd->cache[size]->textures[gl.texture_idx].dirty) {
|
||||||
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl.texture_idx];
|
ShelfPackTexture &tex = fd->cache[size]->textures.write[gl.texture_idx];
|
||||||
Ref<Image> img = Image::create_from_data(tex.texture_w, tex.texture_h, false, tex.format, tex.imgdata);
|
Ref<Image> img = tex.image;
|
||||||
if (fd->mipmaps) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
|
img = tex.image->duplicate();
|
||||||
img->generate_mipmaps();
|
img->generate_mipmaps();
|
||||||
}
|
}
|
||||||
if (tex.texture.is_null()) {
|
if (tex.texture.is_null()) {
|
||||||
|
|
|
@ -162,8 +162,7 @@ class TextServerFallback : public TextServerExtension {
|
||||||
int32_t texture_w = 1024;
|
int32_t texture_w = 1024;
|
||||||
int32_t texture_h = 1024;
|
int32_t texture_h = 1024;
|
||||||
|
|
||||||
Image::Format format;
|
Ref<Image> image;
|
||||||
PackedByteArray imgdata;
|
|
||||||
Ref<ImageTexture> texture;
|
Ref<ImageTexture> texture;
|
||||||
bool dirty = true;
|
bool dirty = true;
|
||||||
|
|
||||||
|
|
|
@ -1342,7 +1342,7 @@ void FontFile::_get_property_list(List<PropertyInfo> *p_list) const {
|
||||||
int tx_cnt = get_texture_count(i, sz);
|
int tx_cnt = get_texture_count(i, sz);
|
||||||
for (int k = 0; k < tx_cnt; k++) {
|
for (int k = 0; k < tx_cnt; k++) {
|
||||||
p_list->push_back(PropertyInfo(Variant::PACKED_INT32_ARRAY, prefix_sz + "textures/" + itos(k) + "/offsets", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE));
|
p_list->push_back(PropertyInfo(Variant::PACKED_INT32_ARRAY, prefix_sz + "textures/" + itos(k) + "/offsets", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE));
|
||||||
p_list->push_back(PropertyInfo(Variant::OBJECT, prefix_sz + "textures/" + itos(k) + "/image", PROPERTY_HINT_RESOURCE_TYPE, "Image", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_RESOURCE_NOT_PERSISTENT));
|
p_list->push_back(PropertyInfo(Variant::OBJECT, prefix_sz + "textures/" + itos(k) + "/image", PROPERTY_HINT_RESOURCE_TYPE, "Image", PROPERTY_USAGE_STORAGE));
|
||||||
}
|
}
|
||||||
PackedInt32Array glyphs = get_glyph_list(i, sz);
|
PackedInt32Array glyphs = get_glyph_list(i, sz);
|
||||||
for (int k = 0; k < glyphs.size(); k++) {
|
for (int k = 0; k < glyphs.size(); k++) {
|
||||||
|
|
Loading…
Reference in New Issue