CIconHandler::CIconHandler() { PrintLoadMsg("Parsing unit icons"); standardTextureGenerated = false; LoadTDFicons("usericons.tdf"); LoadTDFicons("gamedata/icontypes.tdf"); // If the default icon doesn't exist we'll have to create one // (as unitdef->iconType defaults to "default"). if (icons.find("default") == icons.end()) { icons["default"] = SAFE_NEW CIcon(*GetStandardTexture(), 1, 1, false); } }
static Bool xcursor_load( Handle self, Handle icon) { DEFXX; int id; PIcon c; int x, y; XcursorPixel * src; XcursorImage* i; Byte * dst_data, * dst_mask; Bool kill; id = get_cursor( self, nil, nil, nil, nil); if ( id < crDefault || id > crUser) return false; if ( id != crUser ) { if (( i = XcursorLibraryLoadImage( xcursor_map[id] , NULL, guts. cursor_width )) == NULL) return false; kill = true; } else { i = XX-> user_xcursor; kill = false; } c = PIcon(icon); CIcon(icon)-> create_empty_icon( icon, i->width, i->height, imRGB, imbpp8); dst_data = c->data + c->lineSize * ( c-> h - 1 ); dst_mask = c->mask + c->maskLine * ( c-> h - 1 ); src = i->pixels; for ( y = 0; y < c-> h; y++) { Byte * d_data = dst_data, * d_mask = dst_mask; for ( x = 0; x < c-> w; x++) { *d_data++ = *src & 0xff; *d_data++ = (*src >> 8) & 0xff; *d_data++ = (*src >> 16) & 0xff; *d_mask++ = (*src >> 24) & 0xff; src++; } dst_mask -= c->maskLine; dst_data -= c->lineSize; } if ( kill ) XcursorImageDestroy(i); return true; }
bool CIconHandler::LoadTDFicons(const std::string& filename) { try { TdfParser tdfparser(filename); std::vector<std::string> iconList = tdfparser.GetSectionList("icontypes"); CBitmap bitmap; for (std::vector<std::string>::const_iterator it = iconList.begin(); it != iconList.end(); ++it) { if (icons.find(*it) != icons.end()) { continue; // first come, first served (also avoids possible memory leaks) } //Parse the bitmap location, the size, and the unit radius adjustment. float size=atof(tdfparser.SGetValueDef("1", "icontypes\\" + *it + "\\size").c_str()); float distance=atof(tdfparser.SGetValueDef("1", "icontypes\\" + *it + "\\distance").c_str()); bool radiusAdjust=!!atoi(tdfparser.SGetValueDef("0", "icontypes\\" + *it + "\\radiusadjust").c_str()); // If we can't load the bitmap replace it with the default one. std::string bitmapLocation=tdfparser.SGetValueDef("", "icontypes\\" + *it + "\\bitmap"); unsigned int texture; if(!bitmapLocation.empty () && bitmap.Load(bitmapLocation)){ texture = bitmap.CreateTexture(true); glBindTexture(GL_TEXTURE_2D, texture); if (GLEW_EXT_texture_edge_clamp) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } else { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); } } else { texture = *GetStandardTexture(); } icons[*it] = SAFE_NEW CIcon(texture,size,distance,radiusAdjust); } } catch (const TdfParser::parse_error& e) { // Show parse errors in the infolog. logOutput.Print("%s:%d: %s", e.get_filename().c_str(), e.get_line(), e.what()); } catch (const content_error&) { // Ignore non-existant file. } return true; }
static Bool create_cursor(Handle self, Handle icon, Point hot_spot) { #ifdef HAVE_X11_XCURSOR_XCURSOR_H DEFXX; XcursorImage* i; PIcon c = PIcon(icon); Bool kill; int x, y; XcursorPixel * dst; Byte * src_data, * src_mask; if ( hot_spot. x < 0) hot_spot. x = 0; if ( hot_spot. y < 0) hot_spot. y = 0; if ( hot_spot. x >= c-> w) hot_spot. x = c-> w - 1; if ( hot_spot. y >= c-> h) hot_spot. y = c-> h - 1; XX-> pointer_hot_spot = hot_spot; if (( i = XcursorImageCreate( c-> w, c-> h )) == NULL) { warn( "XcursorImageCreate(%d,%d) error", c->w, c->h); return false; } i-> xhot = hot_spot. x; i-> yhot = c-> h - hot_spot. y - 1; if ( c-> type != imRGB || c-> maskType != imbpp8 ) { icon = CIcon(icon)->dup(icon); kill = true; CIcon(icon)-> set_type( icon, imRGB ); CIcon(icon)-> set_maskType( icon, imbpp8 ); } else kill = false; c = PIcon(icon); src_data = c->data + c->lineSize * ( c-> h - 1 ); src_mask = c->mask + c->maskLine * ( c-> h - 1 ); dst = i->pixels; for ( y = 0; y < c-> h; y++) { Byte * s_data = src_data, * s_mask = src_mask; for ( x = 0; x < c-> w; x++) { *(dst++) = s_data[0]| (s_data[1] << 8)| (s_data[2] << 16)| (*(s_mask++) << 24) ; s_data += 3; } src_mask -= c->maskLine; src_data -= c->lineSize; } if ( kill ) Object_destroy(icon); XX-> user_pointer = XcursorImageLoadCursor(DISP, i); if ( XX-> user_pointer == None) { XcursorImageDestroy(i); warn( "error creating cursor"); return false; } XX-> user_xcursor = i; return true; #else DEFXX; Handle cursor; Bool noSZ = PIcon(icon)-> w != guts.cursor_width || PIcon(icon)-> h != guts.cursor_height; Bool noBPP = (PIcon(icon)-> type & imBPP) != 1; XColor xcb, xcw; PIcon c; if ( noSZ || noBPP) { cursor = CIcon(icon)->dup(icon); c = PIcon(cursor); if ( cursor == nilHandle) { warn( "Error duping user cursor"); return false; } if ( noSZ) { CIcon(cursor)-> stretch( cursor, guts.cursor_width, guts.cursor_height); if ( c-> w != guts.cursor_width || c-> h != guts.cursor_height) { warn( "Error stretching user cursor"); Object_destroy( cursor); return false; } } if ( noBPP) { CIcon(cursor)-> set_type( cursor, imMono); if ((c-> type & imBPP) != 1) { warn( "Error black-n-whiting user cursor"); Object_destroy( cursor); return false; } } } else cursor = icon; if ( !prima_create_icon_pixmaps( cursor, &XX-> user_p_source, &XX-> user_p_mask)) { warn( "Error creating user cursor pixmaps"); if ( noSZ || noBPP) Object_destroy( cursor); return false; } if ( noSZ || noBPP) Object_destroy( cursor); if ( hot_spot. x < 0) hot_spot. x = 0; if ( hot_spot. y < 0) hot_spot. y = 0; if ( hot_spot. x >= guts. cursor_width) hot_spot. x = guts. cursor_width - 1; if ( hot_spot. y >= guts. cursor_height) hot_spot. y = guts. cursor_height - 1; XX-> pointer_hot_spot = hot_spot; xcb. red = xcb. green = xcb. blue = 0; xcw. red = xcw. green = xcw. blue = 0xFFFF; xcb. pixel = guts. monochromeMap[0]; xcw. pixel = guts. monochromeMap[1]; xcb. flags = xcw. flags = DoRed | DoGreen | DoBlue; XX-> user_pointer = XCreatePixmapCursor( DISP, XX-> user_p_source, XX-> user_p_mask, &xcw, &xcb, hot_spot. x, guts.cursor_height - hot_spot. y - 1); if ( XX-> user_pointer == None) { warn( "error creating cursor from pixmaps"); return false; } return true; #endif }
static Bool xlib_cursor_load( Handle self, Handle icon) { XImage *im; Pixmap p1 = None, p2 = None; Bool free_pixmap = true; GC gc; XGCValues gcv; char c; int id, w = guts.cursor_width, h = guts.cursor_height; id = get_cursor( self, &p1, &p2, nil, nil); if ( id < crDefault || id > crUser) return false; if ( id == crUser) { if ( !p1 || !p2) { warn( "User pointer inconsistency"); return false; } free_pixmap = false; } else { XFontStruct *fs; XCharStruct *cs; int idx = cursor_map[id]; if ( !load_pointer_font()) return false; fs = guts.pointer_font; if ( !fs-> per_char) cs = &fs-> min_bounds; else if ( idx < fs-> min_char_or_byte2 || idx > fs-> max_char_or_byte2) { int default_char = fs-> default_char; if ( default_char < fs-> min_char_or_byte2 || default_char > fs-> max_char_or_byte2) default_char = fs-> min_char_or_byte2; cs = fs-> per_char + default_char - fs-> min_char_or_byte2; } else cs = fs-> per_char + idx - fs-> min_char_or_byte2; p1 = XCreatePixmap( DISP, guts. root, w, h, 1); p2 = XCreatePixmap( DISP, guts. root, w, h, 1); gcv. background = 1; gcv. foreground = 0; gcv. font = guts.pointer_font-> fid; gc = XCreateGC( DISP, p1, GCBackground | GCForeground | GCFont, &gcv); XFillRectangle( DISP, p1, gc, 0, 0, w, h); gcv. background = 0; gcv. foreground = 1; XChangeGC( DISP, gc, GCBackground | GCForeground, &gcv); XFillRectangle( DISP, p2, gc, 0, 0, w, h); XDrawString( DISP, p1, gc, -cs-> lbearing, cs-> ascent, (c = (char)(idx+1), &c), 1); gcv. background = 1; gcv. foreground = 0; XChangeGC( DISP, gc, GCBackground | GCForeground, &gcv); XDrawString( DISP, p2, gc, -cs-> lbearing, cs-> ascent, (c = (char)(idx+1), &c), 1); XDrawString( DISP, p1, gc, -cs-> lbearing, cs-> ascent, (c = (char)idx, &c), 1); XFreeGC( DISP, gc); } CIcon(icon)-> create_empty( icon, w, h, imBW); im = XGetImage( DISP, p1, 0, 0, w, h, 1, XYPixmap); prima_copy_xybitmap( PIcon(icon)-> data, (Byte*)im-> data, PIcon(icon)-> w, PIcon(icon)-> h, PIcon(icon)-> lineSize, im-> bytes_per_line); XDestroyImage( im); im = XGetImage( DISP, p2, 0, 0, w, h, 1, XYPixmap); prima_copy_xybitmap( PIcon(icon)-> mask, (Byte*)im-> data, PIcon(icon)-> w, PIcon(icon)-> h, PIcon(icon)-> maskLine, im-> bytes_per_line); if ( id == crUser) { int i; Byte * mask = PIcon(icon)-> mask; for ( i = 0; i < PIcon(icon)-> maskSize; i++) mask[i] = ~mask[i]; } XDestroyImage( im); if ( free_pixmap) { XFreePixmap( DISP, p1); XFreePixmap( DISP, p2); } return true; }
LRESULT FavoriteHubsFrame::onCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { ctrlHubs.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_HSCROLL | WS_VSCROLL | LVS_REPORT | LVS_SHOWSELALWAYS, WS_EX_CLIENTEDGE, IDC_HUBLIST); ctrlHubs.SetExtendedListViewStyle(LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_HEADERDRAGDROP | LVS_EX_DOUBLEBUFFER | LVS_EX_INFOTIP); ctrlHubs.SetBkColor(WinUtil::bgColor); ctrlHubs.SetTextBkColor(WinUtil::bgColor); ctrlHubs.SetTextColor(WinUtil::textColor); ctrlHubs.SetFont(WinUtil::listViewFont); ctrlHubs.EnableGroupView(TRUE); LVGROUPMETRICS metrics = {0}; metrics.cbSize = sizeof(metrics); metrics.mask = LVGMF_TEXTCOLOR; metrics.crHeader = SETTING(TEXT_GENERAL_FORE_COLOR); ctrlHubs.SetGroupMetrics(&metrics); // Create listview columns WinUtil::splitTokens(columnIndexes, SETTING(FAVORITESFRAME_ORDER), COLUMN_LAST); WinUtil::splitTokens(columnSizes, SETTING(FAVORITESFRAME_WIDTHS), COLUMN_LAST); for(int j=0; j<COLUMN_LAST; j++) { int fmt = LVCFMT_LEFT; ctrlHubs.InsertColumn(j, CTSTRING_I(columnNames[j]), fmt, columnSizes[j], j); } ctrlHubs.SetColumnOrderArray(COLUMN_LAST, columnIndexes); ctrlConnect.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | BS_PUSHBUTTON , 0, IDC_CONNECT); ctrlConnect.SetWindowText(CTSTRING(CONNECT)); ctrlConnect.SetFont(WinUtil::systemFont); ctrlNew.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | BS_PUSHBUTTON , 0, IDC_NEWFAV); ctrlNew.SetWindowText(CTSTRING(NEW_DOTS)); ctrlNew.SetFont(WinUtil::systemFont); ctrlProps.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | BS_PUSHBUTTON , 0, IDC_EDIT); ctrlProps.SetWindowText(CTSTRING(PROPERTIES)); ctrlProps.SetFont(WinUtil::systemFont); ctrlRemove.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | BS_PUSHBUTTON , 0, IDC_REMOVE); ctrlRemove.SetWindowText(CTSTRING(REMOVE)); ctrlRemove.SetFont(WinUtil::systemFont); ctrlUp.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | BS_PUSHBUTTON , 0, IDC_MOVE_UP); ctrlUp.SetWindowText(CTSTRING(MOVE_UP)); ctrlUp.SetFont(WinUtil::systemFont); ctrlDown.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | BS_PUSHBUTTON , 0, IDC_MOVE_DOWN); ctrlDown.SetWindowText(CTSTRING(MOVE_DOWN)); ctrlDown.SetFont(WinUtil::systemFont); ctrlManageGroups.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | BS_PUSHBUTTON , 0, IDC_MANAGE_GROUPS); ctrlManageGroups.SetWindowText(CTSTRING(MANAGE_GROUPS)); ctrlManageGroups.SetFont(WinUtil::systemFont); onlineStatusImg.Create(16, 16, ILC_COLOR32 | ILC_MASK, 0, 2); onlineStatusImg.AddIcon(CIcon(ResourceLoader::loadIcon(IDI_ONLINE, 16))); onlineStatusImg.AddIcon(CIcon(ResourceLoader::loadIcon(IDI_OFFLINE, 16))); ctrlHubs.SetImageList(onlineStatusImg, LVSIL_SMALL); ClientManager::getInstance()->getOnlineClients(onlineHubs); FavoriteManager::getInstance()->addListener(this); SettingsManager::getInstance()->addListener(this); ClientManager::getInstance()->addListener(this); fillList(); hubsMenu.CreatePopupMenu(); hubsMenu.AppendMenu(MF_STRING, IDC_OPEN_HUB_LOG, CTSTRING(OPEN_HUB_LOG)); hubsMenu.AppendMenu(MF_SEPARATOR); hubsMenu.AppendMenu(MF_STRING, IDC_CONNECT, CTSTRING(CONNECT)); hubsMenu.AppendMenu(MF_STRING, IDC_NEWFAV, CTSTRING(NEW_DOTS)); hubsMenu.AppendMenu(MF_STRING, IDC_MOVE_UP, CTSTRING(MOVE_UP)); hubsMenu.AppendMenu(MF_STRING, IDC_MOVE_DOWN, CTSTRING(MOVE_DOWN)); hubsMenu.AppendMenu(MF_SEPARATOR); hubsMenu.AppendMenu(MF_STRING, IDC_REMOVE, CTSTRING(REMOVE)); hubsMenu.AppendMenu(MF_SEPARATOR); hubsMenu.AppendMenu(MF_STRING, IDC_EDIT, CTSTRING(PROPERTIES)); hubsMenu.SetMenuDefaultItem(IDC_CONNECT); CRect rc(SETTING(FAV_LEFT), SETTING(FAV_TOP), SETTING(FAV_RIGHT), SETTING(FAV_BOTTOM)); if(! (rc.top == 0 && rc.bottom == 0 && rc.left == 0 && rc.right == 0) ) MoveWindow(rc, TRUE); nosave = false; WinUtil::SetIcon(m_hWnd, IDI_FAVORITEHUBS); bHandled = FALSE; return TRUE; }