43 glyphs.ensureStorageAllocated (numGlyphsToPreallocate);
53 Range<float> r (glyph.anchor.x, glyph.anchor.x + glyph.width);
71 float lead,
int numRunsToPreallocate)
75 runs.ensureStorageAllocated (numRunsToPreallocate);
99 auto runRange =
run->getRunBoundsX();
126 return {
x.getStart(),
y.getStart(),
x.getLength(),
y.getLength() };
131 std::swap (other.runs,
runs);
134 std::swap (other.ascent,
ascent);
135 std::swap (other.descent,
descent);
136 std::swap (other.leading,
leading);
153 :
lines (std::move (other.lines)),
161 lines = std::move (other.lines);
184 return *
lines.getUnchecked (index);
189 lines.ensureStorageAllocated (numLinesNeeded);
194 lines.add (line.release());
201 auto& context =
g.getInternalContext();
204 auto clip = context.getClipBounds();
205 auto clipTop = (float) clip.getY() - origin.y;
206 auto clipBottom = (float) clip.getBottom() - origin.y;
208 for (
auto& line : *
this)
210 auto lineRangeY = line.getLineBoundsY();
212 if (lineRangeY.getEnd() < clipTop)
215 if (lineRangeY.getStart() > clipBottom)
218 auto lineOrigin = origin + line.lineOrigin;
220 for (
auto*
run : line.runs)
222 context.setFont (
run->font);
223 context.setFill (
run->colour);
225 for (
auto& glyph :
run->glyphs)
227 lineOrigin.y + glyph.anchor.y));
229 if (
run->font.isUnderlined())
231 auto runExtent =
run->getRunBoundsX();
232 auto lineThickness =
run->font.getDescent() * 0.3f;
234 context.fillRect ({ runExtent.getStart() + lineOrigin.x, lineOrigin.y + lineThickness * 2.0f,
235 runExtent.getLength(), lineThickness });
240 context.restoreState();
268 auto minimumWidth = maxWidth / 2.0f;
269 auto bestWidth = maxWidth;
270 float bestLineProportion = 0.0f;
272 while (maxWidth > minimumWidth)
279 auto line1 =
lines.getUnchecked (
lines.size() - 1)->getLineBoundsX().getLength();
280 auto line2 =
lines.getUnchecked (
lines.size() - 2)->getLineBoundsX().getLength();
281 auto shortest =
jmin (line1, line2);
282 auto longest =
jmax (line1, line2);
283 auto prop = shortest > 0 ? longest / shortest : 1.0f;
285 if (prop > 0.9f && prop < 1.1f)
288 if (prop > bestLineProportion)
290 bestLineProportion = prop;
291 bestWidth = maxWidth;
297 if (bestWidth != maxWidth)
308 area (
font.getStringWidthFloat (
t),
f.getHeight()),
310 isNewLine (
t.containsChar (
'\n') ||
t.containsChar (
'\r'))
335 int charPosition = 0;
336 int lineStartPosition = 0;
337 int runStartPosition = 0;
339 std::unique_ptr<TextLayout::Line> currentLine;
340 std::unique_ptr<TextLayout::Run> currentRun;
342 bool needToSetLineOrigin =
true;
352 if (currentRun ==
nullptr) currentRun = std::make_unique<TextLayout::Run>();
353 if (currentLine ==
nullptr) currentLine = std::make_unique<TextLayout::Line>();
355 const auto numGlyphs = newGlyphs.
size();
356 charPosition += numGlyphs;
359 && (! (
t.isWhitespace ||
t.isNewLine) || needToSetLineOrigin))
361 currentRun->glyphs.ensureStorageAllocated (currentRun->glyphs.size() + newGlyphs.
size());
362 auto tokenOrigin =
t.area.getPosition().translated (0,
t.font.getAscent());
364 if (needToSetLineOrigin)
366 needToSetLineOrigin =
false;
367 currentLine->lineOrigin = tokenOrigin;
370 auto glyphOffset = tokenOrigin - currentLine->lineOrigin;
372 for (
int j = 0;
j < newGlyphs.
size(); ++
j)
376 glyphOffset.translated (
x, 0),
381 if (
auto* nextToken =
tokens[
i + 1])
383 if (
t.font != nextToken->font ||
t.colour != nextToken->colour)
385 addRun (*currentLine, currentRun.release(),
t, runStartPosition, charPosition);
386 runStartPosition = charPosition;
389 if (
t.line != nextToken->line)
391 if (currentRun ==
nullptr)
392 currentRun = std::make_unique<TextLayout::Run>();
394 addRun (*currentLine, currentRun.release(),
t, runStartPosition, charPosition);
395 currentLine->stringRange = { lineStartPosition, charPosition };
397 if (! needToSetLineOrigin)
398 layout.
addLine (std::move (currentLine));
400 runStartPosition = charPosition;
401 lineStartPosition = charPosition;
402 needToSetLineOrigin =
true;
407 addRun (*currentLine, currentRun.release(),
t, runStartPosition, charPosition);
408 currentLine->stringRange = { lineStartPosition, charPosition };
410 if (! needToSetLineOrigin)
411 layout.
addLine (std::move (currentLine));
413 needToSetLineOrigin =
true;
422 for (
auto& line : layout)
424 auto dx = totalW - line.getLineBoundsX().getLength();
429 line.lineOrigin.x += dx;
439 glyphRun->
font =
t.font;
443 glyphLine.
runs.add (glyphRun);
448 if (
c ==
'\r' ||
c ==
'\n')
458 int lastCharType = 0;
462 auto c =
t.getAndAdvance();
469 if (charType == 0 || charType != lastCharType)
472 tokens.add (
new Token (currentString, font, colour,
473 lastCharType == 2 || lastCharType == 0));
477 if (
c ==
'\r' && *
t ==
'\n')
478 currentString +=
t.getAndAdvance();
485 lastCharType = charType;
489 tokens.add (
new Token (currentString, font, colour, lastCharType == 2));
494 float x = 0,
y = 0,
h = 0;
500 t.area.setPosition (
x,
y);
502 x +=
t.area.getWidth();
503 h =
jmax (
h,
t.area.getHeight() + extraLineSpacing);
507 if (nextTok ==
nullptr)
510 bool tokenTooLarge = (
x + nextTok->area.getWidth() > maxWidth);
530 auto& tok = *
tokens.getUnchecked (
i);
541 auto numAttributes =
text.getNumAttributes();
542 tokens.ensureStorageAllocated (
jmax (64, numAttributes));
544 for (
int i = 0;
i < numAttributes; ++
i)
546 auto& attr =
text.getAttribute (
i);
549 attr.font, attr.colour);
555 auto trimmed =
s.trimEnd();
557 if (trimmed.isEmpty() &&
s.isNotEmpty())
558 trimmed =
s.replaceCharacters (
"\r\n\t",
" ");
574 l.createLayout (
text, *
this);
579 if (!
lines.isEmpty())
581 auto bounds =
lines.getFirst()->getLineBounds();
583 for (
auto* line :
lines)
584 bounds = bounds.getUnion (line->getLineBounds());
586 for (
auto* line :
lines)
587 line->lineOrigin.x -= bounds.getX();
589 width = bounds.getWidth();
590 height = bounds.getHeight();
#define copy(x)
Definition ADnoteParameters.cpp:1011
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define noexcept
Definition DistrhoDefines.h:72
static void run(LV2_Handle instance, uint32_t n_samples)
Definition bindings_test_plugin.c:112
static String charToString(water_uchar character)
Definition String.cpp:311
Definition juce_Array.h:56
ElementType getUnchecked(int index) const
Definition juce_Array.h:252
int size() const noexcept
Definition juce_Array.h:215
Definition juce_AttributedString.h:47
WordWrap
Definition juce_AttributedString.h:114
@ none
Definition juce_AttributedString.h:115
static bool isWhitespace(char character) noexcept
Definition juce_CharacterFunctions.cpp:59
Definition juce_Colour.h:38
Definition juce_Font.h:42
Definition juce_GraphicsContext.h:45
Definition juce_Justification.h:41
@ horizontallyCentred
Definition juce_Justification.h:115
@ right
Definition juce_Justification.h:111
Definition juce_OwnedArray.h:51
Definition juce_Point.h:42
Definition juce_Range.h:40
constexpr ValueType getStart() const noexcept
Definition juce_Range.h:80
constexpr ValueType getEnd() const noexcept
Definition juce_Range.h:86
JUCE_NODISCARD constexpr Range getUnionWith(Range other) const noexcept
Definition juce_Range.h:241
Definition juce_Rectangle.h:67
Definition juce_String.h:53
CharPointerType getCharPointer() const noexcept
Definition juce_String.h:1153
bool isNotEmpty() const noexcept
Definition juce_String.h:316
Definition juce_TextLayout.h:145
Point< float > anchor
Definition juce_TextLayout.h:155
int glyphCode
Definition juce_TextLayout.h:150
Glyph(int glyphCode, Point< float > anchor, float width) noexcept
Definition juce_TextLayout.cpp:34
Definition juce_TextLayout.h:186
float ascent
Definition juce_TextLayout.h:215
float descent
Definition juce_TextLayout.h:215
float leading
Definition juce_TextLayout.h:215
Range< float > getLineBoundsY() const noexcept
Definition juce_TextLayout.cpp:115
Range< int > stringRange
Definition juce_TextLayout.h:212
void swap(Line &other) noexcept
Definition juce_TextLayout.cpp:129
Rectangle< float > getLineBounds() const noexcept
Definition juce_TextLayout.cpp:121
Point< float > lineOrigin
Definition juce_TextLayout.h:214
Range< float > getLineBoundsX() const noexcept
Definition juce_TextLayout.cpp:92
OwnedArray< Run > runs
Definition juce_TextLayout.h:211
Definition juce_TextLayout.h:166
Range< int > stringRange
Definition juce_TextLayout.h:177
Range< float > getRunBoundsX() const noexcept
Definition juce_TextLayout.cpp:46
Array< Glyph > glyphs
Definition juce_TextLayout.h:176
Colour colour
Definition juce_TextLayout.h:175
Font font
Definition juce_TextLayout.h:174
Definition juce_TextLayout.h:41
~TextLayout()
Definition juce_TextLayout.cpp:178
float width
Definition juce_TextLayout.h:261
Justification justification
Definition juce_TextLayout.h:262
void recalculateSize()
Definition juce_TextLayout.cpp:577
void createLayoutWithBalancedLineLengths(const AttributedString &, float maxWidth)
Definition juce_TextLayout.cpp:261
int getNumLines() const noexcept
Definition juce_TextLayout.h:229
bool createNativeLayout(const AttributedString &)
Definition juce_linux_Fonts.cpp:108
float getWidth() const noexcept
Definition juce_TextLayout.h:223
void ensureStorageAllocated(int numLinesNeeded)
Definition juce_TextLayout.cpp:187
void createStandardLayout(const AttributedString &)
Definition juce_TextLayout.cpp:571
float height
Definition juce_TextLayout.h:261
OwnedArray< Line > lines
Definition juce_TextLayout.h:260
void addLine(std::unique_ptr< Line >)
Definition juce_TextLayout.cpp:192
void draw(Graphics &, Rectangle< float > area) const
Definition juce_TextLayout.cpp:197
float getHeight() const noexcept
Definition juce_TextLayout.h:226
void createLayout(const AttributedString &, float maxWidth)
Definition juce_TextLayout.cpp:243
TextLayout()
Definition juce_TextLayout.cpp:140
Line & getLine(int index) const noexcept
Definition juce_TextLayout.cpp:182
UINT_D64 w
Definition inflate.c:942
int * l
Definition inflate.c:1579
struct huft * t
Definition inflate.c:943
register unsigned j
Definition inflate.c:1576
int y
Definition inflate.c:1588
int g
Definition inflate.c:1573
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
unsigned x[BMAX+1]
Definition inflate.c:1586
unsigned f
Definition inflate.c:1572
static int int height
Definition pugl.h:1594
static int width
Definition pugl.h:1593
virtual ASIOError start()=0
Definition juce_TextLayout.cpp:303
Definition carla_juce.cpp:31
constexpr Type jmin(Type a, Type b)
Definition juce_MathsFunctions.h:106
constexpr Type jmax(Type a, Type b)
Definition juce_MathsFunctions.h:94
RangedDirectoryIterator end(const RangedDirectoryIterator &)
Definition juce_RangedDirectoryIterator.h:184
wchar_t juce_wchar
Definition juce_CharacterFunctions.h:42
static String substring(const String &text, Range< int > range)
Definition juce_TextLayout.cpp:29
Definition juce_TextLayout.cpp:305
const Font font
Definition juce_TextLayout.cpp:314
int line
Definition juce_TextLayout.cpp:317
const String text
Definition juce_TextLayout.cpp:313
float lineHeight
Definition juce_TextLayout.cpp:318
Rectangle< float > area
Definition juce_TextLayout.cpp:316
const bool isNewLine
Definition juce_TextLayout.cpp:319
const Colour colour
Definition juce_TextLayout.cpp:315
Token(const String &t, const Font &f, Colour c, bool whitespace)
Definition juce_TextLayout.cpp:306
const bool isWhitespace
Definition juce_TextLayout.cpp:319
Definition juce_TextLayout.cpp:325
static String getTrimmedEndIfNotAllWhitespace(const String &s)
Definition juce_TextLayout.cpp:553
OwnedArray< Token > tokens
Definition juce_TextLayout.cpp:563
void layoutRuns(float maxWidth, float extraLineSpacing, AttributedString::WordWrap wordWrap)
Definition juce_TextLayout.cpp:492
void setLastLineHeight(int i, float height) noexcept
Definition juce_TextLayout.cpp:526
void addTextRuns(const AttributedString &text)
Definition juce_TextLayout.cpp:539
TokenList() noexcept
Definition juce_TextLayout.cpp:326
void createLayout(const AttributedString &text, TextLayout &layout)
Definition juce_TextLayout.cpp:328
static void addRun(TextLayout::Line &glyphLine, TextLayout::Run *glyphRun, const Token &t, int start, int end)
Definition juce_TextLayout.cpp:435
void appendText(const String &stringText, const Font &font, Colour colour)
Definition juce_TextLayout.cpp:454
static int getCharacterType(juce_wchar c) noexcept
Definition juce_TextLayout.cpp:446
int totalLines
Definition juce_TextLayout.cpp:564
const char * text
Definition swell-functions.h:167
return c
Definition crypt.c:175
int r
Definition crypt.c:458
uch h[RAND_HEAD_LEN]
Definition crypt.c:459
#define const
Definition zconf.h:137