Fixed screenshot function. Creates PNG files without alpha channel now.
This should fix bug #124 and makes much nicer screenhots. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16769 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
ae99c86041
commit
8b6f573f3f
@ -70,37 +70,45 @@ SaveToPNG(const char* filename, const BRect& bounds, color_space space,
|
|||||||
png_init_io(png, file);
|
png_init_io(png, file);
|
||||||
png_set_bgr(png);
|
png_set_bgr(png);
|
||||||
|
|
||||||
// TODO: Don't assume B_BGRA32!
|
// TODO: support other color spaces if needed
|
||||||
png_set_IHDR(png, info, width, height, 8, PNG_COLOR_TYPE_RGB_ALPHA,
|
|
||||||
PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
|
|
||||||
PNG_FILTER_TYPE_DEFAULT);
|
|
||||||
png_set_strip_alpha(png);
|
|
||||||
|
|
||||||
png_write_info(png, info);
|
switch (space) {
|
||||||
|
case B_RGB32:
|
||||||
|
case B_RGBA32:
|
||||||
|
{
|
||||||
|
// create file without alpha channel
|
||||||
|
png_set_IHDR(png, info, width, height, 8, PNG_COLOR_TYPE_RGB,
|
||||||
|
PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
|
||||||
|
PNG_FILTER_TYPE_DEFAULT);
|
||||||
|
png_write_info(png, info);
|
||||||
|
|
||||||
#if 1
|
// convert from 32 bit RGB to 24 bit RGB while saving
|
||||||
png_byte* rowPointers[height];
|
png_byte* src = (png_byte*)bits;
|
||||||
png_byte* index = (png_byte*)bits;
|
int srcRowBytes = width * 4;
|
||||||
for (int32 i = 0; i < height; i++) {
|
int dstRowBytes = width * 3;
|
||||||
rowPointers[i] = index;
|
int srcRowOffset = bytesPerRow - srcRowBytes;
|
||||||
index += bytesPerRow;
|
png_byte tempRow[dstRowBytes];
|
||||||
|
for (int row = 0; row < height; row++) {
|
||||||
|
for (int i = 0; i < dstRowBytes; i += 3, src += 4) {
|
||||||
|
tempRow[i] = src[0];
|
||||||
|
tempRow[i + 1] = src[1];
|
||||||
|
tempRow[i + 2] = src[2];
|
||||||
|
}
|
||||||
|
src += srcRowOffset;
|
||||||
|
png_write_row(png, tempRow);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
TRACE(("Unsupported color space\n"));
|
||||||
|
png_destroy_write_struct(&png, NULL);
|
||||||
|
fclose(file);
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
png_write_image(png, rowPointers);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
png_byte* index = (png_byte*)bits;
|
|
||||||
int32 visibleBytes = width * 4;
|
|
||||||
png_byte tempRow[visibleBytes];
|
|
||||||
for (int32 i = 0; i < height; i++) {
|
|
||||||
gfxcpy32(tempRow, index, visibleBytes);
|
|
||||||
png_write_row(png, tempRow);
|
|
||||||
index += bytesPerRow;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
png_write_end(png, info);
|
png_write_end(png, info);
|
||||||
png_destroy_write_struct(&png, NULL);
|
png_destroy_write_struct(&png, NULL);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user