diff options
-rw-r--r-- | src/Document.cxx | 48 | ||||
-rw-r--r-- | src/Document.h | 31 | ||||
-rw-r--r-- | src/Editor.cxx | 154 | ||||
-rw-r--r-- | src/PerLine.cxx | 6 | ||||
-rw-r--r-- | src/PerLine.h | 4 |
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; }; |