From 24c82515260721d651ec53844376fdbba3ac286c Mon Sep 17 00:00:00 2001 From: yan yan Date: Wed, 03 Jan 2018 06:32:29 +0000 Subject: DTVCC: Support Row lock and column lock [2/2] PD# 154387 Change-Id: Icc524b90e50fc379f8ecc6be359308320b056c49 --- 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; -- cgit