diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 01:24:41 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 01:24:41 +0000 |
commit | a9bcc81f821d7c66f623779fa5147e728eb3c388 (patch) | |
tree | 98676963bcdd537ae5908a067a8eb110b93486a6 /rdtk/librdtk/rdtk_button.c | |
parent | Initial commit. (diff) | |
download | freerdp3-a9bcc81f821d7c66f623779fa5147e728eb3c388.tar.xz freerdp3-a9bcc81f821d7c66f623779fa5147e728eb3c388.zip |
Adding upstream version 3.3.0+dfsg1.upstream/3.3.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'rdtk/librdtk/rdtk_button.c')
-rw-r--r-- | rdtk/librdtk/rdtk_button.c | 119 |
1 files changed, 119 insertions, 0 deletions
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 <marcandre.moreau@gmail.com> + * + * 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 <winpr/assert.h> + +#include <rdtk/config.h> + +#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; +} |