-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrafik.c
222 lines (189 loc) · 5.56 KB
/
grafik.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
/*************************************************
* Eklenecegi dosyaya kendisinden once *
* <dos.h> , <alloc.h> ve <stdio.h> eklenmelidir. *
*************************************************/
#define SAYDAM 248 /* ekrana basilmayacak olan renk */
unsigned char *VGA = (unsigned char *) 0xA0000000L; /* VGA grafik belleginin baslangic adresi */
unsigned char *SNL = NULL; /* animasyonlar icin kullanilacak yedek ekrani gosterir */
unsigned char *RGB = NULL; /* renk paletini tutar */
unsigned int ex1, ey1, ex2, ey2; /* gorunen alanin sinir koordinatlari */
void gorunen_alan(int x, int y, int en, int boy)
{
ex1 = x, ex2 = ex1 + en;
ey1 = y, ey2 = ey1 + boy;
}
void SNL_ve_RGB_bellekte(void)
{
SNL = (unsigned char *) calloc(64000, 1);
RGB = (unsigned char *) calloc(768, 1);
}
void PCXden_byte_oku(unsigned char *byte, unsigned int *tekrar, FILE *dosya)
{/* PCX formatindan 1 byte okur ve siradaki rengin tekrar sayisini belirler */
unsigned char i;
*tekrar = 1;
i = getc(dosya);
if((i & 0xC0) == 0xC0) /* ilk 2 bit 1 ise sonraki 6 tanesi tekrar sayisini verir */
{
*tekrar = (i & 0x3F);
i = getc(dosya);
}
*byte = i;
}
/*
char PCXi_bellege_oku(char *adres, unsigned char *palet, unsigned char *hedef)
{ /* PCX formatindaki resim dosyasini hedef alana okur */
FILE *dosya;
unsigned char byte;
unsigned int Alan, tekrar, i = 0;
int Xmin, Ymin, Xmax, Ymax, En, Boy, j = 0;
dosya = fopen(adres, "rb");
if(dosya == NULL) return 0;
/* ilk 128 byte baslik kismidir */
fseek(dosya, 4, SEEK_SET); /* 4.den sonraki ilk 4 word (2byte) cerceve korrdinatlarini verir */
Xmin = getw(dosya);
Ymin = getw(dosya);
Xmax = getw(dosya);
Ymax = getw(dosya);
En = Xmax - Xmin + 1;
Boy = Ymax - Ymin + 1;
Alan = (unsigned int) En * Boy; /* resmin toplam pixel sayisi */
/* en dipteki 768 byte renk paletini saklar */
fseek(dosya, -768, SEEK_END);
/* VGA paleti 0-255 degil 0-63 arasi degerlere gereksinim duydugundan */
/* okunan degerler 4e bolunur */
while (!feof(dosya))
{
palet[j++] = getc(dosya)/4;
palet[j++] = getc(dosya)/4;
palet[j++] = getc(dosya)/4;
}
fseek(dosya, 128, SEEK_SET); /* artik resmimizi hedef ekrana acabiliriz */
while(i < Alan)
{
PCXden_byte_oku(&byte, &tekrar, dosya);
while(tekrar)
{
hedef[i] = byte;
tekrar--;
i++;
}
}
fclose(dosya);
return 1;
}
*/
char XCPyi_bellege_oku(char *adres, unsigned char *palet, unsigned char *hedef)
{ /* XCP formatindaki resim dosyasini hedef alana okur */
/* XCP, PCX formatinin baslik ve palet kisimlarinin yer degistirmis seklidir */
FILE *dosya;
unsigned char byte;
unsigned int Alan, tekrar, i = 0;
int Xmin, Ymin, Xmax, Ymax, En, Boy, j = 0;
dosya = fopen(adres, "rb");
if(dosya == NULL) return 0;
/* son 128 byte baslik kismidir */
fseek(dosya, -128+4, SEEK_END); /* 4.den sonraki ilk 4 word (2byte) cerceve korrdinatlarini verir */
Xmin = getw(dosya);
Ymin = getw(dosya);
Xmax = getw(dosya);
Ymax = getw(dosya);
En = Xmax - Xmin + 1;
Boy = Ymax - Ymin + 1;
Alan = (unsigned int) En * Boy; /* resmin toplam pixel sayisi */
/* en bastaki 768 byte renk paletini saklar */
fseek(dosya, 0, SEEK_SET);
/* VGA paleti 0-255 degil 0-63 arasi degerlere gereksinim duydugundan */
/* okunan degerler 4e bolunur */
while (j < 768)
{
palet[j++] = getc(dosya)/4;
palet[j++] = getc(dosya)/4;
palet[j++] = getc(dosya)/4;
}
fseek(dosya, 768, SEEK_SET); /* artik resmimizi hedef ekrana acabiliriz */
while(i < Alan)
{
PCXden_byte_oku(&byte, &tekrar, dosya);
while(tekrar)
{
hedef[i] = byte;
tekrar--;
i++;
}
}
fclose(dosya);
return 1;
}
void kare_oku(int x1, int y1, int x2, int y2, unsigned char *kaynak, unsigned char *hedef)
{ /* kaynak alandan hedefe bir resim karesi okur. ilk 2 bayta en ve boy degerini yazar */
int i, j, h = 2;
hedef[0] = x2 - x1 + 1;
hedef[1] = y2 - y1 + 1;
for(j = y1; j <= y2; j++)
for(i = x1; i <= x2; i++)
hedef[h++] = kaynak[i + j * 320];
}
void ekran_modu(unsigned char mod)
{ /* ekran modunu mod degerine getirir */
union REGS regs;
regs.h.ah = 0x0;
regs.h.al = mod;
int86(0x10, ®s, ®s);
}
void renk(unsigned char no, unsigned char R, unsigned char G, unsigned char B)
{ /* no ile verilen numarali rengin kirmizi yesil mavi yogunlugunu ayarlar */
outp(0x03C8,no);
outp(0x03C9,R);
outp(0x03C9,G);
outp(0x03C9,B);
}
void renk_paletini_kur(unsigned char *kaynak)
{ /* renk paletini kaynakta verilen degerlere ayarlar */
int i = 0;
unsigned char R, G, B, no;
for(no = 0; no < 255; no++)
{
R = kaynak[i++];
G = kaynak[i++];
B = kaynak[i++];
renk(no, R, G, B);
}
}
void kare_koy(int nx1, int ny1, unsigned char *kaynak, unsigned char *hedef)
{ /* kaynak resim karesinin verilen koordinatlarda */
/* gorunen alan icinde kalan kismini hedef alana kopyalar */
int nx2, ny2;
int x1, x2, y1, y2;
int ix, sx, iy, sy;
int x, y, k = 2;
nx2 = nx1 + kaynak[0] - 1;
ny2 = ny1 + kaynak[1] - 1;
x1 = max(ex1, nx1);
x2 = min(ex2, nx2);
y1 = max(ey1, ny1);
y2 = min(ey2, ny2);
ix = x1 - nx1;
sx = ix + (x2 - x1);
iy = y1 - ny1;
sy = iy + (y2 - y1);
for(y = iy; y <= sy; y++)
for(x = ix; x <= sx; x++)
{
k = 2 + (x + y * kaynak[0]);
if(kaynak[k] != SAYDAM) hedef[(nx1 - ex1 + x) + (ny1 - ey1 + y) * 320] = kaynak[k];
}
}
void hzl_kare_koy(int x, int y, unsigned char *kaynak, unsigned char *hedef)
{ /* kaynakta verilen resim karesini hedef alanin istenen koordinatina kopyalar */
int a, b, k = 2;
int c = kaynak[0] - 1;
int d = kaynak[1] - 1;
for(b = 0; b <= d; b++)
for(a = 0; a <= c; a++)
{ if(kaynak[k] != SAYDAM) hedef[(x + a) + (y + b) * 320] = kaynak[k]; k++; }
}
void SNL_ve_RGB_serbest(void)
{
free(SNL);
free(RGB);
}