summaryrefslogtreecommitdiff
Diffstat
-rw-r--r--src/dtvcc.c189
-rw-r--r--src/dtvcc.h1
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;