Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Handle letters dynamically
#4
Thank you very much for taking care of it Pete! It really didn't work well. (the position of the constructed character string was deleted in all cases, but it only built a new one if it received a new character string. Therefore, if we only repeated 1 text, it was deleted) I corrected this, in principle it now works normally.

I plan to add the option to place text in the X1Y1X2Y2 box in a line-excluded manner. (which can be rotated)

Did you intentionally enter a height of 1500 pixels for the test? It's gigantic, an awful lot. It takes a few seconds for the program to start. Consider that to create a single character, you create a hardware image of about 1500x1500 pixels. You specified FH11 as the size when printing, so it is ideal to set the font size in 'font_add' to about this size.

Here is the correct mfonts.bi file.
Thanks again!

Code: (Select All)
Sub m_fontsettings (a$, b$, x): m_fntset(0) = Asc(a$): m_fntset(1) = Asc(b$): m_fntset(2) = x: End Sub

Sub m_fontadd (i, f$, c As _Integer64, c2 As _Integer64, shmove, fs, xmulti, spfnt)
    m_fnt(i, 0) = fs
    m_fnt(i, 1) = _LoadFont(f$, fs)
    m_fnt(i, 2) = _Red32(c)
    m_fnt(i, 3) = _Green32(c)
    m_fnt(i, 4) = _Blue32(c)
    m_fnt(i, 5) = _Alpha32(c)
    m_fnt(i, 6) = xmulti
    m_fnt(i, 7) = 0
    m_fnt(i, 10) = _Red32(c2)
    m_fnt(i, 11) = _Green32(c2)
    m_fnt(i, 12) = _Blue32(c2)
    m_fnt(i, 13) = _Alpha32(c2)
    m_fnt(i, 14) = shmove
    m_fnt(i, 15) = spfnt
End Sub

Sub m_fontaddpic (i, f$, pic_handle, pic_alpha, pic_multi, c2 As _Integer64, shmove, fs, xmulti, spfnt)
    m_fnt(i, 0) = fs
    m_fnt(i, 1) = _LoadFont(f$, fs)
    m_fnt(i, 2) = pic_handle
    m_fnt(i, 3) = -1
    m_fnt(i, 4) = pic_alpha
    m_fnt(i, 5) = pic_multi
    m_fnt(i, 6) = xmulti
    m_fnt(i, 7) = 0
    m_fnt(i, 10) = _Red32(c2)
    m_fnt(i, 11) = _Green32(c2)
    m_fnt(i, 12) = _Blue32(c2)
    m_fnt(i, 13) = _Alpha32(c2)
    m_fnt(i, 14) = shmove
    m_fnt(i, 15) = spfnt
End Sub



Function m_printwidth (t$): concatenation (t$): printwidth = m_trw(1): End Function
Function m_printheight (t$): concatenation (t$): printheight = m_trw(2): End Function
Sub m_printstring_center (py, t$, r1, r2): concatenation (t$): ps (_Width - m_trw(1)) / 2 + 1, py, r1, r2: End Sub
Sub m_printstring_right (py, t$, marg, r1, r2): concatenation (t$): ps _Width - marg - m_trw(1), py, r1, r2: End Sub
Sub rotate_2d (x, y, ang): x1 = x * Cos(ang) - y * Sin(ang): y1 = x * Sin(ang) + y * Cos(ang): x = x1: y = y1: End Sub





Sub m_printstring (px, py, t$, r1, r2): m_trw(0) = 0: concatenation (t$): ps px, py, r1, r2: End Sub

Sub ps (sx, sy, r1, r2)
    ReDim r(1), t(4, 1)
    t(4, 0) = sx: t(4, 1) = sy
    r(0) = m_trw(1) / 2 * r1
    r(1) = -m_trw(2) / 2

    For t = 0 To m_trw(0) - 1
        si = 20 + t * 6
        t(0, 0) = m_trw(si + 1): t(0, 1) = m_trw(si + 2): t(1, 0) = m_trw(si + 3): t(1, 1) = m_trw(si + 2)
        t(2, 0) = m_trw(si + 1): t(2, 1) = m_trw(si + 4): t(3, 0) = m_trw(si + 3): t(3, 1) = m_trw(si + 4)

        If Sgn(r2) Then
            For t1 = 0 To 3: t(t1, 0) = t(t1, 0) - r(0): t(t1, 1) = t(t1, 1) - r(1): rotate_2d t(t1, 0), t(t1, 1), r2
            t(t1, 0) = t(t1, 0) + r(0): t(t1, 1) = t(t1, 1) + r(1): Next t1
        End If

        For t1 = 0 To 7: t2 = Int(t1 * .5): t3 = t1 And 1: t(t2, t3) = t(t2, t3) + t(4, t3): Next t1
        w = _Width(m_trw(si)) - 1: h = _Height(m_trw(si)) - 1
        _MapTriangle (0, 0)-(w, 0)-(0, h), m_trw(si) To(t(0, 0), t(0, 1))-(t(1, 0), t(1, 1))-(t(2, 0), t(2, 1))
        _MapTriangle (w, h)-(w, 0)-(0, h), m_trw(si) To(t(3, 0), t(3, 1))-(t(1, 0), t(1, 1))-(t(2, 0), t(2, 1))

    Next t
End Sub

Sub concatenation (t$)


    If t$ = m_lasttext$ Then Exit Sub
    m_lasttext$ = t$
    m_trw(0) = 0


    ind = 0: tr_c = 0: f_size = 10
    Do Until ac >= Len(t$): ac = ac + 1: ac$ = Mid$(t$, ac, 1)
        If ac$ = Chr$(m_fntset(0)) Then

            vh = InStr(ac + 1, t$, Chr$(m_fntset(1))): If vh = 0 Then Print "syntax error in text command": End
            v = Val(Mid$(t$, ac + 3, vh - ac - 3))
            Select Case LCase$(Mid$(t$, ac + 1, 2))
                Case "fi": ind = v
                Case "fh": f_size = v
            End Select
            ac = vh
        Else
            find = -1
            If Sgn(m_fnt(ind, 7)) Then
                For t = 20 To 20 + m_fnt(ind, 7) * 5
                    If Asc(ac$) = m_fnt(ind, t) Then find = t: Exit For
                Next t
            End If

            If find = -1 Then
                find = 20 + m_fnt(ind, 7) * 5
                savedest = _Dest
                _Font m_fnt(ind, 1)
                sh = m_fnt(ind, 14)
                pwac = _PrintWidth(ac$)
                temp2 = _NewImage(pwac + sh, m_fnt(ind, 0) + sh, 32)

                m_fnt(ind, find + 2) = 1 / (m_fnt(ind, 0) + sh) * (pwac + sh) * m_fnt(ind, 6) 'accel
                m_fnt(ind, find + 3) = 1 / m_fnt(ind, 0) * (m_fnt(ind, 0) + sh) * 1.2 'accel
                m_fnt(ind, find + 4) = 1 / m_fnt(ind, 0) * pwac * m_fnt(ind, 6) * m_fnt(ind, 15) 'accel

                _Dest temp2: Cls , 0
                _Font m_fnt(ind, 1)
                Color _RGBA32(m_fnt(ind, 10), m_fnt(ind, 11), m_fnt(ind, 12), m_fnt(ind, 13)), 0
                _PrintString (sh, sh), ac$

                If m_fnt(ind, 3) = -1 Then
                    temp11 = _NewImage(pwac + sh, m_fnt(ind, 0) + sh, 32)
                    _Dest temp11

                    sy = m_fnt(ind, 5) * _Width(m_fnt(ind, 2))
                    sx = sy / _Height * _Width

                    _MapTriangle (0, 0)-(sx, 0)-(0, sy), m_fnt(ind, 2) To(0, 0)-(_Width, 0)-(0, _Height)
                    _MapTriangle (sx, sy)-(sx, 0)-(0, sy), m_fnt(ind, 2) To(_Width, _Height)-(_Width, 0)-(0, _Height)

                    _SetAlpha m_fnt(ind, 4)
                    temp10 = _NewImage(pwac + sh, m_fnt(ind, 0) + sh, 32)

                    _Dest temp10
                    Cls , _RGB32(0, 0, 0)
                    _Font m_fnt(ind, 1)
                    Color _RGB32(255, 255, 255)
                    _PrintString (0, 0), ac$
                    _SetAlpha 0, _RGB32(255, 255, 255) To _RGB32(1, 1, 1)
                    _Dest temp11
                    _PutImage , temp10
                    _ClearColor _RGB32(0, 0, 0)
                    _Dest temp2

                    _PutImage , temp11
                    _FreeImage temp10
                    _FreeImage temp11
                Else
                    Color _RGB32(m_fnt(ind, 2), m_fnt(ind, 3), m_fnt(ind, 4)), 0
                    _PrintString (0, 0), ac$
                    _SetAlpha m_fnt(ind, 5), _RGB32(m_fnt(ind, 2), m_fnt(ind, 3), m_fnt(ind, 4))
                End If

                m_fnt(ind, find + 1) = _CopyImage(temp2, m_fntset(2))
                _FreeImage temp2
                m_fnt(ind, find) = Asc(ac$)
                _Dest savedest
                m_fnt(ind, 7) = m_fnt(ind, 7) + 1
               
            End If

            si = m_trw(0) * 6 + 20
            m_trw(si) = m_fnt(ind, find + 1) 'text
            m_trw(si + 1) = actual_x
            m_trw(si + 2) = -f_size
            m_trw(si + 3) = m_trw(si + 1) + f_size * m_fnt(ind, find + 2)
            m_trw(si + 4) = m_trw(si + 2) + f_size * m_fnt(ind, find + 3)
            m_trw(si + 5) = ac$ = " "
            actual_x = m_trw(si + 1) + f_size * m_fnt(ind, find + 4)
            m_trw(0) = m_trw(0) + 1

        End If
        If f_size > f_sizemax Then f_sizemax = f_size
    Loop
    m_trw(1) = actual_x
    m_trw(2) = f_sizemax

End Sub

Reply


Messages In This Thread
Handle letters dynamically - by MasterGy - 03-05-2024, 07:59 PM
RE: Handle letters dynamically - by Pete - 03-05-2024, 08:21 PM
RE: Handle letters dynamically - by Pete - 03-08-2024, 10:41 PM
RE: Handle letters dynamically - by MasterGy - 03-09-2024, 06:35 PM
RE: Handle letters dynamically - by Pete - 03-10-2024, 02:17 AM
RE: Handle letters dynamically - by MasterGy - 03-10-2024, 06:12 PM
RE: Handle letters dynamically - by Pete - 03-10-2024, 07:18 PM



Users browsing this thread: 3 Guest(s)