Skip to content

Commit

Permalink
add stubbed out methods for poor man's bg export
Browse files Browse the repository at this point in the history
  • Loading branch information
lbussell committed Apr 17, 2020
1 parent 41eb276 commit 17558f1
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 40 deletions.
59 changes: 42 additions & 17 deletions src/components/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@ import Palette, { paletteIndexToCol } from "../models/Palette";
import Spritesheet4 from "../models/Spritesheet4";
import { DEFAULT_SETTINGS, STORAGE, Tool } from "../util/consts";
import DEFAULT_PALETTE from "../util/defaultPalette";
import { exportImage, exportPalette } from "../util/exportUtils";
import {
exportImage,
exportPalette,
mode3BitmapAsBackgroundHeader,
mode3BitmapAsBackgroundSource,
} from "../util/exportUtils";
import { loadNewImage, loadNewPalette } from "../util/fileLoadUtils";
import { quantize } from "../util/quantize";
import {
Expand Down Expand Up @@ -204,7 +209,7 @@ function App(): JSX.Element {
newStartRow: number,
numRows: number,
overwrite: boolean
) => { };
) => {};

const handleToolChange = useCallback(
(newTool: Tool) => {
Expand Down Expand Up @@ -342,6 +347,21 @@ function App(): JSX.Element {
let hBlob = new Blob([image.headerData]);
saveAs(hBlob, fileName + fileType);
return;
case "BG":
if (image instanceof Bitmap3) {
//.c file
fileType = ".c";
let cBlob = new Blob([mode3BitmapAsBackgroundSource(image)]);
saveAs(cBlob, fileName + fileType);
//.h file
fileType = ".h";
let hBlob = new Blob([mode3BitmapAsBackgroundHeader(image)]);
saveAs(hBlob, fileName + fileType);
return;
} else {
alert("Background export only supported for Mode 3.");
return;
}
case "PAL":
//.pal file
if (!palette) {
Expand Down Expand Up @@ -431,13 +451,18 @@ function App(): JSX.Element {

const buildPalette = (paletteString: string): Palette => {
interface IColor {
r: number, g: number, b: number, a: number
r: number;
g: number;
b: number;
a: number;
}
// The following cast is definitely unsafe.
let parsedPalette = JSON.parse(paletteString) as IColor[]
let newPalette = parsedPalette.map((c) => new Color(c.r, c.g, c.b, c.a))
let parsedPalette = JSON.parse(paletteString) as IColor[];
let newPalette = parsedPalette.map(
(c) => new Color(c.r, c.g, c.b, c.a)
);
return newPalette;
}
};

switch (parsedImageMode) {
case 0:
Expand All @@ -449,13 +474,7 @@ function App(): JSX.Element {
console.log(newPalette);
const parsedImage = JSON.parse(loadedImage) as SpritesheetDataStore;
setPalette(newPalette);
setImage(
Spritesheet4.fromDataStore(
parsedImage,
newPalette,
0
)
);
setImage(Spritesheet4.fromDataStore(parsedImage, newPalette, 0));
let newEditorSettings = DEFAULT_SETTINGS;
newEditorSettings.imageMode = parsedImageMode;
newEditorSettings.editorMode = parsedImageType;
Expand Down Expand Up @@ -563,6 +582,12 @@ function App(): JSX.Element {
startImageExport={handleImageExport.bind(null, "GBA")}
buttonLabel="C Source Code (*.c/.h)"
/>
{image instanceof Bitmap3 ? (
<ExportButton
startImageExport={handleImageExport.bind(null, "BG")}
buttonLabel="C Source as background"
/>
) : null}
<div className="dd-divider"></div>
<ExportButton
startImageExport={handleImageExport.bind(null, "PAL")}
Expand Down Expand Up @@ -627,10 +652,10 @@ function App(): JSX.Element {
onMouseWheel={handleMouseWheelEvent}
/>
) : (
<div className="start-message">
<em>Import an image to get started</em>
</div>
)}
<div className="start-message">
<em>Import an image to get started</em>
</div>
)}
</div>
<div className="right-panel">
<PalettePanel
Expand Down
74 changes: 51 additions & 23 deletions src/util/exportUtils.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Color from "../models/Color";
import Bitmap3 from "../models/Bitmap3";
import Palette from "../models/Palette";
import { PALETTE_LENGTH } from "./consts";
import { Dimensions, ImageInterface, Mode } from "./types";
Expand Down Expand Up @@ -26,13 +27,32 @@ export function generateCSourceFileString(
}
}

/**
* "Poor man's" background export function. Exports the entire source code for
* a background generated using mode 3 bitmap data.
* @param image the mode 3 bitmap to export as a background
*/
export function mode3BitmapAsBackgroundSource(image: Bitmap3): string {
return "have fun!";
}

/**
* "Poor man's" background header export function. Exports the header file data
* for a background generated using mode 3 bitmap data.
* @param image the mode 3 bitmap to export as a background
*/
export function mode3BitmapAsBackgroundHeader(image: Bitmap3): string {
return "";
}

function generateMode3CSourceFileString(image: ImageInterface): string {
const { fileName, dimensions, imageData } = image.imageDataStore;

const variableName = fileName.slice(0, fileName.lastIndexOf("."));
const bitmapLength = dimensions.height * dimensions.width;
const imageDefinitionString = `const unsigned short ${variableName}Bitmap[${bitmapLength /
2}]__attribute__((aligned(4)))=\n{\n\t`;
const imageDefinitionString = `const unsigned short ${variableName}Bitmap[${
bitmapLength / 2
}]__attribute__((aligned(4)))=\n{\n\t`;

let imageDataHexString = ``;

Expand Down Expand Up @@ -74,8 +94,9 @@ function generateMode4CSourceFileString(
// into a short
const variableName = fileName.slice(0, fileName.lastIndexOf("."));
const bitmapLength = dimensions.height * dimensions.width;
const imageDefinitionString = `const unsigned short ${variableName}Bitmap[${bitmapLength /
2}]__attribute__((aligned(4)))=\n{\n`;
const imageDefinitionString = `const unsigned short ${variableName}Bitmap[${
bitmapLength / 2
}]__attribute__((aligned(4)))=\n{\n`;

let imageDataHexString = "";
for (let i = 0; i < imageData.length; i += 2) {
Expand Down Expand Up @@ -122,7 +143,7 @@ export function generateHeaderString(
export function generateMode3HeaderString({
fileName,
imageDimensions,
palette
palette,
}: headerFileParams): string {
const variableName = fileName.slice(0, fileName.lastIndexOf("."));
const bitmapLength = imageDimensions.height * imageDimensions.width;
Expand All @@ -132,10 +153,10 @@ export function generateMode3HeaderString({
const bitmapLengthDefinition = `#define ${variableName.toUpperCase()}_LENGTH ${bitmapLength}\n`;
const imageHeightDefinition = `#define ${variableName.toUpperCase()}_HEIGHT ${
imageDimensions.height
}\n`;
}\n`;
const imageWidthDefinition = `#define ${variableName.toUpperCase()}_WIDTH ${
imageDimensions.width
}\n`;
}\n`;
const imageDefinitionString = `extern const unsigned short ${variableName}Bitmap[${bitmapLength}];\n\n`;

const headerString =
Expand All @@ -153,15 +174,15 @@ export function generateMode3HeaderString({
export function generateMode4HeaderString({
fileName,
imageDimensions,
palette
palette,
}: headerFileParams): string {
if (!palette) {
console.error(
"Tried to generate mode 4 header string with no palette! Falling back to mode 3..."
);
return generateMode3HeaderString({
fileName: fileName,
imageDimensions: imageDimensions
imageDimensions: imageDimensions,
});
}

Expand All @@ -172,16 +193,18 @@ export function generateMode4HeaderString({
const bitmapLengthDefinition = `#define ${variableName.toUpperCase()}_SIZE ${bitmapLength}\n`;
const imageHeightDefinition = `#define ${variableName.toUpperCase()}_HEIGHT ${
imageDimensions.height
}\n`;
}\n`;
const imageWidthDefinition = `#define ${variableName.toUpperCase()}_WIDTH ${
imageDimensions.width
}\n`;
const imageDefinitionString = `extern const unsigned short ${variableName}Bitmap[${bitmapLength /
2}];\n\n`;
}\n`;
const imageDefinitionString = `extern const unsigned short ${variableName}Bitmap[${
bitmapLength / 2
}];\n\n`;

// Palette length is uncompressed
const paletteLengthDefinition = `#define ${variableName.toUpperCase()}_PAL_SIZE ${PALETTE_LENGTH *
2}\n`;
const paletteLengthDefinition = `#define ${variableName.toUpperCase()}_PAL_SIZE ${
PALETTE_LENGTH * 2
}\n`;
const paletteDefinitionString = `extern const unsigned short ${variableName}Palette[${PALETTE_LENGTH}];\n\n`;

const headerString =
Expand All @@ -196,14 +219,19 @@ export function generateMode4HeaderString({
}

export const PALETTE_HEADER = (varName: string, palLength = PALETTE_LENGTH) =>
`#define ${varName}PalLen ${palLength * 2}\n`
+ `extern const unsigned short ${varName}Palette[${palLength}];\n\n`;
`#define ${varName}PalLen ${palLength * 2}\n` +
`extern const unsigned short ${varName}Palette[${palLength}];\n\n`;

export const SS_TILES_HEADER = (varName: string, ssDimensions = { height: 256, width: 256 }) => {
export const SS_TILES_HEADER = (
varName: string,
ssDimensions = { height: 256, width: 256 }
) => {
const len = ssDimensions.height * ssDimensions.width;
return `#define ${varName}TilesLen ${len / 2}\n`
+ `extern const unsigned short ${varName}Tiles[${len / 4}];\n\n`;
}
return (
`#define ${varName}TilesLen ${len / 2}\n` +
`extern const unsigned short ${varName}Tiles[${len / 4}];\n\n`
);
};

function paletteIndicesToHex(index1: number, index2: number): string {
if (index1 > 255 || index2 > 255) {
Expand Down Expand Up @@ -233,7 +261,7 @@ function paletteIndicesToHex(index1: number, index2: number): string {
function pixelToHex(bgr: number[]): string {
// convert to 16-bit binary format: 0bbbbbgggggrrrrr
let binary_value = "0";
bgr.forEach(element => {
bgr.forEach((element) => {
element = Math.floor((element * 32) / 256);
let elementString = element.toString(2); // convert to binary
while (elementString.length < 5) {
Expand Down Expand Up @@ -265,7 +293,7 @@ export function paletteToHex(palette: Palette): string {
let palFile = "";
let count = 1;
const alignment = 4; //this number can change depending on how we want to format
palette.forEach(element => {
palette.forEach((element) => {
let hex = "0x00";
hex +=
element.r < 16 ? "0" + element.r.toString(16) : element.r.toString(16);
Expand Down

0 comments on commit 17558f1

Please sign in to comment.