cleaned all trailing white space from source files.
[sdk] / extras / tiles / sprite.ec
1 /****************************************************************************
2    ECERE Tile Engine
3
4    Copyright (c) 1997-2005 Jerome Jacovella-St-Louis
5    All Rights Reserved.
6
7    sprite.ec - Bitmap Sprite System
8 ****************************************************************************/
9 import "ecere"
10
11 struct SpriteFrame
12 {
13    byte xDis, yDis;
14    Bitmap bitmap;
15 };
16
17 class Sprite
18 {
19    byte numFrames;
20    uint16 maxWidth,maxHeight;
21    SpriteFrame *frames;
22
23    ~Sprite()
24    {
25       Free();
26    }
27
28    void Free()
29    {
30       int c;
31       if(frames)
32       {
33          for(c=0; c<numFrames; c++)
34             delete frames[c].bitmap;
35          delete frames;
36       }
37    }
38
39    bool Load(char *bmpname, char *sizefile, bool trans, bool usePaletteShades, ColorAlpha * palette, DisplaySystem displaySystem)
40    {
41       bool result = false;
42       File f = FileOpen(sizefile, read);
43       if(f)
44       {
45          Bitmap bmpFrames {};
46          if(bmpFrames.Load(bmpname, null, null))
47          {
48             f.Getc(&numFrames);
49             f.Read(&maxWidth,  sizeof(uint16),1);
50             f.Read(&maxHeight, sizeof(uint16),1);
51             frames = new0 SpriteFrame[numFrames];
52             if(frames)
53             {
54                uint startY=0;
55                int c;
56                result = true;
57                for(c=0; c<numFrames; c++)
58                {
59                   byte width,height;
60                   f.Getc(&width);
61                   f.Getc(&height);
62                   f.Getc(&frames[c].xDis);
63                   f.Getc(&frames[c].yDis);
64
65                   frames[c].bitmap = Bitmap {};
66                   if(frames[c].bitmap.Allocate(null, width,height,0,bmpFrames.pixelFormat, false))
67                   {
68                      frames[c].bitmap.transparent = trans;
69                      frames[c].bitmap.Grab(bmpFrames,0,startY);
70
71                      frames[c].bitmap.palette = palette;
72                      if(!usePaletteShades)
73                      {
74                         if(displaySystem)
75                            frames[c].bitmap.MakeDD(displaySystem);
76                         if(!frames[c].bitmap)
77                            Logf("Couldn't adapt bitmap %s.\n", bmpname);
78                      }
79                      startY+=height;
80                   }
81                   else
82                   {
83                      delete frames[c].bitmap;
84                      result = false;
85                      Logf("Couldn't allocate bitmap loading sprite %s.\n", bmpname);
86                      break;
87                   }
88                }
89             }
90             else
91                Logf("Couldn't allocate frames for sprite %s.\n", bmpname);
92          }
93          else
94             Logf("Couldn't load sprite bitmap %s.\n", bmpname);
95
96          delete bmpFrames;
97          delete f;
98          if(!result)
99             Free();
100       }
101       else
102          Logf("Couldn't load sprite info %s.\n", sizefile);
103       return result;
104    }
105
106    void DisplayFrame(Surface surface, int frameNum, int x, int y, bool flip, byte * inPal)
107    {
108       SpriteFrame * frame;
109       int dx,dy;
110       int lx = 0,ly = 0;
111       int rx, ry;
112
113       if(!frames) return;
114
115       frame = &frames[frameNum];
116       if(!frame) return;
117       rx=frame->bitmap.width;
118       ry=frame->bitmap.height;
119       if(flip)
120       {
121          dx = x-(frame->xDis+frame->bitmap.width)+maxWidth;
122          dy = y+frame->yDis;
123       }
124       else
125       {
126          dx = x+frame->xDis;
127          dy = y+frame->yDis;
128       }
129
130       if(inPal)
131          frame->bitmap.paletteShades = inPal;
132
133       surface.Blit(frame->bitmap, dx,dy, lx,ly, flip?(-rx):(rx), ry);
134    }
135 };