Menu

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

Download this file

161 lines (141 with data), 4.9 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
{
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/
*
* Copyright (C) 2009-2012, Peter Johnson (www.delphidabbler.com).
*
* $Rev$
* $Date$
*
* Defines a custom image list that provides a list of LED images. Image list is
* automatically loaded from resources when class is instantiated.
}
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.