From 90bd9a247fb96d2ebbbc191a4895121249c4056b Mon Sep 17 00:00:00 2001 From: Fred Emmott Date: Wed, 20 Mar 2024 11:20:01 -0500 Subject: [PATCH] IPageSource::RenderPage: D2D1_RECT_F -> PixelRect refs #507 - Clean up use of D2D1_{RECT,SIZE,POINT}_* except at D2D boundaries --- src/app/app-common/CachedLayer.cpp | 2 +- .../PageSource/ImageFilePageSource.cpp | 20 ++++----- .../PageSource/PDFFilePageSource.cpp | 21 ++++------ .../PageSource/PageSourceWithDelegates.cpp | 16 ++------ .../PageSource/PlainTextPageSource.cpp | 41 ++++++++++--------- .../app-common/PageSource/WGCPageSource.cpp | 15 +------ .../include/OpenKneeboard/IPageSource.h | 2 +- .../OpenKneeboard/ImageFilePageSource.h | 2 +- .../include/OpenKneeboard/PDFFilePageSource.h | 4 +- .../OpenKneeboard/PageSourceWithDelegates.h | 6 ++- .../OpenKneeboard/PlainTextPageSource.h | 2 +- .../include/OpenKneeboard/WGCPageSource.h | 2 +- src/app/app-common/Tab/EndlessNotebookTab.cpp | 2 +- src/app/app-common/Tab/NavigationTab.cpp | 18 ++++---- .../OpenKneeboard/EndlessNotebookTab.h | 2 +- .../Tab/include/OpenKneeboard/NavigationTab.h | 4 +- .../include/OpenKneeboard/CachedLayer.h | 2 +- 17 files changed, 67 insertions(+), 94 deletions(-) diff --git a/src/app/app-common/CachedLayer.cpp b/src/app/app-common/CachedLayer.cpp index df860e4a2..17e353129 100644 --- a/src/app/app-common/CachedLayer.cpp +++ b/src/app/app-common/CachedLayer.cpp @@ -38,7 +38,7 @@ void CachedLayer::Render( const D2D1_RECT_F& where, Key cacheKey, RenderTarget* rt, - std::function impl, + std::function impl, const std::optional& providedCacheDimensions) { std::scoped_lock lock(mCacheMutex); diff --git a/src/app/app-common/PageSource/ImageFilePageSource.cpp b/src/app/app-common/PageSource/ImageFilePageSource.cpp index f3068e0cb..d6fc536f4 100644 --- a/src/app/app-common/PageSource/ImageFilePageSource.cpp +++ b/src/app/app-common/PageSource/ImageFilePageSource.cpp @@ -145,29 +145,25 @@ PreferredSize ImageFilePageSource::GetPreferredSize(PageID pageID) { void ImageFilePageSource::RenderPage( RenderTarget* rt, PageID pageID, - const D2D1_RECT_F& rect) { + const PixelRect& rect) { auto bitmap = GetPageBitmap(pageID); if (!bitmap) { return; } const auto pageSize = bitmap->GetPixelSize(); - const auto targetWidth = rect.right - rect.left; - const auto targetHeight = rect.bottom - rect.top; - const auto scaleX = float(targetWidth) / pageSize.width; - const auto scaleY = float(targetHeight) / pageSize.height; - const auto scale = std::min(scaleX, scaleY); + const auto renderSize + = PixelSize(pageSize.width, pageSize.height).ScaledToFit(rect.mSize); - const auto renderWidth = pageSize.width * scale; - const auto renderHeight = pageSize.height * scale; - - const auto renderLeft = rect.left + ((targetWidth - renderWidth) / 2); - const auto renderTop = rect.top + ((targetHeight - renderHeight) / 2); + const auto renderLeft + = rect.Left() + ((rect.Width() - renderSize.Width()) / 2); + const auto renderTop + = rect.Top() + ((rect.Height() - renderSize.Height()) / 2); auto ctx = rt->d2d(); ctx->DrawBitmap( bitmap.get(), - {renderLeft, renderTop, renderLeft + renderWidth, renderTop + renderHeight}, + PixelRect {{renderLeft, renderTop}, renderSize}, 1.0f, D2D1_INTERPOLATION_MODE_ANISOTROPIC); } diff --git a/src/app/app-common/PageSource/PDFFilePageSource.cpp b/src/app/app-common/PageSource/PDFFilePageSource.cpp index 7d224c604..6c508a51a 100644 --- a/src/app/app-common/PageSource/PDFFilePageSource.cpp +++ b/src/app/app-common/PageSource/PDFFilePageSource.cpp @@ -384,7 +384,7 @@ PreferredSize PDFFilePageSource::GetPreferredSize(PageID id) { void PDFFilePageSource::RenderPageContent( RenderTarget* rt, PageID id, - const D2D1_RECT_F& rect) noexcept { + const PixelRect& rect) noexcept { OPENKNEEBOARD_TraceLoggingScope("PDFFilePageSource::RenderPageContent()"); // Keep alive auto p = this->p; @@ -406,11 +406,12 @@ void PDFFilePageSource::RenderPageContent( ctx->FillRectangle(rect, p->mBackgroundBrush.get()); PDF_RENDER_PARAMS params { - .DestinationWidth = static_cast(std::lround(rect.right - rect.left)), - .DestinationHeight = static_cast(std::lround(rect.bottom - rect.top)), + .DestinationWidth = rect.Width(), + .DestinationHeight = rect.Height(), }; - ctx->SetTransform(D2D1::Matrix3x2F::Translation({rect.left, rect.top})); + ctx->SetTransform(D2D1::Matrix3x2F::Translation( + rect.TopLeft().StaticCast())); { const std::unique_lock d2dlock(*(p->mDXR)); @@ -537,7 +538,7 @@ std::vector PDFFilePageSource::GetNavigationEntries() const { void PDFFilePageSource::RenderPage( RenderTarget* rt, PageID pageID, - const D2D1_RECT_F& rect) { + const PixelRect& rect) { const auto rtid = rt->GetID(); OPENKNEEBOARD_TraceLoggingScope("PDFFilePageSource::RenderPage()"); if (!p->mCache.contains(rtid)) { @@ -551,15 +552,7 @@ void PDFFilePageSource::RenderPage( pageID.GetTemporaryValue(), rt, [=](auto rt, const auto& size) { - this->RenderPageContent( - rt, - pageID, - { - 0.0f, - 0.0f, - static_cast(size.width), - static_cast(size.height), - }); + this->RenderPageContent(rt, pageID, {{0, 0}, size}); }, cacheDimensions); diff --git a/src/app/app-common/PageSource/PageSourceWithDelegates.cpp b/src/app/app-common/PageSource/PageSourceWithDelegates.cpp index 889382c44..4a5c5380f 100644 --- a/src/app/app-common/PageSource/PageSourceWithDelegates.cpp +++ b/src/app/app-common/PageSource/PageSourceWithDelegates.cpp @@ -141,7 +141,7 @@ PreferredSize PageSourceWithDelegates::GetPreferredSize(PageID pageID) { void PageSourceWithDelegates::RenderPage( RenderTarget* rt, PageID pageID, - const D2D1_RECT_F& rect) { + const PixelRect& rect) { auto delegate = this->FindDelegate(pageID); if (!delegate) { OPENKNEEBOARD_BREAK; @@ -168,7 +168,7 @@ void PageSourceWithDelegates::RenderPageWithCache( IPageSource* delegate, RenderTarget* rt, PageID pageID, - const D2D1_RECT_F& rect) { + const PixelRect& rect) { const auto rtid = rt->GetID(); if (!mContentLayerCache.contains(rtid)) { mContentLayerCache[rtid] = std::make_unique(mDXResources); @@ -178,16 +178,8 @@ void PageSourceWithDelegates::RenderPageWithCache( rect, pageID.GetTemporaryValue(), rt, - [delegate, pageID](RenderTarget* rt, const D2D1_SIZE_U& size) { - delegate->RenderPage( - rt, - pageID, - { - 0.0f, - 0.0f, - static_cast(size.width), - static_cast(size.height), - }); + [delegate, pageID](RenderTarget* rt, const PixelSize& size) { + delegate->RenderPage(rt, pageID, {{0, 0}, size}); }); } diff --git a/src/app/app-common/PageSource/PlainTextPageSource.cpp b/src/app/app-common/PageSource/PlainTextPageSource.cpp index 661e031a4..3703bd449 100644 --- a/src/app/app-common/PageSource/PlainTextPageSource.cpp +++ b/src/app/app-common/PageSource/PlainTextPageSource.cpp @@ -150,26 +150,23 @@ std::optional PlainTextPageSource::FindPageIndex( void PlainTextPageSource::RenderPage( RenderTarget* rt, PageID pageID, - const D2D1_RECT_F& rect) { + const PixelRect& rect) { std::unique_lock lock(mMutex); const auto virtualSize = this->GetPreferredSize(pageID).mPixelSize; - const D2D1_SIZE_F canvasSize {rect.right - rect.left, rect.bottom - rect.top}; + const auto renderSize = virtualSize.ScaledToFit(rect.mSize); - const auto scaleX = canvasSize.width / virtualSize.mWidth; - const auto scaleY = canvasSize.height / virtualSize.mHeight; - const auto scale = std::min(scaleX, scaleY); - const D2D1_SIZE_F renderSize - = Geometry2D::Size( - scale * virtualSize.mWidth, scale * virtualSize.mHeight) - .Rounded(); + const float renderLeft + = rect.Left() + ((rect.Width() - renderSize.Width()) / 2); + const float renderTop + = rect.Top() + ((rect.Height() - renderSize.Height()) / 2); + + const auto scale = renderSize.Height() / virtualSize.Height(); auto ctx = rt->d2d(); ctx->SetTransform( D2D1::Matrix3x2F::Scale(scale, scale) - * D2D1::Matrix3x2F::Translation( - rect.left + ((canvasSize.width - renderSize.width) / 2), - rect.top + ((canvasSize.height - renderSize.height) / 2))); + * D2D1::Matrix3x2F::Translation(renderLeft, renderTop)); winrt::com_ptr background; winrt::com_ptr textBrush; @@ -179,10 +176,12 @@ void PlainTextPageSource::RenderPage( ctx->CreateSolidColorBrush({0.5f, 0.5f, 0.5f, 1.0f}, footerBrush.put()); ctx->FillRectangle( - {0.0f, - 0.0f, - static_cast(virtualSize.mWidth), - static_cast(virtualSize.mHeight)}, + { + 0.0f, + 0.0f, + virtualSize.Width(), + virtualSize.Height(), + }, background.get()); auto textFormat = mTextFormat.get(); @@ -231,10 +230,12 @@ void PlainTextPageSource::RenderPage( text.data(), static_cast(text.size()), textFormat, - {mPadding, - point.y, - FLOAT(virtualSize.mWidth), - FLOAT(virtualSize.mHeight)}, + { + mPadding, + point.y, + virtualSize.Width(), + virtualSize.Height(), + }, footerBrush.get()); } diff --git a/src/app/app-common/PageSource/WGCPageSource.cpp b/src/app/app-common/PageSource/WGCPageSource.cpp index 1a7442259..ba9816cae 100644 --- a/src/app/app-common/PageSource/WGCPageSource.cpp +++ b/src/app/app-common/PageSource/WGCPageSource.cpp @@ -212,7 +212,7 @@ PreferredSize WGCPageSource::GetPreferredSize(PageID) { void WGCPageSource::RenderPage( RenderTarget* rt, PageID, - const D2D1_RECT_F& rect) { + const PixelRect& rect) { if (!(mTexture && mCaptureItem)) { return; } @@ -228,19 +228,8 @@ void WGCPageSource::RenderPage( auto sb = mDXR->mSpriteBatch.get(); sb->Begin(d3d.rtv(), rt->GetDimensions()); - const auto sourceRect = this->GetContentRect(mCaptureSize); - const PixelRect destRect { - { - static_cast(std::lround(rect.left)), - static_cast(std::lround(rect.top)), - }, - { - static_cast(std::lround(rect.right - rect.left)), - static_cast(std::lround(rect.bottom - rect.top)), - }}; - sb->Draw(mShaderResourceView.get(), sourceRect, destRect, color); - + sb->Draw(mShaderResourceView.get(), sourceRect, rect, color); sb->End(); mNeedsRepaint = false; diff --git a/src/app/app-common/PageSource/include/OpenKneeboard/IPageSource.h b/src/app/app-common/PageSource/include/OpenKneeboard/IPageSource.h index cf601f8cb..56da90bfc 100644 --- a/src/app/app-common/PageSource/include/OpenKneeboard/IPageSource.h +++ b/src/app/app-common/PageSource/include/OpenKneeboard/IPageSource.h @@ -51,7 +51,7 @@ class IPageSource { virtual std::vector GetPageIDs() const = 0; virtual PreferredSize GetPreferredSize(PageID) = 0; - virtual void RenderPage(RenderTarget*, PageID, const D2D1_RECT_F& rect) = 0; + virtual void RenderPage(RenderTarget*, PageID, const PixelRect& rect) = 0; Event<> evNeedsRepaintEvent; Event evPageAppendedEvent; diff --git a/src/app/app-common/PageSource/include/OpenKneeboard/ImageFilePageSource.h b/src/app/app-common/PageSource/include/OpenKneeboard/ImageFilePageSource.h index 8f8d32fcb..30cc9e219 100644 --- a/src/app/app-common/PageSource/include/OpenKneeboard/ImageFilePageSource.h +++ b/src/app/app-common/PageSource/include/OpenKneeboard/ImageFilePageSource.h @@ -55,7 +55,7 @@ class ImageFilePageSource final const audited_ptr& dxr, const std::filesystem::path&); - virtual void RenderPage(RenderTarget*, PageID, const D2D1_RECT_F& rect) + virtual void RenderPage(RenderTarget*, PageID, const PixelRect& rect) final override; virtual bool IsNavigationAvailable() const override; diff --git a/src/app/app-common/PageSource/include/OpenKneeboard/PDFFilePageSource.h b/src/app/app-common/PageSource/include/OpenKneeboard/PDFFilePageSource.h index 8862cc327..b4b5adcad 100644 --- a/src/app/app-common/PageSource/include/OpenKneeboard/PDFFilePageSource.h +++ b/src/app/app-common/PageSource/include/OpenKneeboard/PDFFilePageSource.h @@ -73,7 +73,7 @@ class PDFFilePageSource final virtual void ClearUserInput(PageID) override; virtual void ClearUserInput() override; - virtual void RenderPage(RenderTarget*, PageID, const D2D1_RECT_F& rect) + virtual void RenderPage(RenderTarget*, PageID, const PixelRect& rect) override; private: @@ -89,7 +89,7 @@ class PDFFilePageSource final void RenderPageContent( RenderTarget* rt, PageID pageIndex, - const D2D1_RECT_F& rect) noexcept; + const PixelRect& rect) noexcept; void RenderOverDoodles(ID2D1DeviceContext*, PageID pageIndex, const D2D1_RECT_F&); diff --git a/src/app/app-common/PageSource/include/OpenKneeboard/PageSourceWithDelegates.h b/src/app/app-common/PageSource/include/OpenKneeboard/PageSourceWithDelegates.h index 1a68a62b2..90a56734f 100644 --- a/src/app/app-common/PageSource/include/OpenKneeboard/PageSourceWithDelegates.h +++ b/src/app/app-common/PageSource/include/OpenKneeboard/PageSourceWithDelegates.h @@ -51,7 +51,7 @@ class PageSourceWithDelegates : public virtual IPageSource, virtual PageIndex GetPageCount() const override; virtual std::vector GetPageIDs() const override; virtual PreferredSize GetPreferredSize(PageID) override; - virtual void RenderPage(RenderTarget*, PageID, const D2D1_RECT_F& rect) + virtual void RenderPage(RenderTarget*, PageID, const PixelRect& rect) override; virtual void PostCursorEvent(EventContext, const CursorEvent&, PageID) @@ -82,7 +82,9 @@ class PageSourceWithDelegates : public virtual IPageSource, void RenderPageWithCache( IPageSource* delegate, - RenderTarget*, PageID, const D2D1_RECT_F& rect); + RenderTarget*, + PageID, + const PixelRect& rect); }; }// namespace OpenKneeboard diff --git a/src/app/app-common/PageSource/include/OpenKneeboard/PlainTextPageSource.h b/src/app/app-common/PageSource/include/OpenKneeboard/PlainTextPageSource.h index 0ad985c76..d2cd9f4f2 100644 --- a/src/app/app-common/PageSource/include/OpenKneeboard/PlainTextPageSource.h +++ b/src/app/app-common/PageSource/include/OpenKneeboard/PlainTextPageSource.h @@ -58,7 +58,7 @@ class PlainTextPageSource final : public IPageSource, virtual PageIndex GetPageCount() const override; virtual std::vector GetPageIDs() const override; virtual PreferredSize GetPreferredSize(PageID) override; - virtual void RenderPage(RenderTarget*, PageID, const D2D1_RECT_F& rect) + virtual void RenderPage(RenderTarget*, PageID, const PixelRect& rect) override; private: diff --git a/src/app/app-common/PageSource/include/OpenKneeboard/WGCPageSource.h b/src/app/app-common/PageSource/include/OpenKneeboard/WGCPageSource.h index b484a2528..b0baad239 100644 --- a/src/app/app-common/PageSource/include/OpenKneeboard/WGCPageSource.h +++ b/src/app/app-common/PageSource/include/OpenKneeboard/WGCPageSource.h @@ -55,7 +55,7 @@ class WGCPageSource : public virtual IPageSource, virtual std::vector GetPageIDs() const final override; virtual PreferredSize GetPreferredSize(PageID) final override; - virtual void RenderPage(RenderTarget*, PageID, const D2D1_RECT_F& rect) + virtual void RenderPage(RenderTarget*, PageID, const PixelRect& rect) final override; struct Options { diff --git a/src/app/app-common/Tab/EndlessNotebookTab.cpp b/src/app/app-common/Tab/EndlessNotebookTab.cpp index bf5b75df7..49573ae5b 100644 --- a/src/app/app-common/Tab/EndlessNotebookTab.cpp +++ b/src/app/app-common/Tab/EndlessNotebookTab.cpp @@ -166,7 +166,7 @@ PreferredSize EndlessNotebookTab::GetPreferredSize(PageID) { void EndlessNotebookTab::RenderPage( RenderTarget* rt, PageID pageID, - const D2D1_RECT_F& rect) { + const PixelRect& rect) { if (!mSource) { return; } diff --git a/src/app/app-common/Tab/NavigationTab.cpp b/src/app/app-common/Tab/NavigationTab.cpp index 6a46574f3..191e8674b 100644 --- a/src/app/app-common/Tab/NavigationTab.cpp +++ b/src/app/app-common/Tab/NavigationTab.cpp @@ -204,18 +204,18 @@ void NavigationTab::ClearUserInput() { void NavigationTab::RenderPage( RenderTarget* rt, PageID pageID, - const D2D1_RECT_F& canvasRect) { + const PixelRect& canvasRect) { OPENKNEEBOARD_TraceLoggingScope("NavigationTab::RenderPage()"); auto ctx = rt->d2d(); - const auto scale - = (canvasRect.bottom - canvasRect.top) / mPreferredSize.mHeight; + + const auto scale = canvasRect.Height() / mPreferredSize.mHeight; ctx->FillRectangle(canvasRect, mBackgroundBrush.get()); this->CalculatePreviewMetrics(pageID); - const D2D1_POINT_2F origin {canvasRect.left, canvasRect.top}; - const auto pageTransform = D2D1::Matrix3x2F::Translation(origin.x, origin.y) + const auto origin = canvasRect.TopLeft(); + const auto pageTransform = D2D1::Matrix3x2F::Translation(origin.mX, origin.mY) * D2D1::Matrix3x2F::Scale({scale, scale}, origin); ctx->SetTransform(pageTransform); @@ -343,19 +343,19 @@ void NavigationTab::CalculatePreviewMetrics(PageID pageID) { void NavigationTab::RenderPreviewLayer( PageID pageID, RenderTarget* rt, - const D2D1_SIZE_U& size) { + const PixelSize& size) { OPENKNEEBOARD_TraceLoggingScope("NavigationTab::RenderPreviewLayer()"); const auto& m = mPreviewMetrics.at(pageID); const auto buttons = mButtonTrackers.at(pageID)->GetButtons(); - const auto scale = static_cast(size.height) - / this->GetPreferredSize(pageID).mPixelSize.mHeight; + const auto scale + = size.Height() / this->GetPreferredSize(pageID).mPixelSize.mHeight; for (auto i = 0; i < buttons.size(); ++i) { const auto& button = buttons.at(i); const auto& rect = m.mRects.at(i); const auto scaled = rect.StaticCast() * scale; - mRootTab->RenderPage(rt, button.mPageID, scaled); + mRootTab->RenderPage(rt, button.mPageID, scaled.Rounded()); } } diff --git a/src/app/app-common/Tab/include/OpenKneeboard/EndlessNotebookTab.h b/src/app/app-common/Tab/include/OpenKneeboard/EndlessNotebookTab.h index a0afabf30..42cc11479 100644 --- a/src/app/app-common/Tab/include/OpenKneeboard/EndlessNotebookTab.h +++ b/src/app/app-common/Tab/include/OpenKneeboard/EndlessNotebookTab.h @@ -69,7 +69,7 @@ class EndlessNotebookTab final virtual PageIndex GetPageCount() const override; virtual std::vector GetPageIDs() const override; virtual PreferredSize GetPreferredSize(PageID) override; - virtual void RenderPage(RenderTarget*, PageID, const D2D1_RECT_F& rect) + virtual void RenderPage(RenderTarget*, PageID, const PixelRect& rect) override; virtual void PostCursorEvent(EventContext, const CursorEvent&, PageID) diff --git a/src/app/app-common/Tab/include/OpenKneeboard/NavigationTab.h b/src/app/app-common/Tab/include/OpenKneeboard/NavigationTab.h index c9e929405..3090b28ff 100644 --- a/src/app/app-common/Tab/include/OpenKneeboard/NavigationTab.h +++ b/src/app/app-common/Tab/include/OpenKneeboard/NavigationTab.h @@ -55,7 +55,7 @@ class NavigationTab final : public TabBase, virtual PageIndex GetPageCount() const override; virtual std::vector GetPageIDs() const override; virtual PreferredSize GetPreferredSize(PageID) override; - virtual void RenderPage(RenderTarget*, PageID, const D2D1_RECT_F& rect) + virtual void RenderPage(RenderTarget*, PageID, const PixelRect& rect) override; virtual void PostCursorEvent(EventContext, const CursorEvent&, PageID) @@ -102,7 +102,7 @@ class NavigationTab final : public TabBase, void CalculatePreviewMetrics(PageID); // PageID is first for `std::bind_front()` - void RenderPreviewLayer(PageID, RenderTarget*, const D2D1_SIZE_U& size); + void RenderPreviewLayer(PageID, RenderTarget*, const PixelSize& size); static constexpr auto PaddingRatio = 1.5f; }; diff --git a/src/app/app-common/include/OpenKneeboard/CachedLayer.h b/src/app/app-common/include/OpenKneeboard/CachedLayer.h index bed71f678..c3b5e525f 100644 --- a/src/app/app-common/include/OpenKneeboard/CachedLayer.h +++ b/src/app/app-common/include/OpenKneeboard/CachedLayer.h @@ -47,7 +47,7 @@ class CachedLayer final { const D2D1_RECT_F& where, Key cacheKey, RenderTarget*, - std::function impl, + std::function impl, const std::optional& cacheDimensions = {}); void Reset();