/* Winamp Skin Copyright (C) 2002 Ryan Cumming This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation. For more information look at the file COPYRIGHT in this package */ #include #include #include #include #include "waSkinModel.h" #include "waSkins.h" #include "waRegion.h" WaRegion *windowRegion = NULL; // Hack around case-insensitivity in Winamp INI files by searching for common capitializations // Needs to be replaced with an all-custom loader after 3.0 const char *pointListNames[] = {"PointList", "pointlist", "Pointlist", "pointList", "POINTLIST", 0}; const char *numPointsNames[] = {"NumPoints", "numpoints", "Numpoints", "numPoints", "NUMPOINTS", 0}; WaRegion::WaRegion(TQString filename) { // Load the region file, which happens to be in KConfig format KSimpleConfig regionFile(filename, true); // Clear our variables by default window_tqmask = 0; shade_tqmask = 0; // Make the new bitmaps, default window size window_tqmask = new TQBitmap(WaSkinModel::instance()->getMapGeometry(_WA_MAPPING_MAIN).size(), true); shade_tqmask = new TQBitmap(WaSkinModel::instance()->getMapGeometry(_WA_MAPPING_TITLE).size(), true); // Load the normal window tqmask data regionFile.setGroup("Normal"); TQValueList num_points; for (int x = 0;numPointsNames[x];x++) { if (regionFile.hasKey(numPointsNames[x])) num_points = parseList(regionFile.readEntry(numPointsNames[x])); } TQValueList point_list; for (int x = 0;pointListNames[x];x++) { if (regionFile.hasKey(pointListNames[x])) point_list = parseList(regionFile.readEntry(pointListNames[x])); } // Now build the tqmask buildPixmap(num_points, point_list, window_tqmask); // Load the windowshade tqmask data regionFile.setGroup("WindowShade"); num_points = parseList(regionFile.readEntry("NumPoints")); point_list = parseList(regionFile.readEntry("PointList")); // Now build the tqmask buildPixmap(num_points, point_list, shade_tqmask); } WaRegion::~WaRegion() { delete window_tqmask; delete shade_tqmask; } void WaRegion::buildPixmap(const TQValueList &num_points_list, const TQValueList &points_list, TQBitmap *dest) { if (!num_points_list.count()) { dest->fill(TQt::color1); return; } TQValueList::const_iterator points = points_list.begin(); TQPainter p(dest); // Coordinates in REGION.TXT can go one pixel beyond the window size TQBitmap bm(dest->width()+1,dest->height()+1,true); TQPainter bmp(&bm); bmp.setBrush(TQt::color1); bmp.setPen(TQt::NoPen); // The polygon border itself should not be part of the visible window // Go over each "region" in the file for (TQValueList::const_iterator num_points = num_points_list.begin();num_points != num_points_list.end();num_points++) { // Make a new point array TQPointArray point_array(*num_points); // Populate it for (int i = 0;i < *num_points;i++) { int x = (*points++); int y = (*points++); point_array.setPoint(i, x, y); } // Now draw it as a filled polygon on the tqmask bmp.drawPolygon(point_array); } p.drawPixmap(0,0,bm,0,0,dest->width(),dest->height()); } // The winamp list format is absolutely insane, it will accept either // commas or whitespace as the delimiter. This function deals with // that. TQValueList WaRegion::parseList(const TQString &list) const { TQValueList temp_list; if (list.isEmpty()) return temp_list; TQStringList open=TQStringList::split(TQRegExp("[,\\s]+"), list); for (TQStringList::Iterator i=open.begin(); i != open.end(); ++i) temp_list.append((*i).toInt()); return temp_list; }