void Canvas::StretchMono(PixelScalar dest_x, PixelScalar dest_y, UPixelScalar dest_width, UPixelScalar dest_height, const Bitmap &src, PixelScalar src_x, PixelScalar src_y, UPixelScalar src_width, UPixelScalar src_height, Color fg_color, Color bg_color) { assert(IsDefined()); assert(src.IsDefined()); SDL_Surface *src_surface = src.GetNative(); assert(src_surface->format->palette != NULL && src_surface->format->palette->ncolors == 2); SDL_Surface *zoomed = ::zoomSurface(src_surface, (double)dest_width / (double)src_width, (double)dest_height / (double)src_height, SMOOTHING_OFF); if (zoomed == NULL) return; assert(zoomed->format->palette != NULL && zoomed->format->palette->ncolors == 2); ::SDL_SetColorKey(zoomed, 0, 0); zoomed->format->palette->colors[0] = text_color; zoomed->format->palette->colors[1] = bg_color; copy(dest_x, dest_y, dest_width, dest_height, zoomed, (src_x * dest_width) / src_width, (src_y * dest_height) / src_height); ::SDL_FreeSurface(zoomed); }
void Canvas::StretchNot(const Bitmap &src) { assert(src.IsDefined()); #ifdef USE_GLSL OpenGL::invert_shader->Use(); #else const GLEnable scope(GL_TEXTURE_2D); OpenGL::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); /* invert the texture color */ OpenGL::glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); OpenGL::glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); OpenGL::glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_ONE_MINUS_SRC_COLOR); /* copy the texture alpha */ OpenGL::glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); OpenGL::glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE); OpenGL::glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); #endif GLTexture &texture = *src.GetNative(); texture.Draw(0, 0, GetWidth(), GetHeight(), 0, 0, src.GetWidth(), src.GetHeight()); }
void Canvas::StretchMono(int dest_x, int dest_y, unsigned dest_width, unsigned dest_height, const Bitmap &src, int src_x, int src_y, unsigned src_width, unsigned src_height, Color fg_color, Color bg_color) { assert(IsDefined()); assert(src.IsDefined()); #ifndef _WIN32_WCE if (bg_color == COLOR_BLACK && (src_width != dest_width || src_height != dest_height)) { /* workaround for a WINE bug: stretching a mono bitmap ignores the text color; this kludge makes the text color white */ SetTextColor(COLOR_BLACK); SetBackgroundColor(COLOR_WHITE); Stretch(dest_x, dest_y, dest_width, dest_height, src, src_x, src_y, src_width, src_height, MERGEPAINT); return; } #endif /* on GDI, monochrome bitmaps are special: they are painted with the destination HDC's current colors */ SetTextColor(fg_color); SetBackgroundTransparent(); Stretch(dest_x, dest_y, dest_width, dest_height, src, src_x, src_y, src_width, src_height); }
void Canvas::invert_stretch_transparent(const Bitmap &src, Color key) { assert(src.IsDefined()); SDL_Surface *src_surface = src.GetNative(); const UPixelScalar src_x = 0, src_y = 0; const UPixelScalar src_width = src_surface->w; const UPixelScalar src_height = src_surface->h; const UPixelScalar dest_x = 0, dest_y = 0; const UPixelScalar dest_width = get_width(); const UPixelScalar dest_height = get_height(); SDL_Surface *zoomed = ::zoomSurface(src_surface, (double)dest_width / (double)src_width, (double)dest_height / (double)src_height, SMOOTHING_OFF); if (zoomed == NULL) return; ::SDL_SetColorKey(zoomed, SDL_SRCCOLORKEY, ::SDL_MapRGB(zoomed->format, key.value.r, key.value.g, key.value.b)); copy_not(dest_x, dest_y, dest_width, dest_height, zoomed, (src_x * dest_width) / src_width, (src_y * dest_height) / src_height); ::SDL_FreeSurface(zoomed); }
void Canvas::invert_stretch_transparent(const Bitmap &src, Color key) { assert(IsDefined()); assert(src.IsDefined()); HDC virtual_dc = GetCompatibleDC(); HBITMAP old = (HBITMAP)::SelectObject(virtual_dc, src.GetNative()); const PixelSize size = src.GetSize(); BufferCanvas inverted(*this, size.cx, size.cy); ::BitBlt(inverted, 0, 0, size.cx, size.cy, virtual_dc, 0, 0, NOTSRCCOPY); ::SelectObject(virtual_dc, old); #ifdef _WIN32_WCE ::TransparentImage(dc, 0, 0, get_width(), get_height(), inverted, 0, 0, size.cx, size.cy, key); #else ::TransparentBlt(dc, 0, 0, get_width(), get_height(), inverted, 0, 0, size.cx, size.cy, key); #endif }
void Canvas::stretch_transparent(const Bitmap &src, Color key) { assert(src.IsDefined()); // XXX Stretch(src); }
gcc_pure bool IsDefined() const { #if defined(USE_GDI) || defined(ENABLE_OPENGL) return bitmap.IsDefined(); #else return buffer.data != nullptr; #endif }
void Canvas::Stretch(const Bitmap &src) { assert(src.IsDefined()); const PixelSize size = src.GetSize(); Stretch(src, 0, 0, size.cx, size.cy); }
void Canvas::StretchNot(const Bitmap &src) { assert(src.IsDefined()); GLLogicOp invert(GL_COPY_INVERTED); Stretch(src); }
void Canvas::invert_stretch_transparent(const Bitmap &src, Color key) { assert(src.IsDefined()); // XXX GLLogicOp invert(GL_COPY_INVERTED); Stretch(src); }
void Canvas::CopyAnd(int dest_x, int dest_y, unsigned dest_width, unsigned dest_height, const Bitmap &src, int src_x, int src_y) { assert(src.IsDefined()); CopyAnd(dest_x, dest_y, dest_width, dest_height, src.GetNative(), src_x, src_y); }
void Canvas::copy_and(PixelScalar dest_x, PixelScalar dest_y, UPixelScalar dest_width, UPixelScalar dest_height, const Bitmap &src, PixelScalar src_x, PixelScalar src_y) { assert(src.IsDefined()); copy_and(dest_x, dest_y, dest_width, dest_height, src.GetNative(), src_x, src_y); }
void Canvas::Stretch(int dest_x, int dest_y, unsigned dest_width, unsigned dest_height, const Bitmap &src) { assert(src.IsDefined()); const PixelSize size = src.GetSize(); Stretch(dest_x, dest_y, dest_width, dest_height, src, 0, 0, size.cx, size.cy); }
void Canvas::CopyAnd(int dest_x, int dest_y, unsigned dest_width, unsigned dest_height, const Bitmap &src, int src_x, int src_y) { assert(src.IsDefined()); GLLogicOp logic_op(GL_AND); Copy(dest_x, dest_y, dest_width, dest_height, src, src_x, src_y); }
void Canvas::stretch(PixelScalar dest_x, PixelScalar dest_y, UPixelScalar dest_width, UPixelScalar dest_height, const Bitmap &src) { assert(src.IsDefined()); const PixelSize size = src.GetSize(); stretch(dest_x, dest_y, dest_width, dest_height, src, 0, 0, size.cx, size.cy); }
void Canvas::CopyNot(PixelScalar dest_x, PixelScalar dest_y, UPixelScalar dest_width, UPixelScalar dest_height, const Bitmap &src, PixelScalar src_x, PixelScalar src_y) { assert(src.IsDefined()); GLLogicOp logic_op(GL_COPY_INVERTED); copy(dest_x, dest_y, dest_width, dest_height, src, src_x, src_y); }
void Canvas::StretchNot(const Bitmap &src) { assert(IsDefined()); assert(src.IsDefined()); const PixelSize size = src.GetSize(); Stretch(0, 0, GetWidth(), GetHeight(), src.GetNative(), 0, 0, size.cx, size.cy, NOTSRCCOPY); }
void Canvas::stretch(PixelScalar dest_x, PixelScalar dest_y, UPixelScalar dest_width, UPixelScalar dest_height, const Bitmap &src) { assert(IsDefined()); assert(src.IsDefined()); SDL_Surface *surface = src.GetNative(); stretch(dest_x, dest_y, dest_width, dest_height, surface, 0, 0, surface->w, surface->h); }
void Canvas::Stretch(int dest_x, int dest_y, unsigned dest_width, unsigned dest_height, const Bitmap &_src) { assert(IsDefined()); assert(_src.IsDefined()); ConstImageBuffer src = _src.GetNative(); Stretch(dest_x, dest_y, dest_width, dest_height, src, 0, 0, src.width, src.height); }
void Canvas::stretch_transparent(const Bitmap &src, Color key) { assert(src.IsDefined()); SDL_Surface *surface = src.GetNative(); ::SDL_SetColorKey(surface, SDL_SRCCOLORKEY, ::SDL_MapRGB(surface->format, key.value.r, key.value.g, key.value.b)); stretch(surface); ::SDL_SetColorKey(surface, 0, 0); }
void Canvas::stretch(PixelScalar dest_x, PixelScalar dest_y, UPixelScalar dest_width, UPixelScalar dest_height, const Bitmap &src, PixelScalar src_x, PixelScalar src_y, UPixelScalar src_width, UPixelScalar src_height) { assert(IsDefined()); assert(src.IsDefined()); stretch(dest_x, dest_y, dest_width, dest_height, src.GetNative(), src_x, src_y, src_width, src_height); }
void Canvas::Stretch(int dest_x, int dest_y, unsigned dest_width, unsigned dest_height, const Bitmap &src, int src_x, int src_y, unsigned src_width, unsigned src_height) { assert(IsDefined()); assert(src.IsDefined()); Stretch(dest_x, dest_y, dest_width, dest_height, src.GetNative(), src_x, src_y, src_width, src_height); }
void Canvas::StretchAnd(int dest_x, int dest_y, unsigned dest_width, unsigned dest_height, const Bitmap &src, int src_x, int src_y, unsigned src_width, unsigned src_height) { assert(IsDefined()); assert(src.IsDefined()); ConstImageBuffer srcImg = src.GetNative(); SDLRasterCanvas canvas(buffer); BitAndPixelOperations<ActivePixelTraits> operations; canvas.ScaleRectangle(dest_x, dest_y, dest_width, dest_height, srcImg.At(src_x, src_y), srcImg.pitch, src_width, src_height, operations); }
void Canvas::StretchNot(const Bitmap &_src) { assert(_src.IsDefined()); ConstImageBuffer src = _src.GetNative(); const unsigned src_x = 0, src_y = 0; const unsigned dest_x = 0, dest_y = 0; const unsigned dest_width = GetWidth(); const unsigned dest_height = GetHeight(); SDLRasterCanvas canvas(buffer); BitNotPixelOperations<ActivePixelTraits> operations; canvas.ScaleRectangle(dest_x, dest_y, dest_width, dest_height, src.At(src_x, src_y), src.pitch, src.width, src.height, operations); }
void Canvas::Stretch(int dest_x, int dest_y, unsigned dest_width, unsigned dest_height, const Bitmap &src) { #ifdef HAVE_GLES assert(offset == OpenGL::translate); #endif assert(src.IsDefined()); OpenGL::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); GLTexture &texture = *src.GetNative(); GLEnable scope(GL_TEXTURE_2D); texture.Bind(); texture.Draw(dest_x, dest_y, dest_width, dest_height, 0, 0, src.GetWidth(), src.GetHeight()); }
void Canvas::Stretch(PixelScalar dest_x, PixelScalar dest_y, UPixelScalar dest_width, UPixelScalar dest_height, const Bitmap &src, PixelScalar src_x, PixelScalar src_y, UPixelScalar src_width, UPixelScalar src_height) { #ifdef HAVE_GLES assert(x_offset == OpenGL::translate_x); assert(y_offset == OpenGL::translate_y); #endif assert(src.IsDefined()); OpenGL::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); GLTexture &texture = *src.GetNative(); GLEnable scope(GL_TEXTURE_2D); texture.Bind(); texture.Draw(dest_x, dest_y, dest_width, dest_height, src_x, src_y, src_width, src_height); }
void Canvas::Stretch(int dest_x, int dest_y, unsigned dest_width, unsigned dest_height, const Bitmap &src, int src_x, int src_y, unsigned src_width, unsigned src_height) { #ifdef HAVE_GLES assert(offset == OpenGL::translate); #endif assert(src.IsDefined()); #ifdef USE_GLSL OpenGL::texture_shader->Use(); #else const GLEnable scope(GL_TEXTURE_2D); OpenGL::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); #endif GLTexture &texture = *src.GetNative(); texture.Bind(); texture.Draw(dest_x, dest_y, dest_width, dest_height, src_x, src_y, src_width, src_height); }
bool IsDefined() const { return bitmap.IsDefined(); }
virtual void OnPaint(Canvas &canvas) { if (bitmap.IsDefined()) canvas.Stretch(bitmap); else canvas.ClearWhite(); }