From: Patrick Hurley Date: 2006-02-03T04:20:28+09:00 Subject: Re: FXRuby Image Scaling question On 2/2/06, Patrick Hurley wrote: > On 2/2/06, Patrick Hurley wrote: > > I have a screen with a logo on it, I would like the logo to scale with > > screen size. I have tried more than a couple variations on: > > > > # Construct an image > > @logo = FXPNGImage.new(getApp(), File.open("logo.png", "rb").read, > > IMAGE_KEEP) > > > > # Prep an image Frame > > image = FXImageFrame.new(self, @logo, LAYOUT_FILL_X | LAYOUT_FILL_Y) > > image.backColor = FXColor::Blue > > > > image.connect(SEL_CONFIGURE) do |sender, sel, evt| > > if image.width > 100 && image.height > 100 > > @logo.scale(image.width, image.height) > > end > > end > > > > This works, but the image "degrades" from all the scaling. How would I > > go about keeping the original image? Any sort of "dup" on the FXImage > > results in an exception (at least for me). > > > > Thanks in advance > > pth > > > > > > Ok I am still very interested if there is a better solution, but this > works for me: > > # Construct an image > @logo = FXPNGImage.new(getApp(), File.open("logo.png", "rb").read, > IMAGE_KEEP) > stream = FXMemoryStream.open(FXStreamSave,nil) > @logo.savePixels(stream) > puts stream > @buffer = stream.takeBuffer > stream.close > p @buffer > > # Prep an image Frame > image = FXImageFrame.new(self, @logo, LAYOUT_FILL_X | LAYOUT_FILL_Y) > image.backColor = FXColor::Blue > > image.connect(SEL_CONFIGURE) do |sender, sel, evt| > if image.width > 100 && image.height > 100 > stream = FXMemoryStream.open(FXStreamLoad, @buffer) > @logo.loadPixels(stream) > @logo.scale(image.width, image.height) > stream.close > end > end > end > > At the risk of talking to myself too much. Here is the cleaned up solution: class FXScaledImageFrame < FXImageFrame def initialize(parent, img, opts = FRAME_SUNKEN|FRAME_THICK,x=0,y=0,w=0,h=0,pl=0,pr=0,pt=0,pb=0) @img = img FXMemoryStream.open(FXStreamSave, nil) do |stream| @img.savePixels(stream) @buffer = stream.takeBuffer end super self.connect(SEL_CONFIGURE) do |sender, sel, evt| if width > 1 and height > 1 FXMemoryStream.open(FXStreamLoad, @buffer) do |stream| @img.loadPixels(stream) end @img.scale(width, height) end end yield self if block_given? end end