This is PXKImage.m in view mode; [Download] [Up]
/*
PXKImage.m
NSImage for GNUstep GUI X/DPS Backend.
The Image class is an object wrapper around X pixmaps.
It is used among other things for storing the system
icons, such as arrows, dimple, pop-up, etc.
Copyright (C) 1996 Free Software Foundation, Inc.
Author: Pascal Forget <pascal@wsc.com>
Date: October 1995
This file is part of the GNUstep GUI X/DPS Backend.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
If you are interested in a warranty or support for this source code,
contact Scott Christley <scottc@net-community.com> for more information.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gnustep/xdps/PXKImage.h>
#include <gnustep/xdps/PXKView.h>
#include <gnustep/xdps/PXKScreen.h>
NSMutableArray *_NSImages;
@implementation PXKImage
+ initialize;
{
if (!_NSImages) {
_NSImages = [[NSMutableArray alloc] initWithCapacity:15];
}
return self;
}
- drawInView:(NSView *)view at:(const NSPoint *)location;
{
const NSPoint *p = location;
XPutImage(pxkDisplay, [(PXKView *)view xWindow], pxkBlackGC, [self xImage],
0,0, p[0].x, p[0].y, image_size.width, image_size.height);
return self;
}
- buildImageFromString:(const char *)image;
{
char buf[15];
int version;
int width;
int height;
int x, y;
char pixel;
XColor c1, c2;
unsigned int white = WhitePixel(pxkDisplay, [(PXKScreen *)
[NSScreen mainScreen]
xScreen]);
unsigned int lightgray;
unsigned int darkgray;
unsigned int black = BlackPixel(pxkDisplay, [(PXKScreen *)[NSScreen mainScreen] xScreen]);
strncpy(buf, image+12, 4);
width = atoi(buf);
strncpy(buf, image+16, 4);
height = atoi(buf);
#if 0
fprintf(stdout, "width: %d height: %d\n", width, height);
#endif
XAllocNamedColor(pxkDisplay,
XDefaultColormap(pxkDisplay, [(PXKScreen *)[NSScreen mainScreen] xScreen]),
"light gray", &c1, &c2);
lightgray = c1.pixel;
XAllocNamedColor(pxkDisplay,
XDefaultColormap(pxkDisplay, [(PXKScreen *)[NSScreen mainScreen] xScreen]),
"dark gray", &c1, &c2);
darkgray = c1.pixel;
for (y=0; y<height; y++) {
for (x=0; x<width; x++) {
pixel = image[20 + x + y*width];
#if 0
fprintf(stdout, "%c", pixel);
#endif
switch(pixel) {
case 'g': XPutPixel([self xImage], x, y, lightgray); break;
case 'b': XPutPixel([self xImage], x, y, black); break;
case 'G': XPutPixel([self xImage], x, y, darkgray); break;
case 'w': XPutPixel([self xImage], x, y, white); break;
default: break;
}
}
#if 0
fprintf(stdout, "\n");
#endif
}
return self;
}
- initWithSize:(const NSSize *)initialSize;
{
int x, y;
XColor c1, c2;
const NSSize *si = initialSize;
XImage *xImage;
[super init];
image_size = si[0];
#if 0
puts("NSImage: initWithSize:");
#endif
/*
* This is the only way I found to reliably create an x image.
*/
xImage = XGetImage(pxkDisplay, RootWindow(pxkDisplay, [(PXKScreen *)[NSScreen mainScreen] xScreen]),
0,0, image_size.width, image_size.height,
AllPlanes, XYPixmap);
/*
* Fill the image with the default color, lightgray
*/
XAllocNamedColor(pxkDisplay,
XDefaultColormap(pxkDisplay, [(PXKScreen *)[NSScreen mainScreen] xScreen]),
"light gray", &c1, &c2);
for (x=0; x<image_size.width; x++) {
for (y=0; y<image_size.height; y++) {
XPutPixel([self xImage], x, y, c1.pixel);
}
}
#if 0
XPutPixel(xImage, 5,5, BlackPixel(NSDisplay, NSScreen));
XPutPixel(xImage, 5,6, BlackPixel(NSDisplay, NSScreen));
XPutPixel(xImage, 5,7, BlackPixel(NSDisplay, NSScreen));
XPutPixel(xImage, 5,8, BlackPixel(NSDisplay, NSScreen));
XPutPixel(xImage, 6,5, BlackPixel(NSDisplay, NSScreen));
XPutPixel(xImage, 6,6, BlackPixel(NSDisplay, NSScreen));
XPutPixel(xImage, 6,7, BlackPixel(NSDisplay, NSScreen));
XPutPixel(xImage, 6,8, BlackPixel(NSDisplay, NSScreen));
XPutPixel(xImage, 7,5, BlackPixel(NSDisplay, NSScreen));
XPutPixel(xImage, 7,6, BlackPixel(NSDisplay, NSScreen));
XPutPixel(xImage, 7,7, BlackPixel(NSDisplay, NSScreen));
XPutPixel(xImage, 7,8, BlackPixel(NSDisplay, NSScreen));
#endif
[_NSImages addObject:self];
return self;
}
- initFromBitmap:(char *)bits size:(const NSSize *)newSize;
{
const NSSize *si = newSize;
[super init];
image_size = si[0];
/* See X book number 1, page 157-158 */
fprintf(stdout, "w: %f h:%f\n", image_size.width, image_size.height);
#if 0
xPixmap = XCreateBitmapFromData(NSDisplay,
RootWindow(NSDisplay, NSScreen),
_NSRightArrow_bitmap,
15, 15);
#endif
puts("Pixmap created");
[_NSImages addObject:self];
puts("image added");
return self;
}
- initFromPath:(const char *)filename size:(const NSSize *)newSize;
{
const NSSize *si = newSize;
image_size = si[0];
/* Not implemented, see X book number 1, page 157-158 */
[_NSImages addObject:self];
return self;
}
- (XImage *)xImage;
{
//return xImage;
return NULL;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.