From a9bcc81f821d7c66f623779fa5147e728eb3c388 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 4 May 2024 03:24:41 +0200 Subject: Adding upstream version 3.3.0+dfsg1. Signed-off-by: Daniel Baumann --- rdtk/librdtk/rdtk_button.c | 119 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 rdtk/librdtk/rdtk_button.c (limited to 'rdtk/librdtk/rdtk_button.c') diff --git a/rdtk/librdtk/rdtk_button.c b/rdtk/librdtk/rdtk_button.c new file mode 100644 index 0000000..815032e --- /dev/null +++ b/rdtk/librdtk/rdtk_button.c @@ -0,0 +1,119 @@ +/** + * RdTk: Remote Desktop Toolkit + * + * Copyright 2014 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +#include "rdtk_font.h" + +#include "rdtk_button.h" + +int rdtk_button_draw(rdtkSurface* surface, uint16_t nXDst, uint16_t nYDst, uint16_t nWidth, + uint16_t nHeight, rdtkButton* button, const char* text) +{ + uint16_t offsetX = 0; + uint16_t offsetY = 0; + uint16_t textWidth = 0; + uint16_t textHeight = 0; + uint16_t fillWidth = 0; + uint16_t fillHeight = 0; + + WINPR_ASSERT(surface); + WINPR_ASSERT(button); + WINPR_ASSERT(text); + + rdtkEngine* engine = surface->engine; + rdtkFont* font = engine->font; + rdtkNinePatch* ninePatch = button->ninePatch; + + rdtk_font_text_draw_size(font, &textWidth, &textHeight, text); + + rdtk_nine_patch_draw(surface, nXDst, nYDst, nWidth, nHeight, ninePatch); + + if ((textWidth > 0) && (textHeight > 0)) + { + fillWidth = nWidth - (ninePatch->width - ninePatch->fillWidth); + fillHeight = nHeight - (ninePatch->height - ninePatch->fillHeight); + + offsetX = ninePatch->fillLeft; + offsetY = ninePatch->fillTop; + + if (textWidth < fillWidth) + offsetX = ((fillWidth - textWidth) / 2) + ninePatch->fillLeft; + else if (textWidth < ninePatch->width) + offsetX = ((ninePatch->width - textWidth) / 2); + + if (textHeight < fillHeight) + offsetY = ((fillHeight - textHeight) / 2) + ninePatch->fillTop; + else if (textHeight < ninePatch->height) + offsetY = ((ninePatch->height - textHeight) / 2); + + rdtk_font_draw_text(surface, nXDst + offsetX, nYDst + offsetY, font, text); + } + + return 1; +} + +rdtkButton* rdtk_button_new(rdtkEngine* engine, rdtkNinePatch* ninePatch) +{ + WINPR_ASSERT(engine); + WINPR_ASSERT(ninePatch); + + rdtkButton* button = (rdtkButton*)calloc(1, sizeof(rdtkButton)); + + if (!button) + return NULL; + + button->engine = engine; + button->ninePatch = ninePatch; + + return button; +} + +void rdtk_button_free(rdtkButton* button) +{ + free(button); +} + +int rdtk_button_engine_init(rdtkEngine* engine) +{ + WINPR_ASSERT(engine); + + if (!engine->button) + { + engine->button = rdtk_button_new(engine, engine->button9patch); + if (!engine->button) + return -1; + } + + return 1; +} + +int rdtk_button_engine_uninit(rdtkEngine* engine) +{ + WINPR_ASSERT(engine); + + if (engine->button) + { + rdtk_button_free(engine->button); + engine->button = NULL; + } + + return 1; +} -- cgit v1.2.3