Canola  0.8.D001
lib/image/average.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 icon_pixel
00022 image::average(void)
00023     const
00024 {
00025     double red_sum = 0;
00026     double green_sum = 0;
00027     double blue_sum = 0;
00028     double alpha_sum = 0;
00029     long n = 0;
00030     for (unsigned y = 0; y < get_height(); ++y)
00031     {
00032         for (unsigned x = 0; x < get_width(); ++x)
00033         {
00034             icon_pixel p;
00035             get_pixel(x, y, p);
00036             double a = p.get_alpha();
00037             red_sum += p.get_red() * a;
00038             green_sum += p.get_green() * a;
00039             blue_sum += p.get_blue() * a;
00040             alpha_sum += a;
00041             ++n;
00042         }
00043     }
00044     if (alpha_sum == 0)
00045         return icon_pixel();
00046     return
00047         icon_pixel
00048         (
00049             red_sum / alpha_sum,
00050             green_sum / alpha_sum,
00051             blue_sum / alpha_sum,
00052             alpha_sum / n
00053         );
00054 }