source: trunk/gcc/libjava/gnu/gcj/xlib/natXImage.cc

Last change on this file was 2, checked in by bird, 22 years ago

Initial revision

  • Property cvs2svn:cvs-rev set to 1.1
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 5.2 KB
Line 
1/* Copyright (C) 2000 Free Software Foundation
2
3 This file is part of libgcj.
4
5This software is copyrighted work licensed under the terms of the
6Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
7details. */
8
9#include <X11/Xlib.h>
10#include <X11/Xutil.h>
11
12#include <gcj/cni.h>
13#include <gnu/gcj/RawData.h>
14
15#include <java/lang/OutOfMemoryError.h>
16
17#include <gnu/gcj/xlib/Display.h>
18#include <gnu/gcj/xlib/Screen.h>
19#include <gnu/gcj/xlib/Visual.h>
20#include <gnu/gcj/xlib/XImage.h>
21#include <java/lang/System.h>
22#include <java/io/PrintStream.h>
23
24void gnu::gcj::xlib::XImage::init(Visual* visual, jint depth,
25 jint format, jint xoffset,
26 jint width, jint height,
27 jint bitmapPad, jint bytesPerLine,
28 jint bitsPerPixel)
29{
30 ::Display* dpy = (::Display*) visual->display->display;
31 ::Visual* vis = (::Visual*) visual->getVisualStructure();
32
33 char* data = 0; // no preallocated data
34 ::XImage* ximage = XCreateImage(dpy, vis, depth, format, xoffset,
35 data,
36 width, height,
37 bitmapPad,
38 bytesPerLine
39 );
40 if (ximage == 0)
41 {
42 jstring errorMessage = JvNewStringLatin1("XCreateImage failed");
43 throw new java::lang::OutOfMemoryError(errorMessage);
44 }
45
46 bool reinitialize = false;
47
48 if ((bitsPerPixel != 0) && (ximage->bits_per_pixel != bitsPerPixel))
49 {
50 ximage->bits_per_pixel = bitsPerPixel;
51 reinitialize = true;
52 }
53
54 // FIXME: make autoconf test?
55 jshort endianTestShort[] = { 1 };
56 jbyte* endianTestByte = reinterpret_cast<jbyte*>(endianTestShort);
57
58 jint byteOrder;
59 if (endianTestByte[0] == 1)
60 {
61 // little endian machine
62 byteOrder = LEAST_SIGNIFICANT_B_FIRST_ORDER;
63 }
64 else
65 {
66 // big endian machine
67 byteOrder = MOST_SIGNIFICANT_B_FIRST_ORDER;
68 }
69 /* NB: This doesn't consider those weird machines out there with
70 middle-endian byte order. */
71
72 if (byteOrder != ximage->byte_order)
73 {
74 ximage->byte_order = byteOrder;
75 reinitialize = true;
76 }
77
78 if (reinitialize)
79 XInitImage(ximage);
80
81 structure = reinterpret_cast<gnu::gcj::RawData*>(ximage);
82 // Notice that no image data has been allocated at this point
83}
84
85void gnu::gcj::xlib::XImage::init(Visual* visual,
86 jint width,
87 jint height)
88{
89 int depth = visual->getDepth();
90
91 int format = ZPixmap; // Chunky, not planar.
92 int offset = 0;
93 int bitmapPad = 32; // FIXME, don't hardcode this
94 int bytesPerLine = 0; // Let the server figure it out
95
96 init(visual, depth, format, offset, width, height, bitmapPad,
97 bytesPerLine, 0);
98}
99
100void gnu::gcj::xlib::XImage::internalSetData(jbyteArray data, jint offset)
101{
102 ::XImage* ximage = (::XImage*) structure;
103 ximage->data = reinterpret_cast<char*>(elements(data)+offset);
104}
105
106void gnu::gcj::xlib::XImage::internalSetData(jshortArray data, jint offset)
107{
108 ::XImage* ximage = (::XImage*) structure;
109 ximage->data = reinterpret_cast<char*>(elements(data)+offset);
110}
111
112void gnu::gcj::xlib::XImage::internalSetData(jintArray data, jint offset)
113{
114 ::XImage* ximage = (::XImage*) structure;
115 ximage->data = reinterpret_cast<char*>(elements(data)+offset);
116}
117
118void gnu::gcj::xlib::XImage::finalize()
119{
120 ::XImage* ximage = (::XImage*) structure;
121 if (ownsData)
122 delete ximage->data;
123
124 ximage->data = 0; // Never allow XLib to free the data allocation.
125 dataRef = 0;
126 XDestroyImage(ximage);
127}
128
129jint gnu::gcj::xlib::XImage::getWidth()
130{
131 ::XImage* ximage = (::XImage*) structure;
132 return ximage->width;
133}
134
135jint gnu::gcj::xlib::XImage::getHeight()
136{
137 ::XImage* ximage = (::XImage*) structure;
138 return ximage->height;
139}
140
141jint gnu::gcj::xlib::XImage::getDepth()
142{
143 ::XImage* ximage = (::XImage*) structure;
144 return ximage->depth;
145}
146
147jint gnu::gcj::xlib::XImage::getFormat()
148{
149 ::XImage* ximage = (::XImage*) structure;
150 return ximage->format;
151}
152
153jint gnu::gcj::xlib::XImage::getXOffset()
154{
155 ::XImage* ximage = (::XImage*) structure;
156 return ximage->xoffset;
157}
158
159jint gnu::gcj::xlib::XImage::getImageByteOrder()
160{
161 ::XImage* ximage = (::XImage*) structure;
162 return ximage->byte_order;
163}
164
165jint gnu::gcj::xlib::XImage::getBitmapBitOrder()
166{
167 ::XImage* ximage = (::XImage*) structure;
168 return ximage->bitmap_bit_order;
169}
170
171jint gnu::gcj::xlib::XImage::getBitmapUnit()
172{
173 ::XImage* ximage = (::XImage*) structure;
174 return ximage->bitmap_unit;
175}
176
177jint gnu::gcj::xlib::XImage::getBitmapPad()
178{
179 ::XImage* ximage = (::XImage*) structure;
180 return ximage->bitmap_pad;
181}
182
183jint gnu::gcj::xlib::XImage::getBytesPerLine()
184{
185 ::XImage* ximage = (::XImage*) structure;
186 return ximage->bytes_per_line;
187}
188
189jint gnu::gcj::xlib::XImage::getBitsPerPixel()
190{
191 ::XImage* ximage = (::XImage*) structure;
192 return ximage->bits_per_pixel;
193}
194
195
196// True/Direct Color specific:
197
198jint gnu::gcj::xlib::XImage::getRedMask()
199{
200 ::XImage* ximage = (::XImage*) structure;
201 return ximage->red_mask;
202}
203
204jint gnu::gcj::xlib::XImage::getGreenMask()
205{
206 ::XImage* ximage = (::XImage*) structure;
207 return ximage->green_mask;
208}
209
210jint gnu::gcj::xlib::XImage::getBlueMask()
211{
212 ::XImage* ximage = (::XImage*) structure;
213 return ximage->blue_mask;
214}
215
216void gnu::gcj::xlib::XImage::setPixel(jint x, jint y, jint pixel)
217{
218 ::XImage* ximage = (::XImage*) structure;
219 XPutPixel(ximage, x, y, pixel);
220}
Note: See TracBrowser for help on using the repository browser.