Skip to content

Commit

Permalink
add warning to output when size of exported non-BIN files approaches …
Browse files Browse the repository at this point in the history
…or exceeds X16 Low Ram size
  • Loading branch information
yeastplume committed Feb 23, 2020
1 parent a4fb2f0 commit 3de78ca
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 5 deletions.
32 changes: 27 additions & 5 deletions src/cmd/asm/command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ use crate::cmd::common::{self, GlobalArgs};
use crate::{Error, ErrorKind};
use vera::{AsmFormat, Assemblable, VeraBitmap, VeraSprite};

const LOW_RAM_SIZE: usize = 38655;
const LOW_RAM_WARN_THRESHOLD: f64 = 0.9;

/// Arguments for asm commands
pub struct AsmArgs {
pub out_dir: String,
Expand All @@ -31,10 +34,11 @@ fn perform_assemble<T>(
asm_args: &AsmArgs,
sel_args: Option<&AsmSelectArgs>,
line_start: &mut usize,
) -> Result<(), Error>
) -> Result<usize, Error>
where
T: Assemblable,
{
let mut assembled_size = 0;
for v in values {
let code = v.assemble()?;
let conflate = asm_args.format == AsmFormat::Bin || asm_args.conflate_tilemaps;
Expand Down Expand Up @@ -83,8 +87,17 @@ where
}
}
common::output_to_file(&file_name, output.as_bytes(), &asm_args.sd_image)?;
let size = v.size_in_bytes()?;
// Warn if we're getting close to t
info!("Resource {} has size {}", v.id(), size);
if size >= (LOW_RAM_SIZE as f64 * LOW_RAM_WARN_THRESHOLD) as usize
&& asm_args.format != AsmFormat::Bin
{
warn!("Resource {} has a size of {} bytes, which approaches or exceeds the size of Low RAM ({}) bytes. Consider outputting as .BIN instead.", v.id(), size, LOW_RAM_SIZE);
}
assembled_size += v.size_in_bytes()?;
}
Ok(())
Ok(assembled_size)
}

/// Assemble
Expand All @@ -94,21 +107,22 @@ pub fn asm_all(g_args: &GlobalArgs, mut args: AsmArgs) -> Result<(), Error> {
//common::remove_dir(&args.out_dir)?;
let mut line_start = 10000;
let start_dir = args.out_dir.clone();
let mut tot_size = 0;
// Output palettes
if !proj.palettes.is_empty() {
args.out_dir = format!("{}/palettes", start_dir);
common::create_dir(&args.out_dir)?;
perform_assemble(&mut proj.palettes.values(), &args, None, &mut line_start)?;
tot_size += perform_assemble(&mut proj.palettes.values(), &args, None, &mut line_start)?;
}
if !proj.imagesets.is_empty() {
args.out_dir = format!("{}/imagesets", start_dir);
common::create_dir(&args.out_dir)?;
perform_assemble(&mut proj.imagesets.values(), &args, None, &mut line_start)?;
tot_size += perform_assemble(&mut proj.imagesets.values(), &args, None, &mut line_start)?;
}
if !proj.tilemaps.is_empty() {
args.out_dir = format!("{}/tilemaps", start_dir);
common::create_dir(&args.out_dir)?;
perform_assemble(&mut proj.tilemaps.values(), &args, None, &mut line_start)?;
tot_size += perform_assemble(&mut proj.tilemaps.values(), &args, None, &mut line_start)?;
}
let mut sprites = vec![];
if !proj.sprites.is_empty() {
Expand All @@ -129,6 +143,7 @@ pub fn asm_all(g_args: &GlobalArgs, mut args: AsmArgs) -> Result<(), Error> {
let sprite = VeraSprite::init_from_imageset(&s.id, &imageset)?;
sprites.push(sprite);
}
// Don't include BMP size in total, since the imageset is already accounted for
perform_assemble(&mut sprites.iter(), &args, None, &mut line_start)?;
}
let mut bitmaps = vec![];
Expand All @@ -150,9 +165,16 @@ pub fn asm_all(g_args: &GlobalArgs, mut args: AsmArgs) -> Result<(), Error> {
let bitmap = VeraBitmap::init_from_imageset(&b.id, &imageset)?;
bitmaps.push(bitmap);
}
// Don't include BMP size in total, since the imageset is already accounted for
perform_assemble(&mut bitmaps.iter(), &args, None, &mut line_start)?;
}

if tot_size >= (LOW_RAM_SIZE as f64 * LOW_RAM_WARN_THRESHOLD) as usize
&& args.format != AsmFormat::Bin
{
warn!("Combined resources have a size of {} bytes, which approaches or exceeds the size of Low RAM ({}) bytes. Consider outputting as .BIN instead.", tot_size, LOW_RAM_SIZE);
}

Ok(())
}

Expand Down
3 changes: 3 additions & 0 deletions vera/src/asm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ pub trait Assemblable {

/// Return ID of assembled asset
fn id(&self) -> &str;

/// Size, in bytes, of assembled asset
fn size_in_bytes(&self) -> Result<usize, Error>;
}

/// Enum for variations ToAsm implementors can assemble to
Expand Down
7 changes: 7 additions & 0 deletions vera/src/bitmap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,13 @@ impl<'a> Assemblable for VeraBitmap<'a> {
&self.id
}

fn size_in_bytes(&self) -> Result<usize, Error> {
match self.imageset {
Some(i) => Ok(i.size()),
None => Err(ErrorKind::BitmapNoImageSet(format!("{}", self.id)).into()),
}
}

fn assemble(&self) -> Result<AssembledPrimitive, Error> {
let mut retval = AssembledPrimitive::new(self.id());
if self.imageset.is_none() {
Expand Down
4 changes: 4 additions & 0 deletions vera/src/imageset.rs
Original file line number Diff line number Diff line change
Expand Up @@ -503,6 +503,10 @@ impl Assemblable for VeraImageSet {
&self.id
}

fn size_in_bytes(&self) -> Result<usize, Error> {
Ok(self.size())
}

fn assemble(&self) -> Result<AssembledPrimitive, Error> {
if !self.formatted {
return Err(ErrorKind::ImageSetNotFormatted(format!("{}", self.id)).into());
Expand Down
4 changes: 4 additions & 0 deletions vera/src/palette.rs
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,10 @@ impl Assemblable for VeraPalette {
&self.id
}

fn size_in_bytes(&self) -> Result<usize, Error> {
Ok(self.size())
}

fn assemble(&self) -> Result<AssembledPrimitive, Error> {
let mut retval = AssembledPrimitive::new(self.id());
retval.add_meta(format!("{} - size is {}", self.id, self.size()));
Expand Down
7 changes: 7 additions & 0 deletions vera/src/sprite.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,13 @@ impl<'a> Assemblable for VeraSprite<'a> {
&self.id
}

fn size_in_bytes(&self) -> Result<usize, Error> {
match self.imageset {
Some(i) => Ok(i.size()),
None => Err(ErrorKind::SpriteNoImageSet(format!("{}", self.id)).into()),
}
}

fn assemble(&self) -> Result<AssembledPrimitive, Error> {
let mut retval = AssembledPrimitive::new(self.id());
if self.imageset.is_none() {
Expand Down
8 changes: 8 additions & 0 deletions vera/src/tilemap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,10 @@ impl Assemblable for VeraTileMapEntry {
"0"
}

fn size_in_bytes(&self) -> Result<usize, Error> {
Ok(2)
}

fn assemble(&self) -> Result<AssembledPrimitive, Error> {
let mut retval = AssembledPrimitive::new(self.id());
let out_bytes = match self {
Expand Down Expand Up @@ -471,6 +475,10 @@ impl Assemblable for VeraTileMap {
&self.id
}

fn size_in_bytes(&self) -> Result<usize, Error> {
Ok(self.size())
}

fn assemble(&self) -> Result<AssembledPrimitive, Error> {
if self.tiles.is_empty() {
warn!("tilemap is empty: {}", self.id);
Expand Down

0 comments on commit 3de78ca

Please sign in to comment.