summaryrefslogtreecommitdiff
path: root/canvas/source/java/BackBuffer.java
blob: 472f6603c33c6afa59fc2b82010422ae663117a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*************************************************************************
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * Copyright 2000, 2010 Oracle and/or its affiliates.
 *
 * OpenOffice.org - a multi-platform office productivity suite
 *
 * This file is part of OpenOffice.org.
 *
 * OpenOffice.org is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * OpenOffice.org is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License version 3 for more details
 * (a copy is included in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with OpenOffice.org.  If not, see
 * <http://www.openoffice.org/license.html>
 * for a copy of the LGPLv3 License.
 *
 ************************************************************************/

// Java AWT
import java.awt.*;
import java.awt.image.*;

public class BackBuffer
{
    private BufferedImage                   backBuffer;
    //private VolatileImage                     backBuffer;
    private Graphics2D                      backBufferGraphics;
    private Graphics2D                      referenceDevice;

    public BackBuffer( Graphics2D _referenceDevice,
                       int width,
                       int height )
    {
        referenceDevice = _referenceDevice;
        setSize( width, height );
    }

    public Graphics2D getGraphics()
    {
        return backBufferGraphics;
    }

    public void setSize( int width,
                         int height )
    {
        if( backBuffer != null &&
            width == backBuffer.getWidth() &&
            height == backBuffer.getHeight() )
        {
            return;
        }

        if( backBufferGraphics != null )
            backBufferGraphics.dispose();

        if( backBuffer != null )
            backBuffer.flush();

        // TODO: Maybe VolatileImage with another BufferedImage as a backup is
        // a tad faster here.
        backBuffer = referenceDevice.getDeviceConfiguration().createCompatibleImage(width,
                                                                                    height);
//        backBuffer = referenceDevice.getDeviceConfiguration().createCompatibleVolatileImage(width,
//                                                                                            height);

        backBufferGraphics = backBuffer.createGraphics();
        CanvasUtils.initGraphics( backBufferGraphics );

        // clear the buffer to white (to have a defined state here)
        backBufferGraphics.setColor( java.awt.Color.white );
        backBufferGraphics.fillRect( 0,0,width,height );
    }

    public void redraw( Graphics2D graph )
    {
        if( graph != null &&
            backBuffer != null )
        {
            CanvasUtils.printLog("BackBuffer.redraw(): using buffer of size (" +
                                  backBuffer.getWidth() + "," + backBuffer.getHeight() + ")" );

            graph.drawImage(backBuffer, 0, 0, null);

            // TODO: this is just twiddled to work. I cannot be sure
            // that this volatile backbuffer will survive in the first
            // place, nor that it wise to leave it in VRAM.

            // only flush non-volatile images
            // CanvasUtils.postRenderImageTreatment( backBuffer );
        }
    }

    public java.awt.Image getBackBuffer()
    {
        return backBuffer;
    }

    public void dispose()
    {
        backBufferGraphics.dispose();
        backBuffer.flush();
    }
}