Logo ROOT  
Reference Guide
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// //
25// TGPicture & TGPicturePool //
26// //
27// The TGPicture class implements pictures and icons used in the //
28// different GUI elements and widgets. The TGPicturePool class //
29// implements a TGPicture cache. TGPictures are created, managed and //
30// destroyed by the TGPicturePool. //
31// //
32//////////////////////////////////////////////////////////////////////////
33
34#include "TGPicture.h"
35#include "TGResourcePool.h"
36#include "THashTable.h"
37#include "TSystem.h"
38#include "TGWindow.h"
39#include "TVirtualX.h"
40#include "TImage.h"
41#include "TROOT.h"
42#include <stdlib.h>
43
45
49
50
51////////////////////////////////////////////////////////////////////////////////
52///copy constructor
53
55 TObject(pp),
56 fClient(pp.fClient),
57 fPath(pp.fPath),
58 fPicList(pp.fPicList)
59{
60}
61
62////////////////////////////////////////////////////////////////////////////////
63///assignment operator
64
66{
67 if(this!=&pp) {
70 fPath=pp.fPath;
72 }
73 return *this;
74}
75
76////////////////////////////////////////////////////////////////////////////////
77/// Get a picture from the picture pool. Picture must be freed using
78/// TGPicturePool::FreePicture(). If picture is not found 0 is returned.
79
81{
82 if (!fPicList)
83 fPicList = new THashTable(50);
84
85 TString pname = name;
86 pname.Strip();
87 TString ext = strrchr(pname, '.');
88 ext.ToLower();
89
90 if (ext.Length()) { // ".xpm", ".gif" etc
91 char *pxname = gSystem->ExpandPathName(gSystem->UnixPathName(pname));
92 pname = pxname;
93 delete [] pxname;
94 }
95
96 TGPicture *pic = (TGPicture *)fPicList->FindObject(pname);
97 if (pic && !pic->IsScaled()) {
98 if (pic->fPic == kNone)
99 return 0;
100 pic->AddReference();
101 return pic;
102 }
103
104 char *picnam = gSystem->Which(fPath, pname, kReadPermission);
105 if (!picnam) {
106 pic = new TGPicture(pname);
108 pic->fAttributes.fCloseness = 40000; // Allow for "similar" colors
110 fPicList->Add(pic);
111 return 0;
112 }
113
114 TImage *img = TImage::Open(picnam);
115 if (!img) {
116 pic = new TGPicture(pname);
118 pic->fAttributes.fCloseness = 40000; // Allow for "similar" colors
120 fPicList->Add(pic);
121 delete [] picnam;
122 return 0;
123 }
124
125 pic = new TGPicture(pname, img->GetPixmap(), img->GetMask());
126 delete [] picnam;
127 delete img;
128 fPicList->Add(pic);
129 return pic;
130}
131
132////////////////////////////////////////////////////////////////////////////////
133/// Get picture with specified size from pool (picture will be scaled if
134/// necessary). Picture must be freed using TGPicturePool::FreePicture(). If
135/// picture is not found 0 is returned.
136
138 UInt_t new_width, UInt_t new_height)
139{
140 if (!fPicList)
141 fPicList = new THashTable(50);
142
143 TString pname = name;
144 pname.Strip();
145 TString ext = strrchr(pname, '.');
146 ext.ToLower();
147
148 if (ext.Length()) { // ".xpm", ".gif" etc
149 char *pxname = gSystem->ExpandPathName(gSystem->UnixPathName(pname));
150 pname = pxname;
151 delete [] pxname;
152 }
153
154 const char *hname = TGPicture::HashName(pname, new_width, new_height);
155 TGPicture *pic = (TGPicture *)fPicList->FindObject(hname);
156 if (pic && pic->GetWidth() == new_width && pic->GetHeight() == new_height) {
157 if (pic->fPic == kNone)
158 return 0;
159 pic->AddReference();
160 return pic;
161 }
162
163 char *picnam = gSystem->Which(fPath, pname, kReadPermission);
164 if (!picnam) {
165 pic = new TGPicture(hname, kTRUE);
167 pic->fAttributes.fCloseness = 40000; // Allow for "similar" colors
169 pic->fAttributes.fWidth = new_width;
170 pic->fAttributes.fHeight = new_height;
171 fPicList->Add(pic);
172 return 0;
173 }
174
175 TImage *img = TImage::Open(picnam);
176 if (!img) {
177 pic = new TGPicture(hname, kTRUE);
179 pic->fAttributes.fCloseness = 40000; // Allow for "similar" colors
181 pic->fAttributes.fWidth = new_width;
182 pic->fAttributes.fHeight = new_height;
183 fPicList->Add(pic);
184 delete [] picnam;
185 return 0;
186 }
187
188 img->Scale(new_width, new_height);
189
190 pic = new TGPicture(hname, img->GetPixmap(), img->GetMask());
191 delete [] picnam;
192 delete img;
193 fPicList->Add(pic);
194 return pic;
195}
196
197////////////////////////////////////////////////////////////////////////////////
198/// Get picture with specified pixmap and mask from pool.
199/// Picture must be freed using TGPicturePool::FreePicture().
200/// If picture is not found 0 is returned.
201
203 Pixmap_t mask)
204{
205 if (!fPicList)
206 fPicList = new THashTable(50);
207
208 Int_t xy;
209 UInt_t w, h;
210
211 gVirtualX->GetWindowSize(pxmap, xy, xy, w, h);
212
213 const char *hname = TGPicture::HashName(name, w, h);
214 TGPicture *pic = (TGPicture *)fPicList->FindObject(hname);
215
216 if (pic) {
217 pic->AddReference();
218 return pic;
219 }
220
221 pic = new TGPicture(hname, pxmap, mask);
222 fPicList->Add(pic);
223
224 return pic;
225}
226
227////////////////////////////////////////////////////////////////////////////////
228/// Create picture from XPM data.
229/// Picture must be freed using TGPicturePool::FreePicture().
230/// If picture creation failed 0 is returned.
231
232const TGPicture *TGPicturePool::GetPicture(const char *name, char **xpm)
233{
234 UInt_t w, h;
235
236 if (!xpm || !*xpm) {
237 return 0;
238 }
239
240 if (!fPicList) {
241 fPicList = new THashTable(50);
242 }
243 char *ptr = xpm[0];
244 while (isspace((int)*ptr)) ++ptr;
245 w = atoi(ptr);
246
247 while (isspace((int)*ptr)) ++ptr;
248 h = atoi(ptr);
249
250 const char *hname = TGPicture::HashName(name, w, h);
251 TGPicture *pic = (TGPicture *)fPicList->FindObject(hname);
252 if (pic) {
253 pic->AddReference();
254 return pic;
255 }
256
257 TImage *img = TImage::Open(xpm);
258 if (!img) {
259 pic = new TGPicture(hname, kTRUE);
261 pic->fAttributes.fCloseness = 40000; // Allow for "similar" colors
263 pic->fAttributes.fWidth = w;
264 pic->fAttributes.fHeight = h;
265 fPicList->Add(pic);
266 return 0;
267 }
268
269 pic = new TGPicture(hname, img->GetPixmap(), img->GetMask());
270 delete img;
271 return pic;
272}
273
274////////////////////////////////////////////////////////////////////////////////
275/// Remove picture from cache if nobody is using it anymore.
276
278{
279 if (!fPicList) return;
280
281 TGPicture *pic = (TGPicture *)fPicList->FindObject(fpic);
282 if (pic) {
283 if (pic->RemoveReference() == 0) {
284 fPicList->Remove(pic);
285 delete pic;
286 }
287 }
288}
289
290////////////////////////////////////////////////////////////////////////////////
291/// Delete picture cache.
292
294{
295 if (fPicList) {
296 fPicList->Delete();
297 delete fPicList;
298 }
299
300 // Required since we overload TObject::Hash.
302}
303
304////////////////////////////////////////////////////////////////////////////////
305/// List all pictures in the pool.
306
308{
309 if (fPicList)
310 fPicList->Print();
311 else
312 Info("Print", "no pictures in picture pool");
313}
314
315////////////////////////////////////////////////////////////////////////////////
316/// ctor. Important: both pixmaps pxmap and mask must be unique (not shared)
317
319{
320 fName = name;
321 fScaled = kFALSE;
322 fPic = pxmap;
323 fMask = mask;
324 Int_t xy;
325
326 fAttributes.fColormap = gClient->GetDefaultColormap();
327 fAttributes.fCloseness = 40000; // Allow for "similar" colors
334
336 SetRefCount(1);
337}
338
339////////////////////////////////////////////////////////////////////////////////
340/// Draw a picture.
341
343{
344 GCValues_t gcv;
345
347 gcv.fClipMask = fMask;
348 gcv.fClipXOrigin = x;
349 gcv.fClipYOrigin = y;
350 gVirtualX->ChangeGC(gc, &gcv);
351 gVirtualX->CopyArea(fPic, id, gc, 0, 0, fAttributes.fWidth, fAttributes.fHeight,
352 x, y);
353 gcv.fMask = kGCClipMask;
354 gcv.fClipMask = kNone;
355 gVirtualX->ChangeGC(gc, &gcv);
356}
357
358////////////////////////////////////////////////////////////////////////////////
359/// Delete picture object.
360
362{
363 if (fPic != kNone)
364 gVirtualX->DeletePixmap(fPic);
365 if (fMask != kNone)
366 gVirtualX->DeletePixmap(fMask);
368 delete [] fAttributes.fPixels;
369}
370
371////////////////////////////////////////////////////////////////////////////////
372/// Static function returning a unique name used to look up a picture.
373/// The unique name has the form "name__widthxheight".
374
375const char *TGPicture::HashName(const char *name, Int_t width, Int_t height)
376{
377 static TString hashName;
378
379 hashName.Form("%s__%dx%d", name, width, height);
380 return hashName.Data();
381}
382
383////////////////////////////////////////////////////////////////////////////////
384/// Print picture info.
385
387{
388 Printf("TGPicture: %s,%sref cnt = %u %lx", GetName(),
389 fScaled ? " scaled, " : " ", References(), fPic);
390}
391
392
393////////////////////////////////////////////////////////////////////////////////
394/// Create a "selected" looking picture based on the original TGPicture.
395
397 TGPicture("")
398{
399 GCValues_t gcv;
400 UInt_t w, h;
401
402 fClient = client;
404
405 w = p->GetWidth();
406 h = p->GetHeight();
407
408 fPic = gVirtualX->CreatePixmap(root, w, h);
409 fMask = p->GetMask();
410
413
414 gVirtualX->CopyArea(p->GetPicture(), fPic, GetSelectedGC()(), 0, 0, w, h, 0, 0);
415
417 gcv.fClipMask = p->GetMask();
418 gcv.fClipXOrigin = 0;
419 gcv.fClipYOrigin = 0;
421
422 gVirtualX->FillRectangle(fPic, GetSelectedGC()(), 0, 0, w, h);
423
425}
426
427////////////////////////////////////////////////////////////////////////////////
428/// Delete selected picture.
429
431{
432 // fMask was borrowed so should not be deleted by ~TGPicture.
433 fMask = kNone;
434}
435
436////////////////////////////////////////////////////////////////////////////////
437/// Return selection graphics context in use.
438
440{
441 if (!fgSelectedGC) {
442 fgSelectedGC = new TGGC(*gClient->GetResourcePool()->GetFrameGC());
443 fgSelectedGC->SetForeground(gClient->GetResourcePool()->GetSelectedBgndColor());
444 fgSelectedGC->SetBackground(gClient->GetResourcePool()->GetBlackColor());
446 fgSelectedGC->SetStipple(gClient->GetResourcePool()->GetCheckeredBitmap());
447 }
448 return *fgSelectedGC;
449}
const Mask_t kGCClipXOrigin
Definition: GuiTypes.h:302
ULong_t Handle_t
Definition: GuiTypes.h:25
const Mask_t kPACloseness
Definition: GuiTypes.h:341
Handle_t Pixmap_t
Definition: GuiTypes.h:29
const Handle_t kNone
Definition: GuiTypes.h:87
@ kFillStippled
Definition: GuiTypes.h:50
const Mask_t kPAColormap
Definition: GuiTypes.h:336
Handle_t GContext_t
Definition: GuiTypes.h:37
const Mask_t kGCClipYOrigin
Definition: GuiTypes.h:303
const Mask_t kPASize
Definition: GuiTypes.h:338
const Mask_t kGCClipMask
Definition: GuiTypes.h:304
Handle_t Window_t
Definition: GuiTypes.h:28
#define h(i)
Definition: RSha256.hxx:106
int Int_t
Definition: RtypesCore.h:41
unsigned int UInt_t
Definition: RtypesCore.h:42
const Bool_t kFALSE
Definition: RtypesCore.h:88
const Bool_t kTRUE
Definition: RtypesCore.h:87
const char Option_t
Definition: RtypesCore.h:62
#define ClassImp(name)
Definition: Rtypes.h:365
include TDocParser_001 C image html pict1_TDocParser_001 png width
Definition: TDocParser.cxx:121
#define gClient
Definition: TGClient.h:166
char name[80]
Definition: TGX11.cxx:109
XPoint xy[kMAXMK]
Definition: TGX11.cxx:122
void Printf(const char *fmt,...)
@ kReadPermission
Definition: TSystem.h:48
R__EXTERN TSystem * gSystem
Definition: TSystem.h:560
#define gVirtualX
Definition: TVirtualX.h:345
const TGWindow * GetDefaultRoot() const
Returns the root (i.e.
Definition: TGClient.cxx:234
Colormap_t GetDefaultColormap() const
Definition: TGClient.h:154
Definition: TGGC.h:31
void SetFillStyle(Int_t v)
Set fill style (kFillSolid, kFillTiled, kFillStippled, kFillOpaeueStippled).
Definition: TGGC.cxx:343
void SetForeground(Pixel_t v)
Set foreground color.
Definition: TGGC.cxx:276
void SetClipMask(Pixmap_t v)
Bitmap for clipping.
Definition: TGGC.cxx:464
void SetAttributes(GCValues_t *values)
Set attributes as specified in the values structure.
Definition: TGGC.cxx:233
void SetBackground(Pixel_t v)
Set background color.
Definition: TGGC.cxx:287
void SetStipple(Pixmap_t v)
Set 1 plane pixmap for stippling.
Definition: TGGC.cxx:376
Handle_t GetId() const
Definition: TGObject.h:47
virtual ~TGPicturePool()
Delete picture cache.
Definition: TGPicture.cxx:293
TString fPath
Definition: TGPicture.h:104
THashTable * fPicList
Definition: TGPicture.h:105
void Print(Option_t *option="") const
List all pictures in the pool.
Definition: TGPicture.cxx:307
TGPicturePool(const TGPicturePool &)
copy constructor
Definition: TGPicture.cxx:54
void FreePicture(const TGPicture *pic)
Remove picture from cache if nobody is using it anymore.
Definition: TGPicture.cxx:277
const TGClient * fClient
Definition: TGPicture.h:103
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:65
Pixmap_t fPic
Definition: TGPicture.h:43
PictureAttributes_t fAttributes
Definition: TGPicture.h:45
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.
Definition: TGPicture.cxx:375
Pixmap_t fMask
Definition: TGPicture.h:44
Pixmap_t GetMask() const
Definition: TGPicture.h:66
Bool_t IsScaled() const
Definition: TGPicture.h:67
const char * GetName() const
Returns name of object.
Definition: TGPicture.h:62
TGPicture(const char *name, Bool_t scaled=kFALSE)
Definition: TGPicture.h:47
UInt_t GetHeight() const
Definition: TGPicture.h:64
void Draw(Option_t *="")
Default Draw method for all objects.
Definition: TGPicture.h:57
Pixmap_t GetPicture() const
Definition: TGPicture.h:65
virtual ~TGPicture()
Delete picture object.
Definition: TGPicture.cxx:361
Bool_t fScaled
Definition: TGPicture.h:42
void Print(Option_t *option="") const
Print picture info.
Definition: TGPicture.cxx:386
TString fName
Definition: TGPicture.h:41
UInt_t GetWidth() const
Definition: TGPicture.h:63
static TGGC & GetSelectedGC()
Return selection graphics context in use.
Definition: TGPicture.cxx:439
static TGGC * fgSelectedGC
Definition: TGPicture.h:83
TGSelectedPicture(const TGSelectedPicture &gp)
Definition: TGPicture.h:86
virtual ~TGSelectedPicture()
Delete selected picture.
Definition: TGPicture.cxx:430
const TGClient * fClient
Definition: TGPicture.h:81
THashTable implements a hash table to store TObject's.
Definition: THashTable.h:35
TObject * Remove(TObject *obj)
Remove object from the hashtable.
Definition: THashTable.cxx:417
void Add(TObject *obj)
Add object to the hash table.
Definition: THashTable.cxx:92
void Print(Option_t *option, Int_t recurse) const
Print the collection header and its elements.
Definition: THashTable.cxx:328
TObject * FindObject(const char *name) const
Find object using its name.
Definition: THashTable.cxx:238
void Delete(Option_t *option="")
Remove all objects from the table AND delete all heap based objects.
Definition: THashTable.cxx:220
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:119
virtual void Scale(UInt_t, UInt_t)
Definition: TImage.h:141
virtual Pixmap_t GetPixmap()
Definition: TImage.h:235
virtual Pixmap_t GetMask()
Definition: TImage.h:236
Mother of all ROOT objects.
Definition: TObject.h:37
TObject & operator=(const TObject &rhs)
TObject assignment operator.
Definition: TObject.h:268
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Definition: TObject.cxx:854
void AddReference()
Definition: TRefCnt.h:40
void SetRefCount(UInt_t r)
Definition: TRefCnt.h:39
UInt_t RemoveReference()
Definition: TRefCnt.h:41
UInt_t References() const
Definition: TRefCnt.h:38
Basic string class.
Definition: TString.h:131
Ssiz_t Length() const
Definition: TString.h:405
void ToLower()
Change string to lower-case.
Definition: TString.cxx:1125
TSubString Strip(EStripType s=kTrailing, char c=' ') const
Return a substring of self stripped at beginning and/or end.
Definition: TString.cxx:1106
const char * Data() const
Definition: TString.h:364
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Definition: TString.cxx:2289
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
Definition: TSystem.cxx:1265
virtual const char * UnixPathName(const char *unixpathname)
Convert from a Unix pathname to a local pathname.
Definition: TSystem.cxx:1054
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
Definition: TSystem.cxx:1537
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:404
Pixmap_t fClipMask
Definition: GuiTypes.h:246
Int_t fClipYOrigin
Definition: GuiTypes.h:245
Int_t fClipXOrigin
Definition: GuiTypes.h:244
Mask_t fMask
Definition: GuiTypes.h:250
ULong_t * fPixels
Definition: GuiTypes.h:329
Colormap_t fColormap
Definition: GuiTypes.h:323