2016-11-09 18:14:35 +01:00
|
|
|
/****************************************************************************
|
|
|
|
* apps/graphics/traveler/tools/libwld/wld_loadbitmapfile.c
|
|
|
|
* This file contains the logic which loads texture bitmaps
|
|
|
|
*
|
|
|
|
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
|
|
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
*
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in
|
|
|
|
* the documentation and/or other materials provided with the
|
|
|
|
* distribution.
|
|
|
|
* 3. Neither the name NuttX nor the names of its contributors may be
|
|
|
|
* used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
|
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
|
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
|
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* Included files
|
|
|
|
*************************************************************************/
|
|
|
|
|
2016-11-10 13:29:25 +01:00
|
|
|
#include <stdbool.h>
|
2016-11-09 18:14:35 +01:00
|
|
|
#include <stdio.h>
|
2016-11-10 13:29:25 +01:00
|
|
|
|
2016-11-09 18:14:35 +01:00
|
|
|
#include "trv_types.h"
|
|
|
|
#include "wld_mem.h"
|
|
|
|
#include "wld_world.h"
|
|
|
|
#include "wld_bitmaps.h"
|
|
|
|
#if (MSWINDOWS)
|
|
|
|
#include "wld_pcx.h"
|
|
|
|
#endif
|
|
|
|
#include "wld_utils.h"
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* Private Functions
|
|
|
|
*************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************
|
2016-11-10 13:29:25 +01:00
|
|
|
* Name: wld_read_filename
|
|
|
|
* Description:
|
|
|
|
* Read a file name from the input stream
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
static bool wld_read_filename(FILE *fp, char *fileName)
|
|
|
|
{
|
|
|
|
int16_t nbytes;
|
|
|
|
int ch;
|
|
|
|
|
|
|
|
/* Skip over any leading spaces, new lines, or carriage returns (for
|
|
|
|
* MSDOS compatibility)
|
|
|
|
*/
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
ch = getc(fp);
|
|
|
|
if (ch == EOF) return false;
|
|
|
|
}
|
|
|
|
while ((ch == ' ') || (ch == '\n') || (ch == '\r'));
|
|
|
|
|
|
|
|
/* Get the file name from the file */
|
|
|
|
|
|
|
|
nbytes = 0;
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
/* Everything up to the next newline or space must be the filename */
|
|
|
|
|
|
|
|
if ((ch != '\n') && (ch != ' ') && (ch != '\r'))
|
|
|
|
{
|
|
|
|
/* Make sure that the file name is not too large */
|
|
|
|
|
|
|
|
if (nbytes >= FILE_NAME_SIZE) return false;
|
|
|
|
|
|
|
|
/* Add the new character to the file name */
|
|
|
|
|
|
|
|
fileName[nbytes] = (char)ch;
|
|
|
|
nbytes++;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* End of the file name -- Don't forget the ASCIIZ terminator */
|
|
|
|
|
|
|
|
fileName[nbytes] = '\0';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Get the character for the next time through the loop. Every file
|
|
|
|
* name should be terminated with a space or a new line. EOF is
|
|
|
|
* unexpected in this context.
|
|
|
|
*/
|
|
|
|
|
|
|
|
ch = getc(fp);
|
|
|
|
if (ch == EOF)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* Name: wld_load_bitmaps
|
2016-11-09 18:14:35 +01:00
|
|
|
* Description:
|
|
|
|
* This function loads the world data from the input file
|
|
|
|
************************************************************************/
|
|
|
|
|
2016-11-10 13:29:25 +01:00
|
|
|
static uint8_t wld_load_bitmaps(FILE *fp)
|
2016-11-09 18:14:35 +01:00
|
|
|
{
|
|
|
|
#if MSWINDOWS
|
|
|
|
volatile pcxPicture workPCX;
|
|
|
|
RGBColor *palette;
|
|
|
|
#endif
|
|
|
|
uint16_t bMapIndex;
|
|
|
|
uint8_t result = BMAP_SUCCESS;
|
|
|
|
uint8_t graphicsFileName[FILE_NAME_SIZE];
|
|
|
|
|
|
|
|
/* Discard any bitmaps that we may currently have buffered */
|
|
|
|
|
2016-11-09 19:29:30 +01:00
|
|
|
wld_discard_bitmaps();
|
2016-11-09 18:14:35 +01:00
|
|
|
|
|
|
|
/* Get the number of bitmaps in the bitmap file */
|
|
|
|
|
2016-11-09 19:29:30 +01:00
|
|
|
numBitmaps = wld_read_decimal(fp);
|
2016-11-09 18:14:35 +01:00
|
|
|
if (numBitmaps >= MAX_BITMAPS)
|
|
|
|
return BMAP_TOO_MANY;
|
|
|
|
|
|
|
|
/* Read the colors used to rend the sky and ground */
|
|
|
|
|
2016-11-09 19:29:30 +01:00
|
|
|
skyColor = wld_read_decimal(fp);
|
|
|
|
groundColor = wld_read_decimal(fp);
|
2016-11-09 18:14:35 +01:00
|
|
|
|
|
|
|
#if MSWINDOWS
|
|
|
|
/* Load the textures -- Note that the first texture will be used
|
|
|
|
* to define the worldPalette
|
|
|
|
*/
|
|
|
|
|
|
|
|
palette = worldPalette;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Load each bitmap file */
|
|
|
|
|
|
|
|
for (bMapIndex = 0;
|
|
|
|
((bMapIndex < numBitmaps) && (result == BMAP_SUCCESS));
|
|
|
|
bMapIndex++)
|
|
|
|
{
|
|
|
|
/* Load the even bitmap */
|
|
|
|
/* Get the name of the file which contains the even bitmap */
|
|
|
|
|
2016-11-10 13:29:25 +01:00
|
|
|
if (!wld_read_filename(fp, graphicsFileName))
|
2016-11-09 18:14:35 +01:00
|
|
|
return BMAP_BML_READ_ERROR;
|
|
|
|
|
|
|
|
#if MSWINDOWS
|
|
|
|
/* Setup to load the PCX bitmap from the file for the event bitmap */
|
|
|
|
|
2016-11-09 19:29:30 +01:00
|
|
|
result = wld_pcx_init(&workPCX, BITMAP_HEIGHT, BITMAP_WIDTH,
|
2016-11-09 18:14:35 +01:00
|
|
|
palette, NULL);
|
|
|
|
if (result) return result;
|
|
|
|
|
|
|
|
/* Put the bitmap buffer into the evenBitmap list */
|
|
|
|
|
|
|
|
evenBitmaps[bMapIndex].w = BITMAP_WIDTH;
|
|
|
|
evenBitmaps[bMapIndex].h = BITMAP_HEIGHT;
|
|
|
|
evenBitmaps[bMapIndex].log2h = BITMAP_LOG2H;
|
|
|
|
evenBitmaps[bMapIndex].bm = workPCX.buffer;
|
|
|
|
|
|
|
|
/* Load the PCX bitmap from the file for the event bitmap */
|
|
|
|
|
2016-11-09 19:29:30 +01:00
|
|
|
result = wld_loadpcx(graphicsFileName, &workPCX);
|
2016-11-09 18:14:35 +01:00
|
|
|
if (result) return result;
|
|
|
|
|
|
|
|
/* Don't bother to load the palette on the rest of the textures --
|
|
|
|
* we will assume the same palette for all textures.
|
|
|
|
*/
|
|
|
|
|
|
|
|
palette = NULL;
|
|
|
|
#else
|
2016-11-09 19:29:30 +01:00
|
|
|
evenBitmaps[bMapIndex] = wld_read_texturefile(graphicsFileName);
|
2016-11-09 18:14:35 +01:00
|
|
|
if (!evenBitmaps[bMapIndex]) return BMAP_BML_READ_ERROR;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Load the odd bitmap */
|
|
|
|
/* Get the name of the file which contains the odd bitmap */
|
|
|
|
|
2016-11-10 13:29:25 +01:00
|
|
|
if (!wld_read_filename(fp, graphicsFileName))
|
2016-11-09 18:14:35 +01:00
|
|
|
return BMAP_BML_READ_ERROR;
|
|
|
|
|
|
|
|
#ifndef WEDIT
|
|
|
|
#if MSWINDOWS
|
|
|
|
/* Setup to load the PCX bitmap from the file for the odd bitmap */
|
|
|
|
|
2016-11-09 19:29:30 +01:00
|
|
|
result = wld_pcx_init(&workPCX, BITMAP_HEIGHT, BITMAP_WIDTH,
|
2016-11-09 18:14:35 +01:00
|
|
|
palette, NULL);
|
|
|
|
if (result) return result;
|
|
|
|
|
|
|
|
/* Put the bitmap buffer into the oddBitmap list */
|
|
|
|
|
|
|
|
oddBitmaps[bMapIndex].w = BITMAP_WIDTH;
|
|
|
|
oddBitmaps[bMapIndex].h = BITMAP_HEIGHT;
|
|
|
|
oddBitmaps[bMapIndex].log2h = BITMAP_LOG2H;
|
|
|
|
oddBitmaps[bMapIndex].bm = workPCX.buffer;
|
|
|
|
|
|
|
|
/* Load the PCX bitmap from the file for the odd bitmap */
|
|
|
|
|
2016-11-09 19:29:30 +01:00
|
|
|
result = wld_loadpcx(graphicsFileName, &workPCX);
|
2016-11-09 18:14:35 +01:00
|
|
|
#else
|
2016-11-09 19:29:30 +01:00
|
|
|
oddBitmaps[bMapIndex] = wld_read_texturefile(graphicsFileName);
|
2016-11-09 18:14:35 +01:00
|
|
|
if (!oddBitmaps[bMapIndex]) return BMAP_BML_READ_ERROR;
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* Public Functions
|
|
|
|
*************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************
|
2016-11-09 19:29:30 +01:00
|
|
|
* Name: wld_load_bitmapfile
|
2016-11-09 18:14:35 +01:00
|
|
|
* Description:
|
|
|
|
* This function opens the input file and loads the world data from it
|
|
|
|
************************************************************************/
|
|
|
|
|
2016-11-09 19:29:30 +01:00
|
|
|
uint8_t wld_load_bitmapfile(char *bmlFile)
|
2016-11-09 18:14:35 +01:00
|
|
|
{
|
|
|
|
FILE *fp;
|
|
|
|
uint8_t result;
|
|
|
|
|
|
|
|
/* Open the file which contains the names of all of the bitmap files */
|
|
|
|
|
|
|
|
fp = fopen(bmlFile, "r");
|
|
|
|
if (!fp) return BMAP_BML_OPEN_ERROR;
|
|
|
|
|
|
|
|
/* Load all of the bitmaps */
|
|
|
|
|
2016-11-10 13:29:25 +01:00
|
|
|
result = wld_load_bitmaps(fp);
|
2016-11-09 19:29:30 +01:00
|
|
|
if (result) wld_discard_bitmaps();
|
2016-11-09 18:14:35 +01:00
|
|
|
|
|
|
|
/* We are all done with the file, so close it */
|
|
|
|
|
|
|
|
fclose(fp);
|
|
|
|
return result;
|
|
|
|
}
|