I do the whole screen frefresh, scaling etc in realtime on a PER CHARACTER basis, for my terminal sub-project, and I get roughly 150 fps on my X800 generation card, and AMD K8 processor. I'm very picky on my visuals and what I need to achieve, and I found that FastImage gave me what I wanted the easy way.
Here I'll poste my render function ;)
Function render_page(page_id%)
; Renders a terminal page and it's relative cursor and mouse character pointer
; Layer order:
; - background shadow tiles
; - background tiles
; - foreground text shadow *** not finished yet ***
; - text underlines
; - text map
; - text strikeouts
; - cursor shadow tile + background tile + keyboard cursor character
; - mouse shadow tile + background tile + mouse cursor character
;
; *** shadows are not yet completed and tested.
;
Local disp%, row%, col%
If page_exists(page_id) = False Then Return
If term\timer >= term\page[page_id]\blink_slow_timer Then
term\page[page_id]\blink_slow_timer = term\timer + term\page[page_id]\blink_slow_rate
term\page[page_id]\blink_slow_state = (term\page[page_id]\blink_slow_state + 1) Mod 2
EndIf
If term\timer >= term\page[page_id]\blink_fast_timer Then
term\page[page_id]\blink_fast_timer = term\timer + term\page[page_id]\blink_fast_rate
term\page[page_id]\blink_fast_state = (term\page[page_id]\blink_fast_state + 1) Mod 2
EndIf
If term\page[page_id]\palette_rotate_state <> 0 Then
Select term\page[page_id]\palette_rotate_state
Case 999
term_shift_palette(page_id, term\page[page_id]\palette_rotate_start, term\page[page_id]\palette_rotate_end, 1)
term\page[page_id]\palette_rotate_state = 0
Case -999
term_shift_palette(page_id, term\page[page_id]\palette_rotate_start, term\page[page_id]\palette_rotate_end, -1)
term\page[page_id]\palette_rotate_state = 0
Default
If term\timer >= (term\page[page_id]\palette_rotate_timer + term\page[page_id]\palette_rotate_rate) Then
term\page[page_id]\palette_rotate_timer = term\timer
term_shift_palette(page_id, term\page[page_id]\palette_rotate_start, term\page[page_id]\palette_rotate_end, term\page[page_id]\palette_rotate_state)
EndIf
End Select
EndIf
Local page_mode% = term\page[page_id]\mode
If (page_mode And PGMOD_DISPLAY_ON) = False Or (page_mode And PGMOD_CHARS_TILES_SHADOWS_ON) = False Then Return
Local palette_table% = term\page[page_id]\palette_table
Local draw_X#, draw_Y#
Local draw_start_X#, draw_start_Y#, draw_start_col%
Local text_table% = term\page[page_id]\layer[PGTBL_text]
Local t_color_table% = term\page[page_id]\layer[PGTBL_text_color]
Local b_color_table% = term\page[page_id]\layer[PGTBL_bkgnd_color]
Local lines_table% = term\page[page_id]\layer[PGTBL_lines]
Local attr_table% = term\page[page_id]\layer[PGTBL_attr]
Local font_table% = term\page[page_id]\layer[PGTBL_font]
Local item_table% = term\page[page_id]\layer[PGTBL_click_item]
Local mouse_saved_item% = term\mouse_saved_item
Local text_mask_table%, t_color_mask_table%, b_color_mask_table%, attr_mask_table%, font_mask_table%
If term\mouse_page_focus = page_id And (page_mode And PGMOD_MASKS_ON) > False And mouse_saved_item > 0 Then
text_mask_table% = term\page[page_id]\layer[PGTBL_text + term\mouse_page_focus_item_layer_offset]
t_color_mask_table% = term\page[page_id]\layer[PGTBL_text_color + term\mouse_page_focus_item_layer_offset]
b_color_mask_table% = term\page[page_id]\layer[PGTBL_bkgnd_color + term\mouse_page_focus_item_layer_offset]
lines_mask_table% = term\page[page_id]\layer[PGTBL_lines + term\mouse_page_focus_item_layer_offset]
attr_mask_table% = term\page[page_id]\layer[PGTBL_attr + term\mouse_page_focus_item_layer_offset]
font_mask_table% = term\page[page_id]\layer[PGTBL_font + term\mouse_page_focus_item_layer_offset]
Else
text_mask_table% = term\page[page_id]\layer[PGTBL_text]
t_color_mask_table% = term\page[page_id]\layer[PGTBL_text_color]
b_color_mask_table% = term\page[page_id]\layer[PGTBL_bkgnd_color]
lines_mask_table% = term\page[page_id]\layer[PGTBL_lines]
attr_mask_table% = term\page[page_id]\layer[PGTBL_attr]
font_mask_table% = term\page[page_id]\layer[PGTBL_font]
EndIf
Local argb%, argb0%, argb1%, argb2%, argb3%
Local alpha_table%, x_zoom_table%, y_zoom_table%, angle_table%, x_offset_table%, y_offset_table%
Local special_features% = False
If page_mode And PGMOD_SPECIAL_FEATURES_ON Then
special_features% = page_mode And PGMOD_SF_UPDATE_ALL_ON
EndIf
If special_features > False Then
alpha_table% = term\page[page_id]\layer[PGTBL_alpha]
x_zoom_table% = term\page[page_id]\layer[PGTBL_x_zoom]
y_zoom_table% = term\page[page_id]\layer[PGTBL_y_zoom]
angle_table% = term\page[page_id]\layer[PGTBL_angle]
x_offset_table% = term\page[page_id]\layer[PGTBL_x_offset]
y_offset_table% = term\page[page_id]\layer[PGTBL_y_offset]
shade_table% = term\page[page_id]\layer[PGTBL_shade]
EndIf
Local X# = term\page[page_id]\X
Local Y# = term\page[page_id]\Y
Local render_scale_X# = Float term\current_width / Float TRM_virtual_width
Local render_scale_Y# = Float term\current_height / Float TRM_virtual_height
SetProjScale render_scale_X, render_scale_Y
SetProjHandle -X, -Y
Local shadow_X# = term_sin(term\shadow_orientation) * term\shadow_distance
Local shadow_Y# = term_cos(term\shadow_orientation) * term\shadow_distance
Local char_width# = term\page[page_id]\char_width
Local char_height# = term\page[page_id]\char_height
Local cols% = term\page[page_id]\cols
Local rows% = term\page[page_id]\rows
Local display_nulls% = page_mode And PGMOD_NULLS_ON
Local blink_slow_state% = term\page[page_id]\blink_slow_state
Local blink_fast_state% = term\page[page_id]\blink_fast_state
; if the tiles / characters are off the screen, then we limit the drawing
If X < 0 Then start_col% = Abs(X / char_width + 0.5) Else start_col% = 0
If Y < 0 Then start_row% = Abs(Y / char_height + 0.5) Else start_row% = 0
If X > (TRM_virtual_width - term\page[page_id]\active_width) Then end_col% = (cols - 1) - (X / char_width - 0.5) Else end_col% = cols - 1
If Y > (TRM_virtual_height - term\page[page_id]\active_height) Then end_row% = (rows - 1) - (Y / char_height - 0.5) Else end_row% = rows - 1
If (page_mode And PGMOD_TILES_ON) > False Then
StartDraw
; background shadow
If (page_mode And PGMOD_TILE_SHADOWING_ON) > False Then
SetScale 1.0, 1.0
SetOrigin 0,0
SetBlend FI_ALPHABLEND
SetAlpha term\shadow_alpha
SetColor 0, 0, 0
If special_features <> False Then
; ************** TO BE COMPLETED
If display_nulls <> False Then
DrawRectSimple_ (shadow_X + start_col * char_width, shadow_Y + start_row * char_height, char_width * (cols - start_col), char_height * (rows - start_row), 1)
Else
; not sure if I should use a bitmap instead **************
For row = start_row To end_row
draw_start_col% = start_col
draw_start_X = shadow_X + draw_start_col * char_width
draw_start_Y = shadow_Y + row * char_height
disp = row * cols + draw_start_col
For col = start_col To end_col
disp = row * cols + col
item% = PeekByte(item_table, disp)
If PeekByte(text_table, disp) = 0 Then
If (col - draw_start_col) > 0 Then
chars% = col - draw_start_col
DrawRectSimple_ (draw_start_X, draw_start_Y, char_width * chars, char_height, 1)
EndIf
draw_start_col = col + 1
draw_start_X = shadow_X + draw_start_col * char_width
EndIf
Next
If (col - draw_start_col) > 0 Then
DrawRectSimple_ (draw_start_X, draw_start_Y, char_width * (col - draw_start_col), char_height, 1)
EndIf
Next
EndIf
; ************** TO BE COMPLETED
Else
If display_nulls <> False Then
DrawRectSimple_ (shadow_X + start_col * char_width, shadow_Y + start_row * char_height, char_width * (cols - start_col), char_height * (rows - start_row), 1)
Else
; not sure if I should use a bitmap instead **************
For row = start_row To end_row
draw_start_col% = start_col
draw_start_X = shadow_X + draw_start_col * char_width
draw_start_Y = shadow_Y + row * char_height
disp = row * cols + draw_start_col
For col = start_col To end_col
disp = row * cols + col
item% = PeekByte(item_table, disp)
If PeekByte(text_table, disp) = 0 Then
If (col - draw_start_col) > 0 Then
chars% = col - draw_start_col
DrawRectSimple_ (draw_start_X, draw_start_Y, char_width * chars, char_height, 1)
EndIf
draw_start_col = col + 1
draw_start_X = shadow_X + draw_start_col * char_width
EndIf
Next
If (col - draw_start_col) > 0 Then
DrawRectSimple_ (draw_start_X, draw_start_Y, char_width * (col - draw_start_col), char_height, 1)
EndIf
Next
EndIf
EndIf
EndIf
; background
SetBlend FI_ALPHABLEND
SetAlpha term\page[page_id]\bkgnd_alpha
If special_features And PGMOD_SF_UPDATE_BKGND_ON Then
For row = start_row To end_row
For col = start_col To end_col
disp = row * cols + col
If item = mouse_saved_item Then
argb% = PeekInt (palette_table, PeekByte(b_color_mask_table, disp) Shl 2)
Else
argb% = PeekInt (palette_table, PeekByte(b_color_table, disp) Shl 2)
EndIf
If (display_nulls = True And PeekByte(text_table, disp) = 0) Then
; skip
Else
If (page_mode And PGMOD_SF_UPDATE_ANGLE_ON) > False Then
SetRotation PeekByte(angle_table, disp) * 2
EndIf
If (page_mode And PGMOD_SF_UPDATE_ALPHA_ON) > False Then
SetAlpha PeekByte(alpha_table, disp) * 0.003921569
EndIf
If (page_mode And PGMOD_SF_UPDATE_ZOOM_ON) > False Then
SetScale PeekByte(x_zoom_table, disp) * 0.015625, PeekByte(y_zoom_table, disp) * 0.015625
EndIf
If (page_mode And PGMOD_SF_UPDATE_OFFSET_ON) > False Then
SetOrigin PeekByte(x_offset_table, disp) - 128, PeekByte(y_offset_table, disp) - 128
EndIf
SetColor (argb Shr 16) And $ff, (argb Shr 8) And $ff, argb And $ff
DrawRectSimple_ (col * char_width, row * char_height, char_width, char_height, 1)
EndIf
Next
Next
Else
For row = start_row To end_row
draw_start_col% = start_col
draw_start_X = draw_start_col * char_width
draw_start_Y = row * char_height
disp = row * cols + draw_start_col
argb% = PeekInt (palette_table, PeekByte(b_color_table, disp) Shl 2)
old_argb% = argb
For col = start_col To end_col
disp = row * cols + col
item% = PeekByte(item_table, disp)
If item = mouse_saved_item Then
argb% = PeekInt (palette_table, PeekByte(b_color_mask_table, disp) Shl 2)
Else
argb% = PeekInt (palette_table, PeekByte(b_color_table, disp) Shl 2)
EndIf
If (display_nulls = False And PeekByte(text_table, disp) = 0) Then
If (col - draw_start_col) > 0 Then
SetColor (old_argb Shr 16) And $ff, (old_argb Shr 8) And $ff, old_argb And $ff
chars% = col - draw_start_col
DrawRectSimple_ (draw_start_X, draw_start_Y, char_width * chars, char_height, 1)
EndIf
draw_start_col = col + 1
draw_start_X = draw_start_col * char_width
ElseIf old_argb <> argb Then
SetColor (old_argb Shr 16) And $ff, (old_argb Shr 8) And $ff, old_argb And $ff
chars% = col - draw_start_col
DrawRectSimple_ (draw_start_X, draw_start_Y, char_width * chars, char_height, 1)
old_argb% = argb
draw_start_col = col
draw_start_X = draw_start_col * char_width
EndIf
Next
If (col - draw_start_col) > 0 Then
SetColor (argb Shr 16) And $ff, (argb Shr 8) And $ff, argb And $ff
DrawRectSimple_ (draw_start_X, draw_start_Y, char_width * (col - draw_start_col), char_height, 1)
EndIf
Next
EndIf
EndDraw
EndIf
If (page_mode And PGMOD_CHARS_ON) > False Then
StartDraw
; chars
Local font_select% = $100
Local font_select_row% = 0
; char shadow
If (page_mode And PGMOD_CHAR_SHADOWING_ON) > False Then
SetColor 0,0,0
SetBlend FI_ALPHABLEND
SetAlpha term\page[page_id]\text_alpha
disp = 0
For row = 0 To (rows - 1)
font_select_col% = cols - font_select_col
For col = 0 To (cols - 1)
;************* If mouse is over an item, render character accordingly
If PeekByte(item_table, disp) = mouse_saved_item Then
curr_font% = PeekByte(font_mask_table, disp)
If font_select <> curr_font Then
font_select% = curr_font
font_select_col% = 0
font_select_row% = row
font = curr_font And TXRNA_FONT_ID
scale_X# = char_width / Float (term\font[font]\width)
scale_Y# = char_height / Float (term\font[font]\height)
SetScale scale_X, scale_Y
w# = term\font[font]\width
h# = term\font[font]\height
draw_X# = (w * 0.5 * scale_X)
draw_Y# = (h * 0.5 * scale_Y)
font_image% = term\font[font]\image
font_size = curr_font And TXRNA_FONT_SIZE
EndIf
char% = PeekByte(text_mask_table, disp)
If char <> 32 And (display_nulls <> False Or (display_nulls = False And char > 0)) Then
attr% = PeekByte(attr_table, disp)
If (attr And TXRNA_BLINK_SLOW_ON) > False And blink_slow_state > False Then
;skip
ElseIf (attr And TXRNA_BLINK_FAST_ON) > False And blink_fast_state > False Then
;skip
Else
If row >= start_row And row <= end_row And col >= start_col And col <= end_col Then
If special_features And PGMOD_SF_UPDATE_CHARS_ON Then
If page_mode And PGMOD_SF_UPDATE_ANGLE_ON Then
SetRotation PeekByte(angle_table, disp) * 2
EndIf
If page_mode And PGMOD_SF_UPDATE_ZOOM_ON Then
SetScale scale_X * PeekByte(x_zoom_table, disp) * 0.015625, scale_Y * PeekByte(y_zoom_table, disp) * 0.015625
EndIf
If page_mode And PGMOD_SF_UPDATE_OFFSET_ON Then
SetOrigin PeekByte(x_offset_table, disp) - 128, PeekByte(y_offset_table, disp) - 128
EndIf
If page_mode And PGMOD_SF_UPDATE_ALPHA_ON Then
alpha% = PeekByte(alpha_table, disp) Shl 24
Else
alpha% = $FF000000
EndIf
EndIf
If font_size = False Then
DrawImageRectEx_ font_image, draw_X + col * char_width, draw_Y + row * char_height, w, h, char
Else
Select font_size And TXRNA_FONT_WIDTH_MULTIPLY
Case TXRNA_DOUBLE_WIDTH_ON : partwidth# = w * 0.5 : partx# = (font_select_col Mod 2) * partwidth
Case TXRNA_TRIPLE_WIDTH_ON : partwidth# = w * 0.33333333 : partx# = (font_select_col Mod 3) * partwidth
Case TXRNA_QUADRUPLE_WIDTH_ON : partwidth# = w * 0.25 : partx# = (font_select_col Mod 4) * partwidth
Default : partwidth# = w : partx# = 0
End Select
Select font_size And TXRNA_FONT_HEIGHT_MULTIPLY
Case TXRNA_DOUBLE_HEIGHT_ON : partheight# = h * 0.5 : party# = (font_select_row Mod 2) * partheight
Case TXRNA_TRIPLE_HEIGHT_ON : partheight# = h * 0.33333333 : party# = (font_select_row Mod 3) * partheight
Case TXRNA_QUADRUPLE_HEIGHT_ON : partheight# = h * 0.25 : party# = (font_select_row Mod 4) * partheight
Default : partheight# = h : party# = 0
End Select
DrawImagePart_ font_image, draw_X + col * char_width, draw_Y + row * char_height, w, h, partx, party, partwidth, partheight, char, 0
EndIf
EndIf
EndIf
EndIf
Else
curr_font% = PeekByte(font_table, disp)
If font_select <> curr_font Then
font_select% = curr_font
font_select_col% = 0
font_select_row% = row
font = curr_font And TXRNA_FONT_ID
scale_X# = char_width / Float (term\font[font]\width)
scale_Y# = char_height / Float (term\font[font]\height)
SetScale scale_X, scale_Y
w# = term\font[font]\width
h# = term\font[font]\height
draw_X# = (w * 0.5 * scale_X)
draw_Y# = (h * 0.5 * scale_Y)
font_image% = term\font[font]\image
font_size = curr_font And TXRNA_FONT_SIZE
EndIf
char% = PeekByte(text_table, disp) ; render character, no mouse over effects
If char <> 32 And (display_nulls <> False Or (display_nulls = False And char > 0)) Then
attr% = PeekByte(attr_table, disp)
If (attr And TXRNA_BLINK_SLOW_ON) > False And blink_slow_state > False Then
;skip
ElseIf (attr And TXRNA_BLINK_FAST_ON) > False And blink_fast_state > False Then
;skip
Else
If row >= start_row And row <= end_row And col >= start_col And col <= end_col Then
If special_features And PGMOD_SF_UPDATE_CHARS_ON Then
If page_mode And PGMOD_SF_UPDATE_ANGLE_ON Then
SetRotation PeekByte(angle_table, disp) * 2
EndIf
If page_mode And PGMOD_SF_UPDATE_ZOOM_ON Then
SetScale scale_X * PeekByte(x_zoom_table, disp) * 0.015625, scale_Y * PeekByte(y_zoom_table, disp) * 0.015625
EndIf
If page_mode And PGMOD_SF_UPDATE_OFFSET_ON Then
SetOrigin PeekByte(x_offset_table, disp) - 128, PeekByte(y_offset_table, disp) - 128
EndIf
If page_mode And PGMOD_SF_UPDATE_ALPHA_ON Then
alpha% = PeekByte(alpha_table, disp) Shl 24
Else
alpha% = $FF000000
EndIf
EndIf
If font_size = False Then
DrawImageRectEx_ font_image, draw_X + col * char_width, draw_Y + row * char_height, w, h, char
Else
Select font_size And TXRNA_FONT_WIDTH_MULTIPLY
Case TXRNA_DOUBLE_WIDTH_ON : partwidth# = w * 0.5 : partx# = (font_select_col Mod 2) * partwidth
Case TXRNA_TRIPLE_WIDTH_ON : partwidth# = w * 0.33333333 : partx# = (font_select_col Mod 3) * partwidth
Case TXRNA_QUADRUPLE_WIDTH_ON : partwidth# = w * 0.25 : partx# = (font_select_col Mod 4) * partwidth
Default : partwidth# = w : partx# = 0
End Select
Select font_size And TXRNA_FONT_HEIGHT_MULTIPLY
Case TXRNA_DOUBLE_HEIGHT_ON : partheight# = h * 0.5 : party# = (font_select_row Mod 2) * partheight
Case TXRNA_TRIPLE_HEIGHT_ON : partheight# = h * 0.33333333 : party# = (font_select_row Mod 3) * partheight
Case TXRNA_QUADRUPLE_HEIGHT_ON : partheight# = h * 0.25 : party# = (font_select_row Mod 4) * partheight
Default : partheight# = h : party# = 0
End Select
DrawImagePart_ font_image, draw_X + col * char_width, draw_Y + row * char_height, w, h, partx, party, partwidth, partheight, char, 0
EndIf
EndIf
EndIf
EndIf
EndIf
font_select_col = font_select_col + 1
disp = disp + 1
Next
font_select_row = font_select_row + 1
Next
EndIf
; the actual characters
old_argb% = $12345678
SetBlend FI_ALPHABLEND
SetAlpha term\page[page_id]\text_alpha
disp = 0
For row = 0 To (rows - 1)
font_select_col% = cols - font_select_col
For col = 0 To (cols - 1)
;************* If mouse is over an item, render character accordingly
If PeekByte(item_table, disp) = mouse_saved_item Then
curr_font% = PeekByte(font_mask_table, disp)
If font_select <> curr_font Then
font_select% = curr_font
font_select_col% = 0
font_select_row% = row
font = curr_font And TXRNA_FONT_ID
scale_X# = char_width / Float (term\font[font]\width)
scale_Y# = char_height / Float (term\font[font]\height)
SetScale scale_X, scale_Y
w# = term\font[font]\width
h# = term\font[font]\height
draw_X# = (w * 0.5 * scale_X)
draw_Y# = (h * 0.5 * scale_Y)
font_image% = term\font[font]\image
font_size = curr_font And TXRNA_FONT_SIZE
EndIf
char% = PeekByte(text_mask_table, disp)
If char <> 32 And (display_nulls <> False Or (display_nulls = False And char > 0)) Then
attr% = PeekByte(attr_table, disp)
If (attr And TXRNA_BLINK_SLOW_ON) > False And blink_slow_state > False Then
;skip
ElseIf (attr And TXRNA_BLINK_FAST_ON) > False And blink_fast_state > False Then
;skip
Else
If row >= start_row And row <= end_row And col >= start_col And col <= end_col Then
If special_features And PGMOD_SF_UPDATE_CHARS_ON Then
If page_mode And PGMOD_SF_UPDATE_ANGLE_ON Then
SetRotation PeekByte(angle_table, disp) * 2
EndIf
If page_mode And PGMOD_SF_UPDATE_ZOOM_ON Then
SetScale scale_X * PeekByte(x_zoom_table, disp) * 0.015625, scale_Y * PeekByte(y_zoom_table, disp) * 0.015625
EndIf
If page_mode And PGMOD_SF_UPDATE_OFFSET_ON Then
SetOrigin PeekByte(x_offset_table, disp) - 128, PeekByte(y_offset_table, disp) - 128
EndIf
If page_mode And PGMOD_SF_UPDATE_ALPHA_ON Then
alpha% = PeekByte(alpha_table, disp) Shl 24
Else
alpha% = $FF000000
EndIf
If page_mode And PGMOD_SF_SHADE_ON Then
argb% = PeekInt (palette_table, PeekByte(t_color_mask_table, disp) Shl 2)
shade% = PeekByte(shade_table, disp)
Select shade And $0F ; color
Case 1 :
If col = (cols - 1) Then
argb1% = PeekInt (palette_table, PeekByte(t_color_mask_table, row * cols) Shl 2)
Else
argb1% = PeekInt (palette_table, PeekByte(t_color_mask_table, disp + 1) Shl 2)
EndIf
argb0 = argb : argb2 = argb1 : argb3 = argb
Case 2 :
If col = 0 Then
argb0% = PeekInt (palette_table, PeekByte(t_color_mask_table, disp + cols - 1) Shl 2)
Else
argb0% = PeekInt (palette_table, PeekByte(t_color_mask_table, disp - 1) Shl 2)
EndIf
argb1 = argb : argb2 = argb : argb3 = argb0
Case 4 :
If row = (rows - 1) Then
argb2% = PeekInt (palette_table, PeekByte(t_color_mask_table, col) Shl 2)
Else
argb2% = PeekInt (palette_table, PeekByte(t_color_mask_table, disp + cols) Shl 2)
EndIf
argb0 = argb : argb1 = argb : argb3 = argb2
Case 8 :
If row = 0 Then
argb0% = PeekInt (palette_table, PeekByte(t_color_mask_table, (row - 1) * cols + col) Shl 2)
Else
argb0% = PeekInt (palette_table, PeekByte(t_color_mask_table, disp - cols) Shl 2)
EndIf
argb1 = argb0 : argb2 = argb : argb3 = argb
Default :
argb0 = argb : argb1 = argb : argb2 = argb : argb3 = argb
End Select
Select shade And $F0 ; alpha
Case 16 :
If col = (cols - 1) Then
alpha1% = PeekByte(alpha_table, row * cols) Shl 24
Else
alpha1% = PeekByte(alpha_table, disp + 1) Shl 24
EndIf
SetCustomColor argb0 Or alpha, argb1 Or alpha1, argb2 Or alpha1, argb3 Or alpha
Case 32 :
If col = 0 Then
alpha1% = PeekByte(alpha_table, disp + cols - 1) Shl 24
Else
alpha1% = PeekByte(alpha_table, disp - 1) Shl 24
EndIf
SetCustomColor argb0 Or alpha1, argb1 Or alpha, argb2 Or alpha, argb3 Or alpha1
Case 64 :
If row = (rows - 1) Then
alpha1% = PeekByte(alpha_table, col) Shl 24
Else
alpha1% = PeekByte(alpha_table, disp + cols) Shl 24
EndIf
SetCustomColor argb0 Or alpha, argb1 Or alpha, argb2 Or alpha1, argb3 Or alpha1
Case 128 :
If row = 0 Then
alpha1% = PeekByte(alpha_table, (row - 1) * cols + col) Shl 24
Else
alpha1% = PeekByte(alpha_table, disp - cols) Shl 24
EndIf
SetCustomColor argb0 Or alpha1, argb1 Or alpha1, argb2 Or alpha, argb3 Or alpha
Default :
SetCustomColor argb0 Or alpha, argb1 Or alpha, argb2 Or alpha, argb3 Or alpha
End Select
Else
argb% = PeekInt (palette_table, PeekByte(t_color_mask_table, disp) Shl 2) Or alpha
SetCustomColor argb, argb, argb, argb
EndIf
Else
argb% = PeekInt (palette_table, PeekByte(t_color_mask_table, disp) Shl 2) Or $FF000000
SetCustomColor argb, argb, argb, argb
EndIf
If font_size = False Then
DrawImageRectEx_ font_image, draw_X + col * char_width, draw_Y + row * char_height, w, h, char
Else
Select font_size And TXRNA_FONT_WIDTH_MULTIPLY
Case TXRNA_DOUBLE_WIDTH_ON : partwidth# = w * 0.5 : partx# = (font_select_col Mod 2) * partwidth
Case TXRNA_TRIPLE_WIDTH_ON : partwidth# = w * 0.33333333 : partx# = (font_select_col Mod 3) * partwidth
Case TXRNA_QUADRUPLE_WIDTH_ON : partwidth# = w * 0.25 : partx# = (font_select_col Mod 4) * partwidth
Default : partwidth# = w : partx# = 0
End Select
Select font_size And TXRNA_FONT_HEIGHT_MULTIPLY
Case TXRNA_DOUBLE_HEIGHT_ON : partheight# = h * 0.5 : party# = (font_select_row Mod 2) * partheight
Case TXRNA_TRIPLE_HEIGHT_ON : partheight# = h * 0.33333333 : party# = (font_select_row Mod 3) * partheight
Case TXRNA_QUADRUPLE_HEIGHT_ON : partheight# = h * 0.25 : party# = (font_select_row Mod 4) * partheight
Default : partheight# = h : party# = 0
End Select
DrawImagePart_ font_image, draw_X + col * char_width, draw_Y + row * char_height, w, h, partx, party, partwidth, partheight, char, 0
EndIf
EndIf
EndIf
EndIf
Else
curr_font% = PeekByte(font_table, disp)
If font_select <> curr_font Then
font_select% = curr_font
font_select_col% = 0
font_select_row% = row
font = curr_font And TXRNA_FONT_ID
scale_X# = char_width / Float (term\font[font]\width)
scale_Y# = char_height / Float (term\font[font]\height)
SetScale scale_X, scale_Y
w# = term\font[font]\width
h# = term\font[font]\height
draw_X# = (w * 0.5 * scale_X)
draw_Y# = (h * 0.5 * scale_Y)
font_image% = term\font[font]\image
font_size = curr_font And TXRNA_FONT_SIZE
EndIf
char% = PeekByte(text_table, disp) ; render character, no mouse over effects
If char <> 32 And (display_nulls <> False Or (display_nulls = False And char > 0)) Then
attr% = PeekByte(attr_table, disp)
If (attr And TXRNA_BLINK_SLOW_ON) > False And blink_slow_state > False Then
;skip
ElseIf (attr And TXRNA_BLINK_FAST_ON) > False And blink_fast_state > False Then
;skip
Else
If row >= start_row And row <= end_row And col >= start_col And col <= end_col Then
If special_features And PGMOD_SF_UPDATE_CHARS_ON Then
If page_mode And PGMOD_SF_UPDATE_ANGLE_ON Then
SetRotation PeekByte(angle_table, disp) * 2
EndIf
If page_mode And PGMOD_SF_UPDATE_ZOOM_ON Then
SetScale scale_X * PeekByte(x_zoom_table, disp) * 0.015625, scale_Y * PeekByte(y_zoom_table, disp) * 0.015625
EndIf
If page_mode And PGMOD_SF_UPDATE_OFFSET_ON Then
SetOrigin PeekByte(x_offset_table, disp) - 128, PeekByte(y_offset_table, disp) - 128
EndIf
If page_mode And PGMOD_SF_UPDATE_ALPHA_ON Then
alpha% = PeekByte(alpha_table, disp) Shl 24
Else
alpha% = $FF000000
EndIf
If page_mode And PGMOD_SF_SHADE_ON Then
argb% = PeekInt (palette_table, PeekByte(t_color_table, disp) Shl 2)
shade% = PeekByte(shade_table, disp)
Select shade And $0F ; color
Case 1 :
If col = (cols - 1) Then
argb1% = PeekInt (palette_table, PeekByte(t_color_table, row * cols) Shl 2)
Else
argb1% = PeekInt (palette_table, PeekByte(t_color_table, disp + 1) Shl 2)
EndIf
argb0 = argb : argb2 = argb1 : argb3 = argb
Case 2 :
If col = 0 Then
argb0% = PeekInt (palette_table, PeekByte(t_color_table, disp + cols - 1) Shl 2)
Else
argb0% = PeekInt (palette_table, PeekByte(t_color_table, disp - 1) Shl 2)
EndIf
argb1 = argb : argb2 = argb : argb3 = argb0
Case 4 :
If row = (rows - 1) Then
argb2% = PeekInt (palette_table, PeekByte(t_color_table, col) Shl 2)
Else
argb2% = PeekInt (palette_table, PeekByte(t_color_table, disp + cols) Shl 2)
EndIf
argb0 = argb : argb1 = argb : argb3 = argb2
Case 8 :
If row = 0 Then
argb0% = PeekInt (palette_table, PeekByte(t_color_table, (row - 1) * cols + col) Shl 2)
Else
argb0% = PeekInt (palette_table, PeekByte(t_color_table, disp - cols) Shl 2)
EndIf
argb1 = argb0 : argb2 = argb : argb3 = argb
Default :
argb0 = argb : argb1 = argb : argb2 = argb : argb3 = argb
End Select
Select shade And $F0 ; alpha
Case 16 :
If col = (cols - 1) Then
alpha1% = PeekByte(alpha_table, row * cols) Shl 24
Else
alpha1% = PeekByte(alpha_table, disp + 1) Shl 24
EndIf
SetCustomColor argb0 Or alpha, argb1 Or alpha1, argb2 Or alpha1, argb3 Or alpha
Case 32 :
If col = 0 Then
alpha1% = PeekByte(alpha_table, disp + cols - 1) Shl 24
Else
alpha1% = PeekByte(alpha_table, disp - 1) Shl 24
EndIf
SetCustomColor argb0 Or alpha1, argb1 Or alpha, argb2 Or alpha, argb3 Or alpha1
Case 64 :
If row = (rows - 1) Then
alpha1% = PeekByte(alpha_table, col) Shl 24
Else
alpha1% = PeekByte(alpha_table, disp + cols) Shl 24
EndIf
SetCustomColor argb0 Or alpha, argb1 Or alpha, argb2 Or alpha1, argb3 Or alpha1
Case 128 :
If row = 0 Then
alpha1% = PeekByte(alpha_table, (row - 1) * cols + col) Shl 24
Else
alpha1% = PeekByte(alpha_table, disp - cols) Shl 24
EndIf
SetCustomColor argb0 Or alpha1, argb1 Or alpha1, argb2 Or alpha, argb3 Or alpha
Default :
SetCustomColor argb0 Or alpha, argb1 Or alpha, argb2 Or alpha, argb3 Or alpha
End Select
Else
argb% = PeekInt (palette_table, PeekByte(t_color_table, disp) Shl 2) Or alpha
SetCustomColor argb, argb, argb, argb
EndIf
Else
argb% = PeekInt (palette_table, PeekByte(t_color_table, disp) Shl 2) Or $FF000000
SetCustomColor argb, argb, argb, argb
EndIf
If font_size = False Then
DrawImageRectEx_ font_image, draw_X + col * char_width, draw_Y + row * char_height, w, h, char
Else
Select font_size And TXRNA_FONT_WIDTH_MULTIPLY
Case TXRNA_DOUBLE_WIDTH_ON : partwidth# = w * 0.5 : partx# = (font_select_col Mod 2) * partwidth
Case TXRNA_TRIPLE_WIDTH_ON : partwidth# = w * 0.33333333 : partx# = (font_select_col Mod 3) * partwidth
Case TXRNA_QUADRUPLE_WIDTH_ON : partwidth# = w * 0.25 : partx# = (font_select_col Mod 4) * partwidth
Default : partwidth# = w : partx# = 0
End Select
Select font_size And TXRNA_FONT_HEIGHT_MULTIPLY
Case TXRNA_DOUBLE_HEIGHT_ON : partheight# = h * 0.5 : party# = (font_select_row Mod 2) * partheight
Case TXRNA_TRIPLE_HEIGHT_ON : partheight# = h * 0.33333333 : party# = (font_select_row Mod 3) * partheight
Case TXRNA_QUADRUPLE_HEIGHT_ON : partheight# = h * 0.25 : party# = (font_select_row Mod 4) * partheight
Default : partheight# = h : party# = 0
End Select
DrawImagePart_ font_image, draw_X + col * char_width, draw_Y + row * char_height, w, h, partx, party, partwidth, partheight, char, 0
EndIf
EndIf
EndIf
EndIf
EndIf
font_select_col = font_select_col + 1
disp = disp + 1
Next
font_select_row = font_select_row + 1
Next
; *********** strikeout and underline are to be merged into the "lines" scheme *****************
; lines_table%
; lines_mask_table%
; strikeout
argb% = PeekInt (palette_table, term\page[page_id]\strikeout_color Shl 2)
SetColor (argb Shr 16) And $ff, (argb Shr 8) And $ff, argb And $ff
Local strikeout_len% = 0
SetLineWidth Floor(char_height * 0.04) + 1
SetBlend FI_ALPHABLEND
SetAlpha term\page[page_id]\text_alpha
If special_features And PGMOD_SF_UPDATE_CHARS_ON Then
For row = start_row To end_row
For col = start_col To end_col
disp = row * cols + col
If PeekByte(item_table, disp) = mouse_saved_item Then
strikeout = (PeekByte(attr_mask_table, disp) And TXRNA_STRIKEOUT_ON)
Else
strikeout = (PeekByte(attr_table, disp) And TXRNA_STRIKEOUT_ON)
EndIf
If strikeout Then
If (page_mode And PGMOD_SF_UPDATE_ANGLE_ON) > False Then
SetRotation PeekByte(angle_table, disp) * 2
EndIf
If (page_mode And PGMOD_SF_UPDATE_ALPHA_ON) > False Then
SetAlpha PeekByte(alpha_table, disp) * 0.003921569
EndIf
If (page_mode And PGMOD_SF_UPDATE_ZOOM_ON) > False Then
SetScale PeekByte(x_zoom_table, disp) * 0.015625, PeekByte(y_zoom_table, disp) * 0.015625
EndIf
If (page_mode And PGMOD_SF_UPDATE_OFFSET_ON) > False Then
SetOrigin PeekByte(x_offset_table, disp) - 128, PeekByte(y_offset_table, disp) - 128
EndIf
SetColor (argb Shr 16) And $ff, (argb Shr 8) And $ff, argb And $ff
DrawLineSimple col * char_width, (row + 1) * char_height - char_height * 0.5, (col + 1) * char_width, (row + 1) * char_height - char_height * 0.5
EndIf
Next
Next
Else
For row = start_row To end_row
For col = start_col To end_col
disp = row * cols + col
If PeekByte(item_table, disp) = mouse_saved_item Then
strikeout = (PeekByte(attr_mask_table, disp) And TXRNA_STRIKEOUT_ON)
Else
strikeout = (PeekByte(attr_table, disp) And TXRNA_STRIKEOUT_ON)
EndIf
If strikeout Then
If strikeout_len = 0 Then draw_start_col = col
strikeout_len = strikeout_len + 1
Else
If strikeout_len > 0 Then
draw_start_X = draw_start_col * char_width
draw_start_Y = row * char_height + Float char_height * 0.5
;DrawRectSimple draw_start_X, draw_start_Y, char_width * strikeout_len, strikeout_thickness, 1
DrawLineSimple draw_start_X, draw_start_Y, draw_start_X + char_width * strikeout_len, draw_start_Y
strikeout_len = 0
EndIf
EndIf
Next
If strikeout_len > 0 Then
draw_start_X = draw_start_col * char_width
draw_start_Y = row * char_height + Float char_height * 0.5
;DrawRectSimple draw_start_X, draw_start_Y, char_width * strikeout_len, strikeout_thickness, 1
DrawLineSimple draw_start_X, draw_start_Y, draw_start_X + char_width * strikeout_len, draw_start_Y
strikeout_len = 0
EndIf
Next
EndIf
; underline
Local underline_len% = 0
SetLineWidth char_height * 0.04 + 1
argb% = PeekInt (palette_table, term\page[page_id]\underline_color Shl 2)
SetColor (argb Shr 16) And $ff, (argb Shr 8) And $ff, argb And $ff
SetBlend FI_ALPHABLEND
SetAlpha term\page[page_id]\text_alpha
If special_features And PGMOD_SF_UPDATE_CHARS_ON Then
For row = start_row To end_row
For col = start_col To end_col
disp = row * cols + col
If PeekByte(item_table, disp) = mouse_saved_item Then
underline% = (PeekByte(attr_mask_table, disp) And TXRNA_UNDERLINE_ON)
Else
underline% = (PeekByte(attr_table, disp) And TXRNA_UNDERLINE_ON)
EndIf
If underline Then
If (page_mode And PGMOD_SF_UPDATE_ANGLE_ON) > False Then
SetRotation PeekByte(angle_table, disp) * 2
EndIf
If (page_mode And PGMOD_SF_UPDATE_ALPHA_ON) > False Then
SetAlpha PeekByte(alpha_table, disp) * 0.003921569
EndIf
If (page_mode And PGMOD_SF_UPDATE_ZOOM_ON) > False Then
SetScale PeekByte(x_zoom_table, disp) * 0.015625, PeekByte(y_zoom_table, disp) * 0.015625
EndIf
If (page_mode And PGMOD_SF_UPDATE_OFFSET_ON) > False Then
SetOrigin PeekByte(x_offset_table, disp) - 128, PeekByte(y_offset_table, disp) - 128
EndIf
SetColor (argb Shr 16) And $ff, (argb Shr 8) And $ff, argb And $ff
DrawLineSimple col * char_width, (row + 1) * char_height - 1, (col + 1) * char_width, (row + 1) * char_height - 1
EndIf
Next
Next
Else
For row = start_row To end_row
For col = start_col To end_col
disp = row * cols + col
If PeekByte(item_table, disp) = mouse_saved_item Then
underline% = (PeekByte(attr_mask_table, disp) And TXRNA_UNDERLINE_ON)
Else
underline% = (PeekByte(attr_table, disp) And TXRNA_UNDERLINE_ON)
EndIf
If underline Then
If underline_len = 0 Then draw_start_col = col
underline_len = underline_len + 1
Else
If underline_len > 0 Then
draw_start_X = draw_start_col * char_width
draw_start_Y = row * char_height + char_height - 1
DrawLineSimple draw_start_X, draw_start_Y, draw_start_X + char_width * underline_len, draw_start_Y
underline_len = 0
EndIf
EndIf
Next
If underline_len > 0 Then
draw_start_X = draw_start_col * char_width
draw_start_Y = row * char_height + char_height - 1
DrawLineSimple draw_start_X, draw_start_Y, draw_start_X + char_width * underline_len, draw_start_Y
underline_len = 0
EndIf
Next
EndIf
EndDraw
EndIf
term\page[page_id]\mode = term\page[page_id]\mode And PGMOD_UPDATE_DISPLAY_OFF
If page_id > 3 Then Return
; cursor
If term\page_focus = page_id Then
col = term\page[page_id]\cursor_col
row = term\page[page_id]\cursor_row
If (term\mode And TRMOD_KEYBOARD_CURSOR_ON) > False Then
If col >= start_col And col <= end_col And row >= start_row And row <= end_row Then
If term\cursor_anim_pos > PeekByte(term\cursor_anim_char_table, 0) Then
char_pos% = 1
Else
char_pos% = term\cursor_anim_pos
EndIf
If term\cursor_anim_pos > PeekByte(term\cursor_anim_color_table, 0) Then
color_pos% = 1
Else
color_pos% = term\cursor_anim_pos
EndIf
If term\timer >= (term\cursor_timer + term\cursor_anim_delay) Then
term\cursor_timer = term\timer
term\cursor_anim_pos = term\cursor_anim_pos + 1
If term\cursor_anim_pos > PeekByte(term\cursor_anim_char_table, 0) And term\cursor_anim_pos > PeekByte(term\cursor_anim_color_table, 0) Then
term\cursor_anim_pos = 1
EndIf
EndIf
argb% = term_get_palette_color(page_id, PeekByte(term\cursor_anim_color_table%, color_pos))
StartDraw
SetColor GetRed(argb), GetGreen(argb), GetBlue(argb)
scale_X# = char_width / Float term\font[0]\width
scale_Y# = char_height / Float term\font[0]\height
draw_X# = (Float term\font[0]\width * 0.5 * scale_X)
draw_Y# = (Float term\font[0]\height * 0.5 * scale_Y)
disp = row * cols + col
If special_features <> False Then
If (page_mode And PGMOD_SF_UPDATE_ANGLE_ON) > False Then
SetRotation PeekByte(angle_table, disp) * 2
EndIf
If (page_mode And PGMOD_SF_UPDATE_ALPHA_ON) > False Then
If term\page[page_id]\text_alpha < 1.0
SetAlpha term\page[page_id]\text_alpha * term\cursor_alpha * (PeekByte(alpha_table, disp) * 0.003921569)
Else
SetAlpha term\cursor_alpha * (PeekByte(alpha_table, disp) * 0.003921569)
EndIf
Else
If term\page[page_id]\text_alpha < 1.0
SetAlpha term\page[page_id]\text_alpha * term\cursor_alpha
Else
SetAlpha term\cursor_alpha
EndIf
EndIf
If (page_mode And PGMOD_SF_UPDATE_ZOOM_ON) > False Then
SetScale scale_X * PeekByte(x_zoom_table, disp) * 0.015625, scale_Y * PeekByte(y_zoom_table, disp) * 0.015625
EndIf
If (page_mode And PGMOD_SF_UPDATE_OFFSET_ON) > False Then
SetOrigin PeekByte(x_offset_table, disp) - 128, PeekByte(y_offset_table, disp) - 128
EndIf
Else
SetScale scale_X#, scale_Y#
If term\page[page_id]\text_alpha < 1.0
SetAlpha term\page[page_id]\text_alpha * term\cursor_alpha
Else
SetAlpha term\cursor_alpha
EndIf
EndIf
DrawImageRectEx_ term\font[0]\image, draw_X + col * char_width, draw_Y + row * char_height, term\font[0]\width, term\font[0]\height, PeekByte(term\cursor_anim_char_table, char_pos)
EndDraw
EndIf
EndIf
EndIf
; mouse pointer
If (term\mode And TRMOD_MOUSE_CURSOR_ON) > False Then
col = ((term\mouse_X - X) - char_width * 0.5) / char_width
row = ((term\mouse_Y - Y) - char_height * 0.5) / char_height
If col >= start_col And col <= end_col And row >= start_row And row <= end_row Then
If term\mouse_anim_pos > PeekByte(term\mouse_anim_char_table, 0) Then
char_pos% = 1
Else
char_pos% = term\mouse_anim_pos
EndIf
If term\mouse_anim_pos > PeekByte(term\mouse_anim_color_table, 0) Then
color_pos% = 1
Else
color_pos% = term\mouse_anim_pos
EndIf
If term\timer >= (term\mouse_timer + term\mouse_anim_delay) Then
term\mouse_timer = term\timer
term\mouse_anim_pos = term\mouse_anim_pos + 1
If term\mouse_anim_pos > PeekByte(term\mouse_anim_char_table, 0) And term\mouse_anim_pos > PeekByte(term\mouse_anim_color_table, 0) Then
term\mouse_anim_pos = 1
EndIf
EndIf
StartDraw
disp = row * cols + col
argb% = term_get_palette_color(page_id, PeekByte(term\mouse_anim_color_table, color_pos))
SetColor GetRed(argb), GetGreen(argb), GetBlue(argb)
scale_X# = char_width / Float term\font[0]\width
scale_Y# = char_height / Float term\font[0]\height
draw_X# = (Float term\font[0]\width * 0.5 * scale_X)
draw_Y# = (Float term\font[0]\height * 0.5 * scale_Y)
If special_features Then
If page_mode And PGMOD_SF_UPDATE_ANGLE_ON Then
SetRotation PeekByte(angle_table, disp) * 2
EndIf
If page_mode And PGMOD_SF_UPDATE_ZOOM_ON Then
SetScale scale_X * PeekByte(x_zoom_table, disp) * 0.015625, scale_Y * PeekByte(y_zoom_table, disp) * 0.015625
EndIf
If page_mode And PGMOD_SF_UPDATE_OFFSET_ON Then
SetOrigin PeekByte(x_offset_table, disp) - 128, PeekByte(y_offset_table, disp) - 128
EndIf
Else
SetScale scale_X#, scale_Y#
EndIf
SetAlpha term\mouse_alpha
DrawImageRectEx_ term\font[0]\image, draw_X + col * char_width, draw_Y + row * char_height, term\font[0]\width, term\font[0]\height, PeekByte(term\mouse_anim_char_table, char_pos)
EndDraw
EndIf
EndIf
End Function
This routine gets executed every frame for every page displayed. When you set the scale in fastImage, actually you define the scaling values for the following FI instructions. Same with setting colors and others. So it's relatively straight forward, and really fast! When I move my code to BlitzMax, I expect much faster framerates.
Look for SetProjScale and SetProjHandle, as well as SetScale. StartDraw and EndDraw is for building a FI mesh .
=-=-=-=-=-=-=
Anyhow, back to topic plz