Font.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. /******************************************************************************/
  4. /******************************************************************************/
  5. cchar8 *EditFont::Ascii="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()[]<>{}`~_-+=;:,.?/|\\'\" ";
  6. /******************************************************************************/
  7. void EditFont::reset() {T=EditFont();}
  8. Str EditFont::chars()C
  9. {
  10. Str c;
  11. if(ascii )c+=Ascii;
  12. if(chinese )c+=LanguageSpecific(CN);
  13. if(japanese)c+=LanguageSpecific(JP);
  14. if(korean )c+=LanguageSpecific(KO);
  15. if(german )c+=LanguageSpecific(DE);
  16. if(french )c+=LanguageSpecific(FR);
  17. if(polish )c+=LanguageSpecific(PL);
  18. if(russian )c+=LanguageSpecific(RU);
  19. return c+custom_chars;
  20. }
  21. bool EditFont::make(Font &font, C Str *chars)C
  22. {
  23. Font::Params fp;
  24. fp.system_font =T.font;
  25. fp.characters =(chars ? *chars : T.chars());
  26. fp.size =size;
  27. fp.scale =scale;
  28. fp.mode =(clear_type ? Font::SMOOTHED : Font::DEFAULT);
  29. fp.software =(chars ? false : software ); // if 'chars' is provided then it means we're creating only a preview, so use HW to be able to draw
  30. fp.weight =weight ;
  31. fp.minimum_filter =min_filter ;
  32. fp.mip_maps =mip_maps ;
  33. fp.shadow_blur =shadow_blur ;
  34. fp.shadow_diagonal=diagonal_shadow;
  35. fp.shadow_opacity =shadow_opacity ;
  36. fp.shadow_spread =shadow_spread ;
  37. if(chars
  38. || fp.software)fp.image_type=IMAGE_L8A8; // if 'chars' is provided then it means we're creating only a preview, so use IMAGE_L8A8 for fast processing (use L8A8 also for software modes)
  39. return font.create(fp);
  40. }
  41. bool EditFont::newer(C EditFont &src)C
  42. {
  43. return diagonal_shadow_time>src.diagonal_shadow_time
  44. || clear_type_time>src.clear_type_time
  45. || software_time>src.software_time
  46. || ascii_time>src.ascii_time || german_time>src.german_time || french_time>src.french_time || polish_time>src.polish_time || chinese_time>src.chinese_time || japanese_time>src.japanese_time || korean_time>src.korean_time || russian_time>src.russian_time
  47. || mip_maps_time>src.mip_maps_time
  48. || size_time>src.size_time
  49. || scale_time>src.scale_time
  50. || weight_time>src.weight_time
  51. || min_filter_time>src.min_filter_time
  52. || shadow_blur_time>src.shadow_blur_time
  53. || shadow_opacity_time>src.shadow_opacity_time
  54. || shadow_spread_time>src.shadow_spread_time
  55. || font_time>src.font_time
  56. || custom_chars_time>src.custom_chars_time;
  57. }
  58. bool EditFont::equal(C EditFont &src)C
  59. {
  60. return diagonal_shadow_time==src.diagonal_shadow_time
  61. && clear_type_time==src.clear_type_time
  62. && software_time==src.software_time
  63. && ascii_time==src.ascii_time && german_time==src.german_time && french_time==src.french_time && polish_time==src.polish_time && chinese_time==src.chinese_time && japanese_time==src.japanese_time && korean_time==src.korean_time && russian_time==src.russian_time
  64. && mip_maps_time==src.mip_maps_time
  65. && size_time==src.size_time
  66. && scale_time==src.scale_time
  67. && weight_time==src.weight_time
  68. && min_filter_time==src.min_filter_time
  69. && shadow_blur_time==src.shadow_blur_time
  70. && shadow_opacity_time==src.shadow_opacity_time
  71. && shadow_spread_time==src.shadow_spread_time
  72. && font_time==src.font_time
  73. && custom_chars_time==src.custom_chars_time;
  74. }
  75. void EditFont::newData()
  76. {
  77. diagonal_shadow_time++;
  78. clear_type_time++;
  79. software_time++;
  80. ascii_time++; german_time++; french_time++; polish_time++; chinese_time++; japanese_time++; korean_time++; russian_time++;
  81. mip_maps_time++;
  82. size_time++;
  83. scale_time++;
  84. weight_time++;
  85. min_filter_time++;
  86. shadow_blur_time++;
  87. shadow_opacity_time++;
  88. shadow_spread_time++;
  89. font_time++; custom_chars_time++;
  90. }
  91. bool EditFont::sync(C EditFont &src)
  92. {
  93. bool changed=false;
  94. changed|=Sync(diagonal_shadow_time, src.diagonal_shadow_time, diagonal_shadow, src.diagonal_shadow);
  95. changed|=Sync( clear_type_time, src. clear_type_time, clear_type, src. clear_type);
  96. changed|=Sync( software_time, src. software_time, software, src. software);
  97. changed|=Sync( ascii_time, src. ascii_time, ascii, src. ascii);
  98. changed|=Sync( german_time, src. german_time, german, src. german);
  99. changed|=Sync( french_time, src. french_time, french, src. french);
  100. changed|=Sync( polish_time, src. polish_time, polish, src. polish);
  101. changed|=Sync( chinese_time, src. chinese_time, chinese, src. chinese);
  102. changed|=Sync( japanese_time, src. japanese_time, japanese, src. japanese);
  103. changed|=Sync( korean_time, src. korean_time, korean, src. korean);
  104. changed|=Sync( russian_time, src. russian_time, russian, src. russian);
  105. changed|=Sync( mip_maps_time, src. mip_maps_time, mip_maps, src. mip_maps);
  106. changed|=Sync( size_time, src. size_time, size, src. size);
  107. changed|=Sync( scale_time, src. scale_time, scale, src. scale);
  108. changed|=Sync( weight_time, src. weight_time, weight, src. weight);
  109. changed|=Sync( min_filter_time, src. min_filter_time, min_filter, src. min_filter);
  110. changed|=Sync( shadow_blur_time, src. shadow_blur_time, shadow_blur, src. shadow_blur);
  111. changed|=Sync( shadow_opacity_time, src. shadow_opacity_time, shadow_opacity, src. shadow_opacity);
  112. changed|=Sync( shadow_spread_time, src. shadow_spread_time, shadow_spread, src. shadow_spread);
  113. changed|=Sync( font_time, src. font_time, font, src. font);
  114. changed|=Sync( custom_chars_time, src. custom_chars_time, custom_chars, src. custom_chars);
  115. return changed;
  116. }
  117. bool EditFont::undo(C EditFont &src)
  118. {
  119. bool changed=false;
  120. changed|=Undo(diagonal_shadow_time, src.diagonal_shadow_time, diagonal_shadow, src.diagonal_shadow);
  121. changed|=Undo( clear_type_time, src. clear_type_time, clear_type, src. clear_type);
  122. changed|=Undo( software_time, src. software_time, software, src. software);
  123. changed|=Undo( ascii_time, src. ascii_time, ascii, src. ascii);
  124. changed|=Undo( german_time, src. german_time, german, src. german);
  125. changed|=Undo( french_time, src. french_time, french, src. french);
  126. changed|=Undo( polish_time, src. polish_time, polish, src. polish);
  127. changed|=Undo( chinese_time, src. chinese_time, chinese, src. chinese);
  128. changed|=Undo( japanese_time, src. japanese_time, japanese, src. japanese);
  129. changed|=Undo( korean_time, src. korean_time, korean, src. korean);
  130. changed|=Undo( russian_time, src. russian_time, russian, src. russian);
  131. changed|=Undo( mip_maps_time, src. mip_maps_time, mip_maps, src. mip_maps);
  132. changed|=Undo( size_time, src. size_time, size, src. size);
  133. changed|=Undo( scale_time, src. scale_time, scale, src. scale);
  134. changed|=Undo( weight_time, src. weight_time, weight, src. weight);
  135. changed|=Undo( min_filter_time, src. min_filter_time, min_filter, src. min_filter);
  136. changed|=Undo( shadow_blur_time, src. shadow_blur_time, shadow_blur, src. shadow_blur);
  137. changed|=Undo( shadow_opacity_time, src. shadow_opacity_time, shadow_opacity, src. shadow_opacity);
  138. changed|=Undo( shadow_spread_time, src. shadow_spread_time, shadow_spread, src. shadow_spread);
  139. changed|=Undo( font_time, src. font_time, font, src. font);
  140. changed|=Undo( custom_chars_time, src. custom_chars_time, custom_chars, src. custom_chars);
  141. return changed;
  142. }
  143. bool EditFont::save(File &f)C
  144. {
  145. f.cmpUIntV(5);
  146. f<<diagonal_shadow<<clear_type<<software<<ascii<<german<<french<<polish<<chinese<<japanese<<korean<<russian
  147. <<mip_maps<<size<<scale<<weight<<min_filter<<shadow_blur<<shadow_opacity<<shadow_spread
  148. <<diagonal_shadow_time<<clear_type_time<<software_time<<ascii_time<<german_time<<french_time<<polish_time<<chinese_time<<japanese_time<<korean_time<<russian_time
  149. <<mip_maps_time<<size_time<<scale_time<<weight_time<<min_filter_time<<shadow_blur_time<<shadow_opacity_time<<shadow_spread_time<<font_time<<custom_chars_time
  150. <<font<<custom_chars;
  151. return f.ok();
  152. }
  153. bool EditFont::load(File &f)
  154. {
  155. reset(); switch(f.decUIntV())
  156. {
  157. case 5:
  158. {
  159. f>>diagonal_shadow>>clear_type>>software>>ascii>>german>>french>>polish>>chinese>>japanese>>korean>>russian
  160. >>mip_maps>>size>>scale>>weight>>min_filter>>shadow_blur>>shadow_opacity>>shadow_spread
  161. >>diagonal_shadow_time>>clear_type_time>>software_time>>ascii_time>>german_time>>french_time>>polish_time>>chinese_time>>japanese_time>>korean_time>>russian_time
  162. >>mip_maps_time>>size_time>>scale_time>>weight_time>>min_filter_time>>shadow_blur_time>>shadow_opacity_time>>shadow_spread_time>>font_time>>custom_chars_time
  163. >>font>>custom_chars;
  164. if(f.ok())return true;
  165. }break;
  166. case 4:
  167. {
  168. f>>diagonal_shadow>>clear_type>>ascii>>german>>french>>polish>>chinese>>japanese>>korean>>russian
  169. >>mip_maps>>size>>scale>>weight>>min_filter>>shadow_blur>>shadow_opacity>>shadow_spread
  170. >>diagonal_shadow_time>>clear_type_time>>ascii_time>>german_time>>french_time>>polish_time>>chinese_time>>japanese_time>>korean_time>>russian_time
  171. >>mip_maps_time>>size_time>>scale_time>>weight_time>>min_filter_time>>shadow_blur_time>>shadow_opacity_time>>shadow_spread_time>>font_time>>custom_chars_time
  172. >>font>>custom_chars;
  173. if(f.ok())return true;
  174. }break;
  175. case 3:
  176. {
  177. f>>diagonal_shadow>>clear_type>>ascii>>german>>french>>polish>>chinese>>japanese>>korean>>russian
  178. >>mip_maps>>size>>scale>>weight>>min_filter>>shadow_blur>>shadow_opacity>>shadow_spread
  179. >>diagonal_shadow_time>>clear_type_time>>ascii_time>>german_time>>french_time>>polish_time>>chinese_time>>japanese_time>>korean_time>>russian_time
  180. >>mip_maps_time>>size_time>>scale_time>>weight_time>>min_filter_time>>shadow_blur_time>>shadow_opacity_time>>shadow_spread_time>>font_time>>custom_chars_time;
  181. GetStr2(f, font); GetStr2(f, custom_chars);
  182. if(f.ok())return true;
  183. }break;
  184. case 2:
  185. {
  186. f>>diagonal_shadow>>clear_type>>ascii>>german>>french>>polish>>chinese>>japanese>>korean>>russian
  187. >>mip_maps>>size>>weight>>min_filter>>shadow_blur>>shadow_opacity>>shadow_spread
  188. >>diagonal_shadow_time>>clear_type_time>>ascii_time>>german_time>>french_time>>polish_time>>chinese_time>>japanese_time>>korean_time>>russian_time
  189. >>mip_maps_time>>size_time>>weight_time>>min_filter_time>>shadow_blur_time>>shadow_opacity_time>>shadow_spread_time>>font_time>>custom_chars_time;
  190. GetStr2(f, font); GetStr2(f, custom_chars);
  191. if(f.ok())return true;
  192. }break;
  193. case 1:
  194. {
  195. f>>diagonal_shadow>>clear_type>>ascii>>german>>french>>polish>>chinese>>japanese>>korean>>russian
  196. >>mip_maps>>size>>weight>>min_filter>>shadow_blur>>shadow_opacity
  197. >>diagonal_shadow_time>>clear_type_time>>ascii_time>>german_time>>french_time>>polish_time>>chinese_time>>japanese_time>>korean_time>>russian_time
  198. >>mip_maps_time>>size_time>>weight_time>>min_filter_time>>shadow_blur_time>>shadow_opacity_time>>font_time>>custom_chars_time;
  199. GetStr(f, font); GetStr(f, custom_chars);
  200. if(f.ok())return true;
  201. }break;
  202. case 0:
  203. {
  204. f>>diagonal_shadow>>clear_type>>ascii>>german>>french>>polish>>chinese>>russian
  205. >>mip_maps>>size>>weight>>min_filter>>shadow_blur>>shadow_opacity
  206. >>diagonal_shadow_time>>clear_type_time>>ascii_time>>german_time>>french_time>>polish_time>>chinese_time>>russian_time
  207. >>mip_maps_time>>size_time>>weight_time>>min_filter_time>>shadow_blur_time>>shadow_opacity_time>>font_time>>custom_chars_time;
  208. GetStr(f, font); GetStr(f, custom_chars);
  209. if(f.ok())return true;
  210. }break;
  211. }
  212. reset(); return false;
  213. }
  214. bool EditFont::load(C Str &name)
  215. {
  216. File f; if(f.readTry(name))return load(f);
  217. reset(); return false;
  218. }
  219. EditFont::EditFont() : diagonal_shadow(true), clear_type(false), software(false), ascii(true), german(false), french(false), polish(false), chinese(false), japanese(false), korean(false), russian(false), mip_maps(0), size(48), scale(1), weight(0), min_filter(0), shadow_blur(0.04f), shadow_opacity(1.0f), shadow_spread(0.0f), font("Arial") {}
  220. /******************************************************************************/