Solved

drawing to buffer + flip to window

Posted on 2001-06-15
11
345 Views
Last Modified: 2012-05-04
any sourcecodes for the following problem :
- i want to draw to a 2d array (24bit if possible)
- flip the array to the screen (to a size-fixed window)
- hell-fast (if possible)

do you have any sources for this. inclusive creating the size-fixed window and everything else. i want to calc some graphic effects (plasmas, etc.). if you've got any additional questions, feel free to ask.

thank you very much. i appreciate every comment.
0
Comment
Question by:columbo666
11 Comments
 
LVL 7

Expert Comment

by:Sasha_Mapa
ID: 6195443
>i want to draw to a 2d array
You can do that only since JDK1.2 by using BufferedImage.getGraphics() and then either using PixelGrabber or calling Raster.getPixels() on the BufferedImage's Raster to obtain the pixel values in the form of an int array (32 bits).
>flip the array to the screen (to a size-fixed window)
Just draw the BufferedImage on a showing Window.
>hell-fast (if possible)
Well, you don't really control it using the method I described.

Alternatively, since JDK1.0, you can implement your own drawing procedures, which would draw into an int array. You would then convert the array into an Image using Toolkit.createImage(ImageProducer) and MemoryImageSource.

To make the drawing as fast as possible, I recomment creating an offscreen Image using Component.createImage(int, int) - painting the actual image on it once and then painting the offscreen image on the screen every time (instead of the actual image).

Sasha Maryanovsky.
0
 
LVL 1

Author Comment

by:columbo666
ID: 6196087
very good. any code ? i tried to use these createImage-things (and others), but i couldn't get them working.
0
 
LVL 7

Expert Comment

by:Sasha_Mapa
ID: 6196096
For which one of the ways? 1.1 or 1.2 compatible?

Sasha Maryanovsky.
0
 
LVL 1

Author Comment

by:columbo666
ID: 6198266
i've got 1.2, but you can do it also for 1.1. your decision
0
 
LVL 7

Expert Comment

by:Sasha_Mapa
ID: 6198428
Well, 1.2 it's pretty easy:

int width = 300;
int height = 300;
BufferedImage img = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
// Do various painting on the Graphics here.
int [] pixels = img.getRGB(0,0,width,height,null,0,width);

After this, "pixels" contains all the pixel values in aRGB format.

For 1.1, you will have to implement your own drawing routines, which is quite difficult, and I'm not going to explain this here :-)

Sasha Maryanovsky.
0
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 7

Expert Comment

by:Sasha_Mapa
ID: 6198429
Umm, note that I didn't test this code, so it may be wrong :-)

Sasha Maryanovsky.
0
 
LVL 3

Expert Comment

by:Sendoh
ID: 6201259
hi !
guess this website may help u...

http://java.sun.com/docs/books/tutorial/2d/images/index.html

hope it helps..:)
0
 
LVL 1

Author Comment

by:columbo666
ID: 6202809
i can really use that. thanks. a small detail : i want to draw only single pixels (and fill the whole buffer with them). any fast possibilities ?
0
 
LVL 1

Author Comment

by:columbo666
ID: 6224612
sorry, finally i can't really use that. i just want a complete piece of code, which creates a non-resizable window and draws an (pixel based & flickerless) animation within.
0
 

Accepted Solution

by:
benutzername earned 300 total points
ID: 6737333
Hi Columbo! I've got the same problem - I want to render fast realtime fractal animations onto a fullscreen window. I worked myself through the JAVA 1.4 API and created this sourcecode out of some examples - it renders randomly colored pixels onto your screen.
The code is far from being optimzed, but it works. I'm still working on the code, because I need it myself, so maybe we could work together to get it running fast.

/**
 * This demo shows how to render single pixels in a fullscreen window using double buffering
 */

import java.awt.*;
import java.awt.image.*;
import java.util.Random;

public class MultiBufferTest extends Component{
   
    int width = 640;
    int height = 480;
    int size = width * height;
    int pixels[] = new int[size];
    int red;
    int green;
    int blue;
    int alpha = 255;
    MemoryImageSource source = new MemoryImageSource(width, height, pixels, 0, width);  
    Graphics g;
    Random r = new Random();
   
    /** constructor
     */
    public MultiBufferTest() {
        // setup display
        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice device = env.getDefaultScreenDevice();          
        GraphicsConfiguration gc = device.getDefaultConfiguration();

        // create frame
        Frame mainFrame = new Frame(gc);
        mainFrame.setUndecorated(true);
        mainFrame.setIgnoreRepaint(true);
       
        // start fullscreen
        device.setFullScreenWindow(mainFrame);        
        device.setDisplayMode(new DisplayMode(width, height, 16, 85));
       
        // setup doubelbuffering
        mainFrame.createBufferStrategy(2);        
        BufferStrategy bufferStrategy = mainFrame.getBufferStrategy();
       
        // setup image source
        source.setAnimated(true);
        Image image = createImage(source);

        // loop for 50 times and draw random pixels
        for (int t = 0; t < 50; t++) {
            // get offscreen image
            g = bufferStrategy.getDrawGraphics();
            for (int j = 0; j < size; j++) {
                // randomize colors
                red = Math.abs(r.nextInt()) % 255;
                green = Math.abs(r.nextInt()) % 255;
                blue = Math.abs(r.nextInt()) % 255;
                // set pixel
                pixels[j] = (alpha << 24) | (red << 16) | (green << 8 ) | blue;
            }
            // draw new pixels
            g.drawImage(createImage(source), 0,0, this);
            // flip offscreen image to screen
            bufferStrategy.show();
            // release offscreen image
            g.dispose();
        }
       
        // exit
        device.setFullScreenWindow(null);
        System.exit(0);
    }
   

    public static void main(String[] args) {
        MultiBufferTest test = new MultiBufferTest();
    }
}
0
 
LVL 1

Author Comment

by:columbo666
ID: 6738746
dunno, the project was done now without this and i can code java a bit now...
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
hash value 2 38
sumDigits  challenge 7 60
wordlen challenge 3 47
Cipher Configuration on Apache HTTPD 4 20
By the end of 1980s, object oriented programming using languages like C++, Simula69 and ObjectPascal gained momentum. It looked like programmers finally found the perfect language. C++ successfully combined the object oriented principles of Simula w…
Are you developing a Java application and want to create Excel Spreadsheets? You have come to the right place, this article will describe how you can create Excel Spreadsheets from a Java Application. For the purposes of this article, I will be u…
Viewers learn about the “for” loop and how it works in Java. By comparing it to the while loop learned before, viewers can make the transition easily. You will learn about the formatting of the for loop as we write a program that prints even numbers…
Viewers will learn how to properly install Eclipse with the necessary JDK, and will take a look at an introductory Java program. Download Eclipse installation zip file: Extract files from zip file: Download and install JDK 8: Open Eclipse and …

705 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now