Canola  0.8.D001
lib/image/overlay_pixel.cc
Go to the documentation of this file.
00001 //
00002 // canola - canon canola 1614p emulator
00003 // Copyright (C) 2011 Peter Miller
00004 //
00005 // This program is free software; you can redistribute it and/or modify
00006 // it under the terms of the GNU General Public License, version 3, as
00007 // published by the Free Software Foundation.
00008 //
00009 // This program is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 // General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU General Public License along
00015 // with this program. If not, see <http://www.gnu.org/licenses/>.
00016 //
00017 
00018 #include <lib/image.h>
00019 
00020 
00021 void
00022 image::overlay_pixel(int x, int y)
00023 {
00024     overlay_pixel(x, y, pen_clr);
00025 }
00026 
00027 
00028 void
00029 image::overlay_pixel(int x, int y, const icon_pixel &p1)
00030 {
00031     if (p1.is_transparent())
00032         return;
00033     if (p1.is_opaque())
00034     {
00035         set_pixel(x, y, p1);
00036     }
00037     else
00038     {
00039         icon_pixel p0;
00040         get_pixel(x, y, p0);
00041         if (p0.is_transparent())
00042         {
00043             set_pixel(x, y, p1);
00044         }
00045         else
00046         {
00047             icon_pixel::real_type p1a = p1.get_alpha();
00048             icon_pixel::real_type aa = 1. - p1a;
00049             icon_pixel::real_type r =
00050                 p0.get_red() * aa + p1.get_red() * p1a;
00051             icon_pixel::real_type g =
00052                 p0.get_green() * aa + p1.get_green() * p1a;
00053             icon_pixel::real_type b =
00054                 p0.get_blue() * aa + p1.get_blue() * p1a;
00055             icon_pixel::real_type a =
00056                 p0.get_alpha() * aa + p1a;
00057             set_pixel(x, y, icon_pixel(r, g, b, a));
00058         }
00059     }
00060 }