-rw-r--r-- | src/dtvcc.c | 189 | ||||
-rw-r--r-- | src/dtvcc.h | 1 |
2 files changed, 124 insertions, 66 deletions
diff --git a/src/dtvcc.c b/src/dtvcc.c index c015b2c..33c65b8 100644 --- a/src/dtvcc.c +++ b/src/dtvcc.c @@ -2373,9 +2373,9 @@ dtvcc_caption_window (struct dtvcc_service * ds) continue; if (!ds->window[window_id].visible) continue; - if (DIR_BOTTOM_TOP + /*if (DIR_BOTTOM_TOP != ds->window[window_id].style.scroll_direction) - continue; + continue; */ if (ds->window[window_id].priority < max_priority) { dw = &ds->window[window_id]; max_priority = ds->window[window_id].priority; @@ -2463,16 +2463,62 @@ dtvcc_put_char (struct dtvcc_decoder * dc, return FALSE; } - row = dw->curr_row; column = dw->curr_column; - - /* Add row column lock support */ - /*AM_DEBUG(0, "put_char before ds %d cl %d rl %d col %d row %d col_curr %d row_curr %d win_col %d win_row %d", - ds->id, dw->column_lock, dw->row_lock, column, row, dw->curr_column, dw->curr_row, - dw->column_count, dw->row_count); */ + row = dw->curr_row; /* FIXME how should we handle TEXT_TAG_NOT_DISPLAYABLE? */ + /* Add row column lock support */ + switch (dw->style.print_direction) { + case DIR_LEFT_RIGHT: + if (column >= dw->column_count) + { + if (dw->column_lock == 1) + { + if (dw->row_lock == 0) + { + column = 0; + row++; + if (row >= dw->row_count) + { + // row moves up + } + } + else + { + return TRUE; + } + } + else + { + if (column < 32) + { + if (dw->column_no_lock_length < column + 1) + dw->column_no_lock_length = column + 1; + } + else + { + if (dw->row_lock == 1) + return TRUE; + else + { + column = 0; + row++; + if (row >= dw->row_count) + { + // row moves up + } + } + } + } + } + break; + case DIR_RIGHT_LEFT: + case DIR_TOP_BOTTOM: + case DIR_BOTTOM_TOP: + break; + } + dw->buffer[row][column] = c; dw->pen[row][column] = dw->curr_pen.style; if (c == 0x1020 || c == 0x1021) @@ -2493,64 +2539,28 @@ dtvcc_put_char (struct dtvcc_decoder * dc, dw->streamed &= ~(1 << row); if (!cc_timestamp_isset (&dw->timestamp_c0)) dw->timestamp_c0 = ds->timestamp; -#if 1 - if (++column >= dw->column_count) - return TRUE; -#else - column ++; - /* We handle row column lock here */ - if (column >= dw->column_count) - { - if (dw->column_lock == 1) - { - if (dw->row_lock == 1) - { - column = dw->column_count; - dw->buffer[row][column] = 0; - } - } - else - { - if (column >= CC_MAX_COLUMNS) - { - column = CC_MAX_COLUMNS; - dw->buffer[row][column] = 0; - } - else - { - dw->column_count = column + 1; - } - } - } - else - { - column ++; - } -#endif + ++column; break; case DIR_RIGHT_LEFT: dw->streamed &= ~(1 << row); if (!cc_timestamp_isset (&dw->timestamp_c0)) dw->timestamp_c0 = ds->timestamp; - if (column-- <= 0) - return TRUE; + column--; break; case DIR_TOP_BOTTOM: dw->streamed &= ~(1 << column); if (!cc_timestamp_isset (&dw->timestamp_c0)) dw->timestamp_c0 = ds->timestamp; - if (++row >= dw->row_count) - return TRUE; + ++row; break; case DIR_BOTTOM_TOP: dw->streamed &= ~(1 << column); if (!cc_timestamp_isset (&dw->timestamp_c0)) dw->timestamp_c0 = ds->timestamp; - if (row-- <= 0) - return TRUE; + row--; break; } @@ -2909,6 +2919,7 @@ dtvcc_define_window (struct dtvcc_decoder * dc, c = buf[4]; dw->row_count = (c & 15) + 1; dw->column_count = column_count_m1 + 1; + dw->column_no_lock_length = 0; c = buf[6]; window_style_id = (c >> 3) & 7; @@ -3028,10 +3039,21 @@ dtvcc_carriage_return (struct dtvcc_decoder * dc, switch (dw->style.scroll_direction) { case DIR_LEFT_RIGHT: - dw->curr_row = 0; - if (column > 0) { - dw->curr_column = column - 1; - break; + if (dw->style.print_direction == DIR_BOTTOM_TOP) + { + dw->curr_row = dw->row_count - 1; + if (column > 0) { + dw->curr_column = column - 1; + break; + } + } + else + { + dw->curr_row = 0; + if (column > 0) { + dw->curr_column = column - 1; + break; + } } dw->streamed = (dw->streamed << 1) & ~(1 << dw->column_count); @@ -3049,10 +3071,21 @@ dtvcc_carriage_return (struct dtvcc_decoder * dc, break; case DIR_RIGHT_LEFT: - dw->curr_row = 0; - if (column + 1 < dw->row_count) { - dw->curr_column = column + 1; - break; + if (dw->style.print_direction == DIR_BOTTOM_TOP) + { + dw->curr_row = dw->row_count - 1; + if (column + 1 < dw->row_count) { + dw->curr_column = column + 1; + break; + } + } + else + { + dw->curr_row = 0; + if (column + 1 < dw->row_count) { + dw->curr_column = column + 1; + break; + } } dw->streamed >>= 1; for (row = 0; row < dw->row_count; ++row) { @@ -3069,10 +3102,22 @@ dtvcc_carriage_return (struct dtvcc_decoder * dc, break; case DIR_TOP_BOTTOM: - dw->curr_column = 0; - if (row > 0) { - dw->curr_row = row - 1; - break; + if (dw->style.print_direction == DIR_RIGHT_LEFT) + { + AM_DEBUG(0, "CR: print_r_l cur_col %d row %d", dw->curr_column, dw->curr_row); + dw->curr_column = dw->column_count - 1; + if (row > 0) { + dw->curr_row = row - 1; + break; + } + } + else + { + dw->curr_column = 0; + if (row > 0) { + dw->curr_row = row - 1; + break; + } } dw->streamed = (dw->streamed << 1) & ~(1 << dw->row_count); @@ -3085,10 +3130,21 @@ dtvcc_carriage_return (struct dtvcc_decoder * dc, break; case DIR_BOTTOM_TOP: - dw->curr_column = 0; - if (row + 1 < dw->row_count) { - dw->curr_row = row + 1; - break; + if (dw->style.print_direction == DIR_RIGHT_LEFT) + { + dw->curr_column = dw->column_count - 1;; + if (row + 1 < dw->row_count) { + dw->curr_row = row + 1; + break; + } + } + else + { + dw->curr_column = 0; + if (row + 1 < dw->row_count) { + dw->curr_row = row + 1; + break; + } } dw->streamed >>= 1; memmove (&dw->buffer[0], &dw->buffer[1], @@ -3568,7 +3624,7 @@ dtvcc_decode_packet (struct dtvcc_decoder * dc, /* sequence_number [2], packet_size_code [6], packet_data [n * 8] */ -#if 0 +#if 1 if (dc->next_sequence_number >= 0 && 0 != ((dc->packet[0] ^ dc->next_sequence_number) & 0xC0)) { dtvcc_reset (dc); @@ -3609,7 +3665,7 @@ dtvcc_decode_packet (struct dtvcc_decoder * dc, (null_fill [2], extended_service_number [6]), (Block_data [n * 8]) */ - c = dc->packet[i]; + c = dc->packet[i]; service_number = (c & 0xE0) >> 5; //printf("srv %d\n", service_number); @@ -3619,6 +3675,7 @@ dtvcc_decode_packet (struct dtvcc_decoder * dc, if (0 == service_number) { /* NULL Service Block Header, no more data in this Caption Channel Packet. */ + dc->next_sequence_number = -1; break; } diff --git a/src/dtvcc.h b/src/dtvcc.h index 83b0ef2..32a7a7a 100644 --- a/src/dtvcc.h +++ b/src/dtvcc.h @@ -363,6 +363,7 @@ struct dtvcc_window { vbi_bool row_lock; vbi_bool column_lock; + unsigned int column_no_lock_length; unsigned int curr_row; unsigned int curr_column; |