Forum: Ruby FXRuby Image Scaling question

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
2c51fec8183a5d21c4e11b430beabb47?d=identicon&s=25 Patrick Hurley (Guest)
on 2006-02-02 16:24
(Received via mailing list)
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
2c51fec8183a5d21c4e11b430beabb47?d=identicon&s=25 Patrick Hurley (Guest)
on 2006-02-02 19:23
(Received via mailing list)
On 2/2/06, Patrick Hurley <phurley@gmail.com> wrote:
>
> 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
2c51fec8183a5d21c4e11b430beabb47?d=identicon&s=25 Patrick Hurley (Guest)
on 2006-02-02 20:20
(Received via mailing list)
On 2/2/06, Patrick Hurley <phurley@gmail.com> wrote:
> >     image.backColor = FXColor::Blue
> >
> IMAGE_KEEP)
>
>
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
This topic is locked and can not be replied to.