Большое изображение SWT напечатано неправильно - PullRequest
1 голос
/ 06 сентября 2011

Привет, SWT Гуру, у меня довольно странная ситуация.Дело в том, что я пытаюсь распечатать диаграмму Ганта в своем приложении Eclipse RCP.Диаграмма Ганта довольно длинная, а иногда и высокая.Его размеры следующие: высота = 3008 пикселей (2 страницы по вертикали), ширина> 20000 пикселей.Моя область печати может соответствовать примерно 1400x2000 пикселей.Прежде всего, я создаю изображение с помощью своего графика (изображение в порядке, я могу сохранить его отдельно и увидеть, что все есть).Однако, чтобы напечатать его на бумаге, я печатаю его по частям (перемещая исходные позиции X и Y соответственно).Некоторое время этот алгоритм работал нормально, но теперь произошло нечто странное:

Когда диаграмма недостаточно высока и может уместиться на 1 вертикальной странице, тогда она печатается нормально, но когда это 2 вертикальных страницы, тогдапечатается только вторая вертикальная страница, а первая пропускается.Там нет ни ошибок, ни чего-либо, что могло бы мне помочь.Я подумал, что может быть недостаточно памяти кучи, поэтому я выделил -Xmx1014m пространство для моего приложения, но это не помогло.Итак, я действительно потерян, и не могу найти никакого решения или даже объяснения этой проблемы.Я пытался просто напечатать изображение с помощью gc.drwImage (image, x, y), но также напечатал мне только вторую половину.Я также печатаю текст после каждой попытки печати изображения, и оно печатается

Код, отвечающий за печать изображения, следующий:

for (int verticalPageNumber = 0; verticalPageNumber <= pageCount.vGanttChartPagesCount; verticalPageNumber++) {
        // horizontal position needs to be reset to 0 before printing next bunch of horizontal pages

        int imgPieceSrcX = 0;
        for (int horizontalPageNumber = 0; horizontalPageNumber <= pageCount.hGanttChartPagesCount; horizontalPageNumber++) {

            // Calculate bounds for the next page
            final Rectangle printBounds = PrintingUtils.calculatePrintBounds(printerClientArea, scaleFactor, verticalPageNumber, horizontalPageNumber);

            if (shouldPrint(printer.getPrinterData(), currentPageNr)
                  && nextPageHasSomethingToPrint(imgPieceSrcX, imgPieceSrcY, totalGanttChartArea.width, totalGanttChartArea.height)) {
                printer.startPage();

                final Transform printerTransform = PrintingUtils.setUpTransform(printer, printerClientArea, scaleFactor, gc, printBounds);

                printHeader(gc, currentPageNr, printBounds);

                imgPieceSrcY = printBounds.y;

                final int imgPieceSrcHeight =
                      imgPieceSrcY + printBounds.height < ganttChartImage.getBounds().height ? printBounds.height : ganttChartImage.getBounds().height
                            - imgPieceSrcY;

                final int imgPieceSrcWidth =
                      imgPieceSrcX + printBounds.width < ganttChartImage.getBounds().width ? printBounds.width : ganttChartImage.getBounds().width
                            - imgPieceSrcX;

                if (imgPieceSrcHeight > 0 && imgPieceSrcWidth > 0) {
                    // gantt chart is printed as image, piece by piece
                    gc.drawImage(ganttChartImage,
                          imgPieceSrcX, imgPieceSrcY,
                          imgPieceSrcWidth, imgPieceSrcHeight,
                          printBounds.x, printBounds.y,
                          imgPieceSrcWidth, imgPieceSrcHeight); // destination width and height equal to source width and height to prevent
                    // stretching/shrinking of image
                    // move x and y to print next image piece

                    gc.drawText("Text " + currentPageNr, imgPieceSrcX, imgPieceSrcY);

                    imgPieceSrcX += printBounds.width;

                }

                currentPageNr++;

                printer.endPage();
                printerTransform.dispose();
            }
        }

Заранее спасибо.

...