diff options
author | Neil <nyamatongwe@gmail.com> | 2017-05-02 10:06:46 +1000 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2017-05-02 10:06:46 +1000 |
commit | ffeb34c29ffd27e1a1a67cb26ceec8fc1253a410 (patch) | |
tree | 59d17870a0bea7b8a058100fdd98666227e7684e /src | |
parent | 782ada0bab34bb56c4023c070e6eb355ca32cdf2 (diff) | |
download | scintilla-mirror-ffeb34c29ffd27e1a1a67cb26ceec8fc1253a410.tar.gz |
Use unique_ptr for drawing surfaces and don't check for allocation failure
as that throws an exception.
Also use unique_ptr for tab stop positions.
Diffstat (limited to 'src')
-rw-r--r-- | src/CallTip.cxx | 8 | ||||
-rw-r--r-- | src/EditView.cxx | 34 | ||||
-rw-r--r-- | src/EditView.h | 8 | ||||
-rw-r--r-- | src/Editor.cxx | 2 | ||||
-rw-r--r-- | src/Editor.h | 31 | ||||
-rw-r--r-- | src/MarginView.cxx | 18 | ||||
-rw-r--r-- | src/MarginView.h | 6 |
7 files changed, 42 insertions, 65 deletions
diff --git a/src/CallTip.cxx b/src/CallTip.cxx index c3d1ca767..de2b37c63 100644 --- a/src/CallTip.cxx +++ b/src/CallTip.cxx @@ -12,6 +12,7 @@ #include <stdexcept> #include <string> #include <algorithm> +#include <memory> #include "Platform.h" @@ -258,9 +259,7 @@ PRectangle CallTip::CallTipStart(Sci::Position pos, Point pt, int textHeight, co clickPlace = 0; val = defn; codePage = codePage_; - Surface *surfaceMeasure = Surface::Allocate(technology); - if (!surfaceMeasure) - return PRectangle(); + std::unique_ptr<Surface> surfaceMeasure(Surface::Allocate(technology)); surfaceMeasure->Init(wParent.GetID()); surfaceMeasure->SetUnicodeMode(SC_CP_UTF8 == codePage); surfaceMeasure->SetDBCSMode(codePage); @@ -279,7 +278,7 @@ PRectangle CallTip::CallTipStart(Sci::Position pos, Point pt, int textHeight, co rectUp = PRectangle(0,0,0,0); rectDown = PRectangle(0,0,0,0); offsetMain = insetX; // changed to right edge of any arrows - int width = PaintContents(surfaceMeasure, false) + insetX; + const int width = PaintContents(surfaceMeasure.get(), false) + insetX; while ((newline = strchr(look, '\n')) != NULL) { look = newline + 1; numLines++; @@ -290,7 +289,6 @@ PRectangle CallTip::CallTipStart(Sci::Position pos, Point pt, int textHeight, co // rectangle is aligned to the right edge of the last arrow encountered in // the tip text, else to the tip text left edge. int height = lineHeight * numLines - static_cast<int>(surfaceMeasure->InternalLeading(font)) + borderHeight * 2; - delete surfaceMeasure; if (above) { return PRectangle(pt.x - offsetMain, pt.y - verticalOffset - height, pt.x + width - offsetMain, pt.y - verticalOffset); } else { diff --git a/src/EditView.cxx b/src/EditView.cxx index 50555b0a1..d1ebc345a 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -175,7 +175,6 @@ void DrawStyledText(Surface *surface, const ViewStyle &vs, int styleOffset, PRec const XYPOSITION epsilon = 0.0001f; // A small nudge to avoid floating point precision issues EditView::EditView() { - ldTabstops = NULL; tabWidthMinimumPixels = 2; // needed for calculating tab stops for fractional proportional fonts hideSelection = false; drawOverstrikeCaret = true; @@ -185,9 +184,6 @@ EditView::EditView() { additionalCaretsBlink = true; additionalCaretsVisible = true; imeCaretBlockOverride = false; - pixmapLine = 0; - pixmapIndentGuide = 0; - pixmapIndentGuideHighlight = 0; llc.SetLevel(LineLayoutCache::llcCaret); posCache.SetSize(0x400); tabArrowHeight = 4; @@ -196,8 +192,6 @@ EditView::EditView() { } EditView::~EditView() { - delete ldTabstops; - ldTabstops = NULL; } bool EditView::SetTwoPhaseDraw(bool twoPhaseDraw) { @@ -219,8 +213,7 @@ bool EditView::LinesOverlap() const { } void EditView::ClearAllTabstops() { - delete ldTabstops; - ldTabstops = 0; + ldTabstops.reset(); } XYPOSITION EditView::NextTabstopPos(Sci::Line line, XYPOSITION x, XYPOSITION tabWidth) const { @@ -231,20 +224,20 @@ XYPOSITION EditView::NextTabstopPos(Sci::Line line, XYPOSITION x, XYPOSITION tab } bool EditView::ClearTabstops(Sci::Line line) { - LineTabstops *lt = static_cast<LineTabstops *>(ldTabstops); + LineTabstops *lt = static_cast<LineTabstops *>(ldTabstops.get()); return lt && lt->ClearTabstops(line); } bool EditView::AddTabstop(Sci::Line line, int x) { if (!ldTabstops) { - ldTabstops = new LineTabstops(); + ldTabstops.reset(new LineTabstops()); } - LineTabstops *lt = static_cast<LineTabstops *>(ldTabstops); + LineTabstops *lt = static_cast<LineTabstops *>(ldTabstops.get()); return lt && lt->AddTabstop(line, x); } int EditView::GetNextTabstop(Sci::Line line, int x) const { - const LineTabstops *lt = static_cast<LineTabstops *>(ldTabstops); + const LineTabstops *lt = static_cast<LineTabstops *>(ldTabstops.get()); if (lt) { return lt->GetNextTabstop(line, x); } else { @@ -268,12 +261,9 @@ void EditView::LinesAddedOrRemoved(Sci::Line lineOfPos, Sci::Line linesAdded) { void EditView::DropGraphics(bool freeObjects) { if (freeObjects) { - delete pixmapLine; - pixmapLine = 0; - delete pixmapIndentGuide; - pixmapIndentGuide = 0; - delete pixmapIndentGuideHighlight; - pixmapIndentGuideHighlight = 0; + pixmapLine.reset(); + pixmapIndentGuide.reset(); + pixmapIndentGuideHighlight.reset(); } else { if (pixmapLine) pixmapLine->Release(); @@ -286,11 +276,11 @@ void EditView::DropGraphics(bool freeObjects) { void EditView::AllocateGraphics(const ViewStyle &vsDraw) { if (!pixmapLine) - pixmapLine = Surface::Allocate(vsDraw.technology); + pixmapLine.reset(Surface::Allocate(vsDraw.technology)); if (!pixmapIndentGuide) - pixmapIndentGuide = Surface::Allocate(vsDraw.technology); + pixmapIndentGuide.reset(Surface::Allocate(vsDraw.technology)); if (!pixmapIndentGuideHighlight) - pixmapIndentGuideHighlight = Surface::Allocate(vsDraw.technology); + pixmapIndentGuideHighlight.reset(Surface::Allocate(vsDraw.technology)); } static const char *ControlCharacterString(unsigned char ch) { @@ -1984,7 +1974,7 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan Surface *surface = surfaceWindow; if (bufferedDraw) { - surface = pixmapLine; + surface = pixmapLine.get(); PLATFORM_ASSERT(pixmapLine->Initialised()); } surface->SetUnicodeMode(SC_CP_UTF8 == model.pdoc->dbcsCodePage); diff --git a/src/EditView.h b/src/EditView.h index 7a3926aa2..a842ac63a 100644 --- a/src/EditView.h +++ b/src/EditView.h @@ -50,7 +50,7 @@ typedef void (*DrawTabArrowFn)(Surface *surface, PRectangle rcTab, int ymid); class EditView { public: PrintParameters printParameters; - PerLine *ldTabstops; + std::unique_ptr<PerLine> ldTabstops; int tabWidthMinimumPixels; bool hideSelection; @@ -74,9 +74,9 @@ public: bool imeCaretBlockOverride; - Surface *pixmapLine; - Surface *pixmapIndentGuide; - Surface *pixmapIndentGuideHighlight; + std::unique_ptr<Surface> pixmapLine; + std::unique_ptr<Surface> pixmapIndentGuide; + std::unique_ptr<Surface> pixmapIndentGuideHighlight; LineLayoutCache llc; PositionCache posCache; diff --git a/src/Editor.cxx b/src/Editor.cxx index 5330ea45b..9344b7d94 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -1653,7 +1653,7 @@ void Editor::PaintSelMargin(Surface *surfaceWindow, PRectangle &rc) { Surface *surface; if (view.bufferedDraw) { - surface = marginView.pixmapSelMargin; + surface = marginView.pixmapSelMargin.get(); } else { surface = surfaceWindow; } diff --git a/src/Editor.h b/src/Editor.h index 9ddb753e6..69c816270 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -602,39 +602,34 @@ public: */ class AutoSurface { private: - Surface *surf; + std::unique_ptr<Surface> surf; public: - AutoSurface(Editor *ed, int technology = -1) : surf(0) { + AutoSurface(Editor *ed, int technology = -1) { if (ed->wMain.GetID()) { - surf = Surface::Allocate(technology != -1 ? technology : ed->technology); - if (surf) { - surf->Init(ed->wMain.GetID()); - surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage()); - surf->SetDBCSMode(ed->CodePage()); - } + surf.reset(Surface::Allocate(technology != -1 ? technology : ed->technology)); + surf->Init(ed->wMain.GetID()); + surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage()); + surf->SetDBCSMode(ed->CodePage()); } } - AutoSurface(SurfaceID sid, Editor *ed, int technology = -1) : surf(0) { + AutoSurface(SurfaceID sid, Editor *ed, int technology = -1) { if (ed->wMain.GetID()) { - surf = Surface::Allocate(technology != -1 ? technology : ed->technology); - if (surf) { - surf->Init(sid, ed->wMain.GetID()); - surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage()); - surf->SetDBCSMode(ed->CodePage()); - } + surf.reset(Surface::Allocate(technology != -1 ? technology : ed->technology)); + surf->Init(sid, ed->wMain.GetID()); + surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage()); + surf->SetDBCSMode(ed->CodePage()); } } // Deleted so AutoSurface objects can not be copied. AutoSurface(const AutoSurface &) = delete; void operator=(const AutoSurface &) = delete; ~AutoSurface() { - delete surf; } Surface *operator->() const { - return surf; + return surf.get(); } operator Surface *() const { - return surf; + return surf.get(); } }; diff --git a/src/MarginView.cxx b/src/MarginView.cxx index 27bf1e10d..e371a4891 100644 --- a/src/MarginView.cxx +++ b/src/MarginView.cxx @@ -102,21 +102,15 @@ void DrawWrapMarker(Surface *surface, PRectangle rcPlace, } MarginView::MarginView() { - pixmapSelMargin = 0; - pixmapSelPattern = 0; - pixmapSelPatternOffset1 = 0; wrapMarkerPaddingRight = 3; customDrawWrapMarker = NULL; } void MarginView::DropGraphics(bool freeObjects) { if (freeObjects) { - delete pixmapSelMargin; - pixmapSelMargin = 0; - delete pixmapSelPattern; - pixmapSelPattern = 0; - delete pixmapSelPatternOffset1; - pixmapSelPatternOffset1 = 0; + pixmapSelMargin.reset(); + pixmapSelPattern.reset(); + pixmapSelPatternOffset1.reset(); } else { if (pixmapSelMargin) pixmapSelMargin->Release(); @@ -129,11 +123,11 @@ void MarginView::DropGraphics(bool freeObjects) { void MarginView::AllocateGraphics(const ViewStyle &vsDraw) { if (!pixmapSelMargin) - pixmapSelMargin = Surface::Allocate(vsDraw.technology); + pixmapSelMargin.reset(Surface::Allocate(vsDraw.technology)); if (!pixmapSelPattern) - pixmapSelPattern = Surface::Allocate(vsDraw.technology); + pixmapSelPattern.reset(Surface::Allocate(vsDraw.technology)); if (!pixmapSelPatternOffset1) - pixmapSelPatternOffset1 = Surface::Allocate(vsDraw.technology); + pixmapSelPatternOffset1.reset(Surface::Allocate(vsDraw.technology)); } void MarginView::RefreshPixMaps(Surface *surfaceWindow, WindowID wid, const ViewStyle &vsDraw) { diff --git a/src/MarginView.h b/src/MarginView.h index eb136d71e..695126ad9 100644 --- a/src/MarginView.h +++ b/src/MarginView.h @@ -21,9 +21,9 @@ typedef void (*DrawWrapMarkerFn)(Surface *surface, PRectangle rcPlace, bool isEn */ class MarginView { public: - Surface *pixmapSelMargin; - Surface *pixmapSelPattern; - Surface *pixmapSelPatternOffset1; + std::unique_ptr<Surface> pixmapSelMargin; + std::unique_ptr<Surface> pixmapSelPattern; + std::unique_ptr<Surface> pixmapSelPatternOffset1; // Highlight current folding block HighlightDelimiter highlightDelimiter; |