DrawRotatedText()

Share your advanced PureBasic knowledge/code with the community.
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8451
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

DrawRotatedText()

Post by netmaestro »

Just a bit of fun. ESC or rightclick to close.

Code: Select all

Global x=300, y=500, dist=400 
Global text$ = "Purebasic" 
LoadFont(0,"Courier New", 60, #PB_Font_Bold|#PB_Font_HighQuality) 

Procedure PlotCharacter(char$, angle.d, charangle.d, color) 
  p1 = x+dist*Cos(angle*#PI/180) 
  p2 = y+dist*Sin(angle*#PI/180) 
  DrawRotatedText(p1,p2,char$,charangle,color) 
EndProcedure 

CreateImage(0,600,600) 
StartDrawing(ImageOutput(0)) 
  Box(0,0,600,600,0) 
  DrawingFont(FontID(0))    
  
  angle.d = 235 : charangle.d = 31.3 
  For i=1 To 9 
    PlotCharacter(Mid(text$,i,1), angle, charangle, #Black) 
    angle+8 : charangle-8 
  Next 
  dist+5 
  angle.d = 234 : charangle.d = 32.3 
  
  DrawingMode(#PB_2DDrawing_Gradient) 
  GradientColor(0.0, #Red) 
  GradientColor(0.1, #Blue) 
  GradientColor(0.9, #Green)    
  GradientColor(1.0, #Red) 
  ConicalGradient(x, y, 90) 
  
  For i=1 To 9 
    PlotCharacter(Mid(text$,i,1), angle, charangle, #Red) 
    angle+8 : charangle-8 
  Next 

  *buffer = DrawingBuffer() 
  *loc.RGBQUAD = *buffer 
  While *loc <= *buffer + DrawingBufferPitch()*OutputHeight() - SizeOf(RGBQUAD) 
    If *loc\rgbBlue = 5 And *loc\rgbGreen = 5 And *loc\rgbRed = 5 
      *loc\rgbReserved = 0 
    EndIf 
    *loc+SizeOf(RGBQUAD) 
  Wend 

StopDrawing() 

OpenWindow(0,0,0,600,600,"",#PB_Window_ScreenCentered|#PB_Window_BorderLess|#PB_Window_Invisible)
SetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE, GetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE)|#WS_EX_LAYERED)
SetLayeredWindowAttributes_(WindowID(0),0,255,#LWA_COLORKEY)

ImageGadget(0,0,0,0,0,ImageID(0)) 
HideWindow(0,0)

Repeat 
  ev=WaitWindowEvent()
  Select ev
    Case #PB_Event_Gadget
      SendMessage_(WindowID(0),#WM_NCLBUTTONDOWN,#HTCAPTION,0)
    Case #WM_RBUTTONDOWN
      End
  EndSelect
    
Until GetAsyncKeyState_(#VK_ESCAPE) & 32768
Last edited by netmaestro on Wed Jan 27, 2010 3:27 am, edited 1 time in total.
BERESHEIT
User avatar
Demivec
Addict
Addict
Posts: 4270
Joined: Mon Jul 25, 2005 3:51 pm
Location: Utah, USA

Post by Demivec »

Nice!
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Post by eddy »

You can improve your code with the new PB drawing mode... look :D
Realy cool !

version 2 with AlphaChannel

Code: Select all

Global x=300, y=500, dist=400
Global text$ = "Purebasic"
LoadFont(0,"Courier New", 60, #PB_Font_Bold|#PB_Font_HighQuality)

Procedure PlotCharacter(char$, angle.d, charangle.d, color)
   p1 = x+dist*Cos(angle*#PI/180)
   p2 = y+dist*Sin(angle*#PI/180)
   DrawRotatedText(p1,p2,char$,charangle,color)
EndProcedure

CreateImage(0,600,600)
StartDrawing(ImageOutput(0))
   Box(0,0,600,600,RGB(5,5,5))
   DrawingFont(FontID(0))
   
   ;text shadow
   angle.d = 235 : charangle.d = 31.3
   For i=1 To 9
      PlotCharacter(Mid(text$,i,1), angle, charangle, #Black)
      angle+8 : charangle-8
   Next
   dist+5
   angle.d = 234 : charangle.d = 32.3
   
   ;text colors
   DrawingMode(#PB_2DDrawing_Gradient)
   GradientColor(0.0, #Red)
   GradientColor(0.1, #Blue)
   GradientColor(0.9, #Green)
   GradientColor(1.0, #Red)
   ConicalGradient(x, y, 90)
   For i=1 To 9
      PlotCharacter(Mid(text$,i,1), angle, charangle, #Red)
      angle+8 : charangle-8
   Next
   
   ;text transparency
   DrawingMode(#PB_2DDrawing_AlphaChannel)
   For j=0 To OutputHeight()-1
      For i=0 To OutputWidth()-1
         If Point(i,j)=RGBA(5,5,5,255)
            Plot(i,j,RGBA(0,0,0,0))
         EndIf
      Next
   Next 

StopDrawing()

OpenWindow(0,0,0,600,600,"",#PB_Window_ScreenCentered|#PB_Window_BorderLess|#PB_Window_Invisible)
SetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE, GetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE)|#WS_EX_LAYERED)
SetLayeredWindowAttributes_(WindowID(0),GetSysColor_(#COLOR_BTNFACE),255,#LWA_COLORKEY)

ImageGadget(0,0,0,0,0,ImageID(0))
HideWindow(0,#False)

Repeat
   ev=WaitWindowEvent()
   Select ev
      Case #PB_Event_Gadget
         SendMessage_(WindowID(0),#WM_NCLBUTTONDOWN,#HTCAPTION,0)
      Case #WM_RBUTTONDOWN
         End
   EndSelect
   
Until GetAsyncKeyState_(#VK_ESCAPE) & 32768
Last edited by eddy on Sat Aug 15, 2009 2:34 am, edited 1 time in total.
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Post by eddy »

version 3 with AlphaBlend

Code: Select all

Global x=300, y=500, dist=400
Global text$="Purebasic"
Global winMaskColor=RGB(5, 5, 5)
LoadFont(0, "Courier New", 60, #PB_Font_Bold | #PB_Font_HighQuality)

Procedure PlotCharacter(char$, angle.d, charangle.d, color=#White)
   p1=x+dist*Cos(angle*#PI/180)
   p2=y+dist*Sin(angle*#PI/180)
   DrawRotatedText(p1, p2, char$, charangle, color)
EndProcedure

CreateImage(0, 600, 600)
StartDrawing(ImageOutput(0))
   DrawingFont(FontID(0))
   
   ;set transparency 
   DrawingMode(#PB_2DDrawing_AlphaChannel)
   Box(0, 0, 600, 600, RGBA(0, 0, 0, 0))
   
   ;text shadow
   DrawingMode(#PB_2DDrawing_Default | #PB_2DDrawing_AlphaBlend)
   angle.d=235 : charangle.d=31.3
   For i=1 To 9
      PlotCharacter(Mid(text$, i, 1), angle, charangle, RGBA(0, 0, 0, 255))
      angle+8 : charangle-8
   Next
   dist+5
   angle.d=234 : charangle.d=32.3
   
   ;text colors
   DrawingMode(#PB_2DDrawing_Gradient | #PB_2DDrawing_AlphaBlend)
   GradientColor(0.0, RGBA(255, 0, 0, 255))
   GradientColor(0.1, RGBA(0, 0, 255, 255))
   GradientColor(0.9, RGBA(0, 255, 0, 255))
   GradientColor(1.0, RGBA(255, 0, 0, 255))
   ConicalGradient(x, y, 90)
   For i=1 To 9
      PlotCharacter(Mid(text$, i, 1), angle, charangle)
      angle+8 : charangle-8
   Next
StopDrawing()

win=OpenWindow(0, 0, 0, 600, 600, "", #PB_Window_ScreenCentered | #PB_Window_BorderLess | #PB_Window_Invisible)
SetWindowColor(0, winMaskColor)
SetWindowLongPtr_(win, #GWL_EXSTYLE, GetWindowLongPtr_(win, #GWL_EXSTYLE) | #WS_EX_LAYERED)
SetLayeredWindowAttributes_(win, winMaskColor, 255, #LWA_COLORKEY)

ImageGadget(0, 0, 0, 0, 0, ImageID(0))
HideWindow(0, #False)

Repeat
   ev=WaitWindowEvent()
   Select ev
      Case #PB_Event_Gadget
         SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
      Case #WM_RBUTTONDOWN
         End
   EndSelect
Until GetAsyncKeyState_(#VK_ESCAPE) & 32768
Last edited by eddy on Sat Aug 15, 2009 3:17 am, edited 3 times in total.
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8451
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Post by netmaestro »

I use the structured pointer because it's nearly twice as fast as point/plot.

Your alphablend version is showing a black window (not transparent)
BERESHEIT
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Post by eddy »

netmaestro wrote:I use the structured pointer because it's nearly twice as fast as point/plot.
True
Your alphablend version is showing a black window (not transparent)
Weird... It works with my screen resolution 1024x768x32.
Do you use a 16 or 24 bits color depth ?

I updated the AlphaBlend version : I changed the winMaskColor value (0,0,255).
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8451
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Post by netmaestro »

I'm on WinXP sp3 using pb x86 32bits screen depth.

Now your window is blue.
BERESHEIT
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Post by eddy »

I posted a new version with a black winMaskColor.
lol ... I got no clue whats wrong.
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8451
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Re: DrawRotatedText()

Post by netmaestro »

Small update to work right with 4.41 RC1.
BERESHEIT
Foz
Addict
Addict
Posts: 1359
Joined: Tue Nov 13, 2007 12:42 pm
Location: Manchester, UK

Re: DrawRotatedText()

Post by Foz »

Interesting...

If I change the winMaskColor to:

Code: Select all

Global winMaskColor=RGBA(5, 5, 5, 1)
then it's a transparent background.

However, if I change it to

Code: Select all

Global winMaskColor=RGBA(5, 5, 5, 0)
then I get a black background.

Windows XP SP3, PB 4.40.

Is this a bug?
Post Reply