#include "stdafx.h"
//#include "p4win.h"
#include "ImageList.h"
#include "P4Image.h"
#include "resource.h"
///////////////////////////////////////////////////////////////////////////
// CP4ToolBarImageList
bool CP4WinToolBarImageList::Create()
{
return CP4ToolBarImageList::Create(18, 16,
IDB_TOOLBAR4, IDB_BITMAPDIS, IDB_TOOLBAR32,
RGB(255, 0, 255));
}
///////////////////////////////////////////////////////////////////////////
// CP4ViewIconsImageList
// SrcImages represents the actual images in TreeIcons?.bmp
// it must be kept in sync with the bitmap.
// note: for built up images, base images are mixed in with badges,
// but must precede badge images so that they will be drawn first
// and badges drawn on top of them
enum SrcImages
{
SI_LAST_SIMPLE = 19,
// base images
SI_CLIENT,
SI_USER,
SI_GHOST,
SI_TEXT,
SI_BINARY,
// badge images
SI_RED_DOC_BORDER,
SI_YOUR_EDIT,
SI_YOUR_DELETE,
SI_YOUR_ADD,
SI_THEIR_ADD,
SI_THEIR_EDIT,
SI_THEIR_DELETE,
SI_YOUR_LOCK,
SI_THEIR_LOCK,
SI_SYNCED,
SI_NOT_SYNCED,
SI_CUR,
SI_DEF,
SI_BLANK,
// more simple images
SI_OPENFOLDER,
};
// convert from CUSB enum flag to image index
static int CUSBToImage(int badge)
{
static int map[][2] =
{
{CP4ViewImageList::CUSB_USER, SI_USER},
{CP4ViewImageList::CUSB_CLIENT, SI_CLIENT},
{CP4ViewImageList::CUSB_DEF, SI_DEF},
{CP4ViewImageList::CUSB_CUR, SI_CUR},
{-1,-1}
};
for(int i = 0; map[i][0] != -1; i++)
if(map[i][0] == badge)
return map[i][1];
ASSERT(0);
return 0;
}
// convert from FSB enum flag to image index
static int FSBToImage(int badge)
{
static int map[][2] =
{
{CP4ViewImageList::FSB_GHOST, SI_GHOST},
{CP4ViewImageList::FSB_TEXT, SI_TEXT},
{CP4ViewImageList::FSB_BINARY, SI_BINARY},
{CP4ViewImageList::FSB_YOUR_EDIT, SI_YOUR_EDIT},
{CP4ViewImageList::FSB_YOUR_DELETE, SI_YOUR_DELETE},
{CP4ViewImageList::FSB_YOUR_ADD, SI_YOUR_ADD},
{CP4ViewImageList::FSB_THEIR_EDIT, SI_THEIR_EDIT},
{CP4ViewImageList::FSB_THEIR_DELETE,SI_THEIR_DELETE},
{CP4ViewImageList::FSB_THEIR_ADD, SI_THEIR_ADD},
{CP4ViewImageList::FSB_YOUR_LOCK, SI_YOUR_LOCK},
{CP4ViewImageList::FSB_THEIR_LOCK, SI_THEIR_LOCK},
{CP4ViewImageList::FSB_SYNCED, SI_SYNCED},
{CP4ViewImageList::FSB_NOT_SYNCED, SI_NOT_SYNCED},
{-1,-1}
};
for(int i = 0; map[i][0] != -1; i++)
if(map[i][0] == badge)
return map[i][1];
ASSERT(0);
return 0;
}
// lookup tables for finding an icon given it's state mask
static unsigned short fileMap[2 << CP4ViewImageList::FSB_NUM_BITS];
static unsigned short cuMap[2 << CP4ViewImageList::CUSB_NUM_BITS];
// return composite image index for client/user (CUSB) state flags
int CP4ViewImageList::GetCUIndex(int state)
{
int result = cuMap[state];
ASSERT(result); // illegal combination state bits
return result;
}
// return image index for client with specified attributes
int CP4ViewImageList::GetClientIndex(bool isCurrent, bool isDefault)
{
return GetCUIndex(CUSB_CLIENT |
(isDefault ? CUSB_DEF : 0) |
(isCurrent ? CUSB_CUR : 0));
}
// return image index for user with specified attributes
int CP4ViewImageList::GetUserIndex(bool isCurrent, bool isDefault)
{
return GetCUIndex(CUSB_USER |
(isDefault ? CUSB_DEF : 0) |
(isCurrent ? CUSB_CUR : 0));
}
// return composite image index for file state (FSB) flags
int CP4ViewImageList::GetFileIndex(int state)
{
int result = fileMap[state];
ASSERT(result); // illegal combination state bits
return result;
}
// create a composite client or user image
static void AddCUImage(CP4Image &dst, CP4Image &src, int &x, int layers)
{
ASSERT(layers);
ASSERT(x/24 < 0x10000);
cuMap[layers] = (unsigned short)(x / 24);
int mask = 1;
while(layers)
{
if(layers & 1)
{
int img = CUSBToImage(mask);
dst.BlendImage(x/24, src, img);
}
layers >>= 1;
mask <<= 1;
}
x += 24;
}
// create a composite file image
static void AddFileImage(CP4Image &dst, CP4Image &src, int &x, int layers)
{
ASSERT(layers);
ASSERT(x/24 < 0x10000);
fileMap[layers] = (unsigned short)(x / 24);
bool red = (layers & CP4ViewImageList::FSB_YOUR_ADD) &&
(layers & CP4ViewImageList::FSB_THEIR_ADD);
int mask = 1;
while(layers)
{
if(layers & 1)
{
int img = FSBToImage(mask);
dst.BlendImage(x/24, src, img);
// special case to get red border when you're not the
// only one to have a file open for add
if(red)
dst.BlendImage(x/24, src, SI_RED_DOC_BORDER);
red = false;
}
layers >>= 1;
mask <<= 1;
}
x += 24;
}
// add a group of file images with non-add actions
static void AddFileImageSync(CP4Image &dst, CP4Image &src, int &x, int base)
{
AddFileImage(dst, src, x, base);
AddFileImage(dst, src, x, base | CP4ViewImageList::FSB_SYNCED);
AddFileImage(dst, src, x, base | CP4ViewImageList::FSB_NOT_SYNCED);
}
static void AddFileImageLock(CP4Image &dst, CP4Image &src, int &x, int base)
{
AddFileImageSync(dst, src, x, base);
AddFileImageSync(dst, src, x, base | CP4ViewImageList::FSB_YOUR_LOCK);
AddFileImageSync(dst, src, x, base | CP4ViewImageList::FSB_THEIR_LOCK);
}
static void AddFileImageTheirAction(CP4Image &dst, CP4Image &src, int &x, int base)
{
AddFileImageLock(dst, src, x, base);
AddFileImageLock(dst, src, x, base | CP4ViewImageList::FSB_THEIR_DELETE);
AddFileImageLock(dst, src, x, base | CP4ViewImageList::FSB_THEIR_ADD);
AddFileImageLock(dst, src, x, base | CP4ViewImageList::FSB_THEIR_EDIT);
}
static void AddFileImageYourAction(CP4Image &dst, CP4Image &src, int &x, int base)
{
AddFileImageTheirAction(dst, src, x, base);
AddFileImageTheirAction(dst, src, x, base | CP4ViewImageList::FSB_YOUR_DELETE);
AddFileImageTheirAction(dst, src, x, base | CP4ViewImageList::FSB_YOUR_ADD);
AddFileImageTheirAction(dst, src, x, base | CP4ViewImageList::FSB_YOUR_EDIT);
}
static void AddFileImageType(CP4Image &dst, CP4Image &src, int &x, int base)
{
AddFileImageYourAction(dst, src, x, base | CP4ViewImageList::FSB_BINARY);
AddFileImageYourAction(dst, src, x, base | CP4ViewImageList::FSB_TEXT);
}
// create the bitmap containing both simple and composite images
void CP4ViewImageList::MakeBitmap(CP4Image &dst, CP4Image &src, COLORREF bg)
{
// first, set the whole thing to the background color
dst.FillImage(bg);
// next, just copy over the first segment of simple images
int i;
for(i = 0; i <= SI_LAST_SIMPLE; i++)
dst.BlendImage(i, src, i);
// add open folder icon
dst.BlendImage(i++, src, SI_OPENFOLDER);
// create the unresolved pending chglist ones
dst.BlendImage(i, src, CP4ViewImageList::VI_YOURCHANGE);
dst.BlendImage(i++, src, SI_NOT_SYNCED);
dst.BlendImage(i, src, CP4ViewImageList::VI_YOUROTHERCHANGE);
dst.BlendImage(i++, src, SI_NOT_SYNCED);
int x = i * 24;
// copy client, plus badges
AddCUImage(dst, src, x, CUSB_CLIENT);
AddCUImage(dst, src, x, CUSB_CLIENT | CUSB_CUR);
AddCUImage(dst, src, x, CUSB_CLIENT | CUSB_DEF);
AddCUImage(dst, src, x, CUSB_CLIENT | CUSB_CUR | CUSB_DEF);
// copy user, plus badges
AddCUImage(dst, src, x, CUSB_USER);
AddCUImage(dst, src, x, CUSB_USER | CUSB_CUR);
AddCUImage(dst, src, x, CUSB_USER | CUSB_DEF);
AddCUImage(dst, src, x, CUSB_USER | CUSB_CUR | CUSB_DEF);
// create all file images except the wierd one
AddFileImageType(dst, src, x, 0);
// create the wierd file one
AddFileImage(dst, src, x, FSB_GHOST | FSB_SYNCED);
}
bool CP4ViewImageList::Create()
{
// determine width required for bitmap
int w = 24 *
(SI_LAST_SIMPLE + 1 + // simple (non-composite) images
4 + // user + cur/def
4 + // client + cur/def
2 * // file types: binary, text
4 * // your action: none, add, edit, delete
4 * // their action: none, add, edit, delete
3 * // lock states: none, yours, theirs
3 + // sync states: none, synced, not synced
1 + // wierd ghost combo
1 + // open folder
2 ); // 2 unresolved pending chglists
CDC dc;
dc.CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
m_colorDepth = dc.GetDeviceCaps(BITSPIXEL);
if (m_colorDepth >= 16 && !m_use256ColorIcons)
{
// at least 16-bit color, so create a device dependent bitmap
// using 32-bit rgba source bitmap
if(!CImageList::Create(24, 16, ILC_COLOR32|ILC_MASK, 5, 0))
return false;
CP4ImageDib src(24);
CP4ImageDib dst(24);
if(src.Load(IDB_VIEWICONS32))
{
src.PreMultiplyAlpha();
dst.Create(w, 16);
MakeBitmap(dst, src, GetSysColor(COLOR_WINDOW));
CBitmap *bmp = dst.CreateDDB(dc);
if(bmp)
Add(bmp, GetSysColor(COLOR_WINDOW));
return true;
}
// something didn't work out, so fall through and use 16 colors
}
// 256 or fewer colors device, so use 16 color bitmap
if(!CImageList::Create(24, 16, ILC_COLOR4|ILC_MASK, 5, 0))
return false;
// use magenta for background; it will be transparent
// (using non-transparent COLOR_WINDOW background fails
// sometimes in 256 color mode)
COLORREF magenta = RGB(255,0,255);
CP4Image16 src(magenta, 24);
CP4Image16 dst(magenta, 24);
if(src.Load(IDB_VIEWICONS4) && dst.Create(dc, w, 16))
{
src.StartBlendingSource();
dst.StartBlendingDest(dc);
MakeBitmap(dst, src, magenta);
dst.EndBlendingDest();
src.EndBlendingSource();
CBitmap *bmp = dst.CreateDDB(dc);
if(bmp)
Add(bmp, magenta);
m_colorDepth = 4;
return true;
}
return false;
} | # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #1 | 19924 | YourUncleBob |
Populate -o //guest/perforce_software/p4win/... //guest/YourUncleBob/p4win/..... |
||
| //guest/perforce_software/p4win/main/gui/ImageList.cpp | |||||
| #1 | 16169 | perforce_software | Move files to follow new path scheme for branches. | ||
| //guest/perforce_software/p4win/gui/ImageList.cpp | |||||
| #1 | 8562 | Matt Attaway |
These feet never stop running. Initial commit of the P4Win source code. To the best of our knowledge this compiles and runs using the 2013.3 P4 API and VS 2010. Expect a few changes as we refine the build process. Please post any build issues to the forums. |
||