mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-08 21:58:04 +02:00
gl: Use the embedded operand to allow passing sources around
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
65cd7d3beb
commit
16038150b3
8 changed files with 136 additions and 209 deletions
|
|
@ -369,6 +369,7 @@ cairo_gl_sources = cairo-gl-composite.c \
|
|||
cairo-gl-msaa-compositor.c \
|
||||
cairo-gl-spans-compositor.c \
|
||||
cairo-gl-traps-compositor.c \
|
||||
cairo-gl-source.c \
|
||||
cairo-gl-surface.c
|
||||
|
||||
cairo_glesv2_headers = $(cairo_gl_headers)
|
||||
|
|
|
|||
|
|
@ -217,13 +217,6 @@ _cairo_gl_font_fini (cairo_scaled_font_private_t *_priv,
|
|||
free (priv);
|
||||
}
|
||||
|
||||
static inline cairo_gl_operand_t *
|
||||
source_to_operand (cairo_surface_t *surface)
|
||||
{
|
||||
cairo_gl_source_t *source = (cairo_gl_source_t *) surface;
|
||||
return &source->operand;
|
||||
}
|
||||
|
||||
static cairo_status_t
|
||||
render_glyphs (cairo_gl_surface_t *dst,
|
||||
int dst_x, int dst_y,
|
||||
|
|
|
|||
|
|
@ -154,7 +154,6 @@ _cairo_gl_subsurface_operand_init (cairo_gl_operand_t *operand,
|
|||
cairo_surface_subsurface_t *sub;
|
||||
cairo_gl_surface_t *surface;
|
||||
cairo_surface_attributes_t *attributes;
|
||||
cairo_matrix_t m;
|
||||
|
||||
sub = (cairo_surface_subsurface_t *) src->surface;
|
||||
|
||||
|
|
@ -168,37 +167,19 @@ _cairo_gl_subsurface_operand_init (cairo_gl_operand_t *operand,
|
|||
|
||||
surface = (cairo_gl_surface_t *) sub->target;
|
||||
|
||||
attributes = &operand->texture.attributes;
|
||||
|
||||
operand->type = CAIRO_GL_OPERAND_TEXTURE;
|
||||
operand->texture.surface =
|
||||
(cairo_gl_surface_t *) cairo_surface_reference (&surface->base);
|
||||
operand->texture.tex = surface->tex;
|
||||
|
||||
/* Translate the matrix from
|
||||
* (unnormalized src -> unnormalized src) to
|
||||
* (unnormalized dst -> unnormalized src)
|
||||
*/
|
||||
*operand = surface->operand;
|
||||
|
||||
attributes = &operand->texture.attributes;
|
||||
attributes->matrix = src->base.matrix;
|
||||
attributes->matrix.x0 += sub->extents.x;
|
||||
attributes->matrix.y0 += sub->extents.y;
|
||||
|
||||
/* Translate the matrix from
|
||||
* (unnormalized dst -> unnormalized src) to
|
||||
* (unnormalized dst -> normalized src)
|
||||
*/
|
||||
if (_cairo_gl_device_requires_power_of_two_textures (dst->base.device)) {
|
||||
cairo_matrix_init_scale (&m,
|
||||
1.0,
|
||||
1.0);
|
||||
} else {
|
||||
cairo_matrix_init_scale (&m,
|
||||
1.0 / surface->width,
|
||||
1.0 / surface->height);
|
||||
}
|
||||
cairo_matrix_multiply (&attributes->matrix,
|
||||
&attributes->matrix,
|
||||
&m);
|
||||
&surface->operand.texture.attributes.matrix);
|
||||
|
||||
attributes->extend = src->base.extend;
|
||||
attributes->filter = src->base.filter;
|
||||
|
|
@ -216,7 +197,6 @@ _cairo_gl_surface_operand_init (cairo_gl_operand_t *operand,
|
|||
const cairo_surface_pattern_t *src = (cairo_surface_pattern_t *)_src;
|
||||
cairo_gl_surface_t *surface;
|
||||
cairo_surface_attributes_t *attributes;
|
||||
cairo_matrix_t m;
|
||||
|
||||
surface = (cairo_gl_surface_t *) src->surface;
|
||||
if (surface->base.type != CAIRO_SURFACE_TYPE_GL)
|
||||
|
|
@ -230,35 +210,12 @@ _cairo_gl_surface_operand_init (cairo_gl_operand_t *operand,
|
|||
return CAIRO_INT_STATUS_UNSUPPORTED;
|
||||
}
|
||||
|
||||
*operand = surface->operand;
|
||||
|
||||
attributes = &operand->texture.attributes;
|
||||
|
||||
operand->type = CAIRO_GL_OPERAND_TEXTURE;
|
||||
operand->texture.surface =
|
||||
(cairo_gl_surface_t *) cairo_surface_reference (&surface->base);
|
||||
operand->texture.tex = surface->tex;
|
||||
|
||||
/* Translate the matrix from
|
||||
* (unnormalized src -> unnormalized src) to
|
||||
* (unnormalized dst -> unnormalized src)
|
||||
*/
|
||||
attributes->matrix = src->base.matrix;
|
||||
|
||||
/* Translate the matrix from
|
||||
* (unnormalized dst -> unnormalized src) to
|
||||
* (unnormalized dst -> normalized src)
|
||||
*/
|
||||
if (_cairo_gl_device_requires_power_of_two_textures (dst->base.device)) {
|
||||
cairo_matrix_init_scale (&m,
|
||||
1.0,
|
||||
1.0);
|
||||
} else {
|
||||
cairo_matrix_init_scale (&m,
|
||||
1.0 / surface->width,
|
||||
1.0 / surface->height);
|
||||
}
|
||||
cairo_matrix_multiply (&attributes->matrix,
|
||||
&attributes->matrix,
|
||||
&m);
|
||||
&src->base.matrix,
|
||||
&attributes->matrix);
|
||||
|
||||
attributes->extend = src->base.extend;
|
||||
attributes->filter = src->base.filter;
|
||||
|
|
@ -275,11 +232,8 @@ _cairo_gl_pattern_texture_setup (cairo_gl_operand_t *operand,
|
|||
cairo_status_t status;
|
||||
cairo_gl_surface_t *surface;
|
||||
cairo_gl_context_t *ctx;
|
||||
cairo_surface_attributes_t *attributes;
|
||||
cairo_surface_t *image;
|
||||
|
||||
attributes = &operand->texture.attributes;
|
||||
|
||||
status = _cairo_gl_context_acquire (dst->base.device, &ctx);
|
||||
if (unlikely (status))
|
||||
return status;
|
||||
|
|
@ -299,21 +253,10 @@ _cairo_gl_pattern_texture_setup (cairo_gl_operand_t *operand,
|
|||
return status;
|
||||
}
|
||||
|
||||
attributes->extend = CAIRO_EXTEND_NONE;
|
||||
attributes->filter = CAIRO_FILTER_NEAREST;
|
||||
attributes->has_component_alpha = FALSE;
|
||||
|
||||
operand->type = CAIRO_GL_OPERAND_TEXTURE;
|
||||
*operand = surface->operand;
|
||||
operand->texture.surface = surface;
|
||||
operand->texture.tex = surface->tex;
|
||||
|
||||
if (_cairo_gl_device_requires_power_of_two_textures (dst->base.device)) {
|
||||
cairo_matrix_init_identity (&attributes->matrix);
|
||||
} else {
|
||||
cairo_matrix_init_scale (&attributes->matrix,
|
||||
1.0 / surface->width,
|
||||
1.0 / surface->height);
|
||||
}
|
||||
operand->texture.attributes.matrix.x0 -= extents->x * operand->texture.attributes.matrix.xx;
|
||||
operand->texture.attributes.matrix.y0 -= extents->y * operand->texture.attributes.matrix.yy;
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -150,7 +150,6 @@ typedef struct cairo_gl_operand {
|
|||
|
||||
typedef struct cairo_gl_source {
|
||||
cairo_surface_t base;
|
||||
|
||||
cairo_gl_operand_t operand;
|
||||
} cairo_gl_source_t;
|
||||
|
||||
|
|
@ -698,9 +697,24 @@ _cairo_gl_surface_create_scratch (cairo_gl_context_t *ctx,
|
|||
int width,
|
||||
int height);
|
||||
|
||||
cairo_private cairo_surface_t *
|
||||
_cairo_gl_pattern_to_source (cairo_surface_t *dst,
|
||||
const cairo_pattern_t *pattern,
|
||||
cairo_bool_t is_mask,
|
||||
const cairo_rectangle_int_t *extents,
|
||||
const cairo_rectangle_int_t *sample,
|
||||
int *src_x, int *src_y);
|
||||
|
||||
cairo_private cairo_surface_t *
|
||||
_cairo_gl_white_source (void);
|
||||
|
||||
static inline cairo_gl_operand_t *
|
||||
source_to_operand (cairo_surface_t *surface)
|
||||
{
|
||||
cairo_gl_source_t *source = (cairo_gl_source_t *)surface;
|
||||
return source ? &source->operand : NULL;
|
||||
}
|
||||
|
||||
slim_hidden_proto (cairo_gl_surface_create);
|
||||
slim_hidden_proto (cairo_gl_surface_create_for_texture);
|
||||
|
||||
|
|
|
|||
106
src/cairo-gl-source.c
Normal file
106
src/cairo-gl-source.c
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
/* cairo - a vector graphics library with display and print output
|
||||
*
|
||||
* Copyright © 2011 Intel Corporation
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it either under the terms of the GNU Lesser General Public
|
||||
* License version 2.1 as published by the Free Software Foundation
|
||||
* (the "LGPL") or, at your option, under the terms of the Mozilla
|
||||
* Public License Version 1.1 (the "MPL"). If you do not alter this
|
||||
* notice, a recipient may use your version of this file under either
|
||||
* the MPL or the LGPL.
|
||||
*
|
||||
* You should have received a copy of the LGPL along with this library
|
||||
* in the file COPYING-LGPL-2.1; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA
|
||||
* You should have received a copy of the MPL along with this library
|
||||
* in the file COPYING-MPL-1.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
|
||||
* OF ANY KIND, either express or implied. See the LGPL or the MPL for
|
||||
* the specific language governing rights and limitations.
|
||||
*
|
||||
* The Original Code is the cairo graphics library.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Red Hat, Inc.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Chris Wilson <chris@chris-wilson.co.uk>
|
||||
*/
|
||||
|
||||
#include "cairoint.h"
|
||||
|
||||
#include "cairo-gl-private.h"
|
||||
|
||||
#include "cairo-surface-backend-private.h"
|
||||
|
||||
static cairo_status_t
|
||||
_cairo_gl_source_finish (void *abstract_surface)
|
||||
{
|
||||
cairo_gl_source_t *source = abstract_surface;
|
||||
|
||||
_cairo_gl_operand_destroy (&source->operand);
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static const cairo_surface_backend_t cairo_gl_source_backend = {
|
||||
CAIRO_SURFACE_TYPE_GL,
|
||||
_cairo_gl_source_finish,
|
||||
NULL, /* read-only wrapper */
|
||||
};
|
||||
|
||||
cairo_surface_t *
|
||||
_cairo_gl_pattern_to_source (cairo_surface_t *dst,
|
||||
const cairo_pattern_t *pattern,
|
||||
cairo_bool_t is_mask,
|
||||
const cairo_rectangle_int_t *extents,
|
||||
const cairo_rectangle_int_t *sample,
|
||||
int *src_x, int *src_y)
|
||||
{
|
||||
cairo_gl_source_t *source;
|
||||
cairo_int_status_t status;
|
||||
|
||||
source = malloc (sizeof (*source));
|
||||
if (unlikely (source == NULL))
|
||||
return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY));
|
||||
|
||||
_cairo_surface_init (&source->base,
|
||||
&cairo_gl_source_backend,
|
||||
NULL, /* device */
|
||||
CAIRO_CONTENT_COLOR_ALPHA);
|
||||
|
||||
*src_x = *src_y = 0;
|
||||
status = _cairo_gl_operand_init (&source->operand, pattern,
|
||||
(cairo_gl_surface_t *)dst,
|
||||
sample, extents);
|
||||
if (unlikely (status)) {
|
||||
cairo_surface_destroy (&source->base);
|
||||
return _cairo_surface_create_in_error (status);
|
||||
}
|
||||
|
||||
return &source->base;
|
||||
}
|
||||
|
||||
cairo_surface_t *
|
||||
_cairo_gl_white_source (void)
|
||||
{
|
||||
cairo_gl_source_t *source;
|
||||
|
||||
source = malloc (sizeof (*source));
|
||||
if (unlikely (source == NULL))
|
||||
return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY));
|
||||
|
||||
_cairo_surface_init (&source->base,
|
||||
&cairo_gl_source_backend,
|
||||
NULL, /* device */
|
||||
CAIRO_CONTENT_COLOR_ALPHA);
|
||||
|
||||
_cairo_gl_solid_operand_init (&source->operand, CAIRO_COLOR_WHITE);
|
||||
|
||||
return &source->base;
|
||||
}
|
||||
|
|
@ -279,79 +279,6 @@ FAIL:
|
|||
return status;
|
||||
}
|
||||
|
||||
static cairo_status_t
|
||||
_cairo_gl_source_finish (void *abstract_surface)
|
||||
{
|
||||
cairo_gl_source_t *source = abstract_surface;
|
||||
|
||||
_cairo_gl_operand_destroy (&source->operand);
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static const cairo_surface_backend_t cairo_gl_source_backend = {
|
||||
CAIRO_SURFACE_TYPE_GL,
|
||||
_cairo_gl_source_finish,
|
||||
NULL, /* read-only wrapper */
|
||||
};
|
||||
|
||||
static cairo_surface_t *
|
||||
pattern_to_surface (cairo_surface_t *dst,
|
||||
const cairo_pattern_t *pattern,
|
||||
cairo_bool_t is_mask,
|
||||
const cairo_rectangle_int_t *extents,
|
||||
const cairo_rectangle_int_t *sample,
|
||||
int *src_x, int *src_y)
|
||||
{
|
||||
cairo_gl_source_t *source;
|
||||
cairo_int_status_t status;
|
||||
|
||||
source = malloc (sizeof (*source));
|
||||
if (unlikely (source == NULL))
|
||||
return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY));
|
||||
|
||||
_cairo_surface_init (&source->base,
|
||||
&cairo_gl_source_backend,
|
||||
NULL, /* device */
|
||||
CAIRO_CONTENT_COLOR_ALPHA);
|
||||
|
||||
*src_x = *src_y = 0;
|
||||
status = _cairo_gl_operand_init (&source->operand, pattern,
|
||||
(cairo_gl_surface_t *)dst,
|
||||
sample, extents);
|
||||
if (unlikely (status)) {
|
||||
cairo_surface_destroy (&source->base);
|
||||
return _cairo_surface_create_in_error (status);
|
||||
}
|
||||
|
||||
return &source->base;
|
||||
}
|
||||
|
||||
cairo_surface_t *
|
||||
_cairo_gl_white_source (void)
|
||||
{
|
||||
cairo_gl_source_t *source;
|
||||
|
||||
source = malloc (sizeof (*source));
|
||||
if (unlikely (source == NULL))
|
||||
return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY));
|
||||
|
||||
_cairo_surface_init (&source->base,
|
||||
&cairo_gl_source_backend,
|
||||
NULL, /* device */
|
||||
CAIRO_CONTENT_COLOR_ALPHA);
|
||||
|
||||
_cairo_gl_solid_operand_init (&source->operand, CAIRO_COLOR_WHITE);
|
||||
|
||||
return &source->base;
|
||||
}
|
||||
|
||||
static inline cairo_gl_operand_t *
|
||||
source_to_operand (cairo_surface_t *surface)
|
||||
{
|
||||
cairo_gl_source_t *source = (cairo_gl_source_t *)surface;
|
||||
return source ? &source->operand : NULL;
|
||||
}
|
||||
|
||||
static cairo_int_status_t
|
||||
composite_boxes (void *_dst,
|
||||
cairo_operator_t op,
|
||||
|
|
@ -498,7 +425,7 @@ _cairo_gl_span_compositor_get (void)
|
|||
|
||||
compositor.fill_boxes = fill_boxes;
|
||||
//compositor.check_composite_boxes = check_composite_boxes;
|
||||
compositor.pattern_to_surface = pattern_to_surface;
|
||||
compositor.pattern_to_surface = _cairo_gl_pattern_to_source;
|
||||
compositor.composite_boxes = composite_boxes;
|
||||
//compositor.check_span_renderer = check_span_renderer;
|
||||
compositor.renderer_init = _cairo_gl_span_renderer_init;
|
||||
|
|
|
|||
|
|
@ -360,7 +360,7 @@ _cairo_gl_surface_embedded_operand_init (cairo_gl_surface_t *surface)
|
|||
memset (operand, 0, sizeof (cairo_gl_operand_t));
|
||||
|
||||
operand->type = CAIRO_GL_OPERAND_TEXTURE;
|
||||
operand->texture.surface = surface;
|
||||
operand->texture.surface = NULL;
|
||||
operand->texture.tex = surface->tex;
|
||||
|
||||
if (_cairo_gl_device_requires_power_of_two_textures (surface->base.device)) {
|
||||
|
|
|
|||
|
|
@ -150,63 +150,6 @@ FAIL:
|
|||
return status;
|
||||
}
|
||||
|
||||
static cairo_status_t
|
||||
_cairo_gl_source_finish (void *abstract_surface)
|
||||
{
|
||||
cairo_gl_source_t *source = abstract_surface;
|
||||
|
||||
_cairo_gl_operand_destroy (&source->operand);
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static const cairo_surface_backend_t cairo_gl_source_backend = {
|
||||
CAIRO_SURFACE_TYPE_GL,
|
||||
_cairo_gl_source_finish,
|
||||
NULL, /* read-only wrapper */
|
||||
};
|
||||
|
||||
static cairo_surface_t *
|
||||
pattern_to_surface (cairo_surface_t *dst,
|
||||
const cairo_pattern_t *pattern,
|
||||
cairo_bool_t is_mask,
|
||||
const cairo_rectangle_int_t *extents,
|
||||
const cairo_rectangle_int_t *sample,
|
||||
int *src_x, int *src_y)
|
||||
{
|
||||
cairo_gl_source_t *source;
|
||||
cairo_int_status_t status;
|
||||
|
||||
if (pattern == NULL)
|
||||
return _cairo_gl_white_source ();
|
||||
|
||||
source = malloc (sizeof (*source));
|
||||
if (unlikely (source == NULL))
|
||||
return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY));
|
||||
|
||||
_cairo_surface_init (&source->base,
|
||||
&cairo_gl_source_backend,
|
||||
NULL, /* device */
|
||||
CAIRO_CONTENT_COLOR_ALPHA);
|
||||
|
||||
*src_x = *src_y = 0;
|
||||
status = _cairo_gl_operand_init (&source->operand, pattern,
|
||||
(cairo_gl_surface_t *)dst,
|
||||
sample, extents);
|
||||
if (unlikely (status)) {
|
||||
cairo_surface_destroy (&source->base);
|
||||
return _cairo_surface_create_in_error (status);
|
||||
}
|
||||
|
||||
return &source->base;
|
||||
}
|
||||
|
||||
static inline cairo_gl_operand_t *
|
||||
source_to_operand (cairo_surface_t *surface)
|
||||
{
|
||||
cairo_gl_source_t *source = (cairo_gl_source_t *)surface;
|
||||
return surface ? &source->operand : NULL;
|
||||
}
|
||||
|
||||
static cairo_int_status_t
|
||||
composite_boxes (void *_dst,
|
||||
cairo_operator_t op,
|
||||
|
|
@ -544,7 +487,7 @@ _cairo_gl_traps_compositor_get (void)
|
|||
compositor.acquire = acquire;
|
||||
compositor.release = release;
|
||||
compositor.set_clip_region = set_clip_region;
|
||||
compositor.pattern_to_surface = pattern_to_surface;
|
||||
compositor.pattern_to_surface = _cairo_gl_pattern_to_source;
|
||||
compositor.draw_image_boxes = draw_image_boxes;
|
||||
//compositor.copy_boxes = copy_boxes;
|
||||
compositor.fill_boxes = fill_boxes;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue