Audio::Timestamp VideoDecoder::FixedRateVideoTrack::getFrameTime(uint frame) const { // Try to get as accurate as possible, considering we have a fractional frame rate // (which Audio::Timestamp doesn't support). Common::Rational frameRate = getFrameRate(); // Try to keep it in terms of the frame rate, if the frame rate is a whole // number. if (frameRate.getDenominator() == 1) return Audio::Timestamp(0, frame, frameRate.toInt()); // Convert as best as possible Common::Rational time = frameRate.getInverse() * frame; return Audio::Timestamp(0, time.getNumerator(), time.getDenominator()); }
void Surface::blitScaled(const Surface &from, int16 left, int16 top, int16 right, int16 bottom, int16 x, int16 y, Common::Rational scale, int32 transp) { if (scale == 1) { // Yeah, "scaled" blit(from, left, top, right, bottom, x, y, transp); return; } // Color depths have to fit assert(_bpp == from._bpp); uint16 dWidth = (uint16) floor((_width / scale).toDouble()); uint16 dHeight = (uint16) floor((_height / scale).toDouble()); int16 clipX = ( int16) floor((x / scale).toDouble()); int16 clipY = ( int16) floor((y / scale).toDouble()); // Clip if (!clipBlitRect(left, top, right, bottom, clipX, clipY, dWidth, dHeight, from._width, from._height)) return; // Area to actually copy uint16 width = right - left + 1; uint16 height = bottom - top + 1; if ((width == 0) || (height == 0)) // Nothing to do return; width = MIN<int32>((int32) floor((width * scale).toDouble()), _width); height = MIN<int32>((int32) floor((height * scale).toDouble()), _height); // Pointers to the blit destination and source start points byte *dst = getData(x , y); const byte *src = from.getData(left, top); frac_t step = scale.getInverse().toFrac(); frac_t posW = 0, posH = 0; while (height-- > 0) { byte *dstRow = dst; const byte *srcRow = src; posW = 0; for (uint16 i = 0; i < width; i++, dstRow += _bpp) { memmove(dstRow, srcRow, _bpp); posW += step; while (posW >= ((frac_t) FRAC_ONE)) { srcRow += from._bpp; posW -= FRAC_ONE; } } posH += step; while (posH >= ((frac_t) FRAC_ONE)) { src += from._width * from._bpp; posH -= FRAC_ONE; } dst += _width * _bpp; } }