51 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| diff --git a/gfx/thebes/gfxHarfBuzzShaper.cpp b/gfx/thebes/gfxHarfBuzzShaper.cpp
 | |
| index 18bc08a6bf..46e0675aa2 100644
 | |
| --- a/gfx/thebes/gfxHarfBuzzShaper.cpp
 | |
| +++ b/gfx/thebes/gfxHarfBuzzShaper.cpp
 | |
| @@ -17,6 +17,9 @@
 | |
|  
 | |
|  #include "harfbuzz/hb.h"
 | |
|  #include "harfbuzz/hb-ot.h"
 | |
| +#include <cstdlib>
 | |
| +#include <chrono>
 | |
| +#include "MaskConfig.hpp"
 | |
|  
 | |
|  #include <algorithm>
 | |
|  
 | |
| @@ -1557,6 +1560,36 @@ bool gfxHarfBuzzShaper::ShapeText(DrawTarget* aDrawTarget,
 | |
|  
 | |
|    hb_shape(mHBFont, mBuffer, features.Elements(), features.Length());
 | |
|  
 | |
| +  static uint32_t seed;
 | |
| +  if (auto value = MaskConfig::GetUint32("fonts:spacing_seed"))
 | |
| +    seed = value.value();
 | |
| +  else
 | |
| +    seed = static_cast<uint32_t>(
 | |
| +        std::chrono::high_resolution_clock::now().time_since_epoch().count());
 | |
| +
 | |
| +  // Generate a random float [0, 0.1] to offset the letter spacing
 | |
| +  seed = (seed * 1103515245 + 12345) & 0x7fffffff;
 | |
| +  float randomFloat = (static_cast<float>(seed) / 0x7fffffff) * 0.1f;
 | |
| +  hb_position_t spacing = FloatToFixed(randomFloat);
 | |
| +
 | |
| +  uint32_t glyphCount;
 | |
| +  hb_glyph_position_t* glyphPositions =
 | |
| +      hb_buffer_get_glyph_positions(mBuffer, &glyphCount);
 | |
| +
 | |
| +  hb_position_t cumulativeOffset = 0;
 | |
| +
 | |
| +  // Apply custom letter spacing
 | |
| +  for (uint32_t i = 0; i < glyphCount; ++i) {
 | |
| +    if (aVertical) {
 | |
| +      glyphPositions[i].y_advance -= spacing;
 | |
| +      glyphPositions[i].y_offset -= cumulativeOffset;
 | |
| +    } else {
 | |
| +      glyphPositions[i].x_advance += spacing;
 | |
| +      glyphPositions[i].x_offset += cumulativeOffset;
 | |
| +    }
 | |
| +    cumulativeOffset += spacing;
 | |
| +  }
 | |
| +
 | |
|    if (isRightToLeft) {
 | |
|      hb_buffer_reverse(mBuffer);
 | |
|    }
 |