ICU 62.1 62.1
ParagraphLayout.h
Go to the documentation of this file.
1// © 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3/*
4 **********************************************************************
5 * Copyright (C) 2002-2014, International Business Machines
6 * Corporation and others. All Rights Reserved.
7 **********************************************************************
8 */
9
10#ifndef __PARAGRAPHLAYOUT_H
11
12#define __PARAGRAPHLAYOUT_H
13
19/*
20 * ParagraphLayout doesn't make much sense without
21 * BreakIterator...
22 */
23#include "unicode/uscript.h"
24#if ! UCONFIG_NO_BREAK_ITERATION
25
26#include "layout/LETypes.h"
27#include "layout/LEFontInstance.h"
28#include "layout/LayoutEngine.h"
29#include "unicode/ubidi.h"
30#include "unicode/brkiter.h"
31
32#include "layout/RunArrays.h"
33
35
54{
55public:
56 class VisualRun;
57
70 {
71 public:
81
89 inline le_int32 countRuns() const;
90
100
110
120
131
148
154 static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
155
161 virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
162
163 private:
164
169 static const char fgClassID;
170
171 friend class ParagraphLayout;
172
173 le_int32 fAscent;
174 le_int32 fDescent;
175 le_int32 fLeading;
176
177 le_int32 fRunCount;
178 le_int32 fRunCapacity;
179
180 VisualRun **fRuns;
181
182 inline Line();
183 inline Line(const Line &other);
184 inline Line &operator=(const Line & /*other*/) { return *this; };
185
186 void computeMetrics();
187
188 void append(const LEFontInstance *font, UBiDiDirection direction, le_int32 glyphCount,
189 const LEGlyphID glyphs[], const float positions[], const le_int32 glyphToCharMap[]);
190 };
191
208 {
209 public:
222 inline const LEFontInstance *getFont() const;
223
232 inline UBiDiDirection getDirection() const;
233
241 inline le_int32 getGlyphCount() const;
242
253 inline const LEGlyphID *getGlyphs() const;
254
268 inline const float *getPositions() const;
269
280 inline const le_int32 *getGlyphToCharMap() const;
281
290 inline le_int32 getAscent() const;
291
300 inline le_int32 getDescent() const;
301
310 inline le_int32 getLeading() const;
311
317 static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
318
324 virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
325
326 private:
327
332 static const char fgClassID;
333
334 const LEFontInstance *fFont;
335 const UBiDiDirection fDirection;
336
337 const le_int32 fGlyphCount;
338
339 const LEGlyphID *fGlyphs;
340 const float *fPositions;
341 const le_int32 *fGlyphToCharMap;
342
343 friend class Line;
344
345 inline VisualRun();
346 inline VisualRun(const VisualRun &other);
347 inline VisualRun &operator=(const VisualRun &/*other*/) { return *this; };
348
349 inline VisualRun(const LEFontInstance *font, UBiDiDirection direction, le_int32 glyphCount,
350 const LEGlyphID glyphs[], const float positions[], const le_int32 glyphToCharMap[]);
351
352 ~VisualRun();
353 };
354
398 ParagraphLayout(const LEUnicode chars[], le_int32 count,
399 const FontRuns *fontRuns,
400 const ValueRuns *levelRuns,
401 const ValueRuns *scriptRuns,
402 const LocaleRuns *localeRuns,
405
413
414 // Note: the following is #if 0'd out because there's no good
415 // way to implement it without either calling layoutEngineFactory()
416 // or duplicating the logic there...
417#if 0
433 static le_bool isComplex(const LEUnicode chars[], le_int32 count, const FontRuns *fontRuns);
434#else
447 static le_bool isComplex(const LEUnicode chars[], le_int32 count);
448
449#endif
450
460 inline UBiDiLevel getParagraphLevel();
461
471 inline UBiDiDirection getTextDirection();
472
481 virtual le_int32 getAscent() const;
482
491 virtual le_int32 getDescent() const;
492
501 virtual le_int32 getLeading() const;
502
509 inline void reflow();
510
511#ifndef U_HIDE_INTERNAL_API
521 inline le_bool isDone() const;
522#endif /* U_HIDE_INTERNAL_API */
523
541 Line *nextLine(float width);
542
548 static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
549
555 virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
556
557private:
558
559
564 static const char fgClassID;
565
566 struct StyleRunInfo
567 {
568 LayoutEngine *engine;
569 const LEFontInstance *font;
570 const Locale *locale;
571 LEGlyphID *glyphs;
572 float *positions;
573 UScriptCode script;
574 UBiDiLevel level;
575 le_int32 runBase;
576 le_int32 runLimit;
577 le_int32 glyphBase;
578 le_int32 glyphCount;
579 };
580
581 ParagraphLayout() {};
582 ParagraphLayout(const ParagraphLayout & /*other*/) : UObject( ){};
583 inline ParagraphLayout &operator=(const ParagraphLayout & /*other*/) { return *this; };
584
585 void computeLevels(UBiDiLevel paragraphLevel);
586
587 Line *computeVisualRuns();
588 void appendRun(Line *line, le_int32 run, le_int32 firstChar, le_int32 lastChar);
589
590 void computeScripts();
591
592 void computeLocales();
593
594 void computeSubFonts(const FontRuns *fontRuns, LEErrorCode &status);
595
596 void computeMetrics();
597
598 le_int32 getLanguageCode(const Locale *locale);
599
600 le_int32 getCharRun(le_int32 charIndex);
601
602 static le_bool isComplex(UScriptCode script);
603
604 le_int32 previousBreak(le_int32 charIndex);
605
606
607 const LEUnicode *fChars;
608 le_int32 fCharCount;
609
610 const FontRuns *fFontRuns;
611 const ValueRuns *fLevelRuns;
612 const ValueRuns *fScriptRuns;
613 const LocaleRuns *fLocaleRuns;
614
615 le_bool fVertical;
616 le_bool fClientLevels;
617 le_bool fClientScripts;
618 le_bool fClientLocales;
619
620 UBiDiLevel *fEmbeddingLevels;
621
622 le_int32 fAscent;
623 le_int32 fDescent;
624 le_int32 fLeading;
625
626 le_int32 *fGlyphToCharMap;
627 le_int32 *fCharToMinGlyphMap;
628 le_int32 *fCharToMaxGlyphMap;
629 float *fGlyphWidths;
630 le_int32 fGlyphCount;
631
632 UBiDi *fParaBidi;
633 UBiDi *fLineBidi;
634
635 le_int32 *fStyleRunLimits;
636 le_int32 *fStyleIndices;
637 StyleRunInfo *fStyleRunInfo;
638 le_int32 fStyleRunCount;
639
640 BreakIterator *fBreakIterator;
641 le_int32 fLineStart;
642 le_int32 fLineEnd;
643
644 le_int32 fFirstVisualRun;
645 le_int32 fLastVisualRun;
646 float fVisualRunLastX;
647 float fVisualRunLastY;
648};
649
650inline UBiDiLevel ParagraphLayout::getParagraphLevel()
651{
652 return ubidi_getParaLevel(fParaBidi);
653}
654
655inline UBiDiDirection ParagraphLayout::getTextDirection()
656{
657 return ubidi_getDirection(fParaBidi);
658}
659
660inline void ParagraphLayout::reflow()
661{
662 fLineEnd = 0;
663}
664
665inline ParagraphLayout::Line::Line()
666 : UObject(), fAscent(0), fDescent(0), fLeading(0), fRunCount(0), fRunCapacity(0), fRuns(NULL)
667{
668 // nothing else to do
669}
670
671inline ParagraphLayout::Line::Line(const Line & /*other*/)
672 : UObject(), fAscent(0), fDescent(0), fLeading(0), fRunCount(0), fRunCapacity(0), fRuns(NULL)
673{
674 // nothing else to do
675}
676
678{
679 return fRunCount;
680}
681
683{
684 return fFont;
685}
686
688{
689 return fDirection;
690}
691
693{
694 return fGlyphCount;
695}
696
698{
699 return fGlyphs;
700}
701
703{
704 return fPositions;
705}
706
708{
709 return fGlyphToCharMap;
710}
711
713{
714 return fFont->getAscent();
715}
716
718{
719 return fFont->getDescent();
720}
721
723{
724 return fFont->getLeading();
725}
726
727inline ParagraphLayout::VisualRun::VisualRun()
728 : UObject(), fFont(NULL), fDirection(UBIDI_LTR), fGlyphCount(0), fGlyphs(NULL), fPositions(NULL), fGlyphToCharMap(NULL)
729{
730 // nothing
731}
732
733inline ParagraphLayout::VisualRun::VisualRun(const VisualRun &/*other*/)
734 : UObject(), fFont(NULL), fDirection(UBIDI_LTR), fGlyphCount(0), fGlyphs(NULL), fPositions(NULL), fGlyphToCharMap(NULL)
735{
736 // nothing
737}
738
739inline ParagraphLayout::VisualRun::VisualRun(const LEFontInstance *font, UBiDiDirection direction, le_int32 glyphCount,
740 const LEGlyphID glyphs[], const float positions[], const le_int32 glyphToCharMap[])
741 : fFont(font), fDirection(direction), fGlyphCount(glyphCount),
742 fGlyphs(glyphs), fPositions(positions), fGlyphToCharMap(glyphToCharMap)
743{
744 // nothing else needs to be done!
745}
746
748#endif
749#endif
C++ API: base class for building classes which represent data that is associated with runs of text.
C++ API: Break Iterator.
The FontRuns class associates pointers to LEFontInstance objects with runs of text.
Definition RunArrays.h:273
"Smart pointer" base class; do not use directly: use LocalPointer etc.
The LocaleRuns class associates pointers to Locale objects with runs of text.
Definition RunArrays.h:410
A Locale object represents a specific geographical, political, or cultural region.
Definition locid.h:188
This class represents a single line of text in a ParagraphLayout.
~Line()
The constructor is private since these objects can only be created by ParagraphLayout.
const VisualRun * getVisualRun(le_int32 runIndex) const
Get a ParagraphLayout::VisualRun object for a given visual run in the line.
le_int32 countRuns() const
Count the number of visual runs in the line.
static UClassID getStaticClassID()
ICU "poor man's RTTI", returns a UClassID for this class.
virtual UClassID getDynamicClassID() const
ICU "poor man's RTTI", returns a UClassID for the actual class.
le_int32 getWidth() const
Get the width of the line.
le_int32 getLeading() const
Get the leading of the line.
le_int32 getDescent() const
Get the descent of the line.
le_int32 getAscent() const
Get the ascent of the line.
This object represents a single visual run in a line of text in a paragraph.
virtual UClassID getDynamicClassID() const
ICU "poor man's RTTI", returns a UClassID for the actual class.
static UClassID getStaticClassID()
ICU "poor man's RTTI", returns a UClassID for this class.
const LEFontInstance * getFont() const
Get the LEFontInstance object which represents the font of the visual run.
const le_int32 * getGlyphToCharMap() const
Get the glyph-to-character map for this visual run.
le_int32 getAscent() const
A convenience method which returns the ascent value for the font associated with this run.
UBiDiDirection getDirection() const
Get the direction of the visual run.
le_int32 getDescent() const
A convenience method which returns the descent value for the font associated with this run.
le_int32 getLeading() const
A convenience method which returns the leading value for the font associated with this run.
const LEGlyphID * getGlyphs() const
Get the glyphs in the visual run.
le_int32 getGlyphCount() const
Get the number of glyphs in the visual run.
const float * getPositions() const
Get the (x, y) positions of the glyphs in the visual run.
ParagraphLayout.
le_bool isDone() const
Convenience method for determining if paragraph layout processing is complete ( i....
virtual le_int32 getAscent() const
Return the max ascent value for all the fonts in the paragraph.
virtual le_int32 getDescent() const
Return the max descent value for all the fonts in the paragraph.
static UClassID getStaticClassID()
ICU "poor man's RTTI", returns a UClassID for this class.
~ParagraphLayout()
The destructor.
virtual le_int32 getLeading() const
Return the max leading value for all the fonts in the paragraph.
static le_bool isComplex(const LEUnicode chars[], le_int32 count)
Examine the given text and determine if it contains characters in any script which requires complex p...
ParagraphLayout(const LEUnicode chars[], le_int32 count, const FontRuns *fontRuns, const ValueRuns *levelRuns, const ValueRuns *scriptRuns, const LocaleRuns *localeRuns, UBiDiLevel paragraphLevel, le_bool vertical, LEErrorCode &status)
Construct a ParagraphLayout object for a styled paragraph.
Line * nextLine(float width)
Return a ParagraphLayout::Line object which represents next line in the paragraph.
virtual UClassID getDynamicClassID() const
ICU "poor man's RTTI", returns a UClassID for the actual class.
UObject is the common ICU "boilerplate" class.
Definition uobject.h:223
The ValueRuns class associates integer values with runs of text.
Definition RunArrays.h:549
C API: Bidi algorithm.
UBiDiLevel ubidi_getParaLevel(const UBiDi *pBiDi)
Get the paragraph level of the text.
UBiDiDirection
UBiDiDirection values indicate the text direction.
Definition ubidi.h:419
@ UBIDI_LTR
Left-to-right text.
Definition ubidi.h:431
uint8_t UBiDiLevel
UBiDiLevel is the type of the level values in this Bidi implementation.
Definition ubidi.h:332
struct UBiDi UBiDi
Definition ubidi.h:476
UBiDiDirection ubidi_getDirection(const UBiDi *pBiDi)
Get the directionality of the text.
void * UClassID
UClassID is used to identify classes without using the compiler's RTTI.
Definition uobject.h:93
C API: Unicode Script Information.
UScriptCode
Constants for ISO 15924 script codes.
Definition uscript.h:54
#define NULL
Define NULL if necessary, to nullptr for C++ and to ((void *)0) for C.
Definition utypes.h:188
#define U_LAYOUTEX_API
Set to export library symbols from inside the layout extensions library, and to import them from outs...
Definition utypes.h:362
#define U_NAMESPACE_END
This is used to end a declaration of a public ICU C++ API.
Definition uversion.h:138
#define U_NAMESPACE_BEGIN
This is used to begin a declaration of a public ICU C++ API.
Definition uversion.h:137