-
Notifications
You must be signed in to change notification settings - Fork 27
/
ConsoleScreen.hpp
1032 lines (828 loc) · 30.5 KB
/
ConsoleScreen.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
//////////////////////////////////////////////////////////////////////////////
//
// Selba Ward (https://github.com/Hapaxia/SelbaWard)
// --
//
// Console Screen v2
//
// Copyright(c) 2014-2024 M.J.Silk
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions :
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software.If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source distribution.
//
// M.J.Silk
// MJSilk2@gmail.com
//
//////////////////////////////////////////////////////////////////////////////
#ifndef SELBAWARD_CONSOLESCREEN_V2_HPP
#define SELBAWARD_CONSOLESCREEN_V2_HPP
#include "Common.hpp"
#include <unordered_map>
namespace sf
{
class Texture;
}
namespace selbaward
{
// SW Console Screen v2.4.5
class ConsoleScreen : public sf::Drawable, public sf::Transformable
{
public:
using Location = sf::Vector2u;
using Offset = sf::Vector2i;
enum class Direction;
enum class Palette;
enum ColorCommand : int;
enum Direct : int;
enum TargetBufferCommand : int;
struct Char;
struct Number;
struct Fg;
struct Bg;
struct MovementControl;
struct Left;
struct Right;
struct Up;
struct Down;
struct Wipe;
enum class StretchType
{
None,
Top,
Bottom,
Both
};
enum class CursorCommand // cursor command (able to map a character to these)
{
None = 0,
Newline,
Tab,
TabReverse,
Backspace, // affects cell contents
Delete, // affects cell contents
Left,
Right,
Up,
Down,
Home,
End,
HomeLine,
EndLine,
};
enum class PrintType
{
Cursor,
Direct,
Current
};
enum Affect
{
None = 0x00,
Value = 0x01,
FgColor = 0x02,
BgColor = 0x04,
Stretch = 0x08,
Inverse = 0x10,
Dark = 0x20,
FlipX = 0x40,
FlipY = 0x80,
Print = Value | FgColor | Stretch,
Default = Print | BgColor,
Attribs = Inverse | Dark | FlipX | FlipY,
Paint = FgColor | BgColor,
All = 0xFF
};
enum ColorType
{
Foreground,
Background
};
struct Color
{
long int id;
Color() : id(0) { }
Color(long int newId) : id(newId) { }
explicit Color(ColorCommand command) : id(static_cast<long int>(command)) { }
};
struct ColorPair
{
Color foreground;
Color background;
ColorPair() : foreground(1), background(0) { }
ColorPair(Color fg, Color bg) : foreground(fg), background(bg) { }
};
struct CellAttributes
{
bool inverse;
bool dark;
bool flipX;
bool flipY;
CellAttributes() : inverse(false), dark(false), flipX(false), flipY(false) { }
explicit CellAttributes(const bool newInverse, const bool newDark, const bool newFlipX, const bool newFlipY) : inverse(newInverse), dark(newDark), flipX(newFlipX), flipY(newFlipY) { }
explicit CellAttributes(const unsigned int attributeMask)
: inverse((attributeMask & Affect::Inverse) == Affect::Inverse)
, dark((attributeMask & Affect::Dark) == Affect::Dark)
, flipX((attributeMask & Affect::FlipX) == Affect::FlipX)
, flipY((attributeMask & Affect::FlipY) == Affect::FlipY)
{ }
};
struct Cell
{
unsigned int value;
ColorPair colors;
StretchType stretch;
CellAttributes attributes;
};
// setup
explicit ConsoleScreen(sf::Vector2u mode = { 80u, 45u });
void setMode(sf::Vector2u mode); // "mode" is the number of cells used to fit the screen
sf::Vector2u getMode() const;
unsigned int getNumberOfCells() const;
sf::Vector2u getNumberOfTilesInTexture2d() const;
unsigned int getNumberOfTilesInTexture() const;
void setClearValue(unsigned int clearValue = 0u);
unsigned int getClearValue() const;
void setClearChar(char clearChar);
char getClearChar() const;
void setDarkAttributeMultiplier(float darkAttributeMultiplier = 0.5f);
float getDarkAttributeMultiplier() const;
// texture
void setTexture(const sf::Texture& texture);
void setTexture();
void setTexture(const sf::Texture& texture, unsigned int numberOfTextureTilesPerRow, sf::Vector2u tileSize = { 8u, 8u }, sf::Vector2u textureOffset = { 0u, 0u });
void setTextureOffset(sf::Vector2u textureOffset = { 0u, 0u });
void setTextureTileSize(sf::Vector2u tileSize = { 8u, 8u });
void setNumberOfTextureTilesPerRow(unsigned int numberOfTextureTilesPerRow = 16u);
// switches
void setThrowExceptions(bool exceptions);
void setUpdateAutomatically(bool automaticUpdate);
void setShowCursor(bool showCursor);
void setInvertCursor(bool invertCursor);
void setUseCursorColor(bool useCursorColor);
void setShowBackground(bool showBackground);
void setScrollAutomatically(bool scroll);
void setWrapOnManualScroll(bool wrapOnManualScroll);
void setAddNewColorToPalette(bool addNewColorToPalette);
bool getThrowExceptions() const;
bool getUpdateAutomatically() const;
bool getShowCursor() const;
bool getInvertCursor() const;
bool getUseCursorColor() const;
bool getShowBackground() const;
bool getScrollAutomatically() const;
bool getWrapOnManualScroll() const;
bool getAddNewColorToPalette() const;
// visual representation
void setSize(sf::Vector2f size);
sf::Vector2f getSize() const;
sf::Vector2f getPerfectSize() const;
sf::FloatRect getLocalBounds() const;
sf::FloatRect getGlobalBounds() const;
sf::Vector2f getLocationAtCoord(sf::Vector2f coord) const;
sf::Vector2f getCoordOfLocation(sf::Vector2f location) const;
// global
void update();
void fill(Cell cell);
void clear(ColorPair colors);
void clear(Color backgroundColor);
void clear(ColorCommand colorCommand);
void clear();
void crash();
// stream
ConsoleScreen& operator<<(const std::string& string);
ConsoleScreen& operator<<(const Char& csChar);
ConsoleScreen& operator<<(const Number& csNumber);
ConsoleScreen& operator<<(const Direct& direct);
ConsoleScreen& operator<<(const Location& location);
ConsoleScreen& operator<<(const Offset& offset);
ConsoleScreen& operator<<(const Affect& affect);
ConsoleScreen& operator<<(const unsigned int affectMask);
ConsoleScreen& operator<<(const ColorType& colorType);
ConsoleScreen& operator<<(const Color& color);
ConsoleScreen& operator<<(const sf::Color& newColor); // action depends on action flag. either adds this colour to the palette or finds the closest match in the palette. either way, sets the colour to the resulting palette id.
ConsoleScreen& operator<<(const ColorPair& colorPair);
ConsoleScreen& operator<<(const Fg& fg);
ConsoleScreen& operator<<(const Bg& bg);
ConsoleScreen& operator<<(const Wipe& length);
ConsoleScreen& operator<<(const StretchType& stretchType);
ConsoleScreen& operator<<(const CellAttributes& cellAttributes);
ConsoleScreen& operator<<(const MovementControl& movementControl);
ConsoleScreen& operator<<(const CursorCommand& cursorCommand);
ConsoleScreen& operator>>(std::string& string);
ConsoleScreen& operator>>(unsigned int length);
ConsoleScreen& operator>>(const Direct& direct);
ConsoleScreen& operator>>(const Location& location);
ConsoleScreen& operator>>(const Offset& offset);
ConsoleScreen& operator>>(const MovementControl& movementControl);
ConsoleScreen& operator>>(const CursorCommand& cursorCommand);
// print properties
void resetPrintProperties(PrintType printType = PrintType::Current);
Location getLocation(PrintType printType = PrintType::Current);
unsigned int getIndex(PrintType printType = PrintType::Current);
ColorPair getColors(PrintType printType = PrintType::Current);
StretchType getStretchType(PrintType printType = PrintType::Current);
CellAttributes getCellAttributes(PrintType printType = PrintType::Current);
unsigned int getCellAttributesBitmask(PrintType = PrintType::Current);
unsigned int getAffectBitmask(PrintType printType = PrintType::Current);
ColorType getColorType(PrintType printType = PrintType::Current);
// print
void print(char character);
void print(const std::string& string);
void print(const Location& location, char character);
void print(const Location& location, const std::string& string);
// stack printing (over- and under-printing)
void addOverAt(const Location& location, char character, sf::Vector2f offset = { 0.f, 0.f });
void addOverAt(const Location& location, const std::string& string, sf::Vector2f offset = { 0.f, 0.f });
void addOverAt(const Location& location, const Cell& cell, sf::Vector2f offset = { 0.f, 0.f });
void addUnderAt(const Location& location, char character, sf::Vector2f offset = { 0.f, 0.f });
void addUnderAt(const Location& location, const std::string& string, sf::Vector2f offset = { 0.f, 0.f });
void addUnderAt(const Location& location, const Cell& cell, sf::Vector2f offset = { 0.f, 0.f });
void clearOversAt(const Location& location);
void clearUndersAt(const Location& location);
void clearStackAt(const Location& location);
void clearOvers();
void clearUnders();
void clearStack();
// stack printing from buffers
void pasteOver(sf::Vector2i offset = sf::Vector2i(0, 0));
void pasteUnder(sf::Vector2i offset = sf::Vector2i(0, 0));
void pasteOver(unsigned int index, sf::Vector2i offset = sf::Vector2i(0, 0));
void pasteUnder(unsigned int index, sf::Vector2i offset = sf::Vector2i(0, 0));
// read
std::string read();
std::string read(unsigned int length);
std::string read(const Location& location);
std::string read(const Location& location, unsigned int length);
// tabs
void setCursorTab(unsigned int tabSize);
unsigned int getCursorTab() const;
// cursor
void setCursor(int cellValue); // value (tile used to represent cursor)
void setCursor(char cellChar, bool mapCharacter = true); // converts from character to cell value. this can map the character if the character has an associated mapping
void setCursorColor(const Color& color);
int getCursorValue() const;
char getCursorChar(bool mapCharacter = true) const;
Color getCursorColor() const;
// cell manipulation
void clearCellAt(sf::Vector2u location);
void setCellAt(sf::Vector2u location, const Cell& cell);
void setValueAt(sf::Vector2u location, unsigned int value);
void setForegroundColorAt(sf::Vector2u location, Color color);
void setBackgroundColorAt(sf::Vector2u location, Color backgroundColor);
void setColorsAt(sf::Vector2u location, Color color, Color backgroundColor);
void setStretchAt(sf::Vector2u location, const StretchType& stretch);
void setAttributesAt(sf::Vector2u location, const CellAttributes& attributes);
void setAttributesAt(sf::Vector2u location, const Affect& attributeMask);
void setAttributesToAt(sf::Vector2u location, bool attributeValue, const Affect& attributeMask);
// cell information
Cell getCellAt(sf::Vector2u location) const;
unsigned int getValueAt(sf::Vector2u location) const;
Color getColorAt(sf::Vector2u location) const;
Color getBackgroundColorAt(sf::Vector2u location) const;
StretchType getStretchAt(sf::Vector2u location) const;
CellAttributes getAttributesAt(sf::Vector2u location) const;
bool getAttributeAt(sf::Vector2u location, const Affect& attributeMask);
// manual scrolling
void scrollUp(unsigned int amount = 1);
void scrollDown(unsigned int amount = 1);
void scrollLeft(unsigned int amount = 1);
void scrollRight(unsigned int amount = 1);
void scrollUp(unsigned int amount, sf::IntRect selectionRectangle);
void scrollDown(unsigned int amount, sf::IntRect selectionRectangle);
void scrollLeft(unsigned int amount, sf::IntRect selectionRectangle);
void scrollRight(unsigned int amount, sf::IntRect selectionRectangle);
// colour palette
void loadPalette(Palette palette);
void addColorToPalette(sf::Color color);
void setPaletteColor(Color color, sf::Color newColor);
sf::Color getPaletteColor(Color color) const;
void setPaletteSize(unsigned long int size);
unsigned long int getPaletteSize() const;
void removePaletteColor(Color color);
void cyclePaletteUp(long int amount = 1);
void cyclePaletteDown(long int amount = 1);
void cyclePaletteUp(Color firstColor, Color lastColor, long int amount = 1); // first colour and last colour of range to cycle
void cyclePaletteDown(Color firstColor, Color lastColor, long int amount = 1); // first colour and last colour of range to cycle
// buffers/clipboards/"screenshots"/captures
unsigned int copy(); // returns index of buffer
unsigned int copy(sf::IntRect selectionRectangle); // returns index of buffer
void paste(sf::Vector2i offset = sf::Vector2i(0, 0)); // replace screen with last saved buffer (recalls actual cell data, not the state of the console screen e.g. cursor isn't restored)
void removeBuffer(); // removes last saved buffer
void copy(unsigned int index); // copies over (replaces) an existing buffer
void copy(unsigned int index, sf::IntRect selectionRectangle);
void paste(unsigned int index, sf::Vector2i offset = sf::Vector2i(0, 0)); // replace screen with saved buffer (recalls actual cell data, not the state of the console screen e.g. cursor isn't restored)
void removeBuffer(unsigned int index); // as usual, when one buffer is removed, the indices of all following buffers are decreased
void removeAllBuffers();
unsigned int addBuffer(sf::Vector2u size = { 1u, 1u }); // returns index of new buffer
void resizeBuffer(unsigned int index, sf::Vector2u size);
unsigned int getNumberOfBuffers() const;
sf::Vector2u getSizeOfBuffer(unsigned int index) const;
// character mapping (to cell values)
void setMappedCharacter(char character, unsigned int value);
void setMappedCharacters(const std::string& characters, unsigned int initialValue);
void removeMappedCharacter(char character);
void removeMappedCharacters(const std::string& characters);
bool getIsMappedCharacter(char character) const;
unsigned int getMappedCharacter(char character) const;
// character mapping (to cursor commands)
void setMappedCursorCommandCharacter(char character, CursorCommand cursorCommand);
void setMappedCursorCommandCharacters(const std::string& characters, const std::vector<CursorCommand>& cursorCommands);
void removeMappedCursorCommandCharacter(char character);
void removeMappedCursorCommandCharacters(const std::string& characters);
bool getIsMappedCursorCommandCharacter(char character) const;
CursorCommand getMappedCursorCommandCharacter(char character) const;
// direct manipulation
void poke(unsigned int index, const Cell& cell);
void poke(unsigned int index, unsigned int value);
void poke(unsigned int index, const Color& color);
void poke(unsigned int index, const Color& color, const Color& backgroundColor);
void poke(unsigned int index, const StretchType& stretch);
void poke(unsigned int index, bool attributeValue, const Affect& attributeMask);
void poke(unsigned int index, const CellAttributes& attributes);
Cell peek(unsigned int index) const;
Cell& cell(unsigned int index);
Cell& bufferCell(unsigned int bufferIndex, unsigned int cellIndex);
private:
struct StackCell
{
unsigned int index;
sf::Vector2f offset;
Cell cell;
};
struct PrintProperties
{
unsigned int index;
ColorPair colors;
StretchType stretch;
CellAttributes attributes;
unsigned int affectBitmask;
ColorType colorType;
};
struct CursorProperties
{
int value; // if -1, doesn't change the cell's value (allows other cursor features to still be displayed)
Color color;
bool visible;
bool inverse;
bool useOwnColour;
};
struct ActionFlags
{
bool throwExceptions = true;
bool showBackround = true;
bool updateAutomatically = true;
bool scrollAutomatically = true;
bool wrapOnManualScroll = false;
bool addNewColorToPalette = false; // if false, new colours are matched to nearest palette colour
};
struct StateFlags
{
bool directPrinting = false;
bool rgbMode = false;
};
// flags
ActionFlags m_do;
StateFlags m_is;
// print properties
PrintProperties m_cursorPrintProperties;
PrintProperties m_directPrintProperties;
const PrintProperties m_defaultPrintProperties;
// definition
using Cells = std::vector<Cell>;
Cells m_cells;
sf::Vector2u m_mode;
// stack (under- and over-drawing) definition
std::vector<StackCell> m_overCells;
std::vector<StackCell> m_underCells;
// buffers
struct Buffer
{
unsigned int width;
Cells cells;
};
std::vector<Buffer> m_buffers;
// cursor
CursorProperties m_cursor;
// tab
unsigned int m_tabSize;
// read
unsigned int m_readLength;
// colour palette
std::vector<sf::Color> m_palette;
// character map (character mapped to cell value)
std::unordered_map<char, unsigned int> m_characterMap;
// character map for cursor commands (character mapped to a cursor command)
std::unordered_map<char, CursorCommand> m_characterMapCursorCommand;
// general setup values
unsigned int m_clearValue; // value to use when clearing a cell
float m_darkAttributeMultiplier; // sf::Color is multiplied by this amount when the cell's dark attribute is enabled
// visual representation
std::vector<sf::Vertex> m_display;
std::vector<sf::Vertex> m_backgroundDisplay;
std::vector<sf::Vertex> m_overDisplay;
std::vector<sf::Vertex> m_underDisplay;
sf::Vector2f m_size;
const sf::Texture* m_texture;
sf::Vector2u m_textureOffset;
sf::Vector2u m_tileSize;
unsigned int m_numberOfTilesPerRow;
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
void priv_setVerticesFromCell(unsigned int index, int baseVertex = -1, bool overLayer = true);
void priv_updateCell(unsigned int index);
void priv_updateUnderCells();
void priv_updateOverCells();
unsigned int priv_cellIndex(sf::Vector2u location) const;
sf::Vector2u priv_cellLocation(unsigned int index) const;
bool priv_isCellIndexInRange(unsigned int index) const;
bool priv_isCellLocationInRange(sf::Vector2u location) const;
bool priv_isScreenBufferIndexInRange(unsigned int index) const;
bool priv_isCursorInRange() const;
bool priv_isColorInPaletteRange(Color color) const;
void priv_clearCell(unsigned int index, bool overwriteColor, bool overwriteBackgroundColor);
void priv_clearCell(unsigned int index, const Color& backgroundColor, bool overwriteColor);
void priv_clearCell(unsigned int index, const Color& color, const Color& backgroundColor);
void priv_setCursorIndex(unsigned int index);
void priv_moveCursorToBeginningOfLine();
void priv_moveCursorUp();
void priv_moveCursorDown();
void priv_moveCursorLeft();
void priv_moveCursorRight();
bool priv_testCursorForScroll();
void priv_scroll();
void priv_copyToBufferFromSelectionRectangle(Buffer& buffer, const sf::IntRect& selectionRectangle);
void priv_pasteOffsettedBuffer(Buffer& buffer, const sf::Vector2i& offset);
bool priv_isSelectionRectangleContainedInScreen(const sf::IntRect& selectionRectangle);
unsigned int priv_getPrintIndex(sf::Vector2u location) const;
unsigned int priv_getCellValueFromCharacter(char character) const;
char priv_getCharacterFromCellValue(unsigned int cellValue) const;
Color priv_getRandomColor() const;
PrintProperties& priv_getCurrentPrintProperties();
PrintProperties& priv_getPrintProperties(const PrintType& printType);
Color priv_getModifiedColorFromColorPairUsingSpecifiedColorType(const ColorPair& colors, const ColorType& colorType);
Color priv_getModifiedColorFromCellUsingSpecifiedColorType(const unsigned int& cellIndex, const ColorType& colorType);
Color& priv_getActiveColor();
Color& priv_getInactiveColor();
int priv_getIndexOfClosestPaletteColor(const sf::Color& color) const; // returns -1 if the palette is empty
std::string priv_read(unsigned int index, const bool unmapCharacters = true);
void priv_modifyCellUsingPrintProperties(unsigned int index, const PrintType& printType, const StretchType stretch);
void priv_makeColorDark(sf::Color& color);
};
enum class ConsoleScreen::Palette
{
Default, // basic 16-colour palette
Colors2BlackWhite,
Colors2WhiteBlack,
Colors8Rgb,
Colors16Greenscale,
Colors16Grayscale,
Colors16Sepia,
Colors16Cga,
Colors16CgaNonIbm,
Colors16Windows,
Colors16Mac,
Colors16ZxSpectrum,
Colors16Html,
Colors216Web,
Colors256Greenscale,
Colors256Grayscale,
Colors256Sepia,
ColorsRgb // 24-bit RGB colours. palette of 16,777,216 (0x1000000) colours that are ordered so that the palette index can be specified like this: RRGGBB in hex e.g. 0x00FF00 for green
};
enum class ConsoleScreen::Direction
{
Left,
Right,
Up,
Down
};
enum ConsoleScreen::Direct : int
{
Begin,
End
};
enum ConsoleScreen::ColorCommand : int // colour command
{
Unused = -1, // unused. returns a Color created from this ColorCommand if no Color can be determined such as when an exception is thrown from a method that returns a Color but exceptions are switched off
Opposite = -2, // use opposite colour (i.e. foreground color for background color and background color for foreground color)
Invert = -3, // invert the opposite colour ("main colour = invert" would set main colour to inverted background colour and vice versa)
Contrast = -4, // contrast the opposite colour ("main colour = contrast" would set main colour to contrast background colour and vice versa). contrast is black or white based on opposite's luminance
};
enum ConsoleScreen::TargetBufferCommand : int
{
Screen = -1, // targets the screen directly
First = -2, // targets the first buffer if one is available, otherwise targets the screen
Last = -3 // targets the last buffer if one is available, otherwise targets the screen
};
struct ConsoleScreen::Char
{
char character;
explicit Char(char singleCharacter) : character(singleCharacter) { }
};
struct ConsoleScreen::Number
{
std::string numberAsString;
template <class T>
explicit Number(T number) : numberAsString(std::to_string(number)) { }
};
struct ConsoleScreen::Fg
{
Color color;
Fg(Color foregroundColor) : color(foregroundColor) { }
};
struct ConsoleScreen::Bg
{
Color color;
Bg(Color backgroundColor) : color(backgroundColor) { }
};
struct ConsoleScreen::MovementControl
{
const unsigned int amount;
Direction direction{ Direction::Right };
explicit MovementControl(const unsigned int distance = 1u) : amount(distance) { }
};
struct ConsoleScreen::Left : public MovementControl
{
explicit Left(const unsigned int distance = 1u) : MovementControl(distance) { direction = Direction::Left; }
};
struct ConsoleScreen::Right : public MovementControl
{
explicit Right(const unsigned int distance = 1u) : MovementControl(distance) { direction = Direction::Right; }
};
struct ConsoleScreen::Up : public MovementControl
{
explicit Up(const unsigned int distance = 1u) : MovementControl(distance) { direction = Direction::Up; }
};
struct ConsoleScreen::Down : public MovementControl
{
explicit Down(const unsigned int distance = 1u) : MovementControl(distance) { direction = Direction::Down; }
};
struct ConsoleScreen::Wipe
{
std::string string;
explicit Wipe(const unsigned int length) : string(length, ' ') { }
};
// INLINE METHODS
inline void ConsoleScreen::setClearValue(const unsigned int clearValue)
{
m_clearValue = clearValue;
}
inline unsigned int ConsoleScreen::getClearValue() const
{
return m_clearValue;
}
inline void ConsoleScreen::setClearChar(const char clearChar)
{
setClearValue(priv_getCellValueFromCharacter(clearChar));
}
inline char ConsoleScreen::getClearChar() const
{
return priv_getCharacterFromCellValue(getClearValue());
}
inline void ConsoleScreen::setTexture(const sf::Texture& texture)
{
m_texture = &texture;
}
inline void ConsoleScreen::setTexture()
{
m_texture = nullptr;
}
inline void ConsoleScreen::setTexture(const sf::Texture& texture, const unsigned int numberOfTextureTilesPerRow, const sf::Vector2u tileSize, const sf::Vector2u textureOffset)
{
setTexture(texture);
setNumberOfTextureTilesPerRow(numberOfTextureTilesPerRow);
setTextureTileSize(tileSize);
setTextureOffset(textureOffset);
}
inline void ConsoleScreen::setDarkAttributeMultiplier(const float darkAttributeMultiplier)
{
m_darkAttributeMultiplier = darkAttributeMultiplier;
update();
}
inline float ConsoleScreen::getDarkAttributeMultiplier() const
{
return m_darkAttributeMultiplier;
}
inline void ConsoleScreen::setThrowExceptions(const bool throwExceptions)
{
m_do.throwExceptions = throwExceptions;
}
inline void ConsoleScreen::setUpdateAutomatically(const bool updateAutomatically)
{
m_do.updateAutomatically = updateAutomatically;
}
inline void ConsoleScreen::setShowBackground(const bool showBackground)
{
m_do.showBackround = showBackground;
}
inline void ConsoleScreen::setScrollAutomatically(const bool scrollAutomatically)
{
m_do.scrollAutomatically = scrollAutomatically;
}
inline void ConsoleScreen::setWrapOnManualScroll(const bool wrapOnManualScroll)
{
m_do.wrapOnManualScroll = wrapOnManualScroll;
}
inline void ConsoleScreen::setAddNewColorToPalette(const bool addNewColorToPalette)
{
m_do.addNewColorToPalette = addNewColorToPalette;
}
inline sf::Vector2f ConsoleScreen::getSize() const
{
return m_size;
}
inline sf::Vector2f ConsoleScreen::getPerfectSize() const
{
return{ static_cast<float>(m_tileSize.x * m_mode.x), static_cast<float>(m_tileSize.y * m_mode.y) };
}
inline sf::FloatRect ConsoleScreen::getLocalBounds() const
{
return{ { 0.f, 0.f }, m_size };
}
inline sf::FloatRect ConsoleScreen::getGlobalBounds() const
{
return getTransform().transformRect(getLocalBounds());
}
inline sf::Vector2u ConsoleScreen::getMode() const
{
return m_mode;
}
inline unsigned int ConsoleScreen::getNumberOfCells() const
{
return static_cast<unsigned int>(m_cells.size());
}
inline bool ConsoleScreen::getThrowExceptions() const
{
return m_do.throwExceptions;
}
inline bool ConsoleScreen::getUpdateAutomatically() const
{
return m_do.updateAutomatically;
}
inline bool ConsoleScreen::getShowCursor() const
{
return m_cursor.visible;
}
inline bool ConsoleScreen::getInvertCursor() const
{
return m_cursor.inverse;
}
inline bool ConsoleScreen::getUseCursorColor() const
{
return m_cursor.useOwnColour;
}
inline bool ConsoleScreen::getShowBackground() const
{
return m_do.showBackround;
}
inline bool ConsoleScreen::getScrollAutomatically() const
{
return m_do.scrollAutomatically;
}
inline bool ConsoleScreen::getWrapOnManualScroll() const
{
return m_do.wrapOnManualScroll;
}
inline bool ConsoleScreen::getAddNewColorToPalette() const
{
return m_do.addNewColorToPalette;
}
inline int ConsoleScreen::getCursorValue() const
{
return m_cursor.value;
}
inline char ConsoleScreen::getCursorChar(const bool mapCharacter) const
{
return mapCharacter ? priv_getCharacterFromCellValue(m_cursor.value) : static_cast<char>(m_cursor.value);
}
inline ConsoleScreen::Color ConsoleScreen::getCursorColor() const
{
return m_cursor.color;
}
inline void ConsoleScreen::resetPrintProperties(const PrintType printType)
{
priv_getPrintProperties(printType) = m_defaultPrintProperties;
}
inline ConsoleScreen::Location ConsoleScreen::getLocation(const PrintType printType)
{
return priv_cellLocation(priv_getPrintProperties(printType).index);
}
inline unsigned int ConsoleScreen::getIndex(const PrintType printType)
{
return priv_getPrintProperties(printType).index;
}
inline ConsoleScreen::ColorPair ConsoleScreen::getColors(const PrintType printType)
{
return priv_getPrintProperties(printType).colors;
}
inline ConsoleScreen::StretchType ConsoleScreen::getStretchType(const PrintType printType)
{
return priv_getPrintProperties(printType).stretch;
}
inline ConsoleScreen::CellAttributes ConsoleScreen::getCellAttributes(const PrintType printType)
{
return priv_getPrintProperties(printType).attributes;
}
inline unsigned int ConsoleScreen::getAffectBitmask(const PrintType printType)
{
return priv_getPrintProperties(printType).affectBitmask;
}
inline ConsoleScreen::ColorType ConsoleScreen::getColorType(const PrintType printType)
{
return priv_getPrintProperties(printType).colorType;
}
inline void ConsoleScreen::setCursorTab(const unsigned int tabSize)
{
m_tabSize = tabSize;
}
inline unsigned int ConsoleScreen::getCursorTab() const
{
return m_tabSize;
}
inline void ConsoleScreen::addColorToPalette(const sf::Color color)
{
m_palette.emplace_back(color);
}
inline unsigned long int ConsoleScreen::getPaletteSize() const
{
return m_is.rgbMode ? 16777216L : static_cast<unsigned long int>(m_palette.size());
}
inline void ConsoleScreen::removeAllBuffers()
{
m_buffers.clear();
}
inline unsigned int ConsoleScreen::getNumberOfBuffers() const
{
return static_cast<unsigned int>(m_buffers.size());
}
inline void ConsoleScreen::setMappedCharacter(const char character, const unsigned int value)
{
m_characterMap[character] = value;
}
inline void ConsoleScreen::setMappedCharacters(const std::string& characters, unsigned int initialValue)
{
for (auto& character : characters)
setMappedCharacter(character, initialValue++);
}
inline void ConsoleScreen::removeMappedCharacter(const char character)
{
m_characterMap.erase(character);
}
inline void ConsoleScreen::removeMappedCharacters(const std::string& characters)
{
for (auto& character : characters)
removeMappedCharacter(character);
}
inline bool ConsoleScreen::getIsMappedCharacter(const char character) const
{
return m_characterMap.find(character) != m_characterMap.end();
}
inline unsigned int ConsoleScreen::getMappedCharacter(const char character) const
{
return m_characterMap.at(character);
}
inline void ConsoleScreen::setMappedCursorCommandCharacter(const char character, const CursorCommand cursorCommand)
{
m_characterMapCursorCommand[character] = cursorCommand;
}
inline void ConsoleScreen::setMappedCursorCommandCharacters(const std::string& characters, const std::vector<CursorCommand>& cursorCommands)
{