void SimpleText::doRender() { bool _update = mRenderItem->getCurrentUpdate(); if (_update) mTextOutDate = true; if (nullptr == mFont) return; if (!mVisible || mEmptyView) return; if (mTextOutDate) updateRawData(); const IntSize& size = mTextView.getViewSize(); if (mTextAlign.isRight()) mViewOffset.left = - (mCoord.width - size.width); else if (mTextAlign.isHCenter()) mViewOffset.left = - ((mCoord.width - size.width) / 2); else mViewOffset.left = 0; if (mTextAlign.isBottom()) mViewOffset.top = - (mCoord.height - size.height); else if (mTextAlign.isVCenter()) mViewOffset.top = - ((mCoord.height - size.height) / 2); else mViewOffset.top = 0; Base::doRender(); }
IntCoord EditText::getCursorCoord(size_t _position) { if (nullptr == mFont) return IntCoord(); if (mTextOutDate) updateRawData(); IntPoint point = mTextView.getCursorPoint(_position); point += mCroppedParent->getAbsolutePosition(); point -= mViewOffset; point += mCoord.point(); return IntCoord(point.left, point.top, 2, mFontHeight); }
size_t EditText::getCursorPosition(const IntPoint& _point) { if (nullptr == mFont) return 0; if (mTextOutDate) updateRawData(); IntPoint point = _point; point -= mCroppedParent->getAbsolutePosition(); point += mViewOffset; point -= mCoord.point(); return mTextView.getCursorPosition(point); }
size_t EditText::getCursorPosition(const MyGUI::IntPoint& _point) { if (nullptr == mFont) return 0; if (mTextOutDate) updateRawData(); MyGUI::IntPoint point = _point; point -= mCroppedParent->getAbsolutePosition(); point += mViewOffset; point -= mCoord.point(); float scale = GetFontScale(); point.left = point.left / scale; point.top = point.top / scale; return mTextView.getCursorPosition(point); }
IntSize EditText::getTextSize() { // если нуно обновить, или изменились пропорции экрана if (mTextOutDate) updateRawData(); IntSize size = mTextView.getViewSize(); // плюс размер курсора if (mIsAddCursorWidth) size.width += 2; if (mShadow) { if (!mIsAddCursorWidth) size.width ++; size.height ++; } return size; }
void EditText::doRender(MyGUI::IRenderTarget* _target) { if (nullptr == mFont || !mVisible || mEmptyView) return; if (mRenderItem->getCurrentUpdate() || mTextOutDate) updateRawData(); const TextData& textViewData = mTextView.getData(); Graphics& g = *(static_cast<RenderManager*>(MyGUI::RenderManager::getInstancePtr())->graphics()); Color c = g.GetColor(); g.SetColor(c * Color(1.0f,1.0f,1.0f,mAlpha)); float scale = GetFontScale(); float top = (-mViewOffset.top + mCoord.top) + mCroppedParent->getAbsoluteTop(); float left = ( - mViewOffset.left + mCoord.left) + mCroppedParent->getAbsoluteLeft(); Transform2d tr = g.GetTransform(); g.SetTransform(tr.translated(left, top).scale(scale)); mFont->Draw(g, &m_attributes, textViewData); if (mVisibleCursor) { MyGUI::IntPoint point = mTextView.getCursorPoint(mCursorPosition); const FontData::Glypth* cursorGlyph = mFont->GetGlyph(static_cast<MyGUI::Char>(MyGUI::FontCodeType::Cursor)); if (cursorGlyph) { g.DrawImage(cursorGlyph->img, &m_attributes, point.left, point.top); } } g.SetTransform(tr); g.SetColor(c); }
void EditText::doRender() { if (nullptr == mFont || !mVisible || mEmptyView) return; if (mRenderItem->getCurrentUpdate() || mTextOutDate) updateRawData(); Vertex* vertex = mRenderItem->getCurrentVertexBuffer(); const RenderTargetInfo& renderTargetInfo = mRenderItem->getRenderTarget()->getInfo(); // колличество отрисованных вершин size_t vertexCount = 0; // текущие цвета uint32 colour = mCurrentColourNative; uint32 inverseColour = mInverseColourNative; uint32 selectedColour = mInvertSelect ? inverseColour : mSelectionBgColor; const VectorLineInfo& textViewData = mTextView.getData(); float top = (float)(-mViewOffset.top + mCoord.top); FloatRect vertexRect; const FloatRect& selectedUVRect = mFont->getGlyphInfo(mBackgroundNormal ? FontCodeType::Selected : FontCodeType::SelectedBack)->uvRect; size_t index = 0; for (VectorLineInfo::const_iterator line = textViewData.begin(); line != textViewData.end(); ++line) { float left = (float)(line->offset - mViewOffset.left + mCoord.left); for (VectorCharInfo::const_iterator sim = line->simbols.begin(); sim != line->simbols.end(); ++sim) { if (sim->isColour()) { colour = sim->getColour() | (colour & 0xFF000000); inverseColour = colour ^ 0x00FFFFFF; selectedColour = mInvertSelect ? inverseColour : mSelectionBgColor; continue; } // смещение текстуры для фона bool select = index >= mStartSelect && index < mEndSelect; float fullAdvance = sim->getBearingX() + sim->getAdvance(); // Render the selection, if any, first. if (select) { vertexRect.set(left, top, left + fullAdvance, top + (float)mFontHeight); drawGlyph(renderTargetInfo, vertex, vertexCount, vertexRect, selectedUVRect, selectedColour); } // Render the glyph shadow, if any. if (mShadow) { vertexRect.left = left + sim->getBearingX() + 1.0f; vertexRect.top = top + sim->getBearingY() + 1.0f; vertexRect.right = vertexRect.left + sim->getWidth(); vertexRect.bottom = vertexRect.top + sim->getHeight(); drawGlyph(renderTargetInfo, vertex, vertexCount, vertexRect, sim->getUVRect(), mShadowColourNative); } // Render the glyph itself. vertexRect.left = left + sim->getBearingX(); vertexRect.top = top + sim->getBearingY(); vertexRect.right = vertexRect.left + sim->getWidth(); vertexRect.bottom = vertexRect.top + sim->getHeight(); drawGlyph(renderTargetInfo, vertex, vertexCount, vertexRect, sim->getUVRect(), (!select || !mInvertSelect) ? colour : inverseColour); left += fullAdvance; ++index; } top += mFontHeight; ++index; } // Render the cursor, if any, last. if (mVisibleCursor) { IntPoint point = mTextView.getCursorPoint(mCursorPosition) - mViewOffset + mCoord.point(); GlyphInfo* cursorGlyph = mFont->getGlyphInfo(static_cast<Char>(FontCodeType::Cursor)); vertexRect.set((float)point.left, (float)point.top, (float)point.left + cursorGlyph->width, (float)(point.top + mFontHeight)); drawGlyph(renderTargetInfo, vertex, vertexCount, vertexRect, cursorGlyph->uvRect, mCurrentColourNative | 0x00FFFFFF); } // колличество реально отрисованных вершин mRenderItem->setLastVertexCount(vertexCount); }