void XxMeter::SetCurVal (int Val) { int TmpVal, i, j; int L, R, Y1, Y2, W, H; int dY; XxPixmap *pMap; CurVal = Val; TmpVal = CalcIntVal (Val); if (TmpVal == IntVal) return; if (TmpVal < IntVal) { DrawGC.SetForeground (XxGray3); pMap = &OffMap; i = IntVal; j = TmpVal; Y1 = TmpVal + 1; Y2 = IntVal; } else { DrawGC.SetForeground (XxWhite); pMap = &OnMap; i = TmpVal; j = IntVal; Y1 = IntVal + 1; Y2 = TmpVal; }; if (Dir & 1) { W = GetHeight (); H = GetWidth (); } else { W = GetWidth (); H = GetHeight (); }; L = 0; R = W - 1; if ((Dir & 2) == 0) { i = H - 1 - Y1; j = H - 1 - Y2; Y2 = i; Y1 = j; }; if (Dir & 1) { CopyArea (DrawGC, pMap, Y1, L, (Y2 - Y1 + 1), (R - L + 1), Y1, L); } else { CopyArea (DrawGC, pMap, L, Y1, (R - L + 1), (Y2 - Y1 + 1), L, Y1); }; IntVal = TmpVal; };
// plc - местоположение, куда отображаем картинку // drw_rgn - та часть plc, которую хотим отобразить/отрисовать (не затрагивая остальное) void ScalePixbuf(RefPtr<Gdk::Pixbuf> dst, RefPtr<Gdk::Pixbuf> src, const Rect& plc, const Rect& drw_rgn) { Point sz = plc.Size(); if( sz == PixbufSize(src) ) { // gdk_pixbuf_scale() недостаточно умен, чтобы самостоятельно заменить скалирование // копированием в этом случае CopyArea(dst, src, plc, drw_rgn); } else { Point drw_sz = drw_rgn.Size(); src->scale(dst, drw_rgn.lft, drw_rgn.top, drw_sz.x, drw_sz.y, plc.lft, plc.top, (double)sz.x/src->get_width(), (double)sz.y/src->get_height(), Gdk::INTERP_BILINEAR); } }
void DoCopyPixPix(XParms xp, Parms p, int reps) { CopyArea(xp, p, reps, pix, pix); xp->p = pix; /* HardwareSync will now sync on pixmap */ }
void DoCopyPixWin(XParms xp, Parms p, int reps) { CopyArea(xp, p, reps, pix, xp->w); }
void DoCopyWinWin(XParms xp, Parms p, int reps) { CopyArea(xp, p, reps, xp->w, xp->w); }