FXRuby Image Scaling question

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

···

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

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

···

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