📄 teletext.java
字号:
{
active_set = CharSet.getActive_G0_Set(primary_set_mapping, primary_national_set_mapping, row);
active_national_set = CharSet.getActiveNationalSubset(primary_set_mapping, primary_national_set_mapping, row);
}
else
{
active_set = CharSet.getActive_G0_Set(secondary_set_mapping, secondary_national_set_mapping, row);
active_national_set = CharSet.getActiveNationalSubset(secondary_set_mapping, secondary_national_set_mapping, row);
}
toggle = !toggle;
break;
case 0x1C:
active_color &= 0xF;
break;
case 0x1D:
active_color |= (0xF & active_color)<<4;
}
chars[i] = active_set[32]<<8 | active_color;
continue;
}
else if (char_value == 0x7F) //0x7F
{
chars[i] = active_set[32]<<8 | active_color;
continue;
}
if (!ascii)
{
chars[i] = active_set[32]<<8 | active_color;
continue;
}
if (active_national_set != null)
{
// all chars 0x20..7F special characters
switch (char_value)
{
case 0x23:
chars[i] = active_color | active_national_set[0]<<8;
continue;
case 0x24:
chars[i] = active_color | active_national_set[1]<<8;
continue;
case 0x40:
chars[i] = active_color | active_national_set[2]<<8;
continue;
case 0x5b:
chars[i] = active_color | active_national_set[3]<<8;
continue;
case 0x5c:
chars[i] = active_color | active_national_set[4]<<8;
continue;
case 0x5d:
chars[i] = active_color | active_national_set[5]<<8;
continue;
case 0x5e:
chars[i] = active_color | active_national_set[6]<<8;
continue;
case 0x5f:
chars[i] = active_color | active_national_set[7]<<8;
continue;
case 0x60:
chars[i] = active_color | active_national_set[8]<<8;
continue;
case 0x7b:
chars[i] = active_color | active_national_set[9]<<8;
continue;
case 0x7c:
chars[i] = active_color | active_national_set[10]<<8;
continue;
case 0x7d:
chars[i] = active_color | active_national_set[11]<<8;
continue;
case 0x7e:
chars[i] = active_color | active_national_set[12]<<8;
continue;
}
}
chars[i] = active_color | active_set[char_value]<<8;
continue;
}
String test = "";
for (int s = 0; s < chars.length; s++)
test += (char)(chars[s]>>>8);
if (test.trim().length() == 0)
return null;
return chars;
}
/******************************
* make strings from teletext *
******************************/
//DM24072004 081.7 int07 changed
//DM09082004 081.7 int08 changed
public static String makestring(byte[] packet, int offset, int len, int row, int character_set, int color, boolean checkParity)
{
boolean ascii = true, toggle = false;
String text = "";
int primary_set_mapping = X.getForcedTTXLanguage() < 0 ? 0 : X.getForcedTTXLanguage();
int primary_national_set_mapping = character_set;
int secondary_set_mapping = primary_set_mapping;
int secondary_national_set_mapping = primary_national_set_mapping;
if (page_modifications.containsKey("primary_set"))
secondary_set_mapping = primary_set_mapping = Integer.parseInt(page_modifications.get("primary_set").toString());
if (page_modifications.containsKey("primary_national_set"))
secondary_national_set_mapping = primary_national_set_mapping = Integer.parseInt(page_modifications.get("primary_national_set").toString());
if (page_modifications.containsKey("secondary_set"))
{
secondary_set_mapping = Integer.parseInt(page_modifications.get("secondary_set").toString());
secondary_national_set_mapping = Integer.parseInt(page_modifications.get("secondary_national_set").toString());
}
active_set = CharSet.getActive_G0_Set(primary_set_mapping, primary_national_set_mapping, row);
active_national_set = CharSet.getActiveNationalSubset(primary_set_mapping, primary_national_set_mapping, row);
loopi:
for (int c = offset, val, i = 0; i < len; c++, i++)
{
val = row<<16 | i;
if (page_modifications.containsKey("" + val))
{
text += page_modifications.get("" + val).toString();
continue;
}
if (checkParity && !cparity(packet[c]))
packet[c] = 8; //if error, switch to graphics mode (= space), by loosing all following chars
int char_value = 0x7F & bytereverse(packet[c]);
if (char_value>>>3 == 0) //0x0..7
{
ascii = true;
text += ((color==1) ? colors[char_value] : "") + (char)active_set[32];
continue;
}
else if (char_value>>>4 == 0) //0x8..F
{
text += (char)active_set[32];
continue;
}
else if (char_value>>>7 == 1) //0x80..FF
{
text += (char)active_set[32];
continue;
}
else if (char_value < 27) //0x10..1A
{
ascii = false;
text += (char)active_set[32];
continue;
}
else if (char_value < 32) //0x1B..1F
{
if (char_value == 0x1B) //ESC
{
if (toggle)
{
active_set = CharSet.getActive_G0_Set(primary_set_mapping, primary_national_set_mapping, row);
active_national_set = CharSet.getActiveNationalSubset(primary_set_mapping, primary_national_set_mapping, row);
}
else
{
active_set = CharSet.getActive_G0_Set(secondary_set_mapping, secondary_national_set_mapping, row);
active_national_set = CharSet.getActiveNationalSubset(secondary_set_mapping, secondary_national_set_mapping, row);
}
toggle = !toggle;
}
text += (char)active_set[32];
continue;
}
else if (char_value == 0x7F) //0x7F
{
text += (char)active_set[32];
continue;
}
if (!ascii)
{
text += (char)active_set[32];
continue;
}
if (active_national_set != null)
{
// all chars 0x20..7F
switch (char_value) // special national characters
{
case 0x23:
text += (char)active_national_set[0];
continue loopi;
case 0x24:
text += (char)active_national_set[1];
continue loopi;
case 0x40:
text += (char)active_national_set[2];
continue loopi;
case 0x5b:
text += (char)active_national_set[3];
continue loopi;
case 0x5c:
text += (char)active_national_set[4];
continue loopi;
case 0x5d:
text += (char)active_national_set[5];
continue loopi;
case 0x5e:
text += (char)active_national_set[6];
continue loopi;
case 0x5f:
text += (char)active_national_set[7];
continue loopi;
case 0x60:
text += (char)active_national_set[8];
continue loopi;
case 0x7b:
text += (char)active_national_set[9];
continue loopi;
case 0x7c:
text += (char)active_national_set[10];
continue loopi;
case 0x7d:
text += (char)active_national_set[11];
continue loopi;
case 0x7e:
text += (char)active_national_set[12];
continue loopi;
}
}
text += (char)active_set[char_value];
continue loopi;
}
if (color==1)
return colors[7] + text.trim();
else
return text;
}
//DM30072004 081.7 int07 add
private static Hashtable page_modifications = new Hashtable();
private static boolean use = false;
private static int display_row = 0, display_column = 0;
private static short active_set[];
private static short active_national_set[];
//DM30072004 081.7 int07 add
public static void clearEnhancements()
{
page_modifications.clear();
use = false;
display_row = 0;
display_column = 0;
active_set = CharSet.getActive_G0_Set(0, 0, 0);
active_national_set = CharSet.getActiveNationalSubset(0, 0, 0);
}
//analyze triplets etc.
//DM30072004 081.7 int07 add
public static void setEnhancements(byte packet[], int row, int character_set)
{
int val, mapping, position = 0, code;
byte address, mode, data, designation;
designation = bytereverse((byte)((0xF & hamming_decode(packet[6]))<<4));
//X.Msg("row " + row + " /designation " + designation);
if ((row == 29 && designation == 0) || (row == 29 && designation == 4) || (row == 28 && designation == 4))
{
// read triplet 1
val = hamming24_18(packet, 7);
code = val<<3;
if (row == 28 && designation == 0 && (0x3F800 & val) != 0)
return; // not X/28/0 format 1
// read triplet 2
val = hamming24_18(packet, 10);
code |= (7 & val>>15);
//primary set
mapping = 0xFE & bytereverse((byte)(0x7F & code>>7));
page_modifications.put("primary_set", "" + (0xF & mapping>>4));
if (row != 29)
page_modifications.put("primary_national_set", "" + character_set);
//secondary set
mapping = 0xFE & bytereverse((byte)(0x7F & code));
page_modifications.put("secondary_set", "" + (0xF & mapping>>4));
page_modifications.put("secondary_national_set", "" + (7 & mapping>>1));
}
if (row != 26)
return;
for (int a = 7; a < 46; a += 3)
{
val = hamming24_18(packet, a);
address = bytereverse( (byte)(0xFC & val>>10));
mode = bytereverse( (byte)(0xF8 & val>>4));
data = bytereverse( (byte)(0xFE & val<<1));
/**
X.Msg("triplet " + a + " / " + Integer.toBinaryString(val));
X.Msg(" address " + address );
X.Msg(" mode " + mode );
X.Msg(" data " + data );
**/
if (address >= 40) //40..63 means row 24,1..23
{
if (address == 63 && mode == 31) //termination
break;
if (mode != 4 && mode != 1)
{
use = false;
continue;
}
display_row = address == 40 ? 0 : address - 40;
display_column = mode == 1 ? 0 : data;
use = true;
}
else //0..39 means column 0..39
{
if (!use)
continue;
display_column = address;
String str = "";
if (mode == 15) //char from G2 set
str += (char)CharSet.getActive_G2_Set(0, character_set, display_row)[data];
else if (mode == 16) //char from G0 set w/o diacr.
str += (char)CharSet.getActive_G0_Set(0, character_set, display_row)[data];
//combination fixed table (because it won't work here when combine unicode chars)
else if (mode > 16) //char from G0 set w/ diacr.
str += (char)CharSet.getCombinedCharacter(data, mode & 0xF);
else
continue;
position = display_row<<16 | display_column;
page_modifications.put("" + position, str);
//X.Msg("replaced char " + str + " /m " + mode);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -