Blue Screen of Death with SetDIBits XP x64 Pro

S

Skybuck Flying

// Code is crashing XP x64 Pro in Delphi 2010 with Blue Screen of Death

// MiniDump will follow shortly.

// This has happened many times by now on different occasionals trying to do
stuff like this.

// Getting sick of it.

// Try to get this working:

// *********

unit unit_TPixelMap_version_001;

interface

uses
ExtCtrls;

type
PPixel = ^TPixel;
TPixel = packed record
case integer of
0 :
(
mRed : byte;
mGeen : byte;
mBlue : byte;
mAlpha : byte;
);
1 :
(
mInteger : integer;
);
2 :
(
mLongword : longword;
);
3 :
(
mValue : integer;
);
4 :
(
// mColor : TColor;
);
5 :
(
mLowWord : word;
mHighWord : word;
);
end;

TPixelMap = class
private

protected
mMemory : packed array of byte;

mWidth : integer;
mHeight : integer;

function GetPixel( ParaX, ParaY : integer ) : PPixel; // can be inlined
later on.
public
constructor Create;
destructor Destroy; override;

procedure CopyFromImageBitmap( ParaImage : TImage );
procedure CopyToImageBitmap( var ParaImage : TImage );

property Width : integer read mWidth;
property Height : integer read mHeight;
property Pixel[ ParaX, ParaY : integer ] : PPixel read GetPixel;
end;

implementation

uses
Windows, Classes, Controls;

constructor TPixelMap.Create;
begin
inherited Create;

end;

destructor TPixelMap.Destroy;
begin

inherited Destroy;
end;

// LEARN FROM THIS YOU NOOBS
function TPixelMap.GetPixel( ParaX, ParaY : integer ) : PPixel;
begin
result := @mMemory[ (ParaY * mWidth * SizeOf(TPixel)) + (ParaX *
SizeOf(TPixel)) ];
end;

procedure TPixelMap.CopyFromImageBitmap( ParaImage : TImage );
var
vBitmapInfo : TBitmapInfo;
begin
mWidth := ParaImage.Picture.Bitmap.Width;
mHeight := ParaImage.Picture.Bitmap.Height;

SetLength( mMemory, mWidth * mHeight * SizeOf(TPixel) );

with vBitmapInfo.bmiHeader do
begin
biSize := SizeOf(TBitmapInfoHeader);
biWidth := ParaImage.Picture.Bitmap.Width;
biHeight := -ParaImage.Picture.Bitmap.Height;
biPlanes := 1;
biBitCount := 32;
biCompression := BI_RGB;
biSizeImage := 0;
biXPelsPerMeter := 1; //dont care
biYPelsPerMeter := 1; //dont care
biClrUsed := 0;
biClrImportant := 0;
end;

GetDIBits
(
ParaImage.Picture.Bitmap.Canvas.Handle,
ParaImage.Picture.Bitmap.Handle,
0,
ParaImage.Picture.Bitmap.Height,
// mMemory, // ?
@mMemory[0], // <- suspicious
vBitmapInfo,
DIB_RGB_COLORS
);
end;

procedure TPixelMap.CopyToImageBitmap( var ParaImage : TImage );
var
vBitmapInfo : TBitmapInfo;

vOwner : Tcomponent;
vParent : TwinControl;
vTop : integer;
vLeft : integer;
begin
if ParaImage <> nil then
begin
vOwner := ParaImage.Owner;
vParent := ParaImage.Parent;
ParaImage.Free;

ParaImage := TImage.Create( vOwner );
ParaImage.Parent := vParent;
ParaImage.Top := vTop;
ParaImage.Left := vLeft;
end;

ParaImage.Width := mWidth;
ParaImage.Height := mHeight;
ParaImage.ClientWidth := mWidth;
ParaImage.ClientHeight := mHeight;

with vBitmapInfo.bmiHeader do
begin
biSize := SizeOf(TBitmapInfoHeader);
biWidth := ParaImage.Picture.Bitmap.Width;
biHeight := -ParaImage.Picture.Bitmap.Height;
biPlanes := 1;
biBitCount := 32;
biCompression := BI_RGB;
biSizeImage := 0;
biXPelsPerMeter := 1; //dont care
biYPelsPerMeter := 1; //dont care
biClrUsed := 0;
biClrImportant := 0;
end;

SetDIBits
(
ParaImage.Picture.Bitmap.Canvas.Handle,
ParaImage.Picture.Bitmap.Handle,
0,
mHeight,
// mMemory, ?
@mMemory[0], // <- suspicious
vBitmapInfo,
DIB_RGB_COLORS
);
end;

end.

// *********

Bye,
Sybuck
 
S

Skybuck Flying

This is from the large memory dump which was probably created by it:

(Kinda weird... normally it's only minidump... maybe settings where changed
or maybe this is extra):
Can't upload it ofcourse to big 512 MB or so..

I see minidump available too, will post in second posting and link there to
file
too.

Microsoft (R) Windows Debugger Version 6.11.0001.404 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.


Loading Dump File [C:\WINDOWS\MEMORY.DMP]
Kernel Summary Dump File: Only kernel address space is available

Symbol search path is:
SRV*c:\Tools\WinDbg\WebSymbols*http://msdl.microsoft.com/download/symbols
Executable search path is:
Windows Server 2003 Kernel Version 3790 (Service Pack 2) MP (2 procs) Free
x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 3790.srv03_sp2_gdr.100216-1301
Machine Name:
Kernel base = 0xfffff800`01000000 PsLoadedModuleList = 0xfffff800`011d4140
Debug session time: Thu Dec 16 11:48:32.250 2010 (GMT+1)
System Uptime: 0 days 13:48:53.194
Loading Kernel Symbols
................................................................
.................................................................
........................
Loading User Symbols
PEB is paged out (Peb.Ldr = 00000000`7efdf018). Type ".hh dbgerr001" for
details
Loading unloaded module list
...............................
*******************************************************************************
*
*
* Bugcheck Analysis
*
*
*
*******************************************************************************

Use !analyze -v to get detailed debugging information.

BugCheck 1E, {ffffffffc0000005, fffff800012c1308, 0, ffffffffffffffff}

Page ad2a1 not present in the dump file. Type ".hh dbgerr004" for details
Page ad50e not present in the dump file. Type ".hh dbgerr004" for details
*** ERROR: Module load completed but symbols could not be loaded for
sptd.sys
PEB is paged out (Peb.Ldr = 00000000`7efdf018). Type ".hh dbgerr001" for
details
PEB is paged out (Peb.Ldr = 00000000`7efdf018). Type ".hh dbgerr001" for
details
Probably caused by : sptd.sys ( sptd+57a0f )

Followup: MachineOwner
---------

0: kd> !analyze -v
*******************************************************************************
*
*
* Bugcheck Analysis
*
*
*
*******************************************************************************

KMODE_EXCEPTION_NOT_HANDLED (1e)
This is a very common bugcheck. Usually the exception address pinpoints
the driver/function that caused the problem. Always note this address
as well as the link date of the driver/image that contains this address.
Arguments:
Arg1: ffffffffc0000005, The exception code that was not handled
Arg2: fffff800012c1308, The address that the exception occurred at
Arg3: 0000000000000000, Parameter 0 of the exception
Arg4: ffffffffffffffff, Parameter 1 of the exception

Debugging Details:
------------------

Page ad2a1 not present in the dump file. Type ".hh dbgerr004" for details
Page ad50e not present in the dump file. Type ".hh dbgerr004" for details
PEB is paged out (Peb.Ldr = 00000000`7efdf018). Type ".hh dbgerr001" for
details
PEB is paged out (Peb.Ldr = 00000000`7efdf018). Type ".hh dbgerr001" for
details

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at "0x%08lx"
referenced memory at "0x%08lx". The memory could not be "%s".

FAULTING_IP:
nt!PspGetSetContextInternal+203
fffff800`012c1308 488b58f8 mov rbx,qword ptr [rax-8]

EXCEPTION_PARAMETER1: 0000000000000000

EXCEPTION_PARAMETER2: ffffffffffffffff

READ_ADDRESS: ffffffffffffffff

DEFAULT_BUCKET_ID: DRIVER_FAULT

BUGCHECK_STR: 0x1E

PROCESS_NAME: TestApplication

CURRENT_IRQL: 1

EXCEPTION_RECORD: fffffadf8848be40 -- (.exr 0xfffffadf8848be40)
ExceptionAddress: fffff800012c1308
(nt!PspGetSetContextInternal+0x0000000000000203)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000008
NumberParameters: 2
Parameter[0]: 0000000000000000
Parameter[1]: ffffffffffffffff
Attempt to read from address ffffffffffffffff

TRAP_FRAME: fffffadf8848bed0 -- (.trap 0xfffffadf8848bed0)
NOTE: The trap frame does not contain all registers.
Some register values may be zeroed or incorrect.
rax=00fffffadf8ffe9a rbx=0000000000000000 rcx=0000000000000001
rdx=0000000000000000 rsi=0000000000000000 rdi=0000000000000000
rip=fffff800012c1308 rsp=fffffadf8848c060 rbp=fffffadf8778db10
r8=0000000000000000 r9=0000000000000000 r10=0000000000000000
r11=0000000000000000 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0 nv up ei pl nz na po nc
nt!PspGetSetContextInternal+0x203:
fffff800`012c1308 488b58f8 mov rbx,qword ptr [rax-8]
ds:c0c0:fe92=????????????????
Resetting default scope

LAST_CONTROL_TRANSFER: from fffff80001080e86 to fffff8000102e890

STACK_TEXT:
fffffadf`8848b748 fffff800`01080e86 : 00000000`0000001e ffffffff`c0000005
fffff800`012c1308 00000000`00000000 : nt!KeBugCheckEx
fffffadf`8848b750 fffff800`0102e6af : fffffadf`8848be40 fffffa80`00a8d6a0
fffffadf`8848bed0 fffffadf`00000000 : nt!KiDispatchException+0x128
fffffadf`8848bd50 fffff800`0102d30d : fffffadf`9c000910 fffff800`0103efc9
fffffa80`00c7eed8 ffffffff`00000000 : nt!KiExceptionExit
fffffadf`8848bed0 fffff800`012c1308 : 00000000`00000000 00000000`00000000
fffffadf`8848cc70 fffffadf`8778d5c0 : nt!KiGeneralProtectionFault+0xcd
fffffadf`8848c060 fffff800`0104236b : fffffadf`996270e0 00000000`00000000
fffffadf`99627128 00000000`00000000 : nt!PspGetSetContextInternal+0x203
fffffadf`8848c5b0 fffff800`01027eb1 : 00000000`00000000 fffffadf`99627158
00000000`00000000 fffffadf`99627128 : nt!PspGetSetContextSpecialApc+0xab
fffffadf`8848c6c0 fffff800`0103bf97 : 00000000`00000000 00000000`00000000
00000000`00000000 00000000`00000000 : nt!KiDeliverApc+0x215
fffffadf`8848c760 fffff800`0102828e : 00000000`00000000 00000000`00000000
fffffadf`99627178 fffffadf`996270e0 : nt!KiSwapThread+0x3e9
fffffadf`8848c7c0 fffff800`0101f88c : 00000000`00000000 00000000`00000005
fffffadf`9ca0b700 fffff800`0101f500 : nt!KeWaitForSingleObject+0x5a6
fffffadf`8848c840 fffff800`0101f51b : 00000000`00000000 fffffadf`97d36b50
00000000`00000000 00000000`00000000 : nt!KiSuspendThread+0x2c
fffffadf`8848c880 fffff800`010747df : fffffadf`97ed9590 00000000`00000000
fffff800`0101f860 00000000`00000000 : nt!KiDeliverApc+0x2d3
fffffadf`8848c920 fffffadf`90315a0f : fffffadf`9033d301 fffffadf`9c162000
fffffadf`97d36b00 fffffadf`9824f280 : nt!KeLeaveCriticalRegion+0x46
fffffadf`8848c950 fffffadf`902ffa65 : fffffadf`9033d3d8 fffffadf`97d36b50
00000000`00000000 fffff800`011a98fd : sptd+0x57a0f
fffffadf`8848c980 fffffadf`9c1622ee : fffffadf`97d36b50 00000000`00000000
fffffadf`9c162000 fffffadf`8848ca58 : sptd+0x41a65
fffffadf`8848ca30 fffffadf`97d36b50 : 00000000`00000000 fffffadf`9c162000
fffffadf`8848ca58 fffffadf`9c92c040 : 0xfffffadf`9c1622ee
fffffadf`8848ca38 00000000`00000000 : fffffadf`9c162000 fffffadf`8848ca58
fffffadf`9c92c040 00000000`00000000 : 0xfffffadf`97d36b50


STACK_COMMAND: kb

FOLLOWUP_IP:
sptd+57a0f
fffffadf`90315a0f 488b742438 mov rsi,qword ptr [rsp+38h]

SYMBOL_STACK_INDEX: c

SYMBOL_NAME: sptd+57a0f

FOLLOWUP_NAME: MachineOwner

MODULE_NAME: sptd

IMAGE_NAME: sptd.sys

DEBUG_FLR_IMAGE_TIMESTAMP: 47cf3c13

FAILURE_BUCKET_ID: X64_0x1E_sptd+57a0f

BUCKET_ID: X64_0x1E_sptd+57a0f

Followup: MachineOwner
 
S

Skybuck Flying

Minidump file:

http://members.home.nl/hbthouppermans/MiniDump/Mini121610-01.dmp

Minidump analyze:

"
Microsoft (R) Windows Debugger Version 6.11.0001.404 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.


Loading Dump File [C:\WINDOWS\Minidump\Mini121610-01.dmp]
Mini Kernel Dump File: Only registers and stack trace are available

Symbol search path is:
SRV*c:\Tools\WinDbg\WebSymbols*http://msdl.microsoft.com/download/symbols
Executable search path is:
Windows Server 2003 Kernel Version 3790 (Service Pack 2) MP (2 procs) Free
x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 3790.srv03_sp2_gdr.100216-1301
Machine Name:
Kernel base = 0xfffff800`01000000 PsLoadedModuleList = 0xfffff800`011d4140
Debug session time: Thu Dec 16 11:48:32.250 2010 (GMT+1)
System Uptime: 0 days 13:48:53.194
Loading Kernel Symbols
................................................................
.................................................................
........................
Loading User Symbols
Loading unloaded module list
...............................
*******************************************************************************
*
*
* Bugcheck Analysis
*
*
*
*******************************************************************************

Use !analyze -v to get detailed debugging information.

BugCheck 1E, {ffffffffc0000005, fffff800012c1308, 0, ffffffffffffffff}

Unable to load image sptd.sys, Win32 error 0n2
*** WARNING: Unable to verify timestamp for sptd.sys
*** ERROR: Module load completed but symbols could not be loaded for
sptd.sys
Probably caused by : sptd.sys ( sptd+57a0f )

Followup: MachineOwner
---------

0: kd> !analyze -v
*******************************************************************************
*
*
* Bugcheck Analysis
*
*
*
*******************************************************************************

KMODE_EXCEPTION_NOT_HANDLED (1e)
This is a very common bugcheck. Usually the exception address pinpoints
the driver/function that caused the problem. Always note this address
as well as the link date of the driver/image that contains this address.
Arguments:
Arg1: ffffffffc0000005, The exception code that was not handled
Arg2: fffff800012c1308, The address that the exception occurred at
Arg3: 0000000000000000, Parameter 0 of the exception
Arg4: ffffffffffffffff, Parameter 1 of the exception

Debugging Details:
------------------


EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at "0x%08lx"
referenced memory at "0x%08lx". The memory could not be "%s".

FAULTING_IP:
nt!PspGetSetContextInternal+203
fffff800`012c1308 488b58f8 mov rbx,qword ptr [rax-8]

EXCEPTION_PARAMETER1: 0000000000000000

EXCEPTION_PARAMETER2: ffffffffffffffff

READ_ADDRESS: ffffffffffffffff

CUSTOMER_CRASH_COUNT: 1

DEFAULT_BUCKET_ID: DRIVER_FAULT

BUGCHECK_STR: 0x1E

PROCESS_NAME: TestApplication

CURRENT_IRQL: 1

EXCEPTION_RECORD: fffffadf8848be40 -- (.exr 0xfffffadf8848be40)
ExceptionAddress: fffff800012c1308
(nt!PspGetSetContextInternal+0x0000000000000203)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000008
NumberParameters: 2
Parameter[0]: 0000000000000000
Parameter[1]: ffffffffffffffff
Attempt to read from address ffffffffffffffff

TRAP_FRAME: fffffadf8848bed0 -- (.trap 0xfffffadf8848bed0)
NOTE: The trap frame does not contain all registers.
Some register values may be zeroed or incorrect.
rax=00fffffadf8ffe9a rbx=0000000000000000 rcx=0000000000000001
rdx=0000000000000000 rsi=0000000000000000 rdi=0000000000000000
rip=fffff800012c1308 rsp=fffffadf8848c060 rbp=fffffadf8778db10
r8=0000000000000000 r9=0000000000000000 r10=0000000000000000
r11=0000000000000000 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0 nv up ei pl nz na po nc
nt!PspGetSetContextInternal+0x203:
fffff800`012c1308 488b58f8 mov rbx,qword ptr [rax-8]
ds:c0c0:00fffffa`df8ffe92=????????????????
Resetting default scope

LAST_CONTROL_TRANSFER: from fffff80001080e86 to fffff8000102e890

STACK_TEXT:
fffffadf`8848b748 fffff800`01080e86 : 00000000`0000001e ffffffff`c0000005
fffff800`012c1308 00000000`00000000 : nt!KeBugCheckEx
fffffadf`8848b750 fffff800`0102e6af : fffffadf`8848be40 fffffa80`00a8d6a0
fffffadf`8848bed0 fffffadf`00000000 : nt!KiDispatchException+0x128
fffffadf`8848bd50 fffff800`0102d30d : fffffadf`9c000910 fffff800`0103efc9
fffffa80`00c7eed8 ffffffff`00000000 : nt!KiExceptionExit
fffffadf`8848bed0 fffff800`012c1308 : 00000000`00000000 00000000`00000000
fffffadf`8848cc70 fffffadf`8778d5c0 : nt!KiGeneralProtectionFault+0xcd
fffffadf`8848c060 fffff800`0104236b : fffffadf`996270e0 00000000`00000000
fffffadf`99627128 00000000`00000000 : nt!PspGetSetContextInternal+0x203
fffffadf`8848c5b0 fffff800`01027eb1 : 00000000`00000000 fffffadf`99627158
00000000`00000000 fffffadf`99627128 : nt!PspGetSetContextSpecialApc+0xab
fffffadf`8848c6c0 fffff800`0103bf97 : 00000000`00000000 00000000`00000000
00000000`00000000 00000000`00000000 : nt!KiDeliverApc+0x215
fffffadf`8848c760 fffff800`0102828e : 00000000`00000000 00000000`00000000
fffffadf`99627178 fffffadf`996270e0 : nt!KiSwapThread+0x3e9
fffffadf`8848c7c0 fffff800`0101f88c : 00000000`00000000 00000000`00000005
fffffadf`9ca0b700 fffff800`0101f500 : nt!KeWaitForSingleObject+0x5a6
fffffadf`8848c840 fffff800`0101f51b : 00000000`00000000 fffffadf`97d36b50
00000000`00000000 00000000`00000000 : nt!KiSuspendThread+0x2c
fffffadf`8848c880 fffff800`010747df : fffffadf`97ed9590 00000000`00000000
fffff800`0101f860 00000000`00000000 : nt!KiDeliverApc+0x2d3
fffffadf`8848c920 fffffadf`90315a0f : fffffadf`9033d301 fffffadf`9c162000
fffffadf`97d36b00 fffffadf`9824f280 : nt!KeLeaveCriticalRegion+0x46
fffffadf`8848c950 fffffadf`9033d301 : fffffadf`9c162000 fffffadf`97d36b00
fffffadf`9824f280 fffffadf`97d36ea8 : sptd+0x57a0f
fffffadf`8848c958 fffffadf`9c162000 : fffffadf`97d36b00 fffffadf`9824f280
fffffadf`97d36ea8 fffffadf`902ffa65 : sptd+0x7f301
fffffadf`8848c960 fffffadf`97d36b00 : fffffadf`9824f280 fffffadf`97d36ea8
fffffadf`902ffa65 fffffadf`9033d3d8 : 0xfffffadf`9c162000
fffffadf`8848c968 fffffadf`9824f280 : fffffadf`97d36ea8 fffffadf`902ffa65
fffffadf`9033d3d8 fffffadf`97d36b50 : 0xfffffadf`97d36b00
fffffadf`8848c970 fffffadf`97d36ea8 : fffffadf`902ffa65 fffffadf`9033d3d8
fffffadf`97d36b50 00000000`00000000 : 0xfffffadf`9824f280
fffffadf`8848c978 fffffadf`902ffa65 : fffffadf`9033d3d8 fffffadf`97d36b50
00000000`00000000 fffff800`011a98fd : 0xfffffadf`97d36ea8
fffffadf`8848c980 fffffadf`9033d3d8 : fffffadf`97d36b50 00000000`00000000
fffff800`011a98fd fffffadf`98378ba0 : sptd+0x41a65
fffffadf`8848c988 fffffadf`97d36b50 : 00000000`00000000 fffff800`011a98fd
fffffadf`98378ba0 fffffadf`98378ba0 : sptd+0x7f3d8
fffffadf`8848c990 00000000`00000000 : fffff800`011a98fd fffffadf`98378ba0
fffffadf`98378ba0 fffffadf`98378b03 : 0xfffffadf`97d36b50


STACK_COMMAND: kb

FOLLOWUP_IP:
sptd+57a0f
fffffadf`90315a0f ?? ???

SYMBOL_STACK_INDEX: c

SYMBOL_NAME: sptd+57a0f

FOLLOWUP_NAME: MachineOwner

MODULE_NAME: sptd

IMAGE_NAME: sptd.sys

DEBUG_FLR_IMAGE_TIMESTAMP: 47cf3c13

FAILURE_BUCKET_ID: X64_0x1E_sptd+57a0f

BUCKET_ID: X64_0x1E_sptd+57a0f

Followup: MachineOwner
 
S

Skybuck Flying

Usage example that probably crashed it:

Place image on screen... load something...

place other image on screen then try:

PixelMap.CopyFrom...(FirstImage)
PixelMap.Copyto (SecondImage)

Bam blue screen of death.

Bye,
Skybuck.

Skybuck Flying said:
// Code is crashing XP x64 Pro in Delphi 2010 with Blue Screen of Death

// MiniDump will follow shortly.

// This has happened many times by now on different occasionals trying to
do stuff like this.

// Getting sick of it.

// Try to get this working:

// *********

unit unit_TPixelMap_version_001;

interface

uses
ExtCtrls;

type
PPixel = ^TPixel;
TPixel = packed record
case integer of
0 :
(
mRed : byte;
mGeen : byte;
mBlue : byte;
mAlpha : byte;
);
1 :
(
mInteger : integer;
);
2 :
(
mLongword : longword;
);
3 :
(
mValue : integer;
);
4 :
(
// mColor : TColor;
);
5 :
(
mLowWord : word;
mHighWord : word;
);
end;

TPixelMap = class
private

protected
mMemory : packed array of byte;

mWidth : integer;
mHeight : integer;

function GetPixel( ParaX, ParaY : integer ) : PPixel; // can be inlined
later on.
public
constructor Create;
destructor Destroy; override;

procedure CopyFromImageBitmap( ParaImage : TImage );
procedure CopyToImageBitmap( var ParaImage : TImage );

property Width : integer read mWidth;
property Height : integer read mHeight;
property Pixel[ ParaX, ParaY : integer ] : PPixel read GetPixel;
end;

implementation

uses
Windows, Classes, Controls;

constructor TPixelMap.Create;
begin
inherited Create;

end;

destructor TPixelMap.Destroy;
begin

inherited Destroy;
end;

// LEARN FROM THIS YOU NOOBS
function TPixelMap.GetPixel( ParaX, ParaY : integer ) : PPixel;
begin
result := @mMemory[ (ParaY * mWidth * SizeOf(TPixel)) + (ParaX *
SizeOf(TPixel)) ];
end;

procedure TPixelMap.CopyFromImageBitmap( ParaImage : TImage );
var
vBitmapInfo : TBitmapInfo;
begin
mWidth := ParaImage.Picture.Bitmap.Width;
mHeight := ParaImage.Picture.Bitmap.Height;

SetLength( mMemory, mWidth * mHeight * SizeOf(TPixel) );

with vBitmapInfo.bmiHeader do
begin
biSize := SizeOf(TBitmapInfoHeader);
biWidth := ParaImage.Picture.Bitmap.Width;
biHeight := -ParaImage.Picture.Bitmap.Height;
biPlanes := 1;
biBitCount := 32;
biCompression := BI_RGB;
biSizeImage := 0;
biXPelsPerMeter := 1; //dont care
biYPelsPerMeter := 1; //dont care
biClrUsed := 0;
biClrImportant := 0;
end;

GetDIBits
(
ParaImage.Picture.Bitmap.Canvas.Handle,
ParaImage.Picture.Bitmap.Handle,
0,
ParaImage.Picture.Bitmap.Height,
// mMemory, // ?
@mMemory[0], // <- suspicious
vBitmapInfo,
DIB_RGB_COLORS
);
end;

procedure TPixelMap.CopyToImageBitmap( var ParaImage : TImage );
var
vBitmapInfo : TBitmapInfo;

vOwner : Tcomponent;
vParent : TwinControl;
vTop : integer;
vLeft : integer;
begin
if ParaImage <> nil then
begin
vOwner := ParaImage.Owner;
vParent := ParaImage.Parent;
ParaImage.Free;

ParaImage := TImage.Create( vOwner );
ParaImage.Parent := vParent;
ParaImage.Top := vTop;
ParaImage.Left := vLeft;
end;

ParaImage.Width := mWidth;
ParaImage.Height := mHeight;
ParaImage.ClientWidth := mWidth;
ParaImage.ClientHeight := mHeight;

with vBitmapInfo.bmiHeader do
begin
biSize := SizeOf(TBitmapInfoHeader);
biWidth := ParaImage.Picture.Bitmap.Width;
biHeight := -ParaImage.Picture.Bitmap.Height;
biPlanes := 1;
biBitCount := 32;
biCompression := BI_RGB;
biSizeImage := 0;
biXPelsPerMeter := 1; //dont care
biYPelsPerMeter := 1; //dont care
biClrUsed := 0;
biClrImportant := 0;
end;

SetDIBits
(
ParaImage.Picture.Bitmap.Canvas.Handle,
ParaImage.Picture.Bitmap.Handle,
0,
mHeight,
// mMemory, ?
@mMemory[0], // <- suspicious
vBitmapInfo,
DIB_RGB_COLORS
);
end;

end.

// *********

Bye,
Sybuck
 
S

Skybuck Flying

It's hard to debug/improve something if it blue screen you know...

Not gonna try it again today...

Maybe tomorrow... me to annoyed and tired to try it today.

I just wanna move on with my project instead of fizzle with this shit.

I might go back to the slow TImage.Canvas.Pixel but I won't like that very
much.

Or otherwise I might spent time on loading bitmaps or any other easier
format
myself... though I still want to be able to display onto TImage... so I am
still going to have to get that fok working.

This is definetly the most incomprehisenble design I have ever come across.

Bye,
Skybuck.
 
Top