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