@@ -1136,7 +1136,15 @@ impl dtvcc_service_decoder {
1136
1136
window. is_empty = 0 ;
1137
1137
1138
1138
// Add symbol to window
1139
- window. rows [ window. pen_row as usize ] = Box :: into_raw ( Box :: new ( sym) ) ;
1139
+ if window. memory_reserved == 1 {
1140
+ unsafe {
1141
+ let ptr: * mut dtvcc_symbol =
1142
+ window. rows [ window. pen_row as usize ] . add ( window. pen_column as usize ) ;
1143
+ * ptr = sym;
1144
+ }
1145
+ } else {
1146
+ return ;
1147
+ }
1140
1148
1141
1149
// "Painting" char by pen - attribs
1142
1150
window. pen_attribs [ window. pen_row as usize ] [ window. pen_column as usize ] =
@@ -1225,6 +1233,30 @@ mod test {
1225
1233
use super :: * ;
1226
1234
use crate :: utils:: get_zero_allocated_obj;
1227
1235
1236
+ fn setup_test_decoder_with_memory ( ) -> dtvcc_service_decoder {
1237
+ let mut decoder = get_zero_allocated_obj :: < dtvcc_service_decoder > ( ) ;
1238
+
1239
+ decoder. current_window = 0 ;
1240
+ decoder. windows [ 0 ] . is_defined = 1 ;
1241
+ decoder. windows [ 0 ] . row_count = 4 ;
1242
+ decoder. windows [ 0 ] . col_count = 4 ;
1243
+ decoder. windows [ 0 ] . attribs . print_direction =
1244
+ dtvcc_window_pd:: DTVCC_WINDOW_PD_LEFT_RIGHT as i32 ;
1245
+
1246
+ let layout = Layout :: array :: < dtvcc_symbol > ( CCX_DTVCC_MAX_COLUMNS as usize ) . unwrap ( ) ;
1247
+ decoder. windows [ 0 ] . rows [ 0 ] = unsafe { alloc ( layout) } as * mut dtvcc_symbol ;
1248
+ decoder. windows [ 0 ] . memory_reserved = 1 ;
1249
+
1250
+ * decoder
1251
+ }
1252
+
1253
+ fn cleanup_test_decoder ( decoder : & mut dtvcc_service_decoder ) {
1254
+ let layout = Layout :: array :: < dtvcc_symbol > ( CCX_DTVCC_MAX_COLUMNS as usize ) . unwrap ( ) ;
1255
+ unsafe {
1256
+ dealloc ( decoder. windows [ 0 ] . rows [ 0 ] as * mut u8 , layout) ;
1257
+ }
1258
+ }
1259
+
1228
1260
// -------------------------- C0 Commands-------------------------
1229
1261
#[ test]
1230
1262
fn test_process_cr ( ) {
@@ -1378,13 +1410,7 @@ mod test {
1378
1410
1379
1411
#[ test]
1380
1412
fn test_process_p16 ( ) {
1381
- let mut decoder = get_zero_allocated_obj :: < dtvcc_service_decoder > ( ) ;
1382
- decoder. current_window = 0 ;
1383
- decoder. windows [ 0 ] . is_defined = 1 ;
1384
- decoder. windows [ 0 ] . row_count = 4 ;
1385
- decoder. windows [ 0 ] . col_count = 4 ;
1386
- decoder. windows [ 0 ] . attribs . print_direction =
1387
- dtvcc_window_pd:: DTVCC_WINDOW_PD_LEFT_RIGHT as i32 ;
1413
+ let mut decoder = setup_test_decoder_with_memory ( ) ;
1388
1414
let block = [ b'a' , b'b' ] as [ c_uchar ; 2 ] ;
1389
1415
1390
1416
decoder. process_p16 ( & block) ;
@@ -1393,10 +1419,12 @@ mod test {
1393
1419
assert_eq ! ( decoder. windows[ 0 ] . pen_column, 1 ) ;
1394
1420
unsafe {
1395
1421
assert_eq ! (
1396
- * decoder. windows[ 0 ] . rows[ 0 ] ,
1422
+ * decoder. windows[ 0 ] . rows[ 0 ] . add ( 0 ) ,
1397
1423
dtvcc_symbol:: new_16( block[ 0 ] , block[ 1 ] )
1398
1424
) ;
1399
1425
}
1426
+
1427
+ cleanup_test_decoder ( & mut decoder) ;
1400
1428
}
1401
1429
1402
1430
// -------------------------- C1 Commands-------------------------
@@ -1640,14 +1668,7 @@ mod test {
1640
1668
// -------------------------- G0, G1 and extended Commands-------------------------
1641
1669
#[ test]
1642
1670
fn test_handle_G0 ( ) {
1643
- let mut decoder = get_zero_allocated_obj :: < dtvcc_service_decoder > ( ) ;
1644
-
1645
- decoder. current_window = 0 ;
1646
- decoder. windows [ 0 ] . is_defined = 1 ;
1647
- decoder. windows [ 0 ] . row_count = 4 ;
1648
- decoder. windows [ 0 ] . col_count = 4 ;
1649
- decoder. windows [ 0 ] . attribs . print_direction =
1650
- dtvcc_window_pd:: DTVCC_WINDOW_PD_LEFT_RIGHT as i32 ;
1671
+ let mut decoder = setup_test_decoder_with_memory ( ) ;
1651
1672
1652
1673
// Case: block[0] == 0x7F
1653
1674
let block = [ 0x7F , 0x61 ] ;
@@ -1657,7 +1678,7 @@ mod test {
1657
1678
assert_eq ! ( decoder. windows[ 0 ] . pen_column, 1 ) ;
1658
1679
unsafe {
1659
1680
assert_eq ! (
1660
- decoder. windows[ 0 ] . rows[ 0 ] . read( ) . sym,
1681
+ decoder. windows[ 0 ] . rows[ 0 ] . add ( 0 ) . read( ) . sym,
1661
1682
CCX_DTVCC_MUSICAL_NOTE_CHAR
1662
1683
) ;
1663
1684
}
@@ -1668,20 +1689,15 @@ mod test {
1668
1689
1669
1690
assert_eq ! ( return_value, 1 ) ;
1670
1691
unsafe {
1671
- assert_eq ! ( decoder. windows[ 0 ] . rows[ 0 ] . read( ) . sym, 96 ) ;
1692
+ assert_eq ! ( decoder. windows[ 0 ] . rows[ 0 ] . add ( 1 ) . read( ) . sym, 96 ) ;
1672
1693
}
1694
+
1695
+ cleanup_test_decoder ( & mut decoder) ;
1673
1696
}
1674
1697
1675
1698
#[ test]
1676
1699
fn test_handle_G1 ( ) {
1677
- let mut decoder = get_zero_allocated_obj :: < dtvcc_service_decoder > ( ) ;
1678
-
1679
- decoder. current_window = 0 ;
1680
- decoder. windows [ 0 ] . is_defined = 1 ;
1681
- decoder. windows [ 0 ] . row_count = 4 ;
1682
- decoder. windows [ 0 ] . col_count = 4 ;
1683
- decoder. windows [ 0 ] . attribs . print_direction =
1684
- dtvcc_window_pd:: DTVCC_WINDOW_PD_LEFT_RIGHT as i32 ;
1700
+ let mut decoder = setup_test_decoder_with_memory ( ) ;
1685
1701
1686
1702
let block = [ 0x7F , 0x61 ] ;
1687
1703
let return_value = decoder. handle_G1 ( & block) ;
@@ -1690,20 +1706,15 @@ mod test {
1690
1706
assert_eq ! ( decoder. windows[ 0 ] . pen_row, 0 ) ;
1691
1707
assert_eq ! ( decoder. windows[ 0 ] . pen_column, 1 ) ;
1692
1708
unsafe {
1693
- assert_eq ! ( decoder. windows[ 0 ] . rows[ 0 ] . read( ) . sym, 0x7F ) ;
1709
+ assert_eq ! ( decoder. windows[ 0 ] . rows[ 0 ] . add ( 0 ) . read( ) . sym, 0x7F ) ;
1694
1710
}
1711
+
1712
+ cleanup_test_decoder ( & mut decoder) ;
1695
1713
}
1696
1714
1697
1715
#[ test]
1698
1716
fn test_handle_extended_char ( ) {
1699
- let mut decoder = get_zero_allocated_obj :: < dtvcc_service_decoder > ( ) ;
1700
-
1701
- decoder. current_window = 0 ;
1702
- decoder. windows [ 0 ] . is_defined = 1 ;
1703
- decoder. windows [ 0 ] . row_count = 4 ;
1704
- decoder. windows [ 0 ] . col_count = 4 ;
1705
- decoder. windows [ 0 ] . attribs . print_direction =
1706
- dtvcc_window_pd:: DTVCC_WINDOW_PD_LEFT_RIGHT as i32 ;
1717
+ let mut decoder = setup_test_decoder_with_memory ( ) ;
1707
1718
1708
1719
// 0..=0x1F
1709
1720
let return_value = decoder. handle_extended_char ( & [ 0x1A , 0x61 ] ) ;
@@ -1715,7 +1726,7 @@ mod test {
1715
1726
assert_eq ! ( decoder. windows[ 0 ] . pen_row, 0 ) ;
1716
1727
assert_eq ! ( decoder. windows[ 0 ] . pen_column, 1 ) ;
1717
1728
unsafe {
1718
- assert_eq ! ( decoder. windows[ 0 ] . rows[ 0 ] . read( ) . sym, 0x5 ) ;
1729
+ assert_eq ! ( decoder. windows[ 0 ] . rows[ 0 ] . add ( 0 ) . read( ) . sym, 0x5 ) ;
1719
1730
}
1720
1731
1721
1732
// 0x80..=0x9F
@@ -1728,8 +1739,10 @@ mod test {
1728
1739
assert_eq ! ( decoder. windows[ 0 ] . pen_row, 0 ) ;
1729
1740
assert_eq ! ( decoder. windows[ 0 ] . pen_column, 2 ) ;
1730
1741
unsafe {
1731
- assert_eq ! ( decoder. windows[ 0 ] . rows[ 0 ] . read( ) . sym, 0x20 ) ;
1742
+ assert_eq ! ( decoder. windows[ 0 ] . rows[ 0 ] . add ( 1 ) . read( ) . sym, 0x20 ) ;
1732
1743
}
1744
+
1745
+ cleanup_test_decoder ( & mut decoder) ;
1733
1746
}
1734
1747
1735
1748
#[ test]
@@ -1754,13 +1767,20 @@ mod test {
1754
1767
decoder. windows [ 0 ] . attribs . print_direction =
1755
1768
dtvcc_window_pd:: DTVCC_WINDOW_PD_LEFT_RIGHT as i32 ;
1756
1769
1770
+ let layout = Layout :: array :: < dtvcc_symbol > ( CCX_DTVCC_MAX_COLUMNS as usize ) . unwrap ( ) ;
1771
+ decoder. windows [ 0 ] . rows [ 0 ] = unsafe { alloc ( layout) } as * mut dtvcc_symbol ;
1772
+ decoder. windows [ 0 ] . memory_reserved = 1 ;
1773
+
1757
1774
decoder. process_character ( sym) ;
1758
1775
1759
1776
// Check changes
1760
1777
assert_eq ! ( decoder. windows[ 0 ] . pen_row, 0 ) ;
1761
1778
assert_eq ! ( decoder. windows[ 0 ] . pen_column, 1 ) ;
1762
1779
unsafe {
1763
- assert_eq ! ( decoder. windows[ 0 ] . rows[ 0 ] . read( ) , dtvcc_symbol:: new( 0x41 ) ) ;
1780
+ assert_eq ! (
1781
+ decoder. windows[ 0 ] . rows[ 0 ] . add( 0 ) . read( ) ,
1782
+ dtvcc_symbol:: new( 0x41 )
1783
+ ) ;
1764
1784
}
1765
1785
}
1766
1786
}
0 commit comments