summaryrefslogtreecommitdiff
authoryan yan <yan.yan@amlogic.com>2018-01-03 06:32:29 (GMT)
committer yan yan <yan.yan@amlogic.com>2018-01-03 06:34:02 (GMT)
commit24c82515260721d651ec53844376fdbba3ac286c (patch)
tree5d33b5e4abe69733fc245db977d632deb4f05d7a
parent8de4e01c43f94693b5eb7fa844346b798f122a3a (diff)
downloadlibzvbi-24c82515260721d651ec53844376fdbba3ac286c.zip
libzvbi-24c82515260721d651ec53844376fdbba3ac286c.tar.gz
libzvbi-24c82515260721d651ec53844376fdbba3ac286c.tar.bz2
DTVCC: Support Row lock and column lock [2/2]
PD# 154387 Change-Id: Icc524b90e50fc379f8ecc6be359308320b056c49
Diffstat
-rw-r--r--src/dtvcc.c74
-rw-r--r--src/dtvcc.h1
2 files changed, 58 insertions, 17 deletions
diff --git a/src/dtvcc.c b/src/dtvcc.c
index 7b4b283..4a7d9f2 100644
--- a/src/dtvcc.c
+++ b/src/dtvcc.c
@@ -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,33 +2539,26 @@ dtvcc_put_char (struct dtvcc_decoder * dc,
dw->streamed &= ~(1 << row);
if (!cc_timestamp_isset (&dw->timestamp_c0))
dw->timestamp_c0 = ds->timestamp;
- if (++column >= dw->column_count)
- return TRUE;
+ ++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;
- break;
+ column--;
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;
- break;
+ ++row;
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;
- break;
+ row--;
}
dw->curr_row = row;
@@ -2877,6 +2916,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;
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;