Main Page | Data Structures | Directories | File List | Data Fields | Globals

pixmap.c

Go to the documentation of this file.
00001 /* ---------------------------------------------------------------------- *
00002  * pixmap.c
00003  * This file is part of lincity.
00004  * Lincity is copyright (c) I J Peters 1995-1997, (c) Greg Sharp 1997-2001.
00005  * ---------------------------------------------------------------------- */
00006 /* The pixmap contains only the main screen, not the border.
00007  * When pix doubled, pixmap does contain the doubled pixels.
00008  * ---------------------------------------------------------------------- */
00009 #include "lcconfig.h"
00010 #include <stdio.h>
00011 #include <stdlib.h>
00012 #include <assert.h>
00013 #include <math.h>
00014 #include "lcstring.h"
00015 
00016 #include "lin-city.h"
00017 #include "lctypes.h"
00018 #include "cliglobs.h"
00019 #include "pixmap.h"
00020 
00021 #if defined (LC_X11)
00022 #include <X11/Xlib.h>
00023 #include <X11/Xatom.h>
00024 #include <X11/Xutil.h>
00025 #include <X11/keysym.h>
00026 #include <X11/keysymdef.h>
00027 #include "lcx11.h"
00028 #endif
00029 
00030 
00031 #define USE_IMAGES 1
00032 
00033 /* ---------------------------------------------------------------------- *
00034  * Private global variables
00035  * ---------------------------------------------------------------------- */
00036 char* pixmap = NULL;
00037 int pixmap_height = 0;
00038 int pixmap_width = 0;
00039 
00040 
00041 /* ---------------------------------------------------------------------- *
00042  * Public functions
00043  * ---------------------------------------------------------------------- */
00044 #ifdef USE_PIXMAPS
00045 void
00046 init_pixmaps ()
00047 {
00048     int i;
00049     for (i = 1; i < NUM_OF_TYPES; i++) {
00050         icon_pixmap[i] = 0;
00051     }
00052 
00053     init_icon_pixmap (CST_GREEN);
00054     /* powerlines */
00055     init_icon_pixmap (CST_POWERL_H_L);
00056     init_icon_pixmap (CST_POWERL_V_L);
00057     init_icon_pixmap (CST_POWERL_LD_L);
00058     init_icon_pixmap (CST_POWERL_RD_L);
00059     init_icon_pixmap (CST_POWERL_LU_L);
00060     init_icon_pixmap (CST_POWERL_RU_L);
00061     init_icon_pixmap (CST_POWERL_LDU_L);
00062     init_icon_pixmap (CST_POWERL_LDR_L);
00063     init_icon_pixmap (CST_POWERL_LUR_L);
00064     init_icon_pixmap (CST_POWERL_UDR_L);
00065     init_icon_pixmap (CST_POWERL_LUDR_L);
00066     prog_box ("", 6);
00067     init_icon_pixmap (CST_POWERL_H_D);
00068     init_icon_pixmap (CST_POWERL_V_D);
00069     init_icon_pixmap (CST_POWERL_LD_D);
00070     init_icon_pixmap (CST_POWERL_RD_D);
00071     init_icon_pixmap (CST_POWERL_LU_D);
00072     init_icon_pixmap (CST_POWERL_RU_D);
00073     init_icon_pixmap (CST_POWERL_LDU_D);
00074     init_icon_pixmap (CST_POWERL_LDR_D);
00075     init_icon_pixmap (CST_POWERL_LUR_D);
00076     init_icon_pixmap (CST_POWERL_UDR_D);
00077     init_icon_pixmap (CST_POWERL_LUDR_D);
00078     /* HT windmills */
00079     init_icon_pixmap (CST_WINDMILL_1_G);
00080     init_icon_pixmap (CST_WINDMILL_2_G);
00081     init_icon_pixmap (CST_WINDMILL_3_G);
00082     prog_box ("", 12);
00083     init_icon_pixmap (CST_WINDMILL_1_RG);
00084     init_icon_pixmap (CST_WINDMILL_2_RG);
00085     init_icon_pixmap (CST_WINDMILL_3_RG);
00086     init_icon_pixmap (CST_WINDMILL_1_R);
00087     init_icon_pixmap (CST_WINDMILL_2_R);
00088     init_icon_pixmap (CST_WINDMILL_3_R);
00089     /*LT windmills */
00090     init_icon_pixmap (CST_WINDMILL_1_W);
00091     init_icon_pixmap (CST_WINDMILL_2_W);
00092     init_icon_pixmap (CST_WINDMILL_3_W);
00093     /* communes */
00094     init_icon_pixmap (CST_COMMUNE_1);
00095     init_icon_pixmap (CST_COMMUNE_2);
00096     init_icon_pixmap (CST_COMMUNE_3);
00097     init_icon_pixmap (CST_COMMUNE_4);
00098     init_icon_pixmap (CST_COMMUNE_5);
00099     prog_box ("", 18);
00100     init_icon_pixmap (CST_COMMUNE_6);
00101     init_icon_pixmap (CST_COMMUNE_7);
00102     init_icon_pixmap (CST_COMMUNE_8);
00103     init_icon_pixmap (CST_COMMUNE_9);
00104     init_icon_pixmap (CST_COMMUNE_10);
00105     init_icon_pixmap (CST_COMMUNE_11);
00106     init_icon_pixmap (CST_COMMUNE_12);
00107     init_icon_pixmap (CST_COMMUNE_13);
00108     init_icon_pixmap (CST_COMMUNE_14);
00109     /* farms   (3 7 11 and 15 are the only ones needed) */
00110     init_icon_pixmap (CST_FARM_O3);
00111     init_icon_pixmap (CST_FARM_O7);
00112     init_icon_pixmap (CST_FARM_O11);
00113     init_icon_pixmap (CST_FARM_O15);
00114     /* Lt. Industry */
00115     prog_box ("", 24);
00116     init_icon_pixmap (CST_INDUSTRY_L_C);
00117     init_icon_pixmap (CST_INDUSTRY_L_Q1);
00118     init_icon_pixmap (CST_INDUSTRY_L_Q2);
00119     init_icon_pixmap (CST_INDUSTRY_L_Q3);
00120     init_icon_pixmap (CST_INDUSTRY_L_Q4);
00121     init_icon_pixmap (CST_INDUSTRY_L_L1);
00122     init_icon_pixmap (CST_INDUSTRY_L_L2);
00123     init_icon_pixmap (CST_INDUSTRY_L_L3);
00124     init_icon_pixmap (CST_INDUSTRY_L_L4);
00125     init_icon_pixmap (CST_INDUSTRY_L_M1);
00126     init_icon_pixmap (CST_INDUSTRY_L_M2);
00127     init_icon_pixmap (CST_INDUSTRY_L_M3);
00128     init_icon_pixmap (CST_INDUSTRY_L_M4);
00129     init_icon_pixmap (CST_INDUSTRY_L_H1);
00130     init_icon_pixmap (CST_INDUSTRY_L_H2);
00131     prog_box ("", 30);
00132     init_icon_pixmap (CST_INDUSTRY_L_H3);
00133     init_icon_pixmap (CST_INDUSTRY_L_H4);
00134     /* Hv. Industry */
00135     init_icon_pixmap (CST_INDUSTRY_H_C);
00136     init_icon_pixmap (CST_INDUSTRY_H_L1);
00137     init_icon_pixmap (CST_INDUSTRY_H_L2);
00138     init_icon_pixmap (CST_INDUSTRY_H_L3);
00139     init_icon_pixmap (CST_INDUSTRY_H_L4);
00140     init_icon_pixmap (CST_INDUSTRY_H_L5);
00141     init_icon_pixmap (CST_INDUSTRY_H_L6);
00142     init_icon_pixmap (CST_INDUSTRY_H_L7);
00143     init_icon_pixmap (CST_INDUSTRY_H_L8);
00144     init_icon_pixmap (CST_INDUSTRY_H_M1);
00145     init_icon_pixmap (CST_INDUSTRY_H_M2);
00146     init_icon_pixmap (CST_INDUSTRY_H_M3);
00147     init_icon_pixmap (CST_INDUSTRY_H_M4);
00148     prog_box ("", 36);
00149     init_icon_pixmap (CST_INDUSTRY_H_M5);
00150     init_icon_pixmap (CST_INDUSTRY_H_M6);
00151     init_icon_pixmap (CST_INDUSTRY_H_M7);
00152     init_icon_pixmap (CST_INDUSTRY_H_M8);
00153     init_icon_pixmap (CST_INDUSTRY_H_H1);
00154     init_icon_pixmap (CST_INDUSTRY_H_H2);
00155     init_icon_pixmap (CST_INDUSTRY_H_H3);
00156     init_icon_pixmap (CST_INDUSTRY_H_H4);
00157     init_icon_pixmap (CST_INDUSTRY_H_H5);
00158     init_icon_pixmap (CST_INDUSTRY_H_H6);
00159     init_icon_pixmap (CST_INDUSTRY_H_H7);
00160     init_icon_pixmap (CST_INDUSTRY_H_H8);
00161     /* water */
00162     prog_box ("", 42);
00163     init_icon_pixmap (CST_WATER);
00164     init_icon_pixmap (CST_WATER_D);
00165     init_icon_pixmap (CST_WATER_R);
00166     init_icon_pixmap (CST_WATER_U);
00167     init_icon_pixmap (CST_WATER_L);
00168     init_icon_pixmap (CST_WATER_LR);
00169     init_icon_pixmap (CST_WATER_UD);
00170     init_icon_pixmap (CST_WATER_LD);
00171     init_icon_pixmap (CST_WATER_RD);
00172     init_icon_pixmap (CST_WATER_LU);
00173     init_icon_pixmap (CST_WATER_UR);
00174     init_icon_pixmap (CST_WATER_LUD);
00175     init_icon_pixmap (CST_WATER_LRD);
00176     init_icon_pixmap (CST_WATER_LUR);
00177     init_icon_pixmap (CST_WATER_URD);
00178     init_icon_pixmap (CST_WATER_LURD);
00179     /* tracks */
00180     init_icon_pixmap (CST_TRACK_LR);
00181     prog_box ("", 48);
00182     init_icon_pixmap (CST_TRACK_LU);
00183     init_icon_pixmap (CST_TRACK_LD);
00184     init_icon_pixmap (CST_TRACK_UD);
00185     init_icon_pixmap (CST_TRACK_UR);
00186     init_icon_pixmap (CST_TRACK_DR);
00187     init_icon_pixmap (CST_TRACK_LUR);
00188     init_icon_pixmap (CST_TRACK_LDR);
00189     init_icon_pixmap (CST_TRACK_LUD);
00190     init_icon_pixmap (CST_TRACK_UDR);
00191     init_icon_pixmap (CST_TRACK_LUDR);
00192     /* roads */
00193     init_icon_pixmap (CST_ROAD_LR);
00194     init_icon_pixmap (CST_ROAD_LU);
00195     init_icon_pixmap (CST_ROAD_LD);
00196     init_icon_pixmap (CST_ROAD_UD);
00197     init_icon_pixmap (CST_ROAD_UR);
00198     init_icon_pixmap (CST_ROAD_DR);
00199     init_icon_pixmap (CST_ROAD_LUR);
00200     init_icon_pixmap (CST_ROAD_LDR);
00201     prog_box ("", 54);
00202     init_icon_pixmap (CST_ROAD_LUD);
00203     init_icon_pixmap (CST_ROAD_UDR);
00204     init_icon_pixmap (CST_ROAD_LUDR);
00205     /* rail */
00206     init_icon_pixmap (CST_RAIL_LR);
00207     init_icon_pixmap (CST_RAIL_LU);
00208     init_icon_pixmap (CST_RAIL_LD);
00209     init_icon_pixmap (CST_RAIL_UD);
00210     init_icon_pixmap (CST_RAIL_UR);
00211     init_icon_pixmap (CST_RAIL_DR);
00212     init_icon_pixmap (CST_RAIL_LUR);
00213     init_icon_pixmap (CST_RAIL_LDR);
00214     init_icon_pixmap (CST_RAIL_LUD);
00215     init_icon_pixmap (CST_RAIL_UDR);
00216     init_icon_pixmap (CST_RAIL_LUDR);
00217     /* potteries */
00218     prog_box ("", 60);
00219     init_icon_pixmap (CST_POTTERY_0);
00220     init_icon_pixmap (CST_POTTERY_1);
00221     init_icon_pixmap (CST_POTTERY_2);
00222     init_icon_pixmap (CST_POTTERY_3);
00223     init_icon_pixmap (CST_POTTERY_4);
00224     init_icon_pixmap (CST_POTTERY_5);
00225     init_icon_pixmap (CST_POTTERY_6);
00226     init_icon_pixmap (CST_POTTERY_7);
00227     init_icon_pixmap (CST_POTTERY_8);
00228     init_icon_pixmap (CST_POTTERY_9);
00229     init_icon_pixmap (CST_POTTERY_10);
00230     /* mills */
00231     init_icon_pixmap (CST_MILL_0);
00232     init_icon_pixmap (CST_MILL_1);
00233     init_icon_pixmap (CST_MILL_2);
00234     init_icon_pixmap (CST_MILL_3);
00235     init_icon_pixmap (CST_MILL_4);
00236     prog_box ("", 66);
00237     init_icon_pixmap (CST_MILL_5);
00238     init_icon_pixmap (CST_MILL_6);
00239     /* blacksmiths */
00240     init_icon_pixmap (CST_BLACKSMITH_0);
00241     init_icon_pixmap (CST_BLACKSMITH_1);
00242     init_icon_pixmap (CST_BLACKSMITH_2);
00243     init_icon_pixmap (CST_BLACKSMITH_3);
00244     init_icon_pixmap (CST_BLACKSMITH_4);
00245     init_icon_pixmap (CST_BLACKSMITH_5);
00246     init_icon_pixmap (CST_BLACKSMITH_6);
00247     /* residences */
00248     init_icon_pixmap (CST_RESIDENCE_LL);
00249     init_icon_pixmap (CST_RESIDENCE_ML);
00250     init_icon_pixmap (CST_RESIDENCE_HL);
00251     init_icon_pixmap (CST_RESIDENCE_LH);
00252     init_icon_pixmap (CST_RESIDENCE_MH);
00253     init_icon_pixmap (CST_RESIDENCE_HH);
00254     /* coal power */
00255     init_icon_pixmap (CST_POWERS_COAL_EMPTY);
00256     init_icon_pixmap (CST_POWERS_COAL_LOW);
00257     prog_box ("", 72);
00258     init_icon_pixmap (CST_POWERS_COAL_MED);
00259     init_icon_pixmap (CST_POWERS_COAL_FULL);
00260     /* substations */
00261     init_icon_pixmap (CST_SUBSTATION_R);
00262     init_icon_pixmap (CST_SUBSTATION_G);
00263     init_icon_pixmap (CST_SUBSTATION_RG);
00264     /* markets */
00265     init_icon_pixmap (CST_MARKET_EMPTY);
00266     init_icon_pixmap (CST_MARKET_LOW);
00267     init_icon_pixmap (CST_MARKET_MED);
00268     init_icon_pixmap (CST_MARKET_FULL);
00269     /* coal mines */
00270     init_icon_pixmap (CST_COALMINE_EMPTY);
00271     init_icon_pixmap (CST_COALMINE_LOW);
00272     init_icon_pixmap (CST_COALMINE_MED);
00273     init_icon_pixmap (CST_COALMINE_FULL);
00274     /* ore mines */
00275     prog_box ("", 78);
00276     init_icon_pixmap (CST_OREMINE_1);
00277     init_icon_pixmap (CST_OREMINE_2);
00278     init_icon_pixmap (CST_OREMINE_3);
00279     init_icon_pixmap (CST_OREMINE_4);
00280     init_icon_pixmap (CST_OREMINE_5);
00281     init_icon_pixmap (CST_OREMINE_6);
00282     init_icon_pixmap (CST_OREMINE_7);
00283     init_icon_pixmap (CST_OREMINE_8);
00284     /* tips */
00285     init_icon_pixmap (CST_TIP_0);
00286     init_icon_pixmap (CST_TIP_1);
00287     init_icon_pixmap (CST_TIP_2);
00288     init_icon_pixmap (CST_TIP_3);
00289     init_icon_pixmap (CST_TIP_4);
00290     init_icon_pixmap (CST_TIP_5);
00291     init_icon_pixmap (CST_TIP_6);
00292     init_icon_pixmap (CST_TIP_7);
00293     init_icon_pixmap (CST_TIP_8);
00294     /* rockets */
00295     prog_box ("", 84);
00296     init_icon_pixmap (CST_ROCKET_1);
00297     init_icon_pixmap (CST_ROCKET_2);
00298     init_icon_pixmap (CST_ROCKET_3);
00299     init_icon_pixmap (CST_ROCKET_4);
00300     init_icon_pixmap (CST_ROCKET_5);
00301     init_icon_pixmap (CST_ROCKET_6);
00302     init_icon_pixmap (CST_ROCKET_7);
00303     init_icon_pixmap (CST_ROCKET_FLOWN);
00304     /* fire stations */
00305     init_icon_pixmap (CST_FIRESTATION_1);
00306     init_icon_pixmap (CST_FIRESTATION_2);
00307     init_icon_pixmap (CST_FIRESTATION_3);
00308     init_icon_pixmap (CST_FIRESTATION_4);
00309     init_icon_pixmap (CST_FIRESTATION_5);
00310     init_icon_pixmap (CST_FIRESTATION_6);
00311     init_icon_pixmap (CST_FIRESTATION_7);
00312     init_icon_pixmap (CST_FIRESTATION_8);
00313     init_icon_pixmap (CST_FIRESTATION_9);
00314     init_icon_pixmap (CST_FIRESTATION_10);
00315     /* cricket */
00316     prog_box ("", 90);
00317     init_icon_pixmap (CST_CRICKET_1);
00318     init_icon_pixmap (CST_CRICKET_2);
00319     init_icon_pixmap (CST_CRICKET_3);
00320     init_icon_pixmap (CST_CRICKET_4);
00321     init_icon_pixmap (CST_CRICKET_5);
00322     init_icon_pixmap (CST_CRICKET_6);
00323     init_icon_pixmap (CST_CRICKET_7);
00324     /* fire */
00325     init_icon_pixmap (CST_FIRE_1);
00326     init_icon_pixmap (CST_FIRE_2);
00327     init_icon_pixmap (CST_FIRE_3);
00328     init_icon_pixmap (CST_FIRE_4);
00329     init_icon_pixmap (CST_FIRE_5);
00330     init_icon_pixmap (CST_FIRE_DONE1);
00331     init_icon_pixmap (CST_FIRE_DONE2);
00332     init_icon_pixmap (CST_FIRE_DONE3);
00333     init_icon_pixmap (CST_FIRE_DONE4);
00334 
00335     /* others */
00336     init_icon_pixmap (CST_PARKLAND_PLANE);
00337     init_icon_pixmap (CST_RECYCLE);
00338     init_icon_pixmap (CST_HEALTH);
00339     init_icon_pixmap (CST_BURNT);
00340     init_icon_pixmap (CST_MONUMENT_5);
00341     init_icon_pixmap (CST_SCHOOL);
00342     init_icon_pixmap (CST_SHANTY);
00343     prog_box ("", 96);
00344     init_icon_pixmap (CST_POWERS_SOLAR);
00345     init_icon_pixmap (CST_UNIVERSITY);
00346     init_icon_pixmap (CST_EX_PORT);
00347 }
00348 
00349 void
00350 initialize_pixmap (void)
00351 {
00352     int i;
00353     pixmap_height = display.winH - 2*borderx;
00354     pixmap_width = display.winW - 2*bordery;
00355     pixmap = (char*) malloc (pixmap_height * pixmap_width * sizeof(char));
00356     for (i = 0; i < pixmap_height * pixmap_width; i++) {
00357         pixmap[i] = 0;
00358     }
00359 }
00360 
00361 void
00362 free_pixmap (void)
00363 {
00364     free (pixmap);
00365     pixmap = 0;
00366 }
00367 
00368 void
00369 resize_pixmap (int new_width, int new_height)
00370 {
00371     int i;
00372     if (new_width > pixmap_width || new_height > pixmap_height) {
00373         char* new_pixmap;
00374         if (new_width < pixmap_width) new_width = pixmap_width;
00375         if (new_height < pixmap_height) new_height = pixmap_height;
00376         new_pixmap = (char*) malloc (new_height * new_width * sizeof(char));
00377         for (i = 0; i < pixmap_height * pixmap_width; i++) {
00378             pixmap[i] = 0;   /* GCS -- Why? */
00379         }
00380         free (pixmap);
00381         pixmap = new_pixmap;
00382         pixmap_width = new_width;
00383         pixmap_height = new_height;
00384     }
00385 }
00386 
00387 /* KBR 10/19/2002 MSVC was not happy with this being inline for release build */
00388 /* GCS 02/02/2003 That's because of the external reference in lcwin32.c. 
00389                   For some reason, MSVC likes it in the header, while gcc 
00390                   likes it in the file.  Still need to fix this in autoconf,
00391                   but for now this will do. */
00392 #if !defined (WIN32)
00393 inline int 
00394 pixmap_index (int x, int y)
00395 {
00396     return y*pixmap_width + x;
00397 }
00398 #endif
00399 
00400 int 
00401 pixmap_getpixel (int x, int y)
00402 {
00403     return (int) pixmap[pixmap_index(x,y)];
00404 }
00405 
00406 void
00407 pixmap_setpixel (int x, int y, int col)
00408 {
00409     pixmap[pixmap_index(x,y)] = col;
00410 }
00411 
00412 void
00413 pixmap_hline (int x1, int y1, int x2, int col)
00414 {
00415     int i, j;
00416     i = pixmap_index (x1, y1);
00417     for (j = 0; j <= x2 - x1; j++)
00418         pixmap[i+j] = col;
00419 }
00420 
00421 void
00422 pixmap_vline (int x1, int y1, int y2, int col)
00423 {
00424     int i, j;
00425     i = pixmap_index (x1, y1);
00426     for (j = 0; j <= y2 - y1; j++)
00427         pixmap[i+j*pixmap_width] = col;
00428 }
00429 
00430 void
00431 pixmap_fillbox (int x, int y, int w, int h, int col)
00432 {
00433     int xx, yy;
00434     int i = pixmap_index (x, y);
00435     for (yy = y; yy < y + h; yy++) {
00436         for (xx = x; xx < x + w; xx++) {
00437             pixmap[i++] = col;
00438         }
00439         i += pixmap_width - w;
00440     }
00441 }
00442 
00443 void
00444 pixmap_putbox (char* src, int src_x, int src_y, int src_w,
00445                int dst_x, int dst_y, int w, int h)
00446 {
00447     int x, y;
00448     int i = pixmap_index (dst_x, dst_y);
00449     int j = src_x + src_y * src_w;
00450     for (y = src_y; y < src_y + h; y++) {
00451         for (x = src_x; x < src_x + w; x++) {
00452             pixmap[i++] = src[j++];
00453         }
00454         i += pixmap_width - w;
00455         j += src_w - w;
00456     }
00457 }
00458 
00459 void
00460 update_pixmap (int x1, int y1, int sizex, int sizey, int dx, int dy,
00461                int real_size, char *g)
00462 {
00463     /* Copy graphic from g into pixmap */
00464     char *i, *j;
00465     int x, y;
00466     for (y = 0; y < sizey; y++) {
00467         i = pixmap + pixmap_index (dx, dy + y);
00468         j = (g + ((y1 + y) * real_size * 16 + x1));
00469         for (x = 0; x < sizex; x++)
00470             *(i++) = *(j++);
00471     }
00472 }
00473 
00474 #endif /* USE_PIXMAPS */

Generated on Sun Dec 26 11:23:26 2004 for lincity by  doxygen 1.3.9.1