diff options
Diffstat (limited to 'xrdp/xrdp_bitmap.c')
| -rw-r--r-- | xrdp/xrdp_bitmap.c | 3180 |
1 files changed, 1682 insertions, 1498 deletions
diff --git a/xrdp/xrdp_bitmap.c b/xrdp/xrdp_bitmap.c index 828c5139..d60cc920 100644 --- a/xrdp/xrdp_bitmap.c +++ b/xrdp/xrdp_bitmap.c @@ -1,27 +1,25 @@ -/* - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2004-2010 - - bitmap, drawable - this is a object that can be drawn on with a painter - all windows, bitmaps, even the screen are of this type - maybe it should be called xrdp_drawable - -*/ +/** + * xrdp: A Remote Desktop Protocol server. + * + * Copyright (C) Jay Sorg 2004-2012 + * + * 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. + * + * bitmap, drawable + * this is a object that can be drawn on with a painter + * all windows, bitmaps, even the screen are of this type + * maybe it should be called xrdp_drawable + */ #include "xrdp.h" #include "log.h" @@ -29,303 +27,348 @@ static int g_crc_seed = 0xffffffff; static int g_crc_table[256] = { - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, - 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, - 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, - 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, - 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, - 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, - 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, - 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, - 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, - 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, - 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, - 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, - 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, - 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, - 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, - 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, - 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, - 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, - 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, - 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, - 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, - 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, - 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, - 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, - 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, - 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, - 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, - 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, - 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, - 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, - 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, - 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, - 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, - 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, - 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; #define CRC_START(in_crc) (in_crc) = g_crc_seed #define CRC_PASS(in_pixel, in_crc) \ - (in_crc) = g_crc_table[((in_crc) ^ (in_pixel)) & 0xff] ^ ((in_crc) >> 8) + (in_crc) = g_crc_table[((in_crc) ^ (in_pixel)) & 0xff] ^ ((in_crc) >> 8) #define CRC_END(in_crc) (in_crc) = ((in_crc) ^ g_crc_seed) /*****************************************************************************/ -struct xrdp_bitmap* APP_CC +struct xrdp_bitmap *APP_CC xrdp_bitmap_create(int width, int height, int bpp, - int type, struct xrdp_wm* wm) + int type, struct xrdp_wm *wm) { - struct xrdp_bitmap* self = (struct xrdp_bitmap *)NULL; - int Bpp = 0; - - self = (struct xrdp_bitmap*)g_malloc(sizeof(struct xrdp_bitmap), 1); - self->type = type; - self->width = width; - self->height = height; - self->bpp = bpp; - Bpp = 4; - switch (bpp) - { - case 8: Bpp = 1; break; - case 15: Bpp = 2; break; - case 16: Bpp = 2; break; - } - if (self->type == WND_TYPE_BITMAP || self->type == WND_TYPE_IMAGE) - { - self->data = (char*)g_malloc(width * height * Bpp, 0); - } - if (self->type != WND_TYPE_BITMAP) - { - self->child_list = list_create(); - } - self->line_size = width * Bpp; - if (self->type == WND_TYPE_COMBO) - { - self->string_list = list_create(); - self->string_list->auto_free = 1; - self->data_list = list_create(); - self->data_list->auto_free = 1; - } - self->wm = wm; - return self; + struct xrdp_bitmap *self = (struct xrdp_bitmap *)NULL; + int Bpp = 0; + + self = (struct xrdp_bitmap *)g_malloc(sizeof(struct xrdp_bitmap), 1); + self->type = type; + self->width = width; + self->height = height; + self->bpp = bpp; + Bpp = 4; + + switch (bpp) + { + case 8: + Bpp = 1; + break; + case 15: + Bpp = 2; + break; + case 16: + Bpp = 2; + break; + } + + if (self->type == WND_TYPE_BITMAP || self->type == WND_TYPE_IMAGE) + { + self->data = (char *)g_malloc(width * height * Bpp, 0); + } + + if (self->type != WND_TYPE_BITMAP) + { + self->child_list = list_create(); + } + + self->line_size = width *Bpp; + + if (self->type == WND_TYPE_COMBO) + { + self->string_list = list_create(); + self->string_list->auto_free = 1; + self->data_list = list_create(); + self->data_list->auto_free = 1; + } + + self->wm = wm; + return self; } /*****************************************************************************/ -struct xrdp_bitmap* APP_CC +struct xrdp_bitmap *APP_CC xrdp_bitmap_create_with_data(int width, int height, - int bpp, char* data, - struct xrdp_wm* wm) + int bpp, char *data, + struct xrdp_wm *wm) { - struct xrdp_bitmap* self = (struct xrdp_bitmap *)NULL; - - self = (struct xrdp_bitmap*)g_malloc(sizeof(struct xrdp_bitmap), 1); - self->type = WND_TYPE_BITMAP; - self->width = width; - self->height = height; - self->bpp = bpp; - self->data = data; - self->do_not_free_data = 1; - self->wm = wm; - return self; + struct xrdp_bitmap *self = (struct xrdp_bitmap *)NULL; + + self = (struct xrdp_bitmap *)g_malloc(sizeof(struct xrdp_bitmap), 1); + self->type = WND_TYPE_BITMAP; + self->width = width; + self->height = height; + self->bpp = bpp; + self->data = data; + self->do_not_free_data = 1; + self->wm = wm; + return self; } /*****************************************************************************/ void APP_CC -xrdp_bitmap_delete(struct xrdp_bitmap* self) +xrdp_bitmap_delete(struct xrdp_bitmap *self) { - int i = 0; - struct xrdp_mod_data* mod_data = (struct xrdp_mod_data *)NULL; + int i = 0; + struct xrdp_mod_data *mod_data = (struct xrdp_mod_data *)NULL; - if (self == 0) - { - return; - } - if (self->wm != 0) - { - if (self->wm->focused_window != 0) + if (self == 0) { - if (self->wm->focused_window->focused_control == self) - { - self->wm->focused_window->focused_control = 0; - } + return; } - if (self->wm->focused_window == self) - { - self->wm->focused_window = 0; - } - if (self->wm->dragging_window == self) - { - self->wm->dragging_window = 0; - } - if (self->wm->button_down == self) - { - self->wm->button_down = 0; - } - if (self->wm->popup_wnd == self) + + if (self->wm != 0) { - self->wm->popup_wnd = 0; + if (self->wm->focused_window != 0) + { + if (self->wm->focused_window->focused_control == self) + { + self->wm->focused_window->focused_control = 0; + } + } + + if (self->wm->focused_window == self) + { + self->wm->focused_window = 0; + } + + if (self->wm->dragging_window == self) + { + self->wm->dragging_window = 0; + } + + if (self->wm->button_down == self) + { + self->wm->button_down = 0; + } + + if (self->wm->popup_wnd == self) + { + self->wm->popup_wnd = 0; + } + + if (self->wm->login_window == self) + { + self->wm->login_window = 0; + } + + if (self->wm->log_wnd == self) + { + self->wm->log_wnd = 0; + } } - if (self->wm->login_window == self) + + if (self->child_list != 0) { - self->wm->login_window = 0; + for (i = self->child_list->count - 1; i >= 0; i--) + { + xrdp_bitmap_delete((struct xrdp_bitmap *)self->child_list->items[i]); + } + + list_delete(self->child_list); } - if (self->wm->log_wnd == self) + + if (self->parent != 0) { - self->wm->log_wnd = 0; + i = list_index_of(self->parent->child_list, (long)self); + + if (i >= 0) + { + list_remove_item(self->parent->child_list, i); + } } - } - if (self->child_list != 0) - { - for (i = self->child_list->count - 1; i >= 0; i--) + + if (self->string_list != 0) /* for combo */ { - xrdp_bitmap_delete((struct xrdp_bitmap*)self->child_list->items[i]); + list_delete(self->string_list); } - list_delete(self->child_list); - } - if (self->parent != 0) - { - i = list_index_of(self->parent->child_list, (long)self); - if (i >= 0) + + if (self->data_list != 0) /* for combo */ { - list_remove_item(self->parent->child_list, i); + for (i = 0; i < self->data_list->count; i++) + { + mod_data = (struct xrdp_mod_data *)list_get_item(self->data_list, i); + + if (mod_data != 0) + { + list_delete(mod_data->names); + list_delete(mod_data->values); + } + } + + list_delete(self->data_list); } - } - if (self->string_list != 0) /* for combo */ - { - list_delete(self->string_list); - } - if (self->data_list != 0) /* for combo */ - { - for (i = 0; i < self->data_list->count; i++) + + if (!self->do_not_free_data) { - mod_data = (struct xrdp_mod_data*)list_get_item(self->data_list, i); - if (mod_data != 0) - { - list_delete(mod_data->names); - list_delete(mod_data->values); - } + g_free(self->data); } - list_delete(self->data_list); - } - if (!self->do_not_free_data) - { - g_free(self->data); - } - g_free(self->caption1); - g_free(self); + + g_free(self->caption1); + g_free(self); } /*****************************************************************************/ -struct xrdp_bitmap* APP_CC -xrdp_bitmap_get_child_by_id(struct xrdp_bitmap* self, int id) +struct xrdp_bitmap *APP_CC +xrdp_bitmap_get_child_by_id(struct xrdp_bitmap *self, int id) { - int i = 0; - struct xrdp_bitmap* b = (struct xrdp_bitmap *)NULL; + int i = 0; + struct xrdp_bitmap *b = (struct xrdp_bitmap *)NULL; - for (i = 0; i < self->child_list->count; i++) - { - b = (struct xrdp_bitmap*)list_get_item(self->child_list, i); - if (b->id == id) + for (i = 0; i < self->child_list->count; i++) { - return b; + b = (struct xrdp_bitmap *)list_get_item(self->child_list, i); + + if (b->id == id) + { + return b; + } } - } - return 0; + + return 0; } /*****************************************************************************/ /* if focused is true focus this window else unfocus it */ /* returns error */ int APP_CC -xrdp_bitmap_set_focus(struct xrdp_bitmap* self, int focused) +xrdp_bitmap_set_focus(struct xrdp_bitmap *self, int focused) { - struct xrdp_painter* painter = (struct xrdp_painter *)NULL; + struct xrdp_painter *painter = (struct xrdp_painter *)NULL; - if (self == 0) - { - return 0; - } - if (self->type != WND_TYPE_WND) /* 1 */ - { + if (self == 0) + { + return 0; + } + + if (self->type != WND_TYPE_WND) /* 1 */ + { + return 0; + } + + painter = xrdp_painter_create(self->wm, self->wm->session); + xrdp_painter_font_needed(painter); + xrdp_painter_begin_update(painter); + + if (focused) + { + /* active title bar */ + painter->fg_color = self->wm->blue; + xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18); + painter->fg_color = self->wm->white; + } + else + { + /* inactive title bar */ + painter->fg_color = self->wm->dark_grey; + xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18); + painter->fg_color = self->wm->black; + } + + xrdp_painter_draw_text(painter, self, 4, 4, self->caption1); + xrdp_painter_end_update(painter); + xrdp_painter_delete(painter); return 0; - } - painter = xrdp_painter_create(self->wm, self->wm->session); - xrdp_painter_font_needed(painter); - xrdp_painter_begin_update(painter); - if (focused) - { - /* active title bar */ - painter->fg_color = self->wm->blue; - xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18); - painter->fg_color = self->wm->white; - } - else - { - /* inactive title bar */ - painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18); - painter->fg_color = self->wm->black; - } - xrdp_painter_draw_text(painter, self, 4, 4, self->caption1); - xrdp_painter_end_update(painter); - xrdp_painter_delete(painter); - return 0; } /*****************************************************************************/ static int APP_CC -xrdp_bitmap_get_index(struct xrdp_bitmap* self, int* palette, int color) +xrdp_bitmap_get_index(struct xrdp_bitmap *self, int *palette, int color) { - int r = 0; - int g = 0; - int b = 0; - - r = (color & 0xff0000) >> 16; - g = (color & 0x00ff00) >> 8; - b = (color & 0x0000ff) >> 0; - r = (r >> 5) << 0; - g = (g >> 5) << 3; - b = (b >> 6) << 6; - return (b | g | r); + int r = 0; + int g = 0; + int b = 0; + + r = (color & 0xff0000) >> 16; + g = (color & 0x00ff00) >> 8; + b = (color & 0x0000ff) >> 0; + r = (r >> 5) << 0; + g = (g >> 5) << 3; + b = (b >> 6) << 6; + return (b | g | r); } /*****************************************************************************/ /* returns error */ int APP_CC -xrdp_bitmap_resize(struct xrdp_bitmap* self, int width, int height) +xrdp_bitmap_resize(struct xrdp_bitmap *self, int width, int height) { - int Bpp = 0; + int Bpp = 0; + + if ((width == self->width) && (height == self->height)) + { + return 0; + } + + if (self->do_not_free_data) + { + return 1; + } + + self->width = width; + self->height = height; + Bpp = 4; - if ((width == self->width) && (height == self->height)) - { + switch (self->bpp) + { + case 8: + Bpp = 1; + break; + case 15: + Bpp = 2; + break; + case 16: + Bpp = 2; + break; + } + + g_free(self->data); + self->data = (char *)g_malloc(width * height * Bpp, 0); + self->line_size = width * Bpp; return 0; - } - if (self->do_not_free_data) - { - return 1; - } - self->width = width; - self->height = height; - Bpp = 4; - switch (self->bpp) - { - case 8: Bpp = 1; break; - case 15: Bpp = 2; break; - case 16: Bpp = 2; break; - } - g_free(self->data); - self->data = (char*)g_malloc(width * height * Bpp, 0); - self->line_size = width * Bpp; - return 0; } /*****************************************************************************/ @@ -333,1428 +376,1569 @@ xrdp_bitmap_resize(struct xrdp_bitmap* self, int width, int height) /* return 0 ok */ /* return 1 error */ int APP_CC -xrdp_bitmap_load(struct xrdp_bitmap* self, const char* filename, int* palette) +xrdp_bitmap_load(struct xrdp_bitmap *self, const char *filename, int *palette) { - int fd = 0; - int i = 0; - int j = 0; - int k = 0; - int color = 0; - int size = 0; - int palette1[256]; - char type1[4]; - struct xrdp_bmp_header header; - struct stream* s = (struct stream *)NULL; - - g_memset(palette1,0,sizeof(int) * 256); - g_memset(type1,0,sizeof(char) * 4); - g_memset(&header,0,sizeof(struct xrdp_bmp_header)); - - if (!g_file_exist(filename)) - { - log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error bitmap file [%s] " - "does not exist", filename); - return 1; - } - s = (struct stream *)NULL; - fd = g_file_open(filename); - if (fd != -1) - { - /* read file type */ - if (g_file_read(fd, type1, 2) != 2) - { - log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error bitmap file [%s] " - "read error", filename); - g_file_close(fd); - return 1; - } - if ((type1[0] != 'B') || (type1[1] != 'M')) - { - log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error bitmap file [%s] " - "not BMP file", filename); - g_file_close(fd); - return 1; - } - /* read file size */ - make_stream(s); - init_stream(s, 8192); - g_file_read(fd, s->data, 4); - in_uint32_le(s, size); - /* read bmp header */ - g_file_seek(fd, 14); - init_stream(s, 8192); - g_file_read(fd, s->data, 40); /* size better be 40 */ - in_uint32_le(s, header.size); - in_uint32_le(s, header.image_width); - in_uint32_le(s, header.image_height); - in_uint16_le(s, header.planes); - in_uint16_le(s, header.bit_count); - in_uint32_le(s, header.compression); - in_uint32_le(s, header.image_size); - in_uint32_le(s, header.x_pels_per_meter); - in_uint32_le(s, header.y_pels_per_meter); - in_uint32_le(s, header.clr_used); - in_uint32_le(s, header.clr_important); - if ((header.bit_count != 4) && (header.bit_count != 8) && - (header.bit_count != 24)) - { - log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error bitmap file [%s] " - "bad bpp %d", filename, header.bit_count); - free_stream(s); - g_file_close(fd); - return 1; - } - if (header.bit_count == 24) /* 24 bit bitmap */ - { - g_file_seek(fd, 14 + header.size); - xrdp_bitmap_resize(self, header.image_width, header.image_height); - size = header.image_width * header.image_height * 3; - init_stream(s, size); - /* read data */ - for (i = header.image_height - 1; i >= 0; i--) - { - size = header.image_width * 3; - k = g_file_read(fd, s->data + i * size, size); - if (k != size) + int fd = 0; + int i = 0; + int j = 0; + int k = 0; + int color = 0; + int size = 0; + int palette1[256]; + char type1[4]; + struct xrdp_bmp_header header; + struct stream *s = (struct stream *)NULL; + + g_memset(palette1, 0, sizeof(int) * 256); + g_memset(type1, 0, sizeof(char) * 4); + g_memset(&header, 0, sizeof(struct xrdp_bmp_header)); + + if (!g_file_exist(filename)) + { + log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error bitmap file [%s] " + "does not exist", filename); + return 1; + } + + s = (struct stream *)NULL; + fd = g_file_open(filename); + + if (fd != -1) + { + /* read file type */ + if (g_file_read(fd, type1, 2) != 2) { - log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error bitmap " - "file [%s] read", filename); + log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error bitmap file [%s] " + "read error", filename); + g_file_close(fd); + return 1; } - } - for (i = 0; i < self->height; i++) - { - for (j = 0; j < self->width; j++) + + if ((type1[0] != 'B') || (type1[1] != 'M')) { - in_uint8(s, k); - color = k; - in_uint8(s, k); - color |= k << 8; - in_uint8(s, k); - color |= k << 16; - if (self->bpp == 8) - { - color = xrdp_bitmap_get_index(self, palette, color); - } - else if (self->bpp == 15) - { - color = COLOR15((color & 0xff0000) >> 16, - (color & 0x00ff00) >> 8, - (color & 0x0000ff) >> 0); - } - else if (self->bpp == 16) - { - color = COLOR16((color & 0xff0000) >> 16, - (color & 0x00ff00) >> 8, - (color & 0x0000ff) >> 0); - } - xrdp_bitmap_set_pixel(self, j, i, color); + log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error bitmap file [%s] " + "not BMP file", filename); + g_file_close(fd); + return 1; } - } - } - else if (header.bit_count == 8) /* 8 bit bitmap */ - { - /* read palette */ - g_file_seek(fd, 14 + header.size); - init_stream(s, 8192); - g_file_read(fd, s->data, header.clr_used * sizeof(int)); - for (i = 0; i < header.clr_used; i++) - { - in_uint32_le(s, palette1[i]); - } - xrdp_bitmap_resize(self, header.image_width, header.image_height); - size = header.image_width * header.image_height; - init_stream(s, size); - /* read data */ - for (i = header.image_height - 1; i >= 0; i--) - { - size = header.image_width; - k = g_file_read(fd, s->data + i * size, size); - if (k != size) + + /* read file size */ + make_stream(s); + init_stream(s, 8192); + g_file_read(fd, s->data, 4); + in_uint32_le(s, size); + /* read bmp header */ + g_file_seek(fd, 14); + init_stream(s, 8192); + g_file_read(fd, s->data, 40); /* size better be 40 */ + in_uint32_le(s, header.size); + in_uint32_le(s, header.image_width); + in_uint32_le(s, header.image_height); + in_uint16_le(s, header.planes); + in_uint16_le(s, header.bit_count); + in_uint32_le(s, header.compression); + in_uint32_le(s, header.image_size); + in_uint32_le(s, header.x_pels_per_meter); + in_uint32_le(s, header.y_pels_per_meter); + in_uint32_le(s, header.clr_used); + in_uint32_le(s, header.clr_important); + + if ((header.bit_count != 4) && (header.bit_count != 8) && + (header.bit_count != 24)) { - log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error bitmap " - "file [%s] read", filename); + log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error bitmap file [%s] " + "bad bpp %d", filename, header.bit_count); + free_stream(s); + g_file_close(fd); + return 1; } - } - for (i = 0; i < self->height; i++) - { - for (j = 0; j < self->width; j++) + + if (header.bit_count == 24) /* 24 bit bitmap */ { - in_uint8(s, k); - color = palette1[k]; - if (self->bpp == 8) - { - color = xrdp_bitmap_get_index(self, palette, color); - } - else if (self->bpp == 15) - { - color = COLOR15((color & 0xff0000) >> 16, - (color & 0x00ff00) >> 8, - (color & 0x0000ff) >> 0); - } - else if (self->bpp == 16) - { - color = COLOR16((color & 0xff0000) >> 16, - (color & 0x00ff00) >> 8, - (color & 0x0000ff) >> 0); - } - xrdp_bitmap_set_pixel(self, j, i, color); + g_file_seek(fd, 14 + header.size); + xrdp_bitmap_resize(self, header.image_width, header.image_height); + size = header.image_width * header.image_height * 3; + init_stream(s, size); + + /* read data */ + for (i = header.image_height - 1; i >= 0; i--) + { + size = header.image_width * 3; + k = g_file_read(fd, s->data + i * size, size); + + if (k != size) + { + log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error bitmap " + "file [%s] read", filename); + } + } + + for (i = 0; i < self->height; i++) + { + for (j = 0; j < self->width; j++) + { + in_uint8(s, k); + color = k; + in_uint8(s, k); + color |= k << 8; + in_uint8(s, k); + color |= k << 16; + + if (self->bpp == 8) + { + color = xrdp_bitmap_get_index(self, palette, color); + } + else if (self->bpp == 15) + { + color = COLOR15((color & 0xff0000) >> 16, + (color & 0x00ff00) >> 8, + (color & 0x0000ff) >> 0); + } + else if (self->bpp == 16) + { + color = COLOR16((color & 0xff0000) >> 16, + (color & 0x00ff00) >> 8, + (color & 0x0000ff) >> 0); + } + + xrdp_bitmap_set_pixel(self, j, i, color); + } + } } - } - } - else if (header.bit_count == 4) /* 4 bit bitmap */ - { - /* read palette */ - g_file_seek(fd, 14 + header.size); - init_stream(s, 8192); - g_file_read(fd, s->data, header.clr_used * sizeof(int)); - for (i = 0; i < header.clr_used; i++) - { - in_uint32_le(s, palette1[i]); - } - xrdp_bitmap_resize(self, header.image_width, header.image_height); - size = (header.image_width * header.image_height) / 2; - init_stream(s, size); - /* read data */ - for (i = header.image_height - 1; i >= 0; i--) - { - size = header.image_width / 2; - k = g_file_read(fd, s->data + i * size, size); - if (k != size) + else if (header.bit_count == 8) /* 8 bit bitmap */ { - log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error bitmap " - "file [%s] read", filename); + /* read palette */ + g_file_seek(fd, 14 + header.size); + init_stream(s, 8192); + g_file_read(fd, s->data, header.clr_used * sizeof(int)); + + for (i = 0; i < header.clr_used; i++) + { + in_uint32_le(s, palette1[i]); + } + + xrdp_bitmap_resize(self, header.image_width, header.image_height); + size = header.image_width * header.image_height; + init_stream(s, size); + + /* read data */ + for (i = header.image_height - 1; i >= 0; i--) + { + size = header.image_width; + k = g_file_read(fd, s->data + i * size, size); + + if (k != size) + { + log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error bitmap " + "file [%s] read", filename); + } + } + + for (i = 0; i < self->height; i++) + { + for (j = 0; j < self->width; j++) + { + in_uint8(s, k); + color = palette1[k]; + + if (self->bpp == 8) + { + color = xrdp_bitmap_get_index(self, palette, color); + } + else if (self->bpp == 15) + { + color = COLOR15((color & 0xff0000) >> 16, + (color & 0x00ff00) >> 8, + (color & 0x0000ff) >> 0); + } + else if (self->bpp == 16) + { + color = COLOR16((color & 0xff0000) >> 16, + (color & 0x00ff00) >> 8, + (color & 0x0000ff) >> 0); + } + + xrdp_bitmap_set_pixel(self, j, i, color); + } + } } - } - for (i = 0; i < self->height; i++) - { - for (j = 0; j < self->width; j++) + else if (header.bit_count == 4) /* 4 bit bitmap */ { - if ((j & 1) == 0) - { - in_uint8(s, k); - color = (k >> 4) & 0xf; - } - else - { - color = k & 0xf; - } - color = palette1[color]; - if (self->bpp == 8) - { - color = xrdp_bitmap_get_index(self, palette, color); - } - else if (self->bpp == 15) - { - color = COLOR15((color & 0xff0000) >> 16, - (color & 0x00ff00) >> 8, - (color & 0x0000ff) >> 0); - } - else if (self->bpp == 16) - { - color = COLOR16((color & 0xff0000) >> 16, - (color & 0x00ff00) >> 8, - (color & 0x0000ff) >> 0); - } - xrdp_bitmap_set_pixel(self, j, i, color); + /* read palette */ + g_file_seek(fd, 14 + header.size); + init_stream(s, 8192); + g_file_read(fd, s->data, header.clr_used * sizeof(int)); + + for (i = 0; i < header.clr_used; i++) + { + in_uint32_le(s, palette1[i]); + } + + xrdp_bitmap_resize(self, header.image_width, header.image_height); + size = (header.image_width * header.image_height) / 2; + init_stream(s, size); + + /* read data */ + for (i = header.image_height - 1; i >= 0; i--) + { + size = header.image_width / 2; + k = g_file_read(fd, s->data + i * size, size); + + if (k != size) + { + log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error bitmap " + "file [%s] read", filename); + } + } + + for (i = 0; i < self->height; i++) + { + for (j = 0; j < self->width; j++) + { + if ((j & 1) == 0) + { + in_uint8(s, k); + color = (k >> 4) & 0xf; + } + else + { + color = k & 0xf; + } + + color = palette1[color]; + + if (self->bpp == 8) + { + color = xrdp_bitmap_get_index(self, palette, color); + } + else if (self->bpp == 15) + { + color = COLOR15((color & 0xff0000) >> 16, + (color & 0x00ff00) >> 8, + (color & 0x0000ff) >> 0); + } + else if (self->bpp == 16) + { + color = COLOR16((color & 0xff0000) >> 16, + (color & 0x00ff00) >> 8, + (color & 0x0000ff) >> 0); + } + + xrdp_bitmap_set_pixel(self, j, i, color); + } + } } - } - } - g_file_close(fd); - free_stream(s); - } - else - { - log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error loading bitmap " - "from file [%s]", filename); - return 1; - } - return 0; + + g_file_close(fd); + free_stream(s); + } + else + { + log_message(LOG_LEVEL_ERROR, "xrdp_bitmap_load: error loading bitmap " + "from file [%s]", filename); + return 1; + } + + return 0; } /*****************************************************************************/ int APP_CC -xrdp_bitmap_get_pixel(struct xrdp_bitmap* self, int x, int y) +xrdp_bitmap_get_pixel(struct xrdp_bitmap *self, int x, int y) { - if (self == 0) - { - return 0; - } - if (self->data == 0) - { - return 0; - } - if (x >= 0 && x < self->width && y >= 0 && y < self->height) - { - if (self->bpp == 8) + if (self == 0) { - return GETPIXEL8(self->data, x, y, self->width); + return 0; } - else if (self->bpp == 15 || self->bpp == 16) + + if (self->data == 0) { - return GETPIXEL16(self->data, x, y, self->width); + return 0; } - else if (self->bpp == 24) + + if (x >= 0 && x < self->width && y >= 0 && y < self->height) { - return GETPIXEL32(self->data, x, y, self->width); + if (self->bpp == 8) + { + return GETPIXEL8(self->data, x, y, self->width); + } + else if (self->bpp == 15 || self->bpp == 16) + { + return GETPIXEL16(self->data, x, y, self->width); + } + else if (self->bpp == 24) + { + return GETPIXEL32(self->data, x, y, self->width); + } } - } - return 0; + + return 0; } /*****************************************************************************/ int APP_CC -xrdp_bitmap_set_pixel(struct xrdp_bitmap* self, int x, int y, int pixel) +xrdp_bitmap_set_pixel(struct xrdp_bitmap *self, int x, int y, int pixel) { - if (self == 0) - { - return 0; - } - if (self->data == 0) - { - return 0; - } - if (x >= 0 && x < self->width && y >= 0 && y < self->height) - { - if (self->bpp == 8) + if (self == 0) { - SETPIXEL8(self->data, x, y, self->width, pixel); + return 0; } - else if (self->bpp == 15 || self->bpp == 16) + + if (self->data == 0) { - SETPIXEL16(self->data, x, y, self->width, pixel); + return 0; } - else if (self->bpp == 24) + + if (x >= 0 && x < self->width && y >= 0 && y < self->height) { - SETPIXEL32(self->data, x, y, self->width, pixel); + if (self->bpp == 8) + { + SETPIXEL8(self->data, x, y, self->width, pixel); + } + else if (self->bpp == 15 || self->bpp == 16) + { + SETPIXEL16(self->data, x, y, self->width, pixel); + } + else if (self->bpp == 24) + { + SETPIXEL32(self->data, x, y, self->width, pixel); + } } - } - return 0; + + return 0; } /*****************************************************************************/ /* copy part of self at x, y to 0, 0 in dest */ /* returns error */ int APP_CC -xrdp_bitmap_copy_box(struct xrdp_bitmap* self, - struct xrdp_bitmap* dest, +xrdp_bitmap_copy_box(struct xrdp_bitmap *self, + struct xrdp_bitmap *dest, int x, int y, int cx, int cy) { - int i = 0; - int j = 0; - int destx = 0; - int desty = 0; - int pixel = 0; - - if (self == 0) - { - return 1; - } - if (dest == 0) - { - return 1; - } - if (self->type != WND_TYPE_BITMAP && self->type != WND_TYPE_IMAGE) - { - return 1; - } - if (dest->type != WND_TYPE_BITMAP && dest->type != WND_TYPE_IMAGE) - { - return 1; - } - if (self->bpp != dest->bpp) - { - return 1; - } - destx = 0; - desty = 0; - if (!check_bounds(self, &x, &y, &cx, &cy)) - { - return 1; - } - if (!check_bounds(dest, &destx, &desty, &cx, &cy)) - { - return 1; - } - if (self->bpp == 24) - { - for (i = 0; i < cy; i++) - { - for (j = 0; j < cx; j++) - { - pixel = GETPIXEL32(self->data, j + x, i + y, self->width); - SETPIXEL32(dest->data, j + destx, i + desty, dest->width, pixel); - } - } - } - else if (self->bpp == 15 || self->bpp == 16) - { - for (i = 0; i < cy; i++) - { - for (j = 0; j < cx; j++) - { - pixel = GETPIXEL16(self->data, j + x, i + y, self->width); - SETPIXEL16(dest->data, j + destx, i + desty, dest->width, pixel); - } - } - } - else if (self->bpp == 8) - { - for (i = 0; i < cy; i++) - { - for (j = 0; j < cx; j++) - { - pixel = GETPIXEL8(self->data, j + x, i + y, self->width); - SETPIXEL8(dest->data, j + destx, i + desty, dest->width, pixel); - } - } - } - else - { - return 1; - } - return 0; + int i = 0; + int j = 0; + int destx = 0; + int desty = 0; + int pixel = 0; + + if (self == 0) + { + return 1; + } + + if (dest == 0) + { + return 1; + } + + if (self->type != WND_TYPE_BITMAP && self->type != WND_TYPE_IMAGE) + { + return 1; + } + + if (dest->type != WND_TYPE_BITMAP && dest->type != WND_TYPE_IMAGE) + { + return 1; + } + + if (self->bpp != dest->bpp) + { + return 1; + } + + destx = 0; + desty = 0; + + if (!check_bounds(self, &x, &y, &cx, &cy)) + { + return 1; + } + + if (!check_bounds(dest, &destx, &desty, &cx, &cy)) + { + return 1; + } + + if (self->bpp == 24) + { + for (i = 0; i < cy; i++) + { + for (j = 0; j < cx; j++) + { + pixel = GETPIXEL32(self->data, j + x, i + y, self->width); + SETPIXEL32(dest->data, j + destx, i + desty, dest->width, pixel); + } + } + } + else if (self->bpp == 15 || self->bpp == 16) + { + for (i = 0; i < cy; i++) + { + for (j = 0; j < cx; j++) + { + pixel = GETPIXEL16(self->data, j + x, i + y, self->width); + SETPIXEL16(dest->data, j + destx, i + desty, dest->width, pixel); + } + } + } + else if (self->bpp == 8) + { + for (i = 0; i < cy; i++) + { + for (j = 0; j < cx; j++) + { + pixel = GETPIXEL8(self->data, j + x, i + y, self->width); + SETPIXEL8(dest->data, j + destx, i + desty, dest->width, pixel); + } + } + } + else + { + return 1; + } + + return 0; } /*****************************************************************************/ /* copy part of self at x, y to 0, 0 in dest */ /* returns error */ int APP_CC -xrdp_bitmap_copy_box_with_crc(struct xrdp_bitmap* self, - struct xrdp_bitmap* dest, +xrdp_bitmap_copy_box_with_crc(struct xrdp_bitmap *self, + struct xrdp_bitmap *dest, int x, int y, int cx, int cy) { - int i = 0; - int j = 0; - int destx = 0; - int desty = 0; - int pixel = 0; - int crc = 0; - int incs = 0; - int incd = 0; - unsigned char* s8 = (unsigned char *)NULL; - unsigned char* d8 = (unsigned char *)NULL; - unsigned short* s16 = (unsigned short *)NULL; - unsigned short* d16 = (unsigned short *)NULL; - - if (self == 0) - { - return 1; - } - if (dest == 0) - { - return 1; - } - if (self->type != WND_TYPE_BITMAP && self->type != WND_TYPE_IMAGE) - { - return 1; - } - if (dest->type != WND_TYPE_BITMAP && dest->type != WND_TYPE_IMAGE) - { - return 1; - } - if (self->bpp != dest->bpp) - { - return 1; - } - destx = 0; - desty = 0; - if (!check_bounds(self, &x, &y, &cx, &cy)) - { - return 1; - } - if (!check_bounds(dest, &destx, &desty, &cx, &cy)) - { - return 1; - } - CRC_START(crc); - if (self->bpp == 24) - { - for (i = 0; i < cy; i++) - { - for (j = 0; j < cx; j++) - { - pixel = GETPIXEL32(self->data, j + x, i + y, self->width); - CRC_PASS(pixel, crc); - CRC_PASS(pixel >> 8, crc); - CRC_PASS(pixel >> 16, crc); - SETPIXEL32(dest->data, j + destx, i + desty, dest->width, pixel); - } - } - } - else if (self->bpp == 15 || self->bpp == 16) - { - s16 = ((unsigned short*)(self->data)) + (self->width * y + x); - d16 = ((unsigned short*)(dest->data)) + (dest->width * desty + destx); - incs = self->width - cx; - incd = dest->width - cx; - for (i = 0; i < cy; i++) - { - for (j = 0; j < cx; j++) - { - pixel = *s16; - CRC_PASS(pixel, crc); - CRC_PASS(pixel >> 8, crc); - *d16 = pixel; - s16++; - d16++; - } - s16 += incs; - d16 += incd; - } - } - else if (self->bpp == 8) - { - s8 = ((unsigned char*)(self->data)) + (self->width * y + x); - d8 = ((unsigned char*)(dest->data)) + (dest->width * desty + destx); - incs = self->width - cx; - incd = dest->width - cx; - for (i = 0; i < cy; i++) - { - for (j = 0; j < cx; j++) - { - pixel = *s8; - CRC_PASS(pixel, crc); - *d8 = pixel; - s8++; - d8++; - } - s8 += incs; - d8 += incd; - } - } - else - { - return 1; - } - CRC_END(crc); - dest->crc = crc; - return 0; + int i = 0; + int j = 0; + int destx = 0; + int desty = 0; + int pixel = 0; + int crc = 0; + int incs = 0; + int incd = 0; + unsigned char *s8 = (unsigned char *)NULL; + unsigned char *d8 = (unsigned char *)NULL; + unsigned short *s16 = (unsigned short *)NULL; + unsigned short *d16 = (unsigned short *)NULL; + + if (self == 0) + { + return 1; + } + + if (dest == 0) + { + return 1; + } + + if (self->type != WND_TYPE_BITMAP && self->type != WND_TYPE_IMAGE) + { + return 1; + } + + if (dest->type != WND_TYPE_BITMAP && dest->type != WND_TYPE_IMAGE) + { + return 1; + } + + if (self->bpp != dest->bpp) + { + return 1; + } + + destx = 0; + desty = 0; + + if (!check_bounds(self, &x, &y, &cx, &cy)) + { + return 1; + } + + if (!check_bounds(dest, &destx, &desty, &cx, &cy)) + { + return 1; + } + + CRC_START(crc); + + if (self->bpp == 24) + { + for (i = 0; i < cy; i++) + { + for (j = 0; j < cx; j++) + { + pixel = GETPIXEL32(self->data, j + x, i + y, self->width); + CRC_PASS(pixel, crc); + CRC_PASS(pixel >> 8, crc); + CRC_PASS(pixel >> 16, crc); + SETPIXEL32(dest->data, j + destx, i + desty, dest->width, pixel); + } + } + } + else if (self->bpp == 15 || self->bpp == 16) + { + s16 = ((unsigned short *)(self->data)) + (self->width * y + x); + d16 = ((unsigned short *)(dest->data)) + (dest->width * desty + destx); + incs = self->width - cx; + incd = dest->width - cx; + + for (i = 0; i < cy; i++) + { + for (j = 0; j < cx; j++) + { + pixel = *s16; + CRC_PASS(pixel, crc); + CRC_PASS(pixel >> 8, crc); + *d16 = pixel; + s16++; + d16++; + } + + s16 += incs; + d16 += incd; + } + } + else if (self->bpp == 8) + { + s8 = ((unsigned char *)(self->data)) + (self->width * y + x); + d8 = ((unsigned char *)(dest->data)) + (dest->width * desty + destx); + incs = self->width - cx; + incd = dest->width - cx; + + for (i = 0; i < cy; i++) + { + for (j = 0; j < cx; j++) + { + pixel = *s8; + CRC_PASS(pixel, crc); + *d8 = pixel; + s8++; + d8++; + } + + s8 += incs; + d8 += incd; + } + } + else + { + return 1; + } + + CRC_END(crc); + dest->crc = crc; + return 0; } /*****************************************************************************/ /* returns true if they are the same, else returns false */ int APP_CC -xrdp_bitmap_compare(struct xrdp_bitmap* self, - struct xrdp_bitmap* b) +xrdp_bitmap_compare(struct xrdp_bitmap *self, + struct xrdp_bitmap *b) { - if (self == 0) - { - return 0; - } - if (b == 0) - { - return 0; - } - if (self->bpp != b->bpp) - { - return 0; - } - if (self->width != b->width) - { - return 0; - } - if (self->height != b->height) - { + if (self == 0) + { + return 0; + } + + if (b == 0) + { + return 0; + } + + if (self->bpp != b->bpp) + { + return 0; + } + + if (self->width != b->width) + { + return 0; + } + + if (self->height != b->height) + { + return 0; + } + + if (g_memcmp(self->data, b->data, b->height * b->line_size) == 0) + { + return 1; + } + return 0; - } - if (g_memcmp(self->data, b->data, b->height * b->line_size) == 0) - { - return 1; - } - return 0; } /*****************************************************************************/ /* returns true if they are the same, else returns false */ int APP_CC -xrdp_bitmap_compare_with_crc(struct xrdp_bitmap* self, - struct xrdp_bitmap* b) +xrdp_bitmap_compare_with_crc(struct xrdp_bitmap *self, + struct xrdp_bitmap *b) { - if (self == 0) - { - return 0; - } - if (b == 0) - { - return 0; - } - if (self->bpp != b->bpp) - { - return 0; - } - if (self->width != b->width) - { - return 0; - } - if (self->height != b->height) - { + if (self == 0) + { + return 0; + } + + if (b == 0) + { + return 0; + } + + if (self->bpp != b->bpp) + { + return 0; + } + + if (self->width != b->width) + { + return 0; + } + + if (self->height != b->height) + { + return 0; + } + + if (self->crc == b->crc) + { + return 1; + } + return 0; - } - if (self->crc == b->crc) - { - return 1; - } - return 0; } /*****************************************************************************/ static int APP_CC -xrdp_bitmap_draw_focus_box(struct xrdp_bitmap* self, - struct xrdp_painter* painter, +xrdp_bitmap_draw_focus_box(struct xrdp_bitmap *self, + struct xrdp_painter *painter, int x, int y, int cx, int cy) { - painter->rop = 0xf0; - xrdp_painter_begin_update(painter); - painter->use_clip = 0; - painter->mix_mode = 1; - painter->brush.pattern[0] = 0xaa; - painter->brush.pattern[1] = 0x55; - painter->brush.pattern[2] = 0xaa; - painter->brush.pattern[3] = 0x55; - painter->brush.pattern[4] = 0xaa; - painter->brush.pattern[5] = 0x55; - painter->brush.pattern[6] = 0xaa; - painter->brush.pattern[7] = 0x55; - painter->brush.x_orgin = x; - painter->brush.x_orgin = x; - painter->brush.style = 3; - painter->fg_color = self->wm->black; - painter->bg_color = self->parent->bg_color; - /* top */ - xrdp_painter_fill_rect(painter, self, x, y, cx, 1); - /* bottom */ - xrdp_painter_fill_rect(painter, self, x, y + (cy - 1), cx, 1); - /* left */ - xrdp_painter_fill_rect(painter, self, x, y + 1, 1, cy - 2); - /* right */ - xrdp_painter_fill_rect(painter, self, x + (cx - 1), y + 1, 1, cy - 2); - xrdp_painter_end_update(painter); - painter->rop = 0xcc; - painter->mix_mode = 0; - return 0; + painter->rop = 0xf0; + xrdp_painter_begin_update(painter); + painter->use_clip = 0; + painter->mix_mode = 1; + painter->brush.pattern[0] = 0xaa; + painter->brush.pattern[1] = 0x55; + painter->brush.pattern[2] = 0xaa; + painter->brush.pattern[3] = 0x55; + painter->brush.pattern[4] = 0xaa; + painter->brush.pattern[5] = 0x55; + painter->brush.pattern[6] = 0xaa; + painter->brush.pattern[7] = 0x55; + painter->brush.x_orgin = x; + painter->brush.x_orgin = x; + painter->brush.style = 3; + painter->fg_color = self->wm->black; + painter->bg_color = self->parent->bg_color; + /* top */ + xrdp_painter_fill_rect(painter, self, x, y, cx, 1); + /* bottom */ + xrdp_painter_fill_rect(painter, self, x, y + (cy - 1), cx, 1); + /* left */ + xrdp_painter_fill_rect(painter, self, x, y + 1, 1, cy - 2); + /* right */ + xrdp_painter_fill_rect(painter, self, x + (cx - 1), y + 1, 1, cy - 2); + xrdp_painter_end_update(painter); + painter->rop = 0xcc; + painter->mix_mode = 0; + return 0; } /*****************************************************************************/ /* x and y are in relation to self for 0, 0 is the top left of the control */ static int APP_CC -xrdp_bitmap_draw_button(struct xrdp_bitmap* self, - struct xrdp_painter* painter, +xrdp_bitmap_draw_button(struct xrdp_bitmap *self, + struct xrdp_painter *painter, int x, int y, int w, int h, int down) { - if (down) - { - /* gray box */ - painter->fg_color = self->wm->grey; - xrdp_painter_fill_rect(painter, self, x, y, w, h); - /* black top line */ - painter->fg_color = self->wm->black; - xrdp_painter_fill_rect(painter, self, x, y, w, 1); - /* black left line */ - painter->fg_color = self->wm->black; - xrdp_painter_fill_rect(painter, self, x, y, 1, h); - /* dark grey top line */ - painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, x + 1, y + 1, w - 2, 1); - /* dark grey left line */ - painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, x + 1, y + 1, 1, h - 2); - /* dark grey bottom line */ - painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, x + 1, y + (h - 2), w - 1, 1); - /* dark grey right line */ - painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, x + (w - 2), y + 1, 1, h - 1); - /* black bottom line */ - painter->fg_color = self->wm->black; - xrdp_painter_fill_rect(painter, self, x, y + (h - 1), w, 1); - /* black right line */ - painter->fg_color = self->wm->black; - xrdp_painter_fill_rect(painter, self, x + (w - 1), y, 1, h); - } - else - { - /* gray box */ - painter->fg_color = self->wm->grey; - xrdp_painter_fill_rect(painter, self, x, y, w, h); - /* white top line */ - painter->fg_color = self->wm->white; - xrdp_painter_fill_rect(painter, self, x, y, w, 1); - /* white left line */ - painter->fg_color = self->wm->white; - xrdp_painter_fill_rect(painter, self, x, y, 1, h); - /* dark grey bottom line */ - painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, x + 1, y + (h - 2), w - 1, 1); - /* dark grey right line */ - painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, (x + w) - 2, y + 1, 1, h - 1); - /* black bottom line */ - painter->fg_color = self->wm->black; - xrdp_painter_fill_rect(painter, self, x, y + (h - 1), w, 1); - /* black right line */ - painter->fg_color = self->wm->black; - xrdp_painter_fill_rect(painter, self, x + (w - 1), y, 1, h); - } - return 0; + if (down) + { + /* gray box */ + painter->fg_color = self->wm->grey; + xrdp_painter_fill_rect(painter, self, x, y, w, h); + /* black top line */ + painter->fg_color = self->wm->black; + xrdp_painter_fill_rect(painter, self, x, y, w, 1); + /* black left line */ + painter->fg_color = self->wm->black; + xrdp_painter_fill_rect(painter, self, x, y, 1, h); + /* dark grey top line */ + painter->fg_color = self->wm->dark_grey; + xrdp_painter_fill_rect(painter, self, x + 1, y + 1, w - 2, 1); + /* dark grey left line */ + painter->fg_color = self->wm->dark_grey; + xrdp_painter_fill_rect(painter, self, x + 1, y + 1, 1, h - 2); + /* dark grey bottom line */ + painter->fg_color = self->wm->dark_grey; + xrdp_painter_fill_rect(painter, self, x + 1, y + (h - 2), w - 1, 1); + /* dark grey right line */ + painter->fg_color = self->wm->dark_grey; + xrdp_painter_fill_rect(painter, self, x + (w - 2), y + 1, 1, h - 1); + /* black bottom line */ + painter->fg_color = self->wm->black; + xrdp_painter_fill_rect(painter, self, x, y + (h - 1), w, 1); + /* black right line */ + painter->fg_color = self->wm->black; + xrdp_painter_fill_rect(painter, self, x + (w - 1), y, 1, h); + } + else + { + /* gray box */ + painter->fg_color = self->wm->grey; + xrdp_painter_fill_rect(painter, self, x, y, w, h); + /* white top line */ + painter->fg_color = self->wm->white; + xrdp_painter_fill_rect(painter, self, x, y, w, 1); + /* white left line */ + painter->fg_color = self->wm->white; + xrdp_painter_fill_rect(painter, self, x, y, 1, h); + /* dark grey bottom line */ + painter->fg_color = self->wm->dark_grey; + xrdp_painter_fill_rect(painter, self, x + 1, y + (h - 2), w - 1, 1); + /* dark grey right line */ + painter->fg_color = self->wm->dark_grey; + xrdp_painter_fill_rect(painter, self, (x + w) - 2, y + 1, 1, h - 1); + /* black bottom line */ + painter->fg_color = self->wm->black; + xrdp_painter_fill_rect(painter, self, x, y + (h - 1), w, 1); + /* black right line */ + painter->fg_color = self->wm->black; + xrdp_painter_fill_rect(painter, self, x + (w - 1), y, 1, h); + } + + return 0; } /*****************************************************************************/ /* nil for rect means the whole thing */ /* returns error */ int APP_CC -xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) +xrdp_bitmap_invalidate(struct xrdp_bitmap *self, struct xrdp_rect *rect) { - int i; - int w; - int h; - int x; - int y; - struct xrdp_bitmap* b; - struct xrdp_rect r1; - struct xrdp_rect r2; - struct xrdp_painter* painter; - twchar wtext[256]; - char text[256]; - char* p; - - if (self == 0) /* if no bitmap */ - { - return 0; - } - if (self->type == WND_TYPE_BITMAP) /* if 0, bitmap, leave */ - { - return 0; - } - painter = xrdp_painter_create(self->wm, self->wm->session); - xrdp_painter_font_needed(painter); - painter->rop = 0xcc; /* copy */ - if (rect == 0) - { - painter->use_clip = 0; - } - else - { - if (ISRECTEMPTY(*rect)) - { - xrdp_painter_delete(painter); - return 0; - } - painter->clip = *rect; - painter->use_clip = &painter->clip; - } - xrdp_painter_begin_update(painter); - if (self->type == WND_TYPE_WND) /* 1 */ - { - /* draw grey background */ - painter->fg_color = self->bg_color; - xrdp_painter_fill_rect(painter, self, 0, 0, self->width, self->height); - /* top white line */ - painter->fg_color = self->wm->white; - xrdp_painter_fill_rect(painter, self, 1, 1, self->width - 2, 1); - /* left white line */ - painter->fg_color = self->wm->white; - xrdp_painter_fill_rect(painter, self, 1, 1, 1, self->height - 2); - /* bottom dark grey line */ - painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, 1, self->height - 2, - self->width - 2, 1); - /* right dark grey line */ - painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, self->width - 2, 1, 1, - self->height - 2); - /* bottom black line */ - painter->fg_color = self->wm->black; - xrdp_painter_fill_rect(painter, self, 0, self->height - 1, - self->width, 1); - /* right black line */ - painter->fg_color = self->wm->black; - xrdp_painter_fill_rect(painter, self, self->width - 1, 0, - 1, self->height); - if (self->wm->focused_window == self) + int i; + int w; + int h; + int x; + int y; + struct xrdp_bitmap *b; + struct xrdp_rect r1; + struct xrdp_rect r2; + struct xrdp_painter *painter; + twchar wtext[256]; + char text[256]; + char *p; + + if (self == 0) /* if no bitmap */ { - /* active title bar */ - painter->fg_color = self->wm->blue; - xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18); - painter->fg_color = self->wm->white; + return 0; } - else + + if (self->type == WND_TYPE_BITMAP) /* if 0, bitmap, leave */ { - /* inactive title bar */ - painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18); - painter->fg_color = self->wm->black; + return 0; } - xrdp_painter_draw_text(painter, self, 4, 4, self->caption1); - } - else if (self->type == WND_TYPE_SCREEN) /* 2 */ - { - if (self->wm->mm->mod != 0) - { - if (self->wm->mm->mod->mod_event != 0) - { - if (rect != 0) - { - x = rect->left; - y = rect->top; - w = rect->right - rect->left; - h = rect->bottom - rect->top; - if (check_bounds(self->wm->screen, &x, &y, &w, &h)) - { - self->wm->mm->mod->mod_event(self->wm->mm->mod, WM_INVALIDATE, - MAKELONG(y, x), MAKELONG(h, w), - 0, 0); - } - } - else - { - x = 0; - y = 0; - w = self->wm->screen->width; - h = self->wm->screen->height; - self->wm->mm->mod->mod_event(self->wm->mm->mod, WM_INVALIDATE, - MAKELONG(y, x), MAKELONG(h, w), - 0, 0); - } - } + + painter = xrdp_painter_create(self->wm, self->wm->session); + xrdp_painter_font_needed(painter); + painter->rop = 0xcc; /* copy */ + + if (rect == 0) + { + painter->use_clip = 0; } else { - painter->fg_color = self->bg_color; - xrdp_painter_fill_rect(painter, self, 0, 0, self->width, self->height); - } - } - else if (self->type == WND_TYPE_BUTTON) /* 3 */ - { - if (self->state == BUTTON_STATE_UP) /* 0 */ - { - xrdp_bitmap_draw_button(self, painter, 0, 0, - self->width, self->height, 0); - w = xrdp_painter_text_width(painter, self->caption1); - h = xrdp_painter_text_height(painter, self->caption1); - painter->fg_color = self->wm->black; - xrdp_painter_draw_text(painter, self, self->width / 2 - w / 2, - self->height / 2 - h / 2, self->caption1); - if (self->parent != 0) - { - if (self->wm->focused_window == self->parent) + if (ISRECTEMPTY(*rect)) { - if (self->parent->focused_control == self) - { - xrdp_bitmap_draw_focus_box(self, painter, 4, 4, self->width - 8, - self->height - 8); - } + xrdp_painter_delete(painter); + return 0; } - } - } - else if (self->state == BUTTON_STATE_DOWN) /* 1 */ - { - xrdp_bitmap_draw_button(self, painter, 0, 0, - self->width, self->height, 1); - w = xrdp_painter_text_width(painter, self->caption1); - h = xrdp_painter_text_height(painter, self->caption1); - painter->fg_color = self->wm->black; - xrdp_painter_draw_text(painter, self, (self->width / 2 - w / 2) + 1, - (self->height / 2 - h / 2) + 1, self->caption1); - if (self->parent != 0) - if (self->wm->focused_window == self->parent) - if (self->parent->focused_control == self) - xrdp_bitmap_draw_focus_box(self, painter, 4, 4, self->width - 8, - self->height - 8); - } - } - else if (self->type == WND_TYPE_IMAGE) /* 4 */ - { - xrdp_painter_copy(painter, self, self, 0, 0, self->width, - self->height, 0, 0); - } - else if (self->type == WND_TYPE_EDIT) /* 5 */ - { - /* draw gray box */ - painter->fg_color = self->wm->grey; - xrdp_painter_fill_rect(painter, self, 0, 0, self->width, self->height); - /* main white background */ - painter->fg_color = self->wm->white; - xrdp_painter_fill_rect(painter, self, 1, 1, self->width - 3, - self->height - 3); - /* dark grey top line */ - painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, 0, 0, self->width, 1); - /* dark grey left line */ - painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, 0, 0, 1, self->height); - /* white bottom line */ - painter->fg_color = self->wm->white; - xrdp_painter_fill_rect(painter, self, 0, self->height- 1, self->width, 1); - /* white right line */ - painter->fg_color = self->wm->white; - xrdp_painter_fill_rect(painter, self, self->width - 1, 0, 1, self->height); - /* black left line */ - painter->fg_color = self->wm->black; - xrdp_painter_fill_rect(painter, self, 1, 1, 1, self->height - 3); - /* black top line */ - painter->fg_color = self->wm->black; - xrdp_painter_fill_rect(painter, self, 1, 1, self->width - 3, 1); - /* draw text */ - painter->fg_color = self->wm->black; - if (self->password_char != 0) - { - i = g_mbstowcs(0, self->caption1, 0); - g_memset(text, self->password_char, i); - text[i] = 0; - xrdp_painter_draw_text(painter, self, 4, 2, text); - } - else - { - xrdp_painter_draw_text(painter, self, 4, 2, self->caption1); + + painter->clip = *rect; + painter->use_clip = &painter->clip; } - /* draw xor box(cursor) */ - if (self->parent != 0) + + xrdp_painter_begin_update(painter); + + if (self->type == WND_TYPE_WND) /* 1 */ { - if (self->parent->focused_control == self) - { - if (self->password_char != 0) + /* draw grey background */ + painter->fg_color = self->bg_color; + xrdp_painter_fill_rect(painter, self, 0, 0, self->width, self->height); + /* top white line */ + painter->fg_color = self->wm->white; + xrdp_painter_fill_rect(painter, self, 1, 1, self->width - 2, 1); + /* left white line */ + painter->fg_color = self->wm->white; + xrdp_painter_fill_rect(painter, self, 1, 1, 1, self->height - 2); + /* bottom dark grey line */ + painter->fg_color = self->wm->dark_grey; + xrdp_painter_fill_rect(painter, self, 1, self->height - 2, + self->width - 2, 1); + /* right dark grey line */ + painter->fg_color = self->wm->dark_grey; + xrdp_painter_fill_rect(painter, self, self->width - 2, 1, 1, + self->height - 2); + /* bottom black line */ + painter->fg_color = self->wm->black; + xrdp_painter_fill_rect(painter, self, 0, self->height - 1, + self->width, 1); + /* right black line */ + painter->fg_color = self->wm->black; + xrdp_painter_fill_rect(painter, self, self->width - 1, 0, + 1, self->height); + + if (self->wm->focused_window == self) { - wchar_repeat(wtext, 255, self->password_char, self->edit_pos); - wtext[self->edit_pos] = 0; - g_wcstombs(text, wtext, 255); + /* active title bar */ + painter->fg_color = self->wm->blue; + xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18); + painter->fg_color = self->wm->white; } else { - g_mbstowcs(wtext, self->caption1, 255); - wtext[self->edit_pos] = 0; - g_wcstombs(text, wtext, 255); + /* inactive title bar */ + painter->fg_color = self->wm->dark_grey; + xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18); + painter->fg_color = self->wm->black; } - w = xrdp_painter_text_width(painter, text); - painter->fg_color = self->wm->white; - painter->rop = 0x5a; - xrdp_painter_fill_rect(painter, self, 4 + w, 3, 2, self->height - 6); - } + + xrdp_painter_draw_text(painter, self, 4, 4, self->caption1); } - /* reset rop back */ - painter->rop = 0xcc; - } - else if (self->type == WND_TYPE_LABEL) /* 6 */ - { - painter->fg_color = self->wm->black; - xrdp_painter_draw_text(painter, self, 0, 0, self->caption1); - } - else if (self->type == WND_TYPE_COMBO) /* 7 combo box */ - { - /* draw gray box */ - painter->fg_color = self->wm->grey; - xrdp_painter_fill_rect(painter, self, 0, 0, self->width, self->height); - /* white background */ - painter->fg_color = self->wm->white; - xrdp_painter_fill_rect(painter, self, 1, 1, self->width - 3, - self->height - 3); - if (self->parent->focused_control == self) - { - painter->fg_color = self->wm->dark_blue; - xrdp_painter_fill_rect(painter, self, 3, 3, (self->width - 6) - 18, - self->height - 5); - } - /* dark grey top line */ - painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, 0, 0, self->width, 1); - /* dark grey left line */ - painter->fg_color = self->wm->dark_grey; - xrdp_painter_fill_rect(painter, self, 0, 0, 1, self->height); - /* white bottom line */ - painter->fg_color = self->wm->white; - xrdp_painter_fill_rect(painter, self, 0, self->height- 1, self->width, 1); - /* white right line */ - painter->fg_color = self->wm->white; - xrdp_painter_fill_rect(painter, self, self->width - 1, 0, 1, self->height); - /* black left line */ - painter->fg_color = self->wm->black; - xrdp_painter_fill_rect(painter, self, 1, 1, 1, self->height - 3); - /* black top line */ - painter->fg_color = self->wm->black; - xrdp_painter_fill_rect(painter, self, 1, 1, self->width - 3, 1); - /* draw text */ - if (self->parent->focused_control == self) + else if (self->type == WND_TYPE_SCREEN) /* 2 */ { - painter->fg_color = self->wm->white; + if (self->wm->mm->mod != 0) + { + if (self->wm->mm->mod->mod_event != 0) + { + if (rect != 0) + { + x = rect->left; + y = rect->top; + w = rect->right - rect->left; + h = rect->bottom - rect->top; + + if (check_bounds(self->wm->screen, &x, &y, &w, &h)) + { + self->wm->mm->mod->mod_event(self->wm->mm->mod, WM_INVALIDATE, + MAKELONG(y, x), MAKELONG(h, w), + 0, 0); + } + } + else + { + x = 0; + y = 0; + w = self->wm->screen->width; + h = self->wm->screen->height; + self->wm->mm->mod->mod_event(self->wm->mm->mod, WM_INVALIDATE, + MAKELONG(y, x), MAKELONG(h, w), + 0, 0); + } + } + } + else + { + painter->fg_color = self->bg_color; + xrdp_painter_fill_rect(painter, self, 0, 0, self->width, self->height); + } } - else + else if (self->type == WND_TYPE_BUTTON) /* 3 */ { - painter->fg_color = self->wm->black; + if (self->state == BUTTON_STATE_UP) /* 0 */ + { + xrdp_bitmap_draw_button(self, painter, 0, 0, + self->width, self->height, 0); + w = xrdp_painter_text_width(painter, self->caption1); + h = xrdp_painter_text_height(painter, self->caption1); + painter->fg_color = self->wm->black; + xrdp_painter_draw_text(painter, self, self->width / 2 - w / 2, + self->height / 2 - h / 2, self->caption1); + + if (self->parent != 0) + { + if (self->wm->focused_window == self->parent) + { + if (self->parent->focused_control == self) + { + xrdp_bitmap_draw_focus_box(self, painter, 4, 4, self->width - 8, + self->height - 8); + } + } + } + } + else if (self->state == BUTTON_STATE_DOWN) /* 1 */ + { + xrdp_bitmap_draw_button(self, painter, 0, 0, + self->width, self->height, 1); + w = xrdp_painter_text_width(painter, self->caption1); + h = xrdp_painter_text_height(painter, self->caption1); + painter->fg_color = self->wm->black; + xrdp_painter_draw_text(painter, self, (self->width / 2 - w / 2) + 1, + (self->height / 2 - h / 2) + 1, self->caption1); + + if (self->parent != 0) + if (self->wm->focused_window == self->parent) + if (self->parent->focused_control == self) + xrdp_bitmap_draw_focus_box(self, painter, 4, 4, self->width - 8, + self->height - 8); + } } - xrdp_painter_draw_text(painter, self, 4, 2, - (char*)list_get_item(self->string_list, self->item_index)); - /* draw button on right */ - x = self->width - 20; - y = 2; - w = (self->width - x) - 2; - h = self->height - 4; - /* looks better with a background around */ - painter->fg_color = self->wm->grey; - xrdp_painter_fill_rect(painter, self, x, y, w, h); - if (self->state == BUTTON_STATE_UP) /* 0 */ + else if (self->type == WND_TYPE_IMAGE) /* 4 */ { - xrdp_bitmap_draw_button(self, painter, x+1, y+1, w-1, h-1, 0); + xrdp_painter_copy(painter, self, self, 0, 0, self->width, + self->height, 0, 0); } - else + else if (self->type == WND_TYPE_EDIT) /* 5 */ { - xrdp_bitmap_draw_button(self, painter, x+1, y+1, w-1, h-1, 1); - } - /* draw the arrow */ - w = w / 2; - x = x + (w / 2) + 1; - h = (h / 2) + 2; - y = y + (h / 2) + 1; - painter->fg_color = self->wm->black; - for (i=w; i>0; i=i-2) - { - xrdp_painter_fill_rect(painter, self, x, y, i, 1); - y++; - x = x + 1; - } - } - else if (self->type == WND_TYPE_SPECIAL) /* 8 special */ - { - if (self->popped_from != 0) - { - /* change height if there are too many items in the list */ - i = xrdp_painter_text_height(painter, "W"); - i = self->popped_from->string_list->count * i; - if (i > self->height) - { - self->height = i; - } - } - painter->fg_color = self->wm->white; - xrdp_painter_fill_rect(painter, self, 0, 0, self->width, self->height); - /* draw the list items */ - if (self->popped_from != 0) - { - y = 0; - for (i = 0; i < self->popped_from->string_list->count; i++) - { - p = (char*)list_get_item(self->popped_from->string_list, i); - h = xrdp_painter_text_height(painter, p); - self->item_height = h; - if (i == self->item_index) + /* draw gray box */ + painter->fg_color = self->wm->grey; + xrdp_painter_fill_rect(painter, self, 0, 0, self->width, self->height); + /* main white background */ + painter->fg_color = self->wm->white; + xrdp_painter_fill_rect(painter, self, 1, 1, self->width - 3, + self->height - 3); + /* dark grey top line */ + painter->fg_color = self->wm->dark_grey; + xrdp_painter_fill_rect(painter, self, 0, 0, self->width, 1); + /* dark grey left line */ + painter->fg_color = self->wm->dark_grey; + xrdp_painter_fill_rect(painter, self, 0, 0, 1, self->height); + /* white bottom line */ + painter->fg_color = self->wm->white; + xrdp_painter_fill_rect(painter, self, 0, self->height - 1, self->width, 1); + /* white right line */ + painter->fg_color = self->wm->white; + xrdp_painter_fill_rect(painter, self, self->width - 1, 0, 1, self->height); + /* black left line */ + painter->fg_color = self->wm->black; + xrdp_painter_fill_rect(painter, self, 1, 1, 1, self->height - 3); + /* black top line */ + painter->fg_color = self->wm->black; + xrdp_painter_fill_rect(painter, self, 1, 1, self->width - 3, 1); + /* draw text */ + painter->fg_color = self->wm->black; + + if (self->password_char != 0) { - painter->fg_color = self->wm->blue; - xrdp_painter_fill_rect(painter, self, 0, y, self->width, h); - painter->fg_color = self->wm->white; + i = g_mbstowcs(0, self->caption1, 0); + g_memset(text, self->password_char, i); + text[i] = 0; + xrdp_painter_draw_text(painter, self, 4, 2, text); } else { - painter->fg_color = self->wm->black; + xrdp_painter_draw_text(painter, self, 4, 2, self->caption1); } - xrdp_painter_draw_text(painter, self, 2, y, p); - y = y + h; - } - } - } - /* notify */ - if (self->notify != 0) - { - self->notify(self, self, WM_PAINT, (long)painter, 0); /* 3 */ - } - /* draw any child windows in the area */ - for (i = 0; i < self->child_list->count; i++) - { - b = (struct xrdp_bitmap*)list_get_item(self->child_list, i); - if (rect == 0) + + /* draw xor box(cursor) */ + if (self->parent != 0) + { + if (self->parent->focused_control == self) + { + if (self->password_char != 0) + { + wchar_repeat(wtext, 255, self->password_char, self->edit_pos); + wtext[self->edit_pos] = 0; + g_wcstombs(text, wtext, 255); + } + else + { + g_mbstowcs(wtext, self->caption1, 255); + wtext[self->edit_pos] = 0; + g_wcstombs(text, wtext, 255); + } + + w = xrdp_painter_text_width(painter, text); + painter->fg_color = self->wm->white; + painter->rop = 0x5a; + xrdp_painter_fill_rect(painter, self, 4 + w, 3, 2, self->height - 6); + } + } + + /* reset rop back */ + painter->rop = 0xcc; + } + else if (self->type == WND_TYPE_LABEL) /* 6 */ { - xrdp_bitmap_invalidate(b, 0); + painter->fg_color = self->wm->black; + xrdp_painter_draw_text(painter, self, 0, 0, self->caption1); } - else + else if (self->type == WND_TYPE_COMBO) /* 7 combo box */ { - MAKERECT(r1, b->left, b->top, b->width, b->height); - if (rect_intersect(rect, &r1, &r2)) - { - RECTOFFSET(r2, -(b->left), -(b->top)); - xrdp_bitmap_invalidate(b, &r2); - } - } - } - xrdp_painter_end_update(painter); - xrdp_painter_delete(painter); - return 0; -} + /* draw gray box */ + painter->fg_color = self->wm->grey; + xrdp_painter_fill_rect(painter, self, 0, 0, self->width, self->height); + /* white background */ + painter->fg_color = self->wm->white; + xrdp_painter_fill_rect(painter, self, 1, 1, self->width - 3, + self->height - 3); -/*****************************************************************************/ -/* returns error */ -int APP_CC -xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg, - int param1, int param2) -{ - twchar c; - int n; - int i; - int shift; - int ext; - int scan_code; - int num_bytes; - int num_chars; - struct xrdp_bitmap* b; - struct xrdp_bitmap* focus_out_control; - - if (self == 0) - { - return 0; - } - if (self->wm == 0) - { - return 0; - } - if (self->type == WND_TYPE_WND) - { - if (msg == WM_KEYDOWN) - { - scan_code = param1 % 128; - if (scan_code == 15) /* tab */ - { - /* move to next tab stop */ - shift = self->wm->keys[42] || self->wm->keys[54]; - i = -1; - if (self->child_list != 0) + if (self->parent->focused_control == self) { - i = list_index_of(self->child_list, (long)self->focused_control); + painter->fg_color = self->wm->dark_blue; + xrdp_painter_fill_rect(painter, self, 3, 3, (self->width - 6) - 18, + self->height - 5); } - if (shift) + + /* dark grey top line */ + painter->fg_color = self->wm->dark_grey; + xrdp_painter_fill_rect(painter, self, 0, 0, self->width, 1); + /* dark grey left line */ + painter->fg_color = self->wm->dark_grey; + xrdp_painter_fill_rect(painter, self, 0, 0, 1, self->height); + /* white bottom line */ + painter->fg_color = self->wm->white; + xrdp_painter_fill_rect(painter, self, 0, self->height - 1, self->width, 1); + /* white right line */ + painter->fg_color = self->wm->white; + xrdp_painter_fill_rect(painter, self, self->width - 1, 0, 1, self->height); + /* black left line */ + painter->fg_color = self->wm->black; + xrdp_painter_fill_rect(painter, self, 1, 1, 1, self->height - 3); + /* black top line */ + painter->fg_color = self->wm->black; + xrdp_painter_fill_rect(painter, self, 1, 1, self->width - 3, 1); + + /* draw text */ + if (self->parent->focused_control == self) { - i--; - if (i < 0) - { - i = self->child_list->count - 1; - } + painter->fg_color = self->wm->white; } else { - i++; - if (i >= self->child_list->count) - { - i = 0; - } + painter->fg_color = self->wm->black; } - n = self->child_list->count; - b = (struct xrdp_bitmap*)list_get_item(self->child_list, i); - while (b != self->focused_control && b != 0 && n > 0) + + xrdp_painter_draw_text(painter, self, 4, 2, + (char *)list_get_item(self->string_list, self->item_index)); + /* draw button on right */ + x = self->width - 20; + y = 2; + w = (self->width - x) - 2; + h = self->height - 4; + /* looks better with a background around */ + painter->fg_color = self->wm->grey; + xrdp_painter_fill_rect(painter, self, x, y, w, h); + + if (self->state == BUTTON_STATE_UP) /* 0 */ { - n--; - if (b->tab_stop) - { - focus_out_control = self->focused_control; - self->focused_control = b; - xrdp_bitmap_invalidate(focus_out_control, 0); - xrdp_bitmap_invalidate(b, 0); - break; - } - if (shift) - { - i--; - if (i < 0) - { - i = self->child_list->count - 1; - } - } - else - { - i++; - if (i >= self->child_list->count) - { - i = 0; - } - } - b = (struct xrdp_bitmap*)list_get_item(self->child_list, i); + xrdp_bitmap_draw_button(self, painter, x + 1, y + 1, w - 1, h - 1, 0); } - } - else if (scan_code == 28) /* enter */ - { - if (self->default_button != 0) + else { - if (self->notify != 0) - { - /* I think this should use def_proc */ - self->notify(self, self->default_button, 1, 0, 0); - return 0; - } + xrdp_bitmap_draw_button(self, painter, x + 1, y + 1, w - 1, h - 1, 1); } - } - else if (scan_code == 1) /* esc */ - { - if (self->esc_button != 0) + + /* draw the arrow */ + w = w / 2; + x = x + (w / 2) + 1; + h = (h / 2) + 2; + y = y + (h / 2) + 1; + painter->fg_color = self->wm->black; + + for (i = w; i > 0; i = i - 2) { - if (self->notify != 0) - { - /* I think this should use def_proc */ - self->notify(self, self->esc_button, 1, 0, 0); - return 0; - } + xrdp_painter_fill_rect(painter, self, x, y, i, 1); + y++; + x = x + 1; } - } } - if (self->focused_control != 0) + else if (self->type == WND_TYPE_SPECIAL) /* 8 special */ { - xrdp_bitmap_def_proc(self->focused_control, msg, param1, param2); - } - } - else if (self->type == WND_TYPE_EDIT) - { - if (msg == WM_KEYDOWN) - { - scan_code = param1 % 128; - ext = param2 & 0x0100; - /* left or up arrow */ - if ((scan_code == 75 || scan_code == 72) && - (ext || self->wm->num_lock == 0)) - { - if (self->edit_pos > 0) + if (self->popped_from != 0) { - self->edit_pos--; - xrdp_bitmap_invalidate(self, 0); - } - } - /* right or down arrow */ - else if ((scan_code == 77 || scan_code == 80) && - (ext || self->wm->num_lock == 0)) - { - if (self->edit_pos < g_mbstowcs(0, self->caption1, 0)) - { - self->edit_pos++; - xrdp_bitmap_invalidate(self, 0); - } - } - /* backspace */ - else if (scan_code == 14) - { - n = g_mbstowcs(0, self->caption1, 0); - if (n > 0) - { - if (self->edit_pos > 0) - { - self->edit_pos--; - remove_char_at(self->caption1, 255, self->edit_pos); - xrdp_bitmap_invalidate(self, 0); - } + /* change height if there are too many items in the list */ + i = xrdp_painter_text_height(painter, "W"); + i = self->popped_from->string_list->count * i; + + if (i > self->height) + { + self->height = i; + } } - } - /* delete */ - else if (scan_code == 83 && - (ext || self->wm->num_lock == 0)) - { - n = g_mbstowcs(0, self->caption1, 0); - if (n > 0) + + painter->fg_color = self->wm->white; + xrdp_painter_fill_rect(painter, self, 0, 0, self->width, self->height); + + /* draw the list items */ + if (self->popped_from != 0) { - if (self->edit_pos < n) - { - remove_char_at(self->caption1, 255, self->edit_pos); - xrdp_bitmap_invalidate(self, 0); - } + y = 0; + + for (i = 0; i < self->popped_from->string_list->count; i++) + { + p = (char *)list_get_item(self->popped_from->string_list, i); + h = xrdp_painter_text_height(painter, p); + self->item_height = h; + + if (i == self->item_index) + { + painter->fg_color = self->wm->blue; + xrdp_painter_fill_rect(painter, self, 0, y, self->width, h); + painter->fg_color = self->wm->white; + } + else + { + painter->fg_color = self->wm->black; + } + + xrdp_painter_draw_text(painter, self, 2, y, p); + y = y + h; + } } - } - /* end */ - else if (scan_code == 79 && - (ext || self->wm->num_lock == 0)) - { - n = g_mbstowcs(0, self->caption1, 0); - if (self->edit_pos < n) + } + + /* notify */ + if (self->notify != 0) + { + self->notify(self, self, WM_PAINT, (long)painter, 0); /* 3 */ + } + + /* draw any child windows in the area */ + for (i = 0; i < self->child_list->count; i++) + { + b = (struct xrdp_bitmap *)list_get_item(self->child_list, i); + + if (rect == 0) { - self->edit_pos = n; - xrdp_bitmap_invalidate(self, 0); + xrdp_bitmap_invalidate(b, 0); } - } - /* home */ - else if ((scan_code == 71) && - (ext || (self->wm->num_lock == 0))) - { - if (self->edit_pos > 0) + else { - self->edit_pos = 0; - xrdp_bitmap_invalidate(self, 0); + MAKERECT(r1, b->left, b->top, b->width, b->height); + + if (rect_intersect(rect, &r1, &r2)) + { + RECTOFFSET(r2, -(b->left), -(b->top)); + xrdp_bitmap_invalidate(b, &r2); + } } - } - else - { - c = get_char_from_scan_code - (param2, scan_code, self->wm->keys, self->wm->caps_lock, - self->wm->num_lock, self->wm->scroll_lock, - &(self->wm->keymap)); - num_chars = g_mbstowcs(0, self->caption1, 0); - num_bytes = g_strlen(self->caption1); - if ((c >= 32) && (num_chars < 127) && (num_bytes < 250)) + } + + xrdp_painter_end_update(painter); + xrdp_painter_delete(painter); + return 0; +} + +/*****************************************************************************/ +/* returns error */ +int APP_CC +xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg, + int param1, int param2) +{ + twchar c; + int n; + int i; + int shift; + int ext; + int scan_code; + int num_bytes; + int num_chars; + struct xrdp_bitmap *b; + struct xrdp_bitmap *focus_out_control; + + if (self == 0) + { + return 0; + } + + if (self->wm == 0) + { + return 0; + } + + if (self->type == WND_TYPE_WND) + { + if (msg == WM_KEYDOWN) { - add_char_at(self->caption1, 255, c, self->edit_pos); - self->edit_pos++; - xrdp_bitmap_invalidate(self, 0); + scan_code = param1 % 128; + + if (scan_code == 15) /* tab */ + { + /* move to next tab stop */ + shift = self->wm->keys[42] || self->wm->keys[54]; + i = -1; + + if (self->child_list != 0) + { + i = list_index_of(self->child_list, (long)self->focused_control); + } + + if (shift) + { + i--; + + if (i < 0) + { + i = self->child_list->count - 1; + } + } + else + { + i++; + + if (i >= self->child_list->count) + { + i = 0; + } + } + + n = self->child_list->count; + b = (struct xrdp_bitmap *)list_get_item(self->child_list, i); + + while (b != self->focused_control && b != 0 && n > 0) + { + n--; + + if (b->tab_stop) + { + focus_out_control = self->focused_control; + self->focused_control = b; + xrdp_bitmap_invalidate(focus_out_control, 0); + xrdp_bitmap_invalidate(b, 0); + break; + } + + if (shift) + { + i--; + + if (i < 0) + { + i = self->child_list->count - 1; + } + } + else + { + i++; + + if (i >= self->child_list->count) + { + i = 0; + } + } + + b = (struct xrdp_bitmap *)list_get_item(self->child_list, i); + } + } + else if (scan_code == 28) /* enter */ + { + if (self->default_button != 0) + { + if (self->notify != 0) + { + /* I think this should use def_proc */ + self->notify(self, self->default_button, 1, 0, 0); + return 0; + } + } + } + else if (scan_code == 1) /* esc */ + { + if (self->esc_button != 0) + { + if (self->notify != 0) + { + /* I think this should use def_proc */ + self->notify(self, self->esc_button, 1, 0, 0); + return 0; + } + } + } } - } - } - } - else if (self->type == WND_TYPE_COMBO) - { - if (msg == WM_KEYDOWN) - { - scan_code = param1 % 128; - ext = param2 & 0x0100; - /* left or up arrow */ - if (((scan_code == 75) || (scan_code == 72)) && - (ext || (self->wm->num_lock == 0))) - { - if (self->item_index > 0) + + if (self->focused_control != 0) { - self->item_index--; - xrdp_bitmap_invalidate(self, 0); - if (self->parent->notify != 0) - { - self->parent->notify(self->parent, self, CB_ITEMCHANGE, 0, 0); - } + xrdp_bitmap_def_proc(self->focused_control, msg, param1, param2); } - } - /* right or down arrow */ - else if ((scan_code == 77 || scan_code == 80) && - (ext || self->wm->num_lock == 0)) - { - if ((self->item_index + 1) < self->string_list->count) + } + else if (self->type == WND_TYPE_EDIT) + { + if (msg == WM_KEYDOWN) { - self->item_index++; - xrdp_bitmap_invalidate(self, 0); - if (self->parent->notify != 0) - { - self->parent->notify(self->parent, self, CB_ITEMCHANGE, 0, 0); - } + scan_code = param1 % 128; + ext = param2 & 0x0100; + + /* left or up arrow */ + if ((scan_code == 75 || scan_code == 72) && + (ext || self->wm->num_lock == 0)) + { + if (self->edit_pos > 0) + { + self->edit_pos--; + xrdp_bitmap_invalidate(self, 0); + } + } + /* right or down arrow */ + else if ((scan_code == 77 || scan_code == 80) && + (ext || self->wm->num_lock == 0)) + { + if (self->edit_pos < g_mbstowcs(0, self->caption1, 0)) + { + self->edit_pos++; + xrdp_bitmap_invalidate(self, 0); + } + } + /* backspace */ + else if (scan_code == 14) + { + n = g_mbstowcs(0, self->caption1, 0); + + if (n > 0) + { + if (self->edit_pos > 0) + { + self->edit_pos--; + remove_char_at(self->caption1, 255, self->edit_pos); + xrdp_bitmap_invalidate(self, 0); + } + } + } + /* delete */ + else if (scan_code == 83 && + (ext || self->wm->num_lock == 0)) + { + n = g_mbstowcs(0, self->caption1, 0); + + if (n > 0) + { + if (self->edit_pos < n) + { + remove_char_at(self->caption1, 255, self->edit_pos); + xrdp_bitmap_invalidate(self, 0); + } + } + } + /* end */ + else if (scan_code == 79 && + (ext || self->wm->num_lock == 0)) + { + n = g_mbstowcs(0, self->caption1, 0); + + if (self->edit_pos < n) + { + self->edit_pos = n; + xrdp_bitmap_invalidate(self, 0); + } + } + /* home */ + else if ((scan_code == 71) && + (ext || (self->wm->num_lock == 0))) + { + if (self->edit_pos > 0) + { + self->edit_pos = 0; + xrdp_bitmap_invalidate(self, 0); + } + } + else + { + c = get_char_from_scan_code + (param2, scan_code, self->wm->keys, self->wm->caps_lock, + self->wm->num_lock, self->wm->scroll_lock, + &(self->wm->keymap)); + num_chars = g_mbstowcs(0, self->caption1, 0); + num_bytes = g_strlen(self->caption1); + + if ((c >= 32) && (num_chars < 127) && (num_bytes < 250)) + { + add_char_at(self->caption1, 255, c, self->edit_pos); + self->edit_pos++; + xrdp_bitmap_invalidate(self, 0); + } + } } - } - } - } - else if (self->type == WND_TYPE_SPECIAL) - { - if (msg == WM_MOUSEMOVE) - { - if (self->item_height > 0 && self->popped_from != 0) - { - i = param2; - i = i / self->item_height; - if (i != self->item_index && - i < self->popped_from->string_list->count) + } + else if (self->type == WND_TYPE_COMBO) + { + if (msg == WM_KEYDOWN) { - self->item_index = i; - xrdp_bitmap_invalidate(self, 0); + scan_code = param1 % 128; + ext = param2 & 0x0100; + + /* left or up arrow */ + if (((scan_code == 75) || (scan_code == 72)) && + (ext || (self->wm->num_lock == 0))) + { + if (self->item_index > 0) + { + self->item_index--; + xrdp_bitmap_invalidate(self, 0); + + if (self->parent->notify != 0) + { + self->parent->notify(self->parent, self, CB_ITEMCHANGE, 0, 0); + } + } + } + /* right or down arrow */ + else if ((scan_code == 77 || scan_code == 80) && + (ext || self->wm->num_lock == 0)) + { + if ((self->item_index + 1) < self->string_list->count) + { + self->item_index++; + xrdp_bitmap_invalidate(self, 0); + + if (self->parent->notify != 0) + { + self->parent->notify(self->parent, self, CB_ITEMCHANGE, 0, 0); + } + } + } } - } } - else if (msg == WM_LBUTTONUP) + else if (self->type == WND_TYPE_SPECIAL) { - if (self->popped_from != 0) - { - self->popped_from->item_index = self->item_index; - xrdp_bitmap_invalidate(self->popped_from, 0); - if (self->popped_from->parent->notify != 0) + if (msg == WM_MOUSEMOVE) { - self->popped_from->parent->notify(self->popped_from->parent, - self->popped_from, - CB_ITEMCHANGE, 0, 0); + if (self->item_height > 0 && self->popped_from != 0) + { + i = param2; + i = i / self->item_height; + + if (i != self->item_index && + i < self->popped_from->string_list->count) + { + self->item_index = i; + xrdp_bitmap_invalidate(self, 0); + } + } + } + else if (msg == WM_LBUTTONUP) + { + if (self->popped_from != 0) + { + self->popped_from->item_index = self->item_index; + xrdp_bitmap_invalidate(self->popped_from, 0); + + if (self->popped_from->parent->notify != 0) + { + self->popped_from->parent->notify(self->popped_from->parent, + self->popped_from, + CB_ITEMCHANGE, 0, 0); + } + } } - } } - } - return 0; + + return 0; } /*****************************************************************************/ /* convert the controls coords to screen coords */ int APP_CC -xrdp_bitmap_to_screenx(struct xrdp_bitmap* self, int x) +xrdp_bitmap_to_screenx(struct xrdp_bitmap *self, int x) { - int i; - - i = x; - while (self != 0) - { - i = i + self->left; - self = self->parent; - } - return i; + int i; + + i = x; + + while (self != 0) + { + i = i + self->left; + self = self->parent; + } + + return i; } /*****************************************************************************/ /* convert the controls coords to screen coords */ int APP_CC -xrdp_bitmap_to_screeny(struct xrdp_bitmap* self, int y) +xrdp_bitmap_to_screeny(struct xrdp_bitmap *self, int y) { - int i; - - i = y; - while (self != 0) - { - i = i + self->top; - self = self->parent; - } - return i; + int i; + + i = y; + + while (self != 0) + { + i = i + self->top; + self = self->parent; + } + + return i; } /*****************************************************************************/ /* convert the screen coords to controls coords */ int APP_CC -xrdp_bitmap_from_screenx(struct xrdp_bitmap* self, int x) +xrdp_bitmap_from_screenx(struct xrdp_bitmap *self, int x) { - int i; - - i = x; - while (self != 0) - { - i = i - self->left; - self = self->parent; - } - return i; + int i; + + i = x; + + while (self != 0) + { + i = i - self->left; + self = self->parent; + } + + return i; } /*****************************************************************************/ /* convert the screen coords to controls coords */ int APP_CC -xrdp_bitmap_from_screeny(struct xrdp_bitmap* self, int y) +xrdp_bitmap_from_screeny(struct xrdp_bitmap *self, int y) { - int i; - - i = y; - while (self != 0) - { - i = i - self->top; - self = self->parent; - } - return i; + int i; + + i = y; + + while (self != 0) + { + i = i - self->top; + self = self->parent; + } + + return i; } /*****************************************************************************/ int APP_CC -xrdp_bitmap_get_screen_clip(struct xrdp_bitmap* self, - struct xrdp_painter* painter, - struct xrdp_rect* rect, - int* dx, int* dy) +xrdp_bitmap_get_screen_clip(struct xrdp_bitmap *self, + struct xrdp_painter *painter, + struct xrdp_rect *rect, + int *dx, int *dy) { - int ldx; - int ldy; - - if (painter->use_clip) - { - *rect = painter->clip; - } - else - { - rect->left = 0; - rect->top = 0; - rect->right = self->width; - rect->bottom = self->height; - } - ldx = xrdp_bitmap_to_screenx(self, 0); - ldy = xrdp_bitmap_to_screeny(self, 0); - rect->left += ldx; - rect->top += ldy; - rect->right += ldx; - rect->bottom += ldy; - if (dx != 0) - { - *dx = ldx; - } - if (dy != 0) - { - *dy = ldy; - } - return 0; + int ldx; + int ldy; + + if (painter->use_clip) + { + *rect = painter->clip; + } + else + { + rect->left = 0; + rect->top = 0; + rect->right = self->width; + rect->bottom = self->height; + } + + ldx = xrdp_bitmap_to_screenx(self, 0); + ldy = xrdp_bitmap_to_screeny(self, 0); + rect->left += ldx; + rect->top += ldy; + rect->right += ldx; + rect->bottom += ldy; + + if (dx != 0) + { + *dx = ldx; + } + + if (dy != 0) + { + *dy = ldy; + } + + return 0; } |
