赞 | 0 |
VIP | 12 |
好人卡 | 2 |
积分 | 6 |
经验 | 14000 |
最后登录 | 2024-10-8 |
在线时间 | 465 小时 |
Lv2.观梦者
- 梦石
- 0
- 星屑
- 567
- 在线时间
- 465 小时
- 注册时间
- 2009-10-11
- 帖子
- 407
|
試試這某高人寫的- #encoding:utf-8
- #==============================================================================
- # ■ [PS0]双默认字体
- # Draw_Text_DF
- #------------------------------------------------------------------------------
- # 对 Bitmap.draw_text 进行了重定义。
- #------------------------------------------------------------------------------
- # 若检测为纯中文,则使用默认字体;
- # 若检测为纯英文,则使用另一套字体。
- # 若检测结果为中英文混杂,则逐字描绘。
- #==============================================================================
- # [更新记录]
- # - 2012.01.27 By 各种压力的猫君
- # * 新写法自定义匹配更直观;
- # * 更改一些语句的执行顺序以优化效率;
- # * 重写基础x坐标获取方法,以兼容非等宽字体;
- # * BUILD2: 修正基础x坐标的一处笔误
- # - 2012.01.26 By 各种压力的猫君
- # * 修正居中及居右坐标计算错误
- # - 2012.01.25 By 各种压力的猫君
- # * 重写逐字描绘方法,修正当对齐方式不为0时的错误
- # - 2012.01.23 By 各种压力的猫君
- # * 初版
- #------------------------------------------------------------------------------
- # [使用方法]
- # - 插入到MAIN以上即可。
- #==============================================================================
- $_PS0 = {} if $_PS0 == nil
- $_PS0["Draw_Text_DF"] = 20120127.2
- #==============================================================================
- # [PS0] 通用配置模块
- #==============================================================================
- module PS0
- module Draw_Text_DF
-
- # 是否对str做前检测(若设定为false则一直使用逐字描绘/两次描绘)
- DO_PRE_CHECK = true
-
- # 默认字体(在这里指定了就不要再在MAIN里指定了)
- Font.default_name = "微軟正黑體"
-
- # 英文字体
- ENG_FONT = "Humanst521 BT"
-
- # 作用范围
- # 0:全部字体
- # 1:仅默认字体(即特殊指定的除外)
- DO_CHANGE = 1
-
- # 中英文混排时的描绘方式
- # 0:逐字描绘
- # 1:分段描绘
- DRAW_TYPE = 0
-
- # 自定义匹配
- # 若不需要符号请将REG2、REG3清空但保留外侧半角双引号
- REG1 = "0-9A-Za-z " # 数字、大小写字母、半角空格
- REG2 = ";:?!@#%^&*(){}[]=-+_/|,.<>" # 一般符号
- REG3 = "\"\'\$\\" # 特殊符号(要在前面加"\")
-
- # 生成真正的正则式(若不清楚切勿随意修改下一行)
- REG = /[#{REG1 + (REG2+REG3).gsub!(/./) { "\\" + [ DISCUZ_CODE_0 ] }}]/
-
- end
- end
- #==============================================================================
-
- class Bitmap
- #--------------------------------------------------------------------------
- # ● Draw text
- #--------------------------------------------------------------------------
- alias old_draw_text draw_text
- def draw_text(*args)
- #--------------------------------------------------------------------------
- # 当特殊字体且设定为不对特殊字体进行替换时,直接调用原有方式
- if self.font.name != Font.default_name && PS0::Draw_Text_DF::DO_CHANGE == 1
- old_draw_text(*args)
- else
- #--------------------------------------------------------------------------
- # 记录默认字体
- last_font_name = self.font.name
- # 获取参数
- if args[0].is_a?(Rect)
- rect, str, align = args[0..2]
- x, y, width, height = rect.x, rect.y, rect.width, rect.height
- else
- x, y, width, height, str, align = args[0..5]
- end
- str = str.to_s
- align = 0 if align.nil?
- # 执行前检测
- if PS0::Draw_Text_DF::DO_PRE_CHECK == true
- if str.scan(PS0::Draw_Text_DF::REG).size == 0 # 纯中文
- old_draw_text(*args)
- elsif str.scan(PS0::Draw_Text_DF::REG).size == str.size # 纯英文
- change_to_eng_font
- old_draw_text(*args)
- else
- case PS0::Draw_Text_DF::DRAW_TYPE
- when 0 ; draw_text_1by1(x, y, width, height, str, align)
- when 1 ; draw_text_npass(x, y, width, height, str, align)
- end
- end
- else
- case PS0::Draw_Text_DF::DRAW_TYPE
- when 0 ; draw_text_1by1(x, y, width, height, str, align)
- when 1 ; draw_text_npass(x, y, width, height, str, align)
- end
- end
- # 还原默认字体
- self.font.name = last_font_name
- end # <- 检测特殊字体
- end
- #--------------------------------------------------------------------------
- # ○ 逐字描绘
- #--------------------------------------------------------------------------
- def draw_text_1by1(x, y, width, height, str, align)
- # 记录默认字体
- last_font_name = self.font.name
- # 临时变量(x坐标偏移量)
- ox = 0
- # 根据不同对齐方式计算基础x坐标
- if align == 0 # 居左
- bx = x
- else
- # 分离两种字体对应的str以实现非等宽字体的长度识别
- str1 = str.clone.gsub!(PS0::Draw_Text_DF::REG) { "" }
- str2 = str.clone.gsub!(/(?!#{PS0::Draw_Text_DF::REG})./) { "" }
- str_width = text_size(str1).width
- change_to_eng_font
- str_width += text_size(str2).width
- case align
- when 0 # 居左
- bx = x
- when 1 # 居中
- bx = x + (width - str_width) / 2
- when 2 # 居右
- bx = x + (width - str_width)
- end
- end
- # 给字符串结尾添加特殊符号
- str += "\P"
- # 提取单个文字
- while (!(c = str.slice!(/./m)).nil?)
- # 还原默认字体
- self.font.name = last_font_name
- # 当满足正则匹配则替换字体
- change_to_eng_font if c.slice(PS0::Draw_Text_DF::REG)
- # 把前面的特殊符号删去(兼容Window_Command类的矩形选框)
- if c == "\P"
- c = ""
- else
- # 调用原方法
- old_draw_text((bx + ox), y, width, height, c, 0)
- # 横坐标偏移量
- ox += text_size(c).width
- end
- end
- end
- #--------------------------------------------------------------------------
- # ○ 变更为英文字体
- #--------------------------------------------------------------------------
- def change_to_eng_font
- self.font.name = PS0::Draw_Text_DF::ENG_FONT
- end
- end
复制代码 |
|