From 9a7e94a64ccd498f0745f383e4de78a9ac518c38 Mon Sep 17 00:00:00 2001 From: Jakub Melka Date: Wed, 3 Jul 2024 13:11:46 +0200 Subject: [PATCH 1/3] Issue #184: Invalid text painting --- Pdf4QtLibCore/sources/pdfblpainter.cpp | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/Pdf4QtLibCore/sources/pdfblpainter.cpp b/Pdf4QtLibCore/sources/pdfblpainter.cpp index 567a076..a8b3e85 100644 --- a/Pdf4QtLibCore/sources/pdfblpainter.cpp +++ b/Pdf4QtLibCore/sources/pdfblpainter.cpp @@ -693,28 +693,9 @@ void PDFBLPaintEngine::drawPixmap(const QRectF& r, const QPixmap& pm, const QRec void PDFBLPaintEngine::drawTextItem(const QPointF& p, const QTextItem& textItem) { - if (m_currentRawFont.isValid()) - { - QString text = textItem.text(); - QList glyphIndices = m_currentRawFont.glyphIndexesForString(text); - QList glyphPositions = m_currentRawFont.advancesForGlyphIndexes(glyphIndices); - - QPointF currentPosition = p; - QPainterPath path; - for (int i = 0; i < glyphIndices.size(); ++i) - { - QPainterPath glyphPath = m_currentRawFont.pathForGlyph(glyphIndices[i]); - glyphPath.translate(currentPosition); - path.addPath(glyphPath); - currentPosition += glyphPositions[i]; - } - - m_blContext->save(); - setFillRule(path.fillRule()); - m_blContext->setFillStyle(BLRgba32(m_currentPen.color().rgba())); - drawPathImpl(path, false, true, true); - m_blContext->restore(); - } + // We will call the base implementation, which will + // create paths from text and draw these paths. + QPaintEngine::drawTextItem(p, textItem); } void PDFBLPaintEngine::drawTiledPixmap(const QRectF& r, const QPixmap& pixmap, const QPointF& s) From d9abc64ede68fb9ee3ed21d393a23e7f3fd49583 Mon Sep 17 00:00:00 2001 From: Jakub Melka Date: Wed, 3 Jul 2024 13:59:12 +0200 Subject: [PATCH 2/3] Issue #184: Text offset --- .../sources/pdftexteditpseudowidget.cpp | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Pdf4QtLibWidgets/sources/pdftexteditpseudowidget.cpp b/Pdf4QtLibWidgets/sources/pdftexteditpseudowidget.cpp index 7346d64..d84d687 100644 --- a/Pdf4QtLibWidgets/sources/pdftexteditpseudowidget.cpp +++ b/Pdf4QtLibWidgets/sources/pdftexteditpseudowidget.cpp @@ -566,11 +566,12 @@ QTransform PDFTextEditPseudowidget::createTextBoxTransformMatrix(bool edit) cons matrix.translate(m_widgetRect.left(), m_widgetRect.bottom()); matrix.scale(1.0, -1.0); + const qreal textBoxHeight = m_widgetRect.height(); if (edit && !isComb() && m_textLayout.isValidCursorPosition(m_positionCursor)) { - // Jakub Melka: we must scroll the control, so cursor is always - // visible in the widget area. If we are not editing, this not the - // case, because we always show the text from the beginning. + // Jakub Melka: We must scroll the control so the cursor is always + // visible in the widget area. If we are not editing, this is not the + // case because we always show the text from the beginning. const QTextLine line = m_textLayout.lineForTextPosition(m_positionCursor); if (line.isValid()) @@ -586,28 +587,31 @@ QTransform PDFTextEditPseudowidget::createTextBoxTransformMatrix(bool edit) cons const qreal lineSpacing = line.leadingIncluded() ? line.height() : line.leading() + line.height(); const qreal lineBottom = lineSpacing * (line.lineNumber() + 1); - if (lineBottom >= m_widgetRect.height()) + if (lineBottom > textBoxHeight) { - const qreal delta = lineBottom - m_widgetRect.height(); + const qreal delta = lineBottom - textBoxHeight; matrix.translate(0.0, -delta); } } } - - if (!isMultiline() && !isComb()) + else if (!isMultiline() && !isComb()) { // If text is single line, then adjust text position to the vertical center QTextLine textLine = m_textLayout.lineAt(0); if (textLine.isValid()) { const qreal lineSpacing = textLine.leadingIncluded() ? textLine.height() : textLine.leading() + textLine.height(); - const qreal textBoxHeight = m_widgetRect.height(); if (lineSpacing < textBoxHeight) { const qreal delta = (textBoxHeight - lineSpacing) * 0.5; matrix.translate(0.0, delta); } + else if (lineSpacing > textBoxHeight) + { + const qreal delta = lineSpacing - textBoxHeight; + matrix.translate(0.0, -delta); + } } } From 69b917c1a318a58b32a48891937ca3f73f1666e8 Mon Sep 17 00:00:00 2001 From: Jakub Melka Date: Wed, 3 Jul 2024 14:09:09 +0200 Subject: [PATCH 3/3] Update workflow --- .github/workflows/CreateReleaseDraft.yml | 152 ++++++++++++++--------- .github/workflows/LinuxInstall.yml | 4 - .github/workflows/WindowsInstall.yml | 4 - 3 files changed, 95 insertions(+), 65 deletions(-) diff --git a/.github/workflows/CreateReleaseDraft.yml b/.github/workflows/CreateReleaseDraft.yml index 2d4c3ba..f49d876 100644 --- a/.github/workflows/CreateReleaseDraft.yml +++ b/.github/workflows/CreateReleaseDraft.yml @@ -4,67 +4,105 @@ on: workflow_dispatch: jobs: - fetch-artifacts: + build: runs-on: ubuntu-latest steps: - - name: Checkout repository - uses: actions/checkout@v2 + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install tools + run: | + sudo apt-get install gh + sudo apt-get install jq - - name: Install tools - run: | - sudo apt-get install gh - sudo apt-get install jq + - name: Get latest run ID for Linux_AppImage + id: get_linux_run_id + run: | + latest_run=$(gh run list --workflow=Linux_AppImage --json databaseId,conclusion --jq '.[0]') + linux_run_id=$(echo $latest_run | jq -r .databaseId) + echo "linux_run_id=$linux_run_id" >> $GITHUB_ENV + conclusion=$(echo $latest_run | jq -r .conclusion) + if [ "$conclusion" != "success" ]; then + echo "Latest Linux_AppImage workflow run failed." + exit 1 + fi + env: + GH_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }} + + - name: Get latest run ID for Windows_MSI + id: get_windows_run_id + run: | + latest_run=$(gh run list --workflow=Windows_MSI --json databaseId,conclusion --jq '.[0]') + windows_run_id=$(echo $latest_run | jq -r .databaseId) + echo "windows_run_id=$windows_run_id" >> $GITHUB_ENV + conclusion=$(echo $latest_run | jq -r .conclusion) + if [ "$conclusion" != "success" ]; then + echo "Latest Windows_MSI workflow run failed." + exit 1 + fi + env: + GH_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }} + + - name: Download Linux_AppImage artifact + run: | + mkdir -p artifacts + echo "Downloading artifacts from run ID: ${{ env.linux_run_id }}..." + gh run download ${{ env.linux_run_id }} -D artifacts + echo "Artifacts downloaded to artifacts directory." + env: + GH_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }} + + - name: Download Windows_MSI artifact + run: | + mkdir -p artifacts + echo "Downloading artifacts from run ID: ${{ env.windows_run_id }}..." + gh run download ${{ env.windows_run_id }} -D artifacts + echo "Artifacts downloaded to artifacts directory." + env: + GH_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }} + + - name: Read version + id: get_version + run: | + version=$(grep -oP 'set\(PDF4QT_VERSION \K[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' "CMakeLists.txt") + echo "Version: $version" + echo "pdf4qt_version=$version" >> $GITHUB_ENV + + - name: Rezip zip file + id: rezip_zip_file + run: | + cd artifacts/PDF4QT-Windows-${{ env.pdf4qt_version }}.zip + zip -r ../PDF4QT-Windows-${{ env.pdf4qt_version }}.zip.backup * - - name: Get latest run ID for Linux_AppImage - id: get_linux_run_id - run: | - latest_run=$(gh run list --workflow=Linux_AppImage --json databaseId,conclusion --jq '.[0]') - linux_run_id=$(echo $latest_run | jq -r .databaseId) - echo "linux_run_id=$linux_run_id" >> $GITHUB_ENV - conclusion=$(echo $latest_run | jq -r .conclusion) - if [ "$conclusion" != "success" ]; then - echo "Latest Linux_AppImage workflow run failed." - exit 1 - fi - env: - GH_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }} + - name: Rename zip archive + run: | + rm -rf artifacts/PDF4QT-Windows-${{ env.pdf4qt_version }}.zip/ + mv artifacts/PDF4QT-Windows-${{ env.pdf4qt_version }}.zip.backup artifacts/PDF4QT-Windows-${{ env.pdf4qt_version }}.zip + + - name: Correct file paths + run: | + find artifacts -mindepth 2 -type f -exec sh -c 'mv "$1" "artifacts/$(basename "$1")_moved"' _ {} \; + find artifacts -type d -empty -delete + for f in artifacts/*_moved; do + mv "$f" "${f/_moved/}" + done - - name: Get latest run ID for Windows_MSI - id: get_windows_run_id - run: | - latest_run=$(gh run list --workflow=Windows_MSI --json databaseId,conclusion --jq '.[0]') - windows_run_id=$(echo $latest_run | jq -r .databaseId) - echo "windows_run_id=$windows_run_id" >> $GITHUB_ENV - conclusion=$(echo $latest_run | jq -r .conclusion) - if [ "$conclusion" != "success" ]; then - echo "Latest Windows_MSI workflow run failed." - exit 1 - fi - env: - GH_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }} + - name: List all files recursively + run: | + echo "Listing all files in artifacts:" + find artifacts -type f -print - - name: Download Linux_AppImage artifact - run: | - mkdir -p artifacts/linux - gh run download ${{ env.linux_run_id }} --name Linux_AppImage -D artifacts/linux/ - - - name: Download Windows_MSI artifact - run: | - mkdir -p artifacts/windows - gh run download ${{ env.windows_run_id }} --name Windows_MSI -D artifacts/windows/ - - - name: Create Release Draft - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }} - with: - tag_name: '' - release_name: "Release Draft" - draft: true - prerelease: false - generate_release_notes: true - files: | - artifacts/linux/* - artifacts/windows/* + - name: Create Release Draft + id: create_release + uses: softprops/action-gh-release@v2 + with: + tag_name: 'v${{ env.pdf4qt_version }}' + name: "Release of PDF4QT ${{ env.pdf4qt_version }} (Draft)" + draft: true + prerelease: false + generate_release_notes: true + token: ${{ secrets.MY_GITHUB_TOKEN }} + fail_on_unmatched_files: true + files: | + artifacts/* \ No newline at end of file diff --git a/.github/workflows/LinuxInstall.yml b/.github/workflows/LinuxInstall.yml index 75d4b00..79ed204 100644 --- a/.github/workflows/LinuxInstall.yml +++ b/.github/workflows/LinuxInstall.yml @@ -1,10 +1,6 @@ name: Linux_AppImage on: - push: - tags: - - 'v*' - workflow_dispatch: jobs: diff --git a/.github/workflows/WindowsInstall.yml b/.github/workflows/WindowsInstall.yml index 9569af1..d5ff45c 100644 --- a/.github/workflows/WindowsInstall.yml +++ b/.github/workflows/WindowsInstall.yml @@ -1,10 +1,6 @@ name: Windows_MSI on: - push: - tags: - - 'v*' - workflow_dispatch: jobs: