Go to the documentation of this file.
34 #ifndef MWAW_GRAPHIC_LISTENER_H
35 #define MWAW_GRAPHIC_LISTENER_H
39 #include <librevenge/librevenge.h>
158 void insertEOL(
bool softBreak=false) final;
292 std::shared_ptr<MWAWGraphicListenerInternal::GraphicState>
m_ds;
294 std::shared_ptr<MWAWGraphicListenerInternal::State>
m_ps;
296 std::vector<std::shared_ptr<MWAWGraphicListenerInternal::State> >
m_psStack;
bool addTo(librevenge::RVNGPropertyList &propList) const
add the link property to proplist
Definition: libmwaw_internal.cxx:571
std::shared_ptr< MWAWInputStream > MWAWInputStreamPtr
a smart pointer of MWAWInputStream
Definition: libmwaw_internal.hxx:549
BreakType
the different break type
Definition: MWAWListener.hxx:58
an noop deleter used to transform a libwpd pointer in a false std::shared_ptr
Definition: libmwaw_internal.hxx:101
MWAWGraphicStyle m_frameStyle
the frame style
Definition: MWAWGraphicListener.cxx:141
bool m_isParagraphOpened
Definition: MWAWGraphicListener.cxx:150
std::shared_ptr< MWAWGraphicListenerInternal::State > _pushParsingState()
creates a new parsing state (copy of the actual state)
Definition: MWAWGraphicListener.cxx:1692
void setDocumentMetaData(librevenge::RVNGPropertyList const &metadata) final
sets the documents metadata
Definition: MWAWGraphicListener.cxx:500
bool isParagraphOpened() const final
returns true if a paragraph or a list is opened
Definition: MWAWGraphicListener.cxx:391
a note
Definition: libmwaw_internal.hxx:445
void setPageSpan(const int pageSpan)
set the page span ( default 1)
Definition: MWAWPageSpan.hxx:266
Type m_type
the type
Definition: libmwaw_internal.hxx:420
float getInvUnitScale(librevenge::RVNGUnit fromUnit) const
returns a float which can be used to scale some data in object unit
Definition: MWAWPosition.hxx:198
void closeTableRow() final
closes this row
Definition: MWAWGraphicListener.cxx:1261
void closeMasterPage()
close a master page
Definition: MWAWGraphicListener.hxx:118
bool isSubDocumentOpened(libmwaw::SubDocumentType &subdocType) const final
returns try if a subdocument is open
Definition: MWAWGraphicListener.cxx:1660
void _flushText()
Definition: MWAWGraphicListener.cxx:865
#define MWAW_DEBUG_MSG(M)
Definition: libmwaw_internal.hxx:129
void setDocumentLanguage(std::string const &locale) final
sets the documents language
Definition: MWAWGraphicListener.cxx:507
MWAWVec2< float > MWAWVec2f
MWAWVec2 of float.
Definition: libmwaw_internal.hxx:840
Definition: MWAWListener.hxx:58
Definition: MWAWGraphicShape.hxx:51
~GraphicState()
destructor
Definition: MWAWGraphicListener.cxx:83
MWAWPosition m_framePosition
the frame position
Definition: MWAWGraphicListener.cxx:139
MWAWListManagerPtr m_listManager
the list manager
Definition: MWAWParser.hxx:80
Definition: MWAWGraphicShape.hxx:51
Definition: MWAWPosition.hxx:55
void insertTable(MWAWPosition const &pos, MWAWTable &table, MWAWGraphicStyle const &style=MWAWGraphicStyle::emptyStyle())
adds a table in given position
Definition: MWAWGraphicListener.cxx:1161
void _closeParagraph()
Definition: MWAWGraphicListener.cxx:672
Definition: libmwaw_internal.hxx:188
int id() const
returns the font id
Definition: MWAWFont.hxx:259
void _openPageSpan(bool sendHeaderFooters=true)
does open a new page (low level)
Definition: MWAWGraphicListener.cxx:561
void _openSpan()
Definition: MWAWGraphicListener.cxx:819
void insertCharacter(unsigned char c) final
insert a character using the font converter to find the utf8 character
Definition: MWAWGraphicListener.cxx:256
int order() const
returns background/foward order
Definition: MWAWPosition.hxx:258
bool m_isPageSpanOpened
true if a page is open
Definition: MWAWGraphicListener.cxx:93
bool openFrame(MWAWPosition const &pos, MWAWGraphicStyle const &style=MWAWGraphicStyle::emptyStyle()) final
store the position and the style (which will be needed further to insert a textbox or a table with op...
Definition: MWAWGraphicListener.cxx:1325
GraphicState & operator=(GraphicState const &)=default
XPos m_xPos
X relative position.
Definition: MWAWPosition.hxx:273
Definition: MWAWPosition.hxx:53
const MWAWVec2f & leftTopClipping() const
returns the left top clipping
Definition: MWAWPosition.hxx:144
void _handleFrameParameters(librevenge::RVNGPropertyList &propList, MWAWPosition const &pos, MWAWGraphicStyle const &style)
adds in propList the frame parameters.
Definition: MWAWGraphicListener.cxx:1430
a structure used to define a picture shape
Definition: MWAWGraphicShape.hxx:45
Definition: MWAWPosition.hxx:57
void appendUnicode(uint32_t val, librevenge::RVNGString &buffer)
adds an unicode character to a string
Definition: libmwaw_internal.cxx:63
std::shared_ptr< MWAWGraphicListenerInternal::State > m_ps
the actual local parse state
Definition: MWAWGraphicListener.hxx:294
small class use to define a embedded object
Definition: libmwaw_internal.hxx:467
bool sendTable(MWAWListenerPtr listener, bool inFrame=true)
try to send the table
Definition: MWAWTable.cxx:471
void addEmptyTableCell(MWAWVec2i const &pos, MWAWVec2i span=MWAWVec2i(1, 1)) final
add empty cell
Definition: MWAWGraphicListener.cxx:1271
std::shared_ptr< MWAWSubDocument > MWAWSubDocumentPtr
a smart pointer of MWAWSubDocument
Definition: libmwaw_internal.hxx:563
librevenge::RVNGString getString() const
returns a string corresponding to the field (if possible) */
Definition: libmwaw_internal.cxx:288
std::vector< MWAWSubDocumentPtr > m_subDocuments
the list of actual subdocument
Definition: MWAWGraphicListener.cxx:105
class to store the paragraph properties
Definition: MWAWParagraph.hxx:84
Definition: MWAWPosition.hxx:53
Definition: MWAWListener.hxx:56
bool m_isListElementOpened
Definition: MWAWGraphicListener.cxx:151
#define MWAW_FALLTHROUGH
Definition: libmwaw_internal.hxx:118
void insertPicture(MWAWPosition const &pos, MWAWEmbeddedObject const &picture, MWAWGraphicStyle const &style=MWAWGraphicStyle::emptyStyle()) final
adds a picture with potential various representationin given position
Definition: MWAWGraphicListener.cxx:1075
a link
Definition: libmwaw_internal.hxx:430
bool m_firstParagraphInPageSpan
Definition: MWAWGraphicListener.cxx:153
void insertGroup(MWAWBox2f const &bdbox, MWAWSubDocumentPtr const &subDocument)
adds a group: ie.
Definition: MWAWGraphicListener.cxx:1146
bool isDocumentStarted() const final
returns true if a document is opened
Definition: MWAWGraphicListener.cxx:513
bool m_isTableOpened
a stack used to know what is open
Definition: MWAWGraphicListener.cxx:157
void insertUnicodeString(librevenge::RVNGString const &str) final
adds a unicode string
Definition: MWAWGraphicListener.cxx:323
a structure used to define a picture style
Definition: MWAWGraphicStyle.hxx:47
void insertComment(MWAWSubDocumentPtr &subDocument) final
adds comment
Definition: MWAWGraphicListener.cxx:990
const MWAWVec2f & size() const
returns the frame size
Definition: MWAWPosition.hxx:134
bool openSection(MWAWSection const §ion) final
open a section if possible
Definition: MWAWGraphicListener.cxx:955
void closeLayer()
close a layer
Definition: MWAWGraphicListener.cxx:1419
void getPageProperty(librevenge::RVNGPropertyList &pList, bool isPresentation=false) const
add the page properties in pList
Definition: MWAWPageSpan.cxx:310
Definition: MWAWPosition.hxx:55
std::vector< MWAWPageSpan > m_pageList
the pages definition
Definition: MWAWGraphicListener.cxx:87
State()
constructor
Definition: MWAWGraphicListener.cxx:176
bool insertHeader(MWAWSubDocumentPtr const &subDocument, librevenge::RVNGPropertyList const &extras) final
insert a header
Definition: MWAWGraphicListener.cxx:901
bool isSectionOpened() const final
returns true if a section is opened
Definition: MWAWGraphicListener.hxx:232
void addTo(librevenge::RVNGPropertyList &propList, std::shared_ptr< MWAWFontConverter > fontConverter) const
adds to the propList
Definition: MWAWCell.cxx:255
the global graphic state of MWAWGraphicListener
Definition: MWAWGraphicListener.cxx:65
int m_numPagesRemainingInSpan
Definition: MWAWGraphicListener.cxx:163
bool canWriteText() const final
returns true if a text zone is opened
Definition: MWAWGraphicListener.cxx:518
Definition: MWAWListener.hxx:58
MWAWPageSpan m_pageSpan
! the current page span
Definition: MWAWGraphicListener.cxx:101
void setFormLength(const double formLength)
set the total page length
Definition: MWAWPageSpan.hxx:176
int getPageSpan() const
Definition: MWAWPageSpan.hxx:168
Type getType() const
returns the type corresponding to a shape
Definition: MWAWGraphicShape.hxx:191
Definition: MWAWPosition.hxx:57
void _resetParagraphState(const bool isListElement=false)
Definition: MWAWGraphicListener.cxx:694
bool addTo(librevenge::RVNGPropertyList &propList) const
add the link property to proplist (if needed )
Definition: libmwaw_internal.cxx:415
SubDocumentType
Definition: libmwaw_internal.hxx:188
void _openParagraph()
Definition: MWAWGraphicListener.cxx:651
bool m_isFrameOpened
a flag to know if openFrame was called
Definition: MWAWGraphicListener.cxx:137
static MWAWGraphicStyle emptyStyle()
returns an empty style.
Definition: MWAWGraphicStyle.hxx:308
librevenge::RVNGDrawingInterface * m_documentInterface
the document interface
Definition: MWAWGraphicListener.hxx:300
State & operator=(const State &)=delete
bool m_isTableRowOpened
Definition: MWAWGraphicListener.cxx:158
T y() const
second element
Definition: libmwaw_internal.hxx:671
void sendHeaderFooters(MWAWListener *listener) const
send the page's headers/footers if some exists
Definition: MWAWPageSpan.cxx:283
GraphicState(std::vector< MWAWPageSpan > const &pageList)
constructor
Definition: MWAWGraphicListener.cxx:67
void setFont(MWAWFont const &font) final
sets the font
Definition: MWAWGraphicListener.cxx:366
This class contains a virtual interface to all listener.
Definition: MWAWListener.hxx:49
void insertUnicode(uint32_t character) final
adds an unicode character.
Definition: MWAWGraphicListener.cxx:310
void endDocument(bool delayed=true) final
ends the actual document
Definition: MWAWGraphicListener.cxx:480
void setFormWidth(const double formWidth)
set the total page width
Definition: MWAWPageSpan.hxx:181
Definition: MWAWGraphicShape.hxx:51
bool m_inNote
Definition: MWAWGraphicListener.cxx:167
T x() const
first element
Definition: libmwaw_internal.hxx:666
MWAWGraphicListener(MWAWParserState &parserState, std::vector< MWAWPageSpan > const &pageList, librevenge::RVNGDrawingInterface *documentInterface)
constructor
Definition: MWAWGraphicListener.cxx:208
const MWAWSection & getSection() const final
returns the actual section
Definition: MWAWGraphicListener.cxx:949
void insertField(MWAWField const &field) final
adds a field type
Definition: MWAWGraphicListener.cxx:415
Class to define the position of an object (textbox, picture, ..) in the document.
Definition: MWAWPosition.hxx:47
bool closeSection() final
close a section
Definition: MWAWGraphicListener.hxx:241
bool m_flip[2]
two bool to indicated we need to flip the shape or not
Definition: MWAWGraphicStyle.hxx:477
void openTableRow(float h, librevenge::RVNGUnit unit, bool headerRow=false) final
open a row with given height ( if h < 0.0, set min-row-height = -h )
Definition: MWAWGraphicListener.cxx:1240
bool m_isLayerOpened
a flag to know if openLayer was called
Definition: MWAWGraphicListener.cxx:148
bool isPageSpanOpened() const final
returns true if a page is opened
Definition: MWAWGraphicListener.cxx:526
Wrapping m_wrapping
Wrapping.
Definition: MWAWPosition.hxx:277
Definition: libmwaw_internal.hxx:188
void handleSubDocument(MWAWVec2f const &orig, MWAWSubDocumentPtr const &subDocument, libmwaw::SubDocumentType subDocumentType)
function called to add a subdocument and modify the origin
Definition: MWAWGraphicListener.cxx:1603
void insertTab() final
adds a tab
Definition: MWAWGraphicListener.cxx:352
double getFormWidth() const
returns the page width
Definition: MWAWPageSpan.hxx:120
Definition: libmwaw_internal.hxx:188
Definition: MWAWListener.hxx:58
a class used to recreate the table structure using cell informations, ....
Definition: MWAWTable.hxx:51
void _startSubDocument()
Definition: MWAWGraphicListener.cxx:1668
float size() const
returns the font size
Definition: MWAWFont.hxx:270
int _getListId() const
low level: find a list id which corresponds to actual list and a change of level.
Definition: MWAWGraphicListener.cxx:742
bool openLayer(librevenge::RVNGString const &name)
open a layer
Definition: MWAWGraphicListener.cxx:1392
a class which stores section properties
Definition: MWAWSection.hxx:45
Definition: libmwaw_internal.hxx:143
void insertNote(MWAWNote const ¬e, MWAWSubDocumentPtr &subDocument) final
insert a note
Definition: MWAWGraphicListener.cxx:1008
void openTable(MWAWTable const &table) final
open a table (using the last parameters of openFrame for the position )
Definition: MWAWGraphicListener.cxx:1186
void insertShape(MWAWPosition const &pos, MWAWGraphicShape const &shape, MWAWGraphicStyle const &style) final
adds a shape picture in given position
Definition: MWAWGraphicListener.cxx:1031
MWAWSection m_section
a section used to return a bad section
Definition: MWAWGraphicListener.cxx:107
int m_currentPageNumber
Definition: MWAWGraphicListener.cxx:164
const MWAWVec2f & naturalSize() const
returns the natural size (if known)
Definition: MWAWPosition.hxx:139
void setId(int newId)
sets the font id
Definition: MWAWFont.hxx:264
Definition: MWAWGraphicShape.hxx:51
~State()
destructor
Definition: MWAWGraphicListener.cxx:115
void _endSubDocument()
Definition: MWAWGraphicListener.cxx:1674
MWAWGraphicListener & operator=(const MWAWGraphicListener &)=delete
a field
Definition: libmwaw_internal.hxx:399
void insertTextBox(MWAWPosition const &pos, MWAWSubDocumentPtr const &subDocument, MWAWGraphicStyle const &style) final
adds a textbox in given position
Definition: MWAWGraphicListener.cxx:1110
void closeFrame() final
close a frame
Definition: MWAWGraphicListener.cxx:1347
bool m_isMasterPageSpanOpened
true if a masterpage is open
Definition: MWAWGraphicListener.cxx:95
void _closeListElement()
close a list level
Definition: MWAWGraphicListener.cxx:729
bool m_isTableCellOpened
Definition: MWAWGraphicListener.cxx:160
void _changeList()
update the list so that it corresponds to the actual level
Definition: MWAWGraphicListener.cxx:758
Definition: libmwaw_internal.hxx:188
MWAWFontConverterPtr m_fontConverter
the font converter
Definition: MWAWParser.hxx:74
Definition: libmwaw_internal.hxx:188
unsigned m_currentPage
Definition: MWAWGraphicListener.cxx:162
void setSize(float sz, bool isRelative=false)
sets the font size
Definition: MWAWFont.hxx:275
Type getType() const final
returns the listener type
Definition: MWAWGraphicListener.hxx:72
Definition: libmwaw_internal.hxx:188
Definition: MWAWGraphicShape.hxx:49
void _openListElement()
open a list level
Definition: MWAWGraphicListener.cxx:703
Type
the listener type
Definition: MWAWListener.hxx:56
void closeTableCell() final
close a cell
Definition: MWAWGraphicListener.cxx:1307
const MWAWPageSpan & getPageSpan() final
returns the current page span
Definition: MWAWGraphicListener.cxx:531
MWAWVec2f m_origin
the origin position
Definition: MWAWGraphicListener.cxx:125
bool m_isSpanOpened
Definition: MWAWGraphicListener.cxx:149
libmwaw::SubDocumentType m_subDocumentType
Definition: MWAWGraphicListener.cxx:169
bool m_isDocumentStarted
a flag to know if the document is open
Definition: MWAWGraphicListener.cxx:91
void startDocument() final
starts a new document
Definition: MWAWGraphicListener.cxx:469
Definition: MWAWGraphicShape.hxx:51
a class to define the parser state
Definition: MWAWParser.hxx:49
const MWAWFont & getFont() const final
returns the actual font
Definition: MWAWGraphicListener.cxx:386
bool insertFooter(MWAWSubDocumentPtr const &subDocument, librevenge::RVNGPropertyList const &extras) final
insert a footer
Definition: MWAWGraphicListener.cxx:922
const MWAWVec2f & origin() const
return the frame origin
Definition: MWAWPosition.hxx:129
bool canOpenSectionAddBreak() const final
returns true if we can add open a section, add page break, ...
Definition: MWAWGraphicListener.hxx:227
void setParagraph(MWAWParagraph const ¶graph) final
sets the paragraph
Definition: MWAWGraphicListener.cxx:396
std::vector< bool > m_listOrderedLevels
Definition: MWAWGraphicListener.cxx:155
MWAWFont m_font
the font
Definition: MWAWGraphicListener.cxx:130
bool m_isTextBoxOpened
a flag to know if we are in a textbox
Definition: MWAWGraphicListener.cxx:144
bool m_isHeaderFooterStarted
a flag to know if the header footer is started
Definition: MWAWGraphicListener.cxx:99
std::shared_ptr< MWAWList > m_list
the list of list
Definition: MWAWGraphicListener.cxx:134
Definition: MWAWPosition.hxx:51
Definition: MWAWPosition.hxx:53
void closeLink() final
close a link
Definition: MWAWGraphicListener.cxx:456
bool hasGradient(bool complex=false) const
returns true if the gradient is defined
Definition: MWAWGraphicStyle.hxx:344
MWAWFontManagerPtr m_fontManager
the font manager
Definition: MWAWParser.hxx:76
librevenge::RVNGPropertyList m_metaData
the document meta data
Definition: MWAWGraphicListener.cxx:89
const MWAWVec2f & rightBottomClipping() const
returns the right bottom clipping
Definition: MWAWPosition.hxx:149
Command addTo(MWAWVec2f const &orig, bool asSurface, librevenge::RVNGPropertyList &propList) const
updates the propList to send to an interface
Definition: MWAWGraphicShape.cxx:458
void closeGroup() final
close a group
Definition: MWAWGraphicListener.cxx:1381
Definition: MWAWPosition.hxx:57
the state of a MWAWGraphicListener
Definition: MWAWGraphicListener.cxx:111
void openLink(MWAWLink const &link) final
open a link
Definition: MWAWGraphicListener.cxx:436
bool isHeaderFooterOpened() const final
returns true if the header/footer is open
Definition: MWAWGraphicListener.cxx:896
bool m_isGroupOpened
a flag to know if openGroup was called
Definition: MWAWGraphicListener.cxx:146
bool m_inSubDocument
Definition: MWAWGraphicListener.cxx:168
librevenge::RVNGUnit unit() const
returns the unit
Definition: MWAWPosition.hxx:154
YPos m_yPos
Y relative position.
Definition: MWAWPosition.hxx:275
Definition: MWAWPosition.hxx:55
MWAWVec2< T > size() const
the box size
Definition: libmwaw_internal.hxx:1065
void _closeSpan()
Definition: MWAWGraphicListener.cxx:846
const MWAWParagraph & getParagraph() const final
returns the actual paragraph
Definition: MWAWGraphicListener.cxx:407
Definition: MWAWPosition.hxx:53
bool m_isAtLeastOnePageOpened
true if the first page has been open
Definition: MWAWGraphicListener.cxx:97
a small struct to define the script position in MWAWFont
Definition: MWAWFont.hxx:106
Definition: MWAWPosition.hxx:55
libmwaw API: main libmwaw interface header
namespace used to regroup all libwpd functions, enumerations which we have redefined for internal usa...
Definition: libmwaw_internal.cxx:50
Definition: MWAWPosition.hxx:57
std::vector< int > m_sentListMarkers
the list of marker corresponding to sent list
Definition: MWAWGraphicListener.cxx:103
bool openMasterPage(MWAWPageSpan &masterPage)
opens a master page
Definition: MWAWGraphicListener.cxx:538
AnchorTo m_anchorTo
anchor position
Definition: MWAWPosition.hxx:269
Definition: MWAWDocument.hxx:56
float m_rotate
the rotation
Definition: MWAWGraphicStyle.hxx:461
librevenge::RVNGString m_textBuffer
a buffer to stored the text
Definition: MWAWGraphicListener.cxx:127
void addTo(librevenge::RVNGPropertyList &pList, bool only1d=false) const
add all the parameters to the propList excepted the frame parameter: the background and the borders
Definition: MWAWGraphicStyle.cxx:191
void setMargins(double margin, int wh=libmwaw::LeftBit|libmwaw::RightBit|libmwaw::TopBit|libmwaw::BottomBit)
set all the margins
Definition: MWAWPageSpan.hxx:211
bool m_inLink
Definition: MWAWGraphicListener.cxx:166
void _closePageSpan(bool masterPage=false)
does close a page (low level)
Definition: MWAWGraphicListener.cxx:612
Class to store font.
Definition: MWAWFont.hxx:43
a structure used to define a cell and its format
Definition: MWAWCell.hxx:52
Internal and low level namespace to define the states of MWAWGraphicListener.
Definition: MWAWGraphicListener.cxx:62
bool addTo(librevenge::RVNGPropertyList &propList) const
add the link property to proplist (if possible)
Definition: libmwaw_internal.cxx:240
void _popParsingState()
resets the previous parsing state
Definition: MWAWGraphicListener.cxx:1700
Definition: MWAWPosition.hxx:53
Definition: libmwaw_internal.hxx:188
bool hasSurface() const
returns true if the interior surface is defined
Definition: MWAWGraphicStyle.hxx:349
void openTableCell(MWAWCell const &cell) final
open a cell
Definition: MWAWGraphicListener.cxx:1290
double getFormLength() const
returns the page length
Definition: MWAWPageSpan.hxx:115
std::vector< std::shared_ptr< MWAWGraphicListenerInternal::State > > m_psStack
stack of local state
Definition: MWAWGraphicListener.hxx:296
bool openGroup(MWAWPosition const &pos) final
open a group
Definition: MWAWGraphicListener.cxx:1356
void addTablePropertiesTo(librevenge::RVNGPropertyList &propList) const
adds the table properties to propList
Definition: MWAWTable.cxx:131
bool isInTextZone() const
returns true if we are in a text zone, ie. either in a textbox or a table cell
Definition: MWAWGraphicListener.cxx:120
bool m_isTableColumnOpened
Definition: MWAWGraphicListener.cxx:159
void closeTable() final
closes this table
Definition: MWAWGraphicListener.cxx:1226
MWAWParagraph m_paragraph
the paragraph
Definition: MWAWGraphicListener.cxx:132
void insertChar(uint8_t character) final
adds a basic character, ..
Definition: MWAWGraphicListener.cxx:242
A class which defines the page properties.
Definition: MWAWPageSpan.hxx:97
MWAWParserState & m_parserState
the parser state
Definition: MWAWGraphicListener.hxx:298
Definition: MWAWGraphicShape.hxx:51
This class contains the code needed to create Graphic document.
Definition: MWAWGraphicListener.hxx:59
void insertEOL(bool softBreak=false) final
adds an end of line ( by default an hard one)
Definition: MWAWGraphicListener.cxx:333
~MWAWGraphicListener() final
destructor
Definition: MWAWGraphicListener.cxx:235
void insertBreak(BreakType breakType) final
inserts a break type: ColumBreak, PageBreak, ..
Definition: MWAWGraphicListener.cxx:961
std::shared_ptr< MWAWGraphicListenerInternal::GraphicState > m_ds
the actual global state
Definition: MWAWGraphicListener.hxx:292
Generated on Sun Aug 18 2019 04:13:22 for libmwaw by
doxygen 1.8.16