IceDragon200

[MACL]Vectrix

Jul 6th, 2012
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 4.60 KB | None | 0 0
  1. # // 05/07/2012
  2. # // 06/07/2012
  3. #-inject gen_scr_imported_ww 'MACL::Vectrix', '0x10000'
  4. #-inject gen_class_header 'MACL::Vectrix'
  5. module MACL
  6.   class Vectrix
  7.     module Constants
  8.       # // Commands
  9.       COMMAND_NULL       = 0
  10.       COMMAND_DRAW_PIXEL = 1
  11.       COMMAND_DRAW_LINE  = 2
  12.       COMMAND_DRAW_BOX   = 3
  13.       COMMAND_FILL_PIXEL = 11
  14.       COMMAND_FILL_LINE  = 12
  15.       COMMAND_FILL_BOX   = 13
  16.       # // Data Types
  17.       DATA_TYPE_SYM = {
  18.         #'(?:rgb|color):\((\d+[%]?(?:\s*\d+[%]?\s*){2,3})\)',
  19.         :color => '(?:rgb|color):\(\d+%?\s+\d+%?\s+\d+%?(?:\s+\d+%?)?\)',
  20.         :pos   => '(?:pos|point):\(\d+%\s+\d+%\)',
  21.         :rect  => '(?:rect|box):\(\d+%\s+\d+%\s+\d+%\s+\d+%\)'
  22.       }
  23.       DATA_TYPE = DATA_TYPE_SYM.invert
  24.     end
  25.     module Parser
  26.       REGEXP_TYPE  = /(?<name>\S+):\((?<parameters>.*)\)/
  27.       REGEXP_COLOR = /(?<red>\d+%?)\s+(?<green>\d+%?)\s+(?<blue>\d+%?)(?:\s+(?<alpha>\d+%?))?/
  28.       REGEXP_POS   = /(?<x>\d+(?:%))\s+(?<y>\d+(?:%))/i
  29.       REGEXP_RECT  = /(?<x>\d+(?:%))\s+(?<y>\d+(?:%))\s+(?<width>\d+(?:%))\s+(?<height>\d+(?:%))/i
  30.       def self.str2ratem str,multiplier=1
  31.         str = str.to_s unless str.is_a? String
  32.         if str.end_with? ?%
  33.           str.gsub('%','').to_i * multiplier
  34.         else
  35.           str.to_i
  36.         end
  37.       end
  38.       TYPES = {
  39.         ['rgb','color','rgba'] => proc do |s|
  40.           mt = s.match REGEXP_COLOR
  41.           mt ? [:red,:green,:blue,:alpha].collect do |sym| str2ratem(mt[sym]||'255',2.55) end : [0,0,0,0]
  42.         end,
  43.         ['pos','point'] => proc do |s|
  44.           mt = s.match REGEXP_POS
  45.           mt ? [mt[:x].to_i/100.0,mt[:y].to_i/100.0] : [0,0]
  46.         end,
  47.         ['rect','box'] => proc do |s|
  48.           mt = s.match REGEXP_RECT
  49.           mt ? [mt[:x].to_i/100.0,mt[:y].to_i/100.0,mt[:width].to_i/100.0,mt[:height].to_i/100.0] : [0,0,0,0]
  50.         end
  51.       }
  52.       TYPES.enum2keys!
  53.       def self.parse_str str
  54.         mt = str.match REGEXP_TYPE
  55.         name,parameters = mt[:name].downcase, mt[:parameters]
  56.         DataType.new name,TYPES[name].call(parameters)
  57.       end
  58.     end
  59.     include Constants
  60.     DataType = Struct.new :symbol, :params
  61.     @@blaz = MACL::Blaz.new
  62.     # // draw_pixel: pos(0% 0%), color(255 255 255 255)
  63.     # // fill_pixel: pos(0% 0%), color(255 255 255 255)
  64.     # // draw_line: pos(0% 0%), pos(0% 0%), color(255 255 255 255)
  65.     # // fill_line: pos(0% 0%), pos(0% 0%), color(255 255 255 255)
  66.     # // draw_box: rect(0% 0% 0% 0%), color(255 255 255 255)
  67.     # // fill_box: rect(0% 0% 0% 0%), color(255 255 255 255)
  68.     dtsym = DATA_TYPE_SYM
  69.     with_line = "%s[_ ]?line:\s*(?<pos1>#{dtsym[:pos]})\s*,\s*(?<pos2>#{dtsym[:pos]})\s*,\s*(?<color>#{dtsym[:color]})"
  70.     with_box  = "%s[_ ]?(?:box|rect):\s*(?<rect>#{dtsym[:rect]})\s*,\s*(?<color>#{dtsym[:color]})"
  71.     with_pixel= "%s[_ ]?pixel:\s*(?<pos>#{dtsym[:pos]})\s*,\s*(?<color>#{dtsym[:color]})"
  72.    
  73.     @@blaz.add_command :draw_pixel, /#{'draw'+with_pixel}/i do
  74.       [COMMAND_DRAW_PIXEL,Parser.parse_str(params[:pos]),Parser.parse_str(params[:color])]
  75.     end
  76.     @@blaz.add_command :fill_pixel, /#{'fill'+with_pixel}/i do
  77.       [COMMAND_FILL_PIXEL,Parser.parse_str(params[:pos]),Parser.parse_str(params[:color])]
  78.     end
  79.  
  80.     @@blaz.add_command :draw_line, /#{'draw'+with_line}/i do
  81.       [COMMAND_DRAW_LINE,Parser.parse_str(params[:pos1]),Parser.parse_str(params[:pos2]),Parser.parse_str(params[:color])]
  82.     end
  83.     @@blaz.add_command :fill_line, /#{'fill'+with_line}/i do
  84.       [COMMAND_FILL_LINE,Parser.parse_str(params[:pos1]),Parser.parse_str(params[:pos2]),Parser.parse_str(params[:color])]
  85.     end
  86.  
  87.     @@blaz.add_command :draw_box, /#{'draw'+with_box}/i do
  88.       [COMMAND_DRAW_BOX,Parser.parse_str(params[:rect]),Parser.parse_str(params[:color])]
  89.     end
  90.     @@blaz.add_command :fill_rect, /#{'fill'+with_box}/i do
  91.       [COMMAND_FILL_BOX,Parser.parse_str(params[:rect]),Parser.parse_str(params[:color])]
  92.     end
  93.     def self.str2stack str
  94.       commands = str.split(/[\n;]/)
  95.       commands.collect do |s| @@blaz.exec_command s end
  96.     end
  97.     def initialize
  98.       @stack = []
  99.     end
  100.     def to_bitmap width,height=nil
  101.       bmp = width.is_a?(Bitmap) ? width : Bitmap.new(width,height)
  102.       for ar in @stack
  103.         process_command bmp, ar
  104.       end
  105.       bmp
  106.     end
  107.     def process_command bitmap,array
  108.       command,params = array
  109.       case command
  110.       when COMMAND_NULL
  111.       when COMMAND_DRAW_PIXEL
  112.  
  113.       when COMMAND_DRAW_LINE
  114.       when COMMAND_DRAW_BOX
  115.       when COMMAND_FILL_RECT  
  116.       when COMMAND_FILL_LINE          
  117.       end
  118.     end
  119.   end
  120. end
  121. #-inject gen_script_footer
Advertisement
Add Comment
Please, Sign In to add comment