From: Jun Adachi Date: 2000-02-17T22:21:40+09:00 Subject: [ruby-dev:9251] Re: ColorSet Module for Gdk 安達@沖データと申します。 #すんません。これからruby-extの方をsubscribeします。 これは、動いていないっすね。毎度毎度の早とちりで、ごめんなさい。 ところで、これを修正している時に気付いたのですが、Gdk::Colorってnewだ けあって、アクセスメソッドは何も無いんですね。それだけのために、ラッパー クラスを作るのも馬鹿らしいので、アクセスメソッドを追加して見ました。 #色の足し算引き算は、きっと難しいだろうからパス。 パッチとそのパッチ適用後に動く奴をつけておきます。 #パッチなしの場合、GdkColorのクラスを有効にして、後のインスタンスを作っ #ている場所でコメント部分と入れ換えて下さい。 ところで、アクセスメソッドが無い事に深い意味があるんでしょうか? -- *------* adachi@okidata.co.jp |人∧鷲| 沖データ 第一研究所 | <女> | 安達 淳 |牛∨獅| *------* -- gdk_colors.rb(patchを期待しています) #! /usr/local/bin/ruby require 'gtk' module GdkColors =begin class GdkColor attr_reader :red attr_reader :green attr_reader :blue attr_reader :body def initialize (red, green, blue) @red = red @green = green @blue = blue @body = Gdk::Color.new (red, green, blue) end end =end class GdkColorSet < Hash def each_color each { | name, color | yield name, color.red, color.green, color.blue } end def search_by_values (red, green, blue, which=:names) red = Range.new (red, red) if (red.is_a?(Numeric)) green = Range.new (green, green) if (green.is_a?(Numeric)) blue = Range.new (blue, blue) if (blue.is_a?(Numeric)) hit = Array.new each { | name, color | next if (color.red < red.first|| color.red > red.last) next if (color.green < green.first|| color.green > green.last) next if (color.blue < blue.first|| color.blue > blue.last) hit.push ((which == :names)? name: color) } hit end end class << GdkColorSet def set_from_rgb (rgb_file="/usr/X11R6/lib/X11/rgb.txt") set = GdkColorSet.new color = nil open(rgb_file).each_line { | line | next if (line =~ /^\!/o) line.strip! color = line.split(/\s+/o, 4) aColor = Gdk::Color.new (color[0].to_i, color[1].to_i, color[2].to_i) set[color[3]] = aColor } set end end GdkStandardColors = GdkColorSet::set_from_rgb end if (__FILE__ == $0) include GdkColors GdkStandardColors.keys.sort.each { | name | color = GdkStandardColors[name] print "#{name}: #{color.red}, #{color.green}, #{color.blue}\n" } p GdkStandardColors.search_by_values (192..256, 0..64, 0..64) end -- patch:rbgdkcolor.c *** rbgdkcolor.c.old Sat Jan 8 20:52:27 2000 --- rbgdkcolor.c Thu Feb 17 21:46:23 2000 *************** *** 78,83 **** --- 78,113 ---- return make_gdkcolor(&c); } + static VALUE + gdkcolor_red (self) + VALUE self; + { + GdkColor *p; + + Data_Get_Struct(self, GdkColor, p) + return INT2FIX(p->red); + } + + static VALUE + gdkcolor_green (self) + VALUE self; + { + GdkColor *p; + + Data_Get_Struct(self, GdkColor, p) + return INT2FIX(p->green); + } + + static VALUE + gdkcolor_blue (self) + VALUE self; + { + GdkColor *p; + + Data_Get_Struct(self, GdkColor, p) + return INT2FIX(p->blue); + } + /* * Gdk::ColorContext *************** *** 104,109 **** --- 134,142 ---- gdkColor = rb_define_class_under(mGdk, "Color", rb_cData); rb_define_singleton_method(gdkColor, "new", gdkcolor_s_new, 3); + rb_define_method(gdkColor, "red", gdkcolor_red, 0); + rb_define_method(gdkColor, "green", gdkcolor_green, 0); + rb_define_method(gdkColor, "blue", gdkcolor_blue, 0); /* * Gdk::ColorContext