设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 980|回复: 0
打印 上一主题 下一主题

[原创发布] TextBoard2.0

[复制链接]

Lv4.逐梦者

梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
帖子
234
跳转到指定楼层
1
发表于 2023-6-24 10:04:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 RPGzh500223 于 2023-6-24 10:13 编辑

RUBY 代码复制
  1. =begin
  2.  
  3. 使用FreeType进行中文的文本描绘,脚本编辑器置顶即可
  4. 支持文字粗体、斜体、旋转、描边、阴影
  5. 使用内存字体文件,仅支持矢量字体,不支持字体的kern设置
  6. CPU支持SSE
  7.  
  8. FontEx用13个元素的数组来表示字体
  9.  [0] 内存字体文件 String
  10.  [1] 字体大小     Fixnum  须大于0
  11.  [2] 字体颜色     Fixnum/BigNum  单色填充  0xAaRrGgBb
  12.                   String  沿文字方向线性渐变填充
  13.                             渐变由节点描述,节点结构 float pos, int argb
  14.                             至少2个节点,首节点pos须0.0f,尾节点pos须1.0f
  15.                             后节点比前节点pos大0.001
  16.  [3] 水平方向斜体 Fixnum/Float  与Y正半轴的顺时针夹角 取值范围 [-65, 65]
  17.  [4] 垂直方向斜体 Fixnum/Float  与X正半轴的顺时针夹角 取值范围 [-65, 65]
  18.                                   当水平方向斜体为0时,才有效
  19.  [5] 文本旋转角度 Fixnum/Float  与文字方向的逆时针夹角
  20.  [6] 水平方向粗体 Fixnum  可以负值
  21.  [7] 垂直方向粗体 Fixnum  可以负值
  22.  [8] 描边大小     Fixnum  须大于等于0
  23.  [9] 描边颜色     Fixnum/BigNum  单色填充  0xAaRrGgBb
  24.  [10]阴影         0/nil   表示无阴影
  25.                   String  阴影描述,由节点组成,可多个节点
  26.                           阴影节点 char offset_hori 相对于主体的水平偏移
  27.                                    char offset_vert 相对于主体的垂直偏移
  28.                                    char blur_size   模糊大小 建议 -16..16
  29.                                                     负值类似空心效果
  30.                                    char blend_times 阴影加强,类似PS ctrl+j
  31.                                     int argb        阴影颜色                                             
  32.  [11]字体间距     Fixnum  字体间距调整值
  33.  [12]标志参数     Fixnum  
  34.                           0..1bit 描绘方式 0: 正常;1: 加法;2: 减法
  35.                                            加减法只影响alpha通道,3修正为0
  36.                              2bit 布局方式 0:水平;1: 垂直
  37.                              3bit [11]字体间距计算方式
  38.                                   0: 额外附加值;1: 绝对值作为总间距
  39.                              4bit 中文水平标点符号修正为垂直符号(垂直布局时)
  40.                                   0: 不修正;1: 修正
  41.  
  42. 颜色直接使用数值表示,并不使用RMXP的Color对象
  43.   单色描绘时,颜色设置为0时,不进行描绘
  44.  
  45. 文字描绘由单个字符分3层(先后依次为 阴影、描边、主体)描绘,字符可能相互影响
  46.   描边是字体轮廓,类似空心字体的效果
  47.   阴影以主体为基础,不包括描边
  48.  
  49. 不进行主体描绘,[2] = 0
  50. 不进行描边描绘,[8] = 0
  51. 不进行阴影描绘,[10] = 0 或 nil
  52.  
  53. 文本的要求,仅支持符合Utf8编码的部分(字符的首字节与后续字节都必须符合)
  54.  
  55. int, char, float,short 为C语言的类型
  56. =end
  57.  
  58. class FontEx < Array
  59.  
  60.   def initialize(name = @@default_name, *args)
  61.     super(13, 0)
  62.     t = args.size
  63.     t = 12 if t > 12
  64.     t.times {|i| self[i + 1] = args[i] }
  65.     self.name = name
  66.     self[1] = @@default_size  if t == 0
  67.     self[2] = @@default_color if t == 1
  68.   end
  69.  
  70.  
  71.   ["file_buffer", "size", "color", "oblique_x", "oblique_y",
  72.    "rotate_angle", "bold_x", "bold_y", "stroke_size", "stroke_color",
  73.    "shadow", "kerning", "flags"].each_with_index do |attr, i|
  74.  
  75.     define_method(attr) { self[i] }
  76.     define_method(attr + "=") {|value| self[i] = value}     
  77.   end
  78.  
  79.   def name
  80.     @font_name
  81.   end
  82.  
  83.   def name=(font_name)
  84.     @font_name = @@font_cache.include?(font_name) ? font_name : @@default_name
  85.     self[0] = @@font_cache[@font_name]
  86.   end
  87.  
  88.   def blend_type
  89.     self[12] & 3
  90.   end
  91.  
  92.   def blend_type=(type)
  93.     type = 0 if type < 0 || type > 2
  94.     self[12] = (self[12] & -4) | type
  95.   end
  96.  
  97.   def layout
  98.     self[12][2]
  99.   end
  100.  
  101.   def layout_hori
  102.     self[12] &= -5
  103.   end
  104.  
  105.   def layout_vert(bPunctAmend = false)
  106.     self[12] |= 4
  107.     self[12] |= 16  if bPunctAmend == true
  108.     self[12] &= -17 if bPunctAmend == false
  109.   end
  110.  
  111.   def kerning_fixed=(bool)
  112.     self[12] |= 8  if bool == true
  113.     self[12] &= -9 if bool == false
  114.   end
  115.  
  116.   def clampByte(value)
  117.     value = 0   if value < 0
  118.     value = 255 if value > 255
  119.     return value.to_i
  120.   end
  121.  
  122.   def make_color(r, g, b, a)
  123.     r = self.clampByte(r)
  124.     g = self.clampByte(g)
  125.     b = self.clampByte(b)
  126.     a = self.clampByte(a)
  127.     return a << 24 | r << 16 | g << 8 | b
  128.   end
  129.  
  130.   def color_set(r, g, b, a = 255)
  131.     self[2] = self.make_color(r, g, b, a)
  132.   end
  133.  
  134.   def stroke_color_set(r, g, b, a = 255)
  135.     self[9] = make_color(r, g, b, a)
  136.   end
  137.  
  138.   dll = "FreeType_RMXP.dll"
  139.  
  140.   Text_Out = Win32API.new(dll, 'text_out', 'LLLLLLL', 'L')
  141.   Text_Out_Bzr = Win32API.new(dll, 'text_out_BZR', 'LLLLLLLL', 'L')
  142.   Text_Size = Win32API.new(dll, 'text_size', 'LLLL', 'L')
  143.   Draw_Text = Win32API.new(dll, 'draw_text', 'LLLLLL', 'L')
  144.  
  145.   #————————————————————————————
  146.   # 类似GDI的text_out
  147.   #     bitmap: 位图对象
  148.   #      dx/dy: 文本描绘的位置
  149.   #       text: 文本描绘的字符串
  150.   # cTerminate: 字符串的终止符(终止符时仅最低位字节有效)
  151.   #  alignBsln: 文本描绘的基准线对齐方式( < 0 或 > 2 修正为0 )
  152.   #               水平布局时,0=>字符框顶端;1=>水平基准线;2=>字符框底端
  153.   #               垂直布局时,0=>字符框左端;1=>垂直基准线;2=>字符框右端
  154.   # alignPoint: 点(dx, dy)在文本描绘基准线上的位置( < 0 或 > 2 修正为0 )
  155.   #               0=>起始点;1=>中间点;2=>终止点
  156.   #
  157.   # 备注:对齐方式,不含阴影部分
  158.   #————————————————————————————
  159.   def text_out(bitmap, dx, dy, text, cTerminate = -1, alignBsln = 0,
  160.     alignPoint = 0)
  161.  
  162.     alignBsln = 0 if alignBsln < 0 || alignBsln > 2
  163.     alignPoint = 0 if alignPoint < 0 || alignPoint > 2
  164.  
  165.     Text_Out.call(bitmap.__id__, dx, dy, text.__id__, cTerminate,
  166.       self.__id__, alignBsln | alignPoint << 4)
  167.   end
  168.  
  169.   #————————————————————————————
  170.   # 使用二阶贝塞尔曲线实现的文本路径描绘
  171.   #     bitmap: 位图对象  
  172.   #       text: 文本描绘的字符串
  173.   # cTerminate: 字符串的终止符(仅最低位字节有效)
  174.   #     points: 贝塞尔曲线控制点的字符串,点结构 short x, short y
  175.   #               至少3个点,后续每2个点与前一个点构成新的二阶贝塞尔曲线
  176.   #               p0, p1, p2, p3, p4
  177.   #               p0, p1, p2
  178.   #                       p2, p3, p4
  179.   #       step: 贝塞尔曲线计算时的步数,该值越小,文本间距越大
  180.   #  alignBsln: 文本描绘的对齐方式( < 0 或 > 3 修正为0 )
  181.   #               水平布局时,0=>水平基准线;1=>字符框顶端
  182.   #                           2=>字符框上下中端;3=>字符框底端
  183.   #               垂直布局时,0=>垂直基准线;1=>字符框左端
  184.   #                           2=>字符框左右中端;3=>字符框右端
  185.   #    bSmooth: 多个二阶贝塞尔曲线之间是否平滑过渡
  186.   #               p0, p1, p1.5
  187.   #                       p1.5, p2, p2.5
  188.   #                                 p2.5, p3, p4
  189.   # bCurveLine: 贝塞尔曲线是否直接写入位图( 不推荐使用 )
  190.   #curve_color: 贝塞尔曲线的颜色,0xAaRrGgBb
  191.   #
  192.   # 备注:不支持 kerning_fixed = true
  193.   #————————————————————————————
  194.   def text_out_path(bitmap, text, cTerminate, points, step,
  195.     alignBsln = 0, bSmooth = false, bCurveLine = false, curve_color = -1)
  196.  
  197.     mode = alignBsln
  198.     mode = 0 if alignBsln < 0 || alignBsln > 3
  199.     mode |= 0x10 if bSmooth == true
  200.     mode |= 0x100 if bCurveLine == true
  201.  
  202.     Text_Out_Bzr.call(bitmap.__id__, text.__id__, cTerminate, self.__id__,
  203.       points.__id__, step, mode, curve_color)
  204.   end
  205.  
  206.   # 搭配draw_text使用,计算的文本大小含阴影部分
  207.   def text_size(text, cTerminate = -1)
  208.     rect = Rect.new(0, 0, 0, 0)
  209.     Text_Size.call(self.__id__, text.__id__, cTerminate, rect.__id__)
  210.     return rect
  211.   end
  212.  
  213.   #————————————————————————————
  214.   # 类似GDI的draw_text
  215.   #     bitmap: 位图对象
  216.   #       rect: 文本描绘的位置区域,RMXP Rect对象
  217.   #       text: 文本描绘的字符串
  218.   # cTerminate: 字符串的终止符(仅最低位字节有效)
  219.   #      align: 文本描绘的对齐方式( < 0 或 > 9 修正为4 )
  220.   #               对齐方式参考小键盘的1-9
  221.   #————————————————————————————
  222.   def draw_text(bitmap, rect, text, cTerminate = -1, align = 4)
  223.     align = 4 if align < 1 || align > 9
  224.     Draw_Text.call(bitmap.__id__, rect.__id__, text.__id__, cTerminate,
  225.       self.__id__, align)
  226.   end
  227.  
  228.   class << self
  229.     def cache_clear
  230.       @@font_cache.clear
  231.     end
  232.  
  233.     # font_name作为键值,可以自定义
  234.     def add_font(file_path, font_name)
  235.       return if @@font_cache.has_key?(font_name)
  236.       open(file_path, "rb") {|f| @@font_cache[font_name] = f.read }
  237.     end
  238.  
  239.     def remove_font(font_name)
  240.       @@font_cache.delete(font_name)
  241.     end
  242.   end
  243.  
  244.   @@font_cache = {}
  245.   @@default_name = "黑体"
  246.   @@default_size = 22
  247.   @@default_color = -1
  248.  
  249.   # 添加需要使用的字体
  250.   FontEx.add_font("C:/Windows/Fonts/simhei.ttf", "黑体")
  251. end

FreeType_RMXP.zip

288.2 KB, 下载次数: 8

FreeType_RMXP.dll

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-21 21:40

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表