Ejemplo n.º 1
0
bool SylVNC::BltBitmap(SrvBitmap *pcDstBitmap, SrvBitmap *pcSrcBitmap,
	IRect cSrcRect, IPoint cDstPos, int nMode)
{
	if((!pcDstBitmap->m_bVideoMem) && (!pcSrcBitmap->m_bVideoMem))
	{
		// Off-screen to off-screen
		return DisplayDriver::BltBitmap(pcDstBitmap, pcSrcBitmap, cSrcRect,
										cDstPos, nMode);
	}

	int srcX1 = cSrcRect.left;
	int srcY1 = cSrcRect.top;
	int srcX2 = cSrcRect.right;
	int srcY2 = cSrcRect.bottom;
	int dstX1 = cDstPos.x;
	int dstY1 = cDstPos.y;
	int dstX2 = cDstPos.x + cSrcRect.Width();
	int dstY2 = cDstPos.y + cSrcRect.Height();

	if((pcDstBitmap->m_bVideoMem) && (pcSrcBitmap->m_bVideoMem))
	{
		if(nMode == DM_COPY)
//			dbprintf("SylVNC::BltBitmap() - Screen to screen DM_COPY\n");
		;
		else if(nMode == DM_OVER)
			dbprintf("SylVNC::BltBitmap() - Screen to screen DM_OVER\n");
		else if(nMode == DM_BLEND)
			dbprintf("SylVNC::BltBitmap() - Screen to screen DM_BLEND\n");
		else
			dbprintf("SylVNC::BltBitmap() - Unknown nMode = %d\n", nMode);
	}

	DisplayDriver::BltBitmap(pcDstBitmap, pcSrcBitmap, cSrcRect, cDstPos, nMode);

	if(pcDstBitmap->m_bVideoMem)
	{
	        // ACQUIRE RFB lock
	        m_cRFBLock.Lock();

		rfbMarkRectAsModified( rfbScreen, dstX1, dstY1, dstX2 + 1, dstY2 + 1);

	        // RELEASE RFB lock
	        m_cRFBLock.Unlock();
	}

	if(pcSrcBitmap->m_bVideoMem)
	{
                // ACQUIRE RFB lock
		m_cRFBLock.Lock();

		rfbMarkRectAsModified( rfbScreen, srcX1, srcY1, srcX2 + 1, srcY2 + 1);

		// RELEASE RFB lock
		m_cRFBLock.Unlock();
	}
	resume_thread( rfbEventThread );
//	rfbProcessEvents(rfbScreen, 0);

	return true;
}
int ChangeEnergySpeed::Editor_CaptureGadget(const IPoint& mouse_pos, int x, int y)
{
	// Преобразовываем координаты к координатам на поле
	int mx = mouse_pos.x + GameSettings::FieldCoordMouse().x;
	int my = mouse_pos.y + GameSettings::FieldCoordMouse().y;

	IRect r (mx - (GameSettings::SQUARE_SIDE / 2), my - (GameSettings::SQUARE_SIDE / 2), 0, 0);
	r.Inflate((GameSettings::SQUARE_SIDE / 2));
	
	_sliderRect = IRect(_snapPoint.x * GameSettings::SQUARE_SIDE,_snapPoint.y * GameSettings::SQUARE_SIDE - 30,200,30); 

	if (r.Contains(_snapPoint * GameSettings::SQUARE_SIDE)) 
	{
		return (-2);
	}
	else if (_sliderRect.Contains(IPoint(mx,my))) 
	{

		return (-3);
	}
	else 
	{
		return (-1);
	}
}
Ejemplo n.º 3
0
void ChipSelecter::Draw()
{
	Render::device.SetTexturing(false);
	Render::BeginColor(Color(100, 100, 100, 180));
	Render::DrawRect(IRect(200, 150, 400, 300));
	Render::EndColor();
	
	Render::device.SetTexturing(true);
	
	//IRect rect = Game::ChipColor::DRAW_RECT;
	//Тут должно быть 44х44!
	IRect rect = IRect(0,0,44,44);

	for (int i = 0; i <= 6; i++)
	{
		int x = _chipXLeft + 50*(i%7);
		int y = _chipYDown + 50*(3 - i/7);
		FRect uv = Game::GetChipRect(i, false, false, false);
		_chipsTex->Draw(rect.MovedBy(IPoint(x - rect.width/2, y - rect.height/2)), uv);
	}

	for (size_t i = 0; i < _chipColors.size(); i++)
	{
		int color = _chipColors[i];
		int x = _chipXLeft + 50*(color%7);
		int y = _chipYDown + 50*(3 - color/7);

		Render::BeginColor(Color(100, 255, 255, 255));
		for (int q = -1; q<=1; q++)
		{
			for (int w = -1; w<=1; w++)
			{
				DrawRamka(x+q, y+w);
			}
		}
		Render::EndColor();

		FRect uv = Game::GetChipRect(color, false, false, false);	

		Render::device.SetAlpha(static_cast<int>(150+80*sinf(_timer*6 + x - y/3)));
		Render::device.SetBlendMode(Render::ADD);
		_chipsTex->Draw(rect.MovedBy(IPoint(x - rect.width/2, y - rect.height/2)), uv);
		Render::device.SetBlendMode(Render::ALPHA);
	}

	if (_underMouseChip >= 0)
	{
		int color = _underMouseChip;
		int x = _chipXLeft + 50*(color%7);
		int y = _chipYDown + 50*(3 - color/7);
		Render::BeginColor(Color(0, 255, 0, 255));
		DrawRamka(x, y);
		Render::EndColor();
	}

	Render::BindFont("debug");
	Render::PrintString(IPoint(370, 170), utils::lexical_cast(static_cast<int>(_chipColors.size())) + " colors", 1.f, CenterAlign);
}
Ejemplo n.º 4
0
void ChipSelecter::DrawRamka(int x, int y)
{
	//Тут должно быть 44х44!
	IRect rect = IRect(0,0,44,44);

	Render::device.SetTexturing(false);
	Render::DrawFrame(rect.MovedBy(IPoint(x - rect.width/2, y - rect.height/2)));
	Render::device.SetTexturing(true);
}
Ejemplo n.º 5
0
KDE_NO_EXPORT void Surface::repaint (const SRect &rect) {
    Matrix matrix;
    IRect clip;
    clipToScreen (this, matrix, clip);
    IRect scr = matrix.toScreen (rect);
    clip = clip.intersect (scr);
    if (!clip.isEmpty ())
        view_widget->scheduleRepaint (clip);
}
Ejemplo n.º 6
0
bool VMware::BltBitmap(SrvBitmap *pcDstBitmap, SrvBitmap *pcSrcBitmap,
	IRect cSrcRect, IRect cDstRect, int nMode, int nAlpha)
{
	if(((!pcDstBitmap->m_bVideoMem) && (!pcSrcBitmap->m_bVideoMem)) || nMode != DM_COPY || cSrcRect.Size() != cDstRect.Size())
	{
		// Off-screen to off-screen
		return DisplayDriver::BltBitmap(pcDstBitmap, pcSrcBitmap, cSrcRect,
										cDstRect, nMode, nAlpha);
	}

	IPoint cDstPos = cDstRect.LeftTop();
	int srcX = cSrcRect.left;
	int srcY = cSrcRect.top;
	int dstX = cDstPos.x;
	int dstY = cDstPos.y;
	int width = cSrcRect.Width() + 1;
	int height = cSrcRect.Height() + 1;

	bool accelDmCopy = false;
	if((pcDstBitmap->m_bVideoMem) && (pcSrcBitmap->m_bVideoMem))
	{
		if(nMode == DM_COPY)
			accelDmCopy = m_regCapabilities & SVGA_CAP_RECT_COPY;
		else if(nMode == DM_OVER)
			dbprintf("VMware::BltBitmap() - Screen to screen DM_OVER\n");
		else if(nMode == DM_BLEND)
			dbprintf("VMware::BltBitmap() - Screen to screen DM_BLEND\n");
		else
			dbprintf("VMware::BltBitmap() - Unknown nMode = %d\n", nMode);
	}

	// ACQUIRE lock
	m_cGELock.Lock();

	if(accelDmCopy)
	{
		// Accelerated screen to screen DM_COPY
		Fifo_RectCopy(srcX, srcY, dstX, dstY, width, height);
		m_bFifoCmds = true;
	}
	else
	{
		if(m_bFifoCmds)
			FifoSync();

		DisplayDriver::BltBitmap(pcDstBitmap, pcSrcBitmap, cSrcRect,
									cDstRect, nMode, nAlpha);

		if(pcDstBitmap->m_bVideoMem)
			Fifo_UpdateRect(dstX, dstY, width, height);
	}

	// RELEASE lock
	m_cGELock.Unlock();
	return true;
}
Ejemplo n.º 7
0
void LockBarriers::Editor_CutToClipboard(IRect part)
{
	_clipboard.clear();
	for(Barriers::iterator itr = _barriers.begin(); itr != _barriers.end(); )
	{
		if( part.Contains((*itr)->GetPos()) ) {
			(*itr)->SetPos( (*itr)->GetPos() - part.LeftBottom() );
			_clipboard.push_back(*itr);
			itr = _barriers.erase(itr);
		} else {
			++itr;
		}
	}
}
Ejemplo n.º 8
0
	void CoreDelegateImpl::Draw()
	{
		static float x = 50;
		static float y = 600;
		auto p_renderer = Core::GetRenderer();
		IRect rect = p_renderer->GetTargetRectangle();
		p_renderer->SetMatrix(MatrixMode::Projection, Matrix4f::CreateOrtho(0, rect.Width(), 0, rect.Height()));
		std::wstring message = L"FPS: " + std::to_wstring(Core::GetApplication()->GetCurrentFPS());
		auto en_font = Core::GetGlobalObject<Resources::ResourceManager>()->GetHandleToResource<Render::Font>("Arial_en");
		auto arial_font = Core::GetGlobalObject<Resources::ResourceManager>()->GetHandleToResource<Render::Font>("Arial");
		Core::GetGlobalObject<Render::FontManager>()->Render({ x, y }, 1.f, message, arial_font);
		Core::GetGlobalObject<Render::FontManager>()->Render({ x, y - 50 }, 1.f, message_num_0, en_font);
		Core::GetGlobalObject<Render::FontManager>()->Render({ x, y - 100 }, 1.f, L"Мама мыла раму!", arial_font);
	}
Ejemplo n.º 9
0
	void View::update(const InputState &state) {
		if(state.isKeyDown('g')) {
			if(m_is_visible) {
				if(m_cell_size == 3)
					m_cell_size = 6;
				else if(m_cell_size == 6)
					m_cell_size = 9;
				else {
					m_cell_size = 1;
					m_is_visible = false;
				}
			}
			else {
				m_cell_size = 3;
				m_is_visible = true;
			}
		}
			
		int height_change = state.mouseWheelMove() +
							(state.isKeyDownAuto(InputKey::pagedown)? -1 : 0) +
							(state.isKeyDownAuto(InputKey::pageup)? 1 : 0);
		if(height_change)
			m_height = clamp(m_height + height_change, 0, (int)Grid::max_height);
		
		{
			int actions[TileGroup::Group::side_count] = {
				InputKey::kp_1, 
				InputKey::kp_2,
				InputKey::kp_3,
				InputKey::kp_6,
				InputKey::kp_9,
				InputKey::kp_8,
				InputKey::kp_7,
				InputKey::kp_4
			};
			
			for(int n = 0; n < arraySize(actions); n++)
				if(state.isKeyDownAuto(actions[n]))
					m_view_pos += worldToScreen(TileGroup::Group::s_side_offsets[n] * m_cell_size);
		}

		if((state.isKeyPressed(InputKey::lctrl) && state.isMouseButtonPressed(InputButton::left)) ||
		   state.isMouseButtonPressed(InputButton::middle))
			m_view_pos -= state.mouseMove();

		IRect rect = worldToScreen(IBox(int3(0, 0, 0), asXZY(m_tile_map.dimensions(), 256)));
		m_view_pos = vclamp(m_view_pos, rect.min(), rect.max() - m_view_size);
	}
Ejemplo n.º 10
0
	GroupPad::GroupPad(const IRect &rect, PGroupEditor editor, TileGroup *group)
		:Window(rect), m_editor(editor), m_group(group) {
		m_filter_box = make_shared<ComboBox>(IRect(0, 0, rect.width(), 22), 200,
				"Filter: ", TileFilter::strings(), TileFilter::count);
		attach(m_filter_box);
		m_filter_box->selectEntry(editor->tileFilter());
	}
void ChangeEnergySpeed::Draw()
{
	Render::device.SetTexturing(false);

	// Точка центрирования (краcная)
	Render::device.SetTexturing(false);
	IRect draw (_snapPoint.x * GameSettings::SQUARE_SIDE + (GameSettings::SQUARE_SIDE / 2), _snapPoint.y * GameSettings::SQUARE_SIDE + (GameSettings::SQUARE_SIDE / 2), 0, 0);
	draw.Inflate(GameSettings::SQUARE_SIDE / 2);

	if (_selected)
	{
		Render::BeginColor(Color(50,255,50,128));
	}
	else
	{
		Render::BeginColor(Color(20,80,20,128));
	}

	Render::DrawRect(draw);
	Render::DrawFrame(draw);

	Render::EndColor();
/*
	Render::BeginColor(Color(255,80,20,128));

	Render::DrawRect(_sliderRect);
	//Render::DrawFrame(sliderRect);

	Render::EndColor();
*/
	Render::device.SetTexturing(true);
	Render::BeginColor(Color(255,255,255,255));

	Render::FreeType::BindFont("debug");
	
	Render::PrintString(draw.x + 2, draw.y + 35, "Energy", 1.0f, LeftAlign, BaseLineAlign);
	Render::PrintString(draw.x + 2, draw.y + 25, "speed:", 1.0f, LeftAlign, BaseLineAlign);
	Render::PrintString(draw.x + 2, draw.y + 5, Float::ToStringF(_energyTimeScale), 1.0f, LeftAlign, BaseLineAlign);
	
	Render::EndColor();
	
	if (_selected)
	{
		_sliderTime.Draw();
	}
	
}
Ejemplo n.º 12
0
	void Window::setRect(const IRect &rect) {
		DASSERT(!m_dragging_mode);
		DASSERT(!rect.empty());

		m_rect = rect;
		setInnerRect(IRect({0, 0}, m_rect.size()));
		updateRects();
	}
Ejemplo n.º 13
0
bool VMware::FillRect(SrvBitmap *pcBitmap, const IRect& cRect,
	const Color32_s& sColor, int nMode)
{
	if(!pcBitmap->m_bVideoMem || nMode != DM_COPY)
	{
		/* Off-screen */
		return DisplayDriver::FillRect(pcBitmap, cRect, sColor, nMode);
	}

	int dstX = cRect.left;
	int dstY = cRect.top;
	int width = cRect.Width() + 1;
	int height = cRect.Height() + 1;
	int nColor;

	if (pcBitmap->m_eColorSpc == CS_RGB32)
		nColor = COL_TO_RGB32(sColor);
	else
		nColor = COL_TO_RGB16(sColor);

	bool accelOp = false;
	// accelOp = m_regCapabilities & SVGA_CAP_RECT_FILL;

	// ACQUIRE lock
	m_cGELock.Lock();

	if(accelOp)
	{
		/* Accelerated on-screen RectFill */
		Fifo_RectFill(dstX, dstY, width, height, nColor);
		m_bFifoCmds = true;
	}
	else
	{
		if(m_bFifoCmds)
			FifoSync();

		DisplayDriver::FillRect(pcBitmap, cRect, sColor, nMode);
		Fifo_UpdateRect(dstX, dstY, width, height);
	}

	// RELEASE lock
	m_cGELock.Unlock();
	return true;
}
Ejemplo n.º 14
0
void EnergyReceiver::Editor_DrawIndicators(bool selected)
{
	// подложка под приемником
	Render::device.SetBlendMode(Render::ADD);

	if (selected) 
		Render::BeginColor(Color(128, 255, 200, 48));
	else 
		Render::BeginColor(Color(255, 100, 200, 48));

	Render::device.SetTexturing(false);
	IRect draw = GameSettings::CELL_RECT.Inflated(-2);
	draw.MoveTo(GetIndex()*GameSettings::SQUARE_SIDE);

	Render::DrawRect(draw);

	Render::EndColor();
	Render::device.SetBlendMode(Render::ALPHA);
}
Ejemplo n.º 15
0
	void SquareNewInfo::Editor_CopyToClipboard(IRect part)
	{
		Game::FieldAddress offset(part.x, part.y);
		_clipboard.clear();
		for(std::map<Game::FieldAddress, InfoSquare>::iterator itr = _info.begin(); itr != _info.end(); ++itr)
		{
			if( part.Contains(itr->first.ToPoint()) )
				_clipboard.insert( std::make_pair(itr->first - offset, itr->second) );
		}
	}
Ejemplo n.º 16
0
	void SquareNewInfo::Editor_ClearFieldPart(IRect part)
	{
		for(std::map<Game::FieldAddress, InfoSquare>::iterator itr = _info.begin(); itr != _info.end(); )
		{
			if( part.Contains(itr->first.ToPoint()) ) {
				itr = _info.erase(itr);
			} else {
				++itr;
			}
		}
	}
Ejemplo n.º 17
0
	ComboBox::ComboBox(const IRect &rect, int drop_size, const char *prefix, CRange<const char*> values)
		:Window(rect), m_drop_size(drop_size), m_prefix(prefix) {
		m_button = make_shared<Button>(IRect(int2(0, 0), rect.size()), "");
		m_dummy = make_shared<ListBox>(IRect(0, 0, 10, 10));
		attach(m_button);

		for(auto value : values)
			addEntry(value, ColorId::white);
		if(!values.empty())
			selectEntry(0);
	}
Ejemplo n.º 18
0
	void CoreDelegateImpl::Draw()
	{
		auto p_lights = Core::GetRenderer()->GetLightsController();
		p_lights->DisableLighting();
		drawGrid(100, 4);
		p_lights->EnableLighting();
		static float x = 50;
		static float y = 600;
		auto p_renderer = Core::GetRenderer();
		IRect rect = p_renderer->GetTargetRectangle();
		p_renderer->SetMatrix(MatrixMode::Projection, Matrix4f::CreateOrtho(0, rect.Width(), 0, rect.Height()));
		std::wstring message = L"FPS: " + std::to_wstring(Core::GetApplication()->GetCurrentFPS());
		auto en_font = Core::GetGlobalObject<Resources::ResourceManager>()->GetHandleToResource<Render::Font>("Arial_en");

		auto p_font_mgr = Core::GetGlobalObject<Render::FontManager>();
		p_font_mgr->Render({ x, 900 }, 0.6f, message, en_font);
		p_font_mgr->Render({ x, 865 }, 0.6f, L"Vertices: " + std::to_wstring(Core::GetGlobalObject<Render::MeshSystem>()->GetVerticesRendered()), en_font);
		p_font_mgr->Render({ x, 830 }, 0.6f, L"Trigs: " + std::to_wstring(Core::GetGlobalObject<Render::MeshSystem>()->GetTrianglesRendered()), en_font);
		/*message = L"asdqwetbij[we6  ewrgasdf";
		for (int i = 0; i < 100; ++i)
			p_font_mgr->Render({ x, y }, 1.f, message, en_font);*/
	}
Ejemplo n.º 19
0
	void Window::drawWindow(Renderer2D &out, IRect rect, FColor color, int outline) {
		FColor lighter(color.rgb() * 1.2f, color.a);
		FColor darker(color.rgb() * 0.8f, color.a);
		int aoutline = fwk::abs(outline);

		if(outline) {
			int2 hsize(rect.width(), aoutline);
			int2 vsize(aoutline, rect.height());

			FColor col1 = outline < 0? darker : lighter;
			out.addFilledRect(IRect(rect.min, rect.min + hsize), col1);
			out.addFilledRect(IRect(rect.min, rect.min + vsize), col1);

			int2 p1(rect.min.x, rect.max.y - aoutline);
			int2 p2(rect.max.x - aoutline, rect.min.y);
			FColor col2 = outline < 0? lighter : darker;
			out.addFilledRect(IRect(p1, p1 + hsize), col2);
			out.addFilledRect(IRect(p2, p2 + vsize), col2);
		}

		int2 off(aoutline, aoutline);
		out.addFilledRect(inset(rect, off, off), color);
	}
Ejemplo n.º 20
0
static void clipToScreen (Surface *s, Matrix &m, IRect &clip) {
    Surface *ps = s->parentNode ();
    if (!ps) {
        clip = IRect (s->bounds.x (), s->bounds.y (),
                s->bounds.width (), s->bounds.height ());
        m = Matrix (s->bounds.x (), s->bounds.y (), s->xscale, s->yscale);
    } else {
        clipToScreen (ps, m, clip);
        IRect scr = m.toScreen (s->bounds);
        clip = clip.intersect (scr);
        Matrix m1 = m;
        m = Matrix (s->bounds.x (), s->bounds.y (), s->xscale, s->yscale);
        m.transform (m1);
        if (!s->virtual_size.isEmpty ())
            m.translate (-s->x_scroll, -s->y_scroll);
    }
}
Ejemplo n.º 21
0
	GroupEditor::GroupEditor(IRect rect)
		:ui::Window(rect, Color(0, 0, 0)), m_tile_list(rect.width(), 2) {
		m_view = clippedRect();

		m_tile_group = nullptr;
		m_current_entry = nullptr;

		m_font = res::getFont(WindowStyle::fonts[1]);
		m_mode = mAddRemove;
		memset(m_offset, 0, sizeof(m_offset));
		m_selected_group_id = 0;
		m_selected_surface_id = -1;
		m_select_mode = 0;
		m_selection_mode = 0;
		m_tile_filter = TileFilter::floors;

		updateSelector();
	}
Ejemplo n.º 22
0
	void UIListBox::Render()
	{
		UIElementPtr pElement = elements_[0];
		UIElementPtr pSelElement = elements_[1];
		if (this->GetEnabled())
		{
			pElement->TextureColor().SetState(UICS_Normal);
			pElement->FontColor().SetState(UICS_Normal);
			pSelElement->TextureColor().SetState(UICS_Normal);
			pSelElement->FontColor().SetState(UICS_Normal);
		}
		else
		{
			pElement->TextureColor().SetState(UICS_Disabled);
			pElement->FontColor().SetState(UICS_Disabled);
			pSelElement->TextureColor().SetState(UICS_Disabled);
			pSelElement->FontColor().SetState(UICS_Disabled);
		}

		this->GetDialog()->DrawSprite(*pElement,
			IRect(x_, y_, x_ + width_, y_ + height_));

		// Render the text
		if (!items_.empty())
		{
			// Find out the height of a single line of text
			IRect rc = text_rc_;
			IRect rcSel = selection_rc_;
			rc.bottom() = static_cast<int32_t>(rc.top() + UIManager::Instance().GetFontSize(pElement->FontIndex()));

			// Update the line height formation
			text_height_ = rc.Height();

			static bool bSBInit;
			if (!bSBInit)
			{
				// Update the page size of the scroll bar
				if (text_height_)
				{
					scroll_bar_.SetPageSize(text_rc_.Height() / text_height_);
				}
				else
				{
					scroll_bar_.SetPageSize(text_rc_.Height());
				}
				bSBInit = true;
			}

			rc.right() = text_rc_.right();
			for (int i = static_cast<int>(scroll_bar_.GetTrackPos()); i < static_cast<int>(items_.size()); ++ i)
			{
				if (rc.bottom() > text_rc_.bottom())
				{
					break;
				}

				std::shared_ptr<UIListBoxItem> const & pItem = items_[i];

				// Determine if we need to render this item with the
				// selected element.
				bool bSelectedStyle = false;

				if (!(MULTI_SELECTION == style_) && (i == selected_))
				{
					bSelectedStyle = true;
				}
				else
				{
					if (MULTI_SELECTION == style_)
					{
						if (drag_
							&& (((i >= selected_) && (i < sel_start_))
								|| ((i <= selected_) && (i > sel_start_))))
						{
							bSelectedStyle = items_[sel_start_]->bSelected;
						}
						else
						{
							if (pItem->bSelected)
							{
								bSelectedStyle = true;
							}
						}
					}
				}

				if (bSelectedStyle)
				{
					rcSel.top() = rc.top();
					rcSel.bottom() = rc.bottom();
					this->GetDialog()->DrawSprite(*pSelElement, rcSel);
					this->GetDialog()->DrawString(pItem->strText, *pSelElement, rc);
				}
				else
				{
					this->GetDialog()->DrawString(pItem->strText, *pElement, rc);
				}

				rc += int2(0, text_height_);
			}
		}

		// Render the scroll bar
		scroll_bar_.Render();
	}
void ScrollableSelectorWidget::Draw()
{
	int y = 0;
	int numDrawStrings = 0;
	ItemsList::iterator firstItemIterator = _itemsList.begin();
	int advanceValue = 0; // cдвиг в cпиcке
	if (_nScrollers != 0) {
		numDrawStrings = _numStrings + 1;
		advanceValue = (int)(_startString + _yOffset);
		if (_yOffset > 0) {
			y = math::round(fmod(_yOffset, 1.0f) * _stringStep);
		} else {
			y = _stringStep + math::round(fmod(_yOffset, 1.0f) * _stringStep);
		}
	} else {
		numDrawStrings = _numStrings;
		advanceValue = _startString;
	}
	std::advance(firstItemIterator, advanceValue);
	IRect clippingRect (position.x - width / 2, position.y - (_numStrings - 1) * _stringStep, width, _numStrings * _stringStep);

	{
		// Небольшое затенение фона cпиcка
		Render::device.SetTexturing(false);
		Render::BeginColor(Color(0, 0, 0, 127));
		Render::DrawRect(clippingRect);
		Render::EndColor();
	}

	{
		// Риcуем полоcу прокрутки, чтобы было понятно, что
		// что-то там внизу cпиcка не влезает в видимую облаcть

		// Это подложка полоcы прокрутки
		IRect scrollBar (clippingRect); 

		const int scrollBarWidth = 7;
		scrollBar.x = scrollBar.x + scrollBar.width - scrollBarWidth;
		scrollBar.width = scrollBarWidth;

		// Это ползунок на полоcе прокрутки. Он по вcем 
		// размерам меньше подложки ровно на 1 пикcель
		IRect scrollBarThumb (scrollBar);
		scrollBarThumb.height -= 2;
		scrollBarThumb.width -= 2;
		scrollBarThumb.x += 1;

		float heightTotal = float (_stringStep * _itemsList.size());
		float heightVisible = float (_stringStep * _numStrings);

		float thumbScale = heightVisible / heightTotal;
		float thumbHeight = (float) scrollBarThumb.height;
		float thumbOffset = (float) _stringStep * (float (_startString) + _yOffset);

		// Недеюcь, никогда в cпиcке не будет миллиарда
		thumbScale = math::clamp(0.0f, 1.0f, thumbScale);

		// Приведённый размер ползунка полоcы прокрутки по выcоте...
		scrollBarThumb.height = math::round(thumbHeight * thumbScale);

		// Верхняя точка полоcы прокрутки на экране...
		scrollBarThumb.y = scrollBar.y + scrollBar.height - 1;
		scrollBarThumb.y -= math::round(thumbOffset * thumbScale);
		scrollBarThumb.y -= scrollBarThumb.height;

		// Из-за округлений может заехать ниже
		if (scrollBarThumb.y < scrollBar.y + 1)
			scrollBarThumb.y = scrollBar.y + 1;

		Render::BeginColor(Color(0, 0, 0, 127));
		Render::DrawRect(scrollBar);
		Render::EndColor();

		// Риcуем ползунок...
		if (thumbScale < 1.0f)
		{
			// ... когда еcть что прокручивать
			Render::BeginColor(Color(0, 191, 0));
			Render::DrawRect(scrollBarThumb);
			Render::EndColor();

			Render::BeginColor(Color(0, 127, 0));
			Render::DrawFrame(scrollBarThumb);
			Render::EndColor();
		}
		else
		{
			// ... когда нечего прокручивать
			Render::BeginColor(Color(76, 76, 76));
			Render::DrawRect(scrollBarThumb);
			Render::EndColor();

			Render::BeginColor(Color(51, 51, 51));
			Render::DrawFrame(scrollBarThumb);
			Render::EndColor();
		}

		Render::device.SetTexturing(true);
	}

	Render::device.BeginClipping(clippingRect);
	int n = 0;
	for (ItemsList::iterator i = firstItemIterator; i != _itemsList.end() && n < numDrawStrings; ++i, ++n) {
		IPoint str_position = position + IPoint(0, y + _offset);
		Render::FreeType::BindFont(_normalFont);
		if (advanceValue + n == _choosedString + _startString) {
			Render::BeginColor(_activeColor);
		} else {
			Render::BeginColor(_normalColor);
		}
		Render::PrintString(str_position, (*i), 1.0f, CenterAlign, BottomAlign);
		//Render::EndAlphaMul();
		//if ((n == _choosedString) && (activeTextListItemController != 0)) {
		//	float alphaFactor = (float)_color.alpha/255.0f;
		//	int addAlpha = (int)(activeTextListItemController->_activeAlpha*alphaFactor);
		//	Render::BeginAlphaMul(addAlpha / 255.f);
		//	Render::device.SetBlendMode(Render::ADD);
		//	Render::PrintString(str_position, (*i), 1.0f, CenterAlign);
		//	Render::device.SetBlendMode(Render::ALPHA);
		//	Render::EndAlphaMul();
		//}
		y -= _stringStep;
		Render::EndColor();
	}

	Render::device.EndClipping();

	{
		// Зелёная рамка вокруг cпиcка

		Render::device.SetTexturing(false);
		IRect rect (clippingRect);

		Render::BeginColor(Color(0, 191, 0));
		rect.Inflate(1);
		Render::DrawFrame(rect);
		Render::EndColor();

		Render::BeginColor(Color(0, 127, 0, 127));
		rect.Inflate(1);
		Render::DrawFrame(rect);
		Render::EndColor();

		Render::device.SetTexturing(true);
	}
}
Ejemplo n.º 24
0
	TileSelector::TileSelector(IRect rect) :Window(rect, WindowStyle::gui_dark),
		m_tile_list(rect.width(), 2), m_selection(nullptr) {
		update();
	}
Ejemplo n.º 25
0
	void Window::setInnerRect(const IRect &rect) {
		int2 isize = rect.size();
		m_inner_rect.min = max(min(rect.min, {0, 0}), min(-isize + m_rect.size(), {0, 0}));
		m_inner_rect.max = m_inner_rect.min + isize;
		m_has_inner_rect = isize.x > m_rect.width() || isize.y > m_rect.height();
	}