Skip to content
Roman Shapiro edited this page Feb 24, 2020 · 23 revisions

Overview

This entry describes in detail how Myra deals with images.

IBrush

IBrush represents something that can draw itself in the specified rectangle with the specified color:

  public interface IBrush
  {
    void Draw(SpriteBatch batch, Rectangle dest, Color color);
  }

Many widgets properties such as Widget.Background or Menu.SelectionBackground have IBrush type. The most simple implementation of IBrush is SolidBrush.

I.e. following code sets SolidBrush as widget.Background:

  widget.Background = new SolidBrush(Color.Red); // SolidBrush from Color
  widget.Background = new SolidBrush("#808000FF"); // SolidBrush from RGBA string
  widget.Background = new SolidBrush("#FFA500"); // SolidBrush from RGB string

IImage

IImage extends IBrush with Size property:

  public interface IImage: IBrush
  {
    Point Size { get; }
  }

Widgets properties such as Image.Renderable or TextBox.Cursor have IImage type. Myra provides 2 IImage implementation: TextureRegion and NinePatchRegion.

TextureRegion

TextureRegion describes rectangle in the texture. TextureRegion implements IImage.

Therefore following code will work:

// 'texture' is object of type Texture2D
image.Renderable = new TextureRegion(texture, new Rectangle(10, 10, 50, 50));

Also following:

// If 2nd parameter is omitted, then TextureRegion covers the whole texture
image.Renderable = new TextureRegion(texture);

_Note. It's also possible to use TextureRegion as IBrush. However usually it wont make much sense, since it would result in the TextureRegion streched over the rectangle IBrush is drawn at.

NinePatchRegion

NinePatchRegion represents region with unstrechable border and strechable center.

It could be used following way:

widget.Background = new NinePatchRegion(texture, new Rectangle(10, 10, 50, 50), 
                                        new PaddingInfo {Left = 2, Right = 2, 
                                                         Top = 2, Bottom = 2});

_Note. Since NinePatchRegion is stretchable, it makes a lot of sense to use it as IBrush. In fact all backgrounds of the Myra widgets are NinePatchRegion.

TextureRegionAtlas

TextureRegionAtlas is collection of texture regions(each could be nine patch) accessible by string key.

It could be serialized to xml with following look: default_ui_skin_atlas.xml

Following code loads it from xml:

// 'xml' is string
TextureRegionAtlas spriteSheet = TextureRegionAtlas.FromXml(xml, UIBitmap);

And following code saves it to xml:

string xml = spriteSheet.ToXml();