LoadSpriteEx()

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Stefan
Beiträge: 125
Registriert: 29.08.2004 10:51
Kontaktdaten:

LoadSpriteEx()

Beitrag von Stefan »

Mit der funktion ist es möglich bmp,jpg,png und gif-bilder auch ohne große Imageplugins zu laden: :D

Code: Alles auswählen

;LoadSpriteEx() can load bmp,jpg,png and gif files, so you don't need huge imageplugins to load these formats
;LoadSpriteEx() works only if Internet Explorer 4.x or later is installed


Interface nIDXSurfaceFactory
  QueryInterface(a, b)
  AddRef()
  Release()
  CreateSurface(a, b, c, d, e, f, g, h)
  CreateFromDDSurface(a, b, c, d, e, f)
  LoadImage(a.p-bstr, b, c, d, e, f)
  LoadImageFromStream(a, b, c, d, e, f)
  CopySurfaceToNewFormat(a, b, c, d, e)
  CreateD3DRMTexture(a, b, c, d, e)
  BitBlt(a, b, c, d, e)
EndInterface

#DXLOCKF_READ=0
#CLSCTX_INPROC_SERVER=1

Procedure LoadSpriteEx(Sprite,FileName.s,Flags=0)
  result=CoInitialize_(0)
  If result=#S_FALSE Or result=#S_OK
    
    CoCreateInstance_(?CLSID_DXTransformFactory,0,#CLSCTX_INPROC_SERVER,?IID_IDXTransformFactory,@dxtf.IDXTransformFactory)
    
    If dxtf
      dxtf\QueryService(?IID_IDXSurfaceFactory,?IID_IDXSurfaceFactory,@dxsf.nIDXSurfaceFactory)
      If dxsf
        dxsf\LoadImage(FileName,0,0,0,?IID_IDXSurface,@surf.IDXSurface)
        If surf
          
          surf\LockSurfaceDC(0,#INFINITE,#DXLOCKF_READ,@lock.IDXDCLock)
          If lock
            DC=lock\GetDC()
            
            If DC
              GetClipBox_(DC,re.rect)
              
              If Sprite=#PB_Any
                result=CreateSprite(#PB_Any,re\right,re\bottom,Flags)
                Sprite=result
              Else
                result=CreateSprite(Sprite,re\right,re\bottom,Flags)
              EndIf
              
              If result
                
                DestDC=StartDrawing(SpriteOutput(Sprite))  
                If DestDC
                  Success=BitBlt_(DestDC,0,0,re\right,re\bottom,DC,0,0,#SRCCOPY)
                  StopDrawing()         
                EndIf
                
                If Success=#False:FreeSprite(Sprite):EndIf
              EndIf
            EndIf
            
            Lock\Release()     
          EndIf
          
          surf\Release()
        EndIf
        
        dxsf\Release()
      EndIf
      
      dxtf\Release()
    EndIf
    
    ;CoUninitialize_() ; doesn't work with this ?!?
  EndIf
  
  If Success:ProcedureReturn result:EndIf
  ProcedureReturn #False
  DataSection
  CLSID_DXTransformFactory:
  Data.l $D1FE6762
  Data.w $FC48,$11D0
  Data.b $88,$3A,$3C,$8B,$00,$C1,$00,$00
  
  IID_IDXTransformFactory:
  Data.l $6A950B2B
  Data.w $A971,$11D1
  Data.b $81,$C8,$00,$00,$F8,$75,$57,$DB
  
  IID_IDXSurfaceFactory:
  Data.l $144946F5
  Data.w $C4D4,$11D1
  Data.b $81,$D1,$00,$00,$F8,$75,$57,$DB
  
  IID_IDXSurface:
  Data.l $B39FD73F
  Data.w $E139,$11D1
  Data.b $90,$65,$00,$C0,$4F,$D9,$18,$9D
  EndDataSection
EndProcedure



InitSprite()
InitSprite3D()
OpenWindow(1,0,0,640,480,"LoadSpriteEx test")
OpenWindowedScreen(WindowID(1),0,0,640,480,0,0,0)

; even alphachannel is supported (in contrast to the LoadSprite() function this even works in 16bit screenmode!!!)
Sprite=LoadSpriteEx(#PB_Any,"C:\test.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture) ;sprite with alphachannel
CreateSprite3D(1,Sprite)

Repeat
  ClearScreen(#Red)
  Start3D()
  DisplaySprite3D(1,0,0)
  Stop3D()
  FlipBuffers()
Until WindowEvent()=#PB_Event_CloseWindow
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Wusste gar nicht das DX eigene Dekoder für sowas hat.

Kool! Bild
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
dige
Beiträge: 1235
Registriert: 08.09.2004 08:53

Beitrag von dige »

@Stefan: vielen Dank! Kann man das auch für CatchImage bzw.
CatchSprite verwenden?
"Papa, ich laufe schneller - dann ist es nicht so weit."
Stefan
Beiträge: 125
Registriert: 29.08.2004 10:51
Kontaktdaten:

Beitrag von Stefan »

@dige
ja, man muss nur ein paar zeilen hinzfügen: :) (allerdings muss bei catchspriteex,catchimageex die größe angegeben werden)
LoadImageEx:

Code: Alles auswählen

;LoadImageEx() can load bmp,jpg,png and gif files, so you don't need huge imageplugins to load these formats
;LoadImageEx() works only if Internet Explorer 4.x or later is installed


Interface nIDXSurfaceFactory
  QueryInterface(a, b)
  AddRef()
  Release()
  CreateSurface(a, b, c, d, e, f, g, h)
  CreateFromDDSurface(a, b, c, d, e, f)
  LoadImage(a.p-bstr, b, c, d, e, f)
  LoadImageFromStream(a, b, c, d, e, f)
  CopySurfaceToNewFormat(a, b, c, d, e)
  CreateD3DRMTexture(a, b, c, d, e)
  BitBlt(a, b, c, d, e)
EndInterface

#DXLOCKF_READ=0
#CLSCTX_INPROC_SERVER=1

Procedure LoadImageEx(Image,FileName.s,Flags=0)
  result=CoInitialize_(0)
  If result=#S_FALSE Or result=#S_OK
    
    CoCreateInstance_(?CLSID_DXTransformFactory,0,#CLSCTX_INPROC_SERVER,?IID_IDXTransformFactory,@dxtf.IDXTransformFactory)
    
    If dxtf
      dxtf\QueryService(?IID_IDXSurfaceFactory,?IID_IDXSurfaceFactory,@dxsf.nIDXSurfaceFactory)
      If dxsf
        dxsf\LoadImage(FileName,0,0,0,?IID_IDXSurface,@surf.IDXSurface)
        If surf
          
          surf\LockSurfaceDC(0,#INFINITE,#DXLOCKF_READ,@lock.IDXDCLock)
          If lock
            DC=lock\GetDC()
            
            If DC
              GetClipBox_(DC,re.rect)
              
              If Image=#PB_Any
                result=CreateImage(#PB_Any,re\right,re\bottom,Flags)
                Image=result
              Else
                result=CreateImage(Image,re\right,re\bottom,Flags)
              EndIf
              
              If result
                
                DestDC=StartDrawing(ImageOutput(Image))  
                If DestDC
                  Success=BitBlt_(DestDC,0,0,re\right,re\bottom,DC,0,0,#SRCCOPY)
                  StopDrawing()         
                EndIf
                
                If Success=#False:FreeImage(Image):EndIf
              EndIf
            EndIf
            
            Lock\Release()     
          EndIf
          
          surf\Release()
        EndIf
        
        dxsf\Release()
      EndIf
      
      dxtf\Release()
    EndIf
    
    ;CoUninitialize_() ; dosn't work with this ?!?
  EndIf
  
  If Success:ProcedureReturn result:EndIf
  ProcedureReturn #False
  DataSection
  CLSID_DXTransformFactory:
  Data.l $D1FE6762
  Data.w $FC48,$11D0
  Data.b $88,$3A,$3C,$8B,$00,$C1,$00,$00
  
  IID_IDXTransformFactory:
  Data.l $6A950B2B
  Data.w $A971,$11D1
  Data.b $81,$C8,$00,$00,$F8,$75,$57,$DB
  
  IID_IDXSurfaceFactory:
  Data.l $144946F5
  Data.w $C4D4,$11D1
  Data.b $81,$D1,$00,$00,$F8,$75,$57,$DB
  
  IID_IDXSurface:
  Data.l $B39FD73F
  Data.w $E139,$11D1
  Data.b $90,$65,$00,$C0,$4F,$D9,$18,$9D
  EndDataSection
EndProcedure




OpenWindow(1,0,0,640,480,"LoadImageEx test")

LoadImageEx(1,"C:\mouse.gif",32)


Repeat

StartDrawing(WindowOutput(1))
DrawImage(ImageID(1),0,0)
StopDrawing()


Until WindowEvent()=#PB_Event_CloseWindow
CatchSpriteEx:

Code: Alles auswählen

;CatchSpriteEx() can load bmp,dib,jpg,png,wmf and gif files (tif not correctly), so you don't need huge imageplugins to load these formats
;CatchSpriteEx() works only if Internet Explorer 4.x or later is installed

Interface nIDXSurfaceFactory
  QueryInterface(a, b)
  AddRef()
  Release()
  CreateSurface(a, b, c, d, e, f, g, h)
  CreateFromDDSurface(a, b, c, d, e, f)
  LoadImage(a.p-bstr, b, c, d, e, f)
  LoadImageFromStream(a, b, c, d, e, f)
  CopySurfaceToNewFormat(a, b, c, d, e)
  CreateD3DRMTexture(a, b, c, d, e)
  BitBlt(a, b, c, d, e)
EndInterface

#DXLOCKF_READ=0
#CLSCTX_INPROC_SERVER=1

Procedure _CreateStreamFromMem(Addr.l,Size.l)
mem=GlobalAlloc_(#GMEM_MOVEABLE,Size)
If mem
*ptr=GlobalLock_(mem)
If *ptr
CopyMemory(Addr,*ptr,Size)
CreateStreamOnHGlobal_(mem,#True,@Stream.IStream)
GlobalUnlock_(mem)
EndIf
If Stream=0:GlobalFree_(mem):EndIf
EndIf
ProcedureReturn Stream
EndProcedure


Procedure CatchSpriteEx(Sprite,Addr,Size,Flags=0)
  result=CoInitialize_(0)
  If result=#S_FALSE Or result=#S_OK
    
    CoCreateInstance_(?CLSID_DXTransformFactory,0,#CLSCTX_INPROC_SERVER,?IID_IDXTransformFactory,@dxtf.IDXTransformFactory)
    
    If dxtf
      dxtf\QueryService(?IID_IDXSurfaceFactory,?IID_IDXSurfaceFactory,@dxsf.nIDXSurfaceFactory)
      If dxsf
      
      Stream.IStream=_CreateStreamFromMem(Addr.l,Size.l)
      
      If Stream
      
        dxsf\LoadImageFromStream(Stream,0,0,0,?IID_IDXSurface,@surf.IDXSurface)
        If surf
          
          surf\LockSurfaceDC(0,#INFINITE,#DXLOCKF_READ,@lock.IDXDCLock)
          If lock
            DC=lock\GetDC()
            
            If DC
              GetClipBox_(DC,re.rect)
              
              If Sprite=#PB_Any
                result=CreateSprite(#PB_Any,re\right,re\bottom,Flags)
                Sprite=result
              Else
                result=CreateSprite(Sprite,re\right,re\bottom,Flags)
              EndIf
              
              If result
                
                DestDC=StartDrawing(SpriteOutput(Sprite))  
                If DestDC
                  Success=BitBlt_(DestDC,0,0,re\right,re\bottom,DC,0,0,#SRCCOPY)
                  StopDrawing()         
                EndIf
                
                If Success=#False:FreeSprite(Sprite):EndIf
              EndIf
            EndIf
            
            Lock\Release()     
          EndIf
          
          surf\Release()
        EndIf
        
        dxsf\Release()
      EndIf
      
      Stream\Release()
      EndIf
      
      dxtf\Release()
    EndIf
    
    ;CoUninitialize_() ; dosn't work with this ?!?
  EndIf
  
  If Success:ProcedureReturn result:EndIf
  ProcedureReturn #False
  DataSection
  CLSID_DXTransformFactory:
  Data.l $D1FE6762
  Data.w $FC48,$11D0
  Data.b $88,$3A,$3C,$8B,$00,$C1,$00,$00
  
  IID_IDXTransformFactory:
  Data.l $6A950B2B
  Data.w $A971,$11D1
  Data.b $81,$C8,$00,$00,$F8,$75,$57,$DB
  
  IID_IDXSurfaceFactory:
  Data.l $144946F5
  Data.w $C4D4,$11D1
  Data.b $81,$D1,$00,$00,$F8,$75,$57,$DB
  
  IID_IDXSurface:
  Data.l $B39FD73F
  Data.w $E139,$11D1
  Data.b $90,$65,$00,$C0,$4F,$D9,$18,$9D
  EndDataSection
EndProcedure



InitSprite()
OpenWindow(1,0,0,640,480,"CatchSpriteEx test")
OpenWindowedScreen(WindowID(1),0,0,640,480,0,0,0)

CatchSpriteEx(1,?img_begin,?img_end-?img_begin)

Repeat


DisplaySprite(1,0,0)
FlipBuffers()



Until WindowEvent()=#PB_Event_CloseWindow

DataSection
img_begin:
IncludeBinary "C:\mouse.gif"
img_end:
EndDataSection
CatchImageEx:

Code: Alles auswählen

;CatchImageEx() can load bmp,dib,jpg,png,wmf and gif files (tif not correctly), so you don't need huge imageplugins to load these formats
;CatchImageEx() works only if Internet Explorer 4.x or later is installed


Interface nIDXSurfaceFactory
  QueryInterface(a, b)
  AddRef()
  Release()
  CreateSurface(a, b, c, d, e, f, g, h)
  CreateFromDDSurface(a, b, c, d, e, f)
  LoadImage(a.p-bstr, b, c, d, e, f)
  LoadImageFromStream(a, b, c, d, e, f)
  CopySurfaceToNewFormat(a, b, c, d, e)
  CreateD3DRMTexture(a, b, c, d, e)
  BitBlt(a, b, c, d, e)
EndInterface

#DXLOCKF_READ=0
#CLSCTX_INPROC_SERVER=1

Procedure _CreateStreamFromMem(Addr.l,Size.l)
mem=GlobalAlloc_(#GMEM_MOVEABLE,Size)
If mem
*ptr=GlobalLock_(mem)
If *ptr
CopyMemory(Addr,*ptr,Size)
CreateStreamOnHGlobal_(mem,#True,@Stream.IStream)
GlobalUnlock_(mem)
EndIf
If Stream=0:GlobalFree_(mem):EndIf
EndIf
ProcedureReturn Stream
EndProcedure


Procedure CatchImageEx(Image,Addr,Size,Flags=0)
  result=CoInitialize_(0)
  If result=#S_FALSE Or result=#S_OK
    
    CoCreateInstance_(?CLSID_DXTransformFactory,0,#CLSCTX_INPROC_SERVER,?IID_IDXTransformFactory,@dxtf.IDXTransformFactory)
    
    If dxtf
      dxtf\QueryService(?IID_IDXSurfaceFactory,?IID_IDXSurfaceFactory,@dxsf.nIDXSurfaceFactory)
      If dxsf
      
      Stream.IStream=_CreateStreamFromMem(Addr.l,Size.l)
      
      If Stream
      
        dxsf\LoadImageFromStream(Stream,0,0,0,?IID_IDXSurface,@surf.IDXSurface)
        If surf
          
          surf\LockSurfaceDC(0,#INFINITE,#DXLOCKF_READ,@lock.IDXDCLock)
          If lock
            DC=lock\GetDC()
            
            If DC
              GetClipBox_(DC,re.rect)
              
              If Image=#PB_Any
                result=CreateImage(#PB_Any,re\right,re\bottom,Flags)
                Image=result
              Else
                result=CreateImage(Image,re\right,re\bottom,Flags)
              EndIf
              
              If result
                
                DestDC=StartDrawing(ImageOutput(Image))  
                If DestDC
                  Success=BitBlt_(DestDC,0,0,re\right,re\bottom,DC,0,0,#SRCCOPY)
                  StopDrawing()         
                EndIf
                
                If Success=#False:FreeImage(Image):EndIf
              EndIf
            EndIf
            
            Lock\Release()     
          EndIf
          
          surf\Release()
        EndIf
        
        dxsf\Release()
      EndIf
      
      Stream\Release()
      EndIf
      
      dxtf\Release()
    EndIf
    
    ;CoUninitialize_() ; dosn't work with this ?!?
  EndIf
  
  If Success:ProcedureReturn result:EndIf
  ProcedureReturn #False
  DataSection
  CLSID_DXTransformFactory:
  Data.l $D1FE6762
  Data.w $FC48,$11D0
  Data.b $88,$3A,$3C,$8B,$00,$C1,$00,$00
  
  IID_IDXTransformFactory:
  Data.l $6A950B2B
  Data.w $A971,$11D1
  Data.b $81,$C8,$00,$00,$F8,$75,$57,$DB
  
  IID_IDXSurfaceFactory:
  Data.l $144946F5
  Data.w $C4D4,$11D1
  Data.b $81,$D1,$00,$00,$F8,$75,$57,$DB
  
  IID_IDXSurface:
  Data.l $B39FD73F
  Data.w $E139,$11D1
  Data.b $90,$65,$00,$C0,$4F,$D9,$18,$9D
  EndDataSection
EndProcedure




OpenWindow(1,0,0,640,480,"CatchImageEx test")

CatchImageEx(1,?img_begin,?img_end-?img_begin,32)

Repeat

StartDrawing(WindowOutput(1))
DrawImage(ImageID(1),0,0)
StopDrawing()



Until WindowEvent()=#PB_Event_CloseWindow

DataSection
img_begin:
IncludeBinary "C:\mouse.gif"
img_end:
EndDataSection
Benutzeravatar
dige
Beiträge: 1235
Registriert: 08.09.2004 08:53

Beitrag von dige »

Klasse Stefan! :allright:
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

klasse leistung, jetzt fehlt nur noch ein SaveSpriteEx() ohne UseXImageEncoder() falls überhaupt möglich. :allright:

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Stefan
Beiträge: 125
Registriert: 29.08.2004 10:51
Kontaktdaten:

Beitrag von Stefan »

btw, hab ganz vergessen, zu sagen, dass man als filename auch eine URL verwenden kann :wink:
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Wieso zeigt es keine ICOs an? Sind das nicht eigentlich auch BMPs?

:?
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

Kann es sein das der Code nicht mit PB 4.20 geht? Ich bekomme bei mir auf jeden fall immer die Fehlermeldung das das Image object nicht initialisiert ist.

Gibt es auch eine möglichkeit eines SaveImageEX() ?
Antworten