[Ttssh2-commit] [5073] ITU-T Rec. T-416 風の RGB 色指定に対応した。

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2012年 11月 24日 (土) 20:07:39 JST


Revision: 5073
          http://sourceforge.jp/projects/ttssh2/scm/svn/commits/5073
Author:   doda
Date:     2012-11-24 20:07:38 +0900 (Sat, 24 Nov 2012)
Log Message:
-----------
ITU-T Rec. T-416 風の RGB 色指定に対応した。
現状の実装は、256 色のパレットの中から近似色を選ぶ。
また、256 色パレット指定も : をパラメータ区切りとして受け付けるようにした。

対応形式:
  CSI 38 ; 2 ; R ; G ; B m   -- Konssole
  CSI 38 ; 2 ; R : G : B m   -- 独自
  CSI 38 ; 2 : R : G : B m   -- T-416 風
  CSI 38 : 2 : R : G : B m   -- xterm pl282 とか
  CSI 38 ; 5 : C m           -- T-416
  CSI 38 : 5 : C m           -- xterm pl282 とか

Modified Paths:
--------------
    trunk/teraterm/teraterm/vtdisp.c
    trunk/teraterm/teraterm/vtdisp.h
    trunk/teraterm/teraterm/vtterm.c

-------------- next part --------------
Modified: trunk/teraterm/teraterm/vtdisp.c
===================================================================
--- trunk/teraterm/teraterm/vtdisp.c	2012-11-23 11:15:19 UTC (rev 5072)
+++ trunk/teraterm/teraterm/vtdisp.c	2012-11-24 11:07:38 UTC (rev 5073)
@@ -3771,3 +3771,30 @@
 
 	return;
 }
+
+int DispFindClosestColor(int red, int green, int blue)
+{
+	int i, color, diff_r, diff_g, diff_b, diff, min;
+	char buff[1024];
+
+
+	min = 0xfffffff;
+	color = 0;
+
+	for (i=0; i<256; i++) {
+		diff_r = red - GetRValue(ANSIColor[i]);
+		diff_g = green - GetGValue(ANSIColor[i]);
+		diff_b = blue - GetBValue(ANSIColor[i]);
+		diff = diff_r * diff_r + diff_g * diff_g + diff_b * diff_b;
+
+		if (diff < min) {
+			min = diff;
+			color = i;
+		}
+	}
+
+	if ((ts.ColorFlag & CF_FULLCOLOR) != 0 && color < 16 && (color & 7) != 0) {
+		color ^= 8;
+	}
+	return color;
+}

Modified: trunk/teraterm/teraterm/vtdisp.h
===================================================================
--- trunk/teraterm/teraterm/vtdisp.h	2012-11-23 11:15:19 UTC (rev 5072)
+++ trunk/teraterm/teraterm/vtdisp.h	2012-11-24 11:07:38 UTC (rev 5073)
@@ -89,6 +89,7 @@
 void DispGetWindowPos(int *x, int *y);
 void DispGetWindowSize(int *width, int *height);
 void DispGetRootWinSize(int *x, int *y);
+int DispFindClosestColor(int red, int green, int blue);
 
 extern int WinWidth, WinHeight;
 extern HFONT VTFont[AttrFontMask+1];

Modified: trunk/teraterm/teraterm/vtterm.c
===================================================================
--- trunk/teraterm/teraterm/vtterm.c	2012-11-23 11:15:19 UTC (rev 5072)
+++ trunk/teraterm/teraterm/vtterm.c	2012-11-24 11:07:38 UTC (rev 5073)
@@ -44,8 +44,9 @@
 #define ModeDLE   7
 #define ModeCAN   8
 
-#define NParamMax 16
-#define IntCharMax 5
+#define NParamMax  16
+#define NSParamMax 16
+#define IntCharMax  5
 
 /* DEC Locator Flag */
 #define DecLocatorOneShot    1
@@ -97,7 +98,8 @@
 static BOOL Special;
 
 static int Param[NParamMax+1];
-static int NParam;
+static int SubParam[NParamMax+1][NSParamMax+1];
+static int NParam, NSParam[NParamMax+1];
 static BOOL FirstPrm;
 static BYTE IntChar[IntCharMax+1];
 static int ICount;
@@ -158,6 +160,15 @@
 
 static _locale_t CLocale = NULL;
 
+void ClearParams()
+{
+    ICount = 0;
+    NParam = 1;
+    NSParam[1] = 0;
+    Param[1] = 0;
+    Prv = 0;
+}
+
 void ResetSBuffer(PStatusBuff sbuff)
 {
   sbuff->CursorX = 0;
@@ -811,11 +822,8 @@
 	PutChar(b); /* Disp C1 char in VT100 mode */
 	return;
       }
-      ICount = 0;
+      ClearParams();
       FirstPrm = TRUE;
-      NParam = 1;
-      Param[1] = 0;
-      Prv = 0;
       ParseMode = ModeCSI;
       WriteToPrnFile(0,TRUE); // flush prn buff
       WriteToPrnFile(b,FALSE);
@@ -983,11 +991,8 @@
       SSflag = TRUE;
       break;
     case DCS:
+      ClearParams();
       ESCFlag = FALSE;
-      ICount = 0;
-      NParam = 1;
-      Param[1] = 0;
-      Prv = 0;
       ParseMode = ModeDCS;
       break;
     case SOS:
@@ -995,15 +1000,12 @@
       ParseMode = ModeSOS;
       break;
     case CSI:
-      ICount = 0;
+      ClearParams();
       FirstPrm = TRUE;
-      NParam = 1;
-      Param[1] = 0;
-      Prv = 0;
       ParseMode = ModeCSI;
       break;
     case OSC:
-      Param[1] = 0;
+      ClearParams();
       ParseMode = ModeXS;
       break;
     case PM:
@@ -1226,11 +1228,8 @@
     case 0:
       switch (b) {
 	case '[': /* CSI */
-	  ICount = 0;
+	  ClearParams();
 	  FirstPrm = TRUE;
-	  NParam = 1;
-	  Param[1] = 0;
-	  Prv = 0;
 	  WriteToPrnFile(ESC,FALSE);
 	  WriteToPrnFile('[',FALSE);
 	  ParseMode = ModeCSI;
@@ -1329,28 +1328,25 @@
 	  SSflag = TRUE;
 	  break;
 	case 'P': /* DCS */
+	  ClearParams();
 	  ESCFlag = FALSE;
-	  NParam = 1;
-	  Param[1] = 0;
 	  ParseMode = ModeDCS;
 	  return;
 	case 'X': /* SOS */
 	  ESCFlag = FALSE;
 	  ParseMode = ModeSOS;
 	  return;
-	case 'Z': AnswerTerminalType(); break;
+	case 'Z': /* DECID */
+	  AnswerTerminalType();
+	  break;
 	case '[': /* CSI */
-	  ICount = 0;
+	  ClearParams();
 	  FirstPrm = TRUE;
-	  NParam = 1;
-	  Param[1] = 0;
-	  Prv = 0;
 	  ParseMode = ModeCSI;
 	  return;
 	case '\\': break; /* ST */
 	case ']': /* XTERM sequence (OSC) */
-	  NParam = 1;
-	  Param[1] = 0;
+	  ClearParams();
 	  ParseMode = ModeXS;
 	  return;
 	case '^':
@@ -1841,7 +1837,7 @@
 
 void CSSetAttr()		// SGR
 {
-	int i, P;
+	int i, j, P, r, g, b, color;
 
 	UpdateStr();
 	for (i=1 ; i<=NParam ; i++)
@@ -1913,12 +1909,74 @@
 			break;
 
 		case  38:	/* text color (256color mode) */
-			if ((ts.ColorFlag & CF_XTERM256) && i < NParam && Param[i+1] == 5) {
-				i++;
-				if (i < NParam) {
-					P = Param[++i];
+			if (ts.ColorFlag & CF_XTERM256) {
+				/*
+				 * Change foreground color. accept following formats.
+				 *
+				 * 38 ; 2 ; r ; g ; b
+				 * 38 ; 2 : r : g : b
+				 * 38 : 2 : r : g : b
+				 * 38 ; 5 ; idx
+				 * 38 ; 5 : idx
+				 * 38 : 5 : idx
+				 *
+				 */
+				color = -1;
+				j = 0;
+				if (NSParam[i] > 0) {
+					P = SubParam[i][1];
+					j++;
+				}
+				else if (i < NParam) {
+					P = Param[i+1];
+					if (P == 2 || P == 5) {
+						i++;
+					}
+				}
+				switch (P) {
+				case 2:
+					r = g = b = 0;
+					if (NSParam[i] > 0) {
+						if (j < NSParam[i]) {
+							r = SubParam[i][++j];
+							if (j < NSParam[i]) {
+								g = SubParam[i][++j];
+							}
+							if (j < NSParam[i]) {
+								b = SubParam[i][++j];
+							}
+							color = DispFindClosestColor(r, g, b);
+						}
+					}
+					else if (i < NParam && NSParam[i+1] > 0) {
+						r = Param[++i];
+						g = SubParam[i][1];
+						if (NSParam[i] > 1) {
+							b = SubParam[i][2];
+						}
+						color = DispFindClosestColor(r, g, b);
+					}
+					else if (i+2 < NParam) {
+						r = Param[++i];
+						g = Param[++i];
+						b = Param[++i];
+						color = DispFindClosestColor(r, g, b);
+					}
+					break;
+				case 5:
+					if (NSParam[i] > 0) {
+						if (j < NSParam[i]) {
+							color = SubParam[i][++j];
+						}
+					}
+					else if (i < NParam) {
+						color = Param[++i];
+					}
+					break;
+				}
+				if (color >= 0) {
 					CharAttr.Attr2 |= Attr2Fore;
-					CharAttr.Fore = P;
+					CharAttr.Fore = color;
 					BuffSetCurCharAttr(CharAttr);
 				}
 			}
@@ -1944,12 +2002,63 @@
 			break;
 
 		case  48:	/* Back color (256color mode) */
-			if ((ts.ColorFlag & CF_XTERM256) && i < NParam && Param[i+1] == 5) {
-				i++;
-				if (i < NParam) {
-					P = Param[++i];
+			if (ts.ColorFlag & CF_XTERM256) {
+				color = -1;
+				j = 0;
+				if (NSParam[i] > 0) {
+					P = SubParam[i][1];
+					j++;
+				}
+				else if (i < NParam) {
+					P = Param[i+1];
+					if (P == 2 || P == 5) {
+						i++;
+					}
+				}
+				switch (P) {
+				case 2:
+					r = g = b = 0;
+					if (NSParam[i] > 0) {
+						if (j < NSParam[i]) {
+							r = SubParam[i][++j];
+							if (j < NSParam[i]) {
+								g = SubParam[i][++j];
+							}
+							if (j < NSParam[i]) {
+								b = SubParam[i][++j];
+							}
+							color = DispFindClosestColor(r, g, b);
+						}
+					}
+					else if (i < NParam && NSParam[i+1] > 0) {
+						r = Param[++i];
+						g = SubParam[i][1];
+						if (NSParam[i] > 1) {
+							b = SubParam[i][2];
+						}
+						color = DispFindClosestColor(r, g, b);
+					}
+					else if (i+2 < NParam) {
+						r = Param[++i];
+						g = Param[++i];
+						b = Param[++i];
+						color = DispFindClosestColor(r, g, b);
+					}
+					break;
+				case 5:
+					if (NSParam[i] > 0) {
+						if (j < NSParam[i]) {
+							color = SubParam[i][++j];
+						}
+					}
+					else if (i < NParam) {
+						color = Param[++i];
+					}
+					break;
+				}
+				if (color >= 0) {
 					CharAttr.Attr2 |= Attr2Back;
-					CharAttr.Back = P;
+					CharAttr.Back = color;
 					BuffSetCurCharAttr(CharAttr);
 				}
 			}
@@ -3021,14 +3130,27 @@
     }
     else if ((b>=0x30) && (b<=0x39))
     {
-      Param[NParam] = Param[NParam]*10 + b - 0x30;
+      if (NSParam[NParam] > 0) {
+	SubParam[NParam][NSParam[NParam]] = SubParam[NParam][NSParam[NParam]]*10 + b - 0x30;
+      }
+      else {
+	Param[NParam] = Param[NParam]*10 + b - 0x30;
+      }
     }
+    else if (b==0x3A)
+    { /* ':' Subparameter delimiter */
+      if (NSParam[NParam] < NSParamMax) {
+	NSParam[NParam]++;
+	SubParam[NParam][NSParam[NParam]] = 0;
+      }
+    }
     else if (b==0x3B)
-    {
+    { /* ';' Parameter delimiter */
       if (NParam < NParamMax)
       {
 	NParam++;
 	Param[NParam] = 0;
+	NSParam[NParam] = 0;
       }
     }
     else if ((b>=0x3C) && (b<=0x3F))



Ttssh2-commit メーリングリストの案内
Back to archive index