Stroika Library 3.0d25
 
Loading...
Searching...
No Matches
StyledTextIO_RTF.h
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2026. All rights reserved
3 */
4#ifndef _Stroika_Frameworks_Led_StyledTextIO_RTF_h_
5#define _Stroika_Frameworks_Led_StyledTextIO_RTF_h_ 1
6
7#include "Stroika/Frameworks/StroikaPreComp.h"
8
9#include <map>
10#include <memory>
11#include <vector>
12
14#include "Stroika/Frameworks/Led/StyledTextIO/StyledTextIO.h"
15#include "Stroika/Frameworks/Led/Support.h"
16
17/*
18@MODULE: StyledTextIO_RTF
19@DESCRIPTION:
20 <p>The knowledge of how to read RTF is in @'StyledTextIOReader_RTF' and the knowledge of how to write RTF is in
21 @'StyledTextIOWriter_RTF'.</p>
22 */
23
24namespace Stroika::Frameworks::Led::StyledTextIO {
25
26#ifndef qStroika_Frameworks_Led_UseMapForControlWordMap
27#define qStroika_Frameworks_Led_UseMapForControlWordMap 1
28#endif
29
30 /*
31 @CLASS: RTFIO
32 @DESCRIPTION: <p>This RTFIO class serves as a (shared) scope to define some other classes used in reading/writing
33 RTF. It probably should be replaced with something using namespaces. But I wanted to make as small and
34 simple a change as possible to the old code (that used @'RTFInfo' for this purpose).</p>
35 */
36 class RTFIO {
37 public:
38 static constexpr char kRTFOpenGroupChar = '{';
39 static constexpr char kRTFCloseGroupChar = '}';
40 static constexpr char kRTFStartTagChar = '\\';
41 static constexpr char kRTFQuoteNextCharChar = '\\';
42
43 public:
44 // perhaps should be more careful to keep these sorted, so easier to find particular one...
45 enum ControlWordAtom {
46 eMinControlAtom = 0,
47
48 eControlAtom_tab = eMinControlAtom,
49 eControlAtom_bullet,
50 eControlAtom_endash,
51 eControlAtom_emdash,
52 eControlAtom_lquote,
53 eControlAtom_rquote,
54 eControlAtom_ldblquote,
55 eControlAtom_rdblquote,
56
57 eControlAtom_ansi,
58 eControlAtom_author,
59 eControlAtom_b,
60 eControlAtom_blue,
61 eControlAtom_brdrs,
62 eControlAtom_brdrth,
63 eControlAtom_brdrsh,
64 eControlAtom_brdrdb,
65 eControlAtom_brdrdot,
66 eControlAtom_brdrdash,
67 eControlAtom_brdrhair,
68 eControlAtom_brdrdashsm,
69 eControlAtom_brdrdashd,
70 eControlAtom_brdrdashdd,
71 eControlAtom_brdrtriple,
72 eControlAtom_brdrtnthsg,
73 eControlAtom_brdrthtnsg,
74 eControlAtom_brdrtnthtnsg,
75 eControlAtom_brdrtnthmg,
76 eControlAtom_brdrthtnmg,
77 eControlAtom_brdrtnthtnmg,
78 eControlAtom_brdrtnthlg,
79 eControlAtom_brdrthtnlg,
80 eControlAtom_brdrtnthtnlg,
81 eControlAtom_brdrwavy,
82 eControlAtom_brdrwavydb,
83 eControlAtom_brdrdashdotstr,
84 eControlAtom_brdremboss,
85 eControlAtom_brdrengrave,
86 eControlAtom_brdrw,
87 eControlAtom_brdrcf,
88 eControlAtom_cchs,
89 eControlAtom_cell,
90 eControlAtom_cellx,
91 eControlAtom_cf,
92 eControlAtom_clcbpat,
93 eControlAtom_cpg,
94 eControlAtom_colortbl,
95 eControlAtom_deff,
96 eControlAtom_deflang,
97 eControlAtom_deftab,
98 eControlAtom_deleted,
99 eControlAtom_dibitmap,
100 eControlAtom_dn,
101 eControlAtom_emfblip,
102 eControlAtom_f,
103 eControlAtom_fbidi,
104 eControlAtom_fcharset,
105 eControlAtom_fdecor,
106 eControlAtom_fi,
107 eControlAtom_fmodern,
108 eControlAtom_footer,
109 eControlAtom_fnil,
110 eControlAtom_fonttbl,
111 eControlAtom_fprq,
112 eControlAtom_froman,
113 eControlAtom_fs,
114 eControlAtom_fswiss,
115 eControlAtom_fscript,
116 eControlAtom_ftech,
117 eControlAtom_green,
118 eControlAtom_header,
119 eControlAtom_i,
120 eControlAtom_ilvl,
121 eControlAtom_info,
122 eControlAtom_intbl,
123 eControlAtom_jpegblip,
124 eControlAtom_li,
125 eControlAtom_line,
126 eControlAtom_listtext,
127 eControlAtom_ledprivateobjectembeddingformat,
128 eControlAtom_ls,
129 eControlAtom_mac,
130 eControlAtom_macpict,
131 eControlAtom_margb,
132 eControlAtom_margl,
133 eControlAtom_margr,
134 eControlAtom_margt,
135 eControlAtom_objdata,
136 eControlAtom_object,
137 eControlAtom_objemb,
138 eControlAtom_objh,
139 eControlAtom_objscalex,
140 eControlAtom_objscaley,
141 eControlAtom_objw,
142 eControlAtom_outl,
143 eControlAtom_paperh,
144 eControlAtom_paperw,
145 eControlAtom_par,
146 eControlAtom_pard,
147 eControlAtom_pc,
148 eControlAtom_pca,
149 eControlAtom_pich,
150 eControlAtom_pichgoal,
151 eControlAtom_picscalex,
152 eControlAtom_picscaley,
153 eControlAtom_pict,
154 eControlAtom_picw,
155 eControlAtom_picwgoal,
156 eControlAtom_plain,
157 eControlAtom_pmmetafile,
158 eControlAtom_pn,
159 eControlAtom_pngblip,
160 eControlAtom_pntext,
161 eControlAtom_qc,
162 eControlAtom_qj,
163 eControlAtom_ql,
164 eControlAtom_qr,
165 eControlAtom_red,
166 eControlAtom_result,
167 eControlAtom_ri,
168 eControlAtom_row,
169 eControlAtom_rtf,
170 eControlAtom_sa,
171 eControlAtom_sb,
172 eControlAtom_shad,
173 eControlAtom_sl,
174 eControlAtom_slmult,
175 eControlAtom_sub,
176 eControlAtom_super,
177 eControlAtom_strike,
178 eControlAtom_stylesheet,
179 eControlAtom_trleft,
180 eControlAtom_trgaph,
181 eControlAtom_trowd,
182 eControlAtom_trpaddb,
183 eControlAtom_trpaddl,
184 eControlAtom_trpaddr,
185 eControlAtom_trpaddt,
186 eControlAtom_trspdb,
187 eControlAtom_trspdl,
188 eControlAtom_trspdr,
189 eControlAtom_trspdt,
190 eControlAtom_tx,
191 eControlAtom_u,
192 eControlAtom_uc,
193 eControlAtom_ul,
194 eControlAtom_ulnone,
195 eControlAtom_up,
196 eControlAtom_v,
197 eControlAtom_wbitmap,
198 eControlAtom_wmetafile,
199
200 eControlAtomDynamicRangeStart,
201 eMaxControlAtom = 65000
202 };
203#if qStroika_Frameworks_Led_UseMapForControlWordMap
204 public:
205 enum {
206 eMaxControlAtomNameLen = 31
207 };
208 struct ControlWordAtomName {
209 ControlWordAtomName ()
210 //:fName ()
211 {
212 fName[0] = '\0';
213 }
214 ControlWordAtomName (const char* c);
215 operator char*()
216 {
217 return fName;
218 }
219 operator const char*() const
220 {
221 return fName;
222 }
223 char& operator[] (size_t i)
224 {
225 Require (i <= eMaxControlAtomNameLen);
226 return fName[i];
227 }
228 char fName[eMaxControlAtomNameLen + 1];
229 };
230
231 private:
232 struct ControlWordAtomName_less {
233 bool operator() (const ControlWordAtomName& _Left, const ControlWordAtomName& _Right) const
234 {
235 return ::strcmp (_Left, _Right) < 0;
236 }
237 };
238 using ControlWordNameMap = map<ControlWordAtomName, ControlWordAtom, ControlWordAtomName_less>;
239#else
240 private:
241 using StringNControlWordAtom = pair<string, ControlWordAtom>;
242
243 public:
244 friend bool operator< (const RTFIO::StringNControlWordAtom& lhs, const RTFIO::StringNControlWordAtom& rhs);
245
246 private:
247 struct StringNControlWordAtom_Comparator;
248 friend struct StringNControlWordAtom_Comparator;
249
250 private:
251 using ControlWordNameMap = vector<StringNControlWordAtom>;
252#endif
253 private:
254 static ControlWordNameMap sControlWordNameMap;
255
256 public:
257 static ControlWordNameMap mkDefaultControlWordNameMap ();
258
259 public:
260 static string GetAtomName (ControlWordAtom atom);
261#if qStroika_Frameworks_Led_UseMapForControlWordMap
262 static ControlWordAtom EnterControlWord (const ControlWordAtomName& controlWord);
263#else
264 static ControlWordAtom EnterControlWord (const char* controlWord);
265#endif
266
267 class ControlWord {
268 public:
269 ControlWord ();
270
271 ControlWordAtom fWord;
272 bool fHasArg;
273 long fValue;
274 };
275
276 /*
277 @CLASS: RTFIO::FontTableEntry
278 @DESCRIPTION: <p>These objects are collected together in a @'RTFIO::FontTable'.</p>
279 */
280 class FontTableEntry {
281 public:
282 FontTableEntry ();
283
284 public:
285 enum FontFamily {
286 eNil,
287 eRoman,
288 eSwiss,
289 eModern,
290 eScript,
291 eDecor,
292 eTech,
293 eBidi
294 };
295
296 public:
297 SDKString fFontName; // font name
298 int fFNum; // font number
299 FontFamily fFamily; // font family
300 uint8_t fCharSet; // font charset (from https://msdn.microsoft.com/en-us/library/windows/desktop/dd145037(v=vs.85).aspx - this is a byte)
301 int fPitch; // font pitch
302 int fCodePage; // font code page
303 };
304
305 /*
306 @CLASS: RTFIO::FontTable
307 @DESCRIPTION: <p>This object contains a vector of @'RTFIO::FontTableEntry'. This corresponds to the
308 \fonttbl RTF element. Its used to associate font numbers with names and other information.</p>
309 */
310 class FontTable {
311 public:
312 FontTable ();
313 FontTable (const vector<FontTableEntry>& fontTable);
314
315 public:
316 nonvirtual IncrementalFontSpecification GetFontSpec (int fontNumber); // throws if not present
317 nonvirtual const FontTableEntry* LookupEntryByNumber (int fontNumber); // return nullptr if not present
318 nonvirtual const FontTableEntry* LookupEntryByName (const SDKString& name); // return nullptr if not present
319 nonvirtual FontTableEntry Add (const FontTableEntry& newEntry); // ignores the fFNum, and supplies its own! - returns same entry but with revised fFNum
320 nonvirtual int FindSmallestUnusedFontNumber () const;
321
322 public:
323 vector<FontTableEntry> fEntries;
324 };
325
326 class ColorTable {
327 public:
328 ColorTable ();
329 ColorTable (const vector<Color>& colorTable);
330
331 public:
332 nonvirtual Color LookupColor (size_t colorNumber) const; // throws if not present
333 nonvirtual size_t LookupColor (const Color& color) const; // asserts if not present
334 nonvirtual size_t EnterColor (const Color& color); // LookupColor, and if not present, add it. Either way, return index
335
336 public:
337 vector<Color> fEntries;
338 };
339
340 /*
341 @CLASS: RTFIO::ListTableEntry
342 @DESCRIPTION: <p>These objects are collected together in a @'RTFIO::ListTables'.</p>
343 */
344 class ListTableEntry {
345 public:
346 ListTableEntry ();
347
348 public:
349 int fListID; // \listidN
350 int fListTemplateID; // \listtemplateidN
351 ListStyle fListStyle; // \levelnfcN
352 int fFontID; // must be dynamicly specified based on current font table
353 };
354
355 /*
356 @CLASS: RTFIO::ListOverrideTableEntry
357 @DESCRIPTION: <p>These objects are collected together in a @'RTFIO::ListTables'.</p>
358 */
359 class ListOverrideTableEntry {
360 public:
361 ListOverrideTableEntry ();
362
363 public:
364 int fListID; // \listidN
365 };
366
367 /*
368 @CLASS: RTFIO::ListTables
369 @DESCRIPTION: <p>This object contains a vector of @'RTFIO::ListTableEntry'. This corresponds to the
370 \listtable RTF element. It also contains a vector of @'RTFIO::ListOverrideTableEntry' entries. These
371 map to \listoverridetable entries. See the RTF 1.5 (or later) spec.</p>
372 */
373 class ListTables {
374 public:
375 ListTables ();
376 ListTables (const vector<ListTableEntry>& listTableEntries, const vector<ListOverrideTableEntry>& listOverrideTableEntries);
377
378 public:
379 vector<ListTableEntry> fEntries;
380 vector<ListOverrideTableEntry> fOverrideEntries;
381 };
382
383#if qStroika_Frameworks_Led_SupportGDI
384 static const Led_PrivateEmbeddingTag kRTFBodyGroupFragmentEmbeddingTag;
385 static const Led_ClipFormat kRTFBodyGroupFragmentClipFormat;
386
387 // Just use UnknownObject as a tmp hack for these RTF embeddings
388 using UnknownRTFEmbedding = StandardUnknownTypeStyleMarker;
389
390 class RTFOLEEmbedding {
391 public:
392 static const Led_PrivateEmbeddingTag kEmbeddingTag;
393
394 virtual void PostCreateSpecifyExtraInfo (TWIPS_Point size) = 0;
395 virtual SDKString GetObjClassName () const = 0;
396 virtual void DoWriteToOLE1Stream (size_t* nBytes, byte** resultData) = 0;
397 virtual Led_Size GetSize () = 0;
398 };
399#endif
400 };
401
402 /*
403 @CLASS: RTFInfo
404 @DESCRIPTION: <p>This RTFInfo class is designed to capture any extra information about the RTF file
405 you might want to keep track of, as a side-effect of reading it in (beyond simply
406 the things which Led supports). For example, if you wanted to keep track of the
407 original character set, the author, or the original style sheet information, this
408 would be a good place to store those things.</p>
409 <p>NB: This class used to contain all the definitions name contained in @'RTFIO'.</p>
410 */
411 class RTFInfo {
412 public:
413 RTFInfo ();
414
415 public:
416 static TWIPS GetStaticDefaultTabStopWidth ();
417
418 public:
419 TWIPS fDefaultTabStop;
420
421 public:
422 nonvirtual TWIPS GetDefaultTabStop () const;
423
424 public:
425 static TWIPS_Point GetStaticDefaultPaperSize ();
426
427 public:
428 TWIPS_Point fDefaultPaperSize;
429
430 public:
431 static void GetStaticDefaultMargins (TWIPS* t, TWIPS* l, TWIPS* b, TWIPS* r);
432
433 public:
434 TWIPS fDefaultMarginTop;
435 TWIPS fDefaultMarginLeft;
436 TWIPS fDefaultMarginBottom;
437 TWIPS fDefaultMarginRight;
438
439 public:
440 nonvirtual TWIPS GetEffectiveDrawingWidth () const;
441 };
442
443 /*
444 @CLASS: StyledTextIOReader_RTF
445 @BASES: @'StyledTextIOReader'
446 @DESCRIPTION: <p>This is the class you construct to read in content as RTF-formatted text. You
447 must specify SrcStream of input data (usually a file, or a clipboard record), and a
448 SinkStream (usually a text buffer) to write to.</p>
449 <p>Then call @'StyledTextIOReader_RTF::Read' () to get the actual reading done.</p>
450 */
451 class StyledTextIOReader_RTF : public StyledTextIOReader {
452 public:
453 StyledTextIOReader_RTF (SrcStream* srcStream, SinkStream* sinkStream, RTFInfo* rtfInfo = nullptr);
454 ~StyledTextIOReader_RTF ();
455
456 private:
457 using inherited = StyledTextIOReader;
458
459 public:
460 virtual void Read () override;
461 virtual bool QuickLookAppearsToBeRightFormat () override;
462
463 public:
464 nonvirtual FontSpecification GetPlainFont () const;
465 nonvirtual void SetPlainFont (const FontSpecification& fsp);
466
467 private:
468 FontSpecification fPlainFont;
469
470 public:
471 class ReaderContext;
472
473 protected:
474 virtual void ReadGroup (ReaderContext& readerContext); // must be looking at a kRTFOpenGroupChar
475
476 protected:
477 struct SpecialCharMappings {
478 RTFIO::ControlWordAtom fControlWordName;
479 wchar_t fUNICODECharacter;
480 };
481 static const SpecialCharMappings kMappings[8];
482
483 public:
484 nonvirtual Led_tChar GetDefaultUnsupportedCharacterChar () const;
485
486 protected:
487 Led_tChar fDefaultUnsupportedCharacterChar;
488
489 protected:
490 virtual RTFIO::ControlWord ReadControlWord (); // must be looking at a kRTFStartTagChar
491 // HandleControlWord () returns true if it read to end (and consumed end) of current group
492 virtual bool HandleControlWord (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
493 virtual bool HandlePossibleSpecialCharacterControlWord (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
494 virtual void ReadCommentGroup (ReaderContext& readerContext);
495
496 protected:
497 virtual void ReadIn_pn_Group (ReaderContext& readerContext);
498
499 protected:
500 virtual bool HandleControlWord_ansi (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
501 virtual bool HandleControlWord_author (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
502 virtual bool HandleControlWord_b (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
503 virtual bool HandleControlWord_brdrXXX (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
504 virtual bool HandleControlWord_cchs (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
505 virtual bool HandleControlWord_cell (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
506 virtual bool HandleControlWord_cellx (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
507 virtual bool HandleControlWord_cf (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
508 virtual bool HandleControlWord_clcbpat (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
509 virtual bool HandleControlWord_cpg (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
510 virtual bool HandleControlWord_colortbl (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
511 virtual bool HandleControlWord_deff (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
512 virtual bool HandleControlWord_deftab (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
513 virtual bool HandleControlWord_deleted (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
514 virtual bool HandleControlWord_dn (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
515 virtual bool HandleControlWord_f (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
516 virtual bool HandleControlWord_fonttbl (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
517 virtual bool HandleControlWord_footer (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
518 virtual bool HandleControlWord_fi (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
519 virtual bool HandleControlWord_fs (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
520 virtual bool HandleControlWord_header (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
521 virtual bool HandleControlWord_i (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
522 virtual bool HandleControlWord_ilvl (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
523 virtual bool HandleControlWord_info (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
524 virtual bool HandleControlWord_intbl (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
525 virtual bool HandleControlWord_li (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
526 virtual bool HandleControlWord_line (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
527 virtual bool HandleControlWord_listtext (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
528 virtual bool HandleControlWord_ls (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
529 virtual bool HandleControlWord_mac (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
530 virtual bool HandleControlWord_margX (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
531 virtual bool HandleControlWord_object (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
532 virtual bool HandleControlWord_outl (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
533 virtual bool HandleControlWord_paperX (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
534 virtual bool HandleControlWord_par (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
535 virtual bool HandleControlWord_pard (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
536 virtual bool HandleControlWord_pc (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
537 virtual bool HandleControlWord_pca (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
538 virtual bool HandleControlWord_pict (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
539 virtual bool HandleControlWord_plain (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
540 virtual bool HandleControlWord_pntext (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
541 virtual bool HandleControlWord_qc (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
542 virtual bool HandleControlWord_qj (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
543 virtual bool HandleControlWord_ql (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
544 virtual bool HandleControlWord_qr (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
545 virtual bool HandleControlWord_ri (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
546 virtual bool HandleControlWord_row (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
547 virtual bool HandleControlWord_rtf (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
548 virtual bool HandleControlWord_sa (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
549 virtual bool HandleControlWord_sb (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
550 virtual bool HandleControlWord_shad (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
551 virtual bool HandleControlWord_sl (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
552 virtual bool HandleControlWord_slmult (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
553 virtual bool HandleControlWord_sub (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
554 virtual bool HandleControlWord_super (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
555 virtual bool HandleControlWord_strike (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
556 virtual bool HandleControlWord_stylesheet (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
557 virtual bool HandleControlWord_trleft (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
558 virtual bool HandleControlWord_trgaph (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
559 virtual bool HandleControlWord_trowd (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
560 virtual bool HandleControlWord_trpaddX (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
561 virtual bool HandleControlWord_trspdX (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
562 virtual bool HandleControlWord_tx (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
563 virtual bool HandleControlWord_u (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
564 virtual bool HandleControlWord_uc (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
565 virtual bool HandleControlWord_ul (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
566 virtual bool HandleControlWord_ulnone (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
567 virtual bool HandleControlWord_up (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
568 virtual bool HandleControlWord_v (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
569
570 virtual bool HandleControlWord_UnknownControlWord (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
571
572 protected:
573 nonvirtual void CheckIfAboutToStartBody (ReaderContext& readerContext);
574 virtual void AboutToStartBody (ReaderContext& readerContext);
575
576 protected:
577 virtual RTFIO::FontTableEntry ReadInFontTablesEntry ();
578 virtual void ReadInObjectSubGroupEntry (ReaderContext& readerContext, vector<char>* data, size_t* resultFoundAt);
579 virtual void ReadObjData (vector<char>* data);
580 virtual void ConstructOLEEmebddingFromRTFInfo (ReaderContext& readerContext, TWIPS_Point size, size_t nBytes, const void* data);
581 virtual void ConstructLedEmebddingFromRTFInfo (ReaderContext& readerContext, size_t nBytes, const void* data);
582
583 protected:
584 enum ImageFormat {
585 eEMF, // enhanced meta file
586 ePNG, // portable network graphix file
587 eJPEG,
588 eMacPICT,
589 ePMMetaFile, // OS/2 meta file
590 eWMF, // Windows meta file
591 eDIB,
592 eBITMAP, // device dependent bitmap
593 eDefaultImageFormat = eBITMAP // according to RTF 1.5 spec - "The \wbitmap control word is optional. If no other picture type is specified, the picture is assumed to be a Windows bitmap"
594 };
595 virtual void ReadPictData (vector<char>* data);
596 virtual void ReadTopLevelPictData (TWIPS_Point* shownSize, ImageFormat* imageFormat, TWIPS_Point* bmSize, vector<char>* objData);
597 virtual Led_DIB* ConstructDIBFromData (TWIPS_Point shownSize, ImageFormat imageFormat, TWIPS_Point bmSize, size_t nBytes, const void* data);
598#if qStroika_Platform_Windows
599 virtual Led_DIB* ConstructDIBFromEMFHelper (TWIPS_Point shownSize, TWIPS_Point bmSize, const HENHMETAFILE hMF);
600#endif
601
602 protected:
603 virtual void ApplyFontSpec (ReaderContext& readerContext, const RTFIO::ControlWord& cw);
604
605 // utility functions to help reading/low level scanning rtf
606 protected:
607 nonvirtual unsigned char GetNextRTFHexByte () const;
608 nonvirtual string ReadInGroupAndSave ();
609 nonvirtual void SkipToEndOfCurrentGroup ();
610 nonvirtual void ScanForwardFor (const char* setOfChars); // stop when next char is a member of 'setOfChars'
611 // (nb: doesn't look at current/prev chars - just FOLLOWING ones
612 // (at eof returns no error, but does return)
613 nonvirtual bool SearchForwardFor (const char* searchFor, size_t maxCharsToExamine = size_t (-1));
614
615 protected:
616 nonvirtual Color LookupColor (ReaderContext& readerContext, size_t index) const;
617
618 public:
619 nonvirtual RTFInfo& GetRTFInfo () const;
620
621 private:
622 RTFInfo* fRTFInfo;
623 bool fOwnRTFInfo;
624
625#if qStroika_Platform_Windows
626 private:
627 FontSpecification::FontSize fCachedFontSize; // Keep these as a speedtweek - SetPointSize() expensive on WIN32
628 long fCachedFontSizeTMHeight;
629#endif
630 };
631
632 /*
633 @CLASS: StyledTextIOReader_RTF::ReaderContext
634 @DESCRIPTION: <p>This context object is used during the process of reading RTF text from a source, and
635 internalizing it into internal format. It is used to keep track of various document context information,
636 like character sets, etc.</p>
637 */
638 class StyledTextIOReader_RTF::ReaderContext {
639 public:
640 ReaderContext (StyledTextIOReader_RTF& reader);
641 ~ReaderContext ();
642
643 public:
644 nonvirtual StyledTextIOReader_RTF& GetReader () const;
645
646 private:
647 StyledTextIOReader_RTF& fReader;
648
649 public:
650 CodePage fDocumentCharacterSet;
651 int fDefaultFontNumber{-1}; // -1 ==> none specified
652 bool fStartedBodyYet{false};
653
654 public:
655 nonvirtual CodePage GetCurrentInputCharSetEncoding () const;
656 nonvirtual void UseInputCharSetEncoding (CodePage codePage);
657
658 private:
659 CodePage fCurrentInputCharSetEncoding_;
660 char fMultiByteInputCharBuf[2];
661
662 public:
663 size_t fUnicodeUCValue{1}; // support for \u and \uc RTF tags
664 size_t fSkipNextNChars_UC{0};
665
666 public:
667 nonvirtual void PutRawCharToDestination (char c);
668
669 public:
670 size_t fHiddenTextStart{static_cast<size_t> (-1)}; // -1 => NOT in a hidden text block, and otherwise its the start of the block.
671
672 public:
673 /*
674 * Support for RTF destinations.
675 */
676 class Destination_;
677 class SinkStreamDestination;
678
679 public:
680 nonvirtual Destination_& GetDestination () const;
681 virtual void SetDestination (Destination_* destination);
682
683 private:
684 Destination_* fCurrentDestination{nullptr};
685
686 public:
687 unique_ptr<Destination_> fDefaultDestination;
688
689 public:
690 class GroupContext;
691
692 public:
693 nonvirtual GroupContext* GetCurrentGroupContext () const; // can be nullptr
694 nonvirtual GroupContext* GetParentGroupContext () const; // can be nullptr
695 private:
696 GroupContext* fCurrentGroup{nullptr};
697
698 friend class GroupContext;
699
700 public:
701 RTFIO::FontTable* fFontTable{nullptr};
702 RTFIO::ColorTable* fColorTable{nullptr};
703 };
704
705 /**
706 */
707 class StyledTextIOReader_RTF::ReaderContext::Destination_ {
708 protected:
709 Destination_ () = default;
710
711 public:
712 virtual ~Destination_ () = default;
713
714 public:
715 /**
716 */
717 struct Context {
718 Context () = default;
719
720 IncrementalFontSpecification fFontSpec{};
721 StandardTabStopList fTabStops{StandardTabStopList{RTFInfo::GetStaticDefaultTabStopWidth ()}};
722 Justification fJustification{eLeftJustify};
723 TWIPS fSpaceBefore{TWIPS{0}};
724 TWIPS fSpaceAfter{TWIPS{0}};
725 CoordinateType fSpaceBetweenLines{1000};
726 bool fSpaceBetweenLinesMult{true};
727 ListStyle fListStyle{eListStyle_None};
728 unsigned char fListIndentLevel{0};
729 TWIPS fFirstIndent{TWIPS{0}};
730 TWIPS fLeftMargin{TWIPS{0}};
731 TWIPS fRightMargin{TWIPS{0}};
732 bool fTextHidden{false};
733 };
734
735 public:
736 virtual void AppendText (const Led_tChar* text, size_t nTChars) = 0;
737#if qStroika_Frameworks_Led_SupportGDI
738 virtual void AppendEmbedding (SimpleEmbeddedObjectStyleMarker* embedding) = 0;
739#endif
740 virtual void AppendSoftLineBreak () = 0;
741 virtual void EndParagraph () = 0;
742 virtual void UseFont (const IncrementalFontSpecification& fontSpec) = 0;
743 virtual void SetJustification (Justification justification) = 0;
744 virtual void SetTabStops (const StandardTabStopList& tabStops) = 0;
745 virtual void SetFirstIndent (TWIPS tx) = 0;
746 virtual void SetLeftMargin (TWIPS lhs) = 0;
747 virtual void SetRightMargin (TWIPS rhs) = 0;
748 virtual void SetSpaceBefore (TWIPS tx) = 0;
749 virtual void SetSpaceAfter (TWIPS tx) = 0;
750 virtual void SetSpaceBetweenLines (CoordinateType tx) = 0;
751 virtual void SetSpaceBetweenLinesMult (bool multipleLineSpacing) = 0;
752 virtual void SetTextHidden (bool hidden) = 0;
753 virtual void SetInTable (bool inTable) = 0;
754 virtual void EndRow (bool forceEmit = false) = 0;
755 virtual void EndCell (bool forceEmit = false) = 0;
756 virtual void SetListStyle (ListStyle listStyle) = 0;
757 virtual void SetListIndentLevel (unsigned char indentLevel) = 0;
758 virtual void SetTableBorderColor (Color c) = 0;
759 virtual void SetCellX (TWIPS cellx) = 0;
760 virtual void SetCellBackColor (const Color& c) = 0;
761 virtual void Call_trowd () = 0;
762 virtual void Set_trleft (TWIPS t) = 0;
763 virtual void SetDefaultCellMarginsForRow_top (TWIPS t) = 0;
764 virtual void SetDefaultCellMarginsForRow_left (TWIPS t) = 0;
765 virtual void SetDefaultCellMarginsForRow_bottom (TWIPS t) = 0;
766 virtual void SetDefaultCellMarginsForRow_right (TWIPS t) = 0;
767 virtual void SetDefaultCellSpacingForRow_top (TWIPS t) = 0;
768 virtual void SetDefaultCellSpacingForRow_left (TWIPS t) = 0;
769 virtual void SetDefaultCellSpacingForRow_bottom (TWIPS t) = 0;
770 virtual void SetDefaultCellSpacingForRow_right (TWIPS t) = 0;
771
772 public:
773 virtual void Flush () = 0;
774 virtual void Done () = 0;
775
776 public:
777 virtual Context GetContext () const = 0;
778 virtual void SetContext (const Context& c) = 0;
779 };
780
781 /*
782 @CLASS: StyledTextIOReader_RTF::ReaderContext::SinkStreamDestination
783 @BASES: @'StyledTextIOReader_RTF::ReaderContext::Destination_'
784 @DESCRIPTION:
785 */
786 class StyledTextIOReader_RTF::ReaderContext::SinkStreamDestination : public StyledTextIOReader_RTF::ReaderContext::Destination_ {
787 public:
788 using SinkStream = StyledTextIOReader::SinkStream;
789
790 public:
791 SinkStreamDestination (StyledTextIOReader_RTF& reader);
792 ~SinkStreamDestination ();
793
794 public:
795 virtual void AppendText (const Led_tChar* text, size_t nTChars) override;
796#if qStroika_Frameworks_Led_SupportGDI
797 virtual void AppendEmbedding (SimpleEmbeddedObjectStyleMarker* embedding) override;
798#endif
799 virtual void AppendSoftLineBreak () override;
800 virtual void EndParagraph () override;
801 virtual void UseFont (const IncrementalFontSpecification& fontSpec) override;
802 virtual void SetJustification (Justification justification) override;
803 virtual void SetTabStops (const StandardTabStopList& tabStops) override;
804 virtual void SetFirstIndent (TWIPS tx) override;
805 virtual void SetLeftMargin (TWIPS lhs) override;
806 virtual void SetRightMargin (TWIPS rhs) override;
807 virtual void SetSpaceBefore (TWIPS tx) override;
808 virtual void SetSpaceAfter (TWIPS tx) override;
809 virtual void SetSpaceBetweenLines (CoordinateType tx) override;
810 virtual void SetSpaceBetweenLinesMult (bool multipleLineSpacing) override;
811 virtual void SetTextHidden (bool hidden) override;
812 virtual void SetInTable (bool inTable) override;
813 virtual void EndRow (bool forceEmit = false) override;
814 virtual void EndCell (bool forceEmit = false) override;
815 virtual void SetListStyle (ListStyle listStyle) override;
816 virtual void SetListIndentLevel (unsigned char indentLevel) override;
817 virtual void SetTableBorderColor (Color c) override;
818 virtual void SetCellX (TWIPS cellx) override;
819 virtual void SetCellBackColor (const Color& c) override;
820 virtual void Call_trowd () override;
821 virtual void Set_trleft (TWIPS t) override;
822 virtual void SetDefaultCellMarginsForRow_top (TWIPS t) override;
823 virtual void SetDefaultCellMarginsForRow_left (TWIPS t) override;
824 virtual void SetDefaultCellMarginsForRow_bottom (TWIPS t) override;
825 virtual void SetDefaultCellMarginsForRow_right (TWIPS t) override;
826 virtual void SetDefaultCellSpacingForRow_top (TWIPS t) override;
827 virtual void SetDefaultCellSpacingForRow_left (TWIPS t) override;
828 virtual void SetDefaultCellSpacingForRow_bottom (TWIPS t) override;
829 virtual void SetDefaultCellSpacingForRow_right (TWIPS t) override;
830
831 private:
832 nonvirtual void AssureTableOpen ();
833 nonvirtual void DoStartRow ();
834 nonvirtual void DoStartCell ();
835 nonvirtual void DoEndTable ();
836
837 public:
838 virtual void Flush () override;
839 virtual void Done () override;
840
841 public:
842 virtual Context GetContext () const override;
843 virtual void SetContext (const Context& c) override;
844
845 private:
846 nonvirtual void ApplyContext (const Context& c);
847
848 public:
849 nonvirtual size_t current_offset () const;
850 nonvirtual void InsertMarker (Marker* m, size_t at, size_t length, MarkerOwner* markerOwner);
851
852 private:
853 nonvirtual void AppendText_ (const Led_tChar* text, size_t nTChars);
854 nonvirtual void AboutToChange () const;
855 nonvirtual void FlushSetContextCalls () const;
856 nonvirtual void FlushParaEndings () const;
857
858 private:
859 SinkStream& fSinkStream;
860 RTFInfo& fRTFInfo;
861 //StyledTextIOReader_RTF& fReader;
862 Context fCurrentContext{};
863 Context fNewContext{};
864 mutable bool fNewContextPending{false};
865 Led_tChar fSmallBuffer[8 * 1024]; // buffer is simply a performance hack...
866 size_t fTCharsInSmallBuffer{0};
867 mutable bool fParaEndedFlag{false};
868
869 // RETHINK - MAYBE DON'T NEED???
870 mutable bool fParaEndBeforeNewContext{false}; // SPR#0968 - if we get BOTH delayed paraend and delayed setcontext call, AND
871 // finally have to flush - then we need to preserve the ordering with a flag
872 private:
873 bool fInTable{false};
874 bool fTableOpen{false};
875 size_t fTableNextRowNum{0};
876 bool fTableInRow{false}; // true if we've started a row; false if row just ended and not sure if there will be another
877 size_t fTableNextCellNum{0};
878 bool fTableInCell{false}; // ditto - except for cells
879
880 private:
881 struct CellInfo {
882 CellInfo ();
883 TWIPS f_cellx;
884 Color f_clcbpat;
885 size_t fColSpan;
886 };
887 CellInfo fNextCellInfo; // place to store up info (like clcbpat) til we get the terminating \cellx
888 private:
889 struct RowInfo {
890 RowInfo ();
891 TWIPS f_trrh;
892 TWIPS f_trleft;
893 TWIPS_Rect fDefaultCellMargins; // Not REALLY a rect - just a handy way to store 4 values... and OK since its private - not part of API
894 TWIPS_Rect fDefaultCellSpacing; // ''
895 vector<CellInfo> fCellInfosForThisRow;
896 };
897 RowInfo fThisRow;
898 };
899
900 /*
901 @CLASS: StyledTextIOReader_RTF::ReaderContext::GroupContext
902 @DESCRIPTION: <p>Helper class to implement nested scopes where we save/restore font info while reading</p>
903 */
904 class StyledTextIOReader_RTF::ReaderContext::GroupContext {
905 public:
906 GroupContext (ReaderContext& readerContext);
907 ~GroupContext ();
908
909 private:
910 GroupContext (const GroupContext&) = delete;
911 GroupContext& operator= (const GroupContext&) = delete;
912
913 private:
914 ReaderContext& fReaderContext;
915 GroupContext* fParentGroup;
916
917 public:
918 size_t fCurrentGroupStartIdx;
919 CodePage fCurrentCodePage;
920 CodePage fCCHSCodePage;
921 Destination_::Context fDestinationContext;
922
923 private:
924 friend class StyledTextIOReader_RTF::ReaderContext;
925 };
926
927 /*
928 @CLASS: StyledTextIOWriter_RTF
929 @BASES: @'StyledTextIOWriter'
930 @DESCRIPTION:
931 */
932 class StyledTextIOWriter_RTF : public StyledTextIOWriter {
933 public:
934 StyledTextIOWriter_RTF (SrcStream* srcStream, SinkStream* sinkStream, RTFInfo* rtfInfo = nullptr);
935 ~StyledTextIOWriter_RTF ();
936
937 public:
938 virtual void Write () override;
939
940 public:
941 nonvirtual CodePage GetCurrentOutputCharSetEncoding () const;
942 nonvirtual void UseOutputCharSetEncoding (CodePage codePage);
943
944 private:
945 CodePage fCurrentOutputCharSetEncoding;
946
947 public:
948 nonvirtual const vector<pair<string, wchar_t>>& GetCharactersSavedByName () const;
949 nonvirtual void SetCharactersSavedByName (const vector<pair<string, wchar_t>>& charactersSavedByName);
950
951 private:
952 vector<pair<string, wchar_t>> fCharactersSavedByName;
953 map<string, wchar_t> fCharactersSavedByName_Name2Char;
954 map<wchar_t, string> fCharactersSavedByName_Char2Name;
955
956 protected:
957 class WriterContext;
958
959 public:
960 using Table = StyledTextIOWriter::SrcStream::Table;
961
962 protected:
963 virtual void WriteHeader (WriterContext& writerContext);
964 virtual void WriteBody (WriterContext& writerContext);
965 virtual void WriteBodyCharacter (WriterContext& writerContext, Led_tChar c);
966 nonvirtual void WritePlainUnicodeCharCharacterHelper (wchar_t c);
967 nonvirtual void WriteHexCharHelper (unsigned char c);
968 virtual void WriteStartParagraph (WriterContext& writerContext);
969 virtual void WriteTable (WriterContext& writerContext, Table* table);
970#if qStroika_Frameworks_Led_SupportGDI
971 virtual bool PossiblyWriteUnknownRTFEmbedding (WriterContext& writerContext, SimpleEmbeddedObjectStyleMarker* embedding);
972 virtual bool PossiblyWriteOLERTFEmbedding (WriterContext& writerContext, SimpleEmbeddedObjectStyleMarker* embedding);
973 virtual bool PossiblyWritePICTEmbedding (WriterContext& writerContext, SimpleEmbeddedObjectStyleMarker* embedding);
974 virtual void WritePrivatLedEmbedding (WriterContext& writerContext, SimpleEmbeddedObjectStyleMarker* embedding);
975#endif
976 virtual void WriteTag (const char* tagStr);
977 virtual void WriteTagNValue (const char* tagStr, int value);
978 virtual void WriteHexCharDataBlock (size_t nBytes, const void* resultData);
979 nonvirtual void WriteRTFHexByte (unsigned char theByte);
980
981 protected:
982 virtual void WriteDocCharset ();
983 virtual void WriteFontTable (WriterContext& writerContext);
984 virtual void WriteFontTablesEntry (const RTFIO::FontTableEntry& entry);
985 virtual void WriteColorTable (WriterContext& writerContext);
986 virtual void WriteListTable ();
987 virtual void WriteListTablesEntry (const RTFIO::ListTableEntry& entry);
988 virtual void WriteListOverrideTablesEntry (const RTFIO::ListOverrideTableEntry& oEntry);
989 virtual void WriteGenerator ();
990
991 protected:
992 virtual void EmitBodyFontInfoChange (WriterContext& writerContext, const FontSpecification& newOne);
993 virtual void EmitBodyFontInfoChange (WriterContext& writerContext, const FontSpecification& newOne, const FontSpecification& oldOne);
994
995 protected:
996 virtual void AssureColorTableBuilt (WriterContext& writerContext);
997 virtual void AssureFontTableBuilt (WriterContext& writerContext);
998 virtual void AssureStyleRunSummaryBuilt (WriterContext& writerContext);
999 virtual void AssureListTableBuilt (WriterContext& writerContext);
1000
1001 private:
1002 RTFInfo* fRTFInfo{nullptr};
1003
1004 protected:
1005 RTFIO::FontTable* fFontTable{nullptr};
1006 RTFIO::ColorTable* fColorTable{nullptr};
1007 RTFIO::ListTables* fListTable{nullptr};
1008 CodePage fDocumentCharacterSet;
1009 vector<StyledInfoSummaryRecord> fStyleRunSummary;
1010 const Led_tChar fSoftLineBreakChar;
1011 DiscontiguousRun<bool> fHidableTextRuns;
1012 };
1013
1014 /*
1015 @CLASS: StyledTextIOWriter_RTF::WriterContext
1016 @DESCRIPTION:
1017 */
1018 class StyledTextIOWriter_RTF::WriterContext {
1019 public:
1020 WriterContext (StyledTextIOWriter_RTF& writer);
1021 WriterContext (WriterContext& parentContext, SrcStream& srcStream);
1022
1023 public:
1024 nonvirtual StyledTextIOWriter_RTF& GetWriter () const;
1025
1026 private:
1027 StyledTextIOWriter_RTF& fWriter;
1028
1029 public:
1030 nonvirtual SrcStream& GetSrcStream () const;
1031 nonvirtual SinkStream& GetSinkStream () const;
1032
1033 public:
1034 using Table = StyledTextIOWriter::SrcStream::Table;
1035
1036 public:
1037 virtual size_t GetCurSrcOffset () const;
1038#if qStroika_Frameworks_Led_SupportGDI
1039 virtual SimpleEmbeddedObjectStyleMarker* GetCurSimpleEmbeddedObjectStyleMarker () const;
1040#endif
1041 virtual Table* GetCurRTFTable () const;
1042
1043 public:
1044 bool fInTable;
1045 StyledTextIOWriter_RTF::SrcStream& fSrcStream;
1046 StyledInfoSummaryRecord fLastEmittedISR;
1047 size_t fNextStyleChangeAt;
1048 size_t fIthStyleRun;
1049 size_t fNextHidableTextChangeAt;
1050 bool fHidableTextRegionOpen;
1051 size_t fIthHidableTextRun;
1052 size_t fCharsToSkip;
1053 };
1054
1055 /*
1056 ********************************************************************************
1057 ***************************** Implementation Details ***************************
1058 ********************************************************************************
1059 */
1060// class RTFIO::StringNControlWordAtom
1061#if !qStroika_Frameworks_Led_UseMapForControlWordMap
1062 inline bool operator< (const RTFIO::StringNControlWordAtom& lhs, const RTFIO::StringNControlWordAtom& rhs)
1063 {
1064 return lhs.first < rhs.first;
1065 }
1066#endif
1067
1068 // class RTFIO::ControlWord
1069 inline RTFIO::ControlWord::ControlWord ()
1070 : fWord (eMinControlAtom)
1071 , fHasArg (false)
1072 , fValue (0)
1073 {
1074 }
1075
1076 // class RTFInfo
1077 inline TWIPS RTFInfo::GetStaticDefaultTabStopWidth ()
1078 {
1079 return TWIPS (720); // default to 1/2 inch - RTF spec default
1080 }
1081 inline TWIPS RTFInfo::GetDefaultTabStop () const
1082 {
1083 return fDefaultTabStop;
1084 }
1085 inline TWIPS_Point RTFInfo::GetStaticDefaultPaperSize ()
1086 {
1087 // From RTFSpec 1.4
1088 return TWIPS_Point (TWIPS (11 * 1440), TWIPS (static_cast<long> (8.5 * 1440)));
1089 }
1090 inline void RTFInfo::GetStaticDefaultMargins (TWIPS* t, TWIPS* l, TWIPS* b, TWIPS* r)
1091 {
1092 RequireNotNull (t);
1093 RequireNotNull (l);
1094 RequireNotNull (b);
1095 RequireNotNull (r);
1096 *t = TWIPS (1440);
1097 *l = TWIPS (1800);
1098 *b = TWIPS (1440);
1099 *r = TWIPS (1800);
1100 }
1101 inline RTFInfo::RTFInfo ()
1102 : fDefaultTabStop (GetStaticDefaultTabStopWidth ())
1103 , fDefaultPaperSize (GetStaticDefaultPaperSize ())
1104 , fDefaultMarginTop (0)
1105 , fDefaultMarginLeft (0)
1106 , fDefaultMarginBottom (0)
1107 , fDefaultMarginRight (0)
1108 {
1109 GetStaticDefaultMargins (&fDefaultMarginTop, &fDefaultMarginLeft, &fDefaultMarginBottom, &fDefaultMarginRight);
1110 }
1111 inline TWIPS RTFInfo::GetEffectiveDrawingWidth () const
1112 {
1113 TWIPS subtract = TWIPS (fDefaultMarginLeft + fDefaultMarginRight);
1114 Ensure (fDefaultPaperSize.h > subtract);
1115 return TWIPS (fDefaultPaperSize.h - subtract);
1116 }
1117
1118 // class StyledTextIOReader_RTF
1119 inline Led_tChar StyledTextIOReader_RTF::GetDefaultUnsupportedCharacterChar () const
1120 {
1121 return fDefaultUnsupportedCharacterChar;
1122 }
1123
1124 // class StyledTextIOReader_RTF::ReaderContext
1125 inline StyledTextIOReader_RTF& StyledTextIOReader_RTF::ReaderContext::GetReader () const
1126 {
1127 return fReader;
1128 }
1129 inline CodePage StyledTextIOReader_RTF::ReaderContext::GetCurrentInputCharSetEncoding () const
1130 {
1131 return fCurrentInputCharSetEncoding_;
1132 }
1133 inline StyledTextIOReader_RTF::ReaderContext::Destination_& StyledTextIOReader_RTF::ReaderContext::GetDestination () const
1134 {
1135 EnsureNotNull (fCurrentDestination);
1136 return (*fCurrentDestination);
1137 }
1138 inline void StyledTextIOReader_RTF::ReaderContext::SetDestination (Destination_* destination)
1139 {
1140 fCurrentDestination = destination;
1141 }
1142 inline StyledTextIOReader_RTF::ReaderContext::GroupContext* StyledTextIOReader_RTF::ReaderContext::GetCurrentGroupContext () const
1143 {
1144 return fCurrentGroup; // Can be nullptr
1145 }
1146 inline StyledTextIOReader_RTF::ReaderContext::GroupContext* StyledTextIOReader_RTF::ReaderContext::GetParentGroupContext () const
1147 {
1148 // Can return nullptr
1149 if (fCurrentGroup != nullptr) {
1150 return fCurrentGroup->fParentGroup;
1151 }
1152 return nullptr;
1153 }
1154
1155 // class StyledTextIOReader_RTF::ReaderContext::SinkStreamDestination
1156 //NOTHING INLINE
1157
1158 // class StyledTextIOReader_RTF
1159 /*
1160 @METHOD: StyledTextIOReader_RTF::GetPlainFont
1161 @DESCRIPTION: <p>Get the font which is used for RTF \plain directives. This can be set
1162 via @'StyledTextIOReader_RTF::SetPlainFont'</p>
1163 */
1164 inline FontSpecification StyledTextIOReader_RTF::GetPlainFont () const
1165 {
1166 return fPlainFont;
1167 }
1168 /*
1169 @METHOD: StyledTextIOReader_RTF::SetPlainFont
1170 @DESCRIPTION: <p>Set the font which is used for RTF \plain directives. See
1171 @'StyledTextIOReader_RTF::GetPlainFont'</p>
1172 */
1173 inline void StyledTextIOReader_RTF::SetPlainFont (const FontSpecification& fsp)
1174 {
1175 fPlainFont = fsp;
1176 }
1177 inline void StyledTextIOReader_RTF::CheckIfAboutToStartBody (ReaderContext& readerContext)
1178 {
1179 if (not readerContext.fStartedBodyYet) {
1180 AboutToStartBody (readerContext);
1181 Assert (readerContext.fStartedBodyYet);
1182 }
1183 }
1184 /*
1185 @METHOD: StyledTextIOReader_RTF::LookupColor
1186 @DESCRIPTION: <p>Lookup the given font index in the color table. Deal moderately gracefully with error conditions.</p>
1187 */
1188 inline Color StyledTextIOReader_RTF::LookupColor (ReaderContext& readerContext, size_t index) const
1189 {
1190 if (readerContext.fColorTable == nullptr) {
1191 HandleBadlyFormattedInput (); // Cannot have a \cfN without having specified a color table
1192 return Color::kBlack;
1193 }
1194 else {
1195 try {
1196 return (readerContext.fColorTable->LookupColor (static_cast<size_t> (index)));
1197 }
1198 catch (...) {
1199 return Color::kBlack;
1200 }
1201 }
1202 }
1203
1204 // class StyledTextIOWriter_RTF::WriterContext
1205 inline StyledTextIOWriter_RTF::WriterContext::WriterContext (StyledTextIOWriter_RTF& writer)
1206 : fWriter{writer}
1207 , fInTable{false}
1208 , fSrcStream{writer.GetSrcStream ()}
1209 , fLastEmittedISR (IncrementalFontSpecification (), 0)
1210 , fNextStyleChangeAt{0}
1211 , fIthStyleRun{0}
1212 , fNextHidableTextChangeAt (size_t (-1))
1213 , fHidableTextRegionOpen (false)
1214 , fIthHidableTextRun{0}
1215 , fCharsToSkip{0}
1216 {
1217 }
1218 inline StyledTextIOWriter_RTF::WriterContext::WriterContext (WriterContext& parentContext, SrcStream& srcStream)
1219 : fWriter{parentContext.fWriter}
1220 , fInTable (true)
1221 , fSrcStream (srcStream)
1222 , fLastEmittedISR{IncrementalFontSpecification{}, 0}
1223 , fNextStyleChangeAt{0}
1224 , fIthStyleRun{0}
1225 , fNextHidableTextChangeAt{size_t (-1)}
1226 , fHidableTextRegionOpen (false)
1227 , fIthHidableTextRun{0}
1228 , fCharsToSkip{0}
1229 {
1230 }
1231 inline StyledTextIOWriter_RTF& StyledTextIOWriter_RTF::WriterContext::GetWriter () const
1232 {
1233 return fWriter;
1234 }
1235 inline StyledTextIOWriter_RTF::SrcStream& StyledTextIOWriter_RTF::WriterContext::GetSrcStream () const
1236 {
1237 return fSrcStream;
1238 }
1239 inline StyledTextIOWriter_RTF::SinkStream& StyledTextIOWriter_RTF::WriterContext::GetSinkStream () const
1240 {
1241 return fWriter.GetSinkStream ();
1242 }
1243
1244 // class StyledTextIOWriter_RTF
1245 inline CodePage StyledTextIOWriter_RTF::GetCurrentOutputCharSetEncoding () const
1246 {
1247 return fCurrentOutputCharSetEncoding;
1248 }
1249
1250}
1251
1252#endif /*_Stroika_Frameworks_Led_StyledTextIO_RTF_h_*/
#define EnsureNotNull(p)
Definition Assertions.h:343
#define RequireNotNull(p)
Definition Assertions.h:350
basic_string< SDKChar > SDKString
Definition SDKString.h:38