Hi, Henry:
Sorry that I haven't expressed clearly!
I works on MS Win32 platform. I'm trying to paint an image onto a surface
what created from HDC.
I found it works so good when the scale parameter is 1.0, but too bad when
not!
Core code follows:
// 1.
m_pDCSurface = cairo_win32_surface_create(hdc);
m_pDCCr = cairo_create (m_pDCSurface);
cairo_save(m_pDCCr);
// 2.
cairo_scale (m_pDCCr, sx, sy);
// 3.
cairo_set_source_surface (m_pDCCr, m_pBkImageSurface, x / sx, y / sy);
cairo_paint (m_pDCCr);
// 4.
cairo_restore(m_pDCCr);
-----邮件原件-----
发件人: Henry (Yu) Song - SISA [mailto:[email protected]]
发送时间: 2013年1月30日 23:54
收件人: [email protected]; 'Chris Wilson'
抄送: [email protected]
主题: RE: [cairo] 答复: [patch] image: increase reference count for parent
Hi, Ivan
Your question lacks context - what are you trying to do? fill, stroke,
paint, mask or text? What are src pattern, mask pattern? what backend do
you use? - image? gl? others? what platform do you run your code? It might
be better to provide some sample code
Thanks
Henry
________________________________________
From: [email protected]
[[email protected]] on behalf of
[email protected] [[email protected]]
Sent: Tuesday, January 29, 2013 10:32 PM
To: Henry (Yu) Song - SISA; 'Chris Wilson'
Cc: [email protected]
Subject: [cairo] 答复: [patch] image: increase reference count for parent
Hi, Henry & Chris:
I used cairo_scale() to scale image, but I found its performance is bad when
scalex or scaley isn't 1.0.
Do you know how to improve cairo_scale() performance?
Ivan Liang
Beijing Mysher Technology Co., Ltd. R & D department
Tel: (86) 10-62515078 turn 810
Fax: (86) 10-62515078
E-mail: [email protected]
Address: Zhongguancun Street, Haidian District, Beijing, No. 45 XingFa
Building, Room 501 Postal Code: 100086
-----邮件原件-----
发件人: [email protected]
[mailto:[email protected]] 代表 Henry (Yu)
Song - SISA
发送时间: 2013年1月30日 9:52
收件人: Chris Wilson
抄送: [email protected]
主题: Re: [cairo] [patch] image: increase reference count for parent
Hi, Chris
I see set_parent is only called in _cairo_image_surface_clone_subimage().
The call sequence is
1. cairo_surface_map_to_image () // in cairo-surface.c 2.
_cairo_surface_map_to_image () // in cairo-surface.
3. if backend returns image == 0, call
_cairo_image_surface_clone_subimage(). // this sets image->parent 4. back in
cairo_surface_map_to_image(), if image->format is CAIRO_FORMAT_INVALID,
destroy image and call _cairo_image_surface_clone_subimage().
set_parent in _cairo_image_surface_clone_subimage() sets parent. But if the
backend returns the image that is not NULL AND not CAIRO_FORMAT_INVALID,
image->parent is not set. In addition,
_cairo_image_clone_subimage() is the only function set parent. I think we
should either not set_parent in _cairo_image_clone_subimage() or make
image->parent = NULL in cairo_surface_map_to_image() call.
Otherwise, map-to-image-fill, map-bit-to-image and few other tests seg
faults on some glesv2 driver that does not support BGRA format glReadPixels.
The following is the patch that set parent to NULL in
cairo_surface_map_to_image()
Thanks
Henry
From 675d1df824977f6e8d348ac78c88fa8635dfd0e2 Mon Sep 17 00:00:00 2001
From: Henry Song <[email protected]>
Date: Tue, 29 Jan 2013 17:41:00 -0800
Subject: [PATCH] surface: set surface->parent to NULL in
cairo_surface_map_to_image.
We need to set surface->parent to NULL in cairo_surface_map_to_image.
Otherwise, cairo_surface_unmap_image() descreases reference count on target
surface's parent. This has an extra decrease on the parent's reference
count and causes crashes in map-to-image-fill, map-bit-to-image test cases
for some OpenGL ES 2 drivers where the mapped image is CAIRO_FORMAT_INVALID,
and thus the original mapped image is destroyed, a new image is created with
the valid format and parent set to the target surface.
---
src/cairo-surface.c | 2 ++
test/cairo-test-runner.c | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/cairo-surface.c b/src/cairo-surface.c index
ffffef8..671eee4 100644
--- a/src/cairo-surface.c
+++ b/src/cairo-surface.c
@@ -793,6 +793,8 @@ cairo_surface_map_to_image (cairo_surface_t *surface,
image = _cairo_image_surface_clone_subimage (surface, extents);
}
+ image->parent = NULL;
+
return &image->base;
}
diff --git a/test/cairo-test-runner.c b/test/cairo-test-runner.c index
a5c6705..108cc50 100644
--- a/test/cairo-test-runner.c
+++ b/test/cairo-test-runner.c
@@ -59,7 +59,7 @@
#ifdef _MSC_VER
#include <crtdbg.h>
#endif
-
+#define SHOULD_FORK 0
typedef struct _cairo_test_list {
const cairo_test_t *test;
struct _cairo_test_list *next;
--
1.7.9.5
--
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
--
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
--
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.