📄 glview.cpp
字号:
BRect sr = bitmap->Bounds(); BRect dr = m_bitmap->Bounds(); sr = sr & dr.OffsetBySelf(location); dr = sr.OffsetByCopy(-location.x, -location.y); uint8 *ps = (uint8 *) bitmap->Bits(); uint8 *pd = (uint8 *) m_bitmap->Bits(); uint32 *s, *d; uint32 y; for (y = (uint32) sr.top; y <= (uint32) sr.bottom; y++) { s = (uint32 *) (ps + y * bitmap->BytesPerRow()); s += (uint32) sr.left; d = (uint32 *) (pd + (y + (uint32) (dr.top - sr.top)) * m_bitmap->BytesPerRow()); d += (uint32) dr.left; memcpy(d, s, dr.IntegerWidth() * 4); } return B_OK;}void MesaDriver::Draw(BRect updateRect) const{ if (m_bitmap) m_bglview->DrawBitmap(m_bitmap, updateRect, updateRect);}void MesaDriver::Error(GLcontext *ctx){ MesaDriver *md = (MesaDriver *) ctx->DriverCtx; if (md && md->m_bglview) md->m_bglview->ErrorCallback((unsigned long) ctx->ErrorValue);}void MesaDriver::UpdateState( GLcontext *ctx, GLuint new_state ){ struct swrast_device_driver * swdd = _swrast_GetDeviceDriverReference( ctx ); _swrast_InvalidateState( ctx, new_state ); _swsetup_InvalidateState( ctx, new_state ); _vbo_InvalidateState( ctx, new_state ); _tnl_InvalidateState( ctx, new_state ); if (ctx->Color.DrawBuffer[0] == GL_FRONT) { /* read/write front buffer */ swdd->WriteRGBASpan = MesaDriver::WriteRGBASpanFront; swdd->WriteRGBSpan = MesaDriver::WriteRGBSpanFront; swdd->WriteRGBAPixels = MesaDriver::WriteRGBAPixelsFront; swdd->WriteMonoRGBASpan = MesaDriver::WriteMonoRGBASpanFront; swdd->WriteMonoRGBAPixels = MesaDriver::WriteMonoRGBAPixelsFront; swdd->WriteCI32Span = MesaDriver::WriteCI32SpanFront; swdd->WriteCI8Span = MesaDriver::WriteCI8SpanFront; swdd->WriteMonoCISpan = MesaDriver::WriteMonoCISpanFront; swdd->WriteCI32Pixels = MesaDriver::WriteCI32PixelsFront; swdd->WriteMonoCIPixels = MesaDriver::WriteMonoCIPixelsFront; swdd->ReadRGBASpan = MesaDriver::ReadRGBASpanFront; swdd->ReadRGBAPixels = MesaDriver::ReadRGBAPixelsFront; swdd->ReadCI32Span = MesaDriver::ReadCI32SpanFront; swdd->ReadCI32Pixels = MesaDriver::ReadCI32PixelsFront; } else { /* read/write back buffer */ swdd->WriteRGBASpan = MesaDriver::WriteRGBASpanBack; swdd->WriteRGBSpan = MesaDriver::WriteRGBSpanBack; swdd->WriteRGBAPixels = MesaDriver::WriteRGBAPixelsBack; swdd->WriteMonoRGBASpan = MesaDriver::WriteMonoRGBASpanBack; swdd->WriteMonoRGBAPixels = MesaDriver::WriteMonoRGBAPixelsBack; swdd->WriteCI32Span = MesaDriver::WriteCI32SpanBack; swdd->WriteCI8Span = MesaDriver::WriteCI8SpanBack; swdd->WriteMonoCISpan = MesaDriver::WriteMonoCISpanBack; swdd->WriteCI32Pixels = MesaDriver::WriteCI32PixelsBack; swdd->WriteMonoCIPixels = MesaDriver::WriteMonoCIPixelsBack; swdd->ReadRGBASpan = MesaDriver::ReadRGBASpanBack; swdd->ReadRGBAPixels = MesaDriver::ReadRGBAPixelsBack; swdd->ReadCI32Span = MesaDriver::ReadCI32SpanBack; swdd->ReadCI32Pixels = MesaDriver::ReadCI32PixelsBack; }}void MesaDriver::ClearIndex(GLcontext *ctx, GLuint index){ MesaDriver *md = (MesaDriver *) ctx->DriverCtx; md->m_clear_index = index;}void MesaDriver::ClearColor(GLcontext *ctx, const GLfloat color[4]){ MesaDriver *md = (MesaDriver *) ctx->DriverCtx; CLAMPED_FLOAT_TO_CHAN(md->m_clear_color[BE_RCOMP], color[0]); CLAMPED_FLOAT_TO_CHAN(md->m_clear_color[BE_GCOMP], color[1]); CLAMPED_FLOAT_TO_CHAN(md->m_clear_color[BE_BCOMP], color[2]); CLAMPED_FLOAT_TO_CHAN(md->m_clear_color[BE_ACOMP], color[3]); assert(md->m_bglview);}void MesaDriver::Clear(GLcontext *ctx, GLbitfield mask, GLboolean all, GLint x, GLint y, GLint width, GLint height){ if (mask & DD_FRONT_LEFT_BIT) ClearFront(ctx, all, x, y, width, height); if (mask & DD_BACK_LEFT_BIT) ClearBack(ctx, all, x, y, width, height); mask &= ~(DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT); if (mask) _swrast_Clear( ctx, mask, all, x, y, width, height ); return;}void MesaDriver::ClearFront(GLcontext *ctx, GLboolean all, GLint x, GLint y, GLint width, GLint height){ MesaDriver *md = (MesaDriver *) ctx->DriverCtx; BGLView *bglview = md->m_bglview; assert(bglview); bglview->SetHighColor(md->m_clear_color[BE_RCOMP], md->m_clear_color[BE_GCOMP], md->m_clear_color[BE_BCOMP], md->m_clear_color[BE_ACOMP]); bglview->SetLowColor(md->m_clear_color[BE_RCOMP], md->m_clear_color[BE_GCOMP], md->m_clear_color[BE_BCOMP], md->m_clear_color[BE_ACOMP]); if (all) { BRect b = bglview->Bounds(); bglview->FillRect(b); } else { // XXX untested BRect b; b.left = x; b.right = x + width; b.bottom = md->m_height - y - 1; b.top = b.bottom - height; bglview->FillRect(b); } // restore drawing color#if 0 bglview->SetHighColor(md->mColor[BE_RCOMP], md->mColor[BE_GCOMP], md->mColor[BE_BCOMP], md->mColor[BE_ACOMP]); bglview->SetLowColor(md->mColor[BE_RCOMP], md->mColor[BE_GCOMP], md->mColor[BE_BCOMP], md->mColor[BE_ACOMP]);#endif}void MesaDriver::ClearBack(GLcontext *ctx, GLboolean all, GLint x, GLint y, GLint width, GLint height){ MesaDriver *md = (MesaDriver *) ctx->DriverCtx; BGLView *bglview = md->m_bglview; assert(bglview); BBitmap *bitmap = md->m_bitmap; assert(bitmap); GLuint *start = (GLuint *) bitmap->Bits(); const GLuint *clearPixelPtr = (const GLuint *) md->m_clear_color; const GLuint clearPixel = B_LENDIAN_TO_HOST_INT32(*clearPixelPtr); if (all) { const int numPixels = md->m_width * md->m_height; if (clearPixel == 0) { memset(start, 0, numPixels * 4); } else { for (int i = 0; i < numPixels; i++) { start[i] = clearPixel; } } } else { // XXX untested start += y * md->m_width + x; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { start[j] = clearPixel; } start += md->m_width; } }}void MesaDriver::SetBuffer(GLcontext *ctx, GLframebuffer *buffer, GLenum mode){ /* TODO */ (void) ctx; (void) buffer; (void) mode;}void MesaDriver::GetBufferSize(GLframebuffer * framebuffer, GLuint *width, GLuint *height){ GET_CURRENT_CONTEXT(ctx); if (!ctx) return; MesaDriver * md = (MesaDriver *) ctx->DriverCtx; BGLView *bglview = md->m_bglview; assert(bglview); BRect b = bglview->Bounds(); *width = (GLuint) b.IntegerWidth() + 1; // (b.right - b.left + 1); *height = (GLuint) b.IntegerHeight() + 1; // (b.bottom - b.top + 1); md->m_bottom = (GLint) b.bottom; if (ctx->Visual.doubleBufferMode) { if (*width != md->m_width || *height != md->m_height) { // allocate new size of back buffer bitmap if (md->m_bitmap) delete md->m_bitmap; BRect rect(0.0, 0.0, *width - 1, *height - 1); md->m_bitmap = new BBitmap(rect, B_RGBA32); } } else { md->m_bitmap = NULL; } md->m_width = *width; md->m_height = *height;}void MesaDriver::Viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h){ /* poll for window size change and realloc software Z/stencil/etc if needed */ _mesa_ResizeBuffersMESA();}const GLubyte *MesaDriver::GetString(GLcontext *ctx, GLenum name){ switch (name) { case GL_RENDERER: return (const GLubyte *) "Mesa " MESA_VERSION_STRING " powered BGLView (software)"; default: // Let core library handle all other cases return NULL; }}// Plot a pixel. (0,0) is upper-left corner// This is only used when drawing to the front buffer.inline void Plot(BGLView *bglview, int x, int y){ // XXX There's got to be a better way! BPoint p(x, y), q(x+1, y); bglview->StrokeLine(p, q);}void MesaDriver::WriteRGBASpanFront(const GLcontext *ctx, GLuint n, GLint x, GLint y, CONST GLubyte rgba[][4], const GLubyte mask[]){ MesaDriver *md = (MesaDriver *) ctx->DriverCtx; BGLView *bglview = md->m_bglview; assert(bglview); int flippedY = md->m_bottom - y; if (mask) { for (GLuint i = 0; i < n; i++) { if (mask[i]) { bglview->SetHighColor(rgba[i][0], rgba[i][1], rgba[i][2], rgba[i][3]); Plot(bglview, x++, flippedY); } } } else { for (GLuint i = 0; i < n; i++) { bglview->SetHighColor(rgba[i][0], rgba[i][1], rgba[i][2], rgba[i][3]); Plot(bglview, x++, flippedY); } }}void MesaDriver::WriteRGBSpanFront(const GLcontext *ctx, GLuint n, GLint x, GLint y, CONST GLubyte rgba[][3], const GLubyte mask[]){ MesaDriver *md = (MesaDriver *) ctx->DriverCtx; BGLView *bglview = md->m_bglview; assert(bglview); int flippedY = md->m_bottom - y; if (mask) { for (GLuint i = 0; i < n; i++) { if (mask[i]) { bglview->SetHighColor(rgba[i][0], rgba[i][1], rgba[i][2]); Plot(bglview, x++, flippedY); } } } else { for (GLuint i = 0; i < n; i++) { bglview->SetHighColor(rgba[i][0], rgba[i][1], rgba[i][2]); Plot(bglview, x++, flippedY); } }}void MesaDriver::WriteMonoRGBASpanFront(const GLcontext *ctx, GLuint n, GLint x, GLint y, const GLchan color[4], const GLubyte mask[]){ MesaDriver *md = (MesaDriver *) ctx->DriverCtx; BGLView *bglview = md->m_bglview; assert(bglview); int flippedY = md->m_bottom - y; bglview->SetHighColor(color[RCOMP], color[GCOMP], color[BCOMP]); if (mask) { for (GLuint i = 0; i < n; i++) { if (mask[i]) { Plot(bglview, x++, flippedY); } } } else { for (GLuint i = 0; i < n; i++) { Plot(bglview, x++, flippedY); } }}void MesaDriver::WriteRGBAPixelsFront(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], CONST GLubyte rgba[][4], const GLubyte mask[] ){ MesaDriver *md = (MesaDriver *) ctx->DriverCtx; BGLView *bglview = md->m_bglview; assert(bglview); if (mask) { for (GLuint i = 0; i < n; i++) { if (mask[i]) { bglview->SetHighColor(rgba[i][0], rgba[i][1], rgba[i][2]); Plot(bglview, x[i], md->m_bottom - y[i]); } } } else { for (GLuint i = 0; i < n; i++) { bglview->SetHighColor(rgba[i][0], rgba[i][1], rgba[i][2]); Plot(bglview, x[i], md->m_bottom - y[i]); } }}void MesaDriver::WriteMonoRGBAPixelsFront(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], const GLchan color[4], const GLubyte mask[]){ MesaDriver *md = (MesaDriver *) ctx->DriverCtx; BGLView *bglview = md->m_bglview; assert(bglview); // plot points using current color bglview->SetHighColor(color[RCOMP], color[GCOMP], color[BCOMP]); if (mask) { for (GLuint i = 0; i < n; i++) { if (mask[i]) { Plot(bglview, x[i], md->m_bottom - y[i]); } } } else { for (GLuint i = 0; i < n; i++) { Plot(bglview, x[i], md->m_bottom - y[i]); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -