Rotate & Mirror Image Simple -VectorLib based Module -All OS

Share your advanced PureBasic knowledge/code with the community.
User avatar
Saki
Addict
Addict
Posts: 830
Joined: Sun Apr 05, 2020 11:28 am
Location: Pandora

Rotate & Mirror Image Simple -VectorLib based Module -All OS

Post by Saki »

Rotate & Mirror Image Simple -VectorLib based Module -All OS

Images with transparence supported - Alpha blending adjustable

Image

A free rotate tool look here :
viewtopic.php?f=12&t=77028&p=568342#p568342

Code: Select all

DeclareModule RotateImageSimple
  EnableExplicit
  ; degree = 0 / -90 / 90 / 180  / 270 / Mirror h = -1 - v = -2
  ; This is a part of GFX_Wizzard_BF - By Saki
  ; This basic code can be used freely and also adapted as desired
  Declare RotateImageSimple_BF(degree, image_ID, alpha=255)
EndDeclareModule

Module RotateImageSimple
  
  Procedure Mirroring_V_BF(image_ID) ; PB573 - Mirroring on WinOS has a VectorLib Bug and is replaced
    Protected i, ii, iii
    If StartDrawing(ImageOutput(image_ID))
      Protected lines=ImageHeight(image_ID)
      Protected *buffer=DrawingBuffer()
      Protected pitch=DrawingBufferPitch()
      Protected *line_buffer_1=AllocateMemory(pitch)
      Protected *line_buffer_2=AllocateMemory(pitch)
      StopDrawing()
      ii=pitch*lines: lines>>1-1
      For i=0 To lines
        ii-pitch
        CopyMemory(*buffer+iii, *line_buffer_1, pitch)
        CopyMemory(*buffer+ii, *line_buffer_2, pitch)
        CopyMemory(*line_buffer_1, *buffer+ii, pitch)
        CopyMemory(*line_buffer_2, *buffer+iii, pitch)     
        iii+pitch
      Next i
      FreeMemory(*line_buffer_1)
      FreeMemory(*line_buffer_2)
    Else
      ProcedureReturn -4
    EndIf
    ProcedureReturn 1
  EndProcedure
  
  Procedure Mirroring_H_BF(image_ID) ; PB573 - Mirroring on WinOS has a VectorLib Bug and is replaced
    Protected i, ii
    Protected lines=ImageWidth(image_ID)
    Protected image_height=ImageHeight(image_ID)
    Protected line_buffer_1_ID, line_buffer_2_ID
    If StartDrawing(ImageOutput(image_ID))
      Protected pixel_format.a=DrawingBufferPixelFormat()
      If pixel_format.a=>32
        Protected image_32=#True
      EndIf
      ii=lines-1 : lines>>1-1
      For i=0 To lines
        line_buffer_1_ID=GrabDrawingImage(#PB_Any, i, 0, 1, image_height)
        If Not line_buffer_1_ID : StopDrawing() : ProcedureReturn -6 : EndIf
        line_buffer_2_ID=GrabDrawingImage(#PB_Any, ii, 0, 1, image_height)
        If Not line_buffer_2_ID
          StopDrawing()
          FreeImage(line_buffer_1_ID)
        EndIf
        If image_32
          DrawingMode(#PB_2DDrawing_AllChannels)
          Box(ii, 0, 1, image_height, 0)
          Box(i, 0, 1, image_height, 0)
          DrawAlphaImage(ImageID(line_buffer_1_ID), ii, 0)
          DrawAlphaImage(ImageID(line_buffer_2_ID), i, 0)
        Else
          DrawImage(ImageID(line_buffer_1_ID), ii, 0)
          DrawImage(ImageID(line_buffer_2_ID), i, 0)
        EndIf
        FreeImage(line_buffer_1_ID)
        FreeImage(line_buffer_2_ID)
        ii-1
      Next i
      StopDrawing()
    Else
      ProcedureReturn -4
    EndIf
    ProcedureReturn 1
  EndProcedure
  
  Procedure RotateImageSimple_BF(degree, image_ID, alpha=255)
    
    If Not IsImage(image_ID) : ProcedureReturn -6 : EndIf
    
    If StartDrawing(ImageOutput(image_ID)) ; Get the Pixel format
      Define pixel_format.a=DrawingBufferPixelFormat()
      If pixel_format.a=>32
        Protected alpha_image=#True
      EndIf
      StopDrawing()
    EndIf
    
    If alpha<>255 And Not alpha_image : alpha=255 : EndIf
    
    If Abs(degree)<>90 And degree<>180 And degree<>270 And degree<>-1 And degree<>-2 : degree=0 : EndIf
    
    Protected image_width=ImageWidth(image_ID), image_height=ImageHeight(image_ID)
    
    If degree=-1 Or degree=-2
      If image_width>image_height
        Protected enlarge_temp_image=image_width
      Else
        enlarge_temp_image=image_height
      EndIf
    Else
      Protected enlarge=3 
      If image_width>image_height
        enlarge_temp_image=image_width+enlarge
      Else
        enlarge_temp_image=image_height+enlarge
      EndIf
    EndIf
    
    enlarge-Bool(#PB_Compiler_OS<>#PB_OS_Windows)
    
    If alpha_image
      If (Abs(degree)=90 Or degree=270) And Not (degree=-1 Or degree=-2)
        Protected new_image_ID=CreateImage(#PB_Any, image_height, image_width, 32, #PB_Image_Transparent)
      Else
        new_image_ID=CreateImage(#PB_Any, image_width, image_height, 32, #PB_Image_Transparent)
      EndIf
      Protected temp_image_ID=CreateImage(#PB_Any, enlarge_temp_image, enlarge_temp_image, 32, #PB_Image_Transparent)
    Else
      If (Abs(degree)=90 Or degree=270) And Not (degree=-1 Or degree=-2)
        new_image_ID=CreateImage(#PB_Any, image_height, image_width)
      Else
        new_image_ID=CreateImage(#PB_Any, image_width, image_height)
      EndIf
      temp_image_ID=CreateImage(#PB_Any, enlarge_temp_image, enlarge_temp_image)
    EndIf
    If Not new_image_ID : ProcedureReturn -6 : EndIf
    If Not temp_image_ID : FreeImage(temp_image_ID) : ProcedureReturn -6 : EndIf
    
    If Not StartDrawing(ImageOutput(temp_image_ID))
      FreeImage(new_image_ID) : FreeImage(temp_image_ID)
      ProcedureReturn -4
    EndIf
    
    DrawAlphaImage(ImageID(image_ID), 1, 1)
    StopDrawing()
    
    If Not StartVectorDrawing(ImageVectorOutput(new_image_ID))
      FreeImage(new_image_ID) : FreeImage(temp_image_ID)
      ProcedureReturn -4
    EndIf
    
    Macro macro_case
      ; CompilerIf #PB_Compiler_OS<>#PB_OS_Windows
      ; Case -1
      ;   FlipCoordinatesX(VectorOutputWidth()/2)
      ;   MovePathCursor(-1, -1)
      ; Case -2
      ;   FlipCoordinatesY(VectorOutputHeight()/2)
      ;   MovePathCursor(-1, -1)
      ; CompilerElse
    Case -1 ; Very faster as the Vector Lib
      MovePathCursor(0, 0)
      DrawVectorImage(ImageID(image_ID), alpha)
      Protected result=Mirroring_H_BF(new_image_ID)
      If result<1 : FreeImage(new_image_ID) : FreeImage(temp_image_ID) : ProcedureReturn result : EndIf
    Case -2 ; Faster as the Vector Lib
      MovePathCursor(0, 0)
      DrawVectorImage(ImageID(image_ID), alpha)
      result=Mirroring_V_BF(new_image_ID)
      If result<1 : FreeImage(new_image_ID) : FreeImage(temp_image_ID) : ProcedureReturn result : EndIf
      ; CompilerEndIf
    EndMacro
    
    Select degree
      Case 0
        MovePathCursor(-1, -1)
      Case -90, 270
        RotateCoordinates(ImageWidth(temp_image_ID), ImageHeight(temp_image_ID), 270)
        If image_height>image_width
          MovePathCursor(ImageWidth(temp_image_ID)+(image_height-image_width)+enlarge, -1)
        Else
          MovePathCursor(ImageWidth(temp_image_ID)+enlarge, -1)
        EndIf
      Case 90
        RotateCoordinates(ImageWidth(temp_image_ID), ImageHeight(temp_image_ID), 90)
        If image_height>image_width
          MovePathCursor(-1, ImageHeight(temp_image_ID)+enlarge)
        Else
          MovePathCursor(-1, ImageWidth(temp_image_ID)+image_width-image_height+enlarge)
        EndIf
      Case 180
        RotateCoordinates(ImageWidth(temp_image_ID), ImageHeight(temp_image_ID), 180)
        If image_height>image_width
          MovePathCursor(ImageWidth(temp_image_ID)+image_height-image_width+enlarge, ImageWidth(temp_image_ID)+enlarge)
        Else
          MovePathCursor(ImageWidth(temp_image_ID)+enlarge, ImageWidth(temp_image_ID)+image_width-image_height+enlarge)
        EndIf
        macro_case
    EndSelect
    
    DrawVectorImage(ImageID(temp_image_ID), alpha)
    StopVectorDrawing()
    FreeImage(temp_image_ID)
    ProcedureReturn new_image_ID
  EndProcedure
  
EndModule
UseModule RotateImageSimple

CompilerIf #PB_Compiler_IsMainFile
  
  ; ###### Get the result ######
  EnableExplicit
  
  UsePNGImageDecoder() : UseJPEGImageDecoder() : UseTIFFImageDecoder() : UseGIFImageDecoder()
  
  Define window_ID=OpenWindow(#PB_Any, 0, 0, 1200, 800, "Rotate and Mirror",
                              #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget)
  SetWindowColor(window_ID, #Green)
  Define canvas_ID=CanvasGadget(#PB_Any, 10, 50, WindowWidth(window_ID)-20, WindowHeight(window_ID)-60)
  SetGadgetColor(canvas_ID, #PB_Gadget_BackColor, $909090)
  Define box_width=260
  Define box_height=290
  Define image_ID=CreateImage(#PB_Any, box_width, box_height, 24, #White)
  StartDrawing(ImageOutput(image_ID))
  DrawingMode(#PB_2DDrawing_Outlined)
  BackColor(#White)
  DrawText(20, 20, " Top left ", #Black)
  Box(0, 0, box_width, box_height, #Red)
  StopDrawing()
  
  ButtonGadget(1,10,10,55,25," 0 ")
  ButtonGadget(2,70,10,55,25,"-90")
  ButtonGadget(3,130,10,55,25," 90")
  ButtonGadget(4,190,10,55,25,"180")
  ButtonGadget(5,250,10,55,25,"270")
  ButtonGadget(6,310,10,55,25," H ")
  ButtonGadget(7,370,10,55,25," V ")
  ButtonGadget(8,430,10,120,25," Load a image ")
  
  Macro Macro_draw_image
    ResizeGadget(canvas_ID, #PB_Ignore, #PB_Ignore, WindowWidth(window_ID)-20,  WindowHeight(window_ID)-60)
    If StartDrawing(CanvasOutput(canvas_ID))
      If IsImage(image_1_ID)
        Box(0, 0, WindowWidth(window_ID), WindowHeight(window_ID), $909090)
        DrawAlphaImage(ImageID(image_1_ID),
                       GadgetWidth(canvas_ID)/2-ImageWidth(image_1_ID)/2,
                       GadgetHeight(canvas_ID)/2-ImageHeight(image_1_ID)/2)
      EndIf
      StopDrawing()
    EndIf
  EndMacro
  
  SetGadgetColor(canvas_ID, #PB_Gadget_BackColor, $909090)
  Define image_1_ID=RotateImageSimple_BF(0, image_ID, 255) ; degree = 0 / -90 / 90 / 180  / 270 / Mirror h = -1 - v = -2
  Macro_draw_image
  
  Repeat
    Define Event=WaitWindowEvent()
    
    If Event=#PB_Event_SizeWindow
      Macro_draw_image
    EndIf
    
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Define image_1_ID=RotateImageSimple_BF(0, image_ID, 255)
            Macro_draw_image
          Case 2
            image_1_ID=RotateImageSimple_BF(-90, image_ID, 255)
            Macro_draw_image
          Case 3
            image_1_ID=RotateImageSimple_BF(90, image_ID, 255)
            Macro_draw_image
          Case 4
            image_1_ID=RotateImageSimple_BF(180, image_ID, 255)
            Macro_draw_image
          Case 5
            image_1_ID=RotateImageSimple_BF(270, image_ID, 255)
            Macro_draw_image
          Case 6
            image_1_ID=RotateImageSimple_BF(-1, image_ID, 255)
            Macro_draw_image
          Case 7
            image_1_ID=RotateImageSimple_BF(-2, image_ID, 255)
            Macro_draw_image
          Case 8
            Define path$=OpenFileRequester("Load a Image", "", "", 0)
            If FileSize(path$)>0
              FreeImage(image_ID)
              image_ID=LoadImage(#PB_Any, path$)
              Define image_1_ID=RotateImageSimple_BF(0, image_ID, 255)
              Macro_draw_image
              StopDrawing()
            EndIf
        EndSelect
        
    EndSelect
  Until Event = #PB_Event_CloseWindow
  
CompilerEndIf
Last edited by Saki on Mon Apr 05, 2021 6:13 pm, edited 17 times in total.
地球上の平和
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5342
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Rotate Image Simple - Vector Lib based - All OS

Post by Kwai chang caine »

Works nice here :D
Thanks for sharing 8)
ImageThe happiness is a road...
Not a destination
Mesa
Enthusiast
Enthusiast
Posts: 345
Joined: Fri Feb 24, 2012 10:19 am

Re: Rotate Image Simple - Vector Lib based - All OS

Post by Mesa »

I've got a bug with 0°, an offset of 1 pixel.

Code: Select all

; EnableExplicit 

UsePNGImageDecoder() : UseJPEGImageDecoder() : UseTIFFImageDecoder() : UseGIFImageDecoder() 

; degree = 0 / -90 / 90 / 180 / 270 
Procedure RotateImageSimple_BF(degree, image_ID, alpha_image=0, alpha=255) 
	; This is a part of GFX_Wizzard_BF - By Saki 
	; This basic code can be used freely and also adapted as desired 
	
	If alpha<>255 And Not alpha_image : alpha=255 : EndIf 
	
	If Abs(degree)<>90 And degree<>180 And degree<>270 : degree=0 : EndIf 
	
	If Not IsImage(image_ID) : ProcedureReturn -6 : EndIf 
	Protected image_width=ImageWidth(image_ID), image_height=ImageHeight(image_ID) 
	
	If alpha_image 
		If (Abs(degree)=90 Or degree=270) And Not (degree=-1 Or degree=-2) 
			Protected new_image_ID=CreateImage(#PB_Any, image_height, image_width, 32, #PB_Image_Transparent) 
		Else 
			new_image_ID=CreateImage(#PB_Any, image_width, image_height, 32, #PB_Image_Transparent) 
		EndIf 
		If image_width>image_height 
			Protected temp_image_ID=CreateImage(#PB_Any, image_width+3, image_width+3, 32, #PB_Image_Transparent) 
		Else 
			temp_image_ID=CreateImage(#PB_Any, image_height+3, image_height+3, 32, #PB_Image_Transparent) 
		EndIf 
	Else 
		If (Abs(degree)=90 Or degree=270) And Not (degree=-1 Or degree=-2) 
			new_image_ID=CreateImage(#PB_Any, image_height, image_width) 
		Else 
			new_image_ID=CreateImage(#PB_Any, image_width, image_height) 
		EndIf 
		If image_width>image_height  
			temp_image_ID=CreateImage(#PB_Any, image_width+3, image_width+3) 
		Else 
			temp_image_ID=CreateImage(#PB_Any, image_height+3, image_height+3) 
		EndIf 
	EndIf 
	If Not new_image_ID : ProcedureReturn -6 : EndIf 
	If Not temp_image_ID : FreeImage(temp_image_ID) : ProcedureReturn -6 : EndIf 
	
	If Not StartDrawing(ImageOutput(temp_image_ID)) 
		FreeImage(new_image_ID) : FreeImage(temp_image_ID) 
		ProcedureReturn -4 
	EndIf 
	DrawAlphaImage(ImageID(image_ID), 1, 1) 
	StopDrawing() 
	
	If Not StartVectorDrawing(ImageVectorOutput(new_image_ID)) 
		FreeImage(new_image_ID) : FreeImage(temp_image_ID) 
		ProcedureReturn -4 
	EndIf 
	Select degree 
		Case -90, 270 
			RotateCoordinates(ImageWidth(temp_image_ID), ImageHeight(temp_image_ID), 270) 
			CompilerIf #PB_Compiler_OS=#PB_OS_Windows 
				If image_height>image_width 
					MovePathCursor(ImageWidth(temp_image_ID)+(image_height-image_width)+3, -1) 
				Else 
					MovePathCursor(ImageWidth(temp_image_ID)+3, -1) 
				EndIf 
			CompilerElse 
				If image_height>image_width 
					MovePathCursor(ImageWidth(temp_image_ID)+(image_height-image_width)+2, -1) 
				Else 
					MovePathCursor(ImageWidth(temp_image_ID)+2, -1) 
				EndIf 
			CompilerEndIf 
		Case 90 
			RotateCoordinates(ImageWidth(temp_image_ID), ImageHeight(temp_image_ID), 90) 
			CompilerIf #PB_Compiler_OS=#PB_OS_Windows 
				If image_height>image_width 
					MovePathCursor(-1, ImageHeight(temp_image_ID)+3) 
				Else 
					MovePathCursor(-1, ImageWidth(temp_image_ID)+image_width-image_height+3) 
				EndIf 
			CompilerElse 
				If image_height>image_width 
					MovePathCursor(-1, ImageHeight(temp_image_ID)+2) 
				Else 
					MovePathCursor(-1, ImageWidth(temp_image_ID)+image_width-image_height+2) 
				EndIf 
			CompilerEndIf 
		Case 180  
			RotateCoordinates(ImageWidth(temp_image_ID), ImageHeight(temp_image_ID), 180) 
			CompilerIf #PB_Compiler_OS=#PB_OS_Windows 
				If image_height>image_width 
					MovePathCursor(ImageWidth(temp_image_ID)+image_height-image_width+3, ImageWidth(temp_image_ID)+3) 
				Else 
					MovePathCursor(ImageWidth(temp_image_ID)+3, ImageWidth(temp_image_ID)+image_width-image_height+3) 
				EndIf 
			CompilerElse 
				If image_height>image_width 
					MovePathCursor(ImageWidth(temp_image_ID)+image_height-image_width+2, ImageWidth(temp_image_ID)+2) 
				Else 
					MovePathCursor(ImageWidth(temp_image_ID)+2, ImageWidth(temp_image_ID)+image_width-image_height+2) 
				EndIf 
			CompilerEndIf 
	EndSelect 
	DrawVectorImage(ImageID(temp_image_ID), alpha) 
	StopVectorDrawing() 
	FreeImage(temp_image_ID) 
	ProcedureReturn new_image_ID 
EndProcedure 

; ###### Get the result ###### 
Define window_ID=OpenWindow(#PB_Any, 0, 0, 800, 600, "Rotate", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
SetWindowColor(window_ID, #Green) 
Define canvas_ID=CanvasGadget(#PB_Any, 10, 50, WindowWidth(window_ID)-20, WindowHeight(window_ID)-60) 
SetGadgetColor(canvas_ID, #PB_Gadget_BackColor, $909090) 
Define box_width=150 
Define box_height=250 
Define image_ID=CreateImage(#PB_Any, box_width, box_height, 24, #White) 
StartDrawing(ImageOutput(image_ID)) 
DrawingMode(#PB_2DDrawing_Outlined) 
BackColor(#White) 
DrawText(20, 20, " Top left ", #Black) 
Box(0, 0, box_width, box_height, #Red) 
StopDrawing() 

ButtonGadget(1,10,10,30,25,"0°")
ButtonGadget(2,50,10,30,25,"-90°")
ButtonGadget(3,90,10,30,25,"90°")
ButtonGadget(4,130,10,30,25,"180°")
ButtonGadget(5,170,10,30,25,"270°")

; Define image_ID=LoadImage(#PB_Any, "./Image_Set/Frame_Test_1.png") 
; ResizeImage(image_ID, ImageWidth(image_ID)/3, ImageHeight(image_ID)/3) 

Define image_1_ID=RotateImageSimple_BF(0, image_ID, 0, 255) ; degree = 0 / -90 / 90 / 180 / 270 

If StartDrawing(CanvasOutput(canvas_ID)) 
	If IsImage(image_1_ID) 
		DrawAlphaImage(ImageID(image_1_ID), 250, 100) 
	EndIf 
	StopDrawing() 
EndIf 

Repeat
	Event = WaitWindowEvent()
	
	Select Event
			
		Case #PB_Event_Gadget
			Select EventGadget()
				Case 1 
					SetGadgetColor(canvas_ID, #PB_Gadget_BackColor, $909090)
					image_1_ID=RotateImageSimple_BF(0, image_ID, 0, 255) ; degree = 0 / -90 / 90 / 180 / 270 
					If StartDrawing(CanvasOutput(canvas_ID)) 
						If IsImage(image_1_ID) 
							DrawAlphaImage(ImageID(image_1_ID), 250, 100) 
						EndIf 
						StopDrawing() 
					EndIf 
					
				Case 2 
					SetGadgetColor(canvas_ID, #PB_Gadget_BackColor, $909090)
					image_1_ID=RotateImageSimple_BF(-90, image_ID, 0, 255) ; degree = 0 / -90 / 90 / 180 / 270 
					
					If StartDrawing(CanvasOutput(canvas_ID)) 
						If IsImage(image_1_ID) 
							DrawAlphaImage(ImageID(image_1_ID), 250, 100) 
						EndIf 
						StopDrawing() 
					EndIf
					
				Case 3 
					SetGadgetColor(canvas_ID, #PB_Gadget_BackColor, $909090)
					image_1_ID=RotateImageSimple_BF(90, image_ID, 0, 255) ; degree = 0 / -90 / 90 / 180 / 270 
					
					If StartDrawing(CanvasOutput(canvas_ID)) 
						If IsImage(image_1_ID) 
							DrawAlphaImage(ImageID(image_1_ID), 250, 100) 
						EndIf 
						StopDrawing() 
					EndIf
				Case 4 
					SetGadgetColor(canvas_ID, #PB_Gadget_BackColor, $909090)
					image_1_ID=RotateImageSimple_BF(180, image_ID, 0, 255) ; degree = 0 / -90 / 90 / 180 / 270 
					
					If StartDrawing(CanvasOutput(canvas_ID)) 
						If IsImage(image_1_ID) 
							DrawAlphaImage(ImageID(image_1_ID), 250, 100) 
						EndIf 
						StopDrawing() 
					EndIf
					
				Case 5 
					SetGadgetColor(canvas_ID, #PB_Gadget_BackColor, $909090)
					image_1_ID=RotateImageSimple_BF(270, image_ID, 0, 255) ; degree = 0 / -90 / 90 / 180 / 270 
					
					If StartDrawing(CanvasOutput(canvas_ID)) 
						If IsImage(image_1_ID) 
							DrawAlphaImage(ImageID(image_1_ID), 250, 100) 
						EndIf 
						StopDrawing() 
					EndIf
			EndSelect
			
	EndSelect
Until Event = #PB_Event_CloseWindow

M.
User avatar
Saki
Addict
Addict
Posts: 830
Joined: Sun Apr 05, 2020 11:28 am
Location: Pandora

Re: Rotate Image Simple - Vector Lib based - All OS

Post by Saki »

Code updated and enhanced

Fixes
Mirroring added

Many thanks Kwai and Mesa for testing.

@Mesa
I have now put your enhanced code as main code in the first post.
The buttons were very helpful for bug fixing.
Please remove the buggy code above again, so that people do not use it accidentally.

Best Regards Saki
地球上の平和
User avatar
Lord
Addict
Addict
Posts: 847
Joined: Tue May 26, 2009 2:11 pm

Re: Rotate Image Simple - Vector Lib based - All OS

Post by Lord »

Saki wrote:...
@Mesa
...
Please remove the buggy code above again, so that people do not use it accidentally.
...
Please don't do that.
Now everybody can compare both codes and learn what was wrong.
Image
User avatar
Saki
Addict
Addict
Posts: 830
Joined: Sun Apr 05, 2020 11:28 am
Location: Pandora

Re: Rotate & Mirror Image Simple -VectorLib based Module -Al

Post by Saki »

Code updated and enhanced

Image
地球上の平和
User avatar
Saki
Addict
Addict
Posts: 830
Joined: Sun Apr 05, 2020 11:28 am
Location: Pandora

Re: Rotate & Mirror Image Simple -VectorLib based Module -Al

Post by Saki »

Code updated and enhanced

Fix regression bug
File selector added
code optimized and cleaned

The Code is now final
地球上の平和
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5342
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Rotate & Mirror Image Simple -VectorLib based Module -Al

Post by Kwai chang caine »

Works always for me here :D
Thanks for sharing 8)
ImageThe happiness is a road...
Not a destination
Post Reply