MythTV master
cc708window.cpp
Go to the documentation of this file.
1// -*- Mode: c++ -*-
2// Copyright (c) 2003-2005, Daniel Kristjansson
3
4#include <cassert>
5#include <algorithm>
6
9
10/************************************************************************
11
12 FCC Addons to EIA-708.
13
14 * Decoders must support the standard, large, and small caption sizes
15 and must allow the caption provider to choose a size and allow the
16 viewer to choose an alternative size.
17
18 * Decoders must support the eight fonts listed in EIA-708. Caption
19 providers may specify 1 of these 8 font styles to be used to write
20 caption text. Decoders must include the ability for consumers to
21 choose among the eight fonts. The decoder must display the font
22 chosen by the caption provider unless the viewer chooses a different
23 font.
24
25 * Decoders must implement the same 8 character background colors
26 as those that Section 9 requires be implemented for character
27 foreground (white, black, red, green, blue, yellow, magenta and cyan).
28
29 * Decoders must implement options for altering the appearance of
30 caption character edges.
31
32 * Decoders must display the color chosen by the caption provider,
33 and must allow viewers to override the foreground and/or background
34 color chosen by the caption provider and select alternate colors.
35
36 * Decoders must be capable of decoding and processing data for the
37 six standard services, but information from only one service need
38 be displayed at a given time.
39
40 * Decoders must include an option that permits a viewer to choose a
41 setting that will display captions as intended by the caption
42 provider (a default). Decoders must also include an option that
43 allows a viewer's chosen settings to remain until the viewer
44 chooses to alter these settings, including during periods when
45 the television is turned off.
46
47 * Cable providers and other multichannel video programming
48 distributors must transmit captions in a format that will be
49 understandable to this decoder circuitry in digital cable
50 television sets when transmitting programming to digital
51 television devices.
52
53******************************************************************************/
54
59
63
70
75
79
83
92
99
102
107
108void CC708Window::DefineWindow(int _priority, bool _visible,
109 int _anchor_point, int _relative_pos,
110 int _anchor_vertical, int _anchor_horizontal,
111 int _row_count, int _column_count,
112 int _row_lock, int _column_lock,
113 int _pen_style, int _window_style)
114{
115 // The DefineWindow command may be sent frequently to allow a
116 // caption decoder just tuning in to get in synch quickly.
117 // Usually the row_count and column_count are unchanged, but it is
118 // possible to add or remove rows or columns. Due to the
119 // one-dimensional row-major representation of characters, if the
120 // number of columns is changed, a new array must be created and
121 // the old characters copied in. If only the number of rows
122 // decreases, the array can be left unchanged. If only the number
123 // of rows increases, the old characters can be copied into the
124 // new character array directly without any index translation.
125 QMutexLocker locker(&m_lock);
126
127 _row_count++;
128 _column_count++;
129
130 m_priority = _priority;
131 SetVisible(_visible);
132 m_anchor_point = _anchor_point;
133 m_relative_pos = _relative_pos;
134 m_anchor_vertical = _anchor_vertical;
135 m_anchor_horizontal = _anchor_horizontal;
136 m_row_lock = _row_lock;
137 m_column_lock = _column_lock;
138
139 if ((!_pen_style && !GetExists()) || _pen_style)
140 m_pen.SetPenStyle(_pen_style ? _pen_style : 1);
141
142 if ((!_window_style && !GetExists()) || _window_style)
143 SetWindowStyle(_window_style ? _window_style : 1);
144
145 Resize(_row_count, _column_count);
146 m_row_count = _row_count;
147 m_column_count = _column_count;
149
150 SetExists(true);
151}
152
153// Expand the internal array of characters if necessary to accommodate
154// the current values of row_count and column_count. Any new (space)
155// characters exposed are given the current pen attributes. At the
156// end, row_count and column_count are NOT updated.
157void CC708Window::Resize(uint new_rows, uint new_columns)
158{
159 // Validate arguments.
160 if (new_rows == 0 || new_columns == 0)
161 {
162 LOG(VB_VBI,
163 LOG_DEBUG,
164 QString("Invalid arguments to Resize: %1 rows x %2 columns")
165 .arg(new_rows).arg(new_columns));
166 return;
167 }
168
169 if (!GetExists() || m_text == nullptr)
170 {
173 }
174
175 //We need to shrink Rows, at times Scroll (row >= (int)m_true_row_count)) fails and we
176 // Don't scroll caption line resulting in overwriting the same.
177 // Ex: [CAPTIONING FUNDED BY CBS SPORTS
178 // DIVISION]NG FUNDED BY CBS SPORTS
179
180 if (new_rows < m_true_row_count || new_columns < m_true_column_count)
181 {
182 delete [] m_text;
183 m_text = new CC708Character [static_cast<size_t>(new_rows) * new_columns];
184 m_true_row_count = new_rows;
185 m_true_column_count = new_columns;
186 m_pen.m_row = 0;
187 m_pen.m_column = 0;
188 Clear();
189 SetChanged();
190 SetExists(true);
191 LOG(VB_VBI,
192 LOG_DEBUG,
193 QString("Shrinked nr %1 nc %2 rc %3 cc %4 tr %5 tc %6").arg(new_rows)
194 .arg(new_columns) .arg(m_row_count) .arg(m_column_count)
196 return;
197 }
198
199 if (new_rows > m_true_row_count || new_columns > m_true_column_count)
200 {
201 new_rows = std::max(new_rows, m_true_row_count);
202 new_columns = std::max(new_columns, m_true_column_count);
203
204 // Expand the array if the new size exceeds the current capacity
205 // in either dimension.
206 auto *new_text = new CC708Character[static_cast<size_t>(new_rows) * new_columns];
207 m_pen.m_column = 0;
208 m_pen.m_row = 0;
209 uint i = 0;
210 for (i = 0; m_text && i < m_row_count; ++i)
211 {
212 uint j = 0;
213 for (j = 0; j < m_column_count; ++j)
214 new_text[(i * new_columns) + j] = m_text[(i * m_true_column_count) + j];
215 for (; j < new_columns; ++j)
216 new_text[(i * new_columns) + j].m_attr = m_pen.m_attr;
217 }
218 for (; i < new_rows; ++i)
219 for (uint j = 0; j < new_columns; ++j)
220 new_text[(i * new_columns) + j].m_attr = m_pen.m_attr;
221
222 delete [] m_text;
223 m_text = new_text;
224 m_true_row_count = new_rows;
225 m_true_column_count = new_columns;
226 SetChanged();
227 }
228 else if (new_rows > m_row_count || new_columns > m_column_count)
229 {
230 // At least one dimension expanded into existing space, so
231 // those newly exposed characters must be cleared.
232 for (uint i = 0; i < m_row_count; ++i)
233 {
234 for (uint j = m_column_count; j < new_columns; ++j)
235 {
236 m_text[(i * m_true_column_count) + j].m_character = ' ';
237 m_text[(i * m_true_column_count) + j].m_attr = m_pen.m_attr;
238 }
239 }
240 for (uint i = m_row_count; i < new_rows; ++i)
241 {
242 for (uint j = 0; j < new_columns; ++j)
243 {
244 m_text[(i * m_true_column_count) + j].m_character = ' ';
245 m_text[(i * m_true_column_count) + j].m_attr = m_pen.m_attr;
246 }
247 }
248 SetChanged();
249 }
250 SetExists(true);
251}
252
253
255{
256 QMutexLocker locker(&m_lock);
257
258 SetExists(false);
261
262 if (m_text)
263 {
264 delete [] m_text;
265 m_text = nullptr;
266 }
267}
268
270{
271 QMutexLocker locker(&m_lock);
272
273 if (!GetExists() || !m_text)
274 return;
275
276 for (uint i = 0; i < m_true_row_count * m_true_column_count; i++)
277 {
278 m_text[i].m_character = QChar(' ');
280 }
281 SetChanged();
282}
283
285{
286 assert(GetExists());
287 assert(m_text);
291}
292
293std::vector<CC708String*> CC708Window::GetStrings(void) const
294{
295 // Note on implementation. In many cases, one line will be
296 // computed as the concatenation of 3 strings: a prefix of spaces
297 // with a default foreground color, followed by the actual text in
298 // a specific foreground color, followed by a suffix of spaces
299 // with a default foreground color. This leads to 3
300 // FormattedTextChunk objects when 1 would suffice. The prefix
301 // and suffix ultimately get optimized away, but not before a
302 // certain amount of unnecessary work.
303 //
304 // This can be solved with two steps. First, suppress a format
305 // change when only non-underlined spaces have been seen so far.
306 // (Background changes can be ignored because the subtitle code
307 // suppresses leading spaces.) Second, for trailing
308 // non-underlined spaces, either suppress a format change, or
309 // avoid creating such a string when it appears at the end of the
310 // row. (We can't do the latter for an initial string of spaces,
311 // because the spaces are needed for coordinate calculations.)
312 QMutexLocker locker(&m_lock);
313
314 std::vector<CC708String*> list;
315
316 CC708String *cur = nullptr;
317
318 if (!m_text)
319 return list;
320
321 bool createdNonblankStrings = false;
322 std::array<QChar,k708MaxColumns> chars {};
323 for (uint j = 0; j < m_row_count; j++)
324 {
325 bool inLeadingSpaces = true;
326 bool inTrailingSpaces = true;
327 bool createdString = false;
328 uint strStart = 0;
329 for (uint i = 0; i < m_column_count; i++)
330 {
331 CC708Character &chr = m_text[(j * m_true_column_count) + i];
332 chars[i] = chr.m_character;
333 if (!cur)
334 {
335 cur = new CC708String;
336 cur->m_x = i;
337 cur->m_y = j;
338 cur->m_attr = chr.m_attr;
339 strStart = i;
340 }
341 bool isDisplayable = (chr.m_character != ' ' || chr.m_attr.m_underline);
342 if (inLeadingSpaces && isDisplayable)
343 {
344 cur->m_attr = chr.m_attr;
345 inLeadingSpaces = false;
346 }
347 if (isDisplayable)
348 {
349 inTrailingSpaces = false;
350 }
351 if (cur->m_attr != chr.m_attr)
352 {
353 cur->m_str = QString(&chars[strStart], i - strStart);
354 list.push_back(cur);
355 createdString = true;
356 createdNonblankStrings = true;
357 inTrailingSpaces = true;
358 cur = nullptr;
359 i--;
360 }
361 }
362 if (cur)
363 {
364 // If the entire string is spaces, we still may need to
365 // create a chunk to preserve spacing between lines.
366 if (!inTrailingSpaces || !createdString)
367 {
368 bool allSpaces = (inLeadingSpaces || inTrailingSpaces);
369 int length = allSpaces ? 0 : m_column_count - strStart;
370 if (length)
371 createdNonblankStrings = true;
372 cur->m_str = QString(&chars[strStart], length);
373 list.push_back(cur);
374 }
375 else
376 {
377 delete cur;
378 }
379 cur = nullptr;
380 }
381 }
382 if (!createdNonblankStrings)
383 list.clear();
384 return list;
385}
386
387void CC708Window::DisposeStrings(std::vector<CC708String*> &strings)
388{
389 while (!strings.empty())
390 {
391 delete strings.back();
392 strings.pop_back();
393 }
394}
395
397{
398 static const std::array<const uint,8> style2justify
399 {
402 };
403
404 if ((style < 1) || (style > 7))
405 return;
406
408 m_fill_opacity = ((2 == style) || (5 == style)) ?
416 m_effect_speed = 0;
417 m_justify = style2justify[style];
418 m_word_wrap = (style > 3) && (style < 7) ? 1 : 0;
419
421 // It appears that ths is missused by broadcasters (FOX -- Dollhouse)
424}
425
427{
428 if (!GetExists())
429 return;
430
431 QString dbg_char = ch;
432 if (ch.toLatin1() < 32)
433 dbg_char = QString("0x%1").arg( (int)ch.toLatin1(), 0,16);
434
435 if (!IsPenValid())
436 {
437 LOG(VB_VBI, LOG_DEBUG,
438 QString("AddChar(%1) at (c %2, r %3) INVALID win(%4,%5)")
439 .arg(dbg_char).arg(m_pen.m_column).arg(m_pen.m_row)
441 return;
442 }
443
444 // CEA-708-D Section 7.1.4, page 30
445 // Carriage Return (CR) moves the current entry point to the beginning of the next row. If the next row is
446 // below the visible window, the window "rolls up" as defined in CEA-608-E Section 7.4. If the next row is
447 // within the visible window and contains text, the cursor is moved to the beginning of the row, but the pre-
448 // existing text is not erased.
449 if (ch.toLatin1() == 0x0D) // C0::CR
450 {
451 Scroll(m_pen.m_row + 1, 0);
452 SetChanged();
453 return;
454 }
455
456 QMutexLocker locker(&m_lock);
457
458 // CEA-708-D Section 7.1.4, page 30
459 // Horizontal Carriage Return (HCR) moves the current entry point to the beginning of the current row
460 // without row increment or decrement. It shall erase all text on the row.
461 if (ch.toLatin1() == 0x0E) // C0::HCR
462 {
464 for (uint c = 0; c < m_column_count; c++)
465 {
466 m_text[c + p].m_attr = m_pen.m_attr;
467 m_text[c + p].m_character = QChar(' ');
468 }
469 m_pen.m_column = 0;
471 SetChanged();
472 return;
473 }
474
475 // Backspace
476 if (ch.toLatin1() == 0x08)
477 {
479 CC708Character& chr = GetCCChar();
480 chr.m_attr = m_pen.m_attr;
481 chr.m_character = QChar(' ');
482 SetChanged();
483 return;
484 }
485
486 // CEA-708-D Section 7.1.4, page 30
487 // Form Feed (FF) erases all text in the window and moves the cursor to the first character position in the
488 // window (0,0).
489 if (ch.toLatin1() == 0x0c) // C0::FF
490 {
491 Clear();
492 SetPenLocation(0,0);
493 SetChanged();
494 return;
495 }
496
497 CC708Character& chr = GetCCChar();
498 chr.m_attr = m_pen.m_attr;
499 chr.m_character = ch;
500 int c = m_pen.m_column;
501 int r = m_pen.m_row;
503 SetChanged();
504
505 LOG(VB_VBI, LOG_DEBUG, QString("AddChar(%1) at (c %2, r %3) -> (%4,%5)")
506 .arg(dbg_char).arg(c).arg(r).arg(m_pen.m_column).arg(m_pen.m_row));
507}
508
509void CC708Window::Scroll(int row, int col)
510{
511 QMutexLocker locker(&m_lock);
512
514 return;
515
517 (row >= (int)m_true_row_count))
518 {
519 for (uint j = 0; j < m_true_row_count - 1; j++)
520 {
521 for (uint i = 0; i < m_true_column_count; i++)
522 m_text[(m_true_column_count * j) + i] =
523 m_text[(m_true_column_count * (j+1)) + i];
524 }
525 //uint colsz = m_true_column_count * sizeof(CC708Character);
526 //memmove(m_text, m_text + colsz, colsz * (m_true_row_count - 1));
527
528 CC708Character tmp(*this);
529 for (uint i = 0; i < m_true_column_count; i++)
531
533 SetChanged();
534 }
535 else
536 {
537 m_pen.m_row = row;
538 }
539 // TODO implement other 3 scroll directions...
540
541 m_pen.m_column = col;
542}
543
545{
546 // TODO: Scroll direction and up/down printing,
547 // and word wrap not handled yet...
548 int new_column = m_pen.m_column;
549 int new_row = m_pen.m_row;
550
551 new_column += (m_print_dir == k708DirLeftToRight) ? +1 : 0;
552 new_column += (m_print_dir == k708DirRightToLeft) ? -1 : 0;
553 new_row += (m_print_dir == k708DirTopToBottom) ? +1 : 0;
554 new_row += (m_print_dir == k708DirBottomToTop) ? -1 : 0;
555
556#if 0
557 LOG(VB_VBI, LOG_DEBUG, QString("IncrPen dir%1: (c %2, r %3) -> (%4,%5)")
558 .arg(m_print_dir).arg(m_pen.m_column).arg(m_pen.m_row)
559 .arg(new_column).arg(new_row));
560#endif
561
563 {
564 // basic wrapping for l->r, r->l languages
565 if (!m_row_lock && m_column_lock && (new_column >= (int)m_true_column_count))
566 {
567 new_column = 0;
568 new_row += 1;
569 }
570 else if (!m_row_lock && m_column_lock && (new_column < 0))
571 {
572 new_column = (int)m_true_column_count - 1;
573 new_row -= 1;
574 }
575 Scroll(new_row, new_column);
576 }
577 else
578 {
579 m_pen.m_column = std::max(new_column, 0);
580 m_pen.m_row = std::max(new_row, 0);
581 }
582 // TODO implement other 2 scroll directions...
583
585}
586
588{
589 // TODO: Scroll direction and up/down printing,
590 // and word wrap not handled yet...
591 int new_column = m_pen.m_column;
592 int new_row = m_pen.m_row;
593
594 new_column -= (m_print_dir == k708DirLeftToRight) ? +1 : 0;
595 new_column -= (m_print_dir == k708DirRightToLeft) ? -1 : 0;
596 new_row -= (m_print_dir == k708DirTopToBottom) ? +1 : 0;
597 new_row -= (m_print_dir == k708DirBottomToTop) ? -1 : 0;
598
599#if 0
600 LOG(VB_VBI, LOG_DEBUG, QString("DecrPen dir%1: (c %2, r %3) -> (%4,%5)")
601 .arg(m_print_dir).arg(m_pen.m_column).arg(m_pen.m_row)
602 .arg(new_column).arg(new_row));
603#endif
604
606 {
607 // basic wrapping for l->r, r->l languages
608 if (!m_row_lock && m_column_lock && (new_column >= (int)m_true_column_count))
609 {
610 new_column = 0;
611 new_row += 1;
612 }
613 else if (!m_row_lock && m_column_lock && (new_column < 0))
614 {
615 new_column = (int)m_true_column_count - 1;
616 new_row -= 1;
617 }
618 Scroll(new_row, new_column);
619 }
620 else
621 {
622 m_pen.m_column = std::max(new_column, 0);
623 m_pen.m_row = std::max(new_row, 0);
624 }
625 // TODO implement other 2 scroll directions...
626
628}
629
631{
632 //Clear current row in case we are reseting Pen Location.
633 LOG(VB_VBI,
634 LOG_DEBUG,
635 QString("SetPenLocation nr %1 nc %2 rc %3 cc %4 tr %5 tc %6").arg(row)
636 .arg(column).arg(m_row_count).arg(m_column_count).arg(m_true_row_count)
637 .arg(m_true_column_count));
638 if(0 == row)
639 {
640 Scroll(m_true_row_count, column);
641 m_pen.m_row = row;
642 }
643 else
644 {
645 Scroll(row, column);
646 }
648}
649
651{
652 // basic limiting
653 uint max_col = std::max((int)m_true_column_count - 1, 0);
654 uint max_row = std::max((int)m_true_row_count - 1, 0);
655 m_pen.m_column = std::min(m_pen.m_column, max_col);
656 m_pen.m_row = std::min(m_pen.m_row, max_row);
657}
658
659/***************************************************************************/
660
662{
663 static const std::array<const uint8_t,8> kStyle2Font
664 { 0, 0, 1, 2, 3, 4, 3, 4 };
665
666 if ((style < 1) || (style > 7))
667 return;
668
671 m_attr.m_fontTag = kStyle2Font[style];
672 m_attr.m_italics = false;
673 m_attr.m_underline = false;
674 m_attr.m_boldface = false;
675 m_attr.m_edgeType = 0;
679 m_attr.m_bgOpacity = (style<6) ?
682 m_attr.m_actualFgColor = QColor();
683}
684
686 : m_attr(win.m_pen.m_attr)
687{
688}
689
691 const CC708CharacterAttribute &other) const
692{
693 return ((m_penSize == other.m_penSize) &&
694 (m_offset == other.m_offset) &&
695 (m_textTag == other.m_textTag) &&
696 (m_fontTag == other.m_fontTag) &&
697 (m_edgeType == other.m_edgeType) &&
698 (m_underline == other.m_underline) &&
699 (m_italics == other.m_italics) &&
700 (m_fgColor == other.m_fgColor) &&
701 (m_fgOpacity == other.m_fgOpacity) &&
702 (m_bgColor == other.m_bgColor) &&
703 (m_bgOpacity == other.m_bgOpacity) &&
704 (m_edgeColor == other.m_edgeColor));
705}
706
708{
709 // Color is expressed in 6 bits, 2 each for red, green, and blue.
710 // U.S. ATSC programs seem to use just the higher-order bit,
711 // i.e. values 0 and 2, so the last two elements of X[] are both
712 // set to the maximum 255, otherwise font colors are dim.
713 static constexpr std::array<const uint8_t,4> kX {0, 96, 255, 255};
714 return {kX[(eia708color>>4)&3], kX[(eia708color>>2)&3], kX[eia708color&3]};
715}
#define assert(x)
const uint k708AttrEdgeRightDropShadow
Definition: cc708window.cpp:98
const uint k708AttrFontMonospacedSerif
Definition: cc708window.cpp:85
const uint k708AttrFontProportionalSerif
Definition: cc708window.cpp:86
const uint k708JustifyRight
Definition: cc708window.cpp:56
const uint k708AttrEdgeLeftDropShadow
Definition: cc708window.cpp:97
const uint k708EffectWipe
Definition: cc708window.cpp:62
const uint k708AttrSizeStandard
Definition: cc708window.cpp:77
const uint k708AttrColorBlack
const uint k708AttrOpacitySolid
const uint k708BorderShadowRight
Definition: cc708window.cpp:69
const uint k708AttrOffsetSuperscript
Definition: cc708window.cpp:82
const uint k708AttrOpacityTranslucent
const uint k708AttrEdgeNone
Definition: cc708window.cpp:93
const uint k708BorderShadowLeft
Definition: cc708window.cpp:68
const uint k708AttrEdgeUniform
Definition: cc708window.cpp:96
const uint k708DirLeftToRight
Definition: cc708window.cpp:71
const uint k708DirBottomToTop
Definition: cc708window.cpp:74
const uint k708BorderRaised
Definition: cc708window.cpp:65
const uint k708AttrOffsetSubscript
Definition: cc708window.cpp:80
const uint k708AttrSizeSmall
Definition: cc708window.cpp:76
const uint k708JustifyLeft
Definition: cc708window.cpp:55
const uint k708DirTopToBottom
Definition: cc708window.cpp:73
const uint k708DirRightToLeft
Definition: cc708window.cpp:72
const uint k708AttrOpacityFlash
const uint k708AttrFontCursive
Definition: cc708window.cpp:90
const uint k708AttrFontCasual
Definition: cc708window.cpp:89
const uint k708JustifyFull
Definition: cc708window.cpp:58
const uint k708AttrEdgeDepressed
Definition: cc708window.cpp:95
const uint k708AttrOffsetNormal
Definition: cc708window.cpp:81
const uint k708BorderNone
Definition: cc708window.cpp:64
const uint k708AttrOpacityTransparent
const uint k708AttrFontMonospacedSansSerif
Definition: cc708window.cpp:87
const uint k708JustifyCenter
Definition: cc708window.cpp:57
const uint k708AttrFontSmallCaps
Definition: cc708window.cpp:91
const uint k708AttrFontProportionalSansSerif
Definition: cc708window.cpp:88
const uint k708EffectSnap
Definition: cc708window.cpp:60
const uint k708BorderUniform
Definition: cc708window.cpp:67
const uint k708AttrFontDefault
Definition: cc708window.cpp:84
const uint k708AttrColorWhite
const uint k708AttrSizeLarge
Definition: cc708window.cpp:78
const uint k708AttrEdgeRaised
Definition: cc708window.cpp:94
const uint k708BorderDepressed
Definition: cc708window.cpp:66
const uint k708EffectFade
Definition: cc708window.cpp:61
bool operator==(const CC708CharacterAttribute &other) const
static QColor ConvertToQColor(uint eia708color)
CC708Character()=default
CC708CharacterAttribute m_attr
Definition: cc708window.h:181
uint m_row
Definition: cc708window.h:171
void SetPenStyle(uint style)
uint m_column
Definition: cc708window.h:172
CC708CharacterAttribute m_attr
Definition: cc708window.h:169
CC708CharacterAttribute m_attr
Definition: cc708window.h:191
QString m_str
Definition: cc708window.h:190
uint m_fill_opacity
Definition: cc708window.h:262
uint m_column_lock
Definition: cc708window.h:257
CC708Character & GetCCChar(void) const
CC708Pen m_pen
Definition: cc708window.h:279
uint m_effect_dir
Definition: cc708window.h:267
void LimitPenLocation(void)
void Resize(uint new_rows, uint new_columns)
void SetVisible(bool value)
Definition: cc708window.h:296
bool GetExists(void) const
Definition: cc708window.h:287
uint m_true_row_count
Definition: cc708window.h:275
uint m_row_lock
Definition: cc708window.h:256
uint m_scroll_dir
Definition: cc708window.h:265
uint m_print_dir
Definition: cc708window.h:266
void DecrPenLocation(void)
void IncrPenLocation(void)
uint m_relative_pos
Definition: cc708window.h:251
bool IsPenValid(void) const
Definition: cc708window.h:216
uint m_border_type
Definition: cc708window.h:264
uint m_justify
Definition: cc708window.h:270
uint m_column_count
Definition: cc708window.h:255
uint m_effect_speed
Definition: cc708window.h:269
uint m_display_effect
Definition: cc708window.h:268
void Clear(void)
uint m_true_column_count
Definition: cc708window.h:276
uint m_priority
Definition: cc708window.h:241
void DefineWindow(int priority, bool visible, int anchor_point, int relative_pos, int anchor_vertical, int anchor_horizontal, int row_count, int column_count, int row_lock, int column_lock, int pen_style, int window_style)
uint m_anchor_horizontal
Definition: cc708window.h:253
std::vector< CC708String * > GetStrings(void) const
uint m_row_count
Definition: cc708window.h:254
uint m_anchor_vertical
Definition: cc708window.h:252
void SetWindowStyle(uint style)
static void DisposeStrings(std::vector< CC708String * > &strings)
void AddChar(QChar ch)
CC708Character * m_text
Definition: cc708window.h:278
uint m_anchor_point
Definition: cc708window.h:250
uint m_border_color
Definition: cc708window.h:263
void SetChanged(void)
Definition: cc708window.h:302
QRecursiveMutex m_lock
Definition: cc708window.h:310
void SetPenLocation(uint row, uint column)
void Scroll(int row, int col)
uint m_word_wrap
Definition: cc708window.h:271
uint m_fill_color
Definition: cc708window.h:261
void SetExists(bool value)
Definition: cc708window.h:290
unsigned int uint
Definition: compat.h:68
static guint32 * tmp
Definition: goom_core.cpp:26
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39