X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fmenu%2Fitem%2Fimage.c;h=6253bcb8b6a8ee2ba6fd5b21b14ea2d165d7fae9;hb=0ea5cbc4a4f511e12c976ff0a3a5ccef3c307f4f;hp=c60ec232f2c7b2f2e4e5539f02bb69a034711464;hpb=af2e8eaf7acf9e7069a64280c1d6be29859d59ba;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/menu/item/image.c b/qcsrc/menu/item/image.c index c60ec232f2..6253bcb8b6 100644 --- a/qcsrc/menu/item/image.c +++ b/qcsrc/menu/item/image.c @@ -5,28 +5,41 @@ CLASS(Image) EXTENDS(Item) METHOD(Image, toString, string(entity)) METHOD(Image, resizeNotify, void(entity, vector, vector, vector, vector)) METHOD(Image, updateAspect, void(entity)) + METHOD(Image, setZoom, void(entity, float)) + METHOD(Image, startZoomMove, float(entity, vector)) + METHOD(Image, zoomMove, float(entity, vector)) ATTRIB(Image, src, string, string_null) ATTRIB(Image, color, vector, '1 1 1') ATTRIB(Image, forcedAspect, float, 0) + ATTRIB(Image, zoomFactor, float, 1) + ATTRIB(Image, zoomOffset, vector, '0.5 0.5 0') + ATTRIB(Image, start_zoomOffset, vector, '0 0 0') + ATTRIB(Image, start_coords, vector, '0 0 0') ATTRIB(Image, imgOrigin, vector, '0 0 0') ATTRIB(Image, imgSize, vector, '0 0 0') ENDCLASS(Image) #endif #ifdef IMPLEMENTATION -string toStringImage(entity me) +string Image_toString(entity me) { return me.src; } -void configureImageImage(entity me, string path) +void Image_configureImage(entity me, string path) { me.src = path; + me.zoomOffset = '0.5 0.5 0'; + me.zoomFactor = 1; } -void drawImage(entity me) +void Image_draw(entity me) { + if (me.zoomFactor > 1) + draw_SetClip(); draw_Picture(me.imgOrigin, me.src, me.imgSize, me.color, 1); + if (me.zoomFactor > 1) + draw_ClearClip(); } -void updateAspectImage(entity me) +void Image_updateAspect(entity me) { float asp; if(me.size_x <= 0 || me.size_y <= 0) @@ -56,12 +69,53 @@ void updateAspectImage(entity me) // y too large, so center y-wise me.imgSize = eX + eY * (me.size_x / (asp * me.size_y)); } - me.imgOrigin = '0.5 0.5 0' - 0.5 * me.imgSize; + if (me.zoomFactor) + { + if (me.zoomFactor > 1) + { + me.zoomOffset_x = bound(0, me.zoomOffset_x, 1); + me.zoomOffset_y = bound(0, me.zoomOffset_y, 1); + } + me.imgSize = me.imgSize * me.zoomFactor; + } + me.imgOrigin_x = 0.5 - me.zoomOffset_x * me.imgSize_x; + me.imgOrigin_y = 0.5 - me.zoomOffset_y * me.imgSize_y; } } -void resizeNotifyImage(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize) +float Image_startZoomMove(entity me, vector coords) +{ + if (me.zoomFactor > 1) + { + me.start_zoomOffset = me.zoomOffset; + me.start_coords = coords; + } + return 1; +} +float Image_zoomMove(entity me, vector coords) +{ + if (me.zoomFactor > 1) + { + me.zoomOffset = me.start_zoomOffset + (me.start_coords - coords)*(1/me.zoomFactor); + me.updateAspect(me); + } + return 1; +} +void Image_setZoom(entity me, float z) +{ + if (z < 0) // multiply by the current zoomFactor + me.zoomFactor *= -z; + else if (z == 0) // reset (no zoom) + me.zoomFactor = 1; + else // directly set + me.zoomFactor = z; + me.zoomFactor = bound(1/16, me.zoomFactor, 16); + if (me.zoomFactor <= 1) + me.zoomOffset = '0.5 0.5 0'; + me.updateAspect(me); +} +void Image_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize) { - resizeNotifyItem(me, relOrigin, relSize, absOrigin, absSize); + SUPER(Image).resizeNotify(me, relOrigin, relSize, absOrigin, absSize); me.updateAspect(me); } #endif