4#include "Stroika/Frameworks/StroikaPreComp.h"
11#include "Stroika/Foundation/DataExchange/BadFormatException.h"
13#include "Stroika/Frameworks/Led/StyledTextEmbeddedObjects.h"
14#include "Stroika/Frameworks/Led/StyledTextImager.h"
16#include "StyledTextIO.h"
19using namespace Stroika::Frameworks;
20using namespace Stroika::Frameworks::Led;
21using namespace Stroika::Frameworks::Led::StyledTextIO;
33void StyledTextIOReader::SinkStream::StartTable ()
41void StyledTextIOReader::SinkStream::EndTable ()
49void StyledTextIOReader::SinkStream::StartTableRow ()
57void StyledTextIOReader::SinkStream::EndTableRow ()
72void StyledTextIOReader::SinkStream::StartTableCell (
size_t )
80void StyledTextIOReader::SinkStream::EndTableCell ()
84void StyledTextIOReader::SinkStream::SetJustification (Justification )
89void StyledTextIOReader::SinkStream::SetStandardTabStopList (
const StandardTabStopList& )
94void StyledTextIOReader::SinkStream::SetFirstIndent (TWIPS )
99void StyledTextIOReader::SinkStream::SetLeftMargin (TWIPS )
104void StyledTextIOReader::SinkStream::SetRightMargin (TWIPS )
113void StyledTextIOReader::SinkStream::SetSpaceBefore (TWIPS )
122void StyledTextIOReader::SinkStream::SetSpaceAfter (TWIPS )
131void StyledTextIOReader::SinkStream::SetLineSpacing (LineSpacing )
140void StyledTextIOReader::SinkStream::SetTextHidden (
bool )
149void StyledTextIOReader::SinkStream::SetListStyle (ListStyle )
158void StyledTextIOReader::SinkStream::SetListIndentLevel (
unsigned char )
167void StyledTextIOReader::SinkStream::SetTableBorderColor (
Color )
176void StyledTextIOReader::SinkStream::SetTableBorderWidth (TWIPS )
192void StyledTextIOReader::SinkStream::SetCellWidths (
const vector<TWIPS>& )
201void StyledTextIOReader::SinkStream::SetCellBackColor (
const Color )
210void StyledTextIOReader::SinkStream::SetDefaultCellMarginsForCurrentRow (TWIPS , TWIPS , TWIPS , TWIPS )
219void StyledTextIOReader::SinkStream::SetDefaultCellSpacingForCurrentRow (TWIPS , TWIPS , TWIPS , TWIPS )
239void StyledTextIOReader::BadInputHandler::HandleBadlyFormattedInput (
const StyledTextIOReader& ,
bool unrecoverable)
256Justification StyledTextIOWriter::SrcStream::GetJustification ()
const
265StandardTabStopList StyledTextIOWriter::SrcStream::GetStandardTabStopList ()
const
267 return StandardTabStopList{};
274TWIPS StyledTextIOWriter::SrcStream::GetFirstIndent ()
const
283void StyledTextIOWriter::SrcStream::GetMargins (TWIPS* lhs, TWIPS* rhs)
const
288 *rhs = TWIPS (6 * 1440);
295TWIPS StyledTextIOWriter::SrcStream::GetSpaceBefore ()
const
304TWIPS StyledTextIOWriter::SrcStream::GetSpaceAfter ()
const
313LineSpacing StyledTextIOWriter::SrcStream::GetLineSpacing ()
const
315 return LineSpacing ();
322void StyledTextIOWriter::SrcStream::GetListStyleInfo (ListStyle* listStyle,
unsigned char* indentLevel)
const
326 *listStyle = eListStyle_None;
335Led_tChar StyledTextIOWriter::SrcStream::GetSoftLineBreakCharacter ()
const
344DiscontiguousRun<bool> StyledTextIOWriter::SrcStream::GetHidableTextRuns ()
const
346 return DiscontiguousRun<bool> ();
354StyledTextIOSrcStream_Memory::StyledTextIOSrcStream_Memory (
const void* data,
size_t nBytes)
355 : StyledTextIOReader::SrcStream ()
357 , fDataEnd (((char*)data) + nBytes)
358 , fBytesInBuffer (nBytes)
364size_t StyledTextIOSrcStream_Memory::current_offset ()
const
366 return (((
char*)fCurPtr - (
char*)fData));
369void StyledTextIOSrcStream_Memory::seek_to (
size_t to)
372 to = min (to, fBytesInBuffer);
374 fCurPtr = ((
char*)fData) + to;
377size_t StyledTextIOSrcStream_Memory::read (
void* buffer,
size_t bytes)
382 char* curBytePtr = (
char*)fCurPtr;
383 size_t curIdx = curBytePtr - ((
char*)fData);
384 size_t bytesLeft = fBytesInBuffer - curIdx;
385 bytes = min (bytesLeft, bytes);
386 (void)::memcpy (buffer, curBytePtr, bytes);
387 fCurPtr = curBytePtr + bytes;
390 bytes = min (fBytesLeft, bytes);
391 (void)::memcpy (buffer, fCurPtr, bytes);
392 fCurPtr = ((
char*)fCurPtr) + bytes;
398size_t StyledTextIOSrcStream_Memory::read1 (
char* c)
401 char* curBytePtr = (
char*)fCurPtr;
402 if (curBytePtr != fDataEnd) {
404 fCurPtr = curBytePtr + 1;
415StyledTextIOWriterSinkStream_Memory::StyledTextIOWriterSinkStream_Memory ()
416 : StyledTextIOWriter::SinkStream ()
419 , fBytesAllocated (0)
424StyledTextIOWriterSinkStream_Memory::~StyledTextIOWriterSinkStream_Memory ()
429size_t StyledTextIOWriterSinkStream_Memory::current_offset ()
const
431 return (fCurPtr - fData);
434void StyledTextIOWriterSinkStream_Memory::seek_to (
size_t to)
437 to = min (to, fBytesUsed);
438 fCurPtr = fData + to;
441void StyledTextIOWriterSinkStream_Memory::write (
const void* buffer,
size_t bytes)
443 const size_t kMemBlockOverhead = 40;
447 const size_t kChunkSize = 16 * 1024;
451 Assert (fBytesUsed <= fBytesAllocated);
456 size_t curOffset = fCurPtr - fData;
457 if (curOffset + bytes > fBytesAllocated) {
462 size_t newSize = ((
static_cast<size_t> ((fBytesAllocated + bytes) * 1.5) + kChunkSize - 1 + kMemBlockOverhead) / kChunkSize) * kChunkSize -
464 Assert (newSize > fBytesAllocated);
465 Assert (newSize >= fBytesAllocated + bytes);
466 char* buf =
new char[newSize];
467 if (fData !=
nullptr) {
468 ::memcpy (buf, fData, fBytesUsed);
472 fCurPtr = buf + curOffset;
473 fBytesAllocated = newSize;
479 memcpy (fCurPtr, buffer, bytes);
480 buffer = ((
char*)buffer) + bytes;
481 fCurPtr = ((
char*)fCurPtr) + bytes;
482 fBytesUsed = max (
size_t (fCurPtr - fData), fBytesUsed);
490string StyledTextIOReader::GrabString (
size_t from,
size_t to)
492 size_t onEntrySeekPos = GetSrcStream ().current_offset ();
494 size_t effectiveTo = to;
495 if (effectiveTo ==
size_t (-1)) {
496 effectiveTo = onEntrySeekPos;
498 Require (from <= effectiveTo);
500 size_t strLen = effectiveTo - from;
502 GetSrcStream ().seek_to (from);
503 if (GetSrcStream ().read (buf.data (), strLen) != strLen) {
504 GetSrcStream ().seek_to (onEntrySeekPos);
505 HandleBadlyFormattedInput (
true);
507 GetSrcStream ().seek_to (onEntrySeekPos);
509 return string{buf.data ()};
517void StyledTextIOWriter::write (
const void* data,
size_t nBytes)
519 GetSinkStream ().write (data, nBytes);
522void StyledTextIOWriter::write (
char c)
524 GetSinkStream ().write (&c, 1);
527void StyledTextIOWriter::write (
const char* str)
530 GetSinkStream ().write (str, strlen (str));
533void StyledTextIOWriter::write (
const string& str)
535 GetSinkStream ().write (str.c_str (), str.length ());
538#if qStroika_Frameworks_Led_SupportGDI
544EmbeddingSinkStream::EmbeddingSinkStream (StyledTextIOWriter::SinkStream& realSinkStream)
545 : fRealSinkStream{realSinkStream}
549void EmbeddingSinkStream::write (
const void* buffer,
size_t bytes)
551 fRealSinkStream.write (buffer, bytes);
#define RequireNotNull(p)
Logically halfway between std::array and std::vector; Smart 'direct memory array' - which when needed...
void Throw(T &&e2Throw)
identical to builtin C++ 'throw' except that it does helpful, type dependent DbgTrace() messages firs...