PR pending https://gitlab.gnome.org/GNOME/dia/-/merge_requests/149 see also https://bugs.gentoo.org/983078 Fix crash when importing pdf From 72fad360a06c46214b81081ec7778c8e3a0313c7 Mon Sep 17 00:00:00 2001 From: Ted Rodgers Date: Tue, 29 Sep 2026 09:51:23 -0400 Subject: [PATCH] apply this first: https://gitlab.gnome.org/GNOME/dia/-/merge_requests/146 pdf: - Modern Poppler matrix handling and coordinate scaling - Update updateCTM to use const auto& to match modern Poppler APIs - Fix undefined behavior in restoreState by checking for an empty matrix stack before poppin - Remove redundant scaling factors from subpath points and text positioning - Correct coordinate scaling in doPath for starting points and Bezier curves --- a/plug-ins/pdf/pdf-import.cpp +++ b/plug-ins/pdf/pdf-import.cpp @@ -144,17 +144,13 @@ public : double m21, double m22, double m31, double m32) { - DiaMatrix mat; - - mat.xx = m11; - mat.yx = m12; - mat.xy = m21; - mat.yy = m22; - mat.x0 = m31 * scale; - mat.y0 = m32 * scale; - - //this->matrix = mat; - dia_matrix_multiply (&this->matrix, &mat, &this->matrix); + const auto& ctm = state->getCTM(); + this->matrix.xx = ctm[0]; + this->matrix.yx = ctm[1]; + this->matrix.xy = ctm[2]; + this->matrix.yy = ctm[3]; + this->matrix.x0 = ctm[4] * scale; + this->matrix.y0 = ctm[5] * scale; updateLineDash(state); updateLineJoin(state); @@ -437,9 +433,12 @@ public : //! Change back to the old state void restoreState(GfxState *state) { - // just restore the matrix for now - this->matrices.pop_back(); - this->matrix = this->matrices.back(); + if (!this->matrices.empty()) { + this->matrix = this->matrices.back(); + this->matrices.pop_back(); + } else { + g_warning("PDF import: restoreState called with an empty matrix stack"); + } // should contain all of our update*() methods? updateLineWidth(state); updateLineDash(state); @@ -467,6 +466,7 @@ public : startPage (int pageNum, GfxState *state G_GNUC_UNUSED) { this->pageNum = pageNum; + this->matrices.clear(); } @@ -474,7 +474,8 @@ public : void endPage() { DiaObject *group; - g_return_if_fail (objects != NULL); + if (this->objects == NULL) + return; /* approx 4:3 page distribution */ int m = (int)sqrt (num_pages / 0.75); @@ -839,13 +840,9 @@ DiaOutputDev::drawString(GfxState *state, GooString *s) text_color.alpha = 0.0; // not sure how state->getLineX() is related, it's 0 in my test cases - double tx = state->getCurX(); - double ty = state->getCurY(); - int rot = state->getRotate(); - if (rot == 0) - obj = create_standard_text (tx * scale, page_height - ty * scale); - else /* XXX: at least for rot==90 */ - obj = create_standard_text (ty * scale, tx * scale); + Point p = { state->getCurX(), state->getCurY() }; + transform_point(&p, &this->matrix); + obj = create_standard_text (p.x, p.y); //not applyStyle (obj, TEXT); GPtrArray *plist = g_ptr_array_new (); // the "text" property is special, it must be initialized with text