/*************************************************************************** * Copyright (C) by * * - 2005: Christian Leh * * * * 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; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include #include "scaler.h" Scaler::Scaler(TQSize baseResolution, TQSize targetResolution) { mBaseResolution = baseResolution; mTargetResolution = targetResolution; } void Scaler::autoCoords(TQPoint* pt, const TQFont& f, const TQString& s) { TQFontMetrics fm(f); TQSize fmSize(fm.size(0L, s)); autoCoords(pt, fmSize); } void Scaler::autoCoords(TQPoint* pt, const TQSize s) { scaleCoords(pt); if ((pt->x() == -1) && (pt->y() != -1)) pt->setX(center(mTargetResolution.width(), s.width())); else if ((pt->y() == -1) && (pt->x() != -1)) pt->setY(center(mTargetResolution.height(), s.height())); else if (*pt == TQPoint(-1, -1)) *pt = TQPoint(center(mTargetResolution.width(), s.width()), center(mTargetResolution.height(), s.height())); } void Scaler::scaleCoords(TQPoint* pt) { if (mBaseResolution == mTargetResolution) return; int ox = pt->x(); int oy = pt->y(); float tx = float(mBaseResolution.width()) / float(ox); float ty = float(mBaseResolution.height()) / float(oy); int nx = intIt(float(mTargetResolution.width()) / tx); int ny = intIt(float(mTargetResolution.height()) / ty); pt->setX((ox == -1) ? -1 : nx); pt->setY((oy == -1) ? -1 : ny); } bool Scaler::scaleSize(TQImage* i) { if ((!i) || !resolutionDiff()) return false; float tx = float(mTargetResolution.width()) / float(mBaseResolution.width()); float ty = float(mTargetResolution.height()) / float(mBaseResolution.height()); int nx = intIt(float(i->width()) * tx); int ny = intIt(float(i->height()) * ty); *i = i->smoothScale(nx, ny); return true; } bool Scaler::scaleSize(TQFont* f) { if ((!f) || !resolutionDiff()) return false; const float d = 96 / 72; const float tx = float(mTargetResolution.height()) / float(mBaseResolution.height()); float pt = f->pointSizeFloat(); int hPx = intIt(pt * d); f->setPixelSize(intIt(float(hPx) * tx)); return true; } bool Scaler::resolutionDiff() { return (mBaseResolution != mTargetResolution); } int Scaler::intIt(const float v) { float t = v - float(int(v)); float tt = (t < 0.5) ? 0 : 1; return int(v + tt); } int Scaler::center(const int width, const int size, int offset) { return int(width / 2) - int(size / 2) + offset; }