Почему gc из swt не рисует изображения в Mac OS Mojave с новым SWT? - PullRequest
0 голосов
/ 16 ноября 2018

Привет, я работаю над приложением, где мы берем скриншот и отображаем изображение, рисуя его через gc.После обновления до macos mojave тот же код не работает. Я изобразил то же самое в приведенных ниже фрагментах. Здесь в списке рисования вместо того, чтобы взять событие gc from paint, я создаю другой gc, над которым я выполняю некоторую операцию, и через этот gc яЯ рисую изображение. Это решение работает в Windows и Mac OS до высокой (10.13). При обновлении Mojave создание другого gc дает белое изображение, и когда я пытаюсь напрямую рисовать с использованием события gc from paint, это работает без особых проблем.

import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

public class ScreenShotWithGC {

  public static void main(String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());
    Button button = new Button(shell, SWT.PUSH);
    button.setText("Capture");
    Button save = new Button(shell, SWT.PUSH);
    save.setText("save");

    button.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event event) {

        /* Take the screen shot */
        GC gc = new GC(display);
        final Image image = new Image(display, display.getBounds());
        gc.copyArea(image, 0, 0);
        gc.dispose();
ImageData imageData = image.getImageData();
image.dispose();
        Image imagetemp=new Image(display, imageData);
        Shell popup = new Shell(shell, SWT.SHELL_TRIM);
        popup.setLayout(new FillLayout());
        popup.setText("Image");
        popup.setBounds(50, 50, 200, 200);
        popup.addListener(SWT.Close, new Listener() {
          public void handleEvent(Event e) {
            image.dispose();
          }
        });

        ScrolledComposite sc = new ScrolledComposite(popup, SWT.V_SCROLL | SWT.H_SCROLL);
        Canvas canvas = new Canvas(sc, SWT.NONE);
        sc.setContent(canvas);
        canvas.setBounds(display.getBounds());
        canvas.addPaintListener(new PaintListener() {
          public void paintControl(PaintEvent e) {
              GC gc=e.gc;
                PaletteData offscreenImagePalette = new PaletteData(0x0000FF00, 0x00FF0000, 0xFF000000);
                ImageData offscreenImageData = new ImageData(1000, 768, 32, offscreenImagePalette);
                offscreenImageData.type = SWT.BITMAP;
            Image   gdim = new Image(null, offscreenImageData);
            GC  ggc = new GC(gdim, Window.getDefaultOrientation());
                //gc=ggc;
                gc.fillRectangle(0, 0, 1000, 768);

                gc.drawImage(imagetemp, 0, 0);

                if(gc==ggc)
                {
                    e.gc.drawImage(gdim, 0, 0);
                }
          }
        });
        popup.open();
        save.addSelectionListener(new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent arg0) {
                // TODO Auto-generated method stub
                ImageLoader saver = new ImageLoader();
                saver.data = new ImageData[] { imageData };
                saver.save("/Users/prabhu_n/Desktop/Image/output.png", SWT.IMAGE_PNG);
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
                // TODO Auto-generated method stub

            }
        });

      }
    });
    shell.pack();
    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    display.dispose();
  }
}

Любая подсказка по этому вопросу будет полезна Обновление : этот код работает со старым SWT, но с новой версией SWT getimagedata () не возвращает правильное значение.

...