Seite 1 von 1

LoadSpriteEx()

Verfasst: 26.02.2007 21:09
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

Verfasst: 26.02.2007 21:29
von Fluid Byte
Wusste gar nicht das DX eigene Dekoder für sowas hat.

Kool! Bild

Verfasst: 27.02.2007 12:56
von dige
@Stefan: vielen Dank! Kann man das auch für CatchImage bzw.
CatchSprite verwenden?

Verfasst: 27.02.2007 21:30
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

Verfasst: 27.02.2007 21:34
von dige
Klasse Stefan! :allright:

Verfasst: 02.03.2007 08:31
von nco2k
klasse leistung, jetzt fehlt nur noch ein SaveSpriteEx() ohne UseXImageEncoder() falls überhaupt möglich. :allright:

c ya,
nco2k

Verfasst: 10.03.2007 19:43
von Stefan
btw, hab ganz vergessen, zu sagen, dass man als filename auch eine URL verwenden kann :wink:

Verfasst: 17.05.2007 13:00
von Xaby
Wieso zeigt es keine ICOs an? Sind das nicht eigentlich auch BMPs?

:?

Verfasst: 08.11.2008 15:39
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() ?