diff options
Diffstat (limited to 'client/windows/pixels_source.cpp')
-rw-r--r-- | client/windows/pixels_source.cpp | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/client/windows/pixels_source.cpp b/client/windows/pixels_source.cpp new file mode 100644 index 00000000..6d210f09 --- /dev/null +++ b/client/windows/pixels_source.cpp @@ -0,0 +1,108 @@ +/* + Copyright (C) 2009 Red Hat, Inc. + + 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, see <http://www.gnu.org/licenses/>. +*/ + +#include "common.h" +#include "pixels_source.h" +#include "pixels_source_p.h" +#include "platform_utils.h" +#include "threads.h" +#include "debug.h" + + +static Point get_bitmap_size(HDC dc) +{ + BITMAP bitmap_info; + Point size; + + GetObject(GetCurrentObject(dc, OBJ_BITMAP), sizeof(bitmap_info), &bitmap_info); + + size.x = bitmap_info.bmWidth; + size.y = bitmap_info.bmHeight; + return size; +} + +PixelsSource::PixelsSource() +{ + ASSERT(sizeof(_opaque) >= sizeof(PixelsSource_p)); + _origin.x = _origin.y = 0; + memset(_opaque, 0, sizeof(_opaque)); + PixelsSource_p* p_data = (PixelsSource_p*)_opaque; + p_data->_mutex = new Mutex(); +} + +PixelsSource::~PixelsSource() +{ + PixelsSource_p* p_data = (PixelsSource_p*)_opaque; + delete p_data->_mutex; +} + +struct ResImage_p { + PixelsSource_p source_p; + HBITMAP prev_bitmap; +}; + + +ImageFromRes::ImageFromRes(int res_id) +{ + AutoDC dc(create_compatible_dc()); + ((ResImage_p*)get_opaque())->prev_bitmap = (HBITMAP)SelectObject(dc.get(), + get_bitmap_res(res_id)); + ((ResImage_p*)get_opaque())->source_p.dc = dc.release(); +} + +ImageFromRes::~ImageFromRes() +{ + HDC dc = ((ResImage_p*)get_opaque())->source_p.dc; + if (dc) { + HGDIOBJ bitmap = SelectObject(dc, ((ResImage_p*)get_opaque())->prev_bitmap); + DeleteObject(bitmap); + DeleteDC(dc); + } +} + +Point ImageFromRes::get_size() +{ + ResImage_p* p_data = (ResImage_p*)get_opaque(); + Lock lock(*p_data->source_p._mutex); + return get_bitmap_size(p_data->source_p.dc); +} + +AlphaImageFromRes::AlphaImageFromRes(int res_id) +{ + AutoDC dc(create_compatible_dc()); + ((ResImage_p*)get_opaque())->prev_bitmap = (HBITMAP)SelectObject(dc.get(), + get_alpha_bitmap_res(res_id)); + ((ResImage_p*)get_opaque())->source_p.dc = dc.release(); +} + +AlphaImageFromRes::~AlphaImageFromRes() +{ + HDC dc = ((ResImage_p*)get_opaque())->source_p.dc; + if (dc) { + HGDIOBJ bitmap = SelectObject(dc, ((ResImage_p*)get_opaque())->prev_bitmap); + DeleteObject(bitmap); + DeleteDC(dc); + } +} + +Point AlphaImageFromRes::get_size() +{ + ResImage_p* p_data = (ResImage_p*)get_opaque(); + Lock lock(*p_data->source_p._mutex); + return get_bitmap_size(p_data->source_p.dc); +} + |