From ea50ca68832fd49e06aba2b60490175ee66f4412 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 12 Oct 2011 15:10:10 +0100 Subject: [PATCH] test: Add clip-polygons To exercise the recent bug found in handling empty clip surfaces. Signed-off-by: Chris Wilson --- test/Makefile.sources | 1 + test/clip-polygons.c | 112 +++++++++++++++++++++ test/reference/clip-polygons.base.ref.png | Bin 0 -> 1296 bytes test/reference/clip-polygons.ref.png | Bin 0 -> 1355 bytes test/reference/clip-polygons.traps.ref.png | Bin 0 -> 1268 bytes 5 files changed, 113 insertions(+) create mode 100644 test/clip-polygons.c create mode 100644 test/reference/clip-polygons.base.ref.png create mode 100644 test/reference/clip-polygons.ref.png create mode 100644 test/reference/clip-polygons.traps.ref.png diff --git a/test/Makefile.sources b/test/Makefile.sources index 1f26a94a0..48a8f1274 100644 --- a/test/Makefile.sources +++ b/test/Makefile.sources @@ -58,6 +58,7 @@ test_sources = \ clip-nesting.c \ clip-operator.c \ clip-push-group.c \ + clip-polygons.c \ clip-rectilinear.c \ clip-shape.c \ clip-stroke.c \ diff --git a/test/clip-polygons.c b/test/clip-polygons.c new file mode 100644 index 000000000..83eb4df3a --- /dev/null +++ b/test/clip-polygons.c @@ -0,0 +1,112 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define STEP 5 +#define WIDTH 100 +#define HEIGHT 100 + +static void diamond (cairo_t *cr) +{ + cairo_move_to (cr, WIDTH/2, 0); + cairo_line_to (cr, WIDTH, HEIGHT/2); + cairo_line_to (cr, WIDTH/2, HEIGHT); + cairo_line_to (cr, 0, HEIGHT/2); + cairo_close_path (cr); +} + +static void background (cairo_t *cr) +{ + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgb (cr, 1,1,1); + cairo_paint (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_rgb (cr, 0,0,0); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + background (cr); + + /* completely overlapping diamonds */ + cairo_save (cr); + diamond (cr); + cairo_clip (cr); + diamond (cr); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + + /* partial overlap */ + cairo_save (cr); + cairo_translate (cr, -WIDTH/4, 0); + diamond (cr); + cairo_clip (cr); + cairo_translate (cr, WIDTH/2, 0); + diamond (cr); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + + /* no overlap, but the bounding boxes must */ + cairo_save (cr); + cairo_translate (cr, -WIDTH/2 + 2, -2); + diamond (cr); + cairo_clip (cr); + cairo_translate (cr, WIDTH - 4, 4); + diamond (cr); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + + /* completely disjoint */ + cairo_save (cr); + cairo_translate (cr, -WIDTH/2 - 1, 0); + diamond (cr); + cairo_clip (cr); + cairo_translate (cr, WIDTH + 2, 0); + diamond (cr); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_polygons, + "Test drawing through through an intersection of polygons", + "clip", /* keywords */ + "target=raster", /* requirements */ + 4*WIDTH, HEIGHT, + NULL, draw) diff --git a/test/reference/clip-polygons.base.ref.png b/test/reference/clip-polygons.base.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f294ce3d33be028a74eea6ae6302171dd35395 GIT binary patch literal 1296 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 literal 0 HcmV?d00001 diff --git a/test/reference/clip-polygons.traps.ref.png b/test/reference/clip-polygons.traps.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c5734bc26a8e5bdfd8281856cfcb154e787dec GIT binary patch literal 1268 zcmVg!K6*dE)Z_7Zrix|(c=f0E1H5^y)$6|jz@&opyHGR> zz$=wtEwzbe0eF%K)_Rp_7J#gOu=ezbW&yD7!P;LUngyU|u#Pr}W&wli7OZpip;^Gl z`ULArcW4$ctPa7tUL2YQjHz|7O0|Y&0Rw6ptg@A%S-@!81*=A1XcjP(M!~9A7McZ& zqeZZ4H-%;agQy;?HZ`GHzzFIFt7S)M77$*=V6`s@%>rVp6|7$Epjkj*Rf5&G8Z--t zs(i2%dZF+P0E#OdES*y5JPCkON(M`<5o*r^;G$x|(yW8#Qxz2cfWVtng80td@Ao3d zRP!8r)B^$&1%f4Bt1RA1PsSeafWU88gXN-DS)`So9ebn$0<$g!%TcYe7%ROp_812Q zmYffkyIN)5S9){o-VX?@I2kObwaWai^v<#SJs_~|Ot4(nD)YF~hsN&lfWW51!3t2T z%-2ev7`v|n0(%?_R+w64URL__*u5MO*y%v9g4HV1U+Ifu*FPYz-`-$_tW~DG(nZFu zd_drkUBL=mt4wpH3yxj$fWT4P!3tliOl_r$k6rD6zzG|{8l+a4&PrDryUqcDbJl`2 zRIM_Fm99E=g#!YoEe31AT4jA#y203K7W|qI*08n8daZP`vC}L#H507CYn8QM>BeKH zS@38YENb=Ca;3YBoo2zEw_s7Li8d?UaqKh;zWfA>TFt7x(%r{Sv*5`8V0B*`W%X8C zWb8BxURaV@8)Y?CT59Yx3oiV<-ELBwqv`wm+sr;cKTG{Uwfh8%9}uXa@KyByP*D>5 z-9!_=5&{bNqx&}g=njbBV+|YlSOcJg500+kgQI{HzM8X$ujT-1`112SzWfXb;`K5! zc)bjui5K`y@d7_U7OzNtqp-}pA{ki1B@{n&mYGW^fLUDg^`F`@bIlj<8yBgXsV*}Y zsR9#RRWH5FTvZRe+8eACv|0Mgd~xjh2L$#z5UdogSzea;^w_-|5ZLKhuu`CA`C8@^ zWA}AHV2{JWN+Fu%ahVT|-Qxj)O=p6YoHxtwGVdI_-va{cP6jKvZI<_C-Woh{=NdS~mI9R4p3Wa9?P+a+7S?^v@DuEtWp&Czt$?Al3zn7c3$+49 z(==FCt}@gL7*OkAS&7zAD_~3=f@Rl=L#=>e^$C`p?GCj9M%FD@cDz2+3K(3^VA+ud zQ7ZtQgJt_lM6CdrLa=PBN7M>HCJ`)Kt`fBZ@T3wfn`;xb0`N*GSoU5hY6W1T%tfjN eaXBb}CI0{bBXBrIu`jUz0000