summaryrefslogtreecommitdiff
path: root/hw/xgl/xglsolid.c
diff options
context:
space:
mode:
authorDavid Reveman <c99drn@cs.umu.se>2005-01-26 10:58:52 +0000
committerDavid Reveman <c99drn@cs.umu.se>2005-01-26 10:58:52 +0000
commit9817582328cdafee59de616136172c2ce361a4b3 (patch)
tree3e0da4e87197223292a0306c63a9a9d56580f45e /hw/xgl/xglsolid.c
parent13b5a93b70839053b9165b5087872164f0612536 (diff)
Xgl improvements
Diffstat (limited to 'hw/xgl/xglsolid.c')
-rw-r--r--hw/xgl/xglsolid.c122
1 files changed, 107 insertions, 15 deletions
diff --git a/hw/xgl/xglsolid.c b/hw/xgl/xglsolid.c
index 2892978e5..789c9dd12 100644
--- a/hw/xgl/xglsolid.c
+++ b/hw/xgl/xglsolid.c
@@ -5,7 +5,7 @@
* and its documentation for any purpose is hereby granted without
* fee, provided that the above copyright notice appear in all copies
* and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the names of
+ * appear in supporting documentation, and that the name of
* David Reveman not be used in advertising or publicity pertaining to
* distribution of the software without specific, written prior permission.
* David Reveman makes no representations about the suitability of this
@@ -20,16 +20,23 @@
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * Author: David Reveman <davidr@freedesktop.org>
+ * Author: David Reveman <davidr@novell.com>
*/
#include "xgl.h"
+#include "gcstruct.h"
+#include "fontstruct.h"
+#include "dixfontstr.h"
Bool
xglSolid (DrawablePtr pDrawable,
glitz_operator_t op,
glitz_color_t *color,
xglGeometryPtr pGeometry,
+ int x,
+ int y,
+ int width,
+ int height,
BoxPtr pBox,
int nBox)
{
@@ -38,6 +45,9 @@ xglSolid (DrawablePtr pDrawable,
XGL_SCREEN_PRIV (pDrawable->pScreen);
+ if (nBox < 1)
+ return TRUE;
+
if (!xglPrepareTarget (pDrawable))
return FALSE;
@@ -45,26 +55,108 @@ xglSolid (DrawablePtr pDrawable,
glitz_set_rectangle (pScreenPriv->solid, color, 0, 0, 1, 1);
+ if (pGeometry)
+ {
+ glitz_surface_set_clip_region (surface, xOff, yOff,
+ (glitz_box_t *) pBox, nBox);
+ }
+ else
+ {
+ pGeometry = xglGetScratchVertexGeometry (pDrawable->pScreen, 4 * nBox);
+ GEOMETRY_ADD_BOX (pDrawable->pScreen, pGeometry, pBox, nBox);
+ }
+
GEOMETRY_TRANSLATE (pGeometry, xOff, yOff);
- if (!GEOMETRY_ENABLE_ALL_VERTICES (pGeometry, surface))
+ if (!GEOMETRY_ENABLE (pGeometry, surface))
return FALSE;
-
- while (nBox--)
- {
- glitz_composite (op,
- pScreenPriv->solid, NULL, surface,
- 0, 0,
- 0, 0,
- pBox->x1 + xOff,
- pBox->y1 + yOff,
- pBox->x2 - pBox->x1, pBox->y2 - pBox->y1);
- pBox++;
- }
+ glitz_composite (op,
+ pScreenPriv->solid, NULL, surface,
+ 0, 0,
+ 0, 0,
+ x + xOff,
+ y + yOff,
+ width, height);
+ glitz_surface_set_clip_region (surface, 0, 0, NULL, 0);
+
if (glitz_surface_get_status (surface))
return FALSE;
return TRUE;
}
+
+Bool
+xglSolidGlyph (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int x,
+ int y,
+ unsigned int nGlyph,
+ CharInfoPtr *ppci,
+ pointer pglyphBase)
+{
+ xglGeometryRec geometry;
+ int xBack, widthBack;
+ int yBack, heightBack;
+
+ XGL_GC_PRIV (pGC);
+
+ x += pDrawable->x;
+ y += pDrawable->y;
+
+ GEOMETRY_INIT (pDrawable->pScreen, &geometry,
+ GLITZ_GEOMETRY_TYPE_BITMAP,
+ GEOMETRY_USAGE_SYSMEM, 0);
+
+ GEOMETRY_FOR_GLYPH (pDrawable->pScreen,
+ &geometry,
+ nGlyph,
+ ppci,
+ pglyphBase);
+
+ GEOMETRY_TRANSLATE (&geometry, x, y);
+
+ widthBack = 0;
+ while (nGlyph--)
+ widthBack += (*ppci++)->metrics.characterWidth;
+
+ xBack = x;
+ if (widthBack < 0)
+ {
+ xBack += widthBack;
+ widthBack = -widthBack;
+ }
+ yBack = y - FONTASCENT (pGC->font);
+ heightBack = FONTASCENT (pGC->font) + FONTDESCENT (pGC->font);
+
+ if (xglSolid (pDrawable,
+ pGCPriv->op,
+ &pGCPriv->bg,
+ NULL,
+ xBack,
+ yBack,
+ widthBack,
+ heightBack,
+ REGION_RECTS (pGC->pCompositeClip),
+ REGION_NUM_RECTS (pGC->pCompositeClip)))
+ {
+ if (xglSolid (pDrawable,
+ pGCPriv->op,
+ &pGCPriv->fg,
+ &geometry,
+ xBack,
+ yBack,
+ widthBack,
+ heightBack,
+ REGION_RECTS (pGC->pCompositeClip),
+ REGION_NUM_RECTS (pGC->pCompositeClip)))
+ {
+ GEOMETRY_UNINIT (&geometry);
+ return TRUE;
+ }
+ }
+
+ GEOMETRY_UNINIT (&geometry);
+ return FALSE;
+}