added _swrast_put_row()
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 29 Sep 2005 04:27:47 +0000 (04:27 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 29 Sep 2005 04:27:47 +0000 (04:27 +0000)
src/mesa/swrast/s_span.c
src/mesa/swrast/s_span.h

index 38a7f95f273c699f2e167815e8e904c0ca041ea5..a9745063d904851c5a1c739c43b18428b763dcd8 100644 (file)
@@ -1474,3 +1474,37 @@ _swrast_get_values(GLcontext *ctx, struct gl_renderbuffer *rb,
                     (GLubyte *) values + inStart * valueSize);
    }
 }
+
+
+/**
+ * Wrapper for gl_renderbuffer::PutRow() which does clipping.
+ */
+void
+_swrast_put_row(GLcontext *ctx, struct gl_renderbuffer *rb,
+                GLuint count, GLint x, GLint y,
+                const GLvoid *values, GLuint valueSize)
+{
+   GLint skip = 0;
+
+   if (y < 0 || y >= rb->Height)
+      return; /* above or below */
+
+   if (x + (GLint) count <= 0 || x >= rb->Width)
+      return; /* entirely left or right */
+
+   if (x + count > rb->Width) {
+      /* right clip */
+      GLint clip = x + count - rb->Width;
+      count -= clip;
+   }
+
+   if (x < 0) {
+      /* left clip */
+      skip = -x;
+      x = 0;
+      count -= skip;
+   }
+
+   rb->PutRow(ctx, rb, count, x, y,
+              (const GLubyte *) values + skip * valueSize, NULL);
+}
index 1bba5aa53b33fde82d7e264a9d6a61ec7cfd9a95..0c853746b82f31f69bfbed1faf50b855f001ad55 100644 (file)
@@ -72,4 +72,9 @@ _swrast_get_values(GLcontext *ctx, struct gl_renderbuffer *rb,
                    GLuint count, const GLint x[], const GLint y[],
                    void *values, GLuint valueSize);
 
+extern void
+_swrast_put_row(GLcontext *ctx, struct gl_renderbuffer *rb,
+                GLuint count, GLint x, GLint y,
+                const GLvoid *values, GLuint valueSize);
+
 #endif