/***************************************************************************** * GdipIsVisibleRegionPoint [GDIPLUS.@] */ GpStatus WINGDIPAPI GdipIsVisibleRegionPoint(GpRegion* region, REAL x, REAL y, GpGraphics *graphics, BOOL *res) { HRGN hrgn; GpStatus stat; TRACE("(%p, %.2f, %.2f, %p, %p)\n", region, x, y, graphics, res); if(!region || !res) return InvalidParameter; if((stat = GdipGetRegionHRgn(region, NULL, &hrgn)) != Ok) return stat; /* infinite */ if(!hrgn){ *res = TRUE; return Ok; } *res = PtInRegion(hrgn, roundr(x), roundr(y)); DeleteObject(hrgn); return Ok; }
GpStatus WINGDIPAPI GdipGetLineRectI(GpLineGradient *brush, GpRect *rect) { GpRectF rectF; GpStatus ret; ret = GdipGetLineRect(brush, &rectF); if(ret == Ok){ rect->X = roundr(rectF.X); rect->Y = roundr(rectF.Y); rect->Width = roundr(rectF.Width); rect->Height = roundr(rectF.Height); } return ret; }
GpStatus WINGDIPAPI GdipGetPathWorldBoundsI(GpPath* path, GpRect* bounds, GDIPCONST GpMatrix *matrix, GDIPCONST GpPen *pen) { GpStatus ret; GpRectF boundsF; ret = GdipGetPathWorldBounds(path,&boundsF,matrix,pen); if(ret == Ok){ bounds->X = roundr(boundsF.X); bounds->Y = roundr(boundsF.Y); bounds->Width = roundr(boundsF.Width); bounds->Height = roundr(boundsF.Height); } return ret; }
GpStatus WINGDIPAPI GdipGetPathGradientCenterPointI(GpPathGradient *grad, GpPoint *point) { GpStatus ret; GpPointF ptf; if(!point) return InvalidParameter; ret = GdipGetPathGradientCenterPoint(grad,&ptf); if(ret == Ok){ point->X = roundr(ptf.X); point->Y = roundr(ptf.Y); } return ret; }
/***************************************************************************** * GdipGetRegionBoundsI [GDIPLUS.@] */ GpStatus WINGDIPAPI GdipGetRegionBoundsI(GpRegion *region, GpGraphics *graphics, GpRect *rect) { GpRectF rectf; GpStatus status; TRACE("(%p, %p, %p)\n", region, graphics, rect); if(!rect) return InvalidParameter; 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); } return status; }
GpStatus WINGDIPAPI GdipGetPathPointsI(GpPath *path, GpPoint* points, INT count) { GpStatus ret; GpPointF *ptf; INT i; if(count <= 0) return InvalidParameter; ptf = GdipAlloc(sizeof(GpPointF)*count); if(!ptf) return OutOfMemory; ret = GdipGetPathPoints(path,ptf,count); if(ret == Ok) for(i = 0;i < count;i++){ points[i].X = roundr(ptf[i].X); points[i].Y = roundr(ptf[i].Y); }; GdipFree(ptf); return ret; }
/* FIXME: imageattr ignored */ GpStatus WINGDIPAPI GdipCreateTextureIA(GpImage *image, GDIPCONST GpImageAttributes *imageattr, REAL x, REAL y, REAL width, REAL height, GpTexture **texture) { HDC hdc; OLE_HANDLE hbm; HBITMAP old = NULL; BITMAPINFO bmi; BITMAPINFOHEADER *bmih; INT n_x, n_y, n_width, n_height, abs_height, stride, image_stride, i, bytespp; BOOL bm_is_selected; BYTE *dibits, *buff, *textbits; if(!image || !texture || x < 0.0 || y < 0.0 || width < 0.0 || height < 0.0) return InvalidParameter; if(image->type != ImageTypeBitmap){ FIXME("not implemented for image type %d\n", image->type); return NotImplemented; } n_x = roundr(x); n_y = roundr(y); n_width = roundr(width); n_height = roundr(height); if(n_x + n_width > ((GpBitmap*)image)->width || n_y + n_height > ((GpBitmap*)image)->height) return InvalidParameter; IPicture_get_Handle(image->picture, &hbm); if(!hbm) return GenericError; IPicture_get_CurDC(image->picture, &hdc); bm_is_selected = (hdc != 0); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biBitCount = 0; if(!bm_is_selected){ hdc = CreateCompatibleDC(0); old = SelectObject(hdc, (HBITMAP)hbm); } /* fill out bmi */ GetDIBits(hdc, (HBITMAP)hbm, 0, 0, NULL, &bmi, DIB_RGB_COLORS); bytespp = bmi.bmiHeader.biBitCount / 8; abs_height = abs(bmi.bmiHeader.biHeight); if(n_x > bmi.bmiHeader.biWidth || n_x + n_width > bmi.bmiHeader.biWidth || n_y > abs_height || n_y + n_height > abs_height) return InvalidParameter; dibits = GdipAlloc(bmi.bmiHeader.biSizeImage); if(dibits) /* this is not a good place to error out */ GetDIBits(hdc, (HBITMAP)hbm, 0, abs_height, dibits, &bmi, DIB_RGB_COLORS); if(!bm_is_selected){ SelectObject(hdc, old); DeleteDC(hdc); } if(!dibits) return OutOfMemory; image_stride = (bmi.bmiHeader.biWidth * bytespp + 3) & ~3; stride = (n_width * bytespp + 3) & ~3; buff = GdipAlloc(sizeof(BITMAPINFOHEADER) + stride * n_height); if(!buff){ GdipFree(dibits); return OutOfMemory; } bmih = (BITMAPINFOHEADER*)buff; textbits = (BYTE*) (bmih + 1); bmih->biSize = sizeof(BITMAPINFOHEADER); bmih->biWidth = n_width; bmih->biHeight = n_height; bmih->biCompression = BI_RGB; bmih->biSizeImage = stride * n_height; bmih->biBitCount = bmi.bmiHeader.biBitCount; bmih->biClrUsed = 0; bmih->biPlanes = 1; /* image is flipped */ if(bmi.bmiHeader.biHeight > 0){ dibits += bmi.bmiHeader.biSizeImage; image_stride *= -1; textbits += stride * (n_height - 1); stride *= -1; } for(i = 0; i < n_height; i++) memcpy(&textbits[i * stride], &dibits[n_x * bytespp + (n_y + i) * image_stride], abs(stride)); *texture = GdipAlloc(sizeof(GpTexture)); if (!*texture) return OutOfMemory; (*texture)->brush.lb.lbStyle = BS_DIBPATTERNPT; (*texture)->brush.lb.lbColor = DIB_RGB_COLORS; (*texture)->brush.lb.lbHatch = (ULONG_PTR)buff; (*texture)->brush.gdibrush = CreateBrushIndirect(&(*texture)->brush.lb); (*texture)->brush.bt = BrushTypeTextureFill; GdipFree(dibits); GdipFree(buff); return Ok; }