3 static int current_pal[256];
4 static SDL_Surface *jnb_surface;
5 static int fullscreen = 0;
6 static int vinited = 0;
7 static pixel_t screen_buffer[2][JNB_SURFACE_WIDTH*JNB_SURFACE_HEIGHT];
8 static int drawing_enable = 0;
9 static pixel_t *background = NULL;
10 static int background_drawn;
11 static pixel_t *mask = NULL;
13 pixel_t *get_vgaptr(int page, int x, int y)
15 assert(drawing_enable==1);
17 return &screen_buffer[page][y*JNB_SURFACE_WIDTH+x];
21 void open_screen(void)
25 lval = SDL_Init(SDL_INIT_EVERYTHING | SDL_INIT_AUDIO);
27 fprintf(stderr, "SDL ERROR: %s\n", SDL_GetError());
32 jnb_surface = SDL_SetVideoMode(JNB_SURFACE_WIDTH, JNB_SURFACE_HEIGHT, JNB_BPP, SDL_SWSURFACE | SDL_FULLSCREEN);
34 jnb_surface = SDL_SetVideoMode(JNB_SURFACE_WIDTH, JNB_SURFACE_HEIGHT, JNB_BPP, SDL_SWSURFACE);
37 fprintf(stderr, "SDL ERROR: %s\n", SDL_GetError());
45 memset(current_pal, 0, sizeof(current_pal));
57 if (SDL_WM_ToggleFullScreen(jnb_surface))
62 void wait_vrt(int mix)
68 void clear_page(int page, int color)
71 pixel_t *buf = get_vgaptr(page, 0, 0);
73 assert(drawing_enable==1);
75 for (i=0; i<JNB_SURFACE_HEIGHT; i++)
76 for (j=0; j<JNB_SURFACE_WIDTH; j++)
81 void clear_lines(int page, int y, int count, pixel_t color)
85 assert(drawing_enable==1);
91 for (i=0; i<count; i++)
92 if ((i+y)<JNB_SURFACE_HEIGHT) {
93 pixel_t *buf = get_vgaptr(page, 0, i+y);
94 for (j=0; j<JNB_SURFACE_WIDTH; j++)
100 pixel_t get_color(int color, char pal[768])
104 return SDL_MapRGB(jnb_surface->format, (Uint8)(pal[color*3+0]<<2), (Uint8)(pal[color*3+1]<<2), (Uint8)(pal[color*3+2]<<2));
108 pixel_t get_pixel(int page, int x, int y)
110 assert(drawing_enable==1);
115 assert(x<JNB_SURFACE_WIDTH);
116 assert(y<JNB_SURFACE_HEIGHT);
118 return *get_vgaptr(page, x, y);
122 void set_pixel(int page, int x, int y, pixel_t color)
124 assert(drawing_enable==1);
129 assert(x<JNB_SURFACE_WIDTH);
130 assert(y<JNB_SURFACE_HEIGHT);
132 *get_vgaptr(page, x, y) = color;
136 static unsigned int colorMask = 0xF7DEF7DE;
137 static unsigned int lowPixelMask = 0x08210821;
138 static unsigned int qcolorMask = 0xE79CE79C;
139 static unsigned int qlowpixelMask = 0x18631863;
140 static unsigned int redblueMask = 0xF81F;
141 static unsigned int greenMask = 0x7E0;
143 int Init_2xSaI (unsigned int BitFormat)
145 if (BitFormat == 565)
147 colorMask = 0xF7DEF7DE;
148 lowPixelMask = 0x08210821;
149 qcolorMask = 0xE79CE79C;
150 qlowpixelMask = 0x18631863;
151 redblueMask = 0xF81F;
154 else if (BitFormat == 555)
156 colorMask = 0x7BDE7BDE;
157 lowPixelMask = 0x04210421;
158 qcolorMask = 0x739C739C;
159 qlowpixelMask = 0x0C630C63;
160 redblueMask = 0x7C1F;
169 Init_2xSaIMMX (BitFormat);
176 void Super2xSaI (unsigned char *src, unsigned int src_pitch, int src_bytes_per_pixel,
177 unsigned char *dst, unsigned int dst_pitch, int dst_bytes_per_pixel,
178 int width, int height, int pal[256])
180 #define GET_RESULT(A, B, C, D) ((A != C || A != D) - (B != C || B != D))
182 #define INTERPOLATE(A, B) (((A & colorMask) >> 1) + ((B & colorMask) >> 1) + (A & B & lowPixelMask))
184 #define Q_INTERPOLATE(A, B, C, D) ((A & qcolorMask) >> 2) + ((B & qcolorMask) >> 2) + ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2) \
185 + ((((A & qlowpixelMask) + (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask)) >> 2) & qlowpixelMask)
187 #define GET_COLOR(x) (pal[(x)])
189 unsigned char *src_line[4];
190 unsigned char *dst_line[2];
192 unsigned long color[16];
194 /* Point to the first 3 lines. */
197 src_line[2] = src + src_pitch;
198 src_line[3] = src + (src_pitch * 2);
201 dst_line[1] = dst + dst_pitch;
205 if (src_bytes_per_pixel == 1) {
208 color[0] = GET_COLOR(*sbp); color[1] = color[0]; color[2] = color[0]; color[3] = color[0];
209 color[4] = color[0]; color[5] = color[0]; color[6] = GET_COLOR(*(sbp + 1)); color[7] = GET_COLOR(*(sbp + 2));
211 color[8] = GET_COLOR(*sbp); color[9] = color[8]; color[10] = GET_COLOR(*(sbp + 1)); color[11] = GET_COLOR(*(sbp + 2));
213 color[12] = GET_COLOR(*sbp); color[13] = color[12]; color[14] = GET_COLOR(*(sbp + 1)); color[15] = GET_COLOR(*(sbp + 2));
214 } else if (src_bytes_per_pixel == 2) {
216 sbp = (unsigned short*)src_line[0];
217 color[0] = *sbp; color[1] = color[0]; color[2] = color[0]; color[3] = color[0];
218 color[4] = color[0]; color[5] = color[0]; color[6] = *(sbp + 1); color[7] = *(sbp + 2);
219 sbp = (unsigned short*)src_line[2];
220 color[8] = *sbp; color[9] = color[8]; color[10] = *(sbp + 1); color[11] = *(sbp + 2);
221 sbp = (unsigned short*)src_line[3];
222 color[12] = *sbp; color[13] = color[12]; color[14] = *(sbp + 1); color[15] = *(sbp + 2);
225 lbp = (unsigned long*)src_line[0];
226 color[0] = *lbp; color[1] = color[0]; color[2] = color[0]; color[3] = color[0];
227 color[4] = color[0]; color[5] = color[0]; color[6] = *(lbp + 1); color[7] = *(lbp + 2);
228 lbp = (unsigned long*)src_line[2];
229 color[8] = *lbp; color[9] = color[8]; color[10] = *(lbp + 1); color[11] = *(lbp + 2);
230 lbp = (unsigned long*)src_line[3];
231 color[12] = *lbp; color[13] = color[12]; color[14] = *(lbp + 1); color[15] = *(lbp + 2);
234 for (y = 0; y < height; y++) {
236 /* Todo: x = width - 2, x = width - 1 */
238 for (x = 0; x < width; x++) {
239 unsigned long product1a, product1b, product2a, product2b;
241 //--------------------------------------- B0 B1 B2 B3 0 1 2 3
242 // 4 5* 6 S2 -> 4 5* 6 7
243 // 1 2 3 S1 8 9 10 11
244 // A0 A1 A2 A3 12 13 14 15
245 //--------------------------------------
246 if (color[9] == color[6] && color[5] != color[10]) {
247 product2b = color[9];
248 product1b = product2b;
250 else if (color[5] == color[10] && color[9] != color[6]) {
251 product2b = color[5];
252 product1b = product2b;
254 else if (color[5] == color[10] && color[9] == color[6]) {
257 r += GET_RESULT(color[6], color[5], color[8], color[13]);
258 r += GET_RESULT(color[6], color[5], color[4], color[1]);
259 r += GET_RESULT(color[6], color[5], color[14], color[11]);
260 r += GET_RESULT(color[6], color[5], color[2], color[7]);
263 product1b = color[6];
265 product1b = color[5];
267 product1b = INTERPOLATE(color[5], color[6]);
269 product2b = product1b;
273 if (color[6] == color[10] && color[10] == color[13] && color[9] != color[14] && color[10] != color[12])
274 product2b = Q_INTERPOLATE(color[10], color[10], color[10], color[9]);
275 else if (color[5] == color[9] && color[9] == color[14] && color[13] != color[10] && color[9] != color[15])
276 product2b = Q_INTERPOLATE(color[9], color[9], color[9], color[10]);
278 product2b = INTERPOLATE(color[9], color[10]);
280 if (color[6] == color[10] && color[6] == color[1] && color[5] != color[2] && color[6] != color[0])
281 product1b = Q_INTERPOLATE(color[6], color[6], color[6], color[5]);
282 else if (color[5] == color[9] && color[5] == color[2] && color[1] != color[6] && color[5] != color[3])
283 product1b = Q_INTERPOLATE(color[6], color[5], color[5], color[5]);
285 product1b = INTERPOLATE(color[5], color[6]);
288 if (color[5] == color[10] && color[9] != color[6] && color[4] == color[5] && color[5] != color[14])
289 product2a = INTERPOLATE(color[9], color[5]);
290 else if (color[5] == color[8] && color[6] == color[5] && color[4] != color[9] && color[5] != color[12])
291 product2a = INTERPOLATE(color[9], color[5]);
293 product2a = color[9];
295 if (color[9] == color[6] && color[5] != color[10] && color[8] == color[9] && color[9] != color[2])
296 product1a = INTERPOLATE(color[9], color[5]);
297 else if (color[4] == color[9] && color[10] == color[9] && color[8] != color[5] && color[9] != color[0])
298 product1a = INTERPOLATE(color[9], color[5]);
300 product1a = color[5];
302 if (dst_bytes_per_pixel == 2) {
303 *((unsigned long *) (&dst_line[0][x * 4])) = product1a | (product1b << 16);
304 *((unsigned long *) (&dst_line[1][x * 4])) = product2a | (product2b << 16);
306 *((unsigned long *) (&dst_line[0][x * 8])) = product1a;
307 *((unsigned long *) (&dst_line[0][x * 8 + 4])) = product1b;
308 *((unsigned long *) (&dst_line[1][x * 8])) = product2a;
309 *((unsigned long *) (&dst_line[1][x * 8 + 4])) = product2b;
312 /* Move color matrix forward */
313 color[0] = color[1]; color[4] = color[5]; color[8] = color[9]; color[12] = color[13];
314 color[1] = color[2]; color[5] = color[6]; color[9] = color[10]; color[13] = color[14];
315 color[2] = color[3]; color[6] = color[7]; color[10] = color[11]; color[14] = color[15];
319 if (src_bytes_per_pixel == 1) {
320 color[3] = GET_COLOR(*(((unsigned char*)src_line[0]) + x));
321 color[7] = GET_COLOR(*(((unsigned char*)src_line[1]) + x));
322 color[11] = GET_COLOR(*(((unsigned char*)src_line[2]) + x));
323 color[15] = GET_COLOR(*(((unsigned char*)src_line[3]) + x));
324 } else if (src_bytes_per_pixel == 2) {
325 color[3] = *(((unsigned short*)src_line[0]) + x);
326 color[7] = *(((unsigned short*)src_line[1]) + x);
327 color[11] = *(((unsigned short*)src_line[2]) + x);
328 color[15] = *(((unsigned short*)src_line[3]) + x);
330 color[3] = *(((unsigned long*)src_line[0]) + x);
331 color[7] = *(((unsigned long*)src_line[1]) + x);
332 color[11] = *(((unsigned long*)src_line[2]) + x);
333 color[15] = *(((unsigned long*)src_line[3]) + x);
339 /* We're done with one line, so we shift the source lines up */
340 src_line[0] = src_line[1];
341 src_line[1] = src_line[2];
342 src_line[2] = src_line[3];
346 src_line[3] = src_line[2];
348 src_line[3] = src_line[2] + src_pitch;
350 /* Then shift the color matrix up */
351 if (src_bytes_per_pixel == 1) {
354 color[0] = GET_COLOR(*sbp); color[1] = color[0]; color[2] = GET_COLOR(*(sbp + 1)); color[3] = GET_COLOR(*(sbp + 2));
356 color[4] = GET_COLOR(*sbp); color[5] = color[4]; color[6] = GET_COLOR(*(sbp + 1)); color[7] = GET_COLOR(*(sbp + 2));
358 color[8] = GET_COLOR(*sbp); color[9] = color[8]; color[10] = GET_COLOR(*(sbp + 1)); color[11] = GET_COLOR(*(sbp + 2));
360 color[12] = GET_COLOR(*sbp); color[13] = color[12]; color[14] = GET_COLOR(*(sbp + 1)); color[15] = GET_COLOR(*(sbp + 2));
361 } else if (src_bytes_per_pixel == 2) {
363 sbp = (unsigned short*)src_line[0];
364 color[0] = *sbp; color[1] = color[0]; color[2] = *(sbp + 1); color[3] = *(sbp + 2);
365 sbp = (unsigned short*)src_line[1];
366 color[4] = *sbp; color[5] = color[4]; color[6] = *(sbp + 1); color[7] = *(sbp + 2);
367 sbp = (unsigned short*)src_line[2];
368 color[8] = *sbp; color[9] = color[9]; color[10] = *(sbp + 1); color[11] = *(sbp + 2);
369 sbp = (unsigned short*)src_line[3];
370 color[12] = *sbp; color[13] = color[12]; color[14] = *(sbp + 1); color[15] = *(sbp + 2);
373 lbp = (unsigned long*)src_line[0];
374 color[0] = *lbp; color[1] = color[0]; color[2] = *(lbp + 1); color[3] = *(lbp + 2);
375 lbp = (unsigned long*)src_line[1];
376 color[4] = *lbp; color[5] = color[4]; color[6] = *(lbp + 1); color[7] = *(lbp + 2);
377 lbp = (unsigned long*)src_line[2];
378 color[8] = *lbp; color[9] = color[9]; color[10] = *(lbp + 1); color[11] = *(lbp + 2);
379 lbp = (unsigned long*)src_line[3];
380 color[12] = *lbp; color[13] = color[12]; color[14] = *(lbp + 1); color[15] = *(lbp + 2);
383 if (y < height - 1) {
384 dst_line[0] += dst_pitch * 2;
385 dst_line[1] += dst_pitch * 2;
391 void Scale2x (unsigned char *src, unsigned int src_pitch, int src_bytes_per_pixel,
392 unsigned char *dst, unsigned int dst_pitch, int dst_bytes_per_pixel,
393 int width, int height, int pal[256])
395 #define GET_COLOR(x) (pal[(x)])
398 unsigned char *src_line;
399 unsigned char *dst_line[2];
403 dst_line[1] = dst + dst_pitch;
404 for (y=0; y<height; y++) {
405 for (x=0; x<width; x++) {
408 if (src_bytes_per_pixel == 1) {
409 color = GET_COLOR(*(((unsigned char*)src_line) + x));
410 } else if (src_bytes_per_pixel == 2) {
411 color = *(((unsigned short*)src_line) + x);
413 color = *(((unsigned int*)src_line) + x);
416 if (dst_bytes_per_pixel == 2) {
417 *((unsigned long *) (&dst_line[0][x * 4])) = color | (color << 16);
418 *((unsigned long *) (&dst_line[1][x * 4])) = color | (color << 16);
420 *((unsigned long *) (&dst_line[0][x * 8])) = color;
421 *((unsigned long *) (&dst_line[0][x * 8 + 4])) = color;
422 *((unsigned long *) (&dst_line[1][x * 8])) = color;
423 *((unsigned long *) (&dst_line[1][x * 8 + 4])) = color;
427 src_line += src_pitch;
429 if (y < height - 1) {
430 dst_line[0] += dst_pitch * 2;
431 dst_line[1] += dst_pitch * 2;
436 void flippage(int page)
443 assert(drawing_enable==0);
445 SDL_LockSurface(jnb_surface);
446 dest=(unsigned char *)jnb_surface->pixels;
447 src=screen_buffer[page];
449 Super2xSaI(src, JNB_WIDTH, 1, dest, jnb_surface->pitch, 2, JNB_WIDTH, JNB_HEIGHT, current_pal);
451 w=(jnb_surface->clip_rect.w>JNB_SURFACE_WIDTH)?(JNB_SURFACE_WIDTH):(jnb_surface->clip_rect.w);
452 h=(jnb_surface->clip_rect.h>JNB_SURFACE_HEIGHT)?(JNB_SURFACE_HEIGHT):(jnb_surface->clip_rect.h);
454 memcpy(dest,src,w*JNB_BYTESPP);
455 dest+=jnb_surface->pitch;
456 src+=JNB_SURFACE_WIDTH;
459 SDL_UnlockSurface(jnb_surface);
460 SDL_Flip(jnb_surface);
464 void draw_begin(void)
466 assert(drawing_enable==0);
469 if (background_drawn == 0) {
471 put_block(0, 0, 0, JNB_WIDTH, JNB_HEIGHT, background);
472 put_block(1, 0, 0, JNB_WIDTH, JNB_HEIGHT, background);
473 //put_block(0, 0, 0, rabbit_gobs.width[1], rabbit_gobs.height[1], rabbit_gobs.data[1]);
474 //put_block(1, 0, 0, rabbit_gobs.width[1], rabbit_gobs.height[1], rabbit_gobs.data[1]);
479 background_drawn = 1;
486 assert(drawing_enable==1);
492 void setpalette(int index, int count, char *palette)
494 SDL_Color colors[256];
497 assert(drawing_enable==0);
499 for (i = 0; i < count; i++) {
500 colors[i+index].r = palette[i * 3 + 0] << 2;
501 colors[i+index].g = palette[i * 3 + 1] << 2;
502 colors[i+index].b = palette[i * 3 + 2] << 2;
503 current_pal[i+index] = SDL_MapRGB(jnb_surface->format, colors[i+index].r, colors[i+index].g, colors[i+index].b);
506 SDL_SetColors(jnb_surface, &colors[index], index, count);
511 void fillpalette(int red, int green, int blue)
513 SDL_Color colors[256];
516 assert(drawing_enable==0);
518 for (i = 0; i < 256; i++) {
519 colors[i].r = red << 2;
520 colors[i].g = green << 2;
521 colors[i].b = blue << 2;
522 current_pal[i] = SDL_MapRGB(jnb_surface->format, colors[i].r, colors[i].g, colors[i].b);
525 SDL_SetColors(jnb_surface, colors, 0, 256);
530 void get_block(int page, int x, int y, int width, int height, pixel_t *buffer)
533 pixel_t *buffer_ptr, *vga_ptr;
535 assert(drawing_enable==1);
548 if (y + height >= JNB_SURFACE_HEIGHT)
549 height = JNB_SURFACE_HEIGHT - y;
550 if (x + width >= JNB_SURFACE_WIDTH)
551 width = JNB_SURFACE_WIDTH - x;
557 vga_ptr = get_vgaptr(page, x, y);
559 for (h = 0; h < height; h++) {
560 memcpy(buffer_ptr, vga_ptr, width * JNB_BYTESPP);
561 vga_ptr += JNB_SURFACE_WIDTH;
568 void put_block(int page, int x, int y, int width, int height, pixel_t *buffer)
571 pixel_t *vga_ptr, *buffer_ptr;
573 assert(drawing_enable==1);
586 if (y + height >= JNB_SURFACE_HEIGHT)
587 height = JNB_SURFACE_HEIGHT - y;
588 if (x + width >= JNB_SURFACE_WIDTH)
589 width = JNB_SURFACE_WIDTH - x;
595 vga_ptr = get_vgaptr(page, x, y);
597 for (h = 0; h < height; h++) {
598 memcpy(vga_ptr, buffer_ptr, width * JNB_BYTESPP);
599 vga_ptr += JNB_SURFACE_WIDTH;
605 void put_text(int page, int x, int y, char *text, int align)
613 assert(drawing_enable==1);
615 if (text == NULL || strlen(text) == 0)
617 if (font_gobs.num_images == 0)
622 while (text[c1] != 0) {
629 if (t1 >= 33 && t1 <= 34)
632 else if (t1 >= 39 && t1 <= 41)
635 else if (t1 >= 44 && t1 <= 59)
638 else if (t1 >= 64 && t1 <= 90)
641 else if (t1 >= 97 && t1 <= 122)
667 width += pob_width(image, &font_gobs) + 1;
678 cur_x = x - width / 2;
681 cur_x = 0; /* this should cause error? -Chuck */
686 while (text[c1] != 0) {
693 if (t1 >= 33 && t1 <= 34)
696 else if (t1 >= 39 && t1 <= 41)
699 else if (t1 >= 44 && t1 <= 59)
702 else if (t1 >= 64 && t1 <= 90)
705 else if (t1 >= 97 && t1 <= 122)
731 put_pob(page, cur_x, y, image, &font_gobs, 1, mask_pic);
732 cur_x += pob_width(image, &font_gobs) + 1;
737 void put_pob(int page, int x, int y, int image, gob_t *gob, int use_mask, unsigned char *mask_pic)
745 int draw_width, draw_height;
748 assert(drawing_enable==1);
751 assert(image<gob->num_images);
759 width = draw_width = gob->width[image]*2;
760 height = draw_height = gob->height[image]*2;
761 x -= gob->hs_x[image]*2;
762 y -= gob->hs_y[image]*2;
764 width = draw_width = gob->width[image];
765 height = draw_height = gob->height[image];
766 x -= gob->hs_x[image];
767 y -= gob->hs_y[image];
769 if ((x + width) <= 0 || x >= JNB_SURFACE_WIDTH)
771 if ((y + height) <= 0 || y >= JNB_SURFACE_HEIGHT)
779 if ((x + width) > JNB_SURFACE_WIDTH)
780 draw_width -= x + width - JNB_SURFACE_WIDTH;
782 pob_offset -= y * width;
786 if ((y + height) > JNB_SURFACE_HEIGHT)
787 draw_height -= y + height - JNB_SURFACE_HEIGHT;
789 pob_ptr = &gob->data[image][pob_offset];
790 vga_ptr = get_vgaptr(page, x, y);
791 mask_ptr = &mask[(y * JNB_SURFACE_WIDTH) + x];
792 for (c1 = 0; c1 < draw_height; c1++) {
793 for (c2 = 0; c2 < draw_width; c2++) {
795 if (use_mask == 0 || (use_mask == 1 && colour == 0)) {
805 pob_ptr += width - c2;
806 vga_ptr += (JNB_SURFACE_WIDTH - c2);
807 mask_ptr += (JNB_SURFACE_WIDTH - c2);
812 int pob_width(int image, gob_t *gob)
816 assert(image<gob->num_images);
817 return gob->width[image];
821 int pob_height(int image, gob_t *gob)
825 assert(image<gob->num_images);
826 return gob->height[image];
830 int pob_hs_x(int image, gob_t *gob)
834 assert(image<gob->num_images);
835 return gob->hs_x[image];
839 int pob_hs_y(int image, gob_t *gob)
843 assert(image<gob->num_images);
844 return gob->hs_y[image];
848 int read_pcx(FILE * handle, char *buffer, int buf_len, char *pal)
854 fseek(handle, 128, SEEK_CUR);
856 while (ofs1 < buf_len) {
858 if ((a & 0xc0) == 0xc0) {
861 for (c1 = 0; c1 < a && ofs1 < buf_len; c1++)
862 buffer[ofs1++] = (char) b;
864 buffer[ofs1++] = (char) a;
867 fseek(handle, 1, SEEK_CUR);
868 for (c1 = 0; c1 < 768; c1++)
869 pal[c1] = fgetc(handle) >> 2;
876 void register_background(char *pixels, char pal[768])
882 background_drawn = 0;
891 for (i=0; i<256; i++)
892 int_pal[i] = SDL_MapRGB(jnb_surface->format, (Uint8)(pal[i*3+0]<<2), (Uint8)(pal[i*3+1]<<2), (Uint8)(pal[i*3+2]<<2));
893 background = malloc(JNB_SURFACE_WIDTH*JNB_SURFACE_HEIGHT*JNB_BYTESPP);
895 Super2xSaI(pixels, JNB_WIDTH, 1, (unsigned char *)background, JNB_SURFACE_WIDTH*JNB_BYTESPP, JNB_BYTESPP, JNB_WIDTH, JNB_HEIGHT, int_pal);
898 background = malloc(JNB_WIDTH*JNB_HEIGHT);
900 memcpy(background, pixels, JNB_WIDTH*JNB_HEIGHT);
904 int register_gob(FILE *handle, gob_t *gob, int len)
906 unsigned char *gob_data;
909 gob_data = malloc(len);
910 fread(gob_data, 1, len, handle);
912 gob->num_images = *(short *)(&gob_data[0]);
914 gob->width = malloc(gob->num_images*sizeof(int));
915 gob->height = malloc(gob->num_images*sizeof(int));
916 gob->hs_x = malloc(gob->num_images*sizeof(int));
917 gob->hs_y = malloc(gob->num_images*sizeof(int));
918 gob->data = malloc(gob->num_images*sizeof(pixel_t *));
919 gob->orig_data = malloc(gob->num_images*sizeof(unsigned char *));
920 for (i=0; i<gob->num_images; i++) {
924 offset = *(int *)(&gob_data[i*4+2]);
926 gob->width[i] = *(short *)(&gob_data[offset]); offset += 2;
927 gob->height[i] = *(short *)(&gob_data[offset]); offset += 2;
928 gob->hs_x[i] = *(short *)(&gob_data[offset]); offset += 2;
929 gob->hs_y[i] = *(short *)(&gob_data[offset]); offset += 2;
931 image_size = gob->width[i] * gob->height[i];
932 gob->orig_data[i] = malloc(image_size);
933 memcpy(gob->orig_data[i], &gob_data[offset], image_size);
935 image_size = gob->width[i] * gob->height[i] * 4 * JNB_BYTESPP;
936 gob->data[i] = malloc(image_size);
938 gob->data[i] = gob->orig_data[i];
946 void recalculate_gob(gob_t *gob, char pal[768])
952 for (i=1; i<256; i++) {
953 int_pal[i] = SDL_MapRGB(jnb_surface->format, (Uint8)(pal[i*3+0]<<2), (Uint8)(pal[i*3+1]<<2), (Uint8)(pal[i*3+2]<<2));
955 int_pal[i] = SDL_MapRGB(jnb_surface->format, 8, 8, 8);
959 for (i=0; i<gob->num_images; i++) {
960 if ( (gob->width[i]>4) && (gob->height[i]>4) )
961 Super2xSaI(gob->orig_data[i], gob->width[i], 1, (unsigned char *)gob->data[i], gob->width[i]*2*JNB_BYTESPP, JNB_BYTESPP, gob->width[i], gob->height[i], int_pal);
963 Scale2x(gob->orig_data[i], gob->width[i], 1, (unsigned char *)gob->data[i], gob->width[i]*2*JNB_BYTESPP, JNB_BYTESPP, gob->width[i], gob->height[i], int_pal);
968 void register_mask(char *pixels)
981 for (i=1; i<256; i++)
983 mask = malloc(JNB_SURFACE_WIDTH*JNB_SURFACE_HEIGHT*JNB_BYTESPP);
985 Scale2x(pixels, JNB_WIDTH, 1, (unsigned char *)mask, JNB_SURFACE_WIDTH*JNB_BYTESPP, JNB_BYTESPP, JNB_WIDTH, JNB_HEIGHT, int_pal);
988 mask = malloc(JNB_WIDTH*JNB_HEIGHT);
990 memcpy(mask, pixels, JNB_WIDTH*JNB_HEIGHT);