File: ImageForm.pas

package info (click to toggle)
cevomapgen 39-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 476 kB
  • sloc: pascal: 2,765; xml: 169; makefile: 50
file content (205 lines) | stat: -rw-r--r-- 4,830 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
unit ImageForm;

{***********************************************************

Project:    C-evo External Map Generator
Copyright:  1999-2024 P Blackman
License:    GPLv3+

Code for ImageForm.lfm

***********************************************************}


interface

uses
    LCLIntf, LCLType, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ExtCtrls, CevoMap, Menus;

type
    TFrmImage = class(TForm)
        PopupMenu1: TPopupMenu;
        SavetoJpeg: TMenuItem;
        SDJpeg:     TSaveDialog;

        procedure SavetoJpegClick;
        procedure FormPaint;
        procedure FormOnShow;

    private
        fmult:   Integer;
        fscroll: Integer;
        bmp:     TBitmap;

    public
        procedure DisplayMap(Mymap: TMap; Mult: Integer);
        procedure Init(W, H, Mult: Integer);
        property scroll: Integer read fscroll write fscroll;
        destructor Destroy; override;
    end;

var
    FrmImage: TFrmImage;

implementation uses System.UITypes, MapTiles;


{$R *.lfm}

procedure TFrmImage.Init(W, H, Mult: Integer);
begin
    fmult        := Mult;
    Clientwidth  := 2*W*Mult;
    Clientheight :=   H*Mult;

    if Mult > 0 then
        Show;

    if bmp <> nil then
        bmp.Free;

    bmp        := TBitMap.Create;
    bmp.Height := Clientheight;
    bmp.Width  := Clientwidth;
end;


procedure TFrmImage.DisplayMap(Mymap: TMap; Mult: Integer);
var Wid, Hgt,
    offset: Integer;

    procedure Doasquare(WS, H: Integer);
    var R: tterrain;
        Wm: Integer;

        // Draw one Tile box in given color
        procedure SetColor(Color: TColor);
        var X, Y, bmpX, bmpY: Integer;
        begin
            for Y := 0 to fmult-1 do
            begin
                bmpY := (Hgt-1)*fmult+Y;

                if (offset = 0) OR (Wid <> MyMap.Width) then
                    for X := 0 to fmult*2-1 do
                    begin
                        bmpX := (Wid-1)*fmult*2+X+offset;
                        bmp.Canvas.Pixels[bmpX, bmpY] := Color;
                    end
                else
                    // This Tile split, one half at each end
                    for X := 0 to fmult-1 do
                    begin
                        bmpX := (Wid-1)*fmult*2+X+offset;
                        bmp.Canvas.Pixels[X, bmpY] := Color;
                        bmp.Canvas.Pixels[bmpX, bmpY] := Color;
                    end;
            end;
        end;

    begin
        // Allow for horizontal scroll
        Wm := 1+(WS + fscroll) MOD MyMap.Width;
        R  := MyMap.GetTerrain(Wm, H);

        if (R = Ocean) OR (R = Coast) then
            SetColor(clBlue)
        else
        if Mymap.Tiles[Wm,H].River then
            SetColor(clAqua)
        else
            case R of
                Desert:   SetColor(clRed);
                Prairie:  SetColor(clYellow);
                Grass:    SetColor(clLime);
                Forest:   SetColor(clGreen);
                Hills:    SetColor(clOlive);
                Mountain: SetColor(clLtGray);
                Tundra:   SetColor(clDkGray);
                Arctic:   SetColor(clWhite);
                Swamp:    SetColor(clTeal);

            otherwise
            begin
                ShowMessage ('Terrain label misssing ' + IntToStr(Ord(R)));
                Halt (1);
            end;
            end;
    end;

begin
    with MyMap do
        Init(Width, Height, Mult);

    with MyMap do
        for Hgt := 1 to Mymap.Height do
        begin
            // Offset alternate rows to compensate for Cevo diamond map format }
            if NOT odd(Hgt) then
                offset := fmult
            else
                offset := 0;

            for Wid := 1 to MyMap.Width do
               // Incorporate scroll offset }
                DoaSquare(Wid, Hgt);
        end;

    Canvas.Draw(0, 0, bmp);
    Update;
    Show;
end;


procedure TFrmImage.FormPaint;
begin
    Canvas.Draw(0, 0, bmp);
end;

procedure TFrmImage.FormOnShow;
begin
    if Clientheight = 0 then
    begin
        Clientwidth  := 353;
        Clientheight := 176;
    end;
end;

// Write thumbnail display to a Jpeg file
procedure TFrmImage.SavetoJpegClick;
var jp: TJPEGImage;
    bm: TBitMap;
    MyRect: TRect;
begin
    jp := TJPEGImage.Create;
    bm := TBitMap.Create;
    try
        bm.Width := Clientwidth;
        bm.Height := ClientHeight;
        bm.pixelformat := pfDevice;
        MyRect := Rect(0, 0, Clientwidth, ClientHeight);

        bm.Canvas.CopyRect(MyRect, Canvas, MyRect);

        with jp do
        begin
            CompressionQuality := 70;
            Assign(bm);

            if SDJpeg.Execute then
                SaveToFile(SDJpeg.filename);
        end;
    finally
        bm.Free;
        jp.Free;
    end;
end;

destructor TFrmImage.Destroy;
begin
    bmp.Free;
    inherited;
end;

end.