Skip to content

Commit

Permalink
fix hsv->rgb
Browse files Browse the repository at this point in the history
  • Loading branch information
pufferfish101007 committed Jan 13, 2024
1 parent 8ad288e commit 2519b45
Showing 1 changed file with 73 additions and 42 deletions.
115 changes: 73 additions & 42 deletions src/targets/wasm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1205,11 +1205,17 @@ impl From<IrProject> for WasmProject {
pub const REGION: u32 = 5;
pub const REMAINDER: u32 = 6;
pub const P: u32 = 7;
pub const Q: u32 = 8;
pub const T: u32 = 9;
pub const R: u32 = 10;
pub const G: u32 = 11;
pub const B: u32 = 12;
pub const VAL_F: u32 = 13;
}

// hsv->rgb based off of https://stackoverflow.com/a/14733008
functions.function(types::I32_NORESULT);
let mut sprite_update_pen_color_func = Function::new(vec![(12, ValType::I32)]);
let mut sprite_update_pen_color_func = Function::new(vec![(12, ValType::I32), (1, ValType::F32)]);
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::SPRITE_INDEX)); // sprite index - this is (target index - 1), assuming that the stage is target 0, which could be an issue if we don't confirm this
sprite_update_pen_color_func.instruction(&Instruction::I32Const(SPRITE_INFO_LEN));
sprite_update_pen_color_func.instruction(&Instruction::I32Mul);
Expand Down Expand Up @@ -1278,27 +1284,39 @@ impl From<IrProject> for WasmProject {
sprite_update_pen_color_func.instruction(&Instruction::F32Const(0.01));
sprite_update_pen_color_func.instruction(&Instruction::F32Lt);
sprite_update_pen_color_func.instruction(&Instruction::If(WasmBlockType::Empty));
sprite_update_pen_color_func.instruction(&Instruction::I32Const(supc_locals::MEM_POS.try_into().unwrap()));
sprite_update_pen_color_func.instruction(&Instruction::F32Const(0.0));
sprite_update_pen_color_func.instruction(&Instruction::F32Store(MemArg {
offset: u64::try_from(sprite_info_offsets::PEN_A).unwrap(),
align: 0,
memory_index: 0,
}));
sprite_update_pen_color_func.instruction(&Instruction::Return); // if alpha is 0, return (it is already set to 0 so it doesn't matter what r, g & b are)
sprite_update_pen_color_func.instruction(&Instruction::End);
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::SAT));
sprite_update_pen_color_func.instruction(&Instruction::I32Eqz);
sprite_update_pen_color_func.instruction(&Instruction::If(WasmBlockType::Empty));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::VAL));
sprite_update_pen_color_func.instruction(&Instruction::F32ConvertI32S);
sprite_update_pen_color_func.instruction(&Instruction::F32Const(255.0));
sprite_update_pen_color_func.instruction(&Instruction::F32Div);
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::VAL_F));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::MEM_POS));
sprite_update_pen_color_func.instruction(&Instruction::F32Const(0.0));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::VAL_F));
sprite_update_pen_color_func.instruction(&Instruction::F32Store(MemArg {
offset: u64::try_from(sprite_info_offsets::PEN_R).unwrap(),
align: 0,
memory_index: 0,
}));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::MEM_POS));
sprite_update_pen_color_func.instruction(&Instruction::F32Const(0.0));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::VAL_F));
sprite_update_pen_color_func.instruction(&Instruction::F32Store(MemArg {
offset: u64::try_from(sprite_info_offsets::PEN_G).unwrap(),
align: 0,
memory_index: 0,
}));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::MEM_POS));
sprite_update_pen_color_func.instruction(&Instruction::F32Const(0.0));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::VAL_F));
sprite_update_pen_color_func.instruction(&Instruction::F32Store(MemArg {
offset: u64::try_from(sprite_info_offsets::PEN_B).unwrap(),
align: 0,
Expand All @@ -1313,100 +1331,111 @@ impl From<IrProject> for WasmProject {
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::HUE));
sprite_update_pen_color_func.instruction(&Instruction::I32Const(43));
sprite_update_pen_color_func.instruction(&Instruction::I32RemU);
sprite_update_pen_color_func.instruction(&Instruction::I32Const(6));
sprite_update_pen_color_func.instruction(&Instruction::I32Mul);
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::REMAINDER)); // 'remainder'
sprite_update_pen_color_func.instruction(&Instruction::I32Const(255));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::REMAINDER));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::SAT));
sprite_update_pen_color_func.instruction(&Instruction::I32Sub);
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::VAL));
sprite_update_pen_color_func.instruction(&Instruction::I32Mul);
sprite_update_pen_color_func.instruction(&Instruction::I32Const(8));
sprite_update_pen_color_func.instruction(&Instruction::I32ShrU);
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::P)); // 'p'
sprite_update_pen_color_func.instruction(&Instruction::I32Const(255));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::REMAINDER));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::SAT));
sprite_update_pen_color_func.instruction(&Instruction::I32Mul);
sprite_update_pen_color_func.instruction(&Instruction::I32Const(8));
sprite_update_pen_color_func.instruction(&Instruction::I32ShrU);
sprite_update_pen_color_func.instruction(&Instruction::I32Sub);
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::VAL));
sprite_update_pen_color_func.instruction(&Instruction::I32Mul);
sprite_update_pen_color_func.instruction(&Instruction::I32Const(8));
sprite_update_pen_color_func.instruction(&Instruction::I32ShrU);
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(8)); // 'q'
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::Q)); // 'q'
sprite_update_pen_color_func.instruction(&Instruction::I32Const(255));
sprite_update_pen_color_func.instruction(&Instruction::I32Const(255));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::REMAINDER));
sprite_update_pen_color_func.instruction(&Instruction::I32Sub);
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::SAT));
sprite_update_pen_color_func.instruction(&Instruction::I32Mul);
sprite_update_pen_color_func.instruction(&Instruction::I32Const(8));
sprite_update_pen_color_func.instruction(&Instruction::I32ShrU);
sprite_update_pen_color_func.instruction(&Instruction::I32Sub);
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::VAL));
sprite_update_pen_color_func.instruction(&Instruction::I32Mul);
sprite_update_pen_color_func.instruction(&Instruction::I32Const(8));
sprite_update_pen_color_func.instruction(&Instruction::I32ShrU);
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(9)); // 't'
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::T)); // 't'
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::REGION));
sprite_update_pen_color_func.instruction(&Instruction::I32Const(0));
sprite_update_pen_color_func.instruction(&Instruction::I32Eq);
sprite_update_pen_color_func.instruction(&Instruction::I32Eqz);
sprite_update_pen_color_func.instruction(&Instruction::If(WasmBlockType::Empty));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::SAT));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(10));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(9));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(11));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::VAL));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::R));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::T));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::G));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::P));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(12));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::B));
sprite_update_pen_color_func.instruction(&Instruction::End);
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::REGION));
sprite_update_pen_color_func.instruction(&Instruction::I32Const(1));
sprite_update_pen_color_func.instruction(&Instruction::I32Eq);
sprite_update_pen_color_func.instruction(&Instruction::If(WasmBlockType::Empty));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(8));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(10));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::SAT));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(11));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::Q));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::R));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::VAL));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::G));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::P));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(12));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::B));
sprite_update_pen_color_func.instruction(&Instruction::End);
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::REGION));
sprite_update_pen_color_func.instruction(&Instruction::I32Const(2));
sprite_update_pen_color_func.instruction(&Instruction::I32Eq);
sprite_update_pen_color_func.instruction(&Instruction::If(WasmBlockType::Empty));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::P));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(10));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::SAT));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(11));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(9));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(12));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::R));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::VAL));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::G));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::T));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::B));
sprite_update_pen_color_func.instruction(&Instruction::End);
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::REGION));
sprite_update_pen_color_func.instruction(&Instruction::I32Const(3));
sprite_update_pen_color_func.instruction(&Instruction::I32Eq);
sprite_update_pen_color_func.instruction(&Instruction::If(WasmBlockType::Empty));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::P));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(10));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(8));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(11));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::SAT));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(12));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::R));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::Q));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::G));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::VAL));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::B));
sprite_update_pen_color_func.instruction(&Instruction::End);
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::REGION));
sprite_update_pen_color_func.instruction(&Instruction::I32Const(4));
sprite_update_pen_color_func.instruction(&Instruction::I32Eq);
sprite_update_pen_color_func.instruction(&Instruction::If(WasmBlockType::Empty));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(9));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(10));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::T));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::R));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::P));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(11));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::SAT));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(12));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::G));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::VAL));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::B));
sprite_update_pen_color_func.instruction(&Instruction::End);
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::SAT));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(10));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::REGION));
sprite_update_pen_color_func.instruction(&Instruction::I32Const(5));
sprite_update_pen_color_func.instruction(&Instruction::I32Eq);
sprite_update_pen_color_func.instruction(&Instruction::If(WasmBlockType::Empty));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::VAL));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::R));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::P));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(11));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(8));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(12));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::G));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::Q));
sprite_update_pen_color_func.instruction(&Instruction::LocalSet(supc_locals::B));
sprite_update_pen_color_func.instruction(&Instruction::End);
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::MEM_POS));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(10));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::R));
sprite_update_pen_color_func.instruction(&Instruction::Call(func_indices::DBG_LOGI32));
sprite_update_pen_color_func.instruction(&Instruction::F32ConvertI32S);
sprite_update_pen_color_func.instruction(&Instruction::F32Const(255.0));
sprite_update_pen_color_func.instruction(&Instruction::F32Div);
Expand All @@ -1416,7 +1445,8 @@ impl From<IrProject> for WasmProject {
memory_index: 0,
}));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::MEM_POS));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(11));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::G));
sprite_update_pen_color_func.instruction(&Instruction::Call(func_indices::DBG_LOGI32));
sprite_update_pen_color_func.instruction(&Instruction::F32ConvertI32S);
sprite_update_pen_color_func.instruction(&Instruction::F32Const(255.0));
sprite_update_pen_color_func.instruction(&Instruction::F32Div);
Expand All @@ -1426,7 +1456,8 @@ impl From<IrProject> for WasmProject {
memory_index: 0,
}));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::MEM_POS));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(12));
sprite_update_pen_color_func.instruction(&Instruction::LocalGet(supc_locals::B));
sprite_update_pen_color_func.instruction(&Instruction::Call(func_indices::DBG_LOGI32));
sprite_update_pen_color_func.instruction(&Instruction::F32ConvertI32S);
sprite_update_pen_color_func.instruction(&Instruction::F32Const(255.0));
sprite_update_pen_color_func.instruction(&Instruction::F32Div);
Expand Down

0 comments on commit 2519b45

Please sign in to comment.