[GB.FORM.TERMINAL]

* BUG: Fix drawing of bold characters.
* OPT: Detect spaces to draw them a bit faster.


git-svn-id: svn://localhost/gambas/trunk@7734 867c0c6c-44f3-4631-809d-bfa615b0a4ec
This commit is contained in:
Benoît Minisini 2016-04-10 10:45:10 +00:00
parent 757c55146c
commit 229928614e
5 changed files with 132 additions and 52 deletions

View File

@ -9,6 +9,7 @@ Component=gb.image
Component=gb.gui
Component=gb.form
Authors="Benoît Minisini\nFabien Bodard"
Environment="GB_GUI=gb.gtk3"
TabSize=2
Language=fr
Type=Component

View File

@ -26,7 +26,6 @@ End
Public Sub Form_Open()
TerminalView1.Font.Size = 13.95
TerminalView1.Exec(["bash"])
End
@ -75,6 +74,11 @@ End
' Dim B As Integer
'
' For B = 0 To 1
' If B = 0 Then
' TerminalView1.Print("\e[m")
' Else
' TerminalView1.Print("\e[1m")
' Endif
' For I = &H2500 To &H259F Step 16
' TerminalView1.Print(Hex$(I, 4) & ": ")
' For J = I To I + 15
@ -82,13 +86,23 @@ End
' Next
' TerminalView1.Print("\n\n")
' Next
' If B = 0 Then
' TerminalView1.Print("\e[1m")
' Else
' TerminalView1.Print("\e[m")
' Endif
' Next
'
' TerminalView1.Print("\e[m")
' TerminalView1.Print(String$(4, String$(20, String.Chr$(&H2572)) & "\n"))
'
' For B = 0 To 1
' If B = 0 Then
' TerminalView1.Print("\e[m")
' Else
' TerminalView1.Print("\e[1m")
' Endif
' For I = 256 To 1024
' TerminalView1.Print(String.Chr$(I))
' Next
' TerminalView1.Print("\n\n")
' Next
'
' TerminalView1.Print("\e[m")
'
' End

View File

@ -7,7 +7,7 @@
Arrangement = Arrange.Vertical
{ TerminalView1 TerminalView
MoveScaled(6,1,59,52)
Font = Font["Gambas,10"]
Font = Font["Droid Sans Mono,10"]
Expand = True
Border = False
Limit = 0

View File

@ -157,6 +157,10 @@ Public Sub Resize(W As Integer, H As Integer) As Boolean
$H = H
$X = Min($X, $W - 1)
$Y = ScreenTop() + Max(0, Min($Y - ScreenTop(), $H - 1))
$X1 = 0
$Y1 = 0
$X2 = 0
$Y2 = 0
'Debug "$Y = "; $Y
$iScrollStart = -1
$iScrollEnd = -1
@ -730,11 +734,10 @@ Private Function Height_Read() As Integer
End
Private Sub DrawLine(L As Integer, X As Integer, Y As Integer, LH As Integer, CW As Float, (LA) As Integer, hFontCache As Image)
Private Sub DrawLine(hView As TerminalView, L As Integer, X As Integer, Y As Integer, LH As Integer, CW As Integer, (LA) As Integer, hFontCache As Image)
Dim hView As TerminalView = GetView()
Dim hLine As CTerminalLine
Dim I As Integer
Dim I, J, K As Integer
'Dim sText As String
Dim aAttr As Integer[]
Dim hAttr As New TerminalAttr
@ -743,8 +746,7 @@ Private Sub DrawLine(L As Integer, X As Integer, Y As Integer, LH As Integer, CW
'Dim hRect As Rect
Dim P, iLen As Integer
Dim XT As Integer
Dim J As Integer
Dim C As Integer
Dim C, OC As Integer
Dim hFont As Font
Dim HC As Integer
Dim hRect As Rect
@ -752,6 +754,9 @@ Private Sub DrawLine(L As Integer, X As Integer, Y As Integer, LH As Integer, CW
Dim YC As Integer
Dim XC As Integer
Dim bNoText As Boolean
Dim XB, WB As Integer
Dim sText As String
hLine = Lines[L]
If Not hLine Then
@ -800,7 +805,7 @@ Private Sub DrawLine(L As Integer, X As Integer, Y As Integer, LH As Integer, CW
If hAttr.Dim Then iFg = Color.Merge(iFg, hView.Background)
Paint.Background = Color.White
'Paint.Background = Color.White
If hAttr.Bold Then
HC = LH
@ -831,22 +836,27 @@ DRAW_TEXT:
W = iLen * CW
If hFontCache Then
sText = String.Mid$(hLine.Text, P, iLen)
If IsSpace(sText) Then
Paint.FillRect(X, Y, W, LH, iBg)
Else
Paint.Begin($hLineCache)
Paint.Font = hFont
Paint.FillRect(0, 0, W, LH, iFg)
XT = 0
hRect = Rect(0, 0, CW, LH)
Paint.Operator = Paint.OperatorDestATop
For J = P To P + iLen - 1
For J = 1 To iLen
'sCar = String.Mid$(hLine.Text, J, 1)
C = String.Code(hLine.Text, J)
C = String.Code(sText, J)
If C <= 255 Then
@ -855,7 +865,7 @@ DRAW_TEXT:
Else If C >= &H2500 And If C <= &H259F Then
Paint.Background = Color.White
'Paint.Background = Color.White
DrawLineChar(C, XT, 0, CW, LH, XT, Y, hAttr.Bold)
Else
@ -868,9 +878,18 @@ DRAW_TEXT:
Else
If $cCharCache.Count < 32 Then
If $cCharCache.Count = 32 Then
For Each OC In $cCharCache
$cCharCache.Remove($cCharCache.Key)
Break
Next
Else
OC = $cCharCache.Count
Endif
If True '$cCharCache.Count < 32 Then
XC = $cCharCache.Count * CW
XC = OC * CW
YC = 0
Paint.Begin(hFontCache)
@ -881,38 +900,39 @@ DRAW_TEXT:
Paint.Operator = Paint.OperatorOver
Paint.ClipRect = Rect(XC, YC, CW, LH)
Paint.Background = Color.White
'Paint.Background = Color.White
GoSub DRAW_CHAR
YC += LH
Paint.ClipRect = Rect(XC, YC, CW, LH)
'Paint.DrawText(String.Chr(C), XC, YC, CW, LH, Align.Center)
GoSub DRAW_CHAR
Paint.Background = Color.SetAlpha(Color.White, 64)
'Paint.DrawText(String.Chr(C), XC + 1, YC, CW, LH, Align.Center)
Inc XC
GoSub DRAW_CHAR
Dec XC
GoSub DRAW_BOLD_CHAR
' 'Paint.DrawText(String.Chr(C), XC, YC, CW, LH, Align.Center)
' GoSub DRAW_CHAR
' Paint.Background = Color.SetAlpha(Color.White, 64)
' 'Paint.DrawText(String.Chr(C), XC + 1, YC, CW, LH, Align.Center)
' Inc XC
' GoSub DRAW_CHAR
' Dec XC
Paint.End
hRect.Move(XC, HC)
Paint.DrawImage(hFontCache, XT, 0, CW, LH,, hRect)
$cCharCache[C] = $cCharCache.Count
$cCharCache[C] = OC
Else
'Paint.DrawText(String.Chr(C), XT, 0, CW, LH, Align.Center)
XC = XT
YC = 0
Paint.Background = Color.White
GoSub DRAW_CHAR
'Paint.Background = Color.White
Paint.Operator = Paint.OperatorDestATop
If hAttr.Bold Then
'Paint.DrawText(String.Chr(C), XT + 1, 0, CW, LH, Align.Center)
Inc XC
Paint.Background = Color.SetAlpha(Color.White, 64)
GoSub DRAW_BOLD_CHAR
Else
GoSub DRAW_CHAR
Endif
@ -924,7 +944,7 @@ DRAW_TEXT:
XT += CW
Next
Paint.End
XT = X
@ -932,18 +952,9 @@ DRAW_TEXT:
Paint.FillRect(XT, Y, W, LH, iBg)
Paint.DrawImage($hLineCache, XT, Y, W, LH,, Rect(0, 0, W, LH))
Else
XT = X
Paint.FillRect(XT, Y, W, LH, iBg)
Paint.Background = iFg
Paint.DrawText(String.Mid$(hLine.Text, P, iLen), XT, Y + LA)
If hAttr.Bold Then Paint.DrawText(String.Mid$(hLine.Text, P, iLen), XT + 1, Y + LA)
Endif
If hAttr.Underscore Then Paint.FillRect(XT, Y + LH - 1, W, 1, Color.SetAlpha(iFg, 64))
If hAttr.Underscore Then Paint.FillRect(X, Y + LH - 1, W, 1, Color.SetAlpha(iFg, 64))
X += W
P += iLen
@ -961,6 +972,26 @@ DRAW_CHAR:
Paint.DrawText(String.Chr(C), XC, YC, CW, LH, Align.Center)
Return
DRAW_BOLD_CHAR:
GoSub DRAW_CHAR
XB = XC
WB = CW \ 8 + 1
For K = 1 To WB \ 2
Inc XC
GoSub DRAW_CHAR
Next
If Odd(WB) Then
Paint.Background = Color.SetAlpha(Color.White, 64)
Inc XC
GoSub DRAW_CHAR
Endif
XC = XB
Return
End
Private Sub GetSelection(ByRef X1 As Integer, ByRef Y1 As Integer, ByRef X2 As Integer, ByRef Y2 As Integer) As Boolean
@ -1001,7 +1032,7 @@ Public Sub Paint(SY As Integer, LH As Integer, CW As Float, LA As Integer, bHide
For L = L1 To L2
If L < Lines.Count Then DrawLine(L, 0, Y, LH, CW, LA, hFont)
If L < Lines.Count Then DrawLine(hView, L, 0, Y, LH, CW, LA, hFont)
' Cursor
@ -1228,7 +1259,7 @@ Private Sub DrawLineChar(C As Integer, X As Integer, Y As Integer, W As Integer,
hBold = hChar.Copy()
Paint.Begin(hChar)
If L >= 2 Then Paint.DrawImage(hBold, DL, 0)
If Odd(L) Then Paint.DrawImage(hBold, DL + 2, 0,,, 0.75)
If Odd(L) Then Paint.DrawImage(hBold, DL + 1, 0,,, 0.75)
Paint.End
Endif

View File

@ -62,6 +62,8 @@ Private $bSuspend As Boolean
Private $iMouseX As Integer
Private $iMouseY As Integer
'Private $bDoubleFont As Boolean = True
Public Sub _new()
Me.Font = Font["monospace"]
@ -161,6 +163,8 @@ Private Sub UpdateFont()
Dim I As Integer
Dim L As Integer
Dim W As Integer
' Dim hZoom As Image
Dim X As Integer
With $hView.Font
@ -168,7 +172,7 @@ Private Sub UpdateFont()
$iAscent = .Ascent
sText = String$(8, "mM0_@$#W")
$CW = CInt(.TextWidth(sText) / Len(sText))
$hCacheFont = New Image($CW * 256, $LH * 2, Color.Transparent)
Paint.Begin($hCacheFont)
Paint.Font = $hView.Font
@ -180,6 +184,29 @@ Private Sub UpdateFont()
Next
Paint.End
' If $bDoubleFont Then
' hZoom = New Image($hCacheFont.W * 2, $hCacheFont.H * 2, Color.Transparent)
' Paint.Begin(hZoom)
' Paint.ZoomImage($hCacheFont, 2, 0, 0)
' Paint.End
' $hCacheFont = hZoom
' $CW *= 2
' $LH *= 2
' Endif
' Make bold font
Paint.Begin($hCacheFont)
For I = 33 To 126
GoSub DRAW_BOLD_CHAR
Next
For I = 160 To 255
GoSub DRAW_BOLD_CHAR
Next
Paint.End
'$hCacheFont.Save("~/cache.png")
End With
@ -196,17 +223,24 @@ DRAW_CHAR:
Paint.ClipRect = Rect(I * $CW, 0, $CW, $LH)
Paint.Background = Color.White
Paint.DrawText(String.Chr(I), I * $CW, 0, $CW, $LH, Align.Center)
Return
DRAW_BOLD_CHAR:
Paint.ClipRect = Rect(I * $CW, $LH, $CW, $LH)
Paint.DrawText(String.Chr(I), I * $CW, $LH, $CW, $LH, Align.Center)
X = I * $CW
Paint.ClipRect = Rect(X, $LH, $CW, $LH)
Paint.DrawImage($hCacheFont, X, $LH, $CW, $LH,, Rect(X, 0, $CW, $LH))
W = $CW \ 8 + 1
For L = 1 To W \ 2
Paint.DrawText(String.Chr(I), I * $CW + L, $LH, $CW, $LH, Align.Center)
Paint.DrawImage($hCacheFont, X + L, $LH, $CW, $LH,, Rect(X, 0, $CW, $LH))
Next
If Odd(W) Then
Paint.Background = Color.SetAlpha(Color.White, 64)
Paint.DrawText(String.Chr(I), I * $CW + L, $LH, $CW, $LH, Align.Center)
Paint.DrawImage($hCacheFont, X + L, $LH, $CW, $LH,, Rect(X, 0, $CW, $LH))
Endif
Return