home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / REND.LZH / REND / MAP.C < prev    next >
C/C++ Source or Header  |  1996-07-24  |  16KB  |  733 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <string.h>
  5.  
  6. #include "reader.h"
  7. #include "word.h"
  8. #include "glib.h"
  9. #include "rend.h"
  10. #ifndef NO_PICLIB
  11. #include "piclib.h"
  12. #endif
  13.  
  14. static    Map        *maptable ;
  15. static    int        mapnum ;
  16.  
  17. #ifndef NO_PICLIB
  18. static    Pixel    pix[4096];
  19. #endif
  20.  
  21. /*
  22.     proto map.c -s > temp
  23. */
  24. #ifdef REFMAP
  25. static    void    refmapset(Map *, char *);
  26. #endif
  27. static    void    mapset( Map*, Pointer(Atr*) );
  28. static    void    maperror( char*, char* );
  29.  
  30. extern FILE *logfp;
  31.  
  32. /*    初期化    */
  33. int        MapInit( patr )
  34. Pointer(Atr*)    patr ;
  35. {
  36.     Atr        *atr ;
  37.     Map        *mp ;
  38.     Pointer(Atr*)    p ;
  39.     int        lockatr ;
  40.  
  41.     mapnum = 0 ;
  42.     for( atr = pointer( patr ) ; atr != NULL ; atr = pointer( atr->next ) )
  43.     {
  44.         if ( atr->maptype == COLOR_MAP )
  45.             mapnum ++ ;
  46.     }
  47. #ifdef REFMAP
  48.     mapnum += RefMap;
  49. #endif
  50. #ifdef BGMAKE
  51.     if (BgMake) mapnum += 12;
  52. #endif
  53.  
  54.     if ( mapnum == 0 )
  55.         return( 0 );
  56.  
  57.     maptable = tempalloc( mapnum * sizeof( Map ) );
  58.     mp = maptable ;
  59.     fprintf(stderr, "Reading Map File\n");
  60. #ifdef WINDOWS
  61.     if (logfp)
  62.         fprintf(logfp, "Reading Map File\n");
  63. #endif
  64.     for( p = patr ; p != NULL ; p = atr->next )
  65.     {
  66.         atr = pointer( p );
  67.         lockatr = datalock();
  68.         if ( atr->maptype == COLOR_MAP )
  69.         {
  70.             Pointer(Atr*) q;
  71.             Atr *checkatr;
  72.             int flag = FALSE;
  73.             fprintf(stderr, "%s(%s)\n", atr->filename, atr->name);
  74. #ifdef WINDOWS
  75.             if (logfp)
  76.                 fprintf(logfp, "%s(%s)\n", atr->filename, atr->name);
  77. #endif
  78.             for (q = patr; q != p && q != NULL; q = checkatr->next) {
  79.                 checkatr = pointer(q);
  80.                 if (checkatr->maptype == COLOR_MAP
  81.                  && strcmp(checkatr->filename, atr->filename) == 0
  82.                  && checkatr->mapwind[0][0] == atr->mapwind[0][0]
  83.                  && checkatr->mapwind[0][1] == atr->mapwind[0][1]
  84.                  && checkatr->mapwind[1][0] == atr->mapwind[1][0]
  85.                  && checkatr->mapwind[1][1] == atr->mapwind[1][1]) {
  86.                     Map *checkmp;
  87.                     for (checkmp=maptable; checkmp != mp; ++checkmp) {
  88.                         if (checkmp->atr == q) {
  89.                             mp->h = checkmp->h;
  90.                             mp->v = checkmp->v;
  91.                             mp->buf = checkmp->buf;
  92.                             mp->fullcolor = checkmp->fullcolor;
  93.                             mp->atr = p;
  94.                             mp++;
  95.                             break;
  96.                         }
  97.                     }
  98.                     assert(checkmp != mp);
  99.                     flag = TRUE;
  100.                     break;
  101.                 }
  102.             }
  103.             if (!flag) {
  104.                 mapset( mp++, p );
  105.             }
  106.         }
  107.         dataunlock( lockatr );
  108.     }
  109. #ifdef REFMAP
  110.     if (RefMap) {
  111.         int i, j;
  112.         int found = FALSE;
  113.         for (i = 0; i < RefMap; ++i) {
  114.             Pointer(Atr*) q;
  115.             Atr *checkatr;
  116.             j = strlen(RefMapFile[i]);
  117. #ifdef NO_PICLIB
  118.             if (j < 4 || strcmpi(RefMapFile[i] + j-4, ".PIC") != 0) {
  119.                 strcat(RefMapFile[i], ".PIC");
  120.             }
  121. #else
  122.             if (j < 4 || RefMapFile[i][j-4] != '.') {
  123.                 strcat(RefMapFile[i], ".PIC");
  124.             }
  125. #endif
  126.             fprintf(stderr, "%s(環境マッピング)\n", RefMapFile[i]);
  127. #ifdef WINDOWS
  128.             if (logfp)
  129.                 fprintf(logfp, "%s(環境マッピング)\n", RefMapFile[i]);
  130. #endif
  131.             for (q = patr; q != p && q != NULL; q = checkatr->next) {
  132.                 checkatr = pointer(q);
  133.                 if (checkatr->maptype == COLOR_MAP
  134.                  && strcmp(checkatr->filename, RefMapFile[i]) == 0) {
  135.                     Map *checkmp;
  136.                     for (checkmp=maptable; checkmp != mp; ++checkmp) {
  137.                         if (checkmp->atr == q) {
  138.                             break;
  139.                         }
  140.                     }
  141.                     if (checkmp != mp
  142.                      && checkmp->wh == checkmp->h
  143.                      && checkmp->wv == checkmp->v) {
  144.                         RefMapData[i] = checkmp;
  145.                         found = TRUE;
  146.                         break;
  147.                     }
  148.                 }
  149.             }
  150.             if (found == FALSE) {
  151.                 for (j = 0; j < i; ++j) {
  152.                     if (strcmp(RefMapFile[j], RefMapFile[i]) == 0) {
  153.                         RefMapData[i] = RefMapData[j];
  154.                         found = TRUE;
  155.                         break;
  156.                     }
  157.                 }
  158.             }
  159.             if (found == FALSE) {
  160.                 refmapset( RefMapData[i] = mp++, RefMapFile[i] );
  161.             }
  162.         }
  163.     }
  164. #endif
  165. #ifdef BGMAKE
  166.     if (BgMake) {
  167.         int i, j;
  168.         int found = FALSE;
  169.  
  170.         BgMakeAtr[0] = dataalloc(sizeof(Atr) * BgMake);
  171.         memset(BgMakeAtr[0], 0, sizeof(Atr));
  172.         BgMakeAtr[0]->amb[0] = BgMakeAtr[0]->amb[1] = BgMakeAtr[0]->amb[2] = COLOR_POINT;
  173.         BgMakeAtr[0]->col[0] = BgMakeAtr[0]->col[1] = BgMakeAtr[0]->col[2] = COLOR_POINT;
  174.         BgMakeAtr[0]->rgbflag = TRUE;
  175.         BgMakeAtr[0]->maptype = COLOR_MAP;
  176.         BgMakeAtr[0]->mapsize[0][0] = BgMakeAtr[0]->mapsize[0][1] = 0.0;
  177.         BgMakeAtr[0]->mapsize[1][0] = BgMakeAtr[0]->mapsize[1][1] = 1.0;
  178.         BgMakeAtr[0]->mapwind[0][0] = BgMakeAtr[0]->mapwind[0][1] = 0.0;
  179.         for (i = 1; i < BgMake; ++i) {
  180.             BgMakeAtr[i] = BgMakeAtr[i-1] + 1;
  181.             memcpy(BgMakeAtr[i], BgMakeAtr[i-1], sizeof(Atr));
  182.         }
  183.  
  184.         for (i = 0; i < BgMake; ++i) {
  185.             Pointer(Atr*) q;
  186.             Atr *checkatr;
  187.             found = FALSE;
  188.             j = strlen(BgMakeFile[i]);
  189.             if (j < 4 || BgMakeFile[i][j-4] != '.') {
  190.                 strcat(BgMakeFile[i], ".PIC");
  191.             }
  192.             fprintf(stderr, "%s(背景球)\n", BgMakeFile[i]);
  193. #ifdef WINDOWS
  194.             if (logfp)
  195.                 fprintf(logfp, "%s(背景球)\n", BgMakeFile[i]);
  196. #endif
  197.             for (q = patr; q != p && q != NULL; q = checkatr->next) {
  198.                 checkatr = pointer(q);
  199.                 if (checkatr->maptype == COLOR_MAP
  200.                  && strcmp(checkatr->filename, BgMakeFile[i]) == 0) {
  201.                     Map *checkmp;
  202.                     for (checkmp=maptable; checkmp != mp; ++checkmp) {
  203.                         if (checkmp->atr == q) {
  204.                             break;
  205.                         }
  206.                     }
  207.                     if (checkmp != mp
  208.                      && checkmp->wh == checkmp->h
  209.                      && checkmp->wv == checkmp->v) {
  210.                         mp->h = checkmp->h;
  211.                         mp->v = checkmp->v;
  212.                         mp->buf = checkmp->buf;
  213.                         mp->fullcolor = checkmp->fullcolor;
  214.                         BgMakeData[i] = mp++;
  215.                         found = TRUE;
  216.                         break;
  217.                     }
  218.                 }
  219.             }
  220.             if (found == FALSE) {
  221.                 for (j = 0; j < RefMap; ++j) {
  222.                     if (strcmp(BgMakeFile[i], RefMapFile[j]) == 0) {
  223.                         mp->h = RefMapData[j]->h;
  224.                         mp->v = RefMapData[j]->v;
  225.                         mp->buf = RefMapData[j]->buf;
  226.                         mp->fullcolor = RefMapData[j]->fullcolor;
  227.                         BgMakeData[i] = mp++;
  228.  
  229.                         found = TRUE;
  230.                         break;
  231.                     }
  232.                 }
  233.             }
  234.             if (found == FALSE) {
  235.                 for (j = 0; j < i; ++j) {
  236.                     if (strcmp(BgMakeFile[j], BgMakeFile[i]) == 0) {
  237.                         mp->h = BgMakeData[j]->h;
  238.                         mp->v = BgMakeData[j]->v;
  239.                         mp->buf = BgMakeData[j]->buf;
  240.                         mp->fullcolor = BgMakeData[j]->fullcolor;
  241.                         BgMakeData[i] = mp++;
  242.                         found = TRUE;
  243.                         break;
  244.                     }
  245.                 }
  246.             }
  247.             if (found == FALSE) {
  248.                 refmapset( BgMakeData[i] = mp++, BgMakeFile[i] );
  249.             }
  250.             BgMakeAtr[i]->mapwind[1][0] = BgMakeData[i]->h-1;
  251.             BgMakeAtr[i]->mapwind[1][1] = BgMakeData[i]->v-1;
  252.             BgMakeData[i]->atr = BgMakeAtr[i];
  253.         }
  254.     }
  255. #endif
  256.     return( mapnum );
  257. }
  258.  
  259. #ifndef NO_PICLIB
  260. static inline unsigned short Convert_24_16(Pixel p)
  261. {
  262.     return ((p & 0xf8000000) >> 16)
  263.          | ((p & 0x00f80000) >> 13)
  264.          | ((p & 0x0000f800) >> 10)
  265.          | ((p & 0x00000080) ? 1 : 0);
  266. }
  267. #endif
  268.  
  269.  
  270.  
  271. #ifdef REFMAP
  272. static void    refmapset(mp, file)
  273. Map *mp;
  274. char *file;
  275. {
  276. #ifdef NO_PICLIB
  277.     int        i ;
  278.     int        x, y ;
  279.     int        code, len ;
  280.     ColorCode    *buf ;
  281.     FILE    *fp ;
  282.     unsigned short codes;
  283.     int mode;
  284.     int        mapfullcolorflag;
  285.  
  286.     /*    画像ファイル読み込み    */
  287.     errlevel = 0 ;
  288.     mp->atr = NULL;
  289.     fileopen( file );
  290.  
  291.     if ( wordid != WORD_IMAGE )
  292.         maperror( "%s は画像ファイルではありません。", file );
  293.     get();
  294.  
  295.     while( ! end_of_file )
  296.     {
  297.         switch( wordid )
  298.         {
  299.             case WORD_COL :
  300.                 get();
  301.                 mode = getint();
  302.                 if (mode == 16) {
  303.                     mapfullcolorflag = FALSE;
  304.                 } else {
  305.                     mapfullcolorflag = TRUE;
  306.                 }
  307.                 break;
  308.             case WORD_PXN :
  309.                 get();
  310.                 mp->h = getint();
  311.                 mp->v = getint();
  312.                 break ;
  313.             case WORD_MOD :
  314.                 get();
  315.                 if ( wordid != WORD_RLN )
  316.                 {
  317.                     maperror( "画像ファイル %s は読み込めません。",file );
  318.                 }
  319.                 break ;
  320.         }
  321.         get();
  322.     }
  323.     fileclose();
  324.     /*    バッファの確保    */
  325.  
  326.     mp->buf = (Pointer(ColorCode*)*)tempalloc( mp->v * sizeof( Pointer(ColorCode*) ) );
  327.     mp->fullcolor = mapfullcolorflag;
  328.     if (mapfullcolorflag) {
  329.         for( i = 0 ; i < mp->v ; ++i )
  330.             mp->buf[i] = dataalloc( mp->h * sizeof( ColorCode ) );
  331.     } else {
  332.         for( i = 0 ; i < mp->v ; ++i )
  333.             mp->buf[i] = dataalloc( mp->h * sizeof( unsigned short ) );
  334.     }
  335.     /*    データの読み込み    */
  336.     fp = fopen( file, "rb" );
  337.     while( fgetc(fp) != 0x1A ) ;
  338.     for( i = 0 ; i < 4 ; ++i )
  339.         fgetc( fp );
  340.  
  341.     if (mapfullcolorflag) {
  342.         unsigned long c;
  343.         c = getlong(fp);
  344.         code = (c & 0xffffff00L) | ((c & 0x00000080L) ? 1 : 0);
  345.         len = c & 0x7f;
  346.     } else {
  347.         codes = getshort(fp);
  348.         len = getshort( fp );
  349.     }
  350.     if (mapfullcolorflag) {
  351.         for( y = 0 ; y < mp->v ; ++y )
  352.         {
  353.             (*interrupt)();
  354.  
  355.             buf = pointer( mp->buf[y] );
  356.             for( x = 0 ; x < mp->h ; ++x )
  357.             {
  358.                 buf[ x ] = code ;
  359.                 len -- ;
  360.                 if ( len == 0 )
  361.                 {
  362.                     unsigned long c;
  363.                     c = getlong(fp);
  364.                     code = (c & 0xffffff00L) | ((c & 0x00000080L) ? 1 : 0);
  365.                     len = c & 0x7f;
  366.                 }
  367.             }
  368.         }
  369.     } else {
  370.         for( y = 0 ; y < mp->v ; ++y )
  371.         {
  372.             unsigned short *bufs;
  373.             (*interrupt)();
  374.  
  375.             bufs = (unsigned short *)pointer( mp->buf[ y ] );
  376.             for( x = 0 ; x < mp->h ; ++x )
  377.             {
  378.                 bufs[ x ] = codes ;
  379.                 len -- ;
  380.                 if ( len == 0 )
  381.                 {
  382.                     codes = getshort(fp);
  383.                     len = getshort( fp );
  384.                 }
  385.             }
  386.         }
  387.     }
  388.     fclose( fp );
  389. #else
  390.     int        i ;
  391.     int        x, y ;
  392.     ColorCode    *buf ;
  393.     int mode;
  394.     PicData *pd;
  395.     Pixel *p;
  396.  
  397.     /*    画像ファイル読み込み    */
  398.     errlevel = 0 ;
  399.     mp->atr = NULL;
  400.     pd = PicReadOpen(file);
  401.     if (pd == NULL) {
  402.         maperror( "%s の読み込みに失敗しました。", file );
  403.     }
  404.     mp->h = pd->pixelX;
  405.     mp->v = pd->pixelY;
  406.  
  407.     mp->buf = (Pointer(ColorCode*)*)tempalloc( mp->v * sizeof( Pointer(ColorCode*) ) );
  408.     mp->fullcolor = pd->fullcolor;
  409.     if (mp->fullcolor) {
  410.         for( i = 0 ; i < mp->v ; ++i )
  411.             mp->buf[i] = dataalloc( mp->h * sizeof( ColorCode ) );
  412.     } else {
  413.         for( i = 0 ; i < mp->v ; ++i )
  414.             mp->buf[i] = dataalloc( mp->h * sizeof( unsigned short ) );
  415.     }
  416.     /*    データの読み込み    */
  417.  
  418.     for( y = 0 ; y < mp->v ; ++y )
  419.     {
  420.         unsigned short *bufs;
  421.         (*interrupt)();
  422.         if (PicInputLine(pd, pix) == FALSE) {
  423.             maperror( "読み込みに失敗しました。", "");
  424.         }
  425.         if (mp->fullcolor) {
  426.             buf = pointer( mp->buf[y] );
  427.             for( x = 0 ; x < mp->h ; ++x )
  428.             {
  429.                 buf[ x ] = (pix[x] & 0xffffff00) | ((pix[x] & 0x00000080L) ? 1 : 0);
  430.             }
  431.         } else {
  432.             bufs = (unsigned short *)pointer( mp->buf[ y ] );
  433.             for( x = 0 ; x < mp->h ; ++x )
  434.             {
  435.                 bufs[ x ] = Convert_24_16(pix[x]);
  436.             }
  437.         }
  438.     }
  439.     PicClose(pd);
  440. #endif
  441. }
  442. #endif
  443.  
  444. static    void    mapset( mp, patr )
  445. Map        *mp ;
  446. Pointer(Atr*)    patr ;
  447. {
  448.     int        i ;
  449.     int        h, v, x, y ;
  450. #ifdef NO_PICLIB
  451.     int        len ;
  452.     unsigned long code;
  453. #else
  454.     PicData *pd;
  455. #endif
  456.     int        wx1, wy1, wx2, wy2 ;
  457.     ColorCode    *buf ;
  458.     Atr        *atr ;
  459.     FILE    *fp ;
  460.     unsigned short codes;
  461.     int mode;
  462.     int        mapfullcolorflag;
  463.  
  464.     atr = pointer( patr );
  465.  
  466.     wx1 = (int)atr->mapwind[0][0] ;
  467.     wy1 = (int)atr->mapwind[0][1] ;
  468.     wx2 = (int)atr->mapwind[1][0] ;
  469.     wy2 = (int)atr->mapwind[1][1] ;
  470.  
  471.     if ( wx1 < 0 || wy1 < 0 )
  472.         maperror( "ウインドウの指定が不正です。", NULL );
  473.  
  474.     mp->h = wx2 - wx1 + 1 ;
  475.     mp->v = wy2 - wy1 + 1 ;
  476.     mp->atr = patr ;
  477.  
  478.     (*interrupt)();
  479.  
  480.     /*    画像ファイル読み込み    */
  481.     errlevel = 0 ;
  482. #ifdef NO_PICLIB
  483.     fileopen( atr->filename );
  484.  
  485.     if ( wordid != WORD_IMAGE )
  486.         maperror( "%s は画像ファイルではありません。", atr->filename );
  487.     get();
  488.  
  489.     while( ! end_of_file )
  490.     {
  491.         switch( wordid )
  492.         {
  493.             case WORD_COL :
  494.                 get();
  495.                 mode = getint();
  496.                 if (mode == 16) {
  497.                     mapfullcolorflag = FALSE;
  498.                 } else {
  499.                     mapfullcolorflag = TRUE;
  500.                 }
  501.                 break;
  502.             case WORD_PXN :
  503.                 get();
  504.                 h = getint();
  505.                 v = getint();
  506. #ifdef REFMAP
  507.                 mp->wh = h;
  508.                 mp->wv = v;
  509. #endif
  510.                 if ( h < wx2 || v < wy2 )
  511.                     maperror( "ウインドウの指定が不正です。", NULL );
  512.                 break ;
  513.             case WORD_MOD :
  514.                 get();
  515.                 if ( wordid != WORD_RLN )
  516.                 {
  517.                     maperror( "画像ファイル %s は読み込めません。",
  518.                                  atr->filename );
  519.                 }
  520.                 break ;
  521.         }
  522.         get();
  523.     }
  524.     fileclose();
  525.     /*    バッファの確保    */
  526.  
  527.     mp->buf = (Pointer(ColorCode*)*)tempalloc( mp->v * sizeof( Pointer(ColorCode*) ) );
  528.     mp->fullcolor = mapfullcolorflag;
  529.     if (mapfullcolorflag) {
  530.         for( i = 0 ; i < mp->v ; ++i )
  531.             mp->buf[i] = dataalloc( mp->h * sizeof( ColorCode ) );
  532.     } else {
  533.         for( i = 0 ; i < mp->v ; ++i )
  534.             mp->buf[i] = dataalloc( mp->h * sizeof( unsigned short ) );
  535.     }
  536.     /*    データの読み込み    */
  537.     fp = fopen( atr->filename, "rb" );
  538.     while( fgetc(fp) != 0x1A ) ;
  539.     for( i = 0 ; i < 4 ; ++i )
  540.         fgetc( fp );
  541.  
  542.     if (mapfullcolorflag) {
  543.         unsigned long c;
  544.         c = getlong(fp);
  545.         code = (c & 0xffffff00L) | ((c & 0x00000080L) ? 1 : 0);
  546.         len = (int)(c & 0x7fL);
  547.     } else {
  548. /*        code = X68kcolorToColorCode(getshort( fp ));*/
  549.         codes = getshort(fp);
  550.         len = getshort( fp );
  551.     }
  552.     if (mapfullcolorflag) {
  553.         for( y = 0 ; y <= wy2 ; ++y )
  554.         {
  555.             (*interrupt)();
  556.  
  557.             if ( wy1 <= y && y <= wy2 )
  558.             {
  559.                 buf = pointer( mp->buf[ y - wy1 ] );
  560.             }
  561.             for( x = 0 ; x < h ; ++x )
  562.             {
  563.                 if ( wx1 <= x && x <= wx2 && wy1 <= y && y <= wy2 )
  564.                 {
  565.                     buf[ x - wx1 ] = code ;
  566.                 }
  567.                 len -- ;
  568.                 if ( len == 0 )
  569.                 {
  570.                     unsigned long c;
  571.                     c = getlong(fp);
  572.                     code = (c & 0xffffff00L) | ((c & 0x00000080L) ? 1 : 0);
  573.                     len = (int)(c & 0x7fL);
  574.                 }
  575.             }
  576.         }
  577.     } else {
  578.         for( y = 0 ; y <= wy2 ; ++y )
  579.         {
  580.             unsigned short *bufs;
  581.             (*interrupt)();
  582.  
  583.             if ( wy1 <= y && y <= wy2 )
  584.             {
  585.                 bufs = (unsigned short *)pointer( mp->buf[ y - wy1 ] );
  586.             }
  587.             for( x = 0 ; x < h ; ++x )
  588.             {
  589.                 if ( wx1 <= x && x <= wx2 && wy1 <= y && y <= wy2 )
  590.                 {
  591.                     bufs[ x - wx1 ] = codes ;
  592.                 }
  593.                 len -- ;
  594.                 if ( len == 0 )
  595.                 {
  596.                     codes = getshort(fp);
  597.                     len = getshort( fp );
  598.                 }
  599.             }
  600.         }
  601.     }
  602.     fclose( fp );
  603. #else
  604.     pd = PicReadOpen(atr->filename);
  605.     if ( pd == NULL) {
  606.         maperror( "%s の読み込みに失敗しました。", atr->filename );
  607.     }
  608.     h = pd->pixelX;
  609.     v = pd->pixelY;
  610. #ifdef REFMAP
  611.     mp->wh = h;
  612.     mp->wv = v;
  613. #endif
  614.     if ( h < wx2 || v < wy2 )
  615.         maperror( "ウインドウの指定が不正です。", NULL );
  616.  
  617.     mp->buf = (Pointer(ColorCode*)*)tempalloc( mp->v * sizeof( Pointer(ColorCode*) ) );
  618.     mp->fullcolor = pd->fullcolor;
  619.     if (mp->fullcolor) {
  620.         for( i = 0 ; i < mp->v ; ++i )
  621.             mp->buf[i] = dataalloc( mp->h * sizeof( ColorCode ) );
  622.     } else {
  623.         for( i = 0 ; i < mp->v ; ++i )
  624.             mp->buf[i] = dataalloc( mp->h * sizeof( unsigned short ) );
  625.     }
  626.     for( y = 0 ; y < wy1 ; ++y )
  627.     {
  628.         (*interrupt)();
  629.         PicInputLine(pd, pix);
  630.     }
  631.     for (y = wy1; y <= wy2; y++) {
  632.         int i = 0;
  633.         (*interrupt)();
  634.         PicInputLine(pd, pix);
  635.         if (mp->fullcolor) {
  636.             buf = pointer( mp->buf[ y - wy1 ] );
  637.             for( x = wx1 ; x <= wx2 ; ++x )
  638.             {
  639.                 buf[i++] = (pix[x] & 0xffffff00) | ((pix[x] & 0x00000080L) ? 1 : 0);
  640.             }
  641.         } else {
  642.             unsigned short *bufs;
  643.             bufs = (unsigned short *)pointer( mp->buf[ y - wy1 ] );
  644.             for( x = wx1 ; x <= wx2 ; ++x )
  645.             {
  646.                 bufs[i++] = Convert_24_16(pix[x]);
  647.             }
  648.         }
  649.     }
  650.     PicClose(pd);
  651. #endif
  652. }
  653.  
  654. void    SetMapTable( atrtable, puv, n, patr )
  655. AtrTable    *atrtable ;
  656. Pointer(Point*)        puv ;
  657. int            n ;
  658. Pointer(Atr*)        patr ;
  659. {
  660.     int        i, m ;
  661.     Map        *mp ;
  662.     Atr        *atr ;
  663.     Point    *uv ;
  664.     Float    tu, tv, su, sv, wu, wv ;
  665.  
  666.     /*    検索    */
  667.     mp = maptable ;
  668.     for( m = 0 ; m < mapnum ; ++m )
  669.     {
  670.         if ( mp->atr == patr )
  671.             break ;
  672.         mp++ ;
  673.     }
  674.     assert( m < mapnum );
  675.     /*    座標変換    */
  676.     atr = pointer( patr );
  677.     assert( atr->maptype == COLOR_MAP );
  678.  
  679.     su = atr->mapsize[0][0] ;
  680.     sv = atr->mapsize[0][1] ;
  681.     wu = atr->mapwind[0][0] ;
  682.     wv = atr->mapwind[0][1] ;
  683.     tu = ( atr->mapwind[1][0] - wu ) / ( atr->mapsize[1][0] - su );
  684.     tv = ( atr->mapwind[1][1] - wv ) / ( atr->mapsize[1][1] - sv );
  685.     uv = (Point*)pointer( puv );
  686.     for( i = 0 ; i < n ; ++i )
  687.     {
  688.         atrtable[i].map.curuv[0] = (long)( ( uv[i][0] - su ) * tu * 65536.0 ) ;
  689.         atrtable[i].map.curuv[1] = (long)( ( uv[i][1] - sv ) * tv * 65536.0 ) ;
  690.         atrtable[i].map.map = mp ;
  691.     }
  692. }
  693.  
  694. #ifdef NO_PICLIB
  695. unsigned short getshort( fp )
  696. FILE    *fp ;
  697. {
  698.     int        n ;
  699.  
  700.     n = fgetc( fp ) << 8 ;
  701.     n += fgetc( fp ) ;
  702.     return( n );
  703.  
  704. }
  705.  
  706. unsigned long    getlong(FILE *fp)
  707. {
  708.     long n;
  709.     n = fgetc( fp ) << 24 ;
  710.     n += fgetc( fp ) << 16 ;
  711.     n += fgetc( fp ) << 8 ;
  712.     n += fgetc( fp );
  713.     return n;
  714. }
  715. #endif
  716.  
  717. static    void    maperror( msg, arg )
  718. char    *msg ;
  719. char    *arg ;
  720. {
  721.     char    buf[100] ;
  722.  
  723. #ifdef MESSAGE
  724.     extern int printwarning(const char *format, ...);
  725.     printwarning( msg, arg );
  726. #endif
  727.     sprintf( buf, msg, arg );
  728.     fprintf( stderr, "%s\n", buf );
  729.     fprintf( stderr, "エラーが発生しました。\n\n" );
  730.     exit( 1 );
  731. }
  732.  
  733.