Menu

[r2017]: / trunk / Src / ULEDImageList.pas  Maximize  Restore  History

Download this file

182 lines (162 with data), 5.6 kB

  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
{
* ULEDImageList.pas
*
* Defines a custom image list that provides a list of LED images. Image list is
* automatically loaded from resources when class is instantiated.
*
* $Rev$
* $Date$
*
* ***** BEGIN LICENSE BLOCK *****
*
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* The Original Code is ULEDImageList.pas
*
* The Initial Developer of the Original Code is Peter Johnson
* (http://www.delphidabbler.com/).
*
* Portions created by the Initial Developer are Copyright (C) 2009-2010 Peter
* Johnson. All Rights Reserved.
*
* Contributor(s)
* NONE
*
* ***** END LICENSE BLOCK *****
}
unit ULEDImageList;
interface
uses
// Delphi
SysUtils, Classes, ImgList, Windows, Graphics,
// Project
Compilers.UGlobals;
type
{
TLEDImageList:
Custom image list that provides a list of LED images. Image list is
automatically loaded from resources when class is instantiated. Image list
can be accessed by compile result as well as by the normal integer indexing.
}
TLEDImageList = class(TCustomImageList)
strict private
function CompResToIdx(const CompRes: TCompileResult): Integer;
{Maps a compile result onto an image index.
@param CompRes [in] Compile result to be mapped.
@return Match image index.
}
public
constructor Create(AOwner: TComponent); override;
{Class constructor. Sets up object and reads images from resources.
}
procedure Draw(const Canvas: TCanvas; const TopLeft: TPoint;
const CompRes: TCompileResult); overload;
{Overloaded method that draws a LED specified by its compile result.
@param Canvas [in] Canvas on which to draw LED.
@param TopLeft [in] Offset of top left corner of drawing in Canvas.
@param CompRes [in] Compile result that specifies the LED to draw.
}
end;
implementation
{
Note: resources must contain a valid bitmap named "LEDS" that combines all
four bitmaps, each 18px x 18px. This combined bitmap may be in one of three
formats:
18px x 72px => LEDs are in a vertical column
36px x 36px => LEDs are in two rows of two, varying by row
72px x 18px => LEDs are in a horizontal row
Ordering must be
S or SW or SWEQ
W EQ
E
Q
Where S = success (green), W = warning (yellow), E = error (red) and
Q = query (grey).
The mask colour must be clFuchsia.
}
{ TLEDImageList }
function TLEDImageList.CompResToIdx(const CompRes: TCompileResult): Integer;
{Maps a compile result onto an image index.
@param CompRes [in] Compile result to be mapped.
@return Match image index.
}
begin
// Assumes images are ordered in same order as TCompileResult enumeration
Result := Ord(CompRes);
end;
constructor TLEDImageList.Create(AOwner: TComponent);
{Class constructor. Sets up object and reads images from resources.
}
var
BmpStrip: TBitmap; // strip containg all bitmaps from resources
LEDBmp: TBitmap; // a bitmap of a single LED
RS: TResourceStream; // stream used to resources
LeftOffset: Integer; // left offset of a bitmap in "strip"
TopOffset: Integer; // top offset of a bitmap in "strip"
begin
inherited;
// Set required size of images in image list
Width := 18;
Height := 18;
// Load "strip" of all LED bitmaps from resources.
// note that we load from RCDATA since bitmap is 32 bit and resource compiler
// won't recognise this as valid if placed in a BITMAP resource
BmpStrip := TBitmap.Create;
try
RS := TResourceStream.Create(HInstance, 'LEDS', RT_RCDATA);
try
BmpStrip.LoadFromStream(RS);
finally
FreeAndNil(RS);
end;
// Split strip up into individual bitmaps and load them into image list
// create bitmap of correct size and bit depth: we re-use it for each bitmap
LEDBmp := TBitmap.Create;
try
LEDBmp.Width := Width;
LEDBmp.Height := Height;
LEDBmp.PixelFormat := BmpStrip.PixelFormat;
// scan across then down bitmaps: works for 1*4 or 2*2 bitmaps
TopOffset := 0;
while TopOffset < BmpStrip.Height do
begin
LeftOffset := 0;
while LeftOffset < BmpStrip.Width do
begin
// copy the bitmap from the "strip"
LEDBmp.Canvas.CopyRect(
Rect(0, 0, Width, Height),
BmpStrip.Canvas,
Bounds(LeftOffset, TopOffset, Width, Height)
);
Self.AddMasked(LEDBmp, clFuchsia);
Inc(LeftOffset, Width);
end;
Inc(TopOffset, Height);
end;
finally
FreeAndNil(LEDBmp);
end;
finally
FreeAndNil(BmpStrip);
end;
end;
procedure TLEDImageList.Draw(const Canvas: TCanvas; const TopLeft: TPoint;
const CompRes: TCompileResult);
{Overloaded method that draws a LED specified by its compile result.
@param Canvas [in] Canvas on which to draw LED.
@param TopLeft [in] Offset of top left corner of drawing in Canvas.
@param CompRes [in] Compile result that specifies the LED to draw.
}
begin
Self.Draw(Canvas, TopLeft.X, TopLeft.Y, CompResToIdx(CompRes));
end;
end.
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.