DrawText Very Slow in CanvasGadget

Linux specific forum
User avatar
holzhacker
Enthusiast
Enthusiast
Posts: 125
Joined: Mon Mar 08, 2010 9:14 pm
Location: "Mens sana in corpore sano"
Contact:

DrawText Very Slow in CanvasGadget

Post by holzhacker »

The DrawText this performing too slow.

This behavior is happening on a Lenovo Notebook DualCore 2.4GHz, 4GB RAM running Ubuntu 10.14 with Gnome 3.0.
Someone else is having this problem in DrawText slow in some other Linux?
In Windows7 64 this problem did not appear.

Thanks to collaboration.

Code: Select all

EnableExplicit

DeclareModule Designer
    
  Structure Designer
    main.l    
    gadget.l
    id.l
    x.l
    y.l
    width.l
    height.l
    xx.l
    yy.l
    flags.l
    form.s
    mouseX.l
    mouseY.l    
    mainMouseX.l
    mainMouseY.l
  EndStructure
  
  Global NewList Designer.Designer()
  Global *Designer.Designer

  Declare.l DesignerGadget(id.l, x.l, y.l, width.l, height.l, flags.l, window.l)
  Declare DrawWindowInDesigner()
  Declare ActiveText(state.l)
  
  Global ActiveText.l
   
EndDeclareModule

Module Designer
    
   Procedure ActiveText(state.l)
     If state.l: ActiveText.l = #True: Else: ActiveText.l = #False: EndIf 
   EndProcedure
   
   Procedure.l GetBackgroundWindowColor(WindowID_.l)
     StartDrawing(WindowOutput(WindowID_.l))
        ProcedureReturn Point(5, 5)
     StopDrawing()
   EndProcedure
   
   Procedure DrawWindowInDesigner()
   
     ;-Designer
     MouseXDesigner = GetGadgetAttribute(*Designer\id.l, #PB_Canvas_MouseX)
     MouseYDesigner = GetGadgetAttribute(*Designer\id.l, #PB_Canvas_MouseY)
     If MouseXDesigner <> 0: *Designer\mouseX.l = MouseXDesigner: EndIf 
     If MouseYDesigner <> 0: *Designer\mouseY.l = MouseYDesigner: EndIf 
     
  ;   Debug "*Designer\id.l = " + Str(*Designer\id.l) + "  |  *Designer\mousex.l: " + Str(*Designer\mouseX.l) + "  |   MouseXDesigner = " + Str(MouseXDesigner)
     
     StartDrawing(CanvasOutput(*Designer\id.l))
       ;background color
        Box(0,0, OutputWidth(), OutputHeight(), $ededed)
        
        ;grid
        For x = 0 To OutputWidth() Step 10
          For y = 0 To OutputHeight() Step 10
            Plot( x, y, 0 )
          Next
        Next  
        
        ;-Rules
        ;Horizontal Rule
        For rX=0 To OutputWidth() Step 5
          cont=cont+1:If cont=5: cont=1: size=7:Else:size=5:EndIf 
          Line(rX, 0,  1, size, RGB(128,128,128))
        Next 
        
        ;Vertical Rule
        For rY=0 To GadgetHeight(*Designer\id.l) Step 5
          cont=cont+1:If cont=5: cont=1: size=7:Else:size=5:EndIf 
          Line(0, rY,  size, 1, RGB(128,128,128))
        Next 
       
        ;Pointer Lines 
        Line(*Designer\mouseX.l, 0,                  1, 7, RGB(255,0,0))    
        Line(0,                  *Designer\mouseY.l, 7, 1, RGB(255,0,0))    
        
        ;Mark Lines
        Line(*Designer\mouseX.l, 5, 1, OutputHeight()-5, RGB(0,0,255))
        Line(5, *Designer\mouseY.l, OutputWidth()-5, 1, RGB(0,0,255))
        
        If ActiveText.l
          DrawText(*Designer\mouseX.l, *Designer\mouseY.l, "  SLOW  ", RGB(255,0,0), RGB(255,255,255))
        EndIf 
      
    StopDrawing()
   
  EndProcedure
   
  Procedure.l DesignerGadget(id.l, x.l, y.l, width.l, height.l, flags.l, window.l)
    
    LastElement(Designer()) 
    *Designer = AddElement(Designer())
    *Designer\gadget.l = id.l
    *Designer\x.l      = x.l
    *Designer\y.l      = y.l
    *Designer\width.l  = width.l
    *Designer\height.l = height.l
    *Designer\flags.l  = flags.l
    *Designer\xx.l     = width.l - x.l
    *Designer\yy.l     = height.l - y.l
    
    *Designer\id.l     = CanvasGadget(*Designer\gadget.l, (*Designer\x + 10) + jumpLeft.l, (*Designer\y + 10) + jumpTop.l, *Designer\width, *Designer\height, *Designer\flags.l)
    SetGadgetAttribute(*Designer\id.l, #PB_Canvas_Cursor, #PB_Cursor_Cross)
        
    ProcedureReturn *Designer\gadget.l
  EndProcedure
  
EndModule

CompilerIf #PB_Compiler_IsMainFile
  
  Define Event.l, DesignerID.l, ButtonActiveText.l
  
  OpenWindow(0, 0, 0, 800, 600, "Window Test Designer", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
  DesignerID.l = Designer::DesignerGadget(#PB_Any, 0, 0, 600, 480, #PB_Canvas_Border|#PB_Canvas_Keyboard, 0)
  ButtonActiveText.l = CheckBoxGadget(#PB_Any, 630, 10, 140, 25, "Active DrawText")
  
  Repeat

    Event.l = WaitWindowEvent()
    Designer::DrawWindowInDesigner()
    
    Select Event
       Case #PB_Event_Gadget
         Select EventGadget()
           Case ButtonActiveText.l
             Designer::ActiveText(GetGadgetState(ButtonActiveText.l))
         EndSelect
     EndSelect
  Until Event.l = #PB_Event_CloseWindow
  
CompilerEndIf
Greetings and thanks!

Romerio Medeiros
romerio@gmail.com
Fred
Administrator
Administrator
Posts: 18220
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: DrawText Very Slow in CanvasGadget

Post by Fred »

That's right, it's very slow in GTK2 and fast in GTK3. I will take a closer look.
Fred
Administrator
Administrator
Posts: 18220
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: DrawText Very Slow in CanvasGadget

Post by Fred »

The code wasn't correct, you should only draw when a Canvas event is received. I can't see any issue with GTK2 when doing like that (also adapted for 64-bit):

Code: Select all

EnableExplicit

DeclareModule Designer
    
  Structure Designer
    main.i    
    gadget.i
    id.i
    x.i
    y.i
    width.i
    height.i
    xx.i
    yy.i
    flags.i
    form.s
    mouseX.i
    mouseY.i  
    mainMouseX.i
    mainMouseY.i
  EndStructure
  
  Global NewList Designer.Designer()
  Global *Designer.Designer

  Declare DesignerGadget(id, x, y, width, height, flags, window)
  Declare DrawWindowInDesigner()
  Declare ActiveText(state)
  
  Global ActiveText
   
EndDeclareModule

Module Designer
    
   Procedure ActiveText(state)
     If state: ActiveText = #True: Else: ActiveText = #False: EndIf 
   EndProcedure
   
   Procedure GetBackgroundWindowColor(WindowID_)
     StartDrawing(WindowOutput(WindowID_))
        ProcedureReturn Point(5, 5)
     StopDrawing()
   EndProcedure
   
   Procedure DrawWindowInDesigner()
   
     ;-Designer
     MouseXDesigner = GetGadgetAttribute(*Designer\id, #PB_Canvas_MouseX)
     MouseYDesigner = GetGadgetAttribute(*Designer\id, #PB_Canvas_MouseY)
     
     ; Debug MouseXDesigner
     If MouseXDesigner <> 0: *Designer\mouseX = MouseXDesigner: EndIf 
     If MouseYDesigner <> 0: *Designer\mouseY = MouseYDesigner: EndIf 
     
  ;   Debug "*Designer\id = " + Str(*Designer\id) + "  |  *Designer\mousex: " + Str(*Designer\mouseX) + "  |   MouseXDesigner = " + Str(MouseXDesigner)
     
     StartDrawing(CanvasOutput(*Designer\id))
       ;background color
        Box(0,0, OutputWidth(), OutputHeight(), $ededed)
        
        ;grid
        For x = 0 To OutputWidth()-1 Step 10
          For y = 0 To OutputHeight()-1 Step 10
            Plot( x, y, 0 )
          Next
        Next  
        
        ;-Rules
        ;Horizontal Rule
        For rX=0 To OutputWidth() Step 5
          cont=cont+1:If cont=5: cont=1: size=7:Else:size=5:EndIf 
          Line(rX, 0,  1, size, RGB(128,128,128))
        Next 
        
        ;Vertical Rule
        For rY=0 To GadgetHeight(*Designer\id) Step 5
          cont=cont+1:If cont=5: cont=1: size=7:Else:size=5:EndIf 
          Line(0, rY,  size, 1, RGB(128,128,128))
        Next 
       
        ;Pointer Lines 
        Line(*Designer\mouseX, 0,                  1, 7, RGB(255,0,0))    
        Line(0,                  *Designer\mouseY, 7, 1, RGB(255,0,0))    
        
        ;Mark Lines
        Line(*Designer\mouseX, 5, 1, OutputHeight()-5, RGB(0,0,255))
        Line(5, *Designer\mouseY, OutputWidth()-5, 1, RGB(0,0,255))
        
        If ActiveText
          DrawText(*Designer\mouseX, *Designer\mouseY, "  SLOW  ", RGB(255,0,0), RGB(255,255,255))
        EndIf 
      
    StopDrawing()
   
  EndProcedure
   
  Procedure DesignerGadget(id, x, y, width, height, flags, window)
    
    LastElement(Designer()) 
    *Designer = AddElement(Designer())
    *Designer\gadget = id
    *Designer\x      = x
    *Designer\y      = y
    *Designer\width  = width
    *Designer\height = height
    *Designer\flags  = flags
    *Designer\xx     = width - x
    *Designer\yy     = height - y
    
    *Designer\id     = CanvasGadget(*Designer\gadget, (*Designer\x + 10) + jumpLeft, (*Designer\y + 10) + jumpTop, *Designer\width, *Designer\height, *Designer\flags)
    SetGadgetAttribute(*Designer\id, #PB_Canvas_Cursor, #PB_Cursor_Cross)
        
    ProcedureReturn *Designer\id
  EndProcedure
  
EndModule

CompilerIf #PB_Compiler_IsMainFile
  
  Define Event, DesignerID, ButtonActiveText
  
  OpenWindow(0, 0, 0, 800, 600, "Window Test Designer", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
  DesignerID = Designer::DesignerGadget(#PB_Any, 0, 0, 600, 480, #PB_Canvas_Border|#PB_Canvas_Keyboard|#PB_Canvas_DrawFocus, 0)
  ButtonActiveText = CheckBoxGadget(#PB_Any, 630, 10, 140, 25, "Active DrawText")
  
  Repeat

    Event = WaitWindowEvent()
        
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case DesignerID
            Designer::DrawWindowInDesigner()
            
           Case ButtonActiveText
             Designer::ActiveText(GetGadgetState(ButtonActiveText))
         EndSelect
     EndSelect
  Until Event = #PB_Event_CloseWindow
  
CompilerEndIf
User avatar
holzhacker
Enthusiast
Enthusiast
Posts: 125
Joined: Mon Mar 08, 2010 9:14 pm
Location: "Mens sana in corpore sano"
Contact:

Re: DrawText Very Slow in CanvasGadget

Post by holzhacker »

Thanks friend Fred!
Greetings and thanks!

Romerio Medeiros
romerio@gmail.com
Post Reply