Rev 5276 | Rev 5296 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5281 | ZblCoder | 1 | #include "smalllibc/kosSyst.h" |
5276 | ZblCoder | 2 | #include "render.h" |
5281 | ZblCoder | 3 | #include "smalllibc/func.h" |
5276 | ZblCoder | 4 | #include "image.h" |
5 | //#include "mymath.h" |
||
6 | |||
7 | CKosImage::CKosImage(CKosRender *render, RGBA *buffer, int width, int height) |
||
8 | { |
||
9 | this->isColor = false; |
||
10 | this->width = width; |
||
11 | this->height = height; |
||
12 | this->buffer = buffer; |
||
13 | this->render = render; |
||
14 | this->mode = DRAW_ALPHA; |
||
15 | this->frame = 0; |
||
16 | this->frameWidth = 0; |
||
17 | this->frameHeight = 0; |
||
18 | } |
||
19 | |||
20 | CKosImage::~CKosImage(void) |
||
21 | { |
||
22 | |||
23 | } |
||
24 | |||
25 | void CKosImage::SetMode(int mode) |
||
26 | { |
||
27 | this->mode = mode; |
||
28 | } |
||
29 | |||
30 | void CKosImage::SetFrameSize(int width, int height) |
||
31 | { |
||
32 | this->frameWidth = width; |
||
33 | this->frameHeight = height; |
||
34 | } |
||
35 | |||
36 | void CKosImage::Draw(Point position, float angle, RGB color) |
||
37 | { |
||
38 | this->isColor = true; |
||
39 | this->color = color; |
||
40 | this->Draw(position, angle); |
||
41 | this->isColor = false; |
||
42 | } |
||
43 | |||
44 | int CKosImage::getPixel(int x, int y) |
||
45 | { |
||
46 | return y * this->width + x; |
||
47 | } |
||
48 | |||
49 | void CKosImage::Draw(Point position, float angle, int frame) |
||
50 | { |
||
51 | this->frame = frame; |
||
52 | Draw(position, angle); |
||
53 | } |
||
54 | |||
55 | void CKosImage::Draw(Point position, float angle) |
||
56 | { |
||
57 | float alpha; |
||
58 | Point p, p1; |
||
59 | RGB pixel, newPixel; |
||
60 | RGBA addPixel; |
||
61 | int PixelID; |
||
62 | Point fix; |
||
63 | if (angle == 270) |
||
64 | fix = Point(0, -1); |
||
65 | else |
||
66 | if (angle == 180) |
||
67 | fix = Point(-1, -1); |
||
68 | else |
||
69 | if (angle == 90) |
||
70 | fix = Point(-1, 0); |
||
71 | else |
||
72 | fix = Point(0, 0); |
||
73 | |||
74 | Point center = Point(this->width / 2, this->height / 2); |
||
75 | double a = -angle * (3.14 / 180); |
||
76 | |||
77 | double SinRad = sin(a); |
||
78 | double CosRad = cos(a); |
||
79 | |||
80 | for (int y = 0; y < 24; ++y) |
||
81 | for (int x = 0; x < 24; ++x) |
||
82 | { |
||
83 | p1 = Point(x, y) - center; |
||
84 | |||
85 | p.X = roundInt(p1.X * CosRad - p1.Y * SinRad) + center.X; |
||
86 | p.Y = roundInt(p1.X * SinRad + p1.Y * CosRad) + center.Y; |
||
87 | |||
88 | if (p.X >= 0 && p.X < this->width && p.Y >= 0 && p.Y < this->height) |
||
89 | { |
||
90 | p.Y += this->frame * this->frameHeight; |
||
91 | addPixel = this->buffer[this->getPixel(p.X, p.Y)]; |
||
92 | PixelID = this->render->getPixel(x + fix.X, y + fix.Y); |
||
93 | pixel = this->render->buffer[PixelID]; |
||
94 | |||
95 | if (addPixel.a > 0) |
||
96 | { |
||
97 | if (this->isColor) |
||
98 | { |
||
99 | addPixel.r = this->color.r; |
||
100 | addPixel.g = this->color.g; |
||
101 | addPixel.b = this->color.b; |
||
102 | } |
||
103 | |||
104 | alpha = (float)addPixel.a / 255.0f; |
||
105 | |||
106 | if (this->mode = DRAW_ALPHA) |
||
107 | { |
||
108 | newPixel.r = di((double)(pixel.r * (1 - alpha) + addPixel.r * alpha)); |
||
109 | newPixel.g = di((double)(pixel.g * (1 - alpha) + addPixel.g * alpha)); |
||
110 | newPixel.b = di((double)(pixel.b * (1 - alpha) + addPixel.b * alpha)); |
||
111 | } |
||
112 | else |
||
113 | if (this->mode = DRAW_ALPHA_ADD) |
||
114 | { |
||
115 | newPixel.r = di(min(255, (double)(pixel.r * (1 - alpha) + addPixel.r * alpha))); |
||
116 | newPixel.g = di(min(255, (double)(pixel.g * (1 - alpha) + addPixel.g * alpha))); |
||
117 | newPixel.b = di(min(255, (double)(pixel.b * (1 - alpha) + addPixel.b * alpha))); |
||
118 | } |
||
119 | else |
||
120 | { |
||
121 | newPixel.r = addPixel.r; |
||
122 | newPixel.g = addPixel.g; |
||
123 | newPixel.b = addPixel.b; |
||
124 | } |
||
125 | |||
126 | this->render->buffer[PixelID] = newPixel; |
||
127 | } |
||
128 | } |
||
129 | } |
||
130 | }>>>> |