November 30, 2020, 02:11:24 AM

Author Topic: [bmx] Pixmap text panel by Jur [ 1+ years ago ]  (Read 595 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] Pixmap text panel by Jur [ 1+ years ago ]
« on: June 29, 2017, 12:28:42 AM »
Title : Pixmap text panel
Author : Jur
Posted : 1+ years ago

Description : A proxy gadget panel with text on pixmap

Code :
Code: BlitzMax
  1. SuperStrict
  2. Import MaxGui.Drivers
  3. Import MaxGUI.ProxyGadgets
  4.  
  5.  
  6. 'rem
  7. 'DEMO
  8.  
  9. Local window:TGadget = CreateWindow( "Window",100, 100, 250, 250, Null, WINDOW_TITLEBAR|WINDOW_CLIENTCOORDS|WINDOW_RESIZABLE )
  10. Local group:TGadget = CreatePanel(10,10,200,200,window,PANEL_GROUP,"Group Label")
  11.  
  12.  
  13. Local Font:TImageFont = TImageFont.CreateDefault()
  14. Local fontHeight:Int = ImageFontHeight(Font)   'because "Height" method doesnt give correct height
  15. Local PixmapTextPanel:TPixmapTextPanel = New TPixmapTextPanel.Make("Test", 10,30,70,fontHeight,group,PANEL_ACTIVE,Font)
  16. SetGadgetColor(PixmapTextPanel, 255,255,0)
  17.  
  18.  
  19. Repeat
  20.         WaitEvent()
  21.         Print CurrentEvent.ToString()
  22.         Select EventID()
  23.                 Case EVENT_WINDOWCLOSE, EVENT_APPTERMINATE
  24.                         End
  25.                 Case EVENT_MOUSEDOWN
  26.                         If EventSource()=PixmapTextPanel Then
  27.                                 Print "PixmapTextPanel clicked"
  28.                         EndIf
  29.                        
  30.         End Select
  31. Forever
  32.  
  33. 'endrem
  34.  
  35.  
  36.  
  37. Type TPixmapTextPanel Extends TProxyGadget
  38.         Field Panel:TGadget
  39.         Field text:String
  40.         Field font:TImageFont
  41.         Field R:Int,G:Int,B:Int   'text color
  42.        
  43.        
  44.         Method Make:TPixmapTextPanel(_text:String, x:Int, y:Int, w:Int, h:Int, Group:TGadget, style:Int, _font:TImageFont)
  45.                
  46.                 Panel = CreatePanel(x,y,w,h,Group,style)
  47.                 SetProxy(Panel)
  48.                 font = _font
  49.                 SetText(_text)
  50.  
  51.                 Return Self
  52.         EndMethod
  53.        
  54.        
  55.         Method SetTextColor(_R:Int,_G:Int,_B:Int)
  56.                 R=_R ; G=_G ; B=_B
  57.                 SetGadgetPixmap(Panel, MakeTextPixmap())
  58.         EndMethod
  59.        
  60.        
  61.         Method SetText(_text:String)
  62.                 text = _text
  63.                 If ImageFontTextWidth(text,font)>GadgetWidth(Panel) Then
  64.                         text = ImageFontCutTextToWidth(text, GadgetWidth(Panel), font)
  65.                         text:+".."
  66.                 EndIf
  67.                 SetGadgetPixmap(Panel, MakeTextPixmap())
  68.         EndMethod
  69.        
  70.        
  71.         Method MakeTextPixmap:TPixmap()
  72.        
  73.                 Local Pixmap:TPixmap = CreatePixmap(GadgetWidth(Panel), GadgetHeight(Panel), PF_RGBA8888)
  74.                 Pixmap.ClearPixels(0)
  75.                
  76.                 Local xAdvance:Int
  77.                 For Local i:Int=0 Until text.Length
  78.                         Local n:Int = font.CharToGlyph(text[i])
  79.                         If n<0 Continue
  80.                        
  81.                         Local Glyph:TImageGlyph = font.LoadGlyph(n)
  82.                         If Glyph._image Then
  83.                                 Local GlyphPixmap:TPixmap = Glyph._image.Pixmaps[0]
  84.                                 If GlyphPixmap Then
  85.                                         Local tx:Float = glyph._x
  86.                                         Local ty:Float = glyph._y
  87.                                        
  88.                                         For Local iy:Int = 0 Until GlyphPixmap.height
  89.                                                 For Local ix:Int = 0 Until GlyphPixmap.width
  90.                                                         If xAdvance + ix + tx < Pixmap.width And iy + ty < Pixmap.Height Then
  91.                                                                 Local BGRA:Int = ReadPixel(GlyphPixmap, ix, iy)
  92.                                                                 Local A:Int = (BGRA Shr 24) & $FF
  93.                                                                 BGRA = B | (G Shl 8) | (R Shl 16) | (A Shl 24)
  94.                                                                 WritePixel(Pixmap, xAdvance + ix + tx, iy + ty, BGRA)
  95.                                                         EndIf
  96.                                                 Next
  97.                                         Next
  98.                                 EndIf
  99.                         EndIf
  100.                         xAdvance:+Glyph.Advance()
  101.                 Next
  102.                
  103.                 Return Pixmap
  104.         EndMethod
  105.        
  106. EndType
  107.  
  108.  
  109.  
  110. 'some useful functions...
  111.  
  112. Function ImageFontHeight:Int(font:TImageFont)
  113.         Local h:Int
  114.         For Local ascii:Int=0 Until font._glyphs.length
  115.                 Local Glyph:TImageGlyph = font.LoadGlyph(ascii)
  116.                 If Glyph Then
  117.                         h=Max(h, Glyph._y+Glyph._h)
  118.                 EndIf
  119.         Next
  120.         Return h
  121. EndFunction
  122.  
  123. Function ImageFontTextWidth:Int(text:String, Font:TImageFont)
  124.         Local width:Int = 0
  125.         For Local n:Int = 0 Until text.Length
  126.                 Local I:Int = font.CharToGlyph(Text[n])
  127.                 If I < 0 Continue
  128.                 width:+font.LoadGlyph(I).Advance()
  129.         Next
  130.         Return width
  131. End Function
  132.  
  133. Function ImageFontCutTextToWidth:String(text:String, widthMax:Int, Font:TImageFont)
  134.         Local width:Int = 0
  135.         For Local n:Int = 0 Until text.Length
  136.                 Local i:Int = font.CharToGlyph(Text[n])
  137.                 If i < 0 Continue
  138.                 width:+font.LoadGlyph(I).Advance()
  139.                 If width>widthMax Then
  140.                         Return text[..n-1]
  141.                 EndIf
  142.         Next
  143.         Return text
  144. End Function


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal