RenderProfile.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:17k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: RenderProfile.cs,v 1.2 2005/04/20 08:45:47 okajima Exp $
  4. */
  5. using System;
  6. using System.IO;
  7. using System.Collections;
  8. using System.Drawing;
  9. using System.Diagnostics;
  10. using System.Text.RegularExpressions;
  11. using System.Text;
  12. using System.Xml;
  13. using Poderosa.Toolkit;
  14. using Poderosa.ConnectionParam;
  15. #if !MACRODOC
  16. using Poderosa.Config;
  17. using Poderosa.Text;
  18. #endif
  19. namespace Poderosa.Terminal {
  20. /// <summary>
  21. /// <ja>僐儞僜乕儖偺昞帵曽朄傪巜掕偡傞僆僽僕僃僋僩偱偡丅愙懕慜偵TerminalParam偺RenderProfile僾儘僷僥傿偵僙僢僩偡傞偙偲偱丄儅僋儘偐傜怓丒僼僅儞僩丒攚宨夋憸傪巜掕偱偒傑偡丅</ja>
  22. /// <en>Implements the parameters for displaying the console. By setting this object to the RenderProfile property of the TerminalParam object, the macro can control colors, fonts, and background images.</en>
  23. /// </summary>
  24.     [Serializable]
  25. public class RenderProfile : ICloneable {
  26. private string _fontName;
  27. private string _japaneseFontName;
  28. private float _fontSize;
  29. private bool _useClearType;
  30. #if !MACRODOC
  31. private FontHandle _font;
  32. private FontHandle _boldfont;
  33. private FontHandle _underlinefont;
  34. private FontHandle _boldunderlinefont;
  35. private FontHandle _japaneseFont;
  36. private FontHandle _japaneseBoldfont;
  37. private FontHandle _japaneseUnderlinefont;
  38. private FontHandle _japaneseBoldunderlinefont;
  39. private EscapesequenceColorSet _esColorSet;
  40. #endif
  41. private Color _forecolor;
  42. private Color _bgcolor;
  43. private Brush _brush;
  44. private Brush _bgbrush;
  45. private string _backgroundImageFileName;
  46. private Image _backgroundImage;
  47. private bool  _imageLoadIsAttempted;
  48. private ImageStyle _imageStyle;
  49. private SizeF _pitch;
  50. private float _chargap; //暥帤楍傪昞帵偡傞偲偒偵嵍塃偵偮偔梋敀
  51. private bool _usingIdenticalFont; //ASCII/擔杮岅偱摨偠僼僅儞僩傪巊偭偰偄傞偐偳偆偐
  52. /// <summary>
  53. /// <ja>捠忢偺暥帤傪昞帵偡傞偨傔偺僼僅儞僩柤偱偡丅</ja>
  54. /// <en>Gets or sets the font name for normal characters.</en>
  55. /// </summary>
  56. public string FontName {
  57. get {
  58. return _fontName;
  59. }
  60. set {
  61. #if !MACRODOC
  62. _fontName = value;
  63. ClearFont();
  64. #endif
  65. }
  66. }
  67. /// <summary>
  68. /// <ja>擔杮岅暥帤傪昞帵偡傞偨傔偺僼僅儞僩柤偱偡丅</ja>
  69. /// <en>Gets or sets the font name for Japanese characters.</en>
  70. /// </summary>
  71. public string JapaneseFontName {
  72. get {
  73. return _japaneseFontName;
  74. }
  75. set {
  76. #if !MACRODOC
  77. _japaneseFontName = value;
  78. ClearFont();
  79. #endif
  80. }
  81. }
  82. /// <summary>
  83. /// <ja>僼僅儞僩僒僀僘偱偡丅</ja>
  84. /// <en>Gets or sets the font size.</en>
  85. /// </summary>
  86. public float FontSize {
  87. get {
  88. return _fontSize;
  89. }
  90. set {
  91. #if !MACRODOC
  92. _fontSize = value;
  93. ClearFont();
  94. #endif
  95. }
  96. }
  97. /// <summary>
  98. /// <ja>true偵僙僢僩偡傞偲丄僼僅儞僩偲OS偱僒億乕僩偝傟偰偄傟偽丄ClearType傪巊梡偟偰暥帤偑昤夋偝傟傑偡丅</ja>
  99. /// <en>If this property is true, the characters are drew by the ClearType when the font and the OS supports it.</en>
  100. /// </summary>
  101. public bool UseClearType {
  102. get {
  103. return _useClearType;
  104. }
  105. set {
  106. _useClearType = value;
  107. }
  108. }
  109. /// <summary>
  110. /// <ja>暥帤怓偱偡丅</ja>
  111. /// <en>Gets or sets the color of characters.</en>
  112. /// </summary>
  113. public Color ForeColor {
  114. get {
  115. return _forecolor;
  116. }
  117. set {
  118. #if !MACRODOC
  119. _forecolor = value;
  120. ClearBrush();
  121. #endif
  122. }
  123. }
  124. /// <summary>
  125. /// <ja>JScript偱偼Color峔憿懱偑巊梡偱偒側偄偺偱丄ForeColor僾儘僷僥傿傪愝掕偡傞偐傢傝偵偙偺儊僜僢僪傪巊偭偰偔偩偝偄丅</ja>
  126. /// <en>Because JScript cannot handle the Color structure, please use this method instead of the ForeColor property.</en>
  127. /// </summary>
  128. public void SetForeColor(object value) {
  129. _forecolor = (Color)value;
  130. #if !MACRODOC
  131. ClearBrush();
  132. #endif
  133. }
  134. /// <summary>
  135. /// <ja>攚宨怓偱偡丅</ja>
  136. /// <en>Gets or sets the background color.</en>
  137. /// </summary>
  138. public Color BackColor {
  139. get {
  140. return _bgcolor;
  141. }
  142. set {
  143. #if !MACRODOC
  144. _bgcolor = value;
  145. ClearBrush();
  146. #endif
  147. }
  148. }
  149. /// <summary>
  150. /// <ja>JScript偱偼峔憿懱偑巊梡偱偒側偄偺偱丄BackColor僾儘僷僥傿傪愝掕偡傞偐傢傝偵偙偺儊僜僢僪傪巊偭偰偔偩偝偄丅</ja>
  151. /// <en>Because JScript cannot handle the Color structure, please use this method instead of the BackColor property.</en>
  152. /// </summary>
  153. public void SetBackColor(object value) {
  154. _bgcolor = (Color)value;
  155. #if !MACRODOC
  156. ClearBrush();
  157. #endif
  158. }
  159. /// <summary>
  160. /// <ja>攚宨夋憸偺僼傽僀儖柤偱偡丅</ja>
  161. /// <en>Gets or set the file name of the background image.</en>
  162. /// </summary>
  163. public string BackgroundImageFileName {
  164. get {
  165. return _backgroundImageFileName;
  166. }
  167. set {
  168. _backgroundImageFileName = value;
  169. _backgroundImage = null;
  170. }
  171. }
  172. /// <summary>
  173. /// <ja>攚宨夋憸偺埵抲偱偡丅</ja>
  174. /// <en>Gets or sets the position of the background image.</en>
  175. /// </summary>
  176. public ImageStyle ImageStyle {
  177. get {
  178. return _imageStyle;
  179. }
  180. set {
  181. _imageStyle = value;
  182. }
  183. }
  184. #if !MACRODOC
  185. public EscapesequenceColorSet ESColorSet {
  186. get {
  187. return _esColorSet;
  188. }
  189. set {
  190. _esColorSet = value;
  191. }
  192. }
  193. #endif
  194. /// <summary>
  195. /// <ja>僆僾僔儑儞僟僀傾儘僌偱愝掕偟偨撪梕偵婎偯偄偰弶婜壔偟傑偡丅</ja>
  196. /// <en>Initializes with default values the user sets in the option dialog.</en>
  197. /// </summary>
  198. public RenderProfile() {
  199. #if !MACRODOC
  200. Init(GEnv.Options);
  201. #endif
  202. }
  203. /// <summary>
  204. /// <ja>僐僺乕偟偰嶌惉偟傑偡丅</ja>
  205. /// <en>Initializes with another instance.</en>
  206. /// </summary>
  207. public RenderProfile(RenderProfile src) {
  208. #if !MACRODOC
  209. _fontName = src._fontName;
  210. _japaneseFontName = src._japaneseFontName;
  211. _fontSize = src._fontSize;
  212. _useClearType = src._useClearType;
  213. _japaneseFont = _font = null;
  214. _forecolor = src._forecolor;
  215. _bgcolor = src._bgcolor;
  216. _esColorSet = (EscapesequenceColorSet)src._esColorSet.Clone();
  217. _bgbrush = _brush = null;
  218. _backgroundImageFileName = src._backgroundImageFileName;
  219. _imageLoadIsAttempted = false;
  220. _imageStyle = src.ImageStyle;
  221. #endif
  222. }
  223. public object Clone() {
  224. return new RenderProfile(this);
  225. }
  226. #if !MACRODOC
  227. public RenderProfile(CommonOptions opt) {
  228. Init(opt);
  229. }
  230. private void Init(CommonOptions opt) {
  231. //婲摦偺崅懍壔偺偨傔丄僼僅儞僩偺嶌惉偼抶墑昡壙
  232. _fontName = opt.FontName;
  233. _japaneseFontName = opt.JapaneseFontName;
  234. _fontSize = opt.FontSize;
  235. _useClearType = opt.UseClearType;
  236. _japaneseFont = _font = null;
  237. _esColorSet = (EscapesequenceColorSet)opt.ESColorSet.Clone();
  238. _forecolor = opt.TextColor;
  239. _bgcolor = opt.BGColor;
  240. _bgbrush = _brush = null;
  241. _backgroundImageFileName = opt.BackgroundImageFileName;
  242. _imageLoadIsAttempted = false;
  243. _imageStyle = opt.ImageStyle;
  244. }
  245. public RenderProfile(ConfigNode data) {
  246. Import(data);
  247. }
  248. public void Import(ConfigNode data) {
  249. CommonOptions opt = GEnv.Options;
  250. _fontName = data["font-name"];
  251. if(_fontName==null) _fontName = opt.FontName;
  252. _japaneseFontName = data["japanese-font-name"];
  253. if(_japaneseFontName==null) _japaneseFontName = opt.JapaneseFontName;
  254. _fontSize = (float)GUtil.ParseInt(data["font-size"], 10);
  255. _useClearType = GUtil.ParseBool(data["clear-type"], false);
  256. ClearFont();
  257. unchecked {
  258. _forecolor = Color.FromArgb(GUtil.ParseHexInt(data["fore-color"], (int)0xFF000000));
  259. _bgcolor   = Color.FromArgb(GUtil.ParseHexInt(data["back-color"], (int)0xFFFFFFFF));
  260. }
  261. if(_esColorSet==null) _esColorSet = (EscapesequenceColorSet)opt.ESColorSet.Clone();
  262. _esColorSet.Load(data["color-sequence"]);
  263. ClearBrush();
  264. _backgroundImageFileName = data["image-file"];
  265. _imageLoadIsAttempted = false;
  266. _imageStyle = (ImageStyle)EnumDescAttribute.For(typeof(ImageStyle)).FromName(data["bg-style"], ImageStyle.Center);
  267. }
  268. public void Export(XmlWriter writer) {
  269. writer.WriteAttributeString("font-name", _fontName);
  270. writer.WriteAttributeString("japanese-font-name", _japaneseFontName);
  271. writer.WriteAttributeString("font-size", _fontSize.ToString());
  272. writer.WriteAttributeString("clear-type", _useClearType.ToString());
  273. writer.WriteAttributeString("fore-color", _forecolor.ToArgb().ToString("X"));
  274. writer.WriteAttributeString("back-color", _bgcolor.ToArgb().ToString("X"));
  275. writer.WriteAttributeString("image-file", _backgroundImageFileName);
  276. writer.WriteAttributeString("bg-style", _imageStyle.ToString());
  277. if(!_esColorSet.IsDefault) writer.WriteAttributeString("color-sequence", _esColorSet.Format());
  278. }
  279. public void Export(ConfigNode node) {
  280. node["font-name"] = _fontName;
  281. node["japanese-font-name"] = _japaneseFontName;
  282. node["font-size"] = _fontSize.ToString();
  283. node["clear-type"] = _useClearType.ToString();
  284. node["fore-color"] = _forecolor.ToArgb().ToString("X");
  285. node["back-color"] = _bgcolor.ToArgb().ToString("X");
  286. node["image-file"] = _backgroundImageFileName;
  287. node["bg-style"] = _imageStyle.ToString();
  288. if(!_esColorSet.IsDefault) node["color-sequence"] = _esColorSet.Format();
  289. }
  290. private void ClearFont() {
  291. _font = null;
  292. _boldfont = null;
  293. _underlinefont = null;
  294. _boldunderlinefont = null;
  295. _japaneseFont = null;
  296. _japaneseBoldfont = null;
  297. _japaneseUnderlinefont = null;
  298. _japaneseBoldunderlinefont = null;
  299. }
  300. private void ClearBrush() {
  301. _brush = null;
  302. _bgbrush = null;
  303. }
  304. private void CreateFonts() {
  305. _font = new FontHandle(GUtil.CreateFont(_fontName, _fontSize));
  306. FontStyle fs = _font.Font.Style;
  307. _boldfont = new FontHandle(new Font(_font.Font, fs | FontStyle.Bold));
  308. _underlinefont = new FontHandle(new Font(_font.Font, fs | FontStyle.Underline));
  309. _boldunderlinefont = new FontHandle(new Font(_font.Font, fs | FontStyle.Underline | FontStyle.Bold));
  310. _japaneseFont = new FontHandle(new Font(_japaneseFontName, _fontSize));
  311. fs = _japaneseFont.Font.Style;
  312. _japaneseBoldfont = new FontHandle(new Font(_japaneseFont.Font, fs | FontStyle.Bold));
  313. _japaneseUnderlinefont = new FontHandle(new Font(_japaneseFont.Font, fs | FontStyle.Underline));
  314. _japaneseBoldunderlinefont = new FontHandle(new Font(_japaneseFont.Font, fs | FontStyle.Underline | FontStyle.Bold));
  315. _usingIdenticalFont = (_font.Font.Name==_japaneseFont.Font.Name);
  316. //捠忢斉
  317. Graphics g = Graphics.FromHwnd(Win32.GetDesktopWindow());
  318. #if false
  319. SizeF charsize1 = g.MeasureString("A", _font.Font);
  320. SizeF charsize2 = g.MeasureString("AA", _font.Font);
  321. _pitch = new SizeF(charsize2.Width-charsize1.Width, charsize1.Height);
  322. _chargap = (charsize1.Width-_pitch.Width)/2;
  323. #else
  324. IntPtr hdc = g.GetHdc();
  325. Win32.SelectObject(hdc, _font.HFONT);
  326. Win32.SIZE charsize1, charsize2;
  327. Win32.GetTextExtentPoint32(hdc, "A", 1, out charsize1);
  328. Win32.GetTextExtentPoint32(hdc, "AAA", 3, out charsize2);
  329. _pitch = new SizeF((charsize2.width-charsize1.width)/2, charsize1.height);
  330. _chargap = (charsize1.width-_pitch.Width)/2;
  331. g.ReleaseHdc(hdc);
  332. #endif
  333. g.Dispose();
  334. }
  335. private void CreateBrushes() {
  336. _brush = new SolidBrush(_forecolor);
  337. _bgbrush = new SolidBrush(_bgcolor);
  338. }
  339. public Brush Brush {
  340. get {
  341. if(_brush==null) CreateBrushes();
  342. return _brush;
  343. }
  344. }
  345. public Brush BgBrush {
  346. get {
  347. if(_bgbrush==null) CreateBrushes();
  348. return _bgbrush;
  349. }
  350. }
  351. public SizeF Pitch {
  352. get {
  353. if(_font==null) CreateFonts();
  354. return _pitch;
  355. }
  356. }
  357. public Image GetImage() {
  358. try {
  359. if(!_imageLoadIsAttempted) {
  360. _imageLoadIsAttempted = true;
  361. _backgroundImage = null;
  362. if(_backgroundImageFileName!=null && _backgroundImageFileName.Length>0)
  363. _backgroundImage = Image.FromFile(_backgroundImageFileName);
  364. }
  365. return _backgroundImage;
  366. }
  367. catch(Exception) {
  368. GUtil.Warning(GEnv.Frame, String.Format(GEnv.Strings.GetString("Message.RenderProfile.FailedToLoadPicture"), _backgroundImageFileName));
  369. return null;
  370. }
  371. }
  372. public float CharGap {
  373. get {
  374. if(_font==null) CreateFonts();
  375. return _chargap;
  376. }
  377. }
  378. public bool UsingIdenticalFont {
  379. get {
  380. return _usingIdenticalFont;
  381. }
  382. }
  383. internal Brush CalcTextBrush(TextDecoration dec) {
  384. if(_brush==null) CreateBrushes();
  385. if(dec==null) return _brush;
  386. switch(dec.TextColorType) {
  387. case ColorType.Custom:
  388. return new SolidBrush(dec.TextColor);
  389. case ColorType.DefaultBack:
  390. return _bgbrush;
  391. case ColorType.DefaultText:
  392. return _brush;
  393. default:
  394. throw new Exception("Unexpected decoration object");
  395. }
  396. }
  397. internal Color CalcTextColor(TextDecoration dec) {
  398. if(_brush==null) CreateBrushes();
  399. if(dec==null) return _forecolor;
  400. switch(dec.TextColorType) {
  401. case ColorType.Custom:
  402. return dec.TextColor;
  403. case ColorType.DefaultBack:
  404. return _bgcolor;
  405. case ColorType.DefaultText:
  406. return _forecolor;
  407. default:
  408. throw new Exception("Unexpected decoration object");
  409. }
  410. }
  411. internal Brush CalcBackBrush(TextDecoration dec) {
  412. if(_brush==null) CreateBrushes();
  413. if(dec==null) return _bgbrush;
  414. switch(dec.BackColorType) {
  415. case ColorType.Custom:
  416. return new SolidBrush(dec.BackColor);
  417. case ColorType.DefaultBack:
  418. return _bgbrush;
  419. case ColorType.DefaultText:
  420. return _brush;
  421. default:
  422. throw new Exception("Unexpected decoration object");
  423. }
  424. }
  425. internal Color CalcBackColor(TextDecoration dec) {
  426. if(_brush==null) CreateBrushes();
  427. if(dec==null) return _bgcolor;
  428. switch(dec.BackColorType) {
  429. case ColorType.Custom:
  430. return dec.BackColor;
  431. case ColorType.DefaultBack:
  432. return _bgcolor;
  433. case ColorType.DefaultText:
  434. return _forecolor;
  435. default:
  436. throw new Exception("Unexpected decoration object");
  437. }
  438. }
  439. internal Font CalcFont(TextDecoration dec, CharGroup cg) {
  440. return CalcFontInternal(dec, cg, false).Font;
  441. }
  442. internal IntPtr CalcHFONT_NoUnderline(TextDecoration dec, CharGroup cg) {
  443. return CalcFontInternal(dec, cg, true).HFONT;
  444. }
  445. private FontHandle CalcFontInternal(TextDecoration dec, CharGroup cg, bool ignore_underline) {
  446. if(_font==null) CreateFonts();
  447. if(cg==CharGroup.TwoBytes) {
  448. if(dec==null) return _japaneseFont;
  449. if(dec.Bold) {
  450. if(!ignore_underline && dec.Underline)
  451. return _japaneseBoldunderlinefont;
  452. else
  453. return _japaneseBoldfont;
  454. }
  455. else if(!ignore_underline && dec.Underline)
  456. return _japaneseUnderlinefont;
  457. else
  458. return _japaneseFont;
  459. }
  460. else {
  461. if(dec==null) return _font;
  462. if(dec.Bold) {
  463. if(!ignore_underline && dec.Underline)
  464. return _boldunderlinefont;
  465. else
  466. return _boldfont;
  467. }
  468. else if(!ignore_underline && dec.Underline)
  469. return _underlinefont;
  470. else
  471. return _font;
  472. }
  473. }
  474. #endif
  475. }
  476. #if !MACRODOC
  477. //Escape sequence color
  478. public class EscapesequenceColorSet : ICloneable {
  479. private bool _isDefault;
  480. private Color[] _colors;
  481. public EscapesequenceColorSet() {
  482. _colors = new Color[8];
  483. SetDefault();
  484. }
  485. public bool IsDefault {
  486. get {
  487. return _isDefault;
  488. }
  489. }
  490. public object Clone() {
  491. EscapesequenceColorSet newval = new EscapesequenceColorSet();
  492. for(int i=0; i<_colors.Length; i++)
  493. newval._colors[i] = _colors[i];
  494. newval._isDefault = _isDefault;
  495. return newval;
  496. }
  497. public Color this[int index] {
  498. get {
  499. return _colors[index];
  500. }
  501. set {
  502. _colors[index] = value;
  503. if(_isDefault) _isDefault = GetDefaultColor(index)==value;
  504. }
  505. }
  506. public void SetDefault() {
  507. for(int i=0; i<_colors.Length; i++) {
  508. _colors[i] = GetDefaultColor(i);
  509. }
  510. _isDefault = true;
  511. }
  512. public string Format() {
  513. if(_isDefault) return "";
  514. StringBuilder bld = new StringBuilder();
  515. for(int i=0; i<_colors.Length; i++) {
  516. if(i>0) bld.Append(',');
  517. bld.Append(_colors[i].Name);
  518. }
  519. return bld.ToString();
  520. }
  521. public void Load(string value) {
  522. if(value==null)
  523. SetDefault();
  524. else {
  525. string[] cols = value.Split(',');
  526. if(cols.Length<_colors.Length)
  527. SetDefault();
  528. else {
  529. for(int i=0; i<cols.Length; i++) {
  530. _colors[i] = GUtil.ParseColor(cols[i], Color.Empty);
  531. if(_colors[i].IsEmpty) _colors[i] = GetDefaultColor(i);
  532. }
  533. _isDefault = false;
  534. }
  535. }
  536. }
  537. public static Color GetDefaultColor(int index) {
  538. switch(index) {
  539. case 0:
  540. return Color.Black;
  541. case 1:
  542. return Color.Red;
  543. case 2:
  544. return Color.Green;
  545. case 3:
  546. return Color.Yellow;
  547. case 4:
  548. return Color.Blue;
  549. case 5:
  550. return Color.Magenta;
  551. case 6:
  552. return Color.Cyan;
  553. case 7:
  554. return Color.White;
  555. default:
  556. return Color.Empty;
  557. }
  558. }
  559. }
  560. #endif
  561. }