Project1

标题: 去除RM字体渲染(像素字体) [打印本页]

作者: 紫英晓狼1130    时间: 2014-7-26 16:38
标题: 去除RM字体渲染(像素字体)
本帖最后由 紫英晓狼1130 于 2016-8-7 13:01 编辑

介绍
此技术非本人开发
可以去除RM字体渲染,应该是通用的
并且脚本没有汉化都是一些日文

使用
1.复制目录下的"TRGSSX.dll"
2.复制脚本"位图扩张"
3.成功移植
4.注意去除渲染仅限于draw_text的描绘方法,其它不可以,比如增强对话等

图片


脚本
  1. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  2. #_/    ◆ ビットマップ拡張 - KGC_BitmapExtension ◆ XP/VX ◆
  3. #_/    ◇ Last update : 2009/09/13 ◇
  4. #_/----------------------------------------------------------------------------
  5. #_/  Bitmap クラスに様々な描画機能を追加します。
  6. #_/  XP/VX のどちらでも使用することができます。
  7. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

  8. #==============================================================================
  9. # ★ カスタマイズ項目 - Customize BEGIN ★
  10. #==============================================================================

  11. module KGC
  12. module BitmapExtension
  13.   # ◆ draw_text 动作设置
  14.   #   0 : 默认draw_text效果
  15.   #   1 : 无边缘平滑效果(伪点阵)
  16.   #   2 : 高速描绘
  17.   # 1 or 2 を指定すると、draw_text が draw_text_na 等に置換されます。
  18.   # (元の draw_text は _draw_text で呼び出せます)
  19.   DEFAULT_MODE = 1

  20.   # ◆ 各モードのデフォルトフォント名
  21.   #   ["フォント 1", "フォント 2", ...],
  22.   #  という書式で設定。
  23.   DEFAULT_FONT_NAME = [
  24.     Font.default_name,  # 0
  25.     Font.default_name,  # 1
  26.     Font.default_name,  # 2
  27.   ]

  28.   # ◆ デフォルトで縁取りにする
  29.   #  draw_text には無効。
  30.   DEFAULT_FRAME = false

  31.   # ◆ デフォルトのグラデーション色
  32.   #  グラデーションをかけない場合は nil
  33.   #  draw_text には無効。
  34.   DEFAULT_GRAD_COLOR = nil
  35. end
  36. end


  37. $imported = {} if $imported == nil
  38. $imported["BitmapExtension"] = true

  39. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  40. #==============================================================================
  41. # □ TRGSSX
  42. #------------------------------------------------------------------------------
  43. #   "TRGSSX.dll" の機能を扱うモジュールです。
  44. #==============================================================================

  45. module TRGSSX
  46.   # 合成タイプ
  47.   BLEND_NORMAL  = 0  # 通常
  48.   BLEND_ADD     = 1  # 加算
  49.   BLEND_SUB     = 2  # 減算
  50.   BLEND_MUL     = 3  # 乗算
  51.   BLEND_HILIGHT = 4  # 覆い焼き

  52.   # ラスタオペレーションコード
  53.   SRCCOPY     = 0x00CC0020  # dest = src
  54.   SRCPAINT    = 0x00EE0086  # dest = dest | src
  55.   SRCAND      = 0x008800C6  # dest = dest & src
  56.   SRCINVERT   = 0x00660046  # dest = dest ^ src
  57.   SRCERASE    = 0x00440328  # dest = dest & ~src
  58.   NOTSRCCOPY  = 0x00330008  # dest = ~src
  59.   NOTSRCERASE = 0x001100A6  # dest = ~(dest | src) = ~dest & ~src

  60.   # 補間方法
  61.   IM_INVALID             = -1
  62.   IM_DEFAULT             = 0
  63.   IM_LOWQUALITY          = 1
  64.   IM_HIGHQUALITY         = 2
  65.   IM_BILINEAR            = 3
  66.   IM_BICUBIC             = 4
  67.   IM_NEARESTNEIGHBOR     = 5
  68.   IM_HIGHQUALITYBILINEAR = 6
  69.   IM_HIGHQUALITYBICUBIC  = 7

  70.   # スムージングモード
  71.   SM_INVALID     = -1
  72.   SM_DEFAULT     = 0
  73.   SM_HIGHSPEED   = 1
  74.   SM_HIGHQUALITY = 2
  75.   SM_NONE        = 3
  76.   SM_ANTIALIAS   = 4

  77.   # 塗り潰しモード
  78.   FM_FIT    = 0  # 形状通り
  79.   FM_CIRCLE = 1  # 外接円

  80.   # フォントスタイル
  81.   FS_BOLD      = 0x0001  # ボールド
  82.   FS_ITALIC    = 0x0002  # イタリック
  83.   FS_UNDERLINE = 0x0004  # 下線
  84.   FS_STRIKEOUT = 0x0008  # 取り消し線
  85.   FS_SHADOW    = 0x0010  # 影
  86.   FS_FRAME     = 0x0020  # 縁取り

  87.   DLL_NAME = 'TRGSSX.dll'
  88.   begin
  89.     NO_TRGSSX = false
  90.     unless defined?(@@_trgssx_version)
  91.       @@_trgssx_version =
  92.         Win32API.new(DLL_NAME, 'DllGetVersion', 'v', 'l')
  93.       @@_trgssx_get_interpolation_mode =
  94.         Win32API.new(DLL_NAME, 'GetInterpolationMode', 'v', 'l')
  95.       @@_trgssx_set_interpolation_mode =
  96.         Win32API.new(DLL_NAME, 'SetInterpolationMode', 'l', 'v')
  97.       @@_trgssx_get_smoothing_mode =
  98.         Win32API.new(DLL_NAME, 'GetSmoothingMode', 'v', 'l')
  99.       @@_trgssx_set_smoothing_mode =
  100.         Win32API.new(DLL_NAME, 'SetSmoothingMode', 'l', 'v')
  101.       @@_trgssx_rop_blt =
  102.         Win32API.new(DLL_NAME, 'RopBlt', 'pllllplll', 'l')
  103.       @@_trgssx_clip_blt =
  104.         Win32API.new(DLL_NAME, 'ClipBlt', 'pllllplll', 'l')
  105.       @@_trgssx_blend_blt =
  106.         Win32API.new(DLL_NAME, 'BlendBlt', 'pllllplll', 'l')
  107.       @@_trgssx_stretch_blt_r =
  108.         Win32API.new(DLL_NAME, 'StretchBltR', 'pllllplllll', 'l')
  109.       @@_trgssx_skew_blt_r =
  110.         Win32API.new(DLL_NAME, 'SkewBltR', 'pllpllllll', 'l')
  111.       @@_trgssx_draw_polygon =
  112.         Win32API.new(DLL_NAME, 'DrawPolygon', 'pplll', 'l')
  113.       @@_trgssx_fill_polygon =
  114.         Win32API.new(DLL_NAME, 'FillPolygon', 'ppllll', 'l')
  115.       @@_trgssx_draw_regular_polygon =
  116.         Win32API.new(DLL_NAME, 'DrawRegularPolygon', 'pllllll', 'l')
  117.       @@_trgssx_fill_regular_polygon =
  118.         Win32API.new(DLL_NAME, 'FillRegularPolygon', 'plllllll', 'l')
  119.       @@_trgssx_draw_spoke =
  120.         Win32API.new(DLL_NAME, 'DrawSpoke', 'pllllll', 'l')
  121.       @@_trgssx_draw_text_na =
  122.         Win32API.new(DLL_NAME, 'DrawTextNAA', 'pllllpplpll', 'l')
  123.       @@_trgssx_draw_text_fast =
  124.         Win32API.new(DLL_NAME, 'DrawTextFastA', 'pllllpplpll', 'l')
  125.       @@_trgssx_get_text_size_na =
  126.         Win32API.new(DLL_NAME, 'GetTextSizeNAA', 'pppllp', 'l')
  127.       @@_trgssx_get_text_size_fast =
  128.         Win32API.new(DLL_NAME, 'GetTextSizeFastA', 'pppllp', 'l')
  129.       @@_trgssx_save_to_bitmap =
  130.         Win32API.new(DLL_NAME, 'SaveToBitmapA', 'pp', 'l')
  131.     end
  132.   rescue
  133.     NO_TRGSSX = true
  134.     print "\"#{DLL_NAME}.dll\" が見つからない、" +
  135.       "もしくは古いバージョンを使用しています。"
  136.     exit
  137.   end

  138.   module_function
  139.   #--------------------------------------------------------------------------
  140.   # ○ バージョン取得
  141.   #     (<例> 1.23 → 123)
  142.   #--------------------------------------------------------------------------
  143.   def version
  144.     return -1 if NO_TRGSSX

  145.     return @@_trgssx_version.call
  146.   end
  147.   #--------------------------------------------------------------------------
  148.   # ○ GetInterpolationMode
  149.   #--------------------------------------------------------------------------
  150.   def get_interpolation_mode
  151.     return @@_trgssx_get_interpolation_mode.call
  152.   end
  153.   #--------------------------------------------------------------------------
  154.   # ○ SetInterpolationMode
  155.   #--------------------------------------------------------------------------
  156.   def set_interpolation_mode(mode)
  157.     @@_trgssx_set_interpolation_mode.call(mode)
  158.   end
  159.   #--------------------------------------------------------------------------
  160.   # ○ GetSmoothingMode
  161.   #--------------------------------------------------------------------------
  162.   def get_smoothing_mode
  163.     return @@_trgssx_get_smoothing_mode.call
  164.   end
  165.   #--------------------------------------------------------------------------
  166.   # ○ SetSmoothingMode
  167.   #--------------------------------------------------------------------------
  168.   def set_smoothing_mode(mode)
  169.     @@_trgssx_set_smoothing_mode.call(mode)
  170.   end
  171.   #--------------------------------------------------------------------------
  172.   # ○ BitBltRop
  173.   #--------------------------------------------------------------------------
  174.   def rop_blt(dest_info, dx, dy, dw, dh, src_info, sx, sy, rop)
  175.     return @@_trgssx_rop_blt.call(dest_info, dx, dy, dw, dh,
  176.       src_info, sx, sy, rop)
  177.   end
  178.   #--------------------------------------------------------------------------
  179.   # ○ ClipBlt
  180.   #--------------------------------------------------------------------------
  181.   def clip_blt(dest_info, dx, dy, dw, dh, src_info, sx, sy, hRgn)
  182.     return @@_trgssx_clip_blt.call(dest_info, dx, dy, dw, dh,
  183.       src_info, sx, sy, hRgn)
  184.   end
  185.   #--------------------------------------------------------------------------
  186.   # ○ BlendBlt
  187.   #--------------------------------------------------------------------------
  188.   def blend_blt(dest_info, dx, dy, dw, dh, src_info, sx, sy, blend)
  189.     return @@_trgssx_blend_blt.call(dest_info, dx, dy, dw, dh,
  190.       src_info, sx, sy, blend)
  191.   end
  192.   #--------------------------------------------------------------------------
  193.   # ○ StretchBltR
  194.   #--------------------------------------------------------------------------
  195.   def stretch_blt_r(dest_info, dx, dy, dw, dh, src_info, sx, sy, sw, sh, op)
  196.     return @@_trgssx_stretch_blt_r.call(dest_info, dx, dy, dw, dh,
  197.       src_info, sx, sy, sw, sh, op)
  198.   end
  199.   #--------------------------------------------------------------------------
  200.   # ○ SkewBltR
  201.   #--------------------------------------------------------------------------
  202.   def skew_blt_r(dest_info, dx, dy, src_info, sx, sy, sw, sh, slope, op)
  203.     return @@_trgssx_skew_blt_r.call(dest_info, dx, dy,
  204.       src_info, sx, sy, sw, sh, slope, op)
  205.   end
  206.   #--------------------------------------------------------------------------
  207.   # ○ DrawPolygon
  208.   #--------------------------------------------------------------------------
  209.   def draw_polygon(dest_info, pts, n, color, width)
  210.     return @@_trgssx_draw_polygon.call(dest_info, pts,
  211.       n, color, width)
  212.   end
  213.   #--------------------------------------------------------------------------
  214.   # ○ FillPolygon
  215.   #--------------------------------------------------------------------------
  216.   def fill_polygon(dest_info, pts, n, st_color, ed_color, fm)
  217.     return @@_trgssx_fill_polygon.call(dest_info, pts,
  218.       n, st_color, ed_color, fm)
  219.   end
  220.   #--------------------------------------------------------------------------
  221.   # ○ DrawRegularPolygon
  222.   #--------------------------------------------------------------------------
  223.   def draw_regular_polygon(dest_info, dx, dy, r, n, color, width)
  224.     return @@_trgssx_draw_regular_polygon.call(dest_info, dx, dy,
  225.       r, n, color, width)
  226.   end
  227.   #--------------------------------------------------------------------------
  228.   # ○ FillRegularPolygon
  229.   #--------------------------------------------------------------------------
  230.   def fill_regular_polygon(dest_info, dx, dy, r, n, st_color, ed_color, fm)
  231.     return @@_trgssx_fill_regular_polygon.call(dest_info, dx, dy,
  232.       r, n, st_color, ed_color, fm)
  233.   end
  234.   #--------------------------------------------------------------------------
  235.   # ○ DrawSpoke
  236.   #--------------------------------------------------------------------------
  237.   def draw_spoke(dest_info, dx, dy, r, n, color, width)
  238.     return @@_trgssx_draw_spoke.call(dest_info, dx, dy,
  239.       r, n, color, width)
  240.   end
  241.   #--------------------------------------------------------------------------
  242.   # ○ DrawTextNAA
  243.   #--------------------------------------------------------------------------
  244.   def draw_text_na(dest_info, dx, dy, dw, dh, text,
  245.       fontname, fontsize, color, align, flags)
  246.     return @@_trgssx_draw_text_na.call(dest_info, dx, dy, dw, dh, text.dup,
  247.       fontname, fontsize, color, align, flags)
  248.   end
  249.   #--------------------------------------------------------------------------
  250.   # ○ DrawTextFastA
  251.   #--------------------------------------------------------------------------
  252.   def draw_text_fast(dest_info, dx, dy, dw, dh, text,
  253.       fontname, fontsize, color, align, flags)
  254.     return @@_trgssx_draw_text_fast.call(dest_info, dx, dy, dw, dh, text.dup,
  255.       fontname, fontsize, color, align, flags)
  256.   end
  257.   #--------------------------------------------------------------------------
  258.   # ○ GetTextSizeNAA
  259.   #--------------------------------------------------------------------------
  260.   def get_text_size_na(dest_info, text, fontname, fontsize, flags, size)
  261.     return @@_trgssx_get_text_size_na.call(dest_info, text,
  262.       fontname, fontsize, flags, size)
  263.   end
  264.   #--------------------------------------------------------------------------
  265.   # ○ GetTextSizeFastA
  266.   #--------------------------------------------------------------------------
  267.   def get_text_size_fast(dest_info, text, fontname, fontsize, flags, size)
  268.     return @@_trgssx_get_text_size_fast.call(dest_info, text,
  269.       fontname, fontsize, flags, size)
  270.   end
  271.   #--------------------------------------------------------------------------
  272.   # ○ SaveToBitmapA
  273.   #--------------------------------------------------------------------------
  274.   def save_to_bitmap(filename, info)
  275.     return @@_trgssx_save_to_bitmap.call(filename, info)
  276.   end
  277. end

  278. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  279. #==============================================================================
  280. # ■ Bitmap
  281. #==============================================================================

  282. class Bitmap
  283.   #--------------------------------------------------------------------------
  284.   # ○ 補間モード取得
  285.   #--------------------------------------------------------------------------
  286.   def self.interpolation_mode
  287.     return -1 if TRGSSX::NO_TRGSSX

  288.     return TRGSSX.get_interpolation_mode
  289.   end
  290.   #--------------------------------------------------------------------------
  291.   # ○ 補間モード設定
  292.   #--------------------------------------------------------------------------
  293.   def self.interpolation_mode=(value)
  294.     return if TRGSSX::NO_TRGSSX

  295.     TRGSSX.set_interpolation_mode(value)
  296.   end
  297.   #--------------------------------------------------------------------------
  298.   # ○ スムージングモード取得
  299.   #--------------------------------------------------------------------------
  300.   def self.smoothing_mode
  301.     return -1 if TRGSSX::NO_TRGSSX

  302.     return TRGSSX.get_smoothing_mode
  303.   end
  304.   #--------------------------------------------------------------------------
  305.   # ○ スムージングモード設定
  306.   #--------------------------------------------------------------------------
  307.   def self.smoothing_mode=(value)
  308.     return if TRGSSX::NO_TRGSSX

  309.     TRGSSX.set_smoothing_mode(value)
  310.   end
  311.   #--------------------------------------------------------------------------
  312.   # ○ ビットマップ情報 (object_id, width, height) の pack を取得
  313.   #--------------------------------------------------------------------------
  314.   def get_base_info
  315.     return [object_id, width, height].pack('l!3')
  316.   end
  317.   #--------------------------------------------------------------------------
  318.   # ○ ラスタオペレーションを使用して描画
  319.   #     rop : ラスタオペレーションコード
  320.   #--------------------------------------------------------------------------
  321.   def rop_blt(x, y, src_bitmap, src_rect, rop = TRGSSX::SRCCOPY)
  322.     return -1 if TRGSSX::NO_TRGSSX

  323.     return TRGSSX.rop_blt(get_base_info,
  324.       x, y, src_rect.width, src_rect.height,
  325.       src_bitmap.get_base_info, src_rect.x, src_rect.y, rop)
  326.   end
  327.   #--------------------------------------------------------------------------
  328.   # ○ クリッピング描画
  329.   #     region : リージョン
  330.   #--------------------------------------------------------------------------
  331.   def clip_blt(x, y, src_bitmap, src_rect, region)
  332.     return -1 if TRGSSX::NO_TRGSSX

  333.     hRgn = region.create_region_handle
  334.     return if hRgn == nil || hRgn == 0

  335.     result = TRGSSX.clip_blt(get_base_info,
  336.       x, y, src_rect.width, src_rect.height,
  337.       src_bitmap.get_base_info, src_rect.x, src_rect.y, hRgn)
  338.     # 後始末
  339.     Region.delete_region_handles

  340.     return result
  341.   end
  342.   #--------------------------------------------------------------------------
  343.   # ○ ブレンド描画
  344.   #     blend : ブレンドタイプ
  345.   #--------------------------------------------------------------------------
  346.   def blend_blt(x, y, src_bitmap, src_rect, blend = TRGSSX::BLEND_NORMAL)
  347.     return -1 if TRGSSX::NO_TRGSSX

  348.     return TRGSSX.blend_blt(get_base_info,
  349.       x, y, src_rect.width, src_rect.height,
  350.       src_bitmap.get_base_info, src_rect.x, src_rect.y, blend)
  351.   end
  352.   #--------------------------------------------------------------------------
  353.   # ○ 高画質ブロック転送
  354.   #--------------------------------------------------------------------------
  355.   def stretch_blt_r(dest_rect, src_bitmap, src_rect, opacity = 255)
  356.     return -1 if TRGSSX::NO_TRGSSX

  357.     return TRGSSX.stretch_blt_r(get_base_info,
  358.       dest_rect.x, dest_rect.y, dest_rect.width, dest_rect.height,
  359.       src_bitmap.get_base_info,
  360.       src_rect.x, src_rect.y, src_rect.width, src_rect.height,
  361.       opacity)
  362.   end
  363.   #--------------------------------------------------------------------------
  364.   # ○ 平行四辺形転送
  365.   #--------------------------------------------------------------------------
  366.   def skew_blt(x, y, src_bitmap, src_rect, slope, opacity = 255)
  367.     slope = [[slope, -89].max, 89].min
  368.     sh    = src_rect.height
  369.     off  = sh / Math.tan(Math::PI * (90 - slope.abs) / 180.0)
  370.     if slope >= 0
  371.       dx   = x + off.to_i
  372.       diff = -off / sh
  373.     else
  374.       dx   = x
  375.       diff = off / sh
  376.     end
  377.     rect = Rect.new(src_rect.x, src_rect.y, src_rect.width, 1)

  378.     sh.times { |i|
  379.       blt(dx + (diff * i).round, y + i, src_bitmap, rect, opacity)
  380.       rect.y += 1
  381.     }
  382.   end
  383.   #--------------------------------------------------------------------------
  384.   # ○ 高画質平行四辺形転送
  385.   #--------------------------------------------------------------------------
  386.   def skew_blt_r(x, y, src_bitmap, src_rect, slope, opacity = 255)
  387.     return -1 if TRGSSX::NO_TRGSSX

  388.     return TRGSSX.skew_blt_r(get_base_info,
  389.       x, y, src_bitmap.get_base_info,
  390.       src_rect.x, src_rect.y, src_rect.width, src_rect.height,
  391.       slope, opacity)
  392.   end
  393.   #--------------------------------------------------------------------------
  394.   # ○ 多角形描画
  395.   #--------------------------------------------------------------------------
  396.   def draw_polygon(points, color, width = 1)
  397.     return -1 if TRGSSX::NO_TRGSSX

  398.     _points = create_point_pack(points)

  399.     return TRGSSX.draw_polygon(get_base_info,
  400.       _points, points.size, color.argb_code, width)
  401.   end
  402.   #--------------------------------------------------------------------------
  403.   # ○ 多角形塗り潰し
  404.   #--------------------------------------------------------------------------
  405.   def fill_polygon(points, st_color, ed_color, fill_mode = TRGSSX::FM_FIT)
  406.     return -1 if TRGSSX::NO_TRGSSX

  407.     _points = create_point_pack(points)

  408.     return TRGSSX.fill_polygon(get_base_info,
  409.       _points, points.size, st_color.argb_code, ed_color.argb_code, fill_mode)
  410.   end
  411.   #--------------------------------------------------------------------------
  412.   # ○ 座標リストの pack を作成
  413.   #--------------------------------------------------------------------------
  414.   def create_point_pack(points)
  415.     result = ''
  416.     points.each { |pt| result += pt.pack('l!2') }
  417.     return result
  418.   end
  419.   private :create_point_pack
  420.   #--------------------------------------------------------------------------
  421.   # ○ 正多角形描画
  422.   #--------------------------------------------------------------------------
  423.   def draw_regular_polygon(x, y, r, n, color, width = 1)
  424.     return -1 if TRGSSX::NO_TRGSSX

  425.     return TRGSSX.draw_regular_polygon(get_base_info,
  426.       x, y, r, n, color.argb_code, width)
  427.   end
  428.   #--------------------------------------------------------------------------
  429.   # ○ 正多角形塗り潰し
  430.   #--------------------------------------------------------------------------
  431.   def fill_regular_polygon(x, y, r, n, st_color, ed_color,
  432.       fill_mode = TRGSSX::FM_FIT)
  433.     return -1 if TRGSSX::NO_TRGSSX

  434.     return TRGSSX.fill_regular_polygon(get_base_info,
  435.       x, y, r, n, st_color.argb_code, ed_color.argb_code, fill_mode)
  436.   end
  437.   #--------------------------------------------------------------------------
  438.   # ○ スポーク描画
  439.   #--------------------------------------------------------------------------
  440.   def draw_spoke(x, y, r, n, color, width = 1)
  441.     return -1 if TRGSSX::NO_TRGSSX

  442.     return TRGSSX.draw_spoke(get_base_info,
  443.       x, y, r, n, color.argb_code, width)
  444.   end
  445.   #--------------------------------------------------------------------------
  446.   # ○ アンチエイリアス無効テキスト描画
  447.   #--------------------------------------------------------------------------
  448.   def draw_text_na(*args)
  449.     return -1 if TRGSSX::NO_TRGSSX

  450.     x, y, width, height, text, align = get_text_args(args)
  451.     fname = get_available_font_name
  452.     flags = get_draw_text_flags

  453.     return TRGSSX.draw_text_na(get_base_info, x, y, width, height, text,
  454.       fname, font.size, get_text_color, align, flags)
  455.   end
  456.   #--------------------------------------------------------------------------
  457.   # ○ 高速テキスト描画
  458.   #--------------------------------------------------------------------------
  459.   def draw_text_fast(*args)
  460.     return -1 if TRGSSX::NO_TRGSSX

  461.     x, y, width, height, text, align = get_text_args(args)
  462.     fname = get_available_font_name
  463.     flags = get_draw_text_flags

  464.     return TRGSSX.draw_text_fast(get_base_info, x, y, width, height, text,
  465.       fname, font.size, get_text_color, align, flags)
  466.   end
  467.   #--------------------------------------------------------------------------
  468.   # ○ 描画サイズ取得 (na)
  469.   #--------------------------------------------------------------------------
  470.   def text_size_na(text)
  471.     return -1 if TRGSSX::NO_TRGSSX

  472.     fname = get_available_font_name
  473.     flags = get_draw_text_flags
  474.     size  = [0, 0].pack('l!2')

  475.     result = TRGSSX.get_text_size_na(get_base_info, text.to_s,
  476.       fname, font.size, flags, size)

  477.     size = size.unpack('l!2')
  478.     rect = Rect.new(0, 0, size[0], size[1])
  479.     return rect
  480.   end
  481.   #--------------------------------------------------------------------------
  482.   # ○ 描画サイズ取得 (fast)
  483.   #--------------------------------------------------------------------------
  484.   def text_size_fast(text)
  485.     return -1 if TRGSSX::NO_TRGSSX

  486.     fname = get_available_font_name
  487.     flags = get_draw_text_flags
  488.     size  = [0, 0].pack('l!2')

  489.     result = TRGSSX.get_text_size_fast(get_base_info, text.to_s,
  490.       fname, font.size, flags, size)

  491.     size = size.unpack('l!2')
  492.     rect = Rect.new(0, 0, size[0], size[1])
  493.     return rect
  494.   end
  495.   #--------------------------------------------------------------------------
  496.   # ○ 描画引数を取得
  497.   #--------------------------------------------------------------------------
  498.   def get_text_args(args)
  499.     if args[0].is_a?(Rect)
  500.       # 矩形
  501.       if args.size.between?(2, 4)
  502.         x, y = args[0].x, args[0].y
  503.         width, height = args[0].width, args[0].height
  504.         text  = args[1].to_s
  505.         align = (args[2].equal?(nil) ? 0 : args[2])
  506.       else
  507.         raise(ArgumentError,
  508.           "wrong number of arguments(#{args.size} of #{args.size < 2 ? 2 : 4})")
  509.         return
  510.       end
  511.     else
  512.       # 数値
  513.       if args.size.between?(5, 7)
  514.         x, y, width, height = args
  515.         text  = args[4].to_s
  516.         align = (args[5].equal?(nil) ? 0 : args[5])
  517.       else
  518.         raise(ArgumentError,
  519.           "wrong number of arguments(#{args.size} of #{args.size < 5 ? 5 : 7})")
  520.         return
  521.       end
  522.     end
  523.     return [x, y, width, height, text, align]
  524.   end
  525.   private :get_text_args
  526.   #--------------------------------------------------------------------------
  527.   # ○ 有効なフォント名を取得
  528.   #--------------------------------------------------------------------------
  529.   def get_available_font_name
  530.     if font.name.is_a?(Array)
  531.       font.name.each { |f|
  532.         return f if Font.exist?(f)
  533.       }
  534.       return nil
  535.     else
  536.       return font.name
  537.     end
  538.   end
  539.   private :get_available_font_name
  540.   #--------------------------------------------------------------------------
  541.   # ○ 文字色 (main, gradation, shadow, needGrad) の pack を取得
  542.   #--------------------------------------------------------------------------
  543.   def get_text_color
  544.     need_grad = !font.gradation_color.equal?(nil)
  545.     result = []
  546.     result << font.color.argb_code
  547.     result << (need_grad ? font.gradation_color.argb_code : 0)
  548.     result << 0xFF000000
  549.     result << (need_grad ? 1 : 0)
  550.     return result.pack('l!4')
  551.   end
  552.   private :get_text_color
  553.   #--------------------------------------------------------------------------
  554.   # ○ テキスト描画フラグを取得
  555.   #--------------------------------------------------------------------------
  556.   def get_draw_text_flags
  557.     flags  = 0
  558.     flags |= TRGSSX::FS_BOLD   if font.bold
  559.     flags |= TRGSSX::FS_ITALIC if font.italic
  560.     flags |= TRGSSX::FS_SHADOW if font.shadow && !font.frame
  561.     flags |= TRGSSX::FS_FRAME  if font.frame
  562.     return flags
  563.   end
  564.   private :get_draw_text_flags
  565.   #--------------------------------------------------------------------------
  566.   # ○ 保存
  567.   #     filename : 保存先
  568.   #--------------------------------------------------------------------------
  569.   def save(filename)
  570.     return -1 if TRGSSX::NO_TRGSSX

  571.     return TRGSSX.save_to_bitmap(filename, get_base_info)
  572.   end
  573. end

  574. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  575. #==============================================================================
  576. # ■ Color
  577. #==============================================================================

  578. class Color
  579.   #--------------------------------------------------------------------------
  580.   # ○ ARGB コード取得
  581.   #--------------------------------------------------------------------------
  582.   def argb_code
  583.     n  = 0
  584.     n |= alpha.to_i << 24
  585.     n |= red.to_i   << 16
  586.     n |= green.to_i <<  8
  587.     n |= blue.to_i
  588.     return n
  589.   end
  590. end

  591. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  592. #==============================================================================
  593. # ■ Font
  594. #==============================================================================

  595. class Font
  596.   unless const_defined?(:XP_MODE)
  597.     # XP 専用処理
  598.     unless method_defined?(:shadow)
  599.       XP_MODE = true
  600.       @@default_shadow = false
  601.       attr_writer :shadow
  602.       def self.default_shadow
  603.         return @@default_shadow
  604.       end
  605.       def self.default_shadow=(s)
  606.         @@default_shadow = s
  607.       end
  608.       def shadow
  609.         return ([url=home.php?mod=space&uid=31758]@Shadow[/url] == nil ? @@default_shadow : @shadow)
  610.       end
  611.     else
  612.       XP_MODE = false
  613.     end
  614.   end
  615.   #--------------------------------------------------------------------------
  616.   # ○ クラス変数
  617.   #--------------------------------------------------------------------------
  618.   @@default_frame           = KGC::BitmapExtension::DEFAULT_FRAME
  619.   @@default_gradation_color = KGC::BitmapExtension::DEFAULT_GRAD_COLOR
  620.   #--------------------------------------------------------------------------
  621.   # ○ 公開インスタンス変数
  622.   #--------------------------------------------------------------------------
  623.   attr_accessor :gradation_color
  624.   #--------------------------------------------------------------------------
  625.   # ● オブジェクト初期化
  626.   #--------------------------------------------------------------------------
  627.   unless private_method_defined?(:initialize_KGC_BitmapExtension)
  628.     alias initialize_KGC_BitmapExtension initialize
  629.   end
  630.   def initialize(name = Font.default_name, size = Font.default_size)
  631.     initialize_KGC_BitmapExtension(name, size)

  632.     @frame = nil
  633.     @gradation_color = @@default_gradation_color
  634.     if XP_MODE
  635.       [url=home.php?mod=space&uid=31758]@Shadow[/url] = nil
  636.     end
  637.   end
  638.   #--------------------------------------------------------------------------
  639.   # ○ デフォルト縁取りフラグ設定
  640.   #--------------------------------------------------------------------------
  641.   def self.default_frame
  642.     return @@default_frame
  643.   end
  644.   #--------------------------------------------------------------------------
  645.   # ○ デフォルト縁取りフラグ設定
  646.   #--------------------------------------------------------------------------
  647.   def self.default_frame=(value)
  648.     @@default_frame = value
  649.   end
  650.   #--------------------------------------------------------------------------
  651.   # ○ デフォルトグラデーション色設定
  652.   #--------------------------------------------------------------------------
  653.   def self.default_gradation_color
  654.     return @@default_gradation_color
  655.   end
  656.   #--------------------------------------------------------------------------
  657.   # ○ デフォルトグラデーション色設定
  658.   #--------------------------------------------------------------------------
  659.   def self.default_gradation_color=(value)
  660.     @@default_gradation_color = value
  661.   end
  662.   #--------------------------------------------------------------------------
  663.   # ● 影文字フラグ設定
  664.   #--------------------------------------------------------------------------
  665.   unless method_defined?(:shadow_eq) || XP_MODE
  666.     alias shadow_eq shadow=
  667.   end
  668.   def shadow=(value)
  669.     XP_MODE ? [url=home.php?mod=space&uid=31758]@Shadow[/url] = value : shadow_eq(value)
  670.   end
  671.   #--------------------------------------------------------------------------
  672.   # ○ 縁取りフラグ取得
  673.   #--------------------------------------------------------------------------
  674.   def frame
  675.     return (@frame == nil ? @@default_frame : @frame)
  676.   end
  677.   #--------------------------------------------------------------------------
  678.   # ○ 縁取りフラグ設定
  679.   #--------------------------------------------------------------------------
  680.   def frame=(value)
  681.     @frame = value
  682.   end
  683. end

  684. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  685. #==============================================================================
  686. # □ Region
  687. #------------------------------------------------------------------------------
  688. #   クリッピング用のリージョンを扱うクラスです。
  689. #==============================================================================

  690. class Region
  691.   #--------------------------------------------------------------------------
  692.   # ○ クラス変数
  693.   #--------------------------------------------------------------------------
  694.   @@handles = []  # 生成したリージョンハンドル
  695.   #--------------------------------------------------------------------------
  696.   # ○ Win32API
  697.   #--------------------------------------------------------------------------
  698.   @@_api_delete_object = Win32API.new('gdi32', 'DeleteObject', 'l', 'l')
  699.   #--------------------------------------------------------------------------
  700.   # ○ リージョンハンドル生成
  701.   #--------------------------------------------------------------------------
  702.   def create_region_handle
  703.     # 継承先で再定義
  704.     return 0
  705.   end
  706.   #--------------------------------------------------------------------------
  707.   # ○ AND (&)
  708.   #--------------------------------------------------------------------------
  709.   def &(obj)
  710.     return nil unless obj.is_a?(Region)
  711.     return CombinedRegion.new(CombinedRegion::RGN_AND, self, obj)
  712.   end
  713.   #--------------------------------------------------------------------------
  714.   # ○ AND (*)
  715.   #--------------------------------------------------------------------------
  716.   def *(obj)
  717.     return self.&(obj)
  718.   end
  719.   #--------------------------------------------------------------------------
  720.   # ○ OR (|)
  721.   #--------------------------------------------------------------------------
  722.   def |(obj)
  723.     return nil unless obj.is_a?(Region)
  724.     return CombinedRegion.new(CombinedRegion::RGN_OR, self, obj)
  725.   end
  726.   #--------------------------------------------------------------------------
  727.   # ○ OR (+)
  728.   #--------------------------------------------------------------------------
  729.   def +(obj)
  730.     return self.|(obj)
  731.   end
  732.   #--------------------------------------------------------------------------
  733.   # ○ XOR (^)
  734.   #--------------------------------------------------------------------------
  735.   def ^(obj)
  736.     return nil unless obj.is_a?(Region)
  737.     return CombinedRegion.new(CombinedRegion::RGN_XOR, self, obj)
  738.   end
  739.   #--------------------------------------------------------------------------
  740.   # ○ DIFF (-)
  741.   #--------------------------------------------------------------------------
  742.   def -(obj)
  743.     return nil unless obj.is_a?(Region)
  744.     return CombinedRegion.new(CombinedRegion::RGN_DIFF, self, obj)
  745.   end

  746.   #--------------------------------------------------------------------------
  747.   # ○ リージョンハンドル破棄
  748.   #--------------------------------------------------------------------------
  749.   def self.delete_region_handles
  750.     @@handles.uniq!
  751.     @@handles.each { |h| @@_api_delete_object.call(h) }
  752.     @@handles.clear
  753.   end
  754. end

  755. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  756. #==============================================================================
  757. # □ RectRegion
  758. #------------------------------------------------------------------------------
  759. #   矩形リージョンを扱うクラスです。
  760. #==============================================================================

  761. class RectRegion < Region
  762.   #--------------------------------------------------------------------------
  763.   # ○ 公開インスタンス変数
  764.   #--------------------------------------------------------------------------
  765.   attr_accessor :x               # X 座標
  766.   attr_accessor :y               # Y 座標
  767.   attr_accessor :width           # 幅
  768.   attr_accessor :height          # 高さ
  769.   #--------------------------------------------------------------------------
  770.   # ○ Win32API
  771.   #--------------------------------------------------------------------------
  772.   @@_api_create_rect_rgn = Win32API.new('gdi32',
  773.     'CreateRectRgn', 'llll', 'l')
  774.   @@_api_create_rect_rgn_indirect = Win32API.new('gdi32',
  775.     'CreateRectRgnIndirect', 'l', 'l')
  776.   #--------------------------------------------------------------------------
  777.   # ○ オブジェクト初期化
  778.   #--------------------------------------------------------------------------
  779.   def initialize(*args)
  780.     if args[0].is_a?(Rect)
  781.       rect = args[0]
  782.       @x = rect.x
  783.       @y = rect.y
  784.       @width  = rect.width
  785.       [url=home.php?mod=space&uid=291977]@height[/url] = rect.height
  786.     else
  787.       @x, @y, @width, [url=home.php?mod=space&uid=291977]@height[/url] = args
  788.     end
  789.   end
  790.   #--------------------------------------------------------------------------
  791.   # ○ リージョンハンドル生成
  792.   #--------------------------------------------------------------------------
  793.   def create_region_handle
  794.     hRgn = @@_api_create_rect_rgn.call(@x, @y, @x + @width, @y + @height)
  795.     @@handles << hRgn
  796.     return hRgn
  797.   end
  798. end

  799. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  800. #==============================================================================
  801. # □ RoundRectRegion
  802. #------------------------------------------------------------------------------
  803. #   角丸矩形リージョンを扱うクラスです。
  804. #==============================================================================

  805. class RoundRectRegion < RectRegion
  806.   #--------------------------------------------------------------------------
  807.   # ○ 公開インスタンス変数
  808.   #--------------------------------------------------------------------------
  809.   attr_accessor :width_ellipse   # 丸みの幅
  810.   attr_accessor :height_ellipse  # 丸みの高さ
  811.   #--------------------------------------------------------------------------
  812.   # ○ Win32API
  813.   #--------------------------------------------------------------------------
  814.   @@_api_create_round_rect_rgn = Win32API.new('gdi32',
  815.     'CreateRoundRectRgn', 'llllll', 'l')
  816.   #--------------------------------------------------------------------------
  817.   # ○ オブジェクト初期化
  818.   #--------------------------------------------------------------------------
  819.   def initialize(*args)
  820.     super
  821.     if args[0].is_a?(Rect)
  822.       @width_ellipse  = args[1]
  823.       @height_ellipse = args[2]
  824.     else
  825.       @width_ellipse  = args[4]
  826.       @height_ellipse = args[5]
  827.     end
  828.   end
  829.   #--------------------------------------------------------------------------
  830.   # ○ リージョンハンドル生成
  831.   #--------------------------------------------------------------------------
  832.   def create_region_handle
  833.     hRgn = @@_api_create_round_rect_rgn.call(@x, @y, @x + @width, @y + @height,
  834.       width_ellipse, height_ellipse)
  835.     @@handles << hRgn
  836.     return hRgn
  837.   end
  838. end

  839. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  840. #==============================================================================
  841. # □ EllipticRegion
  842. #------------------------------------------------------------------------------
  843. #   楕円形リージョンを扱うクラスです。
  844. #==============================================================================

  845. class EllipticRegion < RectRegion
  846.   #--------------------------------------------------------------------------
  847.   # ○ Win32API
  848.   #--------------------------------------------------------------------------
  849.   @@_api_create_elliptic_rgn = Win32API.new('gdi32',
  850.     'CreateEllipticRgn', 'llll', 'l')
  851.   @@_api_create_elliptic_rgn_indirect = Win32API.new('gdi32',
  852.     'CreateEllipticRgnIndirect', 'l', 'l')
  853.   #--------------------------------------------------------------------------
  854.   # ○ リージョンハンドル生成
  855.   #--------------------------------------------------------------------------
  856.   def create_region_handle
  857.     hRgn = @@_api_create_elliptic_rgn.call(@x, @y, @x + @width, @y + @height)
  858.     @@handles << hRgn
  859.     return hRgn
  860.   end
  861. end

  862. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  863. #==============================================================================
  864. # □ CircularRegion
  865. #------------------------------------------------------------------------------
  866. #   円形リージョンを扱うクラスです。
  867. #==============================================================================

  868. class CircularRegion < EllipticRegion
  869.   #--------------------------------------------------------------------------
  870.   # ○ 公開インスタンス変数
  871.   #--------------------------------------------------------------------------
  872.   attr_reader   :radius  # 半径
  873.   #--------------------------------------------------------------------------
  874.   # ○ オブジェクト初期化
  875.   #--------------------------------------------------------------------------
  876.   def initialize(x, y, r)
  877.     @cx = x
  878.     @cy = y
  879.     self.radius = r
  880.     super(@cx - r, @cy - r, r * 2, r * 2)
  881.   end
  882.   #--------------------------------------------------------------------------
  883.   # ○ 中心 X 座標参照
  884.   #--------------------------------------------------------------------------
  885.   def x
  886.     return @cx
  887.   end
  888.   #--------------------------------------------------------------------------
  889.   # ○ 中心 Y 座標参照
  890.   #--------------------------------------------------------------------------
  891.   def y
  892.     return @cy
  893.   end
  894.   #--------------------------------------------------------------------------
  895.   # ○ 中心 X 座標変更
  896.   #--------------------------------------------------------------------------
  897.   def x=(value)
  898.     @cx = value
  899.     @x = @cx - @radius
  900.   end
  901.   #--------------------------------------------------------------------------
  902.   # ○ 中心 Y 座標変更
  903.   #--------------------------------------------------------------------------
  904.   def y=(value)
  905.     @cy = value
  906.     @y = @cy - @radius
  907.   end
  908.   #--------------------------------------------------------------------------
  909.   # ○ 半径変更
  910.   #--------------------------------------------------------------------------
  911.   def radius=(value)
  912.     @radius = value
  913.     @x = @cx - @radius
  914.     @y = @cy - @radius
  915.     @width = [url=home.php?mod=space&uid=291977]@height[/url] = @radius * 2
  916.   end
  917. end

  918. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  919. #==============================================================================
  920. # □ PolygonRegion
  921. #------------------------------------------------------------------------------
  922. #   多角形リージョンを扱うクラスです。
  923. #==============================================================================

  924. class PolygonRegion < Region
  925.   #--------------------------------------------------------------------------
  926.   # ○ 定数
  927.   #--------------------------------------------------------------------------
  928.   # 多角形充填形式
  929.   ALTERNATE = 1  # 交互モード
  930.   WINDING   = 2  # 螺旋モード
  931.   #--------------------------------------------------------------------------
  932.   # ○ 公開インスタンス変数
  933.   #--------------------------------------------------------------------------
  934.   attr_accessor :points     # 頂点座標 [x, y] の配列
  935.   attr_accessor :fill_mode  # 多角形充填形式
  936.   #--------------------------------------------------------------------------
  937.   # ○ Win32API
  938.   #--------------------------------------------------------------------------
  939.   @@_api_create_polygon_rgn = Win32API.new('gdi32',
  940.     'CreatePolygonRgn', 'pll', 'l')
  941.   @@_api_create_polypolygon_rgn = Win32API.new('gdi32',
  942.     'CreatePolyPolygonRgn', 'llll', 'l')
  943.   #--------------------------------------------------------------------------
  944.   # ○ オブジェクト初期化
  945.   #--------------------------------------------------------------------------
  946.   def initialize(*points)
  947.     @points = points  # [x, y] の配列
  948.     @fill_mode = WINDING
  949.   end
  950.   #--------------------------------------------------------------------------
  951.   # ○ リージョンハンドル生成
  952.   #--------------------------------------------------------------------------
  953.   def create_region_handle
  954.     pts = ""
  955.     points.each { |pt| pts += pt.pack("ll") }
  956.     hRgn = @@_api_create_polygon_rgn.call(pts, points.size, fill_mode)
  957.     @@handles << hRgn
  958.     return hRgn
  959.   end
  960. end

  961. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  962. #==============================================================================
  963. # □ StarRegion
  964. #------------------------------------------------------------------------------
  965. #   星型リージョンを扱うクラスです。
  966. #==============================================================================

  967. class StarRegion < PolygonRegion
  968.   #--------------------------------------------------------------------------
  969.   # ○ 定数
  970.   #--------------------------------------------------------------------------
  971.   POINT_NUM = 5               # 点数
  972.   PI_4      = 4.0 * Math::PI  # 4 * Pi
  973.   #--------------------------------------------------------------------------
  974.   # ○ 公開インスタンス変数
  975.   #--------------------------------------------------------------------------
  976.   attr_reader   :x               # X 座標
  977.   attr_reader   :y               # Y 座標
  978.   attr_reader   :width           # 幅
  979.   attr_reader   :height          # 高さ
  980.   attr_reader   :angle           # 回転角度 (0 ~ 359)
  981.   #--------------------------------------------------------------------------
  982.   # ○ オブジェクト初期化
  983.   #--------------------------------------------------------------------------
  984.   def initialize(*args)
  985.     super()
  986.     shape = args[0]
  987.     ang = args[1]
  988.     case shape
  989.     when CircularRegion
  990.       @x = shape.x - shape.radius
  991.       @y = shape.y - shape.radius
  992.       @width = @height = shape.radius * 2
  993.     when Rect, RectRegion, EllipticRegion
  994.       @x = shape.x
  995.       @y = shape.y
  996.       @width  = shape.width
  997.       @height = shape.height
  998.     when Integer
  999.       @x, @y, @width, @height = args
  1000.       ang = args[4]
  1001.     else
  1002.       @x = @y = @width = @height = 0
  1003.     end
  1004.     [url=home.php?mod=space&uid=124954]@Angle[/url] = (ang == nil ? 0 : ang % 360)
  1005.     @__init = true
  1006.     @points = create_star_points
  1007.   end
  1008.   #--------------------------------------------------------------------------
  1009.   # ○ 星型座標を生成
  1010.   #--------------------------------------------------------------------------
  1011.   def create_star_points
  1012.     return unless @__init

  1013.     dw = (width + 1) / 2
  1014.     dh = (height + 1) / 2
  1015.     dx = x + dw
  1016.     dy = y + dh
  1017.     base_angle = angle * Math::PI / 180.0
  1018.     pts = []
  1019.     POINT_NUM.times { |i|
  1020.       ang = base_angle + PI_4 * i / POINT_NUM
  1021.       pts << [dx + (Math.sin(ang) * dw).to_i,
  1022.         dy - (Math.cos(ang) * dh).to_i]
  1023.     }
  1024.     return pts
  1025.   end
  1026.   #--------------------------------------------------------------------------
  1027.   # ○ X 座標変更
  1028.   #--------------------------------------------------------------------------
  1029.   def x=(value)
  1030.     @x = value
  1031.     @points = create_star_points
  1032.   end
  1033.   #--------------------------------------------------------------------------
  1034.   # ○ Y 座標変更
  1035.   #--------------------------------------------------------------------------
  1036.   def y=(value)
  1037.     @y = value
  1038.     @points = create_star_points
  1039.   end
  1040.   #--------------------------------------------------------------------------
  1041.   # ○ 幅変更
  1042.   #--------------------------------------------------------------------------
  1043.   def width=(value)
  1044.     @width = value
  1045.     @points = create_star_points
  1046.   end
  1047.   #--------------------------------------------------------------------------
  1048.   # ○ 高さ座標変更
  1049.   #--------------------------------------------------------------------------
  1050.   def height=(value)
  1051.     @height = value
  1052.     @points = create_star_points
  1053.   end
  1054.   #--------------------------------------------------------------------------
  1055.   # ○ 開始角度変更
  1056.   #--------------------------------------------------------------------------
  1057.   def angle=(value)
  1058.     [url=home.php?mod=space&uid=124954]@Angle[/url] = value % 360
  1059.     @points = create_star_points
  1060.   end
  1061. end

  1062. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  1063. #==============================================================================
  1064. # □ PieRegion
  1065. #------------------------------------------------------------------------------
  1066. #   扇形リージョンを扱うクラスです。
  1067. #==============================================================================

  1068. class PieRegion < Region
  1069.   #--------------------------------------------------------------------------
  1070.   # ○ 定数
  1071.   #--------------------------------------------------------------------------
  1072.   HALF_PI = Math::PI / 2.0  # PI / 2
  1073.   #--------------------------------------------------------------------------
  1074.   # ○ 公開インスタンス変数
  1075.   #--------------------------------------------------------------------------
  1076.   attr_reader   :begin_angle     # 開始角度 [degree]
  1077.   attr_reader   :sweep_angle     # 描画角度 (0 ~ 359)
  1078.   #--------------------------------------------------------------------------
  1079.   # ○ オブジェクト初期化
  1080.   #--------------------------------------------------------------------------
  1081.   def initialize(*args)
  1082.     super()
  1083.     shape = args[0]
  1084.     ang1, ang2 = args[1..2]
  1085.     case shape
  1086.     when CircularRegion
  1087.       @cx = shape.x
  1088.       @cy = shape.y
  1089.       self.radius = shape.radius
  1090.     else
  1091.       @cx = @cy = @x = @y = @radius = 0
  1092.     end
  1093.     self.start_angle = (ang1 == nil ? 0 : ang1)
  1094.     self.sweep_angle = (ang2 == nil ? 0 : ang2)
  1095.     @__init = true
  1096.     create_pie_region
  1097.   end
  1098.   #--------------------------------------------------------------------------
  1099.   # ○ 扇形リージョンを生成
  1100.   #--------------------------------------------------------------------------
  1101.   def create_pie_region
  1102.     return unless @__init

  1103.     # 座標・範囲調整
  1104.     st_deg = @start_angle += (@sweep_angle < 0 ? @sweep_angle : 0)
  1105.     st_deg %= 360
  1106.     ed_deg = st_deg + @sweep_angle.abs
  1107.     diff = st_deg % 90
  1108.     r = @radius * 3 / 2
  1109.     s = st_deg / 90
  1110.     e = ed_deg / 90

  1111.     # リージョン作成
  1112.     @region = nil
  1113.     (s..e).each { |i|
  1114.       break if i * 90 >= ed_deg
  1115.       if diff > 0
  1116.         st_rad = (i * 90 + diff) * Math::PI / 180.0
  1117.         diff = 0
  1118.       else
  1119.         st_rad = i * HALF_PI
  1120.       end
  1121.       if (i + 1) * 90 > ed_deg
  1122.         ed_rad = ed_deg * Math::PI / 180.0
  1123.       else
  1124.         ed_rad = (i + 1) * HALF_PI
  1125.       end
  1126.       pt1 = [@cx, @cy]
  1127.       pt2 = [
  1128.         @cx + Integer(Math.cos(st_rad) * r),
  1129.         @cy + Integer(Math.sin(st_rad) * r)
  1130.       ]
  1131.       pt3 = [
  1132.         @cx + Integer(Math.cos(ed_rad) * r),
  1133.         @cy + Integer(Math.sin(ed_rad) * r)
  1134.       ]
  1135.       rgn = PolygonRegion.new(pt1, pt2, pt3)
  1136.       if @region == nil
  1137.         @region = rgn
  1138.       else
  1139.         @region |= rgn
  1140.       end
  1141.     }
  1142.     @region &= CircularRegion.new(@cx, @cy, @radius)

  1143.     return @region
  1144.   end
  1145.   #--------------------------------------------------------------------------
  1146.   # ○ 中心 X 座標参照
  1147.   #--------------------------------------------------------------------------
  1148.   def x
  1149.     return @cx
  1150.   end
  1151.   #--------------------------------------------------------------------------
  1152.   # ○ 中心 Y 座標参照
  1153.   #--------------------------------------------------------------------------
  1154.   def y
  1155.     return @cy
  1156.   end
  1157.   #--------------------------------------------------------------------------
  1158.   # ○ 中心 X 座標変更
  1159.   #--------------------------------------------------------------------------
  1160.   def x=(value)
  1161.     @cx = value
  1162.     @x = @cx - @radius
  1163.     create_pie_region
  1164.   end
  1165.   #--------------------------------------------------------------------------
  1166.   # ○ 中心 Y 座標変更
  1167.   #--------------------------------------------------------------------------
  1168.   def y=(value)
  1169.     @cy = value
  1170.     @y = @cy - @radius
  1171.     create_pie_region
  1172.   end
  1173.   #--------------------------------------------------------------------------
  1174.   # ○ 半径変更
  1175.   #--------------------------------------------------------------------------
  1176.   def radius=(value)
  1177.     @radius = value
  1178.     @x = @cx - @radius
  1179.     @y = @cy - @radius
  1180.     create_pie_region
  1181.   end
  1182.   #--------------------------------------------------------------------------
  1183.   # ○ 開始角度変更
  1184.   #--------------------------------------------------------------------------
  1185.   def start_angle=(value)
  1186.     @start_angle = value
  1187.     create_pie_region
  1188.   end
  1189.   #--------------------------------------------------------------------------
  1190.   # ○ 描画角度変更
  1191.   #--------------------------------------------------------------------------
  1192.   def sweep_angle=(value)
  1193.     @sweep_angle = [[value, -360].max, 360].min
  1194.     create_pie_region
  1195.   end
  1196.   #--------------------------------------------------------------------------
  1197.   # ○ リージョンハンドル生成
  1198.   #--------------------------------------------------------------------------
  1199.   def create_region_handle
  1200.     return @region.create_region_handle
  1201.   end
  1202. end

  1203. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  1204. #==============================================================================
  1205. # □ CombinedRegion
  1206. #------------------------------------------------------------------------------
  1207. #   混合リージョンを扱うクラスです。
  1208. #==============================================================================

  1209. class CombinedRegion < Region
  1210.   #--------------------------------------------------------------------------
  1211.   # ○ 定数
  1212.   #--------------------------------------------------------------------------
  1213.   # 合成モード
  1214.   RGN_AND  = 1
  1215.   RGN_OR   = 2
  1216.   RGN_XOR  = 3
  1217.   RGN_DIFF = 4
  1218.   RGN_COPY = 5
  1219.   #--------------------------------------------------------------------------
  1220.   # ○ Win32API
  1221.   #--------------------------------------------------------------------------
  1222.   @@_api_combine_rgn = Win32API.new('gdi32', 'CombineRgn', 'llll', 'l')
  1223.   #--------------------------------------------------------------------------
  1224.   # ○ オブジェクト初期化
  1225.   #--------------------------------------------------------------------------
  1226.   def initialize(mode, region1, region2)
  1227.     @exp = CombinedRegionExp.new(mode, region1.clone, region2.clone)
  1228.   end
  1229.   #--------------------------------------------------------------------------
  1230.   # ○ リージョンハンドル生成
  1231.   #--------------------------------------------------------------------------
  1232.   def create_region_handle
  1233.     return combine_region(@exp.region1, @exp.region2, @exp.mode)
  1234.   end
  1235.   #--------------------------------------------------------------------------
  1236.   # ○ リージョン合成
  1237.   #     dest : 合成先
  1238.   #     src  : 合成元
  1239.   #     mode : 合成モード
  1240.   #--------------------------------------------------------------------------
  1241.   def combine_region(dest, src, mode)
  1242.     hdest = dest.create_region_handle
  1243.     hsrc  = src.create_region_handle
  1244.     @@_api_combine_rgn.call(hdest, hdest, hsrc, mode)
  1245.     return hdest
  1246.   end
  1247.   protected :combine_region
  1248. end

  1249. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  1250. #==============================================================================
  1251. # □ Struct
  1252. #==============================================================================

  1253. # □ CombinedRegionExp 構造体
  1254. CombinedRegionExp = Struct.new("CombinedRegionExp", :mode, :region1, :region2)

  1255. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  1256. class Bitmap
  1257.   unless method_defined?(:_draw_text)
  1258.     alias _draw_text draw_text
  1259.     alias _text_size text_size

  1260.     case KGC::BitmapExtension::DEFAULT_MODE
  1261.     when 1  # na
  1262.       alias draw_text draw_text_na
  1263.       alias text_size text_size_na
  1264.     when 2  # fast
  1265.       alias draw_text draw_text_fast
  1266.       alias text_size text_size_fast
  1267.     end
  1268.   end
  1269. end

  1270. Font.default_name = KGC::BitmapExtension::DEFAULT_FONT_NAME[
  1271.   KGC::BitmapExtension::DEFAULT_MODE]
复制代码
范例
提供XP范例一枚,以及TRGSSX.dll
Project.rar (785.89 KB, 下载次数: 306) TRGSSX.rar (66.43 KB, 下载次数: 261)    
作者: 鑫晴    时间: 2014-7-26 16:47
本帖最后由 鑫晴 于 2014-7-26 19:00 编辑

(╬゚д゚)去除怎么有种像素感

@Shadow
@height
@Angle  



VA默认字体
测试前
测试后




Font.default_name = "黑体"
Font.default_size = 18
测试前
测试后



Font.default_name = "宋体"
Font.default_size = 18
测试前
测试后


作者: 楼主是我的女仆    时间: 2014-7-26 17:26
鑫晴 发表于 2014-7-25 23:47
(╬゚д゚)去除怎么有种像素感

@Shadow

默认字体废掉了233···另外楼主的这个脚本是可以加快游戏的运行效率速度?
作者: 化螺耕    时间: 2014-7-26 18:08
不明白为什么要去除渲染,其实还是蛮好看的
作者: gonglinyuan    时间: 2014-7-30 18:06
只有日文注释吗。。。

看样子是将draw_text方法替换掉,使用DLL中的函数描绘字符。
那么是否有可能调用别的字体渲染引擎呢?
作者: 牛肉面    时间: 2014-8-1 15:22
这个脚本的使用方法应该不只是去除渲染效果吧?这么长……
作者: jiahui5592986    时间: 2015-8-8 17:46
为什么我用了之后,部分文字都不显示了呢[确切的说是隐藏了]
作者: 1505458230    时间: 2017-1-16 20:45
鑫晴 发表于 2014-7-26 16:47
(╬゚д゚)去除怎么有种像素感

@Shadow

为什么我也同样是用va宋体,但是效果没有那么好,反而23号字以上都无法显示了呢?
希望能看看您的工程,谢谢谢谢
作者: FiyBlack    时间: 2017-1-18 13:36
用了这个脚本。游戏都开不了。直接闪退。
作者: 周靖东    时间: 2017-2-7 16:23
那么增强对话怎么办{:2_254:}
作者: Vortur    时间: 2018-9-30 12:16
谢谢分享!~❤
在下在用的一个方法是【下载免费像素字体文件,置入游戏工程中】,这样也可以实现像素字体的效果❤
另《使用 DirectX 驱动的 RMVA Game.exe(v1.2.1)》这里也有使用像素字的方法了:https://rpg.blue/thread-408337-12-1.html
作者: 囧先生438    时间: 2019-2-22 21:21
这个问题怎么解决啊

Snipaste_2019-02-22_21-22-42.png (49.42 KB, 下载次数: 25)

Snipaste_2019-02-22_21-22-42.png

作者: 囧先生438    时间: 2019-2-24 13:12
囧先生438 发表于 2019-2-22 21:21
这个问题怎么解决啊

问题解决了,真的非常感谢。
作者: AKK    时间: 2022-7-21 11:04
会闪退啊,修改完12楼的问题后





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1