Skip to content

Commit dea28dd

Browse files
committed
Custom shape forms from bitmap vs file.
1 parent daed4be commit dea28dd

File tree

3 files changed

+25
-39
lines changed

3 files changed

+25
-39
lines changed

lib/common/kernel/linux/mseguiintf.pas

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ interface
5858
msegraphutils, mseevent, msepointer, mseguiglob, msesystypes,{msestockobjects,}
5959
msethread{$ifdef FPC},dynlibs{$endif},
6060
mselibc, msectypes, msesysintf, msegraphics,
61-
msestrings, mxft, mshape, mseclasses, msebitmap, mseformatpngread ;
61+
msestrings, mxft, mshape, mseclasses, msebitmap;
6262

6363
{$ifdef FPC}
6464
{$define xbooleanresult}
@@ -541,6 +541,9 @@ function Xutf8TextPropertyToTextList(para1:PDisplay; para2:PXTextProperty;
541541
para3:PPPchar; para4: pinteger): integer; cdecl;
542542
external sXlib name 'Xutf8TextPropertyToTextList';
543543

544+
var
545+
mse_shapebmp: tmaskedbitmap;
546+
544547
implementation
545548
uses
546549
msebits,msekeyboard,sysutils,msesysutils,msefileutils,msedatalist,msedragglob
@@ -4101,7 +4104,7 @@ function gui_createwindow(const rect: rectty;
41014104
colormap1: tcolormap;
41024105
opt1: windowtypeoptionty;
41034106
// valall: ptruint;
4104-
shapebmp: tmaskedbitmap;
4107+
// shapebmp: tmaskedbitmap;
41054108
// shape from Xext
41064109
xgcv :TXGCValues;
41074110
pmap : pixmapty;
@@ -4233,22 +4236,11 @@ function gui_createwindow(const rect: rectty;
42334236
end;
42344237
end;
42354238
end else
4236-
if (wo_customshape in options.options) and (mse_shapefile <> '') then
4239+
if (wo_customshape in options.options) then
42374240
begin
42384241
DefaultErrorHandler := XSetErrorHandler(@CustomErrorHandler);
4239-
shapebmp := tmaskedbitmap.Create(bmk_mono); // Monochrome mode
4240-
try
4241-
shapebmp.LoadFromFile(mse_shapefile); // Load b/w PNG image
4242-
shapebmp.MaskKind := bmk_mono; // Ensure 1-bit mask
4243-
// Copy mask to pmap (1=visible/opaque, 0=transparent/clipped)
4244-
// Assumes mask bits are set correctly (black=1/visible, white=0/transparent)
4245-
XCopyArea(appdisp, shapebmp.mask.handle, pmap, shape_gc, 0, 0, width, height, 0, 0);
4246-
finally
4247-
shapebmp.Free;
4248-
//XSetErrorHandler(DefaultErrorHandler); // Restore default
4249-
end;
4250-
4251-
end else
4242+
XCopyArea(appdisp, mse_shapebmp.mask.handle, pmap, shape_gc, 0, 0, width, height, 0, 0);
4243+
end else
42524244
{
42534245
if (wo_transparentbackgroundellipse in options.options) then
42544246
begin

lib/common/kernel/mseguiglob.pas

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -329,18 +329,15 @@ egui = class(eerror)
329329
toplevelraise: boolean;
330330
nostaticgravity: boolean;
331331
mse_radiuscorner : integer = 8;
332-
mse_shapefile : string = '';
333-
// exabug: boolean;
334-
// nocreatestaticgravity: boolean;
335-
332+
336333
procedure guierror(error: guierrorty; text: string = ''); overload;
337334
procedure guierror(error: guierrorty; sender: tobject;
338335
text: string = ''); overload;
339336

340337
implementation
341338

342339
uses
343-
mseclasses,msestreaming{,mseapplication,msegui,mseguiintf};
340+
mseclasses,msestreaming {,mseapplication,msegui,mseguiintf};
344341

345342
const
346343
errortexts: array[guierrorty] of string =

lib/common/kernel/windows/mseguiintf.pas

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ interface
1515
uses
1616
windows,messages,mseapplication,msetypes,msegraphutils,msesys,
1717
mseevent,msepointer,mseguiglob,msegraphics,
18-
msethread,mseformatstr,{msesysintf,}msestrings,msesystypes,msewinglob;
18+
msethread,mseformatstr,{msesysintf,}msestrings,msesystypes,msewinglob, msebitmap;
1919

2020
type
2121
syseventty = record
@@ -60,11 +60,14 @@ function nestedwindowproc(): boolean; //window frame clicked
6060
gccount: integer;
6161
{$endif}
6262

63+
var
64+
mse_shapebmp: tmaskedbitmap;
65+
6366
implementation
6467
//todo: 19.10.03 rasterops for textout
6568
uses
6669
sysutils,mselist,msekeyboard,msebits,msearrayutils,msesysutils,msegui,
67-
msesystimer,msegdi32gdi,msesysintf1,msedynload,msewindnd,msebitmap,mseformatpngread
70+
msesystimer,msegdi32gdi,msesysintf1,msedynload,msewindnd
6871
{$ifdef mse_debugzorder},typinfo{$endif} ;
6972

7073
type
@@ -2944,7 +2947,7 @@ function gui_createwindow(const rect: rectty;
29442947
ownerwindow: winidty;
29452948
region, region2 : THandle;
29462949
x, deco_x, deco_y : integer;
2947-
shapebmp: tmaskedbitmap;
2950+
// shapebmp: tmaskedbitmap;
29482951
//rgn, rectrgn: HRGN;
29492952
y, startx: integer;
29502953

@@ -3117,30 +3120,28 @@ function gui_createwindow(const rect: rectty;
31173120
DeleteObject(region);
31183121
end else
31193122
}
3120-
if (wo_customshape in options) and (mse_shapefile <> '') then
3123+
if (wo_customshape in options)
3124+
then
31213125
begin
3122-
shapebmp := tmaskedbitmap.Create(bmk_mono);
3123-
try
3124-
shapebmp.LoadFromFile(mse_shapefile);
3125-
shapebmp.maskkind := bmk_mono;
3126-
shapebmp.mask.size := shapebmp.size;
3127-
31283126
region := CreateRectRgn(0, 0, 0, 0);
31293127

3130-
for y := 0 to shapebmp.size.cy - 1 do
3128+
mse_shapebmp.maskkind := bmk_mono;
3129+
mse_shapebmp.mask.size := mse_shapebmp.size;
3130+
3131+
for y := 0 to mse_shapebmp.size.cy - 1 do
31313132
begin
31323133
x := 0;
3133-
while x < shapebmp.size.cx do
3134+
while x < mse_shapebmp.size.cx do
31343135
begin
3135-
if (shapebmp.pixels[x, y] and $FFFFFF) > $7F7F7F then
3136+
if (mse_shapebmp.pixels[x, y] and $FFFFFF) > $7F7F7F then
31363137
begin
31373138
Inc(x);
31383139
Continue;
31393140
end;
31403141

31413142
startx := x;
31423143
// Collect everything that is "dark"
3143-
while (x < shapebmp.size.cx) and ((shapebmp.pixels[x, y] and $FFFFFF) <= $7F7F7F) do
3144+
while (x < mse_shapebmp.size.cx) and ((mse_shapebmp.pixels[x, y] and $FFFFFF) <= $7F7F7F) do
31443145
Inc(x);
31453146

31463147
region2 := CreateRectRgn(startx, y, x, y + 1);
@@ -3151,10 +3152,6 @@ function gui_createwindow(const rect: rectty;
31513152

31523153
// Apply the custom region to the window handle
31533154
SetWindowRgn(id, region, True);
3154-
3155-
finally
3156-
shapebmp.Free;
3157-
end;
31583155

31593156
end else
31603157

0 commit comments

Comments
 (0)