{
case RegionDataRect:
(*element2)->elementdata.rect = element->elementdata.rect;
- break;
+ return Ok;
case RegionDataEmptyRect:
case RegionDataInfiniteRect:
- break;
+ return Ok;
case RegionDataPath:
(*element2)->elementdata.pathdata.pathheader = element->elementdata.pathdata.pathheader;
stat = GdipClonePath(element->elementdata.pathdata.path,
&(*element2)->elementdata.pathdata.path);
- if (stat != Ok) goto clone_out;
+ if (stat == Ok) return Ok;
break;
default:
(*element2)->elementdata.combine.left = NULL;
stat = clone_element(element->elementdata.combine.left,
&(*element2)->elementdata.combine.left);
- if (stat != Ok) goto clone_out;
- stat = clone_element(element->elementdata.combine.right,
- &(*element2)->elementdata.combine.right);
- if (stat != Ok) goto clone_out;
+ if (stat == Ok)
+ {
+ stat = clone_element(element->elementdata.combine.right,
+ &(*element2)->elementdata.combine.right);
+ if (stat == Ok) return Ok;
+ }
break;
}
- return Ok;
-
-clone_out:
delete_element(*element2);
*element2 = NULL;
return stat;
}
left = GdipAlloc(sizeof(region_element));
- if (!left)
- goto out;
- *left = region->node;
-
- stat = clone_element(&path_region->node, &right);
- if (stat != Ok)
- goto out;
-
- fuse_region(region, left, right, mode);
-
- GdipDeleteRegion(path_region);
- return Ok;
+ if (left)
+ {
+ *left = region->node;
+ stat = clone_element(&path_region->node, &right);
+ if (stat == Ok)
+ {
+ fuse_region(region, left, right, mode);
+ GdipDeleteRegion(path_region);
+ return Ok;
+ }
+ }
+ else
+ stat = OutOfMemory;
-out:
GdipFree(left);
GdipDeleteRegion(path_region);
return stat;
}
left = GdipAlloc(sizeof(region_element));
- if (!left)
- goto out;
- memcpy(left, ®ion->node, sizeof(region_element));
-
- stat = clone_element(&rect_region->node, &right);
- if (stat != Ok)
- goto out;
-
- fuse_region(region, left, right, mode);
-
- GdipDeleteRegion(rect_region);
- return Ok;
+ if (left)
+ {
+ memcpy(left, ®ion->node, sizeof(region_element));
+ stat = clone_element(&rect_region->node, &right);
+ if (stat == Ok)
+ {
+ fuse_region(region, left, right, mode);
+ GdipDeleteRegion(rect_region);
+ return Ok;
+ }
+ }
+ else
+ stat = OutOfMemory;
-out:
GdipFree(left);
GdipDeleteRegion(rect_region);
return stat;
if(!*region)
return OutOfMemory;
+ TRACE("=> %p\n", *region);
+
return init_region(*region, RegionDataInfiniteRect);
}
if(!hrgn){
rect->X = rect->Y = -(REAL)(1 << 22);
rect->Width = rect->Height = (REAL)(1 << 23);
+ TRACE("%p => infinite\n", region);
return Ok;
}
rect->Y = r.top;
rect->Width = r.right - r.left;
rect->Height = r.bottom - r.top;
+ TRACE("%p => %s\n", region, debugstr_rectf(rect));
}
else
status = GenericError;
status = GdipGetRegionBounds(region, graphics, &rectf);
if(status == Ok){
- rect->X = roundr(rectf.X);
- rect->Y = roundr(rectf.X);
- rect->Width = roundr(rectf.Width);
- rect->Height = roundr(rectf.Height);
+ rect->X = gdip_round(rectf.X);
+ rect->Y = gdip_round(rectf.X);
+ rect->Width = gdip_round(rectf.Width);
+ rect->Height = gdip_round(rectf.Height);
}
return status;
GpStatus WINGDIPAPI GdipIsEmptyRegion(GpRegion *region, GpGraphics *graphics, BOOL *res)
{
+ GpStatus status;
+ GpRectF rect;
+
TRACE("(%p, %p, %p)\n", region, graphics, res);
if(!region || !graphics || !res)
return InvalidParameter;
- *res = (region->node.type == RegionDataEmptyRect);
+ status = GdipGetRegionBounds(region, graphics, &rect);
+ if (status != Ok) return status;
+
+ *res = rect.Width == 0.0 && rect.Height == 0.0;
+ TRACE("=> %d\n", *res);
return Ok;
}
return Ok;
}
- *res = PtInRegion(hrgn, roundr(x), roundr(y));
+ *res = PtInRegion(hrgn, gdip_round(x), gdip_round(y));
DeleteObject(hrgn);