Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TGPicture.cxx
Go to the documentation of this file.
1// @(#)root/gui:$Id$
2// Author: Fons Rademakers 01/01/98
3
4/*************************************************************************
5 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11/**************************************************************************
12
13 This source is based on Xclass95, a Win95-looking GUI toolkit.
14 Copyright (C) 1996, 1997 David Barth, Ricky Ralston, Hector Peraza.
15
16 Xclass95 is free software; you can redistribute it and/or
17 modify it under the terms of the GNU Library General Public
18 License as published by the Free Software Foundation; either
19 version 2 of the License, or (at your option) any later version.
20
21**************************************************************************/
22
23
24/** \class TGPicture
25 \ingroup guiwidgets
26
27
28The TGPicture class implements pictures and icons used in the
29different GUI elements and widgets. The TGPicturePool class
30implements a TGPicture cache. TGPictures are created, managed and
31destroyed by the TGPicturePool.
32
33*/
34
35
36#include "TGPicture.h"
37#include "TGResourcePool.h"
38#include "THashTable.h"
39#include "TSystem.h"
40#include "TGWindow.h"
41#include "TVirtualX.h"
42#include "TImage.h"
43#include "TROOT.h"
44#include <cstdlib>
45
47
48
49
50////////////////////////////////////////////////////////////////////////////////
51///copy constructor
52
54 TObject(pp),
55 fClient(pp.fClient),
56 fPath(pp.fPath),
57 fPicList(pp.fPicList)
58{
59}
60
61////////////////////////////////////////////////////////////////////////////////
62///assignment operator
63
65{
66 if(this!=&pp) {
69 fPath=pp.fPath;
71 }
72 return *this;
73}
74
75////////////////////////////////////////////////////////////////////////////////
76/// Get a picture from the picture pool. Picture must be freed using
77/// TGPicturePool::FreePicture(). If picture is not found 0 is returned.
78/// \param name Name of the file containing the picture
79
81{
82 if (!fPicList)
83 fPicList = new THashTable(50);
84
86 pname.Strip();
87 TString ext = strrchr(pname, '.');
88 ext.ToLower();
89
90 if (ext.Length()) { // ".xpm", ".gif" etc
93 }
94
96 if (pic && !pic->IsScaled()) {
97 // in batch mode allow to return dummy image
98 if ((pic->fPic == kNone) && !gROOT->IsBatch())
99 return nullptr;
100 pic->AddReference();
101 return pic;
102 }
103
105
106 TImage *img = picnam ? TImage::Open(picnam) : nullptr;
107
108 delete [] picnam;
109
110 if (!img) {
111 pic = new TGPicture(pname);
112 pic->fAttributes.fColormap = fClient->GetDefaultColormap();
113 pic->fAttributes.fCloseness = 40000; // Allow for "similar" colors
114 pic->fAttributes.fMask = kPASize | kPAColormap | kPACloseness;
115 fPicList->Add(pic);
116 return nullptr;
117 }
118
119 pic = new TGPicture(pname, img->GetPixmap(), img->GetMask());
120 delete img;
121 fPicList->Add(pic);
122 return pic;
123}
124
125////////////////////////////////////////////////////////////////////////////////
126/// Like TGPicturePool::GetPicture() but, instead of returning null when the
127/// picture is not found, it returns a valid empty picture.
128
130{
131 static const TGPicture fEmptyPic { "Empty" };
132 const TGPicture *pic = GetPicture(name);
133 if (!pic)
134 pic = &fEmptyPic;
135 return pic;
136}
137
138////////////////////////////////////////////////////////////////////////////////
139/// Get picture with specified size from pool (picture will be scaled if
140/// necessary). Picture must be freed using TGPicturePool::FreePicture(). If
141/// picture is not found 0 is returned.
142
145{
146 if (!fPicList)
147 fPicList = new THashTable(50);
148
150 pname.Strip();
151 TString ext = strrchr(pname, '.');
152 ext.ToLower();
153
154 if (ext.Length()) { // ".xpm", ".gif" etc
157 }
158
161 if (pic && pic->GetWidth() == new_width && pic->GetHeight() == new_height) {
162 if (pic->fPic == kNone)
163 return 0;
164 pic->AddReference();
165 return pic;
166 }
167
169 if (!picnam) {
170 pic = new TGPicture(hname, kTRUE);
171 pic->fAttributes.fColormap = fClient->GetDefaultColormap();
172 pic->fAttributes.fCloseness = 40000; // Allow for "similar" colors
173 pic->fAttributes.fMask = kPASize | kPAColormap | kPACloseness;
174 pic->fAttributes.fWidth = new_width;
175 pic->fAttributes.fHeight = new_height;
176 fPicList->Add(pic);
177 return 0;
178 }
179
181 if (!img) {
182 pic = new TGPicture(hname, kTRUE);
183 pic->fAttributes.fColormap = fClient->GetDefaultColormap();
184 pic->fAttributes.fCloseness = 40000; // Allow for "similar" colors
185 pic->fAttributes.fMask = kPASize | kPAColormap | kPACloseness;
186 pic->fAttributes.fWidth = new_width;
187 pic->fAttributes.fHeight = new_height;
188 fPicList->Add(pic);
189 delete [] picnam;
190 return 0;
191 }
192
193 img->Scale(new_width, new_height);
194
195 pic = new TGPicture(hname, img->GetPixmap(), img->GetMask());
196 delete [] picnam;
197 delete img;
198 fPicList->Add(pic);
199 return pic;
200}
201
202////////////////////////////////////////////////////////////////////////////////
203/// Get picture with specified pixmap and mask from pool.
204/// Picture must be freed using TGPicturePool::FreePicture().
205/// If picture is not found 0 is returned.
206
209{
210 if (!fPicList)
211 fPicList = new THashTable(50);
212
213 Int_t xy;
214 UInt_t w, h;
215
216 gVirtualX->GetWindowSize(pxmap, xy, xy, w, h);
217
218 const char *hname = TGPicture::HashName(name, w, h);
220
221 if (pic) {
222 pic->AddReference();
223 return pic;
224 }
225
226 pic = new TGPicture(hname, pxmap, mask);
227 fPicList->Add(pic);
228
229 return pic;
230}
231
232////////////////////////////////////////////////////////////////////////////////
233/// Create picture from XPM data.
234/// Picture must be freed using TGPicturePool::FreePicture().
235/// If picture creation failed 0 is returned.
236
237const TGPicture *TGPicturePool::GetPicture(const char *name, char **xpm)
238{
239 UInt_t w, h;
240
241 if (!xpm || !*xpm) {
242 return 0;
243 }
244
245 if (!fPicList) {
246 fPicList = new THashTable(50);
247 }
248 char *ptr = xpm[0];
249 while (isspace((int)*ptr)) ++ptr;
250 w = atoi(ptr);
251
252 while (isspace((int)*ptr)) ++ptr;
253 h = atoi(ptr);
254
255 const char *hname = TGPicture::HashName(name, w, h);
257 if (pic) {
258 pic->AddReference();
259 return pic;
260 }
261
263 if (!img) {
264 pic = new TGPicture(hname, kTRUE);
265 pic->fAttributes.fColormap = fClient->GetDefaultColormap();
266 pic->fAttributes.fCloseness = 40000; // Allow for "similar" colors
267 pic->fAttributes.fMask = kPASize | kPAColormap | kPACloseness;
268 pic->fAttributes.fWidth = w;
269 pic->fAttributes.fHeight = h;
270 fPicList->Add(pic);
271 return 0;
272 }
273
274 pic = new TGPicture(hname, img->GetPixmap(), img->GetMask());
275 delete img;
276 return pic;
277}
278
279////////////////////////////////////////////////////////////////////////////////
280/// Remove picture from cache if nobody is using it anymore.
281
283{
284 if (!fPicList) return;
285
287 if (pic) {
288 if (pic->RemoveReference() == 0) {
290 delete pic;
291 }
292 }
293}
294
295////////////////////////////////////////////////////////////////////////////////
296/// Delete picture cache.
297
299{
300 if (fPicList) {
301 fPicList->Delete();
302 delete fPicList;
303 }
304
305 // Required since we overload TObject::Hash.
307}
308
309////////////////////////////////////////////////////////////////////////////////
310/// List all pictures in the pool.
311
313{
314 if (fPicList)
315 fPicList->Print();
316 else
317 Info("Print", "no pictures in picture pool");
318}
319
320////////////////////////////////////////////////////////////////////////////////
321/// ctor. Important: both pixmaps pxmap and mask must be unique (not shared)
322
324{
325 fName = name;
326 fScaled = kFALSE;
327 fPic = pxmap;
328 fMask = mask;
329 Int_t xy;
330
331 fAttributes.fColormap = gClient->GetDefaultColormap();
332 fAttributes.fCloseness = 40000; // Allow for "similar" colors
339
341 SetRefCount(1);
342}
343
344////////////////////////////////////////////////////////////////////////////////
345/// Draw a picture.
346
348{
350
352 gcv.fClipMask = fMask;
353 gcv.fClipXOrigin = x;
354 gcv.fClipYOrigin = y;
355 gVirtualX->ChangeGC(gc, &gcv);
356 gVirtualX->CopyArea(fPic, id, gc, 0, 0, fAttributes.fWidth, fAttributes.fHeight,
357 x, y);
358 gcv.fMask = kGCClipMask;
359 gcv.fClipMask = kNone;
360 gVirtualX->ChangeGC(gc, &gcv);
361}
362
363////////////////////////////////////////////////////////////////////////////////
364/// Delete picture object.
365
367{
368 if (fPic != kNone)
369 gVirtualX->DeletePixmap(fPic);
370 if (fMask != kNone)
371 gVirtualX->DeletePixmap(fMask);
373 delete [] fAttributes.fPixels;
374}
375
376////////////////////////////////////////////////////////////////////////////////
377/// Static function returning a unique name used to look up a picture.
378/// The unique name has the form "name__widthxheight".
379
380const char *TGPicture::HashName(const char *name, Int_t width, Int_t height)
381{
382 static TString hashName;
383
384 hashName.Form("%s__%dx%d", name, width, height);
385 return hashName.Data();
386}
387
388////////////////////////////////////////////////////////////////////////////////
389/// Print picture info.
390
392{
393 Printf("TGPicture: %s,%sref cnt = %u %lx", GetName(),
394 fScaled ? " scaled, " : " ", References(), fPic);
395}
396
397
398////////////////////////////////////////////////////////////////////////////////
399/// Create a "selected" looking picture based on the original TGPicture.
400
402 TGPicture("")
403{
405 UInt_t w, h;
406
407 fClient = client;
408 Window_t root = fClient->GetDefaultRoot()->GetId();
409
410 w = p->GetWidth();
411 h = p->GetHeight();
412
413 fPic = gVirtualX->CreatePixmap(root, w, h);
414 fMask = p->GetMask();
415
418
419 gVirtualX->CopyArea(p->GetPicture(), fPic, GetSelectedGC()(), 0, 0, w, h, 0, 0);
420
422 gcv.fClipMask = p->GetMask();
423 gcv.fClipXOrigin = 0;
424 gcv.fClipYOrigin = 0;
425 GetSelectedGC().SetAttributes(&gcv);
426
427 gVirtualX->FillRectangle(fPic, GetSelectedGC()(), 0, 0, w, h);
428
429 GetSelectedGC().SetClipMask(kNone);
430}
431
432////////////////////////////////////////////////////////////////////////////////
433/// Delete selected picture.
434
436{
437 // fMask was borrowed so should not be deleted by ~TGPicture.
438 fMask = kNone;
439}
440
441////////////////////////////////////////////////////////////////////////////////
442/// Return selection graphics context in use.
443
445{
446 if (!fgSelectedGC) {
447 fgSelectedGC = new TGGC(*gClient->GetResourcePool()->GetFrameGC());
448 fgSelectedGC->SetForeground(gClient->GetResourcePool()->GetSelectedBgndColor());
449 fgSelectedGC->SetBackground(gClient->GetResourcePool()->GetBlackColor());
450 fgSelectedGC->SetFillStyle(kFillStippled);
451 fgSelectedGC->SetStipple(gClient->GetResourcePool()->GetCheckeredBitmap());
452 }
453 return *fgSelectedGC;
454}
Handle_t Pixmap_t
Pixmap handle.
Definition GuiTypes.h:31
const Mask_t kGCClipXOrigin
Definition GuiTypes.h:304
const Mask_t kPACloseness
Definition GuiTypes.h:343
Handle_t Window_t
Window handle.
Definition GuiTypes.h:29
Handle_t GContext_t
Graphics context handle.
Definition GuiTypes.h:39
const Handle_t kNone
Definition GuiTypes.h:89
@ kFillStippled
Definition GuiTypes.h:52
const Mask_t kPAColormap
Definition GuiTypes.h:338
const Mask_t kGCClipYOrigin
Definition GuiTypes.h:305
const Mask_t kPASize
width and height
Definition GuiTypes.h:340
const Mask_t kGCClipMask
Definition GuiTypes.h:306
ULongptr_t Handle_t
Generic resource handle.
Definition GuiTypes.h:26
#define h(i)
Definition RSha256.hxx:106
constexpr Bool_t kFALSE
Definition RtypesCore.h:108
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
const char Option_t
Option string (const char)
Definition RtypesCore.h:80
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
#define gClient
Definition TGClient.h:157
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t mask
Option_t Option_t TPoint xy
Option_t Option_t width
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t height
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void gc
char name[80]
Definition TGX11.cxx:145
#define gROOT
Definition TROOT.h:426
void Printf(const char *fmt,...)
Formats a string in a circular formatting buffer and prints the string.
Definition TString.cxx:2509
@ kReadPermission
Definition TSystem.h:55
R__EXTERN TSystem * gSystem
Definition TSystem.h:582
#define gVirtualX
Definition TVirtualX.h:367
Window client.
Definition TGClient.h:37
Encapsulate a graphics context used in the low level graphics.
Definition TGGC.h:22
TString fPath
icon search path
Definition TGPicture.h:92
THashTable * fPicList
hash table containing the icons
Definition TGPicture.h:93
TGPicturePool(const TGPicturePool &)
copy constructor
Definition TGPicture.cxx:53
void Print(Option_t *option="") const override
List all pictures in the pool.
~TGPicturePool() override
Delete picture cache.
void FreePicture(const TGPicture *pic)
Remove picture from cache if nobody is using it anymore.
const TGClient * fClient
client for which we keep icon pool
Definition TGPicture.h:91
const TGPicture * GetPictureOrEmpty(const char *name)
Like TGPicturePool::GetPicture() but, instead of returning null when the picture is not found,...
const TGPicture * GetPicture(const char *name)
Get a picture from the picture pool.
Definition TGPicture.cxx:80
TGPicturePool & operator=(const TGPicturePool &)
assignment operator
Definition TGPicture.cxx:64
The TGPicture class implements pictures and icons used in the different GUI elements and widgets.
Definition TGPicture.h:25
Pixmap_t fPic
picture pixmap
Definition TGPicture.h:32
PictureAttributes_t fAttributes
picture attributes
Definition TGPicture.h:34
static const char * HashName(const char *name, Int_t width, Int_t height)
Static function returning a unique name used to look up a picture.
void Print(Option_t *option="") const override
Print picture info.
Pixmap_t fMask
picture mask pixmap
Definition TGPicture.h:33
void Draw(Option_t *="") override
Default Draw method for all objects.
Definition TGPicture.h:46
TGPicture(const char *name, Bool_t scaled=kFALSE)
Definition TGPicture.h:36
~TGPicture() override
Delete picture object.
const char * GetName() const override
Returns name of object.
Definition TGPicture.h:51
Bool_t fScaled
kTRUE if picture is scaled
Definition TGPicture.h:31
TString fName
name of picture
Definition TGPicture.h:30
static TGGC & GetSelectedGC()
Return selection graphics context in use.
~TGSelectedPicture() override
Delete selected picture.
static TGGC * fgSelectedGC
Definition TGPicture.h:72
TGSelectedPicture(const TGSelectedPicture &gp)
Definition TGPicture.h:75
const TGClient * fClient
Definition TGPicture.h:70
THashTable implements a hash table to store TObject's.
Definition THashTable.h:35
void Add(TObject *obj) override
Add object to the hash table.
TObject * Remove(TObject *obj) override
Remove object from the hashtable.
TObject * FindObject(const char *name) const override
Find object using its name.
void Print(Option_t *option, Int_t recurse) const override
Print the collection header and its elements.
void Delete(Option_t *option="") override
Remove all objects from the table AND delete all heap based objects.
An abstract interface to image processing library.
Definition TImage.h:29
static TImage * Open(const char *file, EImageFileTypes type=kUnknown)
Open a specified image file.
Definition TImage.cxx:117
Mother of all ROOT objects.
Definition TObject.h:42
TObject & operator=(const TObject &rhs) noexcept
TObject assignment operator.
Definition TObject.h:305
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Definition TObject.cxx:1069
void SetRefCount(UInt_t r)
Definition TRefCnt.h:39
UInt_t References() const
Definition TRefCnt.h:38
Basic string class.
Definition TString.h:138
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
Definition TSystem.cxx:1285
virtual const char * UnixPathName(const char *unixpathname)
Convert from a local pathname to a Unix pathname.
Definition TSystem.cxx:1073
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
Definition TSystem.cxx:1559
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
void CallRecursiveRemoveIfNeeded(TObject &obj)
call RecursiveRemove for obj if gROOT is valid and obj.TestBit(kMustCleanup) is true.
Definition TROOT.h:415
Graphics context structure.
Definition GuiTypes.h:225
UInt_t fHeight
height of picture
Definition GuiTypes.h:328
Mask_t fMask
mask specifying which attributes are defined
Definition GuiTypes.h:334
ULong_t * fPixels
list of used color pixels (if set use delete[])
Definition GuiTypes.h:331
Colormap_t fColormap
colormap to use
Definition GuiTypes.h:325
UInt_t fCloseness
allowable RGB deviation
Definition GuiTypes.h:333
Int_t fDepth
depth of window
Definition GuiTypes.h:326
UInt_t fNpixels
number of used color pixels
Definition GuiTypes.h:332
UInt_t fYHotspot
picture y hotspot coordinate
Definition GuiTypes.h:330
UInt_t fXHotspot
picture x hotspot coordinate
Definition GuiTypes.h:329
UInt_t fWidth
width of picture
Definition GuiTypes.h:327