code: func (i *Image) restore() error {
  	w, h := i.image.Size()
  	if i.screen {
  		// The screen image should also be recreated because framebuffer might
  		// be changed.
  		i.image = graphicscommand.NewScreenFramebufferImage(w, h)
  		i.basePixels = nil
  		i.drawTrianglesHistory = nil
  		i.stale = false
  		return nil
  	}
  	if i.volatile {
  		i.image = graphicscommand.NewImage(w, h)
  		i.clear()
  		return nil
  	}
  	if i.stale {
  		// TODO: panic here?
  		return errors.New("restorable: pixels must not be stale when restoring")
  	}
  
  	gimg := graphicscommand.NewImage(w, h)
  	if i.basePixels != nil {
  		gimg.ReplacePixels(i.basePixels.Slice(), 0, 0, w, h)
  	} else {
  		// Clear the image explicitly.
  		pix := make([]uint8, w*h*4)
  		gimg.ReplacePixels(pix, 0, 0, w, h)
  	}
  	for _, c := range i.drawTrianglesHistory {
  		if c.image.hasDependency() {
  			panic("restorable: all dependencies must be already resolved but not")
  		}
  		gimg.DrawTriangles(c.image.image, c.vertices, c.indices, c.colorm, c.mode, c.filter, c.address)
  	}
  	i.image = gimg
  
  	pix := gimg.Pixels()
  	i.basePixels = &Pixels{
  		pixels: pix,
  		length: len(pix),
  	}
  	i.drawTrianglesHistory = nil
  	i.stale = false
  	return nil
  }
docs: // Restore restores *graphicscommand.Image from the pixels using its state.