/** * Specific blit function to blit battlescape terrain data in different shades in a fast way. * Notice there is no surface locking here - you have to make sure you lock the surface yourself * at the start of blitting and unlock it when done. * @param surface to blit to * @param x * @param y * @param off * @param half some tiles are blitted only the right half * @param newBaseColor Attention: the actual color + 1, because 0 is no new base color. */ void Surface::blitNShade(Surface *surface, int x, int y, int off, bool half, int newBaseColor) { ShaderMove<Uint8> src(this, x, y); if (half) { GraphSubset g = src.getDomain(); g.beg_x = g.end_x/2; src.setDomain(g); } if (newBaseColor) { --newBaseColor; newBaseColor <<= 4; ShaderDraw<helper::ColorReplace>(ShaderSurface(surface), src, ShaderScalar(off), ShaderScalar(newBaseColor)); } else ShaderDraw<helper::StandardShade>(ShaderSurface(surface), src, ShaderScalar(off)); }
/** * Draws all the characters in the text with a really * nasty complex gritty text rendering algorithm logic stuff. */ void Text::draw() { Surface::draw(); if (_text.empty() || _font == 0) { return; } // Show text borders for debugging if (Options::debugUi) { SDL_Rect r; r.w = getWidth(); r.h = getHeight(); r.x = 0; r.y = 0; this->drawRect(&r, 5); r.w-=2; r.h-=2; r.x++; r.y++; this->drawRect(&r, 0); } int x = 0, y = 0, line = 0, height = 0; Font *font = _font; int color = _color; std::wstring *s = &_text; for (std::vector<int>::iterator i = _lineHeight.begin(); i != _lineHeight.end(); ++i) { height += *i; } switch (_valign) { case ALIGN_TOP: y = 0; break; case ALIGN_MIDDLE: y = (int)ceil((getHeight() - height) / 2.0); break; case ALIGN_BOTTOM: y = getHeight() - height; break; } x = getLineX(line); if (_wrap) { s = &_wrappedText; } // Set up text color int mul = 1; if (_contrast) { mul = 3; } // Set up text direction int dir = 1; if (_lang->getTextDirection() == DIRECTION_RTL) { dir = -1; } // Invert text by inverting the font palette on index 3 (font palettes use indices 1-5) int mid = _invert ? 3 : 0; // Draw each letter one by one for (std::wstring::iterator c = s->begin(); c != s->end(); ++c) { if (Font::isSpace(*c)) { x += dir * font->getCharSize(*c).w; } else if (Font::isLinebreak(*c)) { line++; y += font->getCharSize(*c).h; x = getLineX(line); if (*c == L'\x02') { font = _small; } } else if (*c == L'\x01') { color = (color == _color ? _color2 : _color); } else { if (dir < 0) x += dir * font->getCharSize(*c).w; Surface* chr = font->getChar(*c); chr->setX(x); chr->setY(y); ShaderDraw<PaletteShift>(ShaderSurface(this, 0, 0), ShaderCrop(chr), ShaderScalar(color), ShaderScalar(mul), ShaderScalar(mid)); if (dir > 0) x += dir * font->getCharSize(*c).w; } } }