mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 00:13:04 +00:00
Handle RLE bottom-up dibs
svn path=/trunk/; revision=9825
This commit is contained in:
parent
61d1eb4f34
commit
4d08b708f4
4 changed files with 66 additions and 63 deletions
|
@ -16,7 +16,7 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: surface.c,v 1.40 2004/05/30 14:01:12 weiden Exp $
|
||||
/* $Id: surface.c,v 1.41 2004/06/23 07:31:22 gvg Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -317,57 +317,68 @@ EngCreateBitmap(IN SIZEL Size,
|
|||
PVOID UncompressedBits;
|
||||
ULONG UncompressedFormat;
|
||||
|
||||
NewBitmap = (PVOID)CreateGDIHandle(sizeof(SURFGDI), sizeof(SURFOBJ), (PVOID*)&SurfGDI, (PVOID*)&SurfObj);
|
||||
if( !ValidEngHandle( NewBitmap ) )
|
||||
if (Width < 0) __asm__("int $3\n");
|
||||
NewBitmap = (HBITMAP) CreateGDIHandle(sizeof(SURFGDI), sizeof(SURFOBJ), (PVOID*)&SurfGDI, (PVOID*)&SurfObj);
|
||||
if (! ValidEngHandle(NewBitmap))
|
||||
return 0;
|
||||
|
||||
SurfGDI->BitsPerPixel = BitsPerFormat(Format);
|
||||
if (Format == BMF_4RLE) {
|
||||
SurfObj->lDelta = DIB_GetDIBWidthBytes(Size.cx, BitsPerFormat(BMF_4BPP));
|
||||
SurfObj->cjBits = SurfObj->lDelta * Size.cy;
|
||||
UncompressedFormat = BMF_4BPP;
|
||||
if (Format == BMF_4RLE)
|
||||
{
|
||||
SurfObj->lDelta = DIB_GetDIBWidthBytes(Size.cx, BitsPerFormat(BMF_4BPP));
|
||||
SurfObj->cjBits = SurfObj->lDelta * Size.cy;
|
||||
UncompressedFormat = BMF_4BPP;
|
||||
UncompressedBits = EngAllocMem(FL_ZERO_MEMORY, SurfObj->cjBits, 0);
|
||||
Decompress4bpp(Size, (BYTE *)Bits, (BYTE *)UncompressedBits, SurfObj->lDelta);
|
||||
} else {
|
||||
if (Format == BMF_8RLE) {
|
||||
SurfObj->lDelta = DIB_GetDIBWidthBytes(Size.cx, BitsPerFormat(BMF_8BPP));
|
||||
SurfObj->cjBits = SurfObj->lDelta * Size.cy;
|
||||
UncompressedFormat = BMF_8BPP;
|
||||
UncompressedBits = EngAllocMem(FL_ZERO_MEMORY, SurfObj->cjBits, 0);
|
||||
Decompress8bpp(Size, (BYTE *)Bits, (BYTE *)UncompressedBits, SurfObj->lDelta);
|
||||
} else {
|
||||
SurfObj->lDelta = Width;
|
||||
SurfObj->cjBits = SurfObj->lDelta * Size.cy;
|
||||
UncompressedBits = Bits;
|
||||
UncompressedFormat = Format;
|
||||
}
|
||||
}
|
||||
if(UncompressedBits!=NULL)
|
||||
{
|
||||
SurfObj->pvBits = UncompressedBits;
|
||||
} else
|
||||
{
|
||||
if (SurfObj->cjBits == 0)
|
||||
{
|
||||
SurfObj->pvBits = NULL;
|
||||
Decompress4bpp(Size, (BYTE *)Bits, (BYTE *)UncompressedBits, SurfObj->lDelta);
|
||||
}
|
||||
else
|
||||
else if (Format == BMF_8RLE)
|
||||
{
|
||||
if(Flags & BMF_USERMEM)
|
||||
{
|
||||
SurfObj->pvBits = EngAllocUserMem(SurfObj->cjBits, 0);
|
||||
} else {
|
||||
if(Flags & BMF_NOZEROINIT)
|
||||
{
|
||||
SurfObj->pvBits = EngAllocMem(0, SurfObj->cjBits, 0);
|
||||
} else {
|
||||
SurfObj->pvBits = EngAllocMem(FL_ZERO_MEMORY, SurfObj->cjBits, 0);
|
||||
}
|
||||
}
|
||||
SurfObj->lDelta = DIB_GetDIBWidthBytes(Size.cx, BitsPerFormat(BMF_8BPP));
|
||||
SurfObj->cjBits = SurfObj->lDelta * Size.cy;
|
||||
UncompressedFormat = BMF_8BPP;
|
||||
UncompressedBits = EngAllocMem(FL_ZERO_MEMORY, SurfObj->cjBits, 0);
|
||||
Decompress8bpp(Size, (BYTE *)Bits, (BYTE *)UncompressedBits, SurfObj->lDelta);
|
||||
}
|
||||
else
|
||||
{
|
||||
SurfObj->lDelta = Width;
|
||||
SurfObj->cjBits = Width * Size.cy;
|
||||
UncompressedBits = Bits;
|
||||
UncompressedFormat = Format;
|
||||
}
|
||||
}
|
||||
|
||||
SurfObj->dhsurf = 0; // device managed surface
|
||||
if (UncompressedBits != NULL)
|
||||
{
|
||||
SurfObj->pvBits = UncompressedBits;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (SurfObj->cjBits == 0)
|
||||
{
|
||||
SurfObj->pvBits = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (0 != (Flags & BMF_USERMEM))
|
||||
{
|
||||
SurfObj->pvBits = EngAllocUserMem(SurfObj->cjBits, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
SurfObj->pvBits = EngAllocMem(0 != (Flags & BMF_NOZEROINIT) ? 0 : FL_ZERO_MEMORY,
|
||||
SurfObj->cjBits, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (0 == (Flags & BMF_TOPDOWN))
|
||||
{
|
||||
SurfObj->pvBits = (PVOID) ((PCHAR) UncompressedBits + SurfObj->cjBits - SurfObj->lDelta);
|
||||
SurfObj->lDelta = - SurfObj->lDelta;
|
||||
}
|
||||
|
||||
SurfObj->dhsurf = 0; /* device managed surface */
|
||||
SurfObj->hsurf = 0;
|
||||
SurfObj->dhpdev = NULL;
|
||||
SurfObj->hdev = NULL;
|
||||
|
@ -380,7 +391,7 @@ EngCreateBitmap(IN SIZEL Size,
|
|||
|
||||
InitializeFuncs(SurfGDI, UncompressedFormat);
|
||||
|
||||
// Use flags to determine bitmap type -- TOP_DOWN or whatever
|
||||
/* Use flags to determine bitmap type -- TOP_DOWN or whatever */
|
||||
|
||||
return NewBitmap;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* $Id: dib.c,v 1.52 2004/06/22 20:08:17 gvg Exp $
|
||||
* $Id: dib.c,v 1.53 2004/06/23 07:31:22 gvg Exp $
|
||||
*
|
||||
* ReactOS W32 Subsystem
|
||||
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
|
||||
|
@ -132,8 +132,7 @@ IntSetDIBits(
|
|||
//RGBQUAD *lpRGB;
|
||||
HPALETTE DDB_Palette, DIB_Palette;
|
||||
ULONG DDB_Palette_Type, DIB_Palette_Type;
|
||||
const BYTE *vBits = (const BYTE*)Bits;
|
||||
INT scanDirection = 1, DIBWidth;
|
||||
INT DIBWidth;
|
||||
|
||||
// Check parameters
|
||||
if (!(bitmap = BITMAPOBJ_LockBitmap(hBitmap)))
|
||||
|
@ -160,18 +159,11 @@ IntSetDIBits(
|
|||
// Determine width of DIB
|
||||
DIBWidth = DIB_GetDIBWidthBytes(SourceSize.cx, bmi->bmiHeader.biBitCount);
|
||||
|
||||
// Determine DIB Vertical Orientation
|
||||
if(bmi->bmiHeader.biHeight > 0)
|
||||
{
|
||||
scanDirection = -1;
|
||||
vBits += DIBWidth * bmi->bmiHeader.biHeight - DIBWidth;
|
||||
}
|
||||
|
||||
SourceBitmap = EngCreateBitmap(SourceSize,
|
||||
DIBWidth * scanDirection,
|
||||
DIBWidth,
|
||||
BitmapFormat(bmi->bmiHeader.biBitCount, bmi->bmiHeader.biCompression),
|
||||
0,
|
||||
(PVOID)vBits );
|
||||
0 < bmi->bmiHeader.biHeight ? 0 : BMF_TOPDOWN,
|
||||
(PVOID) Bits);
|
||||
SourceSurf = (SURFOBJ*)AccessUserObject((ULONG)SourceBitmap);
|
||||
|
||||
// Destination palette obtained from the hDC
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: objconv.c,v 1.18 2004/05/10 17:07:20 weiden Exp $ */
|
||||
/* $Id: objconv.c,v 1.19 2004/06/23 07:31:22 gvg Exp $ */
|
||||
#include <w32k.h>
|
||||
|
||||
HBITMAP FASTCALL BitmapToSurf(PBITMAPOBJ BitmapObj, HDEV GDIDevice)
|
||||
|
@ -31,13 +31,13 @@ HBITMAP FASTCALL BitmapToSurf(PBITMAPOBJ BitmapObj, HDEV GDIDevice)
|
|||
{
|
||||
BitmapHandle = EngCreateBitmap(Size, BitmapObj->dib->dsBm.bmWidthBytes,
|
||||
BitmapFormat(BitmapObj->dib->dsBm.bmBitsPixel, BI_RGB),
|
||||
0, BitmapObj->dib->dsBm.bmBits);
|
||||
BMF_TOPDOWN, BitmapObj->dib->dsBm.bmBits);
|
||||
}
|
||||
else
|
||||
{
|
||||
BitmapHandle = EngCreateBitmap(Size, BitmapObj->bitmap.bmWidthBytes,
|
||||
BitmapFormat(BitmapObj->bitmap.bmBitsPixel, BI_RGB),
|
||||
0, BitmapObj->bitmap.bmBits);
|
||||
BMF_TOPDOWN, BitmapObj->bitmap.bmBits);
|
||||
}
|
||||
if (NULL != BitmapHandle && NULL != GDIDevice)
|
||||
{
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: text.c,v 1.97 2004/06/20 00:45:37 navaraf Exp $ */
|
||||
/* $Id: text.c,v 1.98 2004/06/23 07:31:22 gvg Exp $ */
|
||||
#include <w32k.h>
|
||||
|
||||
#include <ft2build.h>
|
||||
|
@ -1865,7 +1865,7 @@ NtGdiExtTextOut(
|
|||
* limit the work of the transbitblt.
|
||||
*/
|
||||
|
||||
HSourceGlyph = EngCreateBitmap(bitSize, pitch, (glyph->bitmap.pixel_mode == ft_pixel_mode_grays) ? BMF_8BPP : BMF_1BPP, 0, glyph->bitmap.buffer);
|
||||
HSourceGlyph = EngCreateBitmap(bitSize, pitch, (glyph->bitmap.pixel_mode == ft_pixel_mode_grays) ? BMF_8BPP : BMF_1BPP, BMF_TOPDOWN, glyph->bitmap.buffer);
|
||||
SourceGlyphSurf = (SURFOBJ*)AccessUserObject((ULONG) HSourceGlyph);
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue