xref: /haiku/src/kits/interface/textview_support/StyleBuffer.h (revision 47205988db46c527dceb123204c01366d0209554)
1 /*
2  * Copyright 2001-2006 Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Marc Flerackers, mflerackers@androme.be
7  *		Stefano Ceccherini, burton666@libero.it
8  */
9 
10 
11 #include <Font.h>
12 #include <InterfaceDefs.h>
13 #include <SupportDefs.h>
14 #include <TextView.h>
15 
16 #include "TextViewSupportBuffer.h"
17 
18 
19 struct STEStyle {
20 	BFont		font;		// font
21 	rgb_color	color;		// pen color
22 };
23 
24 
25 struct STEStyleRun {
26 	long		offset;		// byte offset of first character of run
27 	STEStyle	style;		// style info
28 };
29 
30 
31 struct STEStyleRange {
32 	long		count;		// number of style runs
33 	STEStyleRun	runs[1];	// array of count number of runs
34 };
35 
36 
37 struct STEStyleRecord {
38 	long		refs;		// reference count for this style
39 	float		ascent;		// ascent for this style
40 	float		descent;	// descent for this style
41 	STEStyle	style;		// style info
42 };
43 
44 
45 struct STEStyleRunDesc {
46 	long		offset;		// byte offset of first character of run
47 	long		index;		// index of corresponding style record
48 };
49 
50 
51 // _BStyleRunDescBuffer_ class -------------------------------------------------
52 class _BStyleRunDescBuffer_ : public _BTextViewSupportBuffer_<STEStyleRunDesc> {
53 public:
54 								_BStyleRunDescBuffer_();
55 
56 			void				InsertDesc(STEStyleRunDesc* inDesc,
57 								int32 index);
58 			void				RemoveDescs(int32 index, int32 count = 1);
59 
60 			int32				OffsetToRun(int32 offset) const;
61 			void				BumpOffset(int32 delta, int32 index);
62 
63 			STEStyleRunDesc*	operator[](int32 index) const;
64 };
65 
66 
67 inline STEStyleRunDesc*
68 _BStyleRunDescBuffer_::operator[](int32 index) const
69 {
70 	return &fBuffer[index];
71 }
72 
73 
74 // _BStyleRecordBuffer_ class --------------------------------------------------
75 class _BStyleRecordBuffer_ : public _BTextViewSupportBuffer_<STEStyleRecord> {
76 public:
77 								_BStyleRecordBuffer_();
78 
79 			int32				InsertRecord(const BFont* inFont,
80 									const rgb_color* inColor);
81 			void				CommitRecord(int32 index);
82 			void				RemoveRecord(int32 index);
83 
84 			bool				MatchRecord(const BFont* inFont,
85 									const rgb_color* inColor,
86 									int32* outIndex);
87 
88 			STEStyleRecord*		operator[](int32 index) const;
89 };
90 
91 
92 inline STEStyleRecord*
93 _BStyleRecordBuffer_::operator[](int32 index) const
94 {
95 	return &fBuffer[index];
96 }
97 
98 
99 // StyleBuffer class --------------------------------------------------------
100 class BTextView::StyleBuffer {
101 public:
102 								StyleBuffer(const BFont* inFont,
103 									const rgb_color* inColor);
104 
105 			void				InvalidateNullStyle();
106 			bool				IsValidNullStyle() const;
107 
108 			void				SyncNullStyle(int32 offset);
109 			void				SetNullStyle(uint32 inMode,
110 									const BFont* inFont,
111 									const rgb_color* inColor,
112 									int32 offset = 0);
113 			void				GetNullStyle(const BFont** font,
114 									const rgb_color** color) const;
115 
116 			void				GetStyle(int32 inOffset, BFont* outFont,
117 									rgb_color* outColor) const;
118 			void				ContinuousGetStyle(BFont*, uint32*,
119 									rgb_color*, bool*, int32, int32) const;
120 
121 			STEStyleRange*		AllocateStyleRange(
122 									const int32 numStyles) const;
123 			void				SetStyleRange(int32 fromOffset,
124 									int32 toOffset, int32 textLen,
125 									uint32 inMode, const BFont* inFont,
126 									const rgb_color* inColor);
127 			STEStyleRange*		GetStyleRange(int32 startOffset,
128 									int32 endOffset) const;
129 
130 			void				RemoveStyleRange(int32 fromOffset,
131 									int32 toOffset);
132 			void				RemoveStyles(int32 index, int32 count = 1);
133 
134 			int32				Iterate(int32 fromOffset, int32 length,
135 									InlineInput* input,
136 									const BFont** outFont = NULL,
137 									const rgb_color** outColor = NULL,
138 									float* outAscent = NULL,
139 									float* outDescen = NULL,
140 									uint32* = NULL) const;
141 
142 			int32				OffsetToRun(int32 offset) const;
143 			void				BumpOffset(int32 delta, int32 index);
144 
145 			STEStyleRun			operator[](int32 index) const;
146 			int32				NumRuns() const;
147 
148 	const	_BStyleRunDescBuffer_&	RunBuffer() const;
149 	const	_BStyleRecordBuffer_&	RecordBuffer() const;
150 
151 private:
152 			_BStyleRunDescBuffer_	fStyleRunDesc;
153 			_BStyleRecordBuffer_	fStyleRecord;
154 			bool				fValidNullStyle;
155 			STEStyle			fNullStyle;
156 };
157 
158 
159 inline int32
NumRuns()160 BTextView::StyleBuffer::NumRuns() const
161 {
162 	return fStyleRunDesc.ItemCount();
163 }
164 
165 
166 inline const _BStyleRunDescBuffer_&
RunBuffer()167 BTextView::StyleBuffer::RunBuffer() const
168 {
169 	return fStyleRunDesc;
170 }
171 
172 
173 inline const _BStyleRecordBuffer_&
RecordBuffer()174 BTextView::StyleBuffer::RecordBuffer() const
175 {
176 	return fStyleRecord;
177 }
178