Skip to content

Commit 847d5b2

Browse files
committed
Fix PDF refreshing bug by adding std::move
1 parent 9af56ad commit 847d5b2

File tree

7 files changed

+66
-21
lines changed

7 files changed

+66
-21
lines changed

src/hdcbuffer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,8 @@ pdfv::hdc::Renderer::RenderT & pdfv::hdc::Renderer::getPage(std::size_t pageIdx)
3030
{
3131
return this->bmBuffer.at(pageIdx).hrender;
3232
}
33+
void pdfv::hdc::Renderer::removePage(std::size_t pageIdx) noexcept
34+
{
35+
this->bmBuffer.erase(pageIdx);
36+
}
3337

src/hdcbuffer.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,12 @@ namespace pdfv::hdc
5252
* @return RenderT& Reference to requested page's render object
5353
*/
5454
RenderT & getPage(std::size_t pageIdx);
55+
56+
/**
57+
* @brief Removes pre-rendered page from buffer
58+
*
59+
* @param pageIdx Page index
60+
*/
61+
void removePage(std::size_t pageIdx) noexcept;
5562
};
5663
}

src/lib.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ pdfv::Pdfium::Pdfium() noexcept
2424
pdfv::Pdfium::Pdfium(Pdfium && other) noexcept
2525
: m_fdoc(other.m_fdoc), m_fpage(other.m_fpage),
2626
m_fpagenum(other.m_fpagenum), m_numPages(other.m_numPages),
27-
m_buf(std::move(other.m_buf))
27+
m_buf(std::move(other.m_buf)), m_optRenderer(std::move(other.m_optRenderer))
2828
{
2929
DEBUGPRINT("pdfv::Pdfium::Pdfium(%p)\n", static_cast<void *>(&other));
3030
other.m_fdoc = nullptr;
@@ -34,11 +34,12 @@ pdfv::Pdfium & pdfv::Pdfium::operator=(Pdfium && other) noexcept
3434
{
3535
DEBUGPRINT("pdfv::Pdfium::operator=(%p)\n", static_cast<void *>(&other));
3636

37-
this->m_fdoc = other.m_fdoc;
38-
this->m_fpage = other.m_fpage;
39-
this->m_fpagenum = other.m_fpagenum;
40-
this->m_numPages = other.m_numPages;
41-
this->m_buf = std::move(other.m_buf);
37+
this->m_fdoc = other.m_fdoc;
38+
this->m_fpage = other.m_fpage;
39+
this->m_fpagenum = other.m_fpagenum;
40+
this->m_numPages = other.m_numPages;
41+
this->m_buf = std::move(other.m_buf);
42+
this->m_optRenderer = std::move(other.m_optRenderer);
4243

4344
other.m_fdoc = nullptr;
4445
other.m_fpage = nullptr;
@@ -258,8 +259,8 @@ pdfv::error::Errorcode pdfv::Pdfium::pageRender(HDC dc, pdfv::xy<int> pos, pdfv:
258259
DEBUGPRINT("render!\n");
259260
auto argv{ reinterpret_cast<void **>(args) };
260261

261-
auto self{ static_cast<Pdfium *>(argv[0]) };
262-
auto dc { static_cast<HDC>(argv[1]) };
262+
auto self{ static_cast<Pdfium * >(argv[0]) };
263+
auto dc { static_cast<HDC >(argv[1]) };
263264
auto size{ static_cast<xy<int> *>(argv[2]) };
264265

265266
auto memdc { ::CreateCompatibleDC(dc) };
@@ -298,3 +299,8 @@ pdfv::error::Errorcode pdfv::Pdfium::pageRender(HDC dc, pdfv::xy<int> pos, pdfv:
298299
return error::pdf_page;
299300
}
300301
}
302+
303+
void pdfv::Pdfium::flush() noexcept
304+
{
305+
this->m_optRenderer.clear();
306+
}

src/lib.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,5 +151,7 @@ namespace pdfv
151151
{
152152
return this->m_fdoc != nullptr;
153153
}
154+
155+
void flush() noexcept;
154156
};
155157
}

src/tabs.cpp

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,27 @@ pdfv::TabObject::TabObject(std::wstring && v1, pdfv::Pdfium && v2)
1313
{
1414
this->first.append(pdfv::Tabs::padding);
1515
}
16+
pdfv::TabObject::TabObject(TabObject && other) noexcept
17+
: first(std::move(other.first)), second(std::move(other.second)), zoom(other.zoom),
18+
yMaxScroll(other.yMaxScroll), yMinScroll(other.yMinScroll), page(other.page)
19+
{
20+
}
21+
pdfv::TabObject & pdfv::TabObject::operator=(TabObject && other) noexcept
22+
{
23+
this->first = std::move(other.first);
24+
this->second = std::move(other.second);
25+
this->zoom = other.zoom;
26+
27+
this->yMaxScroll = other.yMaxScroll;
28+
this->yMinScroll = other.yMinScroll;
29+
this->page = other.page;
30+
31+
return *this;
32+
}
33+
pdfv::TabObject::~TabObject() noexcept
34+
{
35+
this->second.flush();
36+
}
1637

1738

1839

@@ -334,9 +355,9 @@ void pdfv::Tabs::move(xy<int> newpos) noexcept
334355
w::moveWin(this->getTabsHandle(), this->m_pos.x, this->m_pos.y);
335356
}
336357
}
337-
void pdfv::Tabs::redrawTabs() noexcept
358+
void pdfv::Tabs::redrawTabs(bool erase) noexcept
338359
{
339-
w::redraw(this->getTabsHandle());
360+
w::redraw(this->getTabsHandle(), erase);
340361
this->updateScrollbar();
341362
this->updatePageCounter();
342363
this->updateZoom();
@@ -398,6 +419,7 @@ void pdfv::Tabs::remove(std::wstring_view title) noexcept
398419
{
399420
if ((it)->first == title)
400421
{
422+
// Remove this page from buffer
401423
this->m_tabs.erase(it);
402424
TabCtrl_DeleteItem(this->m_tabshwnd, index);
403425
break;
@@ -463,7 +485,7 @@ pdfv::Tabs::ListType::iterator pdfv::Tabs::rename(std::wstring_view title, const
463485
return this->m_tabs[index].first;
464486
}
465487
}
466-
void pdfv::Tabs::select(const ssize_t index) noexcept
488+
void pdfv::Tabs::select(const ssize_t index, bool erase) noexcept
467489
{
468490
if (index == Tabs::endpos)
469491
{
@@ -473,17 +495,17 @@ void pdfv::Tabs::select(const ssize_t index) noexcept
473495
{
474496
TabCtrl_SetCurSel(this->m_tabshwnd, std::clamp(index, ssize_t(0), ssize_t(this->m_tabs.size() - 1)));
475497
}
476-
this->selChange();
498+
this->selChange(erase);
477499
}
478500
[[nodiscard]] std::size_t pdfv::Tabs::size() const noexcept
479501
{
480502
return this->m_tabs.size();
481503
}
482-
void pdfv::Tabs::selChange() noexcept
504+
void pdfv::Tabs::selChange(bool erase) noexcept
483505
{
484506
this->m_tabindex = TabCtrl_GetCurSel(this->m_tabshwnd);
485507

486-
this->redrawTabs();
508+
this->redrawTabs(erase);
487509
}
488510

489511
void pdfv::Tabs::updateScrollbar() noexcept

src/tabs.hpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ namespace pdfv
2424
TabObject(std::wstring_view v1, pdfv::Pdfium && v2 = pdfv::Pdfium());
2525
TabObject(std::wstring && v1, pdfv::Pdfium && v2 = pdfv::Pdfium());
2626
TabObject(const TabObject & other) = delete;
27-
TabObject(TabObject && other) noexcept = default;
27+
TabObject(TabObject && other) noexcept;
2828
TabObject & operator=(const TabObject & other) = delete;
29-
TabObject & operator=(TabObject && other) noexcept = default;
30-
~TabObject() noexcept = default;
29+
TabObject & operator=(TabObject && other) noexcept;
30+
~TabObject() noexcept;
3131

3232
private:
3333

@@ -132,8 +132,10 @@ namespace pdfv
132132
/**
133133
* @brief Redraws the tab control
134134
*
135+
* @param erase Whether to erase the control
136+
*
135137
*/
136-
void redrawTabs() noexcept;
138+
void redrawTabs(bool erase = false) noexcept;
137139
/**
138140
* @brief Redraws the tab canvas
139141
*
@@ -185,17 +187,19 @@ namespace pdfv
185187
* @brief Selects a tab, makes it active
186188
*
187189
* @param index Tab index, Tabs::endpos by default
190+
* @param erase Controls whether to erase the tab
188191
*/
189-
void select(const ssize_t index = Tabs::endpos) noexcept;
192+
void select(const ssize_t index = Tabs::endpos, bool erase = false) noexcept;
190193
/**
191194
* @return std::size_t Number of tab currently present
192195
*/
193196
[[nodiscard]] std::size_t size() const noexcept;
194197
/**
195198
* @brief Handles the tab control active tab changes
196199
*
200+
* @param erase Controls whether to erase the tab
197201
*/
198-
void selChange() noexcept;
202+
void selChange(bool erase = false) noexcept;
199203

200204
void updateScrollbar() noexcept;
201205

src/version.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#pragma once
22

33
#define APP_CLASSNAME L"PdfiumViewCpp"
4-
#define VERSION_STRING L"0.8b pre3"
4+
#define VERSION_STRING L"0.8"
55
#define PRODUCT_NAME L"PdfiumView"
66
#define APP_NAME PRODUCT_NAME L" v" VERSION_STRING
77

0 commit comments

Comments
 (0)