mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 20:51:06 +01:00 
			
		
		
		
	Skip missing font glyphs V2 revert changes to stb_truetype.h (
This commit is contained in:
		| @@ -1774,19 +1774,34 @@ bool    ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) | ||||
|             buf_packedchars_n += range.num_chars; | ||||
|         } | ||||
|  | ||||
|         // Pack | ||||
|         // Gather the sizes of all rectangle we need | ||||
|         tmp.Rects = buf_rects + buf_rects_n; | ||||
|         tmp.RectsCount = font_glyphs_count; | ||||
|         buf_rects_n += font_glyphs_count; | ||||
|         stbtt_PackSetOversampling(&spc, cfg.OversampleH, cfg.OversampleV); | ||||
|         int n = stbtt_PackFontRangesGatherRects(&spc, &tmp.FontInfo, tmp.Ranges, tmp.RangesCount, tmp.Rects); | ||||
|         IM_ASSERT(n == font_glyphs_count); | ||||
|  | ||||
|         // Detect missing glyphs and replace them with a zero-sized box instead of relying on the default glyphs | ||||
|         // This allows us merging overlapping icon fonts more easily. | ||||
|         int rect_i = 0; | ||||
|         for (int range_i = 0; range_i < tmp.RangesCount; range_i++) | ||||
|             for (int char_i = 0; char_i < tmp.Ranges[range_i].num_chars; char_i++, rect_i++) | ||||
|                 if (stbtt_FindGlyphIndex(&tmp.FontInfo, tmp.Ranges[range_i].first_unicode_codepoint_in_range + char_i) == 0) | ||||
|                     tmp.Rects[rect_i].w = tmp.Rects[rect_i].h = 0; | ||||
|  | ||||
|         // Pack | ||||
|         stbrp_pack_rects((stbrp_context*)spc.pack_info, tmp.Rects, n); | ||||
|  | ||||
|         // Extend texture height | ||||
|         // Also mark missing glyphs as non-packed so we don't attempt to render into them | ||||
|         for (int i = 0; i < n; i++) | ||||
|         { | ||||
|             if (tmp.Rects[i].w == 0 && tmp.Rects[i].h == 0) | ||||
|                 tmp.Rects[i].was_packed = 0; | ||||
|             if (tmp.Rects[i].was_packed) | ||||
|                 atlas->TexHeight = ImMax(atlas->TexHeight, tmp.Rects[i].y + tmp.Rects[i].h); | ||||
|         } | ||||
|     } | ||||
|     IM_ASSERT(buf_rects_n == total_glyphs_count); | ||||
|     IM_ASSERT(buf_packedchars_n == total_glyphs_count); | ||||
|   | ||||
| @@ -1,6 +1,3 @@ | ||||
| // [ImGui] this is a slightly modified version of stb_truetype.h 1.19. Those changes would need to be pushed into nothings/stb | ||||
| // [ImGui] - skip missing glyphs instead of allocating and rendering a default glyph (stb #607, imgui #1703, imgui #1671) | ||||
|  | ||||
| // stb_truetype.h - v1.19 - public domain | ||||
| // authored from 2009-2016 by Sean Barrett / RAD Game Tools | ||||
| // | ||||
| @@ -3971,17 +3968,13 @@ STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stb | ||||
|          int x0,y0,x1,y1; | ||||
|          int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; | ||||
|          int glyph = stbtt_FindGlyphIndex(info, codepoint); | ||||
|          if (glyph != 0) { | ||||
|             stbtt_GetGlyphBitmapBoxSubpixel(info,glyph, | ||||
|                                             scale * spc->h_oversample, | ||||
|                                             scale * spc->v_oversample, | ||||
|                                             0,0, | ||||
|                                             &x0,&y0,&x1,&y1); | ||||
|             rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1); | ||||
|             rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1); | ||||
|          } else { | ||||
|             rects[k].w = rects[k].h = 0; | ||||
|          } | ||||
|          stbtt_GetGlyphBitmapBoxSubpixel(info,glyph, | ||||
|                                          scale * spc->h_oversample, | ||||
|                                          scale * spc->v_oversample, | ||||
|                                          0,0, | ||||
|                                          &x0,&y0,&x1,&y1); | ||||
|          rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1); | ||||
|          rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1); | ||||
|          ++k; | ||||
|       } | ||||
|    } | ||||
| @@ -4034,7 +4027,7 @@ STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const | ||||
|       sub_y = stbtt__oversample_shift(spc->v_oversample); | ||||
|       for (j=0; j < ranges[i].num_chars; ++j) { | ||||
|          stbrp_rect *r = &rects[k]; | ||||
|          if (r->was_packed && r->w != 0 && r->h != 0) { | ||||
|          if (r->was_packed) { | ||||
|             stbtt_packedchar *bc = &ranges[i].chardata_for_range[j]; | ||||
|             int advance, lsb, x0,y0,x1,y1; | ||||
|             int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user