/* * Copyright 2021, Haiku, Inc. * Distributed under the terms of the MIT License. */ #include "graphics.h" RasBuf32 gFramebuf = {NULL, 0, 0, 0}; void Clear(RasBuf32 vb, uint32_t c) { vb.stride -= vb.width; for (; vb.height > 0; vb.height--) { for (int x = 0; x < vb.width; x++) { *vb.colors = c; vb.colors++; } vb.colors += vb.stride; } } template RasBuf RasBuf::Clip(int x, int y, int w, int h) const { RasBuf vb = *this; if (x < 0) {w += x; x = 0;} if (y < 0) {h += y; y = 0;} if (x + w > vb.width) {w = vb.width - x;} if (y + h > vb.height) {h = vb.height - y;} if (w > 0 && h > 0) { vb.colors += y*vb.stride + x; vb.width = w; vb.height = h; } else { vb.colors = 0; vb.width = 0; vb.height = 0; } return vb; } template class RasBuf; template class RasBuf; RasBuf8 Font::ThisGlyph(uint32 ch) { if (ch < firstChar || ch >= firstChar + charCnt) return ThisGlyph(' '); RasBuf8 rb; rb.colors = data + (ch - firstChar) * charWidth * charHeight; rb.stride = charWidth; rb.width = charWidth; rb.height = charHeight; return rb; } void BlitMaskRgb(RasBuf32 dst, RasBuf8 src, int32 x, int32 y, uint32_t c) { int dstW, dstH; uint32_t dc, a; dstW = dst.width; dstH = dst.height; dst = dst.Clip(x, y, src.width, src.height); src = src.Clip(-x, -y, dstW, dstH); dst.stride -= dst.width; src.stride -= src.width; for (; dst.height > 0; dst.height--) { for (x = dst.width; x > 0; x--) { dc = *dst.colors; a = *src.colors; if (a != 0) { *dst.colors = ((((dc >> 0) % 0x100) * (0xff - a) / 0xff + ((c >> 0) % 0x100) * a / 0xff) << 0) + ((((dc >> 8) % 0x100) * (0xff - a) / 0xff + ((c >> 8) % 0x100) * a / 0xff) << 8) + ((((dc >> 16) % 0x100) * (0xff - a) / 0xff + ((c >> 16) % 0x100) * a / 0xff) << 16) + (dc & 0xff000000); } dst.colors++; src.colors++; } dst.colors += dst.stride; src.colors += src.stride; } }