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;
12 static int dirty_blocks[2][25*16];
14 #define DIRTY_BLOCK_SHIFT 5
16 #define DIRTY_BLOCK_SHIFT 4
19 pixel_t *get_vgaptr(int page, int x, int y)
21 assert(drawing_enable==1);
23 return &screen_buffer[page][y*JNB_SURFACE_WIDTH+x];
27 void open_screen(void)
31 lval = SDL_Init(SDL_INIT_EVERYTHING | SDL_INIT_AUDIO);
33 fprintf(stderr, "SDL ERROR: %s\n", SDL_GetError());
38 jnb_surface = SDL_SetVideoMode(JNB_SURFACE_WIDTH, JNB_SURFACE_HEIGHT, JNB_BPP, SDL_HWSURFACE | SDL_FULLSCREEN);
40 jnb_surface = SDL_SetVideoMode(JNB_SURFACE_WIDTH, JNB_SURFACE_HEIGHT, JNB_BPP, SDL_HWSURFACE);
43 fprintf(stderr, "SDL ERROR: %s\n", SDL_GetError());
51 memset(current_pal, 0, sizeof(current_pal));
52 memset(dirty_blocks, 0, sizeof(dirty_blocks));
64 if (SDL_WM_ToggleFullScreen(jnb_surface))
69 void wait_vrt(int mix)
75 void clear_page(int page, int color)
78 pixel_t *buf = get_vgaptr(page, 0, 0);
80 assert(drawing_enable==1);
82 for (i=0; i<(25*16); i++)
83 dirty_blocks[page][i] = 1;
85 for (i=0; i<JNB_SURFACE_HEIGHT; i++)
86 for (j=0; j<JNB_SURFACE_WIDTH; j++)
91 void clear_lines(int page, int y, int count, pixel_t color)
95 assert(drawing_enable==1);
102 for (i=0; i<count; i++) {
103 if ((i+y)<JNB_SURFACE_HEIGHT) {
104 pixel_t *buf = get_vgaptr(page, 0, i+y);
105 for (j=0; j<JNB_SURFACE_WIDTH; j++)
109 count = ((y+count)>>DIRTY_BLOCK_SHIFT) - (y>>DIRTY_BLOCK_SHIFT) + 1;
110 y >>= DIRTY_BLOCK_SHIFT;
111 for (i=0; i<count; i++)
113 dirty_blocks[page][(y+i)*25+j] = 1;
117 pixel_t get_color(int color, char pal[768])
121 return SDL_MapRGB(jnb_surface->format, (Uint8)(pal[color*3+0]<<2), (Uint8)(pal[color*3+1]<<2), (Uint8)(pal[color*3+2]<<2));
125 pixel_t get_pixel(int page, int x, int y)
127 assert(drawing_enable==1);
132 assert(x<JNB_SURFACE_WIDTH);
133 assert(y<JNB_SURFACE_HEIGHT);
135 return *get_vgaptr(page, x, y);
139 void set_pixel(int page, int x, int y, pixel_t color)
141 assert(drawing_enable==1);
146 assert(x<JNB_SURFACE_WIDTH);
147 assert(y<JNB_SURFACE_HEIGHT);
149 dirty_blocks[page][(y>>DIRTY_BLOCK_SHIFT)*25+(x>>DIRTY_BLOCK_SHIFT)] = 1;
151 *get_vgaptr(page, x, y) = color;
155 static unsigned int colorMask = 0xF7DEF7DE;
156 static unsigned int lowPixelMask = 0x08210821;
157 static unsigned int qcolorMask = 0xE79CE79C;
158 static unsigned int qlowpixelMask = 0x18631863;
159 static unsigned int redblueMask = 0xF81F;
160 static unsigned int greenMask = 0x7E0;
162 int Init_2xSaI (unsigned int BitFormat)
164 if (BitFormat == 565)
166 colorMask = 0xF7DEF7DE;
167 lowPixelMask = 0x08210821;
168 qcolorMask = 0xE79CE79C;
169 qlowpixelMask = 0x18631863;
170 redblueMask = 0xF81F;
173 else if (BitFormat == 555)
175 colorMask = 0x7BDE7BDE;
176 lowPixelMask = 0x04210421;
177 qcolorMask = 0x739C739C;
178 qlowpixelMask = 0x0C630C63;
179 redblueMask = 0x7C1F;
188 Init_2xSaIMMX (BitFormat);
195 void Scale2x (unsigned char *src, unsigned int src_pitch, int src_bytes_per_pixel,
196 unsigned char *dst, unsigned int dst_pitch, int dst_bytes_per_pixel,
197 int width, int height, int pal[256])
199 #define GET_COLOR(x) (pal[(x)])
202 unsigned char *src_line;
203 unsigned char *dst_line[2];
207 dst_line[1] = dst + dst_pitch;
208 for (y=0; y<height; y++) {
209 for (x=0; x<width; x++) {
212 if (src_bytes_per_pixel == 1) {
213 color = GET_COLOR(*(((unsigned char*)src_line) + x));
214 } else if (src_bytes_per_pixel == 2) {
215 color = *(((unsigned short*)src_line) + x);
217 color = *(((unsigned int*)src_line) + x);
220 if (dst_bytes_per_pixel == 2) {
221 *((unsigned long *) (&dst_line[0][x * 4])) = color | (color << 16);
222 *((unsigned long *) (&dst_line[1][x * 4])) = color | (color << 16);
224 *((unsigned long *) (&dst_line[0][x * 8])) = color;
225 *((unsigned long *) (&dst_line[0][x * 8 + 4])) = color;
226 *((unsigned long *) (&dst_line[1][x * 8])) = color;
227 *((unsigned long *) (&dst_line[1][x * 8 + 4])) = color;
231 src_line += src_pitch;
233 if (y < height - 1) {
234 dst_line[0] += dst_pitch * 2;
235 dst_line[1] += dst_pitch * 2;
241 void Super2xSaI (unsigned char *src, unsigned int src_pitch, int src_bytes_per_pixel,
242 unsigned char *dst, unsigned int dst_pitch, int dst_bytes_per_pixel,
243 int width, int height, int pal[256])
245 #define GET_RESULT(A, B, C, D) ((A != C || A != D) - (B != C || B != D))
247 #define INTERPOLATE(A, B) (((A & colorMask) >> 1) + ((B & colorMask) >> 1) + (A & B & lowPixelMask))
249 #define Q_INTERPOLATE(A, B, C, D) ((A & qcolorMask) >> 2) + ((B & qcolorMask) >> 2) + ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2) \
250 + ((((A & qlowpixelMask) + (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask)) >> 2) & qlowpixelMask)
252 #define GET_COLOR(x) (pal[(x)])
254 unsigned char *src_line[4];
255 unsigned char *dst_line[2];
257 unsigned long color[16];
259 if ( (width<2) || (height<2) ) {
260 Scale2x(src, src_pitch, src_bytes_per_pixel, dst, dst_pitch, dst_bytes_per_pixel, width, height, pal);
264 /* Point to the first 3 lines. */
267 src_line[2] = src + src_pitch;
268 src_line[3] = src + (src_pitch * 2);
271 dst_line[1] = dst + dst_pitch;
275 if (src_bytes_per_pixel == 1) {
278 color[0] = GET_COLOR(*sbp); color[1] = color[0]; color[2] = color[0]; color[3] = color[0];
279 color[4] = color[0]; color[5] = color[0]; color[6] = GET_COLOR(*(sbp + 1)); color[7] = GET_COLOR(*(sbp + 2));
281 color[8] = GET_COLOR(*sbp); color[9] = color[8]; color[10] = GET_COLOR(*(sbp + 1)); color[11] = GET_COLOR(*(sbp + 2));
283 color[12] = GET_COLOR(*sbp); color[13] = color[12]; color[14] = GET_COLOR(*(sbp + 1)); color[15] = GET_COLOR(*(sbp + 2));
284 } else if (src_bytes_per_pixel == 2) {
286 sbp = (unsigned short*)src_line[0];
287 color[0] = *sbp; color[1] = color[0]; color[2] = color[0]; color[3] = color[0];
288 color[4] = color[0]; color[5] = color[0]; color[6] = *(sbp + 1); color[7] = *(sbp + 2);
289 sbp = (unsigned short*)src_line[2];
290 color[8] = *sbp; color[9] = color[8]; color[10] = *(sbp + 1); color[11] = *(sbp + 2);
291 sbp = (unsigned short*)src_line[3];
292 color[12] = *sbp; color[13] = color[12]; color[14] = *(sbp + 1); color[15] = *(sbp + 2);
295 lbp = (unsigned long*)src_line[0];
296 color[0] = *lbp; color[1] = color[0]; color[2] = color[0]; color[3] = color[0];
297 color[4] = color[0]; color[5] = color[0]; color[6] = *(lbp + 1); color[7] = *(lbp + 2);
298 lbp = (unsigned long*)src_line[2];
299 color[8] = *lbp; color[9] = color[8]; color[10] = *(lbp + 1); color[11] = *(lbp + 2);
300 lbp = (unsigned long*)src_line[3];
301 color[12] = *lbp; color[13] = color[12]; color[14] = *(lbp + 1); color[15] = *(lbp + 2);
304 for (y = 0; y < height; y++) {
306 /* Todo: x = width - 2, x = width - 1 */
308 for (x = 0; x < width; x++) {
309 unsigned long product1a, product1b, product2a, product2b;
311 //--------------------------------------- B0 B1 B2 B3 0 1 2 3
312 // 4 5* 6 S2 -> 4 5* 6 7
313 // 1 2 3 S1 8 9 10 11
314 // A0 A1 A2 A3 12 13 14 15
315 //--------------------------------------
316 if (color[9] == color[6] && color[5] != color[10]) {
317 product2b = color[9];
318 product1b = product2b;
320 else if (color[5] == color[10] && color[9] != color[6]) {
321 product2b = color[5];
322 product1b = product2b;
324 else if (color[5] == color[10] && color[9] == color[6]) {
327 r += GET_RESULT(color[6], color[5], color[8], color[13]);
328 r += GET_RESULT(color[6], color[5], color[4], color[1]);
329 r += GET_RESULT(color[6], color[5], color[14], color[11]);
330 r += GET_RESULT(color[6], color[5], color[2], color[7]);
333 product1b = color[6];
335 product1b = color[5];
337 product1b = INTERPOLATE(color[5], color[6]);
339 product2b = product1b;
343 if (color[6] == color[10] && color[10] == color[13] && color[9] != color[14] && color[10] != color[12])
344 product2b = Q_INTERPOLATE(color[10], color[10], color[10], color[9]);
345 else if (color[5] == color[9] && color[9] == color[14] && color[13] != color[10] && color[9] != color[15])
346 product2b = Q_INTERPOLATE(color[9], color[9], color[9], color[10]);
348 product2b = INTERPOLATE(color[9], color[10]);
350 if (color[6] == color[10] && color[6] == color[1] && color[5] != color[2] && color[6] != color[0])
351 product1b = Q_INTERPOLATE(color[6], color[6], color[6], color[5]);
352 else if (color[5] == color[9] && color[5] == color[2] && color[1] != color[6] && color[5] != color[3])
353 product1b = Q_INTERPOLATE(color[6], color[5], color[5], color[5]);
355 product1b = INTERPOLATE(color[5], color[6]);
358 if (color[5] == color[10] && color[9] != color[6] && color[4] == color[5] && color[5] != color[14])
359 product2a = INTERPOLATE(color[9], color[5]);
360 else if (color[5] == color[8] && color[6] == color[5] && color[4] != color[9] && color[5] != color[12])
361 product2a = INTERPOLATE(color[9], color[5]);
363 product2a = color[9];
365 if (color[9] == color[6] && color[5] != color[10] && color[8] == color[9] && color[9] != color[2])
366 product1a = INTERPOLATE(color[9], color[5]);
367 else if (color[4] == color[9] && color[10] == color[9] && color[8] != color[5] && color[9] != color[0])
368 product1a = INTERPOLATE(color[9], color[5]);
370 product1a = color[5];
372 if (dst_bytes_per_pixel == 2) {
373 *((unsigned long *) (&dst_line[0][x * 4])) = product1a | (product1b << 16);
374 *((unsigned long *) (&dst_line[1][x * 4])) = product2a | (product2b << 16);
376 *((unsigned long *) (&dst_line[0][x * 8])) = product1a;
377 *((unsigned long *) (&dst_line[0][x * 8 + 4])) = product1b;
378 *((unsigned long *) (&dst_line[1][x * 8])) = product2a;
379 *((unsigned long *) (&dst_line[1][x * 8 + 4])) = product2b;
382 /* Move color matrix forward */
383 color[0] = color[1]; color[4] = color[5]; color[8] = color[9]; color[12] = color[13];
384 color[1] = color[2]; color[5] = color[6]; color[9] = color[10]; color[13] = color[14];
385 color[2] = color[3]; color[6] = color[7]; color[10] = color[11]; color[14] = color[15];
389 if (src_bytes_per_pixel == 1) {
390 color[3] = GET_COLOR(*(((unsigned char*)src_line[0]) + x));
391 color[7] = GET_COLOR(*(((unsigned char*)src_line[1]) + x));
392 color[11] = GET_COLOR(*(((unsigned char*)src_line[2]) + x));
393 color[15] = GET_COLOR(*(((unsigned char*)src_line[3]) + x));
394 } else if (src_bytes_per_pixel == 2) {
395 color[3] = *(((unsigned short*)src_line[0]) + x);
396 color[7] = *(((unsigned short*)src_line[1]) + x);
397 color[11] = *(((unsigned short*)src_line[2]) + x);
398 color[15] = *(((unsigned short*)src_line[3]) + x);
400 color[3] = *(((unsigned long*)src_line[0]) + x);
401 color[7] = *(((unsigned long*)src_line[1]) + x);
402 color[11] = *(((unsigned long*)src_line[2]) + x);
403 color[15] = *(((unsigned long*)src_line[3]) + x);
409 /* We're done with one line, so we shift the source lines up */
410 src_line[0] = src_line[1];
411 src_line[1] = src_line[2];
412 src_line[2] = src_line[3];
416 src_line[3] = src_line[2];
418 src_line[3] = src_line[2] + src_pitch;
420 /* Then shift the color matrix up */
421 if (src_bytes_per_pixel == 1) {
424 color[0] = GET_COLOR(*sbp); color[1] = color[0]; color[2] = GET_COLOR(*(sbp + 1)); color[3] = GET_COLOR(*(sbp + 2));
426 color[4] = GET_COLOR(*sbp); color[5] = color[4]; color[6] = GET_COLOR(*(sbp + 1)); color[7] = GET_COLOR(*(sbp + 2));
428 color[8] = GET_COLOR(*sbp); color[9] = color[8]; color[10] = GET_COLOR(*(sbp + 1)); color[11] = GET_COLOR(*(sbp + 2));
430 color[12] = GET_COLOR(*sbp); color[13] = color[12]; color[14] = GET_COLOR(*(sbp + 1)); color[15] = GET_COLOR(*(sbp + 2));
431 } else if (src_bytes_per_pixel == 2) {
433 sbp = (unsigned short*)src_line[0];
434 color[0] = *sbp; color[1] = color[0]; color[2] = *(sbp + 1); color[3] = *(sbp + 2);
435 sbp = (unsigned short*)src_line[1];
436 color[4] = *sbp; color[5] = color[4]; color[6] = *(sbp + 1); color[7] = *(sbp + 2);
437 sbp = (unsigned short*)src_line[2];
438 color[8] = *sbp; color[9] = color[9]; color[10] = *(sbp + 1); color[11] = *(sbp + 2);
439 sbp = (unsigned short*)src_line[3];
440 color[12] = *sbp; color[13] = color[12]; color[14] = *(sbp + 1); color[15] = *(sbp + 2);
443 lbp = (unsigned long*)src_line[0];
444 color[0] = *lbp; color[1] = color[0]; color[2] = *(lbp + 1); color[3] = *(lbp + 2);
445 lbp = (unsigned long*)src_line[1];
446 color[4] = *lbp; color[5] = color[4]; color[6] = *(lbp + 1); color[7] = *(lbp + 2);
447 lbp = (unsigned long*)src_line[2];
448 color[8] = *lbp; color[9] = color[9]; color[10] = *(lbp + 1); color[11] = *(lbp + 2);
449 lbp = (unsigned long*)src_line[3];
450 color[12] = *lbp; color[13] = color[12]; color[14] = *(lbp + 1); color[15] = *(lbp + 2);
453 if (y < height - 1) {
454 dst_line[0] += dst_pitch * 2;
455 dst_line[1] += dst_pitch * 2;
461 void flippage(int page)
467 assert(drawing_enable==0);
469 SDL_LockSurface(jnb_surface);
470 if (!jnb_surface->pixels) {
472 for (x=0; x<(25*16); x++) {
473 dirty_blocks[0][x] = 1;
474 dirty_blocks[1][x] = 1;
480 dest=(unsigned char *)jnb_surface->pixels;
481 src=screen_buffer[page];
482 Super2xSaI(src, JNB_WIDTH, 1, dest, jnb_surface->pitch, 2, JNB_WIDTH, JNB_HEIGHT, current_pal);
484 dest=(unsigned char *)jnb_surface->pixels;
485 src=screen_buffer[page];
486 for (y=0; y<JNB_SURFACE_HEIGHT; y++) {
487 //memset(&dest[y*jnb_surface->pitch],0,JNB_SURFACE_WIDTH*JNB_BYTESPP);
488 for (x=0; x<25; x++) {
494 while ( (test_x<25) && (dirty_blocks[page][(y>>DIRTY_BLOCK_SHIFT)*25+test_x]) ) {
499 memcpy( &dest[y*jnb_surface->pitch+(x<<DIRTY_BLOCK_SHIFT)*JNB_BYTESPP],
500 &src[y*JNB_SURFACE_WIDTH+(x<<DIRTY_BLOCK_SHIFT)],
501 ((16<<DIRTY_BLOCK_SHIFT)>>4)*JNB_BYTESPP*count);
502 //*((pixel_t *)(&dest[(y>>DIRTY_BLOCK_SHIFT)*jnb_surface->pitch+x*JNB_BYTESPP]))=0xe0e0;
507 memset(&dirty_blocks[page], 0, sizeof(int)*25*16);
509 dest=(unsigned char *)jnb_surface->pixels;
510 src=screen_buffer[page];
511 w=(jnb_surface->clip_rect.w>JNB_SURFACE_WIDTH)?(JNB_SURFACE_WIDTH):(jnb_surface->clip_rect.w);
512 h=(jnb_surface->clip_rect.h>JNB_SURFACE_HEIGHT)?(JNB_SURFACE_HEIGHT):(jnb_surface->clip_rect.h);
514 memcpy(dest,src,w*JNB_BYTESPP);
515 dest+=jnb_surface->pitch;
516 src+=JNB_SURFACE_WIDTH;
520 SDL_UnlockSurface(jnb_surface);
521 SDL_Flip(jnb_surface);
525 void draw_begin(void)
527 assert(drawing_enable==0);
530 if (background_drawn == 0) {
532 put_block(0, 0, 0, JNB_WIDTH, JNB_HEIGHT, background);
533 put_block(1, 0, 0, JNB_WIDTH, JNB_HEIGHT, background);
534 //put_block(0, 0, 0, rabbit_gobs.width[1], rabbit_gobs.height[1], rabbit_gobs.data[1]);
535 //put_block(1, 0, 0, rabbit_gobs.width[1], rabbit_gobs.height[1], rabbit_gobs.data[1]);
540 background_drawn = 1;
547 assert(drawing_enable==1);
553 void setpalette(int index, int count, char *palette)
555 SDL_Color colors[256];
558 assert(drawing_enable==0);
560 for (i = 0; i < count; i++) {
561 colors[i+index].r = palette[i * 3 + 0] << 2;
562 colors[i+index].g = palette[i * 3 + 1] << 2;
563 colors[i+index].b = palette[i * 3 + 2] << 2;
564 current_pal[i+index] = SDL_MapRGB(jnb_surface->format, colors[i+index].r, colors[i+index].g, colors[i+index].b);
567 SDL_SetColors(jnb_surface, &colors[index], index, count);
572 void fillpalette(int red, int green, int blue)
574 SDL_Color colors[256];
577 assert(drawing_enable==0);
579 for (i = 0; i < 256; i++) {
580 colors[i].r = red << 2;
581 colors[i].g = green << 2;
582 colors[i].b = blue << 2;
583 current_pal[i] = SDL_MapRGB(jnb_surface->format, colors[i].r, colors[i].g, colors[i].b);
586 SDL_SetColors(jnb_surface, colors, 0, 256);
591 void get_block(int page, int x, int y, int width, int height, pixel_t *buffer)
594 pixel_t *buffer_ptr, *vga_ptr;
596 assert(drawing_enable==1);
609 if (y + height >= JNB_SURFACE_HEIGHT)
610 height = JNB_SURFACE_HEIGHT - y;
611 if (x + width >= JNB_SURFACE_WIDTH)
612 width = JNB_SURFACE_WIDTH - x;
618 vga_ptr = get_vgaptr(page, x, y);
620 for (h = 0; h < height; h++) {
621 memcpy(buffer_ptr, vga_ptr, width * JNB_BYTESPP);
622 vga_ptr += JNB_SURFACE_WIDTH;
629 void put_block(int page, int x, int y, int width, int height, pixel_t *buffer)
632 pixel_t *vga_ptr, *buffer_ptr;
634 assert(drawing_enable==1);
647 if (y + height >= JNB_SURFACE_HEIGHT)
648 height = JNB_SURFACE_HEIGHT - y;
649 if (x + width >= JNB_SURFACE_WIDTH)
650 width = JNB_SURFACE_WIDTH - x;
656 vga_ptr = get_vgaptr(page, x, y);
658 for (h = 0; h < height; h++) {
659 memcpy(vga_ptr, buffer_ptr, width * JNB_BYTESPP);
660 vga_ptr += JNB_SURFACE_WIDTH;
663 width = ((x+width)>>DIRTY_BLOCK_SHIFT) - (x>>DIRTY_BLOCK_SHIFT) + 1;
664 height = ((y+height)>>DIRTY_BLOCK_SHIFT) - (y>>DIRTY_BLOCK_SHIFT) + 1;
665 x >>= DIRTY_BLOCK_SHIFT;
666 y >>= DIRTY_BLOCK_SHIFT;
668 for (h=0; h<height; h++)
669 dirty_blocks[page][(y+h)*25+(x+width)] = 1;
673 void put_text(int page, int x, int y, char *text, int align)
681 assert(drawing_enable==1);
683 if (text == NULL || strlen(text) == 0)
685 if (font_gobs.num_images == 0)
690 while (text[c1] != 0) {
697 if (t1 >= 33 && t1 <= 34)
700 else if (t1 >= 39 && t1 <= 41)
703 else if (t1 >= 44 && t1 <= 59)
706 else if (t1 >= 64 && t1 <= 90)
709 else if (t1 >= 97 && t1 <= 122)
735 width += pob_width(image, &font_gobs) + 1;
746 cur_x = x - width / 2;
749 cur_x = 0; /* this should cause error? -Chuck */
754 while (text[c1] != 0) {
761 if (t1 >= 33 && t1 <= 34)
764 else if (t1 >= 39 && t1 <= 41)
767 else if (t1 >= 44 && t1 <= 59)
770 else if (t1 >= 64 && t1 <= 90)
773 else if (t1 >= 97 && t1 <= 122)
799 put_pob(page, cur_x, y, image, &font_gobs, 1, mask_pic);
800 cur_x += pob_width(image, &font_gobs) + 1;
805 void put_pob(int page, int x, int y, int image, gob_t *gob, int use_mask, unsigned char *mask_pic)
813 int draw_width, draw_height;
816 assert(drawing_enable==1);
819 assert(image<gob->num_images);
827 width = draw_width = gob->width[image]*2;
828 height = draw_height = gob->height[image]*2;
829 x -= gob->hs_x[image]*2;
830 y -= gob->hs_y[image]*2;
832 width = draw_width = gob->width[image];
833 height = draw_height = gob->height[image];
834 x -= gob->hs_x[image];
835 y -= gob->hs_y[image];
837 if ((x + width) <= 0 || x >= JNB_SURFACE_WIDTH)
839 if ((y + height) <= 0 || y >= JNB_SURFACE_HEIGHT)
847 if ((x + width) > JNB_SURFACE_WIDTH)
848 draw_width -= x + width - JNB_SURFACE_WIDTH;
850 pob_offset -= y * width;
854 if ((y + height) > JNB_SURFACE_HEIGHT)
855 draw_height -= y + height - JNB_SURFACE_HEIGHT;
857 pob_ptr = &gob->data[image][pob_offset];
858 vga_ptr = get_vgaptr(page, x, y);
859 mask_ptr = &mask[(y * JNB_SURFACE_WIDTH) + x];
860 for (c1 = 0; c1 < draw_height; c1++) {
861 for (c2 = 0; c2 < draw_width; c2++) {
863 if (use_mask == 0 || (use_mask == 1 && colour == 0)) {
873 pob_ptr += width - c2;
874 vga_ptr += (JNB_SURFACE_WIDTH - c2);
875 mask_ptr += (JNB_SURFACE_WIDTH - c2);
877 draw_width = ((x+draw_width)>>DIRTY_BLOCK_SHIFT) - (x>>DIRTY_BLOCK_SHIFT) + 1;
878 draw_height = ((y+draw_height)>>DIRTY_BLOCK_SHIFT) - (y>>DIRTY_BLOCK_SHIFT) + 1;
879 x >>= DIRTY_BLOCK_SHIFT;
880 y >>= DIRTY_BLOCK_SHIFT;
882 for (c1=0; c1<draw_height; c1++)
883 dirty_blocks[page][(y+c1)*25+(x+draw_width)] = 1;
887 int pob_width(int image, gob_t *gob)
891 assert(image<gob->num_images);
892 return gob->width[image];
896 int pob_height(int image, gob_t *gob)
900 assert(image<gob->num_images);
901 return gob->height[image];
905 int pob_hs_x(int image, gob_t *gob)
909 assert(image<gob->num_images);
910 return gob->hs_x[image];
914 int pob_hs_y(int image, gob_t *gob)
918 assert(image<gob->num_images);
919 return gob->hs_y[image];
923 int read_pcx(FILE * handle, char *buffer, int buf_len, char *pal)
929 fseek(handle, 128, SEEK_CUR);
931 while (ofs1 < buf_len) {
933 if ((a & 0xc0) == 0xc0) {
936 for (c1 = 0; c1 < a && ofs1 < buf_len; c1++)
937 buffer[ofs1++] = (char) b;
939 buffer[ofs1++] = (char) a;
942 fseek(handle, 1, SEEK_CUR);
943 for (c1 = 0; c1 < 768; c1++)
944 pal[c1] = fgetc(handle) >> 2;
951 void register_background(char *pixels, char pal[768])
957 background_drawn = 0;
966 for (i=0; i<256; i++)
967 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));
968 background = malloc(JNB_SURFACE_WIDTH*JNB_SURFACE_HEIGHT*JNB_BYTESPP);
970 Super2xSaI(pixels, JNB_WIDTH, 1, (unsigned char *)background, JNB_SURFACE_WIDTH*JNB_BYTESPP, JNB_BYTESPP, JNB_WIDTH, JNB_HEIGHT, int_pal);
973 background = malloc(JNB_WIDTH*JNB_HEIGHT);
975 memcpy(background, pixels, JNB_WIDTH*JNB_HEIGHT);
979 int register_gob(FILE *handle, gob_t *gob, int len)
981 unsigned char *gob_data;
984 gob_data = malloc(len);
985 fread(gob_data, 1, len, handle);
987 gob->num_images = *(short *)(&gob_data[0]);
989 gob->width = malloc(gob->num_images*sizeof(int));
990 gob->height = malloc(gob->num_images*sizeof(int));
991 gob->hs_x = malloc(gob->num_images*sizeof(int));
992 gob->hs_y = malloc(gob->num_images*sizeof(int));
993 gob->data = malloc(gob->num_images*sizeof(pixel_t *));
994 gob->orig_data = malloc(gob->num_images*sizeof(unsigned char *));
995 for (i=0; i<gob->num_images; i++) {
999 offset = *(int *)(&gob_data[i*4+2]);
1001 gob->width[i] = *(short *)(&gob_data[offset]); offset += 2;
1002 gob->height[i] = *(short *)(&gob_data[offset]); offset += 2;
1003 gob->hs_x[i] = *(short *)(&gob_data[offset]); offset += 2;
1004 gob->hs_y[i] = *(short *)(&gob_data[offset]); offset += 2;
1006 image_size = gob->width[i] * gob->height[i];
1007 gob->orig_data[i] = malloc(image_size);
1008 memcpy(gob->orig_data[i], &gob_data[offset], image_size);
1010 image_size = gob->width[i] * gob->height[i] * 4 * JNB_BYTESPP;
1011 gob->data[i] = malloc(image_size);
1013 gob->data[i] = gob->orig_data[i];
1021 void recalculate_gob(gob_t *gob, char pal[768])
1027 for (i=1; i<256; i++) {
1028 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));
1029 if (int_pal[i] == 0)
1030 int_pal[i] = SDL_MapRGB(jnb_surface->format, 8, 8, 8);
1034 for (i=0; i<gob->num_images; i++) {
1035 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);
1040 void register_mask(char *pixels)
1053 for (i=1; i<256; i++)
1055 mask = malloc(JNB_SURFACE_WIDTH*JNB_SURFACE_HEIGHT*JNB_BYTESPP);
1057 Scale2x(pixels, JNB_WIDTH, 1, (unsigned char *)mask, JNB_SURFACE_WIDTH*JNB_BYTESPP, JNB_BYTESPP, JNB_WIDTH, JNB_HEIGHT, int_pal);
1060 mask = malloc(JNB_WIDTH*JNB_HEIGHT);
1062 memcpy(mask, pixels, JNB_WIDTH*JNB_HEIGHT);