aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/Document.cxx48
-rw-r--r--src/Document.h31
-rw-r--r--src/Editor.cxx154
-rw-r--r--src/PerLine.cxx6
-rw-r--r--src/PerLine.h4
5 files changed, 85 insertions, 158 deletions
diff --git a/src/Document.cxx b/src/Document.cxx
index b0070233f..f7e9dfdcc 100644
--- a/src/Document.cxx
+++ b/src/Document.cxx
@@ -1214,7 +1214,7 @@ bool Document::SetStyleFor(int length, char style) {
}
}
-bool Document::SetStyles(int length, char *styles) {
+bool Document::SetStyles(int length, const char *styles) {
if (enteredStyling != 0) {
return false;
} else {
@@ -1269,25 +1269,10 @@ int Document::GetMaxLineState() {
return static_cast<LineState*>(perLineData[ldState])->GetMaxLineState();
}
-bool Document::MarginMultipleStyles(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldMargin])->MultipleStyles(line);
-}
-
-const char *Document::MarginText(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldMargin])->Text(line);
-}
-
-int Document::MarginStyle(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldMargin])->Style(line);
-}
-
-const char *Document::MarginStyles(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldMargin])->Styles(line);
-}
-
StyledText Document::MarginStyledText(int line) {
- return StyledText(MarginLength(line), MarginText(line),
- MarginMultipleStyles(line), MarginStyle(line), MarginStyles(line));
+ LineAnnotation *pla = static_cast<LineAnnotation*>(perLineData[ldMargin]);
+ return StyledText(pla->Length(line), pla->Text(line),
+ pla->MultipleStyles(line), pla->Style(line), pla->Styles(line));
}
void Document::MarginSetText(int line, const char *text) {
@@ -1300,7 +1285,7 @@ void Document::MarginSetStyle(int line, int style) {
static_cast<LineAnnotation*>(perLineData[ldMargin])->SetStyle(line, style);
}
-void Document::MarginSetStyles(int line, const char *styles) {
+void Document::MarginSetStyles(int line, const unsigned char *styles) {
static_cast<LineAnnotation*>(perLineData[ldMargin])->SetStyles(line, styles);
}
@@ -1320,25 +1305,10 @@ bool Document::AnnotationAny() const {
return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->AnySet();
}
-bool Document::AnnotationMultipleStyles(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->MultipleStyles(line);
-}
-
-const char *Document::AnnotationText(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->Text(line);
-}
-
-int Document::AnnotationStyle(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->Style(line);
-}
-
-const char *Document::AnnotationStyles(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->Styles(line);
-}
-
StyledText Document::AnnotationStyledText(int line) {
- return StyledText(AnnotationLength(line), AnnotationText(line),
- AnnotationMultipleStyles(line), AnnotationStyle(line), AnnotationStyles(line));
+ LineAnnotation *pla = static_cast<LineAnnotation*>(perLineData[ldAnnotation]);
+ return StyledText(pla->Length(line), pla->Text(line),
+ pla->MultipleStyles(line), pla->Style(line), pla->Styles(line));
}
void Document::AnnotationSetText(int line, const char *text) {
@@ -1354,7 +1324,7 @@ void Document::AnnotationSetStyle(int line, int style) {
static_cast<LineAnnotation*>(perLineData[ldAnnotation])->SetStyle(line, style);
}
-void Document::AnnotationSetStyles(int line, const char *styles) {
+void Document::AnnotationSetStyles(int line, const unsigned char *styles) {
static_cast<LineAnnotation*>(perLineData[ldAnnotation])->SetStyles(line, styles);
}
diff --git a/src/Document.h b/src/Document.h
index 2804a9a4f..6ff6c2d71 100644
--- a/src/Document.h
+++ b/src/Document.h
@@ -97,11 +97,22 @@ struct StyledText {
size_t length;
const char *text;
bool multipleStyles;
- int style;
- const char *styles;
- StyledText( size_t length_, const char *text_, bool multipleStyles_, int style_, const char *styles_) :
+ size_t style;
+ const unsigned char *styles;
+ StyledText( size_t length_, const char *text_, bool multipleStyles_, int style_, const unsigned char *styles_) :
length(length_), text(text_), multipleStyles(multipleStyles_), style(style_), styles(styles_) {
}
+ // Return number of bytes from start to before '\n' or end of text.
+ // Return 1 when start is outside text
+ size_t LineLength(size_t start) const {
+ size_t cur = start;
+ while ((cur < length) && (text[cur] != '\n'))
+ cur++;
+ return cur-start;
+ }
+ size_t StyleAt(size_t i) const {
+ return multipleStyles ? styles[i] : style;
+ }
};
/**
@@ -254,7 +265,7 @@ public:
void SetStylingBits(int bits);
void StartStyling(int position, char mask);
bool SetStyleFor(int length, char style);
- bool SetStyles(int length, char *styles);
+ bool SetStyles(int length, const char *styles);
int GetEndStyled() { return endStyled; }
void EnsureStyledTo(int pos);
int GetStyleClock() { return styleClock; }
@@ -265,26 +276,18 @@ public:
int GetLineState(int line);
int GetMaxLineState();
- bool MarginMultipleStyles(int line);
- const char *MarginText(int line);
- int MarginStyle(int line);
- const char *MarginStyles(int line);
StyledText MarginStyledText(int line);
void MarginSetStyle(int line, int style);
- void MarginSetStyles(int line, const char *styles);
+ void MarginSetStyles(int line, const unsigned char *styles);
void MarginSetText(int line, const char *text);
int MarginLength(int line) const;
void MarginClearAll();
bool AnnotationAny() const;
- bool AnnotationMultipleStyles(int line);
- const char *AnnotationText(int line);
- const char *AnnotationStyles(int line);
- int AnnotationStyle(int line);
StyledText AnnotationStyledText(int line);
void AnnotationSetText(int line, const char *text);
void AnnotationSetStyle(int line, int style);
- void AnnotationSetStyles(int line, const char *styles);
+ void AnnotationSetStyles(int line, const unsigned char *styles);
int AnnotationLength(int line) const;
int AnnotationLines(int line) const;
void AnnotationClearAll();
diff --git a/src/Editor.cxx b/src/Editor.cxx
index 3e8cb21fc..ae2c16137 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -1459,54 +1459,27 @@ static int istrlen(const char *s) {
return static_cast<int>(strlen(s));
}
-bool ValidStyledText(ViewStyle &vs, int styleOffset, const StyledText &st) {
+bool ValidStyledText(ViewStyle &vs, size_t styleOffset, const StyledText &st) {
if (st.multipleStyles) {
for (size_t iStyle=0;iStyle<st.length; iStyle++) {
- if (!vs.ValidStyle(static_cast<size_t>(styleOffset + st.styles[iStyle])))
+ if (!vs.ValidStyle(styleOffset + st.styles[iStyle]))
return false;
}
} else {
- if (!vs.ValidStyle(static_cast<size_t>(styleOffset + st.style)))
+ if (!vs.ValidStyle(styleOffset + st.style))
return false;
}
return true;
}
-struct LineSegment {
- const char *s;
- int len;
-};
-
-class LineEnumerator {
-public:
- const char *s;
- int len;
- LineEnumerator(const char *s_, size_t len_) : s(s_), len(len_) {
- }
- LineSegment Next() {
- LineSegment ret;
- ret.s = s;
- int cur = 0;
- while ((cur < len) && (s[cur] != '\n'))
- cur++;
- ret.len = cur;
- s += cur + 1;
- len -= cur + 1;
- return ret;
- }
- bool Finished() const {
- return len <= 0;
- }
-};
-
static int WidthStyledText(Surface *surface, ViewStyle &vs, int styleOffset,
- const char *text, const char *styles, size_t len) {
+ const char *text, const unsigned char *styles, size_t len) {
int width = 0;
size_t start = 0;
while (start < len) {
- int style = styles[start];
+ size_t style = styles[start];
size_t endSegment = start;
- while ((endSegment < len-1) && (styles[endSegment+1] == style))
+ while ((endSegment+1 < len) && (static_cast<size_t>(styles[endSegment+1]) == style))
endSegment++;
width += surface->WidthText(vs.styles[style+styleOffset].font, text + start, endSegment - start + 1);
start = endSegment + 1;
@@ -1515,20 +1488,19 @@ static int WidthStyledText(Surface *surface, ViewStyle &vs, int styleOffset,
}
static int WidestLineWidth(Surface *surface, ViewStyle &vs, int styleOffset, const StyledText &st) {
- size_t styleStart = 0;
- LineEnumerator le(st.text, st.length);
int widthMax = 0;
- while (!le.Finished()) {
- LineSegment ls = le.Next();
+ size_t start = 0;
+ while (start < st.length) {
+ size_t lenLine = st.LineLength(start);
int widthSubLine;
if (st.multipleStyles) {
- widthSubLine = WidthStyledText(surface, vs, styleOffset, ls.s, st.styles + styleStart, ls.len);
- styleStart += ls.len + 1;
+ widthSubLine = WidthStyledText(surface, vs, styleOffset, st.text + start, st.styles + start, lenLine);
} else {
- widthSubLine = surface->WidthText(vs.styles[styleOffset + st.style].font, ls.s, ls.len);
+ widthSubLine = surface->WidthText(vs.styles[styleOffset + st.style].font, st.text + start, lenLine);
}
if (widthSubLine > widthMax)
widthMax = widthSubLine;
+ start += lenLine + 1;
}
return widthMax;
}
@@ -1748,20 +1720,16 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
vs.styles[STYLE_LINENUMBER].back.allocated);
} else if (vs.ms[margin].style == SC_MARGIN_TEXT || vs.ms[margin].style == SC_MARGIN_RTEXT) {
if (firstSubLine) {
- StyledText marginStyledText = pdoc->MarginStyledText(lineDoc);
- if (marginStyledText.text && ValidStyledText(vs, vs.marginStyleOffset, marginStyledText)) {
- if (marginStyledText.multipleStyles) {
- surface->FillRectangle(rcMarker,
- vs.styles[marginStyledText.styles[0]+vs.marginStyleOffset].back.allocated);
- } else {
- surface->FillRectangle(rcMarker, vs.styles[marginStyledText.style].back.allocated);
- }
+ const StyledText stMargin = pdoc->MarginStyledText(lineDoc);
+ if (stMargin.text && ValidStyledText(vs, vs.marginStyleOffset, stMargin)) {
+ surface->FillRectangle(rcMarker,
+ vs.styles[stMargin.StyleAt(0)+vs.marginStyleOffset].back.allocated);
if (vs.ms[margin].style == SC_MARGIN_RTEXT) {
- int width = WidestLineWidth(surface, vs, vs.marginStyleOffset, marginStyledText);
+ int width = WidestLineWidth(surface, vs, vs.marginStyleOffset, stMargin);
rcMarker.left = rcMarker.right - width - 3;
}
DrawStyledText(surface, vs, vs.marginStyleOffset, rcMarker, rcMarker.top + vs.maxAscent,
- marginStyledText, 0, marginStyledText.length);
+ stMargin, 0, stMargin.length);
}
}
}
@@ -2352,24 +2320,12 @@ void Editor::DrawAnnotation(Surface *surface, ViewStyle &vsDraw, int line, int x
int indent = pdoc->GetLineIndentation(line) * vsDraw.spaceWidth;
PRectangle rcSegment = rcLine;
int annotationLine = subLine - ll->lines;
- StyledText annotationStyledText = pdoc->AnnotationStyledText(line);
- int annotationStyle = annotationStyledText.style + vsDraw.annotationStyleOffset;
- if (annotationStyledText.multipleStyles) {
- for (size_t iStyle=0;iStyle<annotationStyledText.length; iStyle++) {
- if (!vsDraw.ValidStyle(static_cast<size_t>(
- vsDraw.annotationStyleOffset + annotationStyledText.styles[iStyle])))
- return;
- }
- } else {
- if (!vsDraw.ValidStyle(static_cast<size_t>(annotationStyle)))
- return;
- }
- if (annotationStyledText.text) {
+ const StyledText stAnnotation = pdoc->AnnotationStyledText(line);
+ if (stAnnotation.text && ValidStyledText(vsDraw, vsDraw.annotationStyleOffset, stAnnotation)) {
surface->FillRectangle(rcSegment, vsDraw.styles[0].back.allocated);
-
if (vs.annotationVisible == ANNOTATION_BOXED) {
// Only care about calculating width if need to draw box
- int widthAnnotation = WidestLineWidth(surface, vsDraw, vsDraw.annotationStyleOffset, annotationStyledText);
+ int widthAnnotation = WidestLineWidth(surface, vsDraw, vsDraw.annotationStyleOffset, stAnnotation);
widthAnnotation += vsDraw.spaceWidth * 2; // Margins
rcSegment.left = xStart + indent;
rcSegment.right = rcSegment.left + widthAnnotation;
@@ -2378,28 +2334,22 @@ void Editor::DrawAnnotation(Surface *surface, ViewStyle &vsDraw, int line, int x
rcSegment.left = xStart;
}
const int annotationLines = pdoc->AnnotationLines(line);
- LineEnumerator le(annotationStyledText.text, annotationStyledText.length);
- LineSegment ls = le.Next();
size_t start = 0;
- size_t lengthAnnotation = ls.len;
+ size_t lengthAnnotation = stAnnotation.LineLength(start);
int lineInAnnotation = 0;
- while ((lineInAnnotation < annotationLine) && !le.Finished()) {
- start += ls.len + 1;
- ls = le.Next();
- lengthAnnotation = ls.len;
+ while ((lineInAnnotation < annotationLine) && (start < stAnnotation.length)) {
+ start += lengthAnnotation + 1;
+ lengthAnnotation = stAnnotation.LineLength(start);
lineInAnnotation++;
}
PRectangle rcText = rcSegment;
if (vs.annotationVisible == ANNOTATION_BOXED) {
- if (annotationStyledText.multipleStyles) {
- surface->FillRectangle(rcText, vsDraw.styles[annotationStyledText.styles[start] + vsDraw.annotationStyleOffset].back.allocated);
- } else {
- surface->FillRectangle(rcText, vsDraw.styles[annotationStyle].back.allocated);
- }
+ surface->FillRectangle(rcText,
+ vsDraw.styles[stAnnotation.StyleAt(start) + vsDraw.annotationStyleOffset].back.allocated);
rcText.left += vsDraw.spaceWidth;
}
DrawStyledText(surface, vsDraw, vsDraw.annotationStyleOffset, rcText, rcText.top + vsDraw.maxAscent,
- annotationStyledText, start, lengthAnnotation);
+ stAnnotation, start, lengthAnnotation);
if (vs.annotationVisible == ANNOTATION_BOXED) {
surface->MoveTo(rcSegment.left, rcSegment.top);
surface->LineTo(rcSegment.left, rcSegment.bottom);
@@ -7895,36 +7845,38 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
break;
case SCI_MARGINGETTEXT: {
- const char *text = pdoc->MarginText(wParam);
+ const StyledText st = pdoc->MarginStyledText(wParam);
if (lParam) {
- if (text)
- memcpy(CharPtrFromSPtr(lParam), text, pdoc->MarginLength(wParam));
+ if (st.text)
+ memcpy(CharPtrFromSPtr(lParam), st.text, st.length);
else
strcpy(CharPtrFromSPtr(lParam), "");
}
- return text ? pdoc->MarginLength(wParam) : 0;
+ return st.length;
}
case SCI_MARGINSETSTYLE:
pdoc->MarginSetStyle(wParam, lParam);
break;
- case SCI_MARGINGETSTYLE:
- return pdoc->MarginStyle(wParam);
+ case SCI_MARGINGETSTYLE: {
+ const StyledText st = pdoc->MarginStyledText(wParam);
+ return st.style;
+ }
case SCI_MARGINSETSTYLES:
- pdoc->MarginSetStyles(wParam, CharPtrFromSPtr(lParam));
+ pdoc->MarginSetStyles(wParam, reinterpret_cast<const unsigned char *>(lParam));
break;
case SCI_MARGINGETSTYLES: {
- const char *styles = pdoc->MarginStyles(wParam);
+ const StyledText st = pdoc->MarginStyledText(wParam);
if (lParam) {
- if (styles)
- memcpy(CharPtrFromSPtr(lParam), styles, pdoc->MarginLength(wParam));
+ if (st.styles)
+ memcpy(CharPtrFromSPtr(lParam), st.styles, st.length);
else
strcpy(CharPtrFromSPtr(lParam), "");
}
- return styles ? pdoc->MarginLength(wParam) : 0;
+ return st.styles ? st.length : 0;
}
case SCI_MARGINTEXTCLEARALL:
@@ -7936,36 +7888,38 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
break;
case SCI_ANNOTATIONGETTEXT: {
- const char *text = pdoc->AnnotationText(wParam);
+ const StyledText st = pdoc->AnnotationStyledText(wParam);
if (lParam) {
- if (text)
- memcpy(CharPtrFromSPtr(lParam), text, pdoc->AnnotationLength(wParam));
+ if (st.text)
+ memcpy(CharPtrFromSPtr(lParam), st.text, st.length);
else
strcpy(CharPtrFromSPtr(lParam), "");
}
- return text ? pdoc->AnnotationLength(wParam) : 0;
+ return st.length;
}
- case SCI_ANNOTATIONGETSTYLE:
- return pdoc->AnnotationStyle(wParam);
+ case SCI_ANNOTATIONGETSTYLE: {
+ const StyledText st = pdoc->AnnotationStyledText(wParam);
+ return st.style;
+ }
case SCI_ANNOTATIONSETSTYLE:
pdoc->AnnotationSetStyle(wParam, lParam);
break;
case SCI_ANNOTATIONSETSTYLES:
- pdoc->AnnotationSetStyles(wParam, CharPtrFromSPtr(lParam));
+ pdoc->AnnotationSetStyles(wParam, reinterpret_cast<const unsigned char *>(lParam));
break;
case SCI_ANNOTATIONGETSTYLES: {
- const char *styles = pdoc->AnnotationStyles(wParam);
+ const StyledText st = pdoc->AnnotationStyledText(wParam);
if (lParam) {
- if (styles)
- memcpy(CharPtrFromSPtr(lParam), styles, pdoc->AnnotationLength(wParam));
+ if (st.styles)
+ memcpy(CharPtrFromSPtr(lParam), st.styles, st.length);
else
strcpy(CharPtrFromSPtr(lParam), "");
}
- return styles ? pdoc->AnnotationLength(wParam) : 0;
+ return st.styles ? st.length : 0;
}
case SCI_ANNOTATIONGETLINES:
diff --git a/src/PerLine.cxx b/src/PerLine.cxx
index b90416abb..466d2fb31 100644
--- a/src/PerLine.cxx
+++ b/src/PerLine.cxx
@@ -377,9 +377,9 @@ const char *LineAnnotation::Text(int line) const {
return 0;
}
-const char *LineAnnotation::Styles(int line) const {
+const unsigned char *LineAnnotation::Styles(int line) const {
if (annotations.Length() && (line < annotations.Length()) && annotations[line] && MultipleStyles(line))
- return annotations[line] + sizeof(AnnotationHeader) + Length(line);
+ return reinterpret_cast<unsigned char *>(annotations[line] + sizeof(AnnotationHeader) + Length(line));
else
return 0;
}
@@ -428,7 +428,7 @@ void LineAnnotation::SetStyle(int line, int style) {
reinterpret_cast<AnnotationHeader *>(annotations[line])->style = static_cast<short>(style);
}
-void LineAnnotation::SetStyles(int line, const char *styles) {
+void LineAnnotation::SetStyles(int line, const unsigned char *styles) {
annotations.EnsureLength(line+1);
if (!annotations[line]) {
annotations[line] = AllocateAnnotation(0, IndividualStyles);
diff --git a/src/PerLine.h b/src/PerLine.h
index 471219131..8d707bff6 100644
--- a/src/PerLine.h
+++ b/src/PerLine.h
@@ -93,11 +93,11 @@ public:
bool MultipleStyles(int line) const;
int Style(int line);
const char *Text(int line) const;
- const char *Styles(int line) const;
+ const unsigned char *Styles(int line) const;
void SetText(int line, const char *text);
void ClearAll();
void SetStyle(int line, int style);
- void SetStyles(int line, const char *styles);
+ void SetStyles(int line, const unsigned char *styles);
int Length(int line) const;
int Lines(int line) const;
};