This is NSBitmapImageRep_editing.m in view mode; [Download] [Up]
// NSBitmapImageRep_editing.m // // Implements pixel color manipulations for bitmaps. // Only works for a few image formags such as 24 bit RGB and 8 bit gray. // This code should be rewritten or complemented to handle all possible data // formats. Anti aliasing would me nice as well. // // created by Martin Wennerberg on Sun 11-Aug-1996 // // when who modification #import "NSBitmapImageRep_editing.h" #ifndef rint #define rint(x) ((x) + 0.5) #endif @implementation NSBitmapImageRep(editing) - (void) setRGBA:(struct RGBA) col atPoint:(NSPoint) point { int i; int numColors = _moreRepFlags.numColors; int bytesPerRow = _bytesPerRow; BOOL isPlanar = _moreRepFlags.isPlanar; unsigned char *planes[5]; unsigned char *plane; int x, y; NSSize size; size = [self size]; x = rint (point.x); y = rint (size.height - point.y) - 1; if (x < 0 || x > size.width || y < 0 || y > size.height) return; [self getBitmapDataPlanes:planes]; if (!isPlanar) { plane = planes[0]; i = rint(bytesPerRow * y + x * numColors); switch (numColors) // Does not support CMYK or HSB { case 1: plane[i] = col.r * 255.0; break; case 2: plane[i] = col.r * 255.0; plane[i + 1] = col.a * 255.0 ; break; case 3: plane[i] = col.r * 255.0; plane[i + 1] = col.g * 255.0 ; plane[i + 2] = col.b * 255.0 ; break; case 4: plane[i] = col.r * 255.0; plane[i + 1] = col.g * 255.0 ; plane[i + 2] = col.b * 255.0 ; plane[i + 3] = col.a * 255.0 ; break; default: break; } } else { i = bytesPerRow * y + x; switch (numColors) { case 1: planes[0][i] = col.r * 255.0; break; default: break; } } return; } - (struct RGBA) RGBAAtPoint:(NSPoint)point { struct RGBA color; int i; int numColors = _moreRepFlags.numColors; int bytesPerRow = _bytesPerRow; BOOL isPlanar = _moreRepFlags.isPlanar; int bitsPerPixel = _moreRepFlags.bitsPerPixel; unsigned char *planes[5]; unsigned char *plane; int x, y; NSSize size; memset (&color, 0, sizeof(color)); size = [self size]; x = rint (point.x); y = rint (size.height - point.y) - 1.0; if (x < 0 || x > size.width || y < 0 || y > size.height - 1.0) return color; color.a = 1; [self getBitmapDataPlanes:planes]; if (!isPlanar) { plane = planes[0]; i = rint(bytesPerRow * y + (x * bitsPerPixel / 8)); switch (numColors) { case 1: color.r = color.b = color. g = plane[i] / 255.0; break; case 2: color.r = color.b = color. g = plane[i] / 255.0; color.a = plane[i + 1] / 255.0; break; case 3: color.r = plane[i] / 255.0; color.g = plane[i + 1] / 255.0; color.b = plane[i + 2] / 255.0; break; case 4: color.r = plane[i] / 255.0; color.g = plane[i + 1] / 255.0; color.b = plane[i + 2] / 255.0; color.a = plane[i + 3] / 255.0; break; default: break; } } else { i = bytesPerRow * y + x * bitsPerPixel / (8 * numColors); // i = bytesPerRow * y + x; switch (numColors) { case 1: color.r = color.g = color.b = planes[0][i] / 255.0; break; case 2: color.r = planes[0][i] / 255.0; color.a = planes[1][i] / 255.0; break; case 3: color.r = planes[0][i] / 255.0; color.g = planes[1][i] / 255.0; color.b = planes[2][i] / 255.0; break; case 4: color.r = planes[0][i] / 255.0; color.g = planes[1][i] / 255.0; color.b = planes[2][i] / 255.0; color.a = planes[3][i] / 255.0; break; default: break; } } return color; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.