aboutsummaryrefslogtreecommitdiff
path: root/source/nds/bitmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/nds/bitmap.c')
-rw-r--r--source/nds/bitmap.c224
1 files changed, 0 insertions, 224 deletions
diff --git a/source/nds/bitmap.c b/source/nds/bitmap.c
deleted file mode 100644
index efeb11c..0000000
--- a/source/nds/bitmap.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/* bitmap.c
- *
- * Copyright (C) 2010 dking <dking024@gmail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public Licens e as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-//v1.1
-
-#include "fs_api.h"
-#include "bitmap.h"
-#include "ds2_malloc.h"
-
-int BMP_read(char* filename, char *buf, unsigned int width, unsigned int height, unsigned int* type)
-{
- FILE* fp;
- BMPHEADER bmp_header;
- int flag;
- u32 bytepixel;
- u32 x, y, sx, sy, m;
- unsigned char *dest;
- s32 fpos;
- unsigned short st[54/2];
-
- fp= fopen(filename, "rb");
- if(fp == NULL)
- return BMP_ERR_OPENFAILURE;
-
- flag= fread(st, sizeof(st), 1, fp);
- if(!flag) {
- fclose(fp);
- return BMP_ERR_FORMATE;
- }
-
- bmp_header.bfType= st[0];
- bmp_header.bfSize= st[1] | (st[2]<<16);
- bmp_header.bfReserved0= st[3];
- bmp_header.bfReserved1= st[4];
- bmp_header.bfImgoffst= st[5] | (st[6]<<16);
- bmp_header.bfImghead.imHeadsize= st[7] | (st[8]<<16);
- bmp_header.bfImghead.imBitmapW= st[9] | (st[10]<<16);
- bmp_header.bfImghead.imBitmapH= st[11] | (st[12]<<16);
- bmp_header.bfImghead.imPlanes= st[13];
- bmp_header.bfImghead.imBitpixel= st[14];
- bmp_header.bfImghead.imCompess= st[15] | (st[16]<<16);
- bmp_header.bfImghead.imImgsize= st[17] | (st[18]<<16);
- bmp_header.bfImghead.imHres= st[19] | (st[20]<<16);
- bmp_header.bfImghead.imVres= st[21] | (st[22]<<16);
- bmp_header.bfImghead.imColnum= st[23] | (st[24]<<16);
- bmp_header.bfImghead.imImcolnum= st[25] | (st[26]<<16);
-
- if(bmp_header.bfType != 0x4D42) { //"BM"
- fclose(fp);
- return BMP_ERR_FORMATE;
- }
-
- if(bmp_header.bfImghead.imCompess != BI_RGB &&
- bmp_header.bfImghead.imCompess != BI_BITFIELDS) {
- fclose(fp);
- return BMP_ERR_NEED_GO_ON; //This funciton now not support...
- }
-
- bytepixel= bmp_header.bfImghead.imBitpixel >> 3;
- if(bytepixel < 2) { //byte per pixel >= 2
- fclose(fp);
- return BMP_ERR_NEED_GO_ON; //This funciton now not support...
- }
-
- *type = bytepixel;
-
- x= width;
- y= height;
- sx= bmp_header.bfImghead.imBitmapW;
- sy= bmp_header.bfImghead.imBitmapH;
- if(x > sx)
- x= sx;
- if(y > sy)
- y= sy;
-
- // Expect a certain amount of bytes and read them all at once.
- unsigned int BytesPerLine = (sx * bytepixel + 3) & ~3;
- char* FileBuffer = (char*) malloc(BytesPerLine * (sy - 1) + sx * bytepixel);
- if (FileBuffer == NULL) {
- fclose(fp);
- return BMP_ERR_NEED_GO_ON; // Memory allocation error
- }
-
- fseek(fp, (s32) bmp_header.bfImgoffst, SEEK_SET);
- m = fread(FileBuffer, 1, BytesPerLine * (sy - 1) + sx * bytepixel, fp);
-
- if (m < BytesPerLine * (sy - 1) + sx * bytepixel) {
- free(FileBuffer);
- fclose(fp);
- return BMP_ERR_FORMATE; // incomplete file
- }
-
- // Reorder all the bytes, because scanlines are from bottom to top.
- for (m = 0; m < y; m++) {
- memcpy(buf + m * x * bytepixel, FileBuffer + (sy - m - 1) * BytesPerLine, x * bytepixel);
- }
-
- free(FileBuffer);
- fclose(fp);
-
- return BMP_OK;
-}
-
-/*
-* open BMP file
-*/
-int openBMP(BMPINFO* bmpInfo, const char* file)
-{
- FILE* fp;
- unsigned short st[54/2];
- int len;
-
- bmpInfo->fp = NULL;
-
- fp = fopen(file, "r");
- if(NULL == fp)
- return BMP_ERR_OPENFAILURE;
-
- len = fread((void*)st, 1, sizeof(BMPHEADER), fp);
- if(len < sizeof(BMPHEADER)) {
- fclose(fp);
- return BMP_ERR_FORMATE;
- }
-
- bmpInfo->bmpHead.bfType= st[0];
- bmpInfo->bmpHead.bfSize= st[1] | (st[2]<<16);
- bmpInfo->bmpHead.bfReserved0= st[3];
- bmpInfo->bmpHead.bfReserved1= st[4];
- bmpInfo->bmpHead.bfImgoffst= st[5] | (st[6]<<16);
- bmpInfo->bmpHead.bfImghead.imHeadsize= st[7] | (st[8]<<16);
- bmpInfo->bmpHead.bfImghead.imBitmapW= st[9] | (st[10]<<16);
- bmpInfo->bmpHead.bfImghead.imBitmapH= st[11] | (st[12]<<16);
- bmpInfo->bmpHead.bfImghead.imPlanes= st[13];
- bmpInfo->bmpHead.bfImghead.imBitpixel= st[14];
- bmpInfo->bmpHead.bfImghead.imCompess= st[15] | (st[16]<<16);
- bmpInfo->bmpHead.bfImghead.imImgsize= st[17] | (st[18]<<16);
- bmpInfo->bmpHead.bfImghead.imHres= st[19] | (st[20]<<16);
- bmpInfo->bmpHead.bfImghead.imVres= st[21] | (st[22]<<16);
- bmpInfo->bmpHead.bfImghead.imColnum= st[23] | (st[24]<<16);
- bmpInfo->bmpHead.bfImghead.imImcolnum= st[25] | (st[26]<<16);
-
- if(bmpInfo->bmpHead.bfType != 0x4D42) //"BM"
- {
- fclose(fp);
- return BMP_ERR_FORMATE;
- }
-
- if(bmpInfo->bmpHead.bfImghead.imCompess != BI_RGB &&
- bmpInfo->bmpHead.bfImghead.imCompess != BI_BITFIELDS)
- {
- fclose(fp);
- return BMP_ERR_NEED_GO_ON; //This funciton now not support...
- }
-
- bmpInfo->fp = fp;
-
- return BMP_OK;
-}
-
-/*
-* read pixel form BMP file
-*/
-int readBMP(BMPINFO* bmpInfo, unsigned int start_x, unsigned int start_y,
- unsigned int width, unsigned int height, void* buffer)
-{
- unsigned int m, n;
- unsigned int bmp_w, bmp_h;
- int fpos;
- unsigned char* dst;
- unsigned int bytepixel;
-
- bytepixel = bmpInfo->bmpHead.bfImghead.imBitpixel >> 3;
- if(bytepixel < 2) //Not support <2 bytes per pixel now
- return -1;
-
- //BMP scan from down to up
- bmp_w = bmpInfo->bmpHead.bfImghead.imBitmapW;
- bmp_h = bmpInfo->bmpHead.bfImghead.imBitmapH;
- if(((start_x +1) > bmp_w) || ((start_y+1) > bmp_h)) return -1;
- n = bmp_w - start_x;
- if(n > width) n = width; //start_x + width < bmp_w
- m = bmp_h - start_y;
- if(m > height) m = height; //start_y + height < bmp_h
-
- fpos = (int)bmpInfo->bmpHead.bfImgoffst;
-
- fpos += (((bmp_w*bytepixel+3)>>2)<<2)*(bmp_h - start_y -1) + start_x*bytepixel;
- dst = (unsigned char*)buffer;
- n *= bytepixel;
- while(m--) {
- fseek(bmpInfo->fp, fpos, SEEK_SET);
- fread(dst, 1, n, bmpInfo->fp);
- fpos -= ((bmp_w*bytepixel+3)>>2)<<2;
- dst += width*bytepixel;
- }
-
- return 0;
-}
-
-/*
-* close BMP file
-*/
-void closeBMP(BMPINFO* bmpInfo)
-{
- if(NULL != bmpInfo->fp)
- fclose(bmpInfo->fp);
-}
-
-