Advertisement
LiTTleDRAgo

[RGSS/2/3] Drago - Font Enhance

Oct 2nd, 2013
524
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 16.42 KB | None | 0 0
  1. #==============================================================================
  2. # ** Drago - Font Enhance
  3. # Version : 1.10
  4. # Author : LiTTleDRAgo
  5. #==============================================================================
  6. #
  7. # Explanation :
  8. #
  9. #    This script adds some enhancement to default Font class such as
  10. #    underline, strikethrough or gradient
  11. #
  12. #------------------------------------------------------------------------------
  13. " :Example
  14.  
  15.    bitmap = Bitmap.new(640,480)
  16.  
  17.    bitmap.font.underline     = true
  18.    bitmap.font.strikethrough = true
  19.  
  20.  # (RGSS2 & RGSS3 already have this feature)
  21.    bitmap.font.shadow_color = Color.new(0,0,0,180) # *
  22.    bitmap.font.shadow       = true  
  23.    
  24.  # * In RGSS2 and RGSS3, shadow color is set from text color
  25.  
  26.  # (RGSS3 already have this feature)
  27.    bitmap.font.out_color     = Color.new(0,0,0,180)
  28.    bitmap.font.outline       = true  
  29.  
  30.    bitmap.font.gradient_color      = Color.blue
  31.    bitmap.font.vertical_gradient   = true
  32.    bitmap.font.horizontal_gradient = true
  33.  
  34.  # vertical_gradient and horizontal_gradient cannot go together,
  35.  # if you enable any of them, the other will disabled
  36.    
  37.    bitmap.dispose
  38. "    
  39. #==============================================================================
  40.  
  41.  
  42.  
  43. ($imported ||= {})[:drg_font_enhance] = 1.10
  44.  
  45. core_engine = "This script needs Drago - Core Engine ver 1.60 or above"
  46. ($imported[:drg_core_engine] || 0) >= 1.60 || raise(core_engine)
  47. #==============================================================================
  48. # ** Font
  49. #------------------------------------------------------------------------------
  50. #  
  51. #==============================================================================
  52. class Font
  53.   #--------------------------------------------------------------------------
  54.   # * Self
  55.   #--------------------------------------------------------------------------
  56.   class << self
  57.     #------------------------------------------------------------------------
  58.     # * Class Variables
  59.     #------------------------------------------------------------------------
  60.     attr_accessor     :default_underline,   :default_strikethrough
  61.     attr_accessor     :default_horiz_grad,  :default_vert_grad    
  62.     attr_sec_accessor :default_shadow_height,        2
  63.     attr_sec_accessor :default_outline_height,       2
  64.     attr_sec_accessor :default_underline_height,     2
  65.     attr_sec_accessor :default_strikethrough_height, 2
  66.     attr_sec_accessor :default_shadow_color,         'Color.new(0,0,0,100)'
  67.     attr_sec_accessor :default_gradient_color,       'Color.gray'
  68.     attr_sec_accessor :addon_order,       '[:drg_draw_text_shadow,
  69.                                            :drg_draw_text_outline,
  70.                                            :draw_text,  
  71.                                            :drg_draw_text_gradient,
  72.                                            :drg_draw_text_underline,
  73.                                            :drg_draw_text_strikethrough]'
  74.     method_defined?(:default_out_color) || (attr_accessor :default_out_color)
  75.     method_defined?(:default_shadow)    || (attr_accessor :default_shadow)
  76.     method_defined?(:default_outline)   || (attr_accessor :default_outline)
  77.     #------------------------------------------------------------------------
  78.     # * Alias Listing
  79.     #------------------------------------------------------------------------
  80.     alias_sec_method :default_outline_color,        :default_out_color
  81.     alias_sec_method :default_outline_color=,       :default_out_color=
  82.     alias_sec_method :default_vertical_gradient,    :default_vert_grad
  83.     alias_sec_method :default_vertical_gradient=,   :default_vert_grad=
  84.     alias_sec_method :default_horizontal_gradient,  :default_horiz_grad
  85.     alias_sec_method :default_horizontal_gradient=, :default_horiz_grad=
  86.   end                                
  87.   #--------------------------------------------------------------------------
  88.   # * Class Variable Declaration (Edit this configuration)
  89.   #--------------------------------------------------------------------------
  90.   Font.default_underline            = false
  91.   Font.default_strikethrough        = false
  92.   Font.default_shadow               = false
  93.   Font.default_outline              = true
  94.   Font.default_vert_grad            = false
  95.   Font.default_horiz_grad           = false
  96.   Font.default_shadow_height        = 2
  97.   Font.default_outline_height       = 2
  98.   Font.default_underline_height     = 2
  99.   Font.default_strikethrough_height = 2
  100.   Font.default_shadow_color         = Color.new(0, 0, 0, 100)
  101.   Font.default_outline_color        = Color.new(0, 0, 0, 128)
  102.   Font.default_gradient_color       = Color.gray
  103.   #--------------------------------------------------------------------------
  104.   # * Public Instance Variables
  105.   #--------------------------------------------------------------------------
  106.   attr_accessor     :underline, :strikethrough        
  107.   attr_reader       :vert_grad, :horiz_grad          
  108.   attr_sec_accessor :underline_height,     'Font.default_underline_height'
  109.   attr_sec_accessor :strikethrough_height, 'Font.default_strikethrough_height'
  110.   attr_sec_accessor :shadow_color,         'Font.default_shadow_color'
  111.   attr_sec_accessor :shadow_height,        'Font.default_shadow_height'
  112.   attr_sec_accessor :outline_height,       'Font.default_outline_height'
  113.   attr_sec_accessor :gradient_color,       'Font.default_gradient_color'
  114.   method_defined?(:out_color) || (attr_accessor :out_color)
  115.   method_defined?(:shadow)    || (attr_reader :shadow)  
  116.   method_defined?(:outline)   || (attr_reader :outline)
  117.   #--------------------------------------------------------------------------
  118.   # * Aliased method: initialize
  119.   #--------------------------------------------------------------------------
  120.   define_pre_alias(:initialize) do
  121.     # Set font settings
  122.     @underline        = Font.default_underline
  123.     @strikethrough    = Font.default_strikethrough
  124.     @shadow           = Font.default_shadow
  125.     @outline          = Font.default_outline
  126.     @vert_grad        = Font.default_vert_grad
  127.     @horiz_grad       = Font.default_horiz_grad
  128.     @out_color        = Font.default_outline_color || Color.black
  129.   end
  130.   #-------------------------------------------------------------------------
  131.   # * Redefined method: shadow=
  132.   #-------------------------------------------------------------------------
  133.   define_sec_method(:shadow=) do |bool|
  134.     @shadow = bool
  135.     @outline = false unless bool == false
  136.   end
  137.   #-------------------------------------------------------------------------
  138.   # * Redefined method: outline=
  139.   #-------------------------------------------------------------------------
  140.   define_sec_method(:outline=) do |bool|
  141.     @shadow = false unless bool == false
  142.     @outline = bool
  143.   end
  144.   #-------------------------------------------------------------------------
  145.   # * New method: vert_grad=
  146.   #-------------------------------------------------------------------------
  147.   define_sec_method(:vert_grad=) do |bool|
  148.     @vert_grad = bool
  149.     @horiz_grad = false unless bool == false
  150.   end
  151.   #-------------------------------------------------------------------------
  152.   # * New method: horiz_grad=
  153.   #-------------------------------------------------------------------------
  154.   define_sec_method(:horiz_grad=) do |bool|
  155.     @vert_grad = false unless bool == false
  156.     @horiz_grad = bool
  157.   end
  158.   #-------------------------------------------------------------------------
  159.   # * Overwriten method: ==
  160.   #-------------------------------------------------------------------------
  161.   unless method_defined?(:grad_s_color)
  162.     def ==(other)
  163.       attr = [:name, :size, :color, :bold, :italic, :underline,  
  164.         :strikethrough, :shadow_color, :outline_color,
  165.         :shadow, :outline, :vert_grad, :horiz_grad, :gradient_color]
  166.       attr.each do |var|
  167.         return false if method(var).call != other.method(var).call
  168.       end
  169.       return true
  170.     end
  171.   end
  172.   #--------------------------------------------------------------------------
  173.   # * Alias Listing
  174.   #--------------------------------------------------------------------------
  175.   alias_sec_method :outline_color,        :out_color
  176.   alias_sec_method :outline_color=,       :out_color=
  177.   alias_sec_method :vertical_gradient,    :vert_grad
  178.   alias_sec_method :vertical_gradient=,   :vert_grad=
  179.   alias_sec_method :horizontal_gradient,  :horiz_grad
  180.   alias_sec_method :horizontal_gradient=, :horiz_grad=
  181. end
  182.  
  183. #==============================================================================
  184. # ** Bitmap
  185. #------------------------------------------------------------------------------
  186. #  
  187. #==============================================================================
  188. class Bitmap
  189.   #--------------------------------------------------------------------------
  190.   # * Alias method: draw_text
  191.   #--------------------------------------------------------------------------
  192.   define_third_method(:draw_text,:basic_draw_text) do |*args|
  193.     conditions = {
  194.       :drg_draw_text_shadow        => font.shadow  && !LiTTleDRAgo::VX,
  195.       :drg_draw_text_outline       => font.outline && !LiTTleDRAgo::VXA,
  196.       :drg_draw_text_underline     => font.underline,
  197.       :drg_draw_text_strikethrough => font.strikethrough,
  198.       :drg_draw_text_gradient      => font.vert_grad || font.horiz_grad
  199.     }
  200.     for effect in Font.addon_order
  201.       if effect == :draw_text
  202.         basic_draw_text(*args)
  203.         next
  204.       end
  205.       send(effect, *args) if conditions[effect]
  206.     end
  207.   end
  208.   #--------------------------------------------------------------------------
  209.   # * New method: drg_draw_text_positions
  210.   #--------------------------------------------------------------------------
  211.   unless method_defined?(:drg_draw_text_positions)
  212.     def drg_draw_text_positions(*args)
  213.       if (r = args[0]).is_a?(Rect)
  214.         x, y, w, h, t = r.x, r.y, r.width, r.height, args[1]
  215.         a = (args.size == 3 ? args[2] : 0) || 0
  216.       else
  217.         x, y, w, h, t = args[0], args[1], args[2], args[3], args[4]
  218.         a = (args.size == 6 ? args[5] : 0) || 0
  219.       end
  220.       return x, y, w, h, t, a
  221.     end
  222.   end
  223.   #--------------------------------------------------------------------------
  224.   # * New method: drg_draw_text_shadow
  225.   #--------------------------------------------------------------------------
  226.   unless method_defined?(:drg_draw_text_shadow)
  227.     def drg_draw_text_shadow(*args)
  228.       orig_color = font.color.dup
  229.       self.font.color = self.font.shadow_color
  230.       sa = self.font.shadow_height
  231.       x, y, w, h, t, a = *drg_draw_text_positions(*args)
  232.       basic_draw_text(x + sa, y + sa, w, h, t, a)
  233.       self.font.color = orig_color
  234.     end
  235.   end
  236.   #--------------------------------------------------------------------------
  237.   # * New method: drg_draw_text_outline
  238.   #--------------------------------------------------------------------------
  239.   unless method_defined?(:drg_draw_text_outline)
  240.     def drg_draw_text_outline(*args)
  241.       orig_color = font.color.dup
  242.       self.font.color = self.font.outline_color.dup
  243.       so = self.font.outline_height.abs.round
  244.       self.font.color.alpha /= so if self.font.color.alpha > 0
  245.       x, y, w, h, t, a = *drg_draw_text_positions(*args)
  246.       for i in -so..so
  247.         for j in -so..so
  248.           basic_draw_text(x + i, y + j, w, h, t, a)
  249.         end
  250.       end
  251.       self.font.color = orig_color
  252.     end
  253.   end
  254.   #--------------------------------------------------------------------------
  255.   # * New method: drg_draw_text_underline
  256.   #--------------------------------------------------------------------------
  257.   unless method_defined?(:drg_draw_text_underline)
  258.     def drg_draw_text_underline(*args)
  259.       u_color = self.font.color.dup
  260.       x, y, w, h, t, a = *drg_draw_text_positions(*args)
  261.       ux = x
  262.       uy = y + h / 2 + self.font.size / 3
  263.       if self.font.underline == :full
  264.         uw = w
  265.       else
  266.         uw = text_size(t).width
  267.         ux += a == 1 ? (w / 2 - uw / 2) : a == 2 ? w - uw : 0
  268.       end
  269.       fill_rect(ux, uy, uw, font.underline_height.abs, u_color)
  270.     end
  271.   end
  272.   #--------------------------------------------------------------------------
  273.   # * New method: drg_draw_text_strikethrough
  274.   #--------------------------------------------------------------------------
  275.   unless method_defined?(:drg_draw_text_strikethrough)
  276.     def drg_draw_text_strikethrough(*args)
  277.       x, y, w, h, t, a = *drg_draw_text_positions(*args)
  278.       s_color = self.font.color.dup
  279.       sx = x
  280.       sy = y + h / 2
  281.       _h = font.strikethrough_height.abs
  282.       if self.font.strikethrough == :full
  283.         sw = w
  284.       else
  285.         sw = text_size(t).width
  286.         sx += a == 1 ? (w / 2 - sw / 2) : a == 2 ? w - sw : 0
  287.       end
  288.       fill_rect(sx, sy-(_h/2.0).floor, sw, _h, s_color)
  289.     end
  290.   end
  291.   #--------------------------------------------------------------------------
  292.   # * New method: drg_draw_text_gradient
  293.   #--------------------------------------------------------------------------
  294.   unless method_defined?(:drg_draw_text_gradient)
  295.     def drg_draw_text_gradient(*args)
  296.       x, y, w, h, t, a = *drg_draw_text_positions(*args)
  297.       if self.font.vert_grad || self.font.horiz_grad
  298.         dummy = Bitmap.new(w, h)
  299.         dummy.font = font
  300.         dummy.font.vert_grad = false
  301.         dummy.font.horiz_grad = false
  302.         dummy.basic_draw_text(0, 0, w, h, t, a)
  303.         if font.vert_grad
  304.           dummy.v_gradient_pixel_change(dummy.font.color, font.gradient_color)
  305.         else
  306.           dummy.h_gradient_pixel_change(dummy.font.color, font.gradient_color)
  307.         end
  308.         self.blt(x, y, dummy, dummy.rect)
  309.       end
  310.     end
  311.   end
  312.   #-------------------------------------------------------------------------
  313.   # * New method: v_gradient_pixel_change
  314.   #-------------------------------------------------------------------------
  315.   unless method_defined?(:v_gradient_pixel_change)
  316.     def v_gradient_pixel_change(sc = Color.red, ec = Color.blue, r = rect)
  317.       for y_ in (r.y).round...(r.y + r.height).round
  318.         color = Color.color_between(sc, ec, (y_ / (r.height).to_f))
  319.         for x_ in (r.x).round...(r.x + r.width).round
  320.           a = get_pixel(x_, y_).alpha
  321.           next if a == 0
  322.           color.alpha = a
  323.           set_pixel(x_, y_, color)
  324.         end
  325.       end
  326.     end
  327.   end
  328.   #-------------------------------------------------------------------------
  329.   # * New method: h_gradient_pixel_change
  330.   #-------------------------------------------------------------------------
  331.   unless method_defined?(:h_gradient_pixel_change)
  332.     def h_gradient_pixel_change(sc = Color.red, ec = Color.blue, r = rect)
  333.       for x_ in (r.x).round...(r.x + r.width).round
  334.         color = Color.color_between(sc, ec, (x_ / r.width.to_f))
  335.         for y_ in (r.y).round...(r.y + r.height).round
  336.           a = get_pixel(x_, y_).alpha
  337.           next if a == 0
  338.           color.alpha = a
  339.           set_pixel(x_, y_, color)
  340.         end
  341.       end
  342.     end
  343.   end
  344. end
  345.  
  346. #==============================================================================
  347. # ** Color
  348. #------------------------------------------------------------------------------
  349. #  
  350. #==============================================================================
  351. class Color
  352.   #--------------------------------------------------------------------------
  353.   # * Self
  354.   #--------------------------------------------------------------------------
  355.   class << self
  356.     #-------------------------------------------------------------------------
  357.     # * Name      : Color Between
  358.     #   Info      : Gets Color Between Two colors given the percent
  359.     #   Author    : SephirothSpawn
  360.     #   Call Info : Start Color, Finish Color, Percent
  361.     #-------------------------------------------------------------------------
  362.     unless method_defined?(:color_between)
  363.       def color_between(color_a, color_b, percent = 0.5)
  364.         @color_between ||= {}
  365.         key = [color_a, color_b, percent]
  366.         if @color_between.has_key?(key)
  367.           return @color_between[key]
  368.         end
  369.         r = Integer(color_a.red   + (color_b.red   - color_a.red)   * percent)
  370.         g = Integer(color_a.green + (color_b.green - color_a.green) * percent)
  371.         b = Integer(color_a.blue  + (color_b.blue  - color_a.blue)  * percent)
  372.         a = Integer(color_a.alpha + (color_b.alpha - color_a.alpha) * percent)
  373.         @color_between[key] = Color.new(r, g, b, a)
  374.         return @color_between[key]
  375.       end
  376.     end
  377.   end
  378. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement