void Screen::flushScaleImage(ImageFrame *frame, const Common::Point &pt, int16 *xp, int16 *yp, int16 *width_, int16 *height_, int scaleVal) { Common::Point imgPos(pt.x + frame->sDrawXOffset(scaleVal), pt.y + frame->sDrawYOffset(scaleVal)); Common::Rect newBounds(imgPos.x, imgPos.y, imgPos.x + frame->sDrawXSize(scaleVal), imgPos.y + frame->sDrawYSize(scaleVal)); Common::Rect oldBounds(*xp, *yp, *xp + *width_, *yp + *height_); if (!_flushScreen) { // See if the areas of the old and new overlap, and if so combine the areas if (newBounds.intersects(oldBounds)) { Common::Rect mergedBounds = newBounds; mergedBounds.extend(oldBounds); mergedBounds.right += 1; mergedBounds.bottom += 1; slamRect(mergedBounds); } else { // The two areas are independent, so copy them both slamRect(newBounds); slamRect(oldBounds); } } *xp = newBounds.left; *yp = newBounds.top; *width_ = newBounds.width(); *height_ = newBounds.height(); }
void Screen::flushImage(ImageFrame *frame, const Common::Point &pt, int16 *xp, int16 *yp, int16 *width, int16 *height) { Common::Point imgPos = pt + frame->_offset; Common::Rect newBounds(imgPos.x, imgPos.y, imgPos.x + frame->_frame.w, imgPos.y + frame->_frame.h); Common::Rect oldBounds(*xp, *yp, *xp + *width, *yp + *height); if (!_flushScreen) { // See if the areas of the old and new overlap, and if so combine the areas if (newBounds.intersects(oldBounds)) { Common::Rect mergedBounds = newBounds; mergedBounds.extend(oldBounds); mergedBounds.right += 1; mergedBounds.bottom += 1; slamRect(mergedBounds); } else { // The two areas are independent, so copy them both slamRect(newBounds); slamRect(oldBounds); } } *xp = newBounds.left; *yp = newBounds.top; *width = newBounds.width(); *height = newBounds.height(); }
void Sprite::removeFrame(const uint32 frameNum) { _frameArray[frameNum].frame->_referenceCount--; if (_frameArray[frameNum].frame->_referenceCount == 0) delete _frameArray[frameNum].frame; // Calculate the new bounds Common::Rect frameBounds; for (uint32 i = 0; i < _numFrames; i++) { if (i == frameNum) continue; Common::Rect r; _frameArray[i].frame->getSurfaceBounds(r); r.translate(_frameArray[i].frameLeft, _frameArray[i].frameTop); frameBounds.extend(r); } _frameArray.remove_at(frameNum); frameBounds.moveTo(_bounds.left, _bounds.top); setBounds(frameBounds); if (_currentFrameNum == frameNum) triggerRedraw(); else if (_currentFrameNum != 0xffffffff && _currentFrameNum > frameNum) --_currentFrameNum; }
void VisualText::createTexture() { Common::CodePage codePage = StarkSettings->getTextCodePage(); Common::U32String unicodeText = Common::convertToU32String(_text.c_str(), codePage); // Get the font and required metrics const Graphics::Font *font = StarkFontProvider->getScaledFont(_fontType, _fontCustomIndex); uint scaledLineHeight = StarkFontProvider->getScaledFontHeight(_fontType, _fontCustomIndex); uint originalLineHeight = StarkFontProvider->getOriginalFontHeight(_fontType, _fontCustomIndex); uint maxScaledLineWidth = StarkGfx->scaleWidthOriginalToCurrent(_targetWidth); // Word wrap the text Common::Array<Common::U32String> lines; font->wordWrapText(unicodeText, maxScaledLineWidth, lines); // Use the actual font bounding box to prevent text from being cut off Common::Rect scaledRect; if (!lines.empty()) { scaledRect = font->getBoundingBox(lines[0]); for (uint i = 1; i < lines.size(); i++) { scaledRect.extend(font->getBoundingBox(lines[i], 0, scaledLineHeight * i)); } } // Make sure lines have approximately consistent height regardless of the characters they use scaledRect.bottom = MAX<int16>(scaledRect.bottom, scaledLineHeight * lines.size()); if (!isBlank()) { _originalRect.right = StarkGfx->scaleWidthCurrentToOriginal(scaledRect.right); _originalRect.bottom = originalLineHeight * lines.size(); } else { // For Empty text, preserve the original width and height for being used as clicking area _originalRect.right = _targetWidth; _originalRect.bottom = _targetHeight; } // Create a surface to render to Graphics::Surface surface; surface.create(scaledRect.right, scaledRect.bottom, Gfx::Driver::getRGBAPixelFormat()); uint32 color = surface.format.ARGBToColor( _color.a, _color.r, _color.g, _color.b ); uint32 bgColor = surface.format.ARGBToColor( _backgroundColor.a, _backgroundColor.r, _backgroundColor.g, _backgroundColor.b ); surface.fillRect(Common::Rect(surface.w, surface.h), bgColor); // Render the lines to the surface for (uint i = 0; i < lines.size(); i++) { font->drawString(&surface, lines[i], 0, scaledLineHeight * i, surface.w, color, _align); } // Create a texture from the surface _texture = _gfx->createTexture(&surface); _texture->setSamplingFilter(Gfx::Texture::kNearest); surface.free(); }
uint16 RobotDecoder::getFrameSize(Common::Rect &outRect) const { outRect.clip(0, 0); for (RobotScreenItemList::size_type i = 0; i < _screenItemList.size(); ++i) { ScreenItem &screenItem = *_screenItemList[i]; outRect.extend(screenItem.getNowSeenRect(*_plane)); } return _numFramesTotal; }
void GfxAnimate::updateScreen(byte oldPicNotValid) { AnimateList::iterator it; const AnimateList::iterator end = _list.end(); Common::Rect lsRect; Common::Rect workerRect; for (it = _list.begin(); it != end; ++it) { if (it->showBitsFlag || !(it->signal & (kSignalRemoveView | kSignalNoUpdate) || (!(it->signal & kSignalRemoveView) && (it->signal & kSignalNoUpdate) && oldPicNotValid))) { lsRect.left = readSelectorValue(_s->_segMan, it->object, SELECTOR(lsLeft)); lsRect.top = readSelectorValue(_s->_segMan, it->object, SELECTOR(lsTop)); lsRect.right = readSelectorValue(_s->_segMan, it->object, SELECTOR(lsRight)); lsRect.bottom = readSelectorValue(_s->_segMan, it->object, SELECTOR(lsBottom)); workerRect = lsRect; workerRect.clip(it->celRect); if (!workerRect.isEmpty()) { workerRect = lsRect; workerRect.extend(it->celRect); } else { _paint16->bitsShow(lsRect); workerRect = it->celRect; } writeSelectorValue(_s->_segMan, it->object, SELECTOR(lsLeft), it->celRect.left); writeSelectorValue(_s->_segMan, it->object, SELECTOR(lsTop), it->celRect.top); writeSelectorValue(_s->_segMan, it->object, SELECTOR(lsRight), it->celRect.right); writeSelectorValue(_s->_segMan, it->object, SELECTOR(lsBottom), it->celRect.bottom); // may get used for debugging //_paint16->frameRect(workerRect); _paint16->bitsShow(workerRect); if (it->signal & kSignalHidden) it->signal |= kSignalRemoveView; } } // use this for debug purposes // _screen->copyToScreen(); }
uint32 Sprite::addFrame(SpriteFrame *frame, const CoordType left, const CoordType top) { SpriteFrameRec frameRecord; frameRecord.frame = frame; frameRecord.frameLeft = left; frameRecord.frameTop = top; _frameArray.push_back(frameRecord); _numFrames++; frame->_referenceCount++; Common::Rect frameBounds; frame->getSurfaceBounds(frameBounds); // 9/3/96 // BB Should this be + left or - left? frameBounds.moveTo(_bounds.left + left, _bounds.top + top); frameBounds.extend(_bounds); if (_bounds != frameBounds) setBounds(frameBounds); return _numFrames - 1; }
bool Screen::unionRectangle(Common::Rect &destRect, const Common::Rect &src1, const Common::Rect &src2) { destRect = src1; destRect.extend(src2); return !destRect.isEmpty(); }