void CCardLabel::paintEvent(QPaintEvent *ev) { QRectF titleRect(translatePoint(5, 2), translatePoint(155, 25)); QRectF imgRect(translatePoint(5, 24), translatePoint(155, 144)); QRectF blackRect(translatePoint(6, 24 + 40), translatePoint(156, 24 + 80)); QRectF setRect(translatePoint(155 - 2 - 32, 144 + 8), translatePoint(155 - 2, 144 + 8 + 32)); QRectF delayRect(translatePoint(155 - 40, 24), translatePoint(155, 24 + 40)); QRectF attackRect(translatePoint(5 + 2, 215 - 20), translatePoint(5 + 2 + 20, 215)); QRectF healthRect(translatePoint(155 - 2 - 20, 215 - 20), translatePoint(155 - 2, 215)); QRectF ownedRect(translatePoint(155 - 60 - 2, 144 - 28), translatePoint(155 - 2, 144)); QPointF upgradePos(translatePoint(50, 193)); QPointF uniquePos(translatePoint(5 + 2, 144 - 28 - 2)); QPointF skillPos(translatePoint(5 + 2, 144 + 8)); // Update lock button geo before parent paint if (mLockButton) { mLockButton->setGeometry(QRect(imgRect.x() + 2, imgRect.y() + 2, 24, 24)); } // Regular label painting (background image) QLabel::paintEvent(ev); if (mCard.isValid()) { const CGlobalConfig &cfg = CGlobalConfig::getCfg(); QPainter painter(this); // Paint upgrade symbol QString cardName = mCard.getName(); if (mCard.getUpgradeLevel() != EUpgradeNotAvailable) { if (cardName.endsWith(QChar('*'))) { cardName.replace("*", ""); } switch(mCard.getUpgradeLevel()) { case EUpgradeLevel1: painter.drawPixmap(upgradePos, QPixmap(cfg.getResourcePicturePath() + "UpgradeIcon1.png")); break; case EUpgradeLevel2: painter.drawPixmap(upgradePos, QPixmap(cfg.getResourcePicturePath() + "UpgradeIcon2.png")); break; default: break; } } // Paint title QPen inPen(Qt::white); painter.setPen(inPen); painter.drawText(titleRect.adjusted(titleRect.height() + 2, -1, 0, -1), Qt::AlignLeft | Qt::AlignVCenter, cardName); painter.setRenderHint(QPainter::SmoothPixmapTransform, true); if (!mTitleIcon.isNull()) { painter.drawPixmap(titleRect.topLeft(), mTitleIcon.scaled(titleRect.height() + 1, titleRect.height() + 1, Qt::KeepAspectRatio, Qt::SmoothTransformation)); } // Paint unique symbol if (mCard.isUnique()) { painter.drawPixmap(uniquePos, QPixmap(":/img/unique.png")); //painter.drawText(dx + 2, dySkill - 15, 100, 12, Qt::AlignLeft | Qt::AlignVCenter, "Unique"); } // Paint skill symbols const TSkillList &skills = mCard.getSkills(); int curIdx = 0; for (TSkillList::const_iterator i = skills.begin(); i != skills.end(); ++i, ++curIdx) { const CSkill& curSkill = mCards.getSkillForId(i->getId()); if (curSkill.isValid()) { QPixmap skillPixmap; if (!skillPixmap.load(cfg.getResourcePicturePath() + curSkill.getPicture() + ".png")) { skillPixmap.load(cfg.getCustomPicturePath() + curSkill.getPicture() + ".png"); } painter.drawPixmap(skillPos, skillPixmap); skillPos += QPointF(16 + 2, 0); //painter.drawText(dx, 80 + i*10, 100, 10, Qt::AlignLeft | Qt::AlignVCenter, curSkill.makeSignature(skills.at(i))); } } // Paint set symbol if (mCard.getSet() != EUnknownSet) { QPixmap setPixmap; if (!setPixmap.load(cfg.getResourcePicturePath() + mCards.getPictureForCardSet(mCard.getSet()))) { setPixmap.load(cfg.getCustomPicturePath() + mCards.getPictureForCardSet(mCard.getSet())); } painter.drawPixmap(setRect, setPixmap, QRectF(0, 0, 24, 24)); } // Paint delay symbol if (mCard.getDelay() > -1) { painter.drawPixmap(delayRect, QPixmap(cfg.getResourcePicturePath() + "ClockIcon.png"), QRectF(0, 0, 32, 32)); painter.drawText(delayRect, Qt::AlignCenter, QString("%1").arg(mCard.getDelay())); } // Paint attack symbol if (mCard.hasAttack()) { painter.drawPixmap(attackRect, QPixmap(cfg.getResourcePicturePath() + "AttackIcon.png"), QRectF(0, 0, 20, 20)); painter.drawText(attackRect.translated(attackRect.width() + 1, 0), Qt::AlignLeft | Qt::AlignVCenter, QString("%1").arg(mCard.getAttack())); } // Paint health symbol if (mCard.hasHealth()) { painter.drawPixmap(healthRect, QPixmap(cfg.getResourcePicturePath() + "HealthIcon.png"), QRectF(0, 0, 20, 20)); painter.drawText(healthRect.adjusted(-2 * healthRect.width() - 1, 0, -healthRect.width() - 1, 0), Qt::AlignRight | Qt::AlignVCenter, QString("%1").arg(mCard.getHealth())); } if (!mIsVirtual) { // Display owned status SCardStatus status = mCards.getCardStatus(mCard); { painter.setPen(Qt::green); QString ownageStr("x0"); if (status.numOwned > 0) { ownageStr = QString("x%1").arg(status.numOwned); } painter.drawText(ownedRect, Qt::AlignRight | Qt::AlignVCenter, ownageStr); } if (cfg.isCardShadingEnabled() && status.numOwned <= 0) { painter.setPen(Qt::NoPen); painter.setBrush(Qt::black); painter.setOpacity(0.6); painter.drawRoundedRect(rect(), 2.0, 2.0); } if (cfg.isBlackLabellingEnabled() && status.isBlack) { // Display black list status painter.setPen(Qt::white); painter.setOpacity(0.6); painter.fillRect(blackRect, QBrush(Qt::black)); painter.setOpacity(1.0); painter.drawText(blackRect, Qt::AlignCenter, "Blacklisted"); } else if (cfg.isWhiteLabellingEnabled() && status.isWhite) { // Display white list status painter.setPen(Qt::black); painter.setOpacity(0.6); painter.fillRect(blackRect, QBrush(Qt::white)); painter.setOpacity(1.0); painter.drawText(blackRect, Qt::AlignCenter, "Whitelisted"); } } } }
/* * Sort an array of WordEntryIN, remove duplicates. * *outbuflen receives the amount of space needed for strings and positions. */ static int uniqueentry(WordEntryIN *a, int l, char *buf, int *outbuflen) { int buflen; WordEntryIN *ptr, *res; Assert(l >= 1); if (l > 1) qsort_arg((void *) a, l, sizeof(WordEntryIN), compareentry, (void *) buf); buflen = 0; res = a; ptr = a + 1; while (ptr - a < l) { if (!(ptr->entry.len == res->entry.len && strncmp(&buf[ptr->entry.pos], &buf[res->entry.pos], res->entry.len) == 0)) { /* done accumulating data into *res, count space needed */ buflen += res->entry.len; if (res->entry.haspos) { res->poslen = uniquePos(res->pos, res->poslen); buflen = SHORTALIGN(buflen); buflen += res->poslen * sizeof(WordEntryPos) + sizeof(uint16); } res++; if (res != ptr) memcpy(res, ptr, sizeof(WordEntryIN)); } else if (ptr->entry.haspos) { if (res->entry.haspos) { /* append ptr's positions to res's positions */ int newlen = ptr->poslen + res->poslen; res->pos = (WordEntryPos *) repalloc(res->pos, newlen * sizeof(WordEntryPos)); memcpy(&res->pos[res->poslen], ptr->pos, ptr->poslen * sizeof(WordEntryPos)); res->poslen = newlen; pfree(ptr->pos); } else { /* just give ptr's positions to pos */ res->entry.haspos = 1; res->pos = ptr->pos; res->poslen = ptr->poslen; } } ptr++; } /* count space needed for last item */ buflen += res->entry.len; if (res->entry.haspos) { res->poslen = uniquePos(res->pos, res->poslen); buflen = SHORTALIGN(buflen); buflen += res->poslen * sizeof(WordEntryPos) + sizeof(uint16); } *outbuflen = buflen; return res + 1 - a; }
static int uniqueentry(WordEntryIN * a, int4 l, char *buf, int4 *outbuflen) { WordEntryIN *ptr, *res; res = a; if (l == 1) { if (a->entry.haspos) { *(uint16 *) (a->pos) = uniquePos(&(a->pos[1]), *(uint16 *) (a->pos)); *outbuflen = SHORTALIGN(res->entry.len) + (*(uint16 *) (a->pos) + 1) * sizeof(WordEntryPos); } return l; } ptr = a + 1; BufferStr = buf; qsort((void *) a, l, sizeof(WordEntryIN), compareentry); while (ptr - a < l) { if (!(ptr->entry.len == res->entry.len && strncmp(&buf[ptr->entry.pos], &buf[res->entry.pos], res->entry.len) == 0)) { if (res->entry.haspos) { *(uint16 *) (res->pos) = uniquePos(&(res->pos[1]), *(uint16 *) (res->pos)); *outbuflen += *(uint16 *) (res->pos) * sizeof(WordEntryPos); } *outbuflen += SHORTALIGN(res->entry.len); res++; memcpy(res, ptr, sizeof(WordEntryIN)); } else if (ptr->entry.haspos) { if (res->entry.haspos) { int4 len = *(uint16 *) (ptr->pos) + 1 + *(uint16 *) (res->pos); res->pos = (WordEntryPos *) repalloc(res->pos, len * sizeof(WordEntryPos)); memcpy(&(res->pos[*(uint16 *) (res->pos) + 1]), &(ptr->pos[1]), *(uint16 *) (ptr->pos) * sizeof(WordEntryPos)); *(uint16 *) (res->pos) += *(uint16 *) (ptr->pos); pfree(ptr->pos); } else { res->entry.haspos = 1; res->pos = ptr->pos; } } ptr++; } if (res->entry.haspos) { *(uint16 *) (res->pos) = uniquePos(&(res->pos[1]), *(uint16 *) (res->pos)); *outbuflen += *(uint16 *) (res->pos) * sizeof(WordEntryPos); } *outbuflen += SHORTALIGN(res->entry.len); return res + 1 - a; }