| 669 | // world in the appropriate projection for various Astrolog charts. |
| 670 | |
| 671 | flag FBmpDrawMap() |
| 672 | { |
| 673 | Bitmap *bmp = &gi.bmp; |
| 674 | int nScl = 1, yWin2, xc, yc, zc, x1, x2, y1, y2, xi, yi, n, n2; |
| 675 | real deg = Mod(rDegMax - gs.rRot), lonS, latS, rxc, ryc, rzc, |
| 676 | lon, lat, lat0, rT, rLen, sint, cost, sina, cosa; |
| 677 | KV kv; |
| 678 | flag fDoEclipse = fFalse; |
| 679 | |
| 680 | // Do nothing if not drawing bitmaps, or if the Earth bitmap fails to load. |
| 681 | if (!gi.fBmp || (gi.fFile && gs.ft != ftBmp)) |
| 682 | return fFalse; |
| 683 | if (gi.bmpWorld.rgb == NULL && !FLoadBmp(BITMAP_EARTH, &gi.bmpWorld, fFalse)) |
| 684 | return fFalse; |
| 685 | yWin2 = gs.yWin; |
| 686 | if (gs.fText && fMap) |
| 687 | yWin2 -= (yFont2*gi.nScaleText + 2)*gi.nScaleT; |
| 688 | #ifdef WINANY |
| 689 | if (!gi.fFile) { |
| 690 | if (!FAllocateBmp(&wi.bmpWin, gs.xWin, yWin2)) |
| 691 | return fFalse; |
| 692 | bmp = &wi.bmpWin; |
| 693 | } |
| 694 | #endif |
| 695 | if (gs.fMollweide && us.fEclipse && |
| 696 | NCheckEclipseSolar(oEar, oMoo, oSun, NULL) > etNone) |
| 697 | fDoEclipse = fTrue; |
| 698 | |
| 699 | // Compute center coordinates and horizontal map dimensions. |
| 700 | xc = (gs.xWin >> 1) - !FOdd(gs.xWin); yc = (gs.yWin >> 1) - !FOdd(gs.yWin); |
| 701 | zc = Max(xc, yc); |
| 702 | rxc = (real)xc; ryc = (real)yc; rzc = (real)zc; |
| 703 | x1 = (int)((real)gi.bmpWorld.x * deg / rDegMax); |
| 704 | x2 = (int)((real)gs.xWin * deg / rDegMax); |
| 705 | |
| 706 | // Draw map on a -XW rectangular world map. |
| 707 | if (gi.nMode == gAstroGraph || (gi.nMode == gWorldMap && !gs.fMollweide)) { |
| 708 | if (x1 == 0 || x2 == 0) |
| 709 | BmpCopyBlock(&gi.bmpWorld, 0, 0, gi.bmpWorld.x-1, gi.bmpWorld.y-1, |
| 710 | bmp, 0, 0, gs.xWin-1, yWin2-1); |
| 711 | else { |
| 712 | BmpCopyBlock(&gi.bmpWorld, 0, 0, x1-1, gi.bmpWorld.y-1, |
| 713 | bmp, gs.xWin-x2-1, 0, gs.xWin-1, yWin2-1); |
| 714 | BmpCopyBlock(&gi.bmpWorld, x1, 0, gi.bmpWorld.x-1, gi.bmpWorld.y-1, |
| 715 | bmp, 0, 0, gs.xWin-x2, yWin2-1); |
| 716 | } |
| 717 | |
| 718 | // Draw map on a -XW0 Mollweide projection world map. |
| 719 | } else if (gi.nMode == gWorldMap && gs.fMollweide) { |
| 720 | if (!FBmpDrawBack(bmp)) |
| 721 | BmpSetAll(bmp, KvFromKi(gi.kiOff)); |
| 722 | for (y2 = 0; y2 < yWin2; y2++) { |
| 723 | y1 = y2 * gi.bmpWorld.y / yWin2; |
| 724 | rT = RMollweide((real)y2 * rDegHalf / (real)yWin2 - rDegQuad); |
| 725 | n = (gs.xWin - (int)(rT * (real)gs.xWin / rDegHalf)) >> 1; |
| 726 | if (x1 == 0 || x2 == 0) |
| 727 | BmpCopyBlock(&gi.bmpWorld, 0, y1, gi.bmpWorld.x-1, y1, |
| 728 | bmp, n, y2, gs.xWin-1-n, y2); |
no test coverage detected