implement Grayscale image handling

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/back/trunk@25673 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
rmottola 2007-12-03 20:56:04 +00:00
parent bc2f66564b
commit 07349e480f
2 changed files with 54 additions and 1 deletions

View file

@ -1,3 +1,7 @@
2007-12-03 Riccardo Mottola <riccardo@kaffe.org>
* Source/winlib/WIN32GState.m: Implement Greyscale image handling
2007-11-29 Richard Frith-Macdonald <rfm@gnu.org>
* Source/art/ReadRect.m:

View file

@ -46,6 +46,7 @@
#include "win32/WIN32Server.h"
#include <math.h>
#include <limits.h>
#ifndef AC_SRC_ALPHA
// Missing definitions from wingdi.h
@ -396,6 +397,8 @@ HBITMAP GSCreateBitmap(HDC hDC, int pixelsWide, int pixelsHigh,
if (isPlanar
|| !([colorSpaceName isEqualToString: NSDeviceRGBColorSpace]
|| ![colorSpaceName isEqualToString: NSCalibratedWhiteColorSpace]
|| ![colorSpaceName isEqualToString: NSCalibratedBlackColorSpace]
|| [colorSpaceName isEqualToString: NSCalibratedRGBColorSpace]))
{
NSLog(@"Bitmap type currently not supported %d %@",
@ -456,13 +459,59 @@ HBITMAP GSCreateBitmap(HDC hDC, int pixelsWide, int pixelsHigh,
bmih->biClrImportant = 0;
fuColorUse = 0;
if (bitsPerPixel <= 8)
if (bitsPerPixel <= 8 && samplesPerPixel > 1)
{
// FIXME How to get a colour palette?
NSLog(@"Need to define colour map for images with %d bits", bitsPerPixel);
//bitmap->bmiColors;
fuColorUse = DIB_RGB_COLORS;
}
else if (bitsPerPixel == 8)
{
unsigned char* tmp;
unsigned int pixels = pixelsHigh * pixelsWide;
unsigned int i = 0;
unsigned int j = 0;
bmih->biBitCount = 32;
NSDebugLLog(@"WIN32GState", @"8bit greyscale picture with pixelsWide:%d "
@"pixelsHigh:%d", pixelsWide, pixelsHigh);
tmp = objc_malloc(pixels * 4);
if ([colorSpaceName isEqualToString: NSCalibratedWhiteColorSpace])
{
while (i < (pixels*4))
{
unsigned char pix;
pix = bits[j];
tmp[i+0] = pix;
tmp[i+1] = pix;
tmp[i+2] = pix;
tmp[i+3] = 0xFF;
i+=4;
j++;
}
}
else if ([colorSpaceName isEqualToString: NSCalibratedBlackColorSpace])
{
while (i < (pixels*4))
{
unsigned char pix;
pix = UCHAR_MAX - bits[j];
tmp[i+0] = pix;
tmp[i+1] = pix;
tmp[i+2] = pix;
tmp[i+3] = 0xFF;
i+=4;
j++;
}
}
else
NSLog(@"Unexpected condition, greyscale which is neither whte nor black calibrated");
bits = tmp;
}
else if (bitsPerPixel == 32)
{
BITMAPV4HEADER *bmih;