Please find attached a reworked change of the original patch "fix-580495.patch". In order to work with the calculated value of "nZoomMenuItems", I moved the declaration of the array "zoomMenuBtns" from the header file "XPDFViewer.h" to the implementation file "XPDFViewer.cc". This is possible, since this array is only used in "XPDFViewer.cc". This avoids the safeguarding call of "assert". -- Best regards, Jörg-Volker.
description: add additional zoom features This merges 2 different feature patches into one working one. http://bugs.debian.org/424178 hight patch http://bugs.debian.org/578892 bug fix to hight patch http://bugs.debian.org/580495 high mag zoom author: Rogério Brito, Josh Triplett, Emmanuel Thomé, Jörg-Volker Peetz debian-bug: http://bugs.debian.org/580495 Index: xpdf/xpdf/XPDFViewer.cc =================================================================== --- xpdf.orig/xpdf/XPDFViewer.cc 2011-08-15 23:08:53.000000000 +0200 +++ xpdf/xpdf/XPDFViewer.cc 2012-01-30 11:55:29.979167781 +0100 @@ -138,7 +139,11 @@ double zoom; }; -static ZoomMenuInfo zoomMenuInfo[nZoomMenuItems] = { +static ZoomMenuInfo zoomMenuInfo[] = { + { "1600%", 1600 }, + { "1200%", 1200 }, + { "800%", 800 }, + { "600%", 600 }, { "400%", 400 }, { "200%", 200 }, { "150%", 150 }, @@ -148,14 +153,22 @@ { "25%", 25 }, { "12.5%", 12.5 }, { "fit page", zoomPage }, - { "fit width", zoomWidth } + { "fit width", zoomWidth }, + { "fit height", zoomHeight } }; +#define nZoomMenuItems (sizeof(zoomMenuInfo)/sizeof(struct ZoomMenuInfo)) + +#ifndef USE_COMBO_BOX + Widget zoomMenuBtns[nZoomMenuItems]; +#endif + #define maxZoomIdx 0 -#define defZoomIdx 3 -#define minZoomIdx 7 -#define zoomPageIdx 8 -#define zoomWidthIdx 9 +#define defZoomIdx 7 +#define minZoomIdx nZoomMenuItems - 4 +#define zoomPageIdx nZoomMenuItems - 3 +#define zoomWidthIdx nZoomMenuItems - 2 +#define zoomHeightIdx nZoomMenuItems -1 //------------------------------------------------------------------------ @@ -230,6 +237,7 @@ { "toggleFullScreenMode", 0, gFalse, gFalse, &XPDFViewer::cmdToggleFullScreenMode }, { "toggleOutline", 0, gFalse, gFalse, &XPDFViewer::cmdToggleOutline }, { "windowMode", 0, gFalse, gFalse, &XPDFViewer::cmdWindowMode }, + { "zoomFitHeight", 0, gFalse, gFalse, &XPDFViewer::cmdZoomFitHeight }, { "zoomFitPage", 0, gFalse, gFalse, &XPDFViewer::cmdZoomFitPage }, { "zoomFitWidth", 0, gFalse, gFalse, &XPDFViewer::cmdZoomFitWidth }, { "zoomIn", 0, gFalse, gFalse, &XPDFViewer::cmdZoomIn }, @@ -1421,6 +1431,15 @@ } } +void XPDFViewer::cmdZoomFitHeight(GString *args[], int nArgs, + XEvent *event) { + if (core->getZoom() != zoomHeight) { + setZoomIdx(zoomHeightIdx); + displayPage(core->getPageNum(), zoomHeight, + core->getRotate(), gTrue, gFalse); + } +} + void XPDFViewer::cmdZoomIn(GString *args[], int nArgs, XEvent *event) { int z; @@ -1803,7 +1822,7 @@ menuPane = XmCreatePulldownMenu(toolBar, "zoomMenuPane", args, n); for (i = 0; i < nZoomMenuItems; ++i) { n = 0; - s = XmStringCreateLocalized(zoomMenuInfo[i].label); + s = XmStringCreateLocalized((char*)zoomMenuInfo[i].label); XtSetArg(args[n], XmNlabelString, s); ++n; XtSetArg(args[n], XmNuserData, (XtPointer)i); ++n; sprintf(buf, "zoom%d", i); Index: xpdf/xpdf/XPDFViewer.h =================================================================== --- xpdf.orig/xpdf/XPDFViewer.h.orig 2011-08-15 23:08:53.000000000 +0200 +++ xpdf/xpdf/XPDFViewer.h 2012-01-30 11:52:01.425839100 +0100 @@ -40,11 +40,6 @@ //------------------------------------------------------------------------ -// NB: this must match the defn of zoomMenuBtnInfo in XPDFViewer.cc -#define nZoomMenuItems 10 - -//------------------------------------------------------------------------ - struct XPDFViewerCmd { const char *name; int nArgs; @@ -54,6 +54,8 @@ }; //------------------------------------------------------------------------ + +//------------------------------------------------------------------------ // XPDFViewer //------------------------------------------------------------------------ @@ -170,6 +172,7 @@ void cmdWindowMode(GString *args[], int nArgs, XEvent *event); void cmdZoomFitPage(GString *args[], int nArgs, XEvent *event); void cmdZoomFitWidth(GString *args[], int nArgs, XEvent *event); + void cmdZoomFitHeight(GString *args[], int nArgs, XEvent *event); void cmdZoomIn(GString *args[], int nArgs, XEvent *event); void cmdZoomOut(GString *args[], int nArgs, XEvent *event); void cmdZoomPercent(GString *args[], int nArgs, XEvent *event); @@ -320,7 +318,6 @@ Widget zoomComboBox; #else Widget zoomMenu; - Widget zoomMenuBtns[nZoomMenuItems]; #endif Widget zoomWidget; Widget findBtn; Index: xpdf/doc/xpdf.1 =================================================================== --- xpdf.orig/doc/xpdf.1 2011-08-28 19:56:32.000000000 -0400 +++ xpdf/doc/xpdf.1 2011-08-28 20:20:24.000000000 -0400 @@ -100,7 +100,7 @@ Set the initial zoom factor. A number specifies a zoom percentage, where 100 means 72 dpi. You may also specify \'page', to fit the page to the window size, or \'width', to fit the page width to the window -width. +width, or \'height', to fit the page height to the window height .RB "[config file: " initialZoom "; or X resource: " xpdf.initialZoom ] .TP .B \-cont @@ -439,6 +439,9 @@ .B w Set the zoom factor to 'width' (fit page width to window). .TP +.B h +Set the zoom factor to 'height' (fit page height to window). +.TP .B alt-F Toggle full-screen mode. .TP @@ -591,6 +594,9 @@ .B zoomFitWidth Set the zoom factor to fit-width. .TP +.B zoomFitHeight +Set the zoom factor to fit-height. +.TP .B zoomIn Zoom in - go to the next higher zoom factor. .TP @@ -813,6 +819,7 @@ bind - any zoomOut bind z any zoomFitPage bind w any zoomFitWidth + bind h any zoomFitHeight bind alt-f any toggleFullScreenMode bind ctrl-l any redraw bind ctrl-w any closeWindow Index: xpdf/doc/xpdfrc.5 =================================================================== --- xpdf.orig/doc/xpdfrc.5 2011-08-28 19:54:15.000000000 -0400 +++ xpdf/doc/xpdfrc.5 2011-08-28 20:18:25.000000000 -0400 @@ -365,11 +365,11 @@ cross-hatching. This defaults to "no". .SH MISCELLANEOUS SETTINGS .TP -.BR initialZoom " \fIpercentage\fR | page | width" +.BR initialZoom " \fIpercentage\fR | page | width | height" Sets the initial zoom factor. A number specifies a zoom percentage, where 100 means 72 dpi. You may also specify \'page', to fit the page -to the window size, or \'width', to fit the page width to the window -width. +to the window size, \'width', to fit the page width to the window width, +or \'height', to fit the page height to the window height. .TP .BR continuousView " yes | no" If set to "yes", xpdf will start in continuous view mode, i.e., with Index: xpdf/xpdf/GlobalParams.cc =================================================================== --- xpdf.orig/xpdf/GlobalParams.cc 2011-08-28 20:11:40.000000000 -0400 +++ xpdf/xpdf/GlobalParams.cc 2011-08-28 20:18:25.000000000 -0400 @@ -922,6 +922,8 @@ xpdfKeyContextAny, "zoomFitPage")); keyBindings->append(new KeyBinding('w', xpdfKeyModNone, xpdfKeyContextAny, "zoomFitWidth")); + keyBindings->append(new KeyBinding('h', xpdfKeyModNone, + xpdfKeyContextAny, "zoomFitHeight")); keyBindings->append(new KeyBinding('f', xpdfKeyModAlt, xpdfKeyContextAny, "toggleFullScreenMode")); Index: xpdf/xpdf/PDFCore.cc =================================================================== --- xpdf.orig/xpdf/PDFCore.cc 2011-08-28 20:11:43.000000000 -0400 +++ xpdf/xpdf/PDFCore.cc 2011-08-28 20:18:25.000000000 -0400 @@ -462,6 +462,12 @@ dpiA = (hDPI < vDPI) ? hDPI : vDPI; } else if (zoomA == zoomWidth) { dpiA = (drawAreaWidth / uw) * 72; + } else if (zoomA == zoomHeight) { + if (continuousMode) { + dpiA = ((drawAreaHeight - continuousModePageSpacing) / uh) * 72; + } else { + dpiA = (drawAreaHeight / uh) * 72; + } } else { dpiA = 0.01 * zoomA * 72; } @@ -1216,6 +1222,24 @@ dpi1 = 72.0 * (double)drawAreaWidth / pageW; sx = 0; + } else if (zoomA == zoomHeight) { + if (continuousMode) { + pageH = (rotate == 90 || rotate == 270) ? maxUnscaledPageW + : maxUnscaledPageH; + dpi1 = 72.0 * (double)(drawAreaHeight - continuousModePageSpacing) / pageH; + } else { + rot = rotate + doc->getPageRotate(topPage); + if (rot >= 360) { + rot -= 360; + } else if (rot < 0) { + rot += 360; + } + pageH = (rot == 90 || rot == 270) ? doc->getPageCropWidth(topPage) + : doc->getPageCropHeight(topPage); + dpi1 = 72.0 * (double)drawAreaHeight / pageH; + } + sx = 0; + } else if (zoomA <= 0) { return; Index: xpdf/xpdf/PDFCore.h =================================================================== --- xpdf.orig/xpdf/PDFCore.h 2011-08-28 19:12:29.000000000 -0400 +++ xpdf/xpdf/PDFCore.h 2011-08-28 20:18:25.000000000 -0400 @@ -39,6 +39,7 @@ #define zoomPage -1 #define zoomWidth -2 +#define zoomHeight -3 #define defZoom 125 //------------------------------------------------------------------------ Index: xpdf/xpdf/XPDFCore.cc =================================================================== --- xpdf.orig/xpdf/XPDFCore.cc 2011-08-28 20:13:51.000000000 -0400 +++ xpdf/xpdf/XPDFCore.cc 2011-08-28 20:18:25.000000000 -0400 @@ -121,6 +121,8 @@ zoom = zoomPage; } else if (!initialZoom->cmp("width")) { zoom = zoomWidth; + } else if (!initialZoom->cmp("height")) { + zoom = zoomHeight; } else { zoom = atoi(initialZoom->getCString()); if (zoom <= 0) { @@ -249,7 +251,7 @@ width1 = doc->getPageCropWidth(pg); height1 = doc->getPageCropHeight(pg); } - if (zoom == zoomPage || zoom == zoomWidth) { + if (zoom == zoomPage || zoom == zoomWidth || zoom == zoomHeight) { width = (Dimension)(width1 * 0.01 * defZoom + 0.5); height = (Dimension)(height1 * 0.01 * defZoom + 0.5); } else { @@ -1050,7 +1052,7 @@ XtGetValues(core->drawArea, args, n); core->drawAreaWidth = (int)w; core->drawAreaHeight = (int)h; - if (core->zoom == zoomPage || core->zoom == zoomWidth) { + if (core->zoom == zoomPage || core->zoom == zoomWidth || core->zoom == zoomHeight) { sx = sy = -1; } else { sx = core->scrollX;