[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

FXRuby Image Scaling question

Patrick Hurley

2/2/2006 3:23:00 PM

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


2 Answers

Patrick Hurley

2/2/2006 6:22:00 PM

0

On 2/2/06, Patrick Hurley <phurley@gmail.com> 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


Patrick Hurley

2/2/2006 7:20:00 PM

0

On 2/2/06, Patrick Hurley <phurley@gmail.com> wrote:
> On 2/2/06, Patrick Hurley <phurley@gmail.com> 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