home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2002 April / pcpro0402.iso / essentials / graphics / Gimp / gimp-src-20001226.exe / src / gimp / plug-ins / common / sinus.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-08-28  |  68.2 KB  |  2,153 lines

  1. /*
  2.  * This is a plugin for the GIMP.
  3.  *
  4.  * Copyright (C) 1997 Xavier Bouchoux
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * (at your option) any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  19.  *
  20.  */
  21.  
  22. /*
  23.  * This plug-in produces sinus textures.
  24.  *
  25.  * Please send any patches or suggestions to me: Xavier.Bouchoux@ensimag.imag.fr.
  26.  */
  27.  
  28. /* Version 0.99 */
  29.  
  30. #ifdef HAVE_CONFIG_H
  31. #include "config.h"
  32. #endif
  33.  
  34. #include <stdio.h>
  35. #include <stdlib.h>
  36.  
  37. #include <gtk/gtk.h>
  38.  
  39. #include <libgimp/gimp.h>
  40. #include <libgimp/gimpui.h>
  41.  
  42. #include "libgimp/stdplugins-intl.h"
  43.  
  44. #define HEADER_PIXEL(data,pixel) {\
  45.   pixel[0] = header_data_cmap[(unsigned char)data[0]][0]; \
  46.   pixel[1] = header_data_cmap[(unsigned char)data[0]][1]; \
  47.   pixel[2] = header_data_cmap[(unsigned char)data[0]][2]; \
  48.   data ++; }
  49.  
  50. static char header_data_cmap[256][3] = {
  51.     {210,214,212},
  52.     {187,178,183},
  53.     {184,185,180},
  54.     {172,172,165},
  55.     {172,164,165},
  56.     {122, 96, 93},
  57.     { 88, 58, 46},
  58.     {109, 71, 58},
  59.     {108, 72, 71},
  60.     {109, 65, 60},
  61.     {127, 65, 63},
  62.     { 98, 66, 43},
  63.     {122, 71, 71},
  64.     {122,104, 99},
  65.     { 98, 81, 75},
  66.     {108, 81, 72},
  67.     { 89, 89, 81},
  68.     {122,113,111},
  69.     {136,140,132},
  70.     {158,149,150},
  71.     {159,157,153},
  72.     {122,118,116},
  73.     {112,105,103},
  74.     { 42, 44, 38},
  75.     { 58, 54, 44},
  76.     { 71, 58, 57},
  77.     { 52, 36, 37},
  78.     { 40, 21, 22},
  79.     { 37,  4,  4},
  80.     { 39, 12,  5},
  81.     { 56,  5,  4},
  82.     { 53, 27, 19},
  83.     { 57, 11,  4},
  84.     { 53, 20, 21},
  85.     { 53, 44, 41},
  86.     { 56, 53, 56},
  87.     {198,190,196},
  88.     { 26,  3,  4},
  89.     { 50, 62, 52},
  90.     { 42, 36, 34},
  91.     { 69, 12,  5},
  92.     { 25, 13,  4},
  93.     { 40, 28, 20},
  94.     { 82, 13,  6},
  95.     { 87, 20, 11},
  96.     {111, 63, 13},
  97.     {114, 72,  8},
  98.     { 72, 20,  8},
  99.     { 82,  6,  4},
  100.     { 73,  4,  4},
  101.     {113,110,104},
  102.     { 71, 44, 35},
  103.     { 89, 27, 11},
  104.     { 71, 27,  7},
  105.     {162,104, 12},
  106.     {159,110, 12},
  107.     { 66, 74, 68},
  108.     { 71, 28, 22},
  109.     { 98, 28, 12},
  110.     {170,116, 12},
  111.     {178,124, 12},
  112.     {194,150, 12},
  113.     { 98, 19, 12},
  114.     { 67, 37, 44},
  115.     { 70, 64, 66},
  116.     {147, 89, 12},
  117.     {169,124, 12},
  118.     {125, 64, 12},
  119.     {206,156, 12},
  120.     {161, 97, 12},
  121.     {190,132, 12},
  122.     {190,140, 12},
  123.     {181,116, 12},
  124.     { 87, 80, 75},
  125.     { 85, 72, 65},
  126.     {130,132,104},
  127.     {146,148,143},
  128.     { 68, 53, 55},
  129.     {102, 44, 11},
  130.     {210,166, 12},
  131.     {116, 58, 12},
  132.     {129, 71, 12},
  133.     { 87, 44, 10},
  134.     {118, 52, 13},
  135.     {101, 37, 19},
  136.     {205,148, 12},
  137.     { 70, 43,  6},
  138.     { 74, 70, 73},
  139.     {130, 79, 12},
  140.     {146,140,139},
  141.     {220,164, 12},
  142.     {108, 28, 12},
  143.     {109, 21, 12},
  144.     {111, 94, 79},
  145.     {122,124,116},
  146.     { 87, 53, 48},
  147.     { 86, 36, 10},
  148.     {116, 37, 13},
  149.     {124, 81, 77},
  150.     { 98, 72, 63},
  151.     { 89, 63, 39},
  152.     {123, 89, 84},
  153.     { 87, 65, 64},
  154.     {136,132,130},
  155.     {140, 70, 12},
  156.     {100, 52, 48},
  157.     {130,106, 95},
  158.     {130,118,120},
  159.     { 99, 44, 33},
  160.     {130, 54, 12},
  161.     { 95, 78, 57},
  162.     {132,113,115},
  163.     {131,124,119},
  164.     { 73, 20, 21},
  165.     {109, 87, 76},
  166.     {143, 80, 12},
  167.     {115, 44, 19},
  168.     {102, 58, 50},
  169.     {103, 53,  9},
  170.     {113, 97, 97},
  171.     { 58, 34,  4},
  172.     { 72, 79, 79},
  173.     { 66, 51, 44},
  174.     { 66, 62, 52},
  175.     {146, 95, 12},
  176.     { 52, 58, 53},
  177.     { 33,103,159},
  178.     { 18,142,235},
  179.     { 18,137,228},
  180.     { 34, 46,  4},
  181.     { 41, 89,139},
  182.     { 98, 90, 75},
  183.     { 34, 98,156},
  184.     { 98, 90, 60},
  185.     { 98, 94, 60},
  186.     { 43,110,156},
  187.     { 26,118,198},
  188.     { 30,112,190},
  189.     { 74, 88, 98},
  190.     { 25,122,196},
  191.     { 42,105,156},
  192.     { 50, 86,132},
  193.     { 20,130,212},
  194.     { 97, 94, 71},
  195.     { 36, 82,142},
  196.     { 69, 35, 15},
  197.     { 70,112,128},
  198.     { 66,126,132},
  199.     { 86, 28, 21},
  200.     { 74,102,124},
  201.     { 71, 97,116},
  202.     {217,172, 12},
  203.     { 86, 36, 31},
  204.     { 34, 98,172},
  205.     { 42, 94,132},
  206.     { 87, 44, 33},
  207.     { 71, 51,  5},
  208.     { 82, 64,  9},
  209.     { 42, 78,108},
  210.     { 86, 88, 24},
  211.     { 50, 70,108},
  212.     { 50, 74,  4},
  213.     { 62,104,  4},
  214.     { 64, 65,  6},
  215.     { 50,155,  4},
  216.     { 49,115,  4},
  217.     { 27,213,  4},
  218.     { 38,184,  4},
  219.     { 61, 97,  4},
  220.     { 74, 72,  4},
  221.     { 34,192,  4},
  222.     { 59,124,  4},
  223.     { 33,203,  4},
  224.     { 50,105,  4},
  225.     { 98, 64, 59},
  226.     { 98,110,100},
  227.     { 56, 51,  4},
  228.     {154,122,116},
  229.     {194,154, 12},
  230.     {230,174, 12},
  231.     {158,132,140},
  232.     {138, 90, 76},
  233.     {118, 53, 44},
  234.     {154, 74, 12},
  235.     {146,132,134},
  236.     { 34,126,188},
  237.     { 82, 55,  7},
  238.     { 43,172,  4},
  239.     { 50, 97,  4},
  240.     { 58, 44,  4},
  241.     { 47,148,  5},
  242.     {119,149, 97},
  243.     { 65, 80,  4},
  244.     { 33,178,  4},
  245.     { 63, 88,  4},
  246.     { 42, 58,  4},
  247.     { 74, 63,  4},
  248.     { 42,210,  4},
  249.     { 98,122,  4},
  250.     { 42,200,  8},
  251.     { 27,220,  4},
  252.     { 40,164,  4},
  253.     { 50,220, 16},
  254.     { 34,231,  4},
  255.     {110,202,  4},
  256.     {114,182,  4},
  257.     {106,166, 92},
  258.     { 86,112, 52},
  259.     { 34,162, 76},
  260.     { 42,131,  4},
  261.     { 53,132,  4},
  262.     { 74, 96,  8},
  263.     { 98,198, 76},
  264.     { 98,110, 56},
  265.     { 58,146,  8},
  266.     { 60, 72,  6},
  267.     { 34,146,  4},
  268.     { 60,112,  5},
  269.     { 69, 58,  4},
  270.     { 82,122, 52},
  271.     { 74,126,  4},
  272.     { 41,156,  4},
  273.     { 50, 63,  4},
  274.     { 52,139,  4},
  275.     { 49, 83,  4},
  276.     {162,116,116},
  277.     { 52,164, 15},
  278.     { 20,144,  4},
  279.     { 18,124,  4},
  280.     { 58, 58,  4},
  281.     { 58,162, 44},
  282.     { 24, 42,  4},
  283.     { 13, 70,  4},
  284.     { 26, 66,  4},
  285.     { 10, 88,  4},
  286.     { 12,103,  4},
  287.     { 26,110,  4},
  288.     {183,191,180},
  289.     { 14,114,  4},
  290.     { 21, 51,  4},
  291.     { 90,118, 84},
  292.     {114, 58, 56},
  293.     {170,150,144},
  294.     {162,139,140},
  295.     {146,116,118},
  296.     {131,100, 99},
  297.     {255,255,255},
  298.     {255,255,255},
  299.     {255,255,255},
  300.     {255,255,255},
  301.     {255,255,255},
  302.     {255,255,255},
  303.     {255,255,255},
  304.     {255,255,255},
  305.     {255,255,255},
  306.     {255,255,255}
  307.     };
  308. static char logo_data[] = {
  309.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  310.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  311.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  312.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  313.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  314.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  315.     0,0,0,0,
  316.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  317.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  318.     0,0,0,0,0,0,0,0,0,1,2,3,4,4,5,6,
  319.     7,8,9,9,9,10,11,12,13,14,15,16,17,18,19,20,
  320.     3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  321.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  322.     0,0,0,0,
  323.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  324.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  325.     0,20,21,22,23,24,25,25,26,27,27,27,27,28,29,30,
  326.     29,28,28,29,29,28,29,28,31,28,32,33,33,33,34,35,
  327.     64,24,16,21,20,0,0,0,0,0,0,0,0,0,0,0,
  328.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  329.     0,0,0,0,
  330.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  331.     0,0,0,0,0,0,0,0,0,0,0,36,0,20,21,37,
  332.     27,26,38,34,34,39,34,29,31,32,28,29,37,29,30,28,
  333.     32,32,30,29,32,32,40,32,30,32,32,28,29,30,31,32,
  334.     120,122,74,121,64,74,4,0,0,0,0,0,0,0,0,0,
  335.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  336.     0,0,0,0,
  337.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  338.     0,0,0,0,0,0,0,0,0,0,0,17,41,28,42,23,
  339.     24,35,26,26,32,31,30,28,28,29,29,32,32,32,30,30,
  340.     30,30,30,43,44,45,46,30,32,47,47,48,49,49,49,44,
  341.     32,32,47,57,74,121,64,13,0,0,0,0,0,0,0,0,
  342.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  343.     0,0,0,0,
  344.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  345.     0,0,0,0,0,0,0,0,0,50,41,29,29,31,34,51,
  346.     34,31,33,32,32,30,32,49,44,44,49,48,30,30,30,49,
  347.     40,49,52,53,52,54,55,44,43,40,44,53,49,49,30,49,
  348.     30,44,47,40,52,105,74,121,73,50,76,4,0,0,0,4,
  349.     18,18,112,0,0,0,0,0,0,0,0,0,0,0,0,0,
  350.     0,0,0,0,
  351.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  352.     0,0,0,0,0,0,0,0,26,28,29,42,35,56,35,57,
  353.     31,30,30,30,30,30,49,47,49,30,49,40,30,43,47,43,
  354.     30,40,58,59,60,61,59,52,43,44,49,49,48,44,44,62,
  355.     48,49,44,30,40,30,44,95,174,175,102,176,37,28,28,29,
  356.     28,28,37,37,28,33,74,177,3,0,0,0,0,0,0,0,
  357.     0,0,0,0,
  358.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  359.     0,0,0,0,0,0,0,63,37,41,39,64,56,63,53,32,
  360.     30,40,52,49,43,49,47,40,43,44,47,46,65,52,49,43,
  361.     44,52,66,60,67,68,69,52,49,49,62,49,49,44,44,43,
  362.     43,58,62,43,62,52,44,32,53,95,16,73,74,33,28,28,
  363.     28,29,29,30,28,28,28,29,28,29,93,20,0,36,0,0,
  364.     0,0,0,0,
  365.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  366.     0,0,0,0,0,0,18,28,26,23,35,26,53,28,30,49,
  367.     49,43,32,49,32,49,30,49,49,40,60,70,71,71,44,43,
  368.     30,44,72,67,40,72,54,62,43,43,43,52,52,49,49,47,
  369.     43,44,32,49,54,66,80,47,49,30,152,95,16,73,102,33,
  370.     28,30,28,30,30,49,40,49,29,30,30,29,145,93,3,0,
  371.     0,0,0,0,
  372.     0,0,0,0,0,0,0,0,0,0,0,20,50,73,74,75,
  373.     18,2,0,0,0,76,37,27,77,42,42,32,30,49,44,49,
  374.     58,55,78,40,49,30,49,43,49,78,79,69,59,68,44,30,
  375.     43,47,72,60,80,70,54,49,49,62,44,49,62,47,62,43,
  376.     62,40,49,82,79,71,178,59,43,43,49,53,155,114,119,110,
  377.     53,30,49,43,49,32,32,30,32,148,30,30,32,32,86,0,
  378.     0,0,0,0,
  379.     0,0,0,0,0,0,0,0,0,31,37,37,37,37,37,29,
  380.     29,28,37,25,6,29,39,23,42,33,30,32,30,32,30,49,
  381.     49,65,81,44,49,43,43,48,47,62,61,72,67,55,82,44,
  382.     47,43,83,68,71,71,59,62,47,49,40,62,49,49,30,43,
  383.     32,49,44,54,85,78,80,151,81,49,40,40,49,51,74,50,
  384.     174,155,48,32,91,52,40,44,40,40,30,47,30,30,28,0,
  385.     0,0,0,0,
  386.     0,0,0,0,0,0,0,2,37,41,37,37,28,28,29,28,
  387.     37,28,28,29,31,77,64,63,28,30,30,49,49,40,43,40,
  388.     44,84,85,45,40,47,44,43,43,52,69,61,70,59,62,32,
  389.     40,49,32,84,58,47,62,49,44,44,44,47,43,43,47,49,
  390.     44,43,78,90,70,97,83,179,124,44,49,40,48,48,148,15,
  391.     111,50,148,44,43,30,44,49,43,43,44,43,49,49,155,0,
  392.     0,0,0,0,
  393.     0,0,0,0,0,0,0,37,37,41,37,29,37,29,29,40,
  394.     49,32,48,86,74,87,51,30,28,30,30,49,32,43,49,62,
  395.     49,62,55,60,58,30,43,43,49,30,58,88,65,53,49,62,
  396.     44,48,58,48,49,62,49,49,49,49,44,40,30,43,49,62,
  397.     49,62,54,68,60,178,151,85,84,30,43,43,32,40,49,62,
  398.     114,107,13,96,49,62,49,49,49,49,43,40,32,43,180,0,
  399.     0,0,0,0,
  400.     0,0,0,0,0,0,89,41,37,29,28,37,29,49,32,30,
  401.     30,49,51,22,14,57,53,49,49,43,52,62,44,40,62,30,
  402.     43,48,82,90,80,43,44,32,44,52,49,40,49,62,49,49,
  403.     32,43,48,49,44,49,49,44,47,52,44,91,44,49,92,30,
  404.     40,84,68,115,49,84,83,47,44,44,49,40,49,44,43,49,
  405.     47,155,5,107,105,49,49,44,44,52,44,91,47,49,0,0,
  406.     0,0,0,0,
  407.     0,0,0,0,0,0,37,41,37,37,29,29,32,29,49,62,
  408.     44,44,93,94,95,30,30,43,47,96,97,32,48,44,30,62,
  409.     43,49,44,59,60,44,32,44,43,30,48,32,44,30,43,92,
  410.     62,43,43,43,32,49,40,44,52,43,62,49,43,44,30,62,
  411.     43,47,67,58,43,48,32,44,43,30,43,32,44,96,60,80,
  412.     62,43,99,21,114,113,32,44,44,47,62,49,43,12,0,0,
  413.     0,0,0,0,
  414.     0,0,0,0,0,20,37,28,41,29,28,30,30,49,58,49,
  415.     47,98,18,99,44,43,58,48,32,59,88,44,49,49,58,32,
  416.     32,44,44,84,65,43,43,49,30,44,40,43,49,43,62,49,
  417.     49,43,49,32,44,43,62,48,30,43,49,49,49,49,62,40,
  418.     40,43,43,49,49,43,44,48,32,43,40,43,53,70,72,43,
  419.     49,62,53,99,111,99,58,48,30,43,49,49,49,106,0,0,
  420.     0,0,0,0,
  421.     0,0,0,0,0,100,37,37,28,29,30,32,49,49,30,44,
  422.     101,94,11,62,49,49,43,49,58,54,70,65,43,49,49,48,
  423.     44,48,32,52,49,49,49,40,62,49,48,30,43,49,32,44,
  424.     62,32,44,62,32,49,43,40,91,44,44,49,43,49,49,49,
  425.     52,43,30,44,49,49,49,32,62,48,48,40,59,70,96,44,
  426.     62,30,44,62,15,21,9,40,91,44,62,49,44,3,0,0,
  427.     0,0,0,0,
  428.     0,0,0,0,0,102,41,29,28,28,29,32,32,49,62,101,
  429.     103,98,53,30,44,58,62,92,43,104,90,72,52,43,52,44,
  430.     40,43,44,49,44,43,52,62,49,49,40,48,49,48,44,49,
  431.     40,52,49,30,62,58,62,92,43,44,49,44,44,43,52,62,
  432.     40,43,44,49,44,43,52,62,49,49,30,54,68,83,44,48,
  433.     32,52,49,30,52,12,94,181,43,44,49,44,43,0,0,0,
  434.     0,0,0,0,
  435.     0,0,0,0,0,37,37,37,28,30,30,40,43,30,105,17,
  436.     106,57,43,62,40,49,58,43,44,52,88,70,81,40,30,44,
  437.     47,49,43,44,52,49,43,40,49,48,32,49,44,32,48,40,
  438.     44,40,43,62,40,49,62,43,44,49,43,32,43,49,30,44,
  439.     44,49,43,44,44,49,43,40,49,48,67,85,81,30,48,40,
  440.     44,40,43,62,32,155,15,13,108,49,43,40,43,0,0,0,
  441.     0,0,0,0,
  442.     0,0,0,0,0,37,28,29,28,28,30,49,49,52,13,107,
  443.     108,49,43,32,44,44,48,58,92,43,52,109,70,80,62,49,
  444.     49,49,49,49,49,43,43,44,43,30,44,43,49,43,32,49,
  445.     40,49,48,32,44,44,43,58,92,43,52,62,32,30,43,49,
  446.     49,49,49,49,49,43,43,44,43,49,115,81,40,43,32,49,
  447.     40,49,43,40,44,44,117,21,101,44,52,44,30,0,0,0,
  448.     0,0,0,0,
  449.     0,0,0,0,3,37,37,28,28,30,30,49,52,110,18,14,
  450.     40,43,40,49,30,40,48,43,40,52,62,40,81,65,40,49,
  451.     49,47,43,52,44,47,62,43,43,43,43,43,62,40,49,43,
  452.     32,43,40,49,32,49,43,43,49,52,62,30,43,48,30,49,
  453.     49,47,43,52,44,47,62,43,43,43,43,44,62,40,49,40,
  454.     32,43,40,49,30,40,43,114,17,102,62,30,48,0,0,0,
  455.     0,0,0,0,
  456.     0,0,0,0,89,28,37,37,28,30,30,40,51,22,111,108,
  457.     43,43,40,49,44,44,43,62,52,43,43,43,52,47,52,43,
  458.     44,58,53,44,43,48,32,49,32,49,43,49,32,44,43,44,
  459.     43,43,40,49,43,44,43,43,58,43,43,43,43,43,52,43,
  460.     52,58,47,44,43,48,32,30,32,49,43,49,32,44,43,44,
  461.     43,43,47,44,44,44,43,118,22,112,155,43,49,0,0,0,
  462.     0,0,0,0,
  463.     0,0,0,0,18,41,37,29,28,30,30,84,13,93,95,49,
  464.     49,49,40,49,43,30,44,43,49,49,44,62,52,44,43,40,
  465.     49,30,49,30,43,40,43,43,43,49,43,62,62,43,32,49,
  466.     49,49,40,49,43,30,44,44,49,49,44,62,52,43,43,32,
  467.     49,30,49,30,43,40,43,43,43,49,43,62,62,43,40,49,
  468.     49,84,71,115,44,30,44,43,108,22,15,84,44,0,0,0,
  469.     0,0,0,0,
  470.     0,0,0,0,19,37,28,37,30,32,62,105,112,5,52,62,
  471.     40,30,104,84,40,62,49,49,58,62,44,49,44,49,47,62,
  472.     49,62,44,44,49,44,47,49,44,43,92,52,52,62,44,62,
  473.     40,30,44,48,32,62,49,49,52,62,43,49,62,49,47,62,
  474.     49,62,44,44,49,44,43,49,44,44,92,58,52,62,44,62,
  475.     67,85,59,84,30,62,49,49,84,93,94,95,148,0,0,0,
  476.     0,0,0,0,
  477.     0,0,0,0,19,37,28,37,30,30,113,114,112,95,48,43,
  478.     43,91,115,69,65,62,44,58,40,43,43,44,44,58,43,44,
  479.     44,49,49,49,92,48,49,49,44,48,48,44,48,49,48,43,
  480.     43,92,40,43,62,62,43,58,40,43,43,44,47,91,43,44,
  481.     44,49,49,49,92,48,49,49,43,48,48,44,48,49,48,118,
  482.     151,54,53,58,54,97,44,58,32,117,112,98,44,4,0,0,
  483.     0,0,0,0,
  484.     0,0,0,0,19,37,37,29,28,30,63,22,93,58,62,43,
  485.     62,40,52,116,79,66,84,43,62,32,62,43,32,30,49,49,
  486.     43,49,52,49,32,49,49,43,43,43,49,44,49,52,62,43,
  487.     92,40,62,43,40,43,43,48,62,32,62,43,40,30,49,49,
  488.     43,40,52,49,32,49,49,47,43,43,49,44,49,52,62,84,
  489.     90,81,83,70,71,97,48,43,62,47,98,50,105,112,0,0,
  490.     0,0,0,0,
  491.     0,0,0,0,19,37,29,28,30,53,110,93,117,49,43,49,
  492.     49,49,92,49,84,71,71,118,44,58,49,48,44,44,44,44,
  493.     49,44,40,44,52,47,52,43,43,44,62,40,52,48,43,30,
  494.     48,49,62,49,43,62,44,49,43,58,49,48,44,47,62,44,
  495.     49,44,43,44,52,44,52,43,43,44,62,32,58,48,43,49,
  496.     67,68,90,59,82,62,44,49,43,58,9,50,99,106,0,0,
  497.     0,0,0,0,
  498.     0,0,0,0,20,37,29,37,28,34,119,114,113,49,49,62,
  499.     43,62,30,43,43,91,54,68,84,40,40,49,43,52,49,43,
  500.     44,49,43,44,40,48,44,30,49,30,49,43,48,40,49,92,
  501.     40,92,30,40,43,62,43,62,44,40,40,49,43,52,49,43,
  502.     44,49,43,44,40,48,43,30,49,30,49,43,49,40,49,62,
  503.     148,60,81,52,47,62,43,62,44,32,44,114,103,13,0,0,
  504.     0,0,0,0,
  505.     0,0,0,0,4,37,37,28,29,74,14,95,49,48,40,40,
  506.     44,49,43,52,43,49,62,78,43,43,43,62,32,49,40,40,
  507.     47,44,44,44,52,44,49,52,43,43,44,49,49,43,49,40,
  508.     47,49,43,52,43,30,44,52,49,43,43,62,32,30,43,40,
  509.     47,47,44,47,58,44,49,52,43,43,52,49,40,43,49,32,
  510.     44,47,44,52,43,30,44,52,40,44,44,182,50,114,0,0,
  511.     0,0,0,0,
  512.     0,0,0,0,3,29,28,28,120,121,102,113,32,30,43,49,
  513.     30,43,43,44,43,52,49,43,62,58,40,40,47,40,47,48,
  514.     49,40,43,52,62,43,62,49,40,43,43,40,32,32,43,49,
  515.     30,43,43,44,47,58,48,40,62,58,40,32,44,40,47,49,
  516.     48,40,43,52,62,43,62,49,43,43,43,49,40,32,43,40,
  517.     30,44,43,44,47,58,49,40,92,62,49,47,15,17,20,0,
  518.     0,0,0,0,
  519.     0,0,0,0,4,37,41,28,42,16,6,47,43,49,30,43,
  520.     43,49,30,43,30,49,92,44,40,48,43,40,49,44,52,43,
  521.     47,40,47,44,40,49,40,44,40,49,43,40,43,49,32,43,
  522.     43,49,30,48,30,49,91,52,40,48,43,40,49,47,44,43,
  523.     44,40,47,44,40,49,40,47,40,49,43,40,43,49,30,43,
  524.     43,49,30,48,30,40,92,52,32,43,44,57,174,22,19,0,
  525.     0,0,0,0,
  526.     0,0,0,0,0,28,28,31,122,87,86,30,49,48,44,30,
  527.     32,44,44,43,91,44,49,43,62,92,52,62,47,43,49,44,
  528.     62,92,92,58,62,92,62,62,43,52,32,40,49,43,43,30,
  529.     40,44,62,43,91,43,49,43,62,92,52,62,47,43,40,44,
  530.     44,92,92,58,62,92,43,92,43,52,32,40,49,43,44,30,
  531.     32,44,62,43,97,104,66,70,115,58,44,62,152,5,103,0,
  532.     0,0,0,0,
  533.     0,0,0,0,0,37,28,27,35,24,43,44,52,40,62,91,
  534.     67,30,40,49,32,43,62,44,43,49,53,44,62,43,40,62,
  535.     43,48,43,92,43,43,48,40,40,48,44,52,44,49,44,44,
  536.     91,32,40,49,40,43,62,44,43,49,52,44,62,43,40,62,
  537.     43,48,43,92,43,43,48,40,30,48,43,52,43,49,44,62,
  538.     58,32,47,78,115,68,69,54,70,148,53,44,84,114,94,0,
  539.     0,0,0,0,
  540.     0,0,0,0,0,28,28,42,25,95,57,30,49,43,54,85,
  541.     54,84,44,62,62,91,49,44,52,52,62,30,43,40,62,49,
  542.     43,43,58,43,52,62,92,58,91,62,43,40,49,48,49,40,
  543.     43,44,43,43,58,92,49,44,62,52,62,30,43,49,62,49,
  544.     43,43,58,43,58,62,91,91,91,92,43,40,40,48,49,40,
  545.     43,44,183,59,70,72,49,78,68,67,62,30,148,99,21,2,
  546.     0,0,0,0,
  547.     0,0,0,0,0,28,29,23,123,26,30,47,43,49,78,71,
  548.     71,60,124,60,78,49,62,43,44,49,62,62,52,62,52,52,
  549.     52,49,52,52,92,91,62,44,48,30,49,52,47,49,44,92,
  550.     43,40,32,43,43,49,62,47,44,49,62,62,58,62,52,52,
  551.     52,49,52,52,92,92,62,44,48,30,49,52,47,49,44,92,
  552.     43,32,96,54,115,71,65,70,151,69,62,62,58,182,175,20,
  553.     0,0,0,0,
  554.     0,0,0,0,0,37,29,125,26,40,49,40,30,49,44,44,
  555.     58,81,72,66,52,52,62,44,43,52,44,40,40,49,49,49,
  556.     44,58,52,44,49,49,43,43,44,91,44,49,30,49,44,40,
  557.     44,52,62,49,49,52,62,44,43,53,44,40,32,49,49,49,
  558.     44,58,52,44,49,49,43,43,44,91,44,49,30,49,44,43,
  559.     47,58,62,124,60,151,90,54,109,52,44,40,32,148,114,20,
  560.     0,0,0,0,
  561.     0,0,0,0,0,37,42,35,34,32,28,48,43,48,43,49,
  562.     43,49,53,52,91,49,32,48,49,44,44,44,44,44,44,62,
  563.     43,49,40,49,43,44,44,43,48,32,40,44,47,52,11,82,
  564.     48,49,49,62,92,49,32,48,49,44,62,44,44,44,44,62,
  565.     43,49,40,49,43,44,105,43,48,40,40,44,47,48,43,49,
  566.     48,49,49,116,72,65,96,47,40,44,44,52,52,44,101,184,
  567.     0,0,0,0,
  568.     0,0,0,0,0,29,27,125,33,40,49,43,49,30,43,47,
  569.     44,43,62,43,49,44,62,44,44,43,52,44,126,127,127,128,
  570.     14,52,52,52,44,44,49,44,91,52,44,44,49,95,128,114,
  571.     44,43,62,43,49,44,62,44,44,43,52,44,43,40,30,49,
  572.     40,52,52,52,44,84,127,114,58,52,44,44,49,32,43,47,
  573.     44,43,62,44,44,52,58,44,44,44,52,43,43,49,95,18,
  574.     0,0,0,0,
  575.     0,0,0,0,0,37,129,39,33,28,32,40,32,43,62,43,
  576.     40,49,49,43,52,52,62,62,44,44,49,49,126,128,127,128,
  577.     110,40,44,40,49,32,44,52,48,30,130,74,32,11,128,110,
  578.     32,49,49,43,52,52,62,62,44,52,49,49,43,44,44,58,
  579.     43,40,11,130,49,53,128,110,43,30,48,49,32,44,44,62,
  580.     32,49,49,43,52,52,62,62,44,44,49,49,43,44,108,119,
  581.     0,0,0,0,
  582.     0,0,0,0,0,131,39,26,42,30,30,49,43,43,32,49,
  583.     52,43,48,43,43,32,40,43,49,43,44,49,132,127,127,127,
  584.     15,62,92,47,44,43,44,30,44,58,132,133,44,6,127,134,
  585.     58,40,48,43,44,32,43,43,49,48,62,49,48,52,52,43,
  586.     43,62,15,126,44,48,84,47,62,58,49,49,43,49,40,49,
  587.     52,43,49,44,43,32,43,43,49,43,62,49,48,52,152,5,
  588.     0,0,0,0,
  589.     0,0,0,0,0,17,23,39,28,28,32,43,32,40,48,43,
  590.     30,49,49,43,48,92,44,62,43,43,43,52,135,128,127,127,
  591.     110,44,47,136,130,40,100,136,99,96,137,136,130,49,132,138,
  592.     130,126,6,48,49,116,132,139,138,43,47,140,141,25,126,121,
  593.     43,62,126,136,132,53,132,160,49,30,121,185,126,95,48,43,
  594.     30,49,49,43,49,62,44,52,84,52,43,148,52,49,44,114,
  595.     0,0,0,0,
  596.     0,0,0,0,0,111,26,26,29,32,30,49,43,52,49,30,
  597.     43,49,43,58,44,48,49,49,40,62,52,49,100,127,128,142,
  598.     83,40,86,128,132,30,134,128,134,100,127,127,137,30,132,128,
  599.     127,127,137,58,44,136,128,128,127,143,44,127,128,127,127,128,
  600.     118,145,128,128,128,145,128,132,49,11,127,128,128,128,47,30,
  601.     43,49,43,58,44,48,49,44,66,116,52,49,44,44,84,174,
  602.     0,0,0,0,
  603.     0,0,0,0,0,94,39,39,28,29,40,32,96,59,82,44,
  604.     43,47,43,32,92,62,43,62,43,49,40,44,96,127,144,128,
  605.     32,49,108,128,132,43,14,127,133,95,128,127,137,32,132,128,
  606.     128,128,127,120,116,127,127,128,128,139,40,127,128,127,127,127,
  607.     16,155,128,127,128,152,128,132,43,126,127,127,127,128,95,44,
  608.     47,43,43,40,92,92,43,92,71,118,40,62,49,49,47,93,
  609.     0,0,0,0,
  610.     0,0,0,0,0,103,42,27,29,30,30,30,116,70,81,47,
  611.     40,49,32,52,43,30,44,49,44,44,52,47,100,128,145,127,
  612.     105,43,47,146,132,47,78,126,15,78,136,147,11,49,132,126,
  613.     77,87,128,108,148,128,64,100,149,136,53,150,127,138,110,142,
  614.     114,43,147,136,14,44,146,132,44,126,132,145,118,127,117,40,
  615.     40,49,32,52,43,30,44,47,60,183,53,44,40,43,113,155,
  616.     0,0,0,0,
  617.     0,0,0,0,0,18,39,42,37,28,32,49,67,151,151,71,
  618.     69,97,52,43,49,62,49,49,49,49,47,43,121,136,49,136,
  619.     99,58,49,133,126,30,43,126,134,32,132,133,32,40,132,133,
  620.     44,49,128,82,152,127,49,49,6,137,47,100,136,43,49,126,
  621.     110,58,133,132,43,32,15,132,49,132,110,44,32,136,186,62,
  622.     44,43,52,48,49,62,49,49,55,115,53,43,30,43,43,105,
  623.     0,0,0,0,
  624.     0,0,0,0,0,94,23,27,28,30,30,30,53,97,118,65,
  625.     59,97,48,49,44,49,49,44,47,52,44,52,153,136,135,142,
  626.     126,48,40,133,132,43,44,154,114,44,132,133,49,52,132,131,
  627.     32,43,127,152,96,128,49,44,11,139,44,7,136,49,62,132,
  628.     15,40,133,132,32,43,133,132,44,126,131,32,49,174,82,49,
  629.     32,43,48,49,44,49,49,44,84,97,52,58,44,186,159,95,
  630.     0,0,0,0,
  631.     0,0,0,0,0,18,23,27,29,37,32,30,43,30,43,62,
  632.     62,43,43,43,32,49,32,44,52,43,62,49,128,128,128,128,
  633.     137,49,47,15,126,43,32,140,14,30,132,133,43,30,126,15,
  634.     62,40,128,155,145,127,132,126,137,136,62,95,136,44,30,135,
  635.     15,49,14,126,43,48,133,140,43,154,15,40,44,30,43,92,
  636.     62,43,43,43,32,49,32,44,44,43,62,49,171,166,187,8,
  637.     0,0,0,0,
  638.     0,0,0,0,0,18,35,42,28,28,32,49,30,43,62,49,
  639.     49,62,30,32,44,43,62,48,49,43,49,145,127,95,52,156,
  640.     128,52,43,134,132,40,44,132,133,44,132,110,49,43,135,133,
  641.     49,62,127,145,96,128,114,15,133,100,49,157,136,49,44,132,
  642.     133,43,114,132,49,43,14,132,30,140,16,43,49,43,44,49,
  643.     49,62,30,32,44,43,62,43,30,43,49,49,120,170,170,94,
  644.     0,0,0,0,
  645.     0,0,0,0,0,94,125,42,28,30,30,30,49,49,30,44,
  646.     62,40,44,62,40,49,43,40,58,44,62,11,127,47,49,113,
  647.     127,100,30,133,132,49,49,132,114,49,126,16,43,49,132,110,
  648.     62,32,128,84,51,127,43,40,117,158,62,95,139,49,49,132,
  649.     133,48,159,126,49,49,134,132,62,132,110,30,43,130,86,44,
  650.     62,32,62,62,32,49,43,40,91,44,62,49,43,188,170,94,
  651.     0,0,0,0,
  652.     0,0,0,0,0,103,34,31,28,28,28,49,32,49,44,49,
  653.     32,52,49,30,62,58,44,92,43,52,110,142,127,132,52,126,
  654.     128,142,7,133,140,43,52,126,134,49,154,110,49,48,126,134,
  655.     32,52,127,51,82,127,44,92,11,139,49,11,139,43,52,126,
  656.     16,43,15,132,44,43,114,126,49,132,133,48,49,137,9,48,
  657.     32,52,49,30,62,58,62,92,43,52,189,145,44,40,190,191,
  658.     0,0,0,0,
  659.     0,0,0,0,0,39,35,29,28,28,30,49,43,30,48,40,
  660.     44,40,43,62,40,49,62,43,44,49,133,128,127,137,30,136,
  661.     128,128,110,114,137,74,99,137,150,44,132,136,11,40,135,150,
  662.     44,57,128,74,148,127,16,95,150,136,44,138,136,148,47,126,
  663.     150,47,15,137,11,44,150,126,47,132,136,133,138,128,6,43,
  664.     44,32,43,62,40,49,44,145,192,192,170,193,194,40,195,191,
  665.     0,0,0,0,
  666.     0,0,0,0,0,39,125,27,29,29,30,40,78,115,118,96,
  667.     49,49,48,32,44,44,43,91,62,43,133,127,128,136,43,136,
  668.     127,127,14,159,127,128,127,128,128,96,144,128,127,11,128,127,
  669.     96,132,127,136,96,128,127,128,127,126,47,127,128,143,96,127,
  670.     127,86,133,127,127,34,128,128,11,144,128,127,127,127,95,30,
  671.     40,49,48,30,52,44,196,197,172,198,199,200,200,156,44,94,
  672.     0,0,0,0,
  673.     0,0,0,0,0,42,24,42,28,30,49,96,70,85,54,71,
  674.     118,43,40,49,49,49,48,43,49,52,133,128,127,136,30,137,
  675.     128,127,14,108,127,127,127,127,127,51,105,128,127,95,128,128,
  676.     57,132,128,136,32,136,127,128,127,73,44,127,128,73,96,127,
  677.     128,152,155,127,127,35,127,128,100,11,128,142,128,139,47,43,
  678.     40,40,53,173,201,188,52,202,203,204,204,203,203,205,145,206,
  679.     0,0,0,0,
  680.     0,0,0,0,0,39,125,27,28,29,32,80,70,69,115,72,
  681.     124,43,32,49,47,44,43,62,52,43,6,126,126,130,52,144,
  682.     126,140,99,44,56,126,123,158,132,47,40,95,144,95,126,140,
  683.     57,160,132,130,43,52,144,135,87,43,43,126,126,6,82,126,
  684.     140,78,47,95,130,63,132,132,86,207,170,208,130,82,44,43,
  685.     161,201,209,165,166,172,196,210,166,187,211,166,200,187,82,212,
  686.     0,0,0,0,
  687.     0,0,0,0,0,41,125,39,29,30,30,118,85,71,60,68,
  688.     67,48,40,49,44,30,44,43,49,48,44,44,52,43,43,40,
  689.     49,30,49,30,44,32,40,43,43,49,43,62,62,43,32,40,
  690.     49,49,40,49,43,30,44,43,49,49,44,62,52,43,43,32,
  691.     49,30,49,30,43,33,213,214,145,190,166,201,62,215,216,209,
  692.     173,166,167,161,172,166,217,218,172,166,162,201,172,190,82,219,
  693.     0,0,0,0,
  694.     0,0,0,0,0,42,125,23,28,32,52,52,67,60,72,115,
  695.     53,30,44,48,30,62,49,49,58,62,44,49,62,40,47,44,
  696.     49,62,44,44,49,44,43,49,44,44,92,52,62,62,44,62,
  697.     40,30,44,48,30,92,49,49,58,62,44,49,62,40,47,62,
  698.     49,62,44,82,163,171,172,200,192,186,220,171,194,171,197,172,
  699.     161,170,200,173,201,166,193,189,201,166,190,173,201,189,47,15,
  700.     0,0,0,0,
  701.     0,0,0,0,0,29,39,23,30,30,40,43,48,49,52,44,
  702.     43,92,40,43,62,43,62,52,40,43,43,44,47,91,43,44,
  703.     44,49,49,49,92,48,49,49,43,48,48,44,48,49,48,43,
  704.     43,92,40,44,62,43,44,58,40,43,43,44,47,91,43,44,
  705.     44,49,145,193,187,47,189,216,221,47,187,200,187,222,170,166,
  706.     165,223,166,187,162,166,166,157,224,166,172,86,47,91,58,131,
  707.     0,0,0,0,
  708.     0,0,0,0,0,21,39,39,31,28,30,43,32,44,62,43,
  709.     92,32,62,43,40,43,48,48,62,32,62,43,40,30,49,49,
  710.     43,40,53,49,32,49,49,47,43,48,49,44,49,52,62,48,
  711.     92,40,44,43,32,43,43,40,62,32,62,43,40,30,49,49,
  712.     43,43,209,172,200,176,49,43,156,44,165,166,172,194,190,172,
  713.     170,188,172,172,224,170,172,173,96,172,166,173,40,30,174,94,
  714.     2,0,0,0,
  715.     0,0,0,0,0,21,39,39,32,32,49,30,52,49,43,30,
  716.     48,49,92,49,43,62,52,49,43,58,49,49,44,44,62,44,
  717.     49,44,43,44,52,44,52,43,43,44,58,32,58,43,43,30,
  718.     48,49,92,49,43,62,44,49,43,58,49,49,44,47,62,44,
  719.     49,43,187,166,166,210,52,44,86,192,157,170,166,209,173,166,
  720.     166,224,167,172,173,192,169,40,43,210,166,216,44,44,9,22,
  721.     4,0,0,0,
  722.     0,0,0,0,0,4,42,23,27,37,30,49,49,49,49,62,
  723.     44,62,30,43,40,62,43,62,44,40,49,49,43,52,49,43,
  724.     44,49,43,44,40,48,43,30,49,30,49,43,49,40,49,92,
  725.     43,92,30,43,43,62,43,62,44,40,49,49,43,44,49,43,
  726.     44,47,187,172,166,167,86,188,193,172,161,201,166,167,215,193,
  727.     166,171,224,194,96,58,88,109,52,176,217,86,43,44,6,22,
  728.     75,0,0,0,
  729.     0,0,0,0,0,3,27,23,26,33,30,32,47,43,78,60,
  730.     65,47,43,52,43,30,44,52,49,44,43,62,32,30,43,40,
  731.     44,47,44,47,58,44,49,52,43,43,44,49,49,43,49,32,
  732.     47,49,43,52,43,49,44,52,49,44,43,62,32,49,40,40,
  733.     47,44,216,172,166,166,224,187,166,166,168,161,166,166,168,173,
  734.     165,120,43,52,40,96,70,68,70,54,80,62,32,47,15,17,
  735.     5,0,0,0,
  736.     0,0,0,0,0,0,27,42,34,27,30,82,59,96,62,54,
  737.     85,55,47,52,43,58,48,40,62,62,40,32,44,40,47,49,
  738.     49,40,43,52,62,43,62,49,43,43,43,49,40,32,43,49,
  739.     30,43,43,44,47,52,49,40,62,62,120,161,162,145,47,49,
  740.     49,40,222,172,166,166,201,173,166,166,173,120,201,223,86,47,
  741.     30,43,47,44,43,62,148,116,69,90,65,30,44,155,13,119,
  742.     96,0,0,0,
  743.     0,0,0,0,0,0,122,42,125,26,32,124,60,43,30,47,
  744.     115,151,32,43,30,49,92,52,32,48,43,40,49,47,44,44,
  745.     44,40,47,44,40,49,40,47,40,49,43,40,43,49,32,43,
  746.     43,49,30,48,30,49,91,52,40,163,164,165,166,167,96,43,
  747.     44,40,52,209,172,166,172,224,172,170,163,40,53,32,32,43,
  748.     43,49,30,43,32,55,183,58,52,70,67,40,30,8,22,114,
  749.     44,3,0,0,
  750.     0,0,0,0,0,0,17,31,23,34,27,54,81,40,43,49,
  751.     45,85,84,43,92,44,49,43,92,92,52,62,47,43,40,43,
  752.     44,92,92,58,62,92,43,92,43,148,40,32,49,43,43,49,
  753.     32,44,44,43,91,96,168,169,82,167,170,171,170,172,173,44,
  754.     44,92,92,52,210,172,200,217,165,192,40,32,49,43,40,49,
  755.     32,62,44,43,91,59,178,68,71,178,84,62,44,114,111,105,
  756.     40,225,0,0,
  757.     0,0,0,0,0,0,2,27,24,26,47,88,59,96,116,65,
  758.     68,54,40,48,32,43,62,44,47,49,53,62,62,43,40,62,
  759.     43,48,43,92,43,43,43,40,30,43,44,52,43,49,44,44,
  760.     58,40,47,86,165,209,200,193,96,167,200,190,162,163,47,44,
  761.     43,49,43,62,47,86,163,120,49,48,43,52,43,49,44,44,
  762.     58,49,40,49,40,44,116,81,65,118,44,44,84,15,94,9,
  763.     52,9,0,0,
  764.     0,0,0,0,0,0,0,29,23,35,42,47,66,71,79,85,
  765.     69,78,43,43,58,92,49,44,62,52,62,30,43,49,62,49,
  766.     43,43,58,43,58,62,92,91,58,118,44,40,40,48,49,40,
  767.     196,194,218,172,200,164,221,165,96,187,166,193,86,49,186,176,
  768.     47,44,58,43,58,58,91,91,58,92,43,40,43,48,49,40,
  769.     43,53,43,43,58,91,49,43,58,58,43,49,95,119,106,148,
  770.     43,58,0,0,
  771.     0,0,0,0,0,0,0,37,27,125,24,31,47,82,80,116,
  772.     52,32,40,43,43,49,62,44,44,49,62,62,58,62,52,52,
  773.     52,49,52,52,92,91,58,159,167,170,216,82,53,189,192,171,
  774.     199,172,176,221,200,193,157,53,47,173,166,166,162,82,223,186,
  775.     52,49,52,52,92,92,62,44,48,30,49,52,47,49,44,92,
  776.     48,40,32,43,48,49,62,43,44,49,62,108,5,103,9,52,
  777.     52,49,0,0,
  778.     0,0,0,0,0,0,0,50,27,39,122,33,32,43,43,43,
  779.     47,58,62,49,49,148,62,44,43,53,44,40,32,49,49,49,
  780.     44,58,52,52,215,226,193,224,172,166,200,209,161,172,172,173,
  781.     166,200,162,173,200,172,159,52,43,53,209,170,193,209,215,49,
  782.     43,58,52,44,49,49,43,43,44,91,44,49,30,49,62,40,
  783.     52,58,62,49,49,52,62,52,43,53,44,105,119,5,152,49,
  784.     44,62,243,0,
  785.     0,0,0,0,0,0,0,3,37,42,35,34,47,49,49,40,
  786.     48,49,49,62,92,49,32,48,49,62,44,52,44,44,44,62,
  787.     43,49,40,53,167,200,200,173,221,200,200,167,169,172,172,165,
  788.     193,200,201,218,170,200,227,53,48,44,44,156,156,52,44,62,
  789.     43,49,40,49,43,44,44,47,48,40,32,44,47,48,43,49,
  790.     43,49,49,62,92,49,30,48,49,44,52,105,75,98,44,62,
  791.     40,40,180,0,
  792.     0,0,0,0,0,0,0,0,28,42,24,87,57,30,40,44,
  793.     44,43,62,43,49,44,62,44,44,43,52,43,43,40,30,49,
  794.     40,52,52,44,216,200,200,187,168,200,200,201,53,221,200,193,
  795.     171,166,172,192,209,166,199,82,44,43,52,44,43,49,49,49,
  796.     40,52,52,52,44,52,49,44,58,58,44,44,49,32,43,47,
  797.     44,43,44,43,49,44,52,44,44,44,155,114,119,108,30,49,
  798.     40,62,177,0,
  799.     0,0,0,0,0,0,0,0,37,37,42,123,25,47,43,43,
  800.     30,49,49,40,52,52,62,62,44,44,49,49,6,96,44,52,
  801.     43,40,47,40,215,172,200,172,224,167,170,224,32,224,166,170,
  802.     173,172,166,188,169,190,162,96,44,52,49,49,43,44,44,58,
  803.     43,40,44,40,49,40,44,44,48,49,48,49,32,44,44,43,
  804.     32,49,49,43,52,52,62,62,44,52,174,119,174,52,44,58,
  805.     43,49,8,0,
  806.     0,0,0,0,0,0,0,0,64,29,42,125,73,57,30,43,
  807.     44,43,48,43,44,32,43,43,40,43,62,47,210,156,52,43,
  808.     43,62,92,43,53,193,200,166,165,169,120,49,44,120,167,166,
  809.     209,216,167,86,43,47,43,43,49,48,62,49,43,52,52,43,
  810.     43,62,62,40,44,48,44,30,44,52,49,49,43,49,40,49,
  811.     52,43,48,43,43,32,43,43,49,108,13,119,96,44,52,43,
  812.     47,62,181,0,
  813.     0,0,0,0,0,0,0,0,94,41,28,145,16,51,53,43,
  814.     30,49,49,48,49,62,44,11,162,210,145,82,190,47,49,43,
  815.     43,44,32,49,49,228,200,200,193,189,43,44,40,40,168,201,
  816.     221,229,145,43,49,62,44,62,47,43,43,52,52,49,49,47,
  817.     43,44,32,49,30,40,40,49,49,30,48,44,40,49,48,43,
  818.     30,49,49,43,49,92,44,62,40,174,21,8,58,49,49,43,
  819.     43,44,5,0,
  820.     0,0,0,0,0,0,0,0,19,28,37,27,102,16,152,30,
  821.     48,49,43,58,44,48,188,193,165,166,164,222,223,47,62,47,
  822.     62,32,49,30,49,229,170,200,166,194,49,43,43,49,49,31,
  823.     47,49,43,52,44,48,49,49,49,62,52,49,44,47,62,43,
  824.     62,40,49,49,49,30,49,43,49,44,49,43,43,49,49,30,
  825.     43,49,43,58,44,48,49,49,155,119,22,152,44,47,62,44,
  826.     62,32,180,0,
  827.     0,0,0,0,0,0,0,0,0,37,28,37,63,73,102,52,
  828.     43,43,53,49,92,62,216,172,171,193,172,223,165,120,222,221,
  829.     224,47,44,43,49,47,221,200,166,216,47,49,49,32,49,44,
  830.     44,47,43,32,92,62,43,62,47,49,40,62,49,49,30,43,
  831.     32,49,44,43,49,43,43,43,43,49,43,49,49,32,49,44,
  832.     47,44,43,32,92,62,43,62,9,112,7,62,49,49,30,40,
  833.     40,49,243,0,
  834.     0,0,0,0,0,0,0,0,0,37,37,37,42,102,22,95,
  835.     31,86,209,190,188,31,171,200,221,209,199,221,165,193,162,172,
  836.     172,192,49,49,40,47,194,167,221,168,47,32,43,48,49,40,
  837.     40,49,40,52,43,30,44,49,44,44,47,44,43,43,47,49,
  838.     52,43,49,30,40,43,44,43,44,44,49,32,43,48,48,40,
  839.     40,49,32,52,43,30,44,6,17,93,96,113,43,43,47,49,
  840.     44,43,0,0,
  841.     0,0,0,0,0,0,0,0,0,16,28,29,37,32,73,207,
  842.     193,209,210,172,166,210,229,201,170,224,165,221,165,200,187,223,
  843.     166,223,49,49,43,32,53,218,47,30,43,43,40,40,49,62,
  844.     44,48,58,43,49,62,49,49,49,49,44,40,30,43,49,62,
  845.     49,58,49,49,44,30,43,43,49,30,43,43,40,32,49,62,
  846.     44,48,58,43,49,62,145,14,14,152,43,43,49,43,49,62,
  847.     49,98,0,0,
  848.     0,0,0,0,0,0,0,0,0,111,41,37,41,47,51,230,
  849.     200,167,192,166,166,172,163,86,192,96,96,187,215,172,172,161,
  850.     166,209,40,49,32,43,44,30,52,44,49,40,49,44,49,49,
  851.     32,43,48,49,44,49,49,44,44,52,44,91,44,49,92,30,
  852.     43,43,40,49,30,43,44,30,44,44,49,40,49,62,49,49,
  853.     32,43,48,49,62,113,9,94,174,58,44,58,47,49,92,30,
  854.     43,4,0,0,
  855.     0,0,0,0,0,0,0,0,0,76,231,232,233,42,32,226,
  856.     166,166,168,187,166,200,209,44,52,43,196,190,47,210,172,171,
  857.     209,218,43,43,43,48,40,44,43,30,48,32,44,30,43,92,
  858.     62,40,43,43,32,49,32,44,52,43,62,49,43,44,30,62,
  859.     48,49,43,47,43,48,32,44,43,30,48,32,44,30,43,92,
  860.     62,40,43,43,40,105,17,13,152,47,62,49,43,44,30,62,
  861.     106,0,0,0,
  862.     0,0,0,0,0,0,0,0,0,1,231,234,235,235,145,216,
  863.     166,200,201,188,166,166,201,47,30,43,215,223,49,53,163,176,
  864.     47,43,44,49,49,43,43,48,30,44,40,43,49,43,44,49,
  865.     49,62,49,32,44,43,62,48,49,40,49,49,49,49,62,32,
  866.     32,43,43,49,49,43,44,48,32,44,40,43,49,43,62,49,
  867.     49,62,30,32,117,13,13,108,49,43,49,49,49,49,62,7,
  868.     0,0,0,0,
  869.     0,0,0,0,0,0,0,0,0,2,231,232,235,228,236,173,
  870.     170,200,166,159,170,166,167,47,58,44,168,224,43,49,49,49,
  871.     52,48,32,44,49,49,49,32,62,49,48,30,43,49,30,44,
  872.     62,32,44,62,32,49,43,40,91,44,62,49,40,49,49,48,
  873.     52,43,30,44,49,49,49,32,62,49,48,30,43,49,30,44,
  874.     62,40,44,182,143,119,108,40,58,44,62,49,43,82,180,0,
  875.     0,0,0,0,
  876.     0,0,0,0,0,0,0,0,0,237,231,231,235,228,227,195,
  877.     193,200,166,230,164,166,223,91,44,44,53,44,44,43,52,44,
  878.     40,43,44,49,44,43,52,58,49,49,40,48,49,48,52,49,
  879.     32,52,49,30,62,58,44,92,43,44,49,44,44,43,52,44,
  880.     40,43,44,49,44,43,58,62,49,49,40,48,49,48,44,48,
  881.     32,52,152,22,13,9,62,92,43,44,49,43,181,1,0,0,
  882.     0,0,0,0,
  883.     0,0,0,0,0,0,0,0,0,2,232,231,232,238,227,129,
  884.     224,172,200,202,219,167,157,40,44,49,43,40,43,49,30,44,
  885.     47,49,43,44,52,49,48,40,49,48,40,49,44,30,48,40,
  886.     62,40,43,62,40,49,62,43,44,49,43,40,43,40,30,44,
  887.     47,49,43,44,44,49,43,40,49,48,32,49,44,32,48,40,
  888.     44,47,101,18,114,47,62,48,43,117,180,0,0,0,0,0,
  889.     0,0,0,0,
  890.     0,0,0,0,0,0,0,0,0,237,232,239,232,238,227,195,
  891.     30,161,223,226,191,213,117,91,92,43,52,44,32,49,43,49,
  892.     49,49,49,49,49,43,43,44,43,30,44,43,49,43,32,49,
  893.     32,49,43,32,44,44,43,58,62,43,52,44,32,49,62,49,
  894.     49,49,49,49,49,43,43,44,43,49,44,43,49,43,32,49,
  895.     95,110,17,114,58,43,82,225,36,0,0,0,0,0,0,0,
  896.     0,0,0,0,
  897.     0,0,0,0,0,0,0,0,0,206,234,232,231,238,227,53,
  898.     30,49,40,53,174,17,13,105,49,52,62,49,40,49,30,49,
  899.     49,47,43,52,47,44,44,43,43,43,43,43,62,40,49,43,
  900.     32,43,40,49,49,49,43,43,49,52,62,49,40,49,30,49,
  901.     49,47,43,52,47,43,44,43,40,43,43,43,62,40,49,11,
  902.     18,18,8,53,105,180,0,0,0,0,0,0,0,0,0,0,
  903.     0,0,0,0,
  904.     0,0,0,0,0,0,0,0,0,240,234,234,231,235,161,49,
  905.     40,43,49,49,44,9,5,13,108,53,40,43,43,43,52,43,
  906.     44,58,47,44,43,48,32,49,32,49,43,49,40,44,43,44,
  907.     43,43,40,49,47,44,43,62,58,43,40,43,43,48,52,43,
  908.     44,58,47,44,43,43,40,30,40,49,40,49,40,96,9,76,
  909.     184,5,117,3,0,0,0,0,0,0,0,0,0,0,0,0,
  910.     0,0,0,0,
  911.     0,0,0,0,0,0,0,0,0,37,231,239,231,42,28,30,
  912.     40,49,40,49,43,53,108,13,107,98,58,62,52,43,43,40,
  913.     49,30,49,30,43,40,43,43,43,49,43,62,62,43,32,49,
  914.     49,49,40,49,43,30,44,44,49,49,44,62,52,43,43,40,
  915.     49,30,49,30,43,40,43,43,43,49,43,62,182,244,20,103,
  916.     101,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  917.     0,0,0,0,
  918.     0,0,0,0,0,0,0,0,18,37,28,28,32,30,49,44,
  919.     30,30,44,48,32,62,49,155,17,184,106,155,62,40,47,62,
  920.     49,62,44,44,49,44,43,49,47,43,92,58,52,62,44,62,
  921.     49,30,44,48,30,62,49,49,52,92,44,49,62,40,47,62,
  922.     49,62,44,44,49,44,43,49,44,44,116,9,18,76,4,4,
  923.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  924.     0,0,0,0,
  925.     0,0,0,0,0,0,0,0,176,37,37,29,29,30,49,52,
  926.     43,92,40,43,62,43,62,58,51,9,103,184,15,84,43,44,
  927.     44,49,49,49,62,48,49,49,44,48,48,44,48,49,48,44,
  928.     43,92,40,44,62,43,44,58,32,43,43,44,47,91,43,44,
  929.     44,49,49,49,62,48,49,49,43,96,17,21,20,0,0,0,
  930.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  931.     0,0,0,0,
  932.     0,0,0,0,0,0,0,2,37,28,37,28,28,30,47,49,
  933.     62,49,44,43,40,43,43,48,62,53,241,22,103,114,9,113,
  934.     43,40,52,49,40,49,49,43,43,43,49,44,49,52,62,48,
  935.     92,32,52,43,40,43,48,48,62,32,62,43,40,30,49,40,
  936.     43,40,53,49,40,49,49,108,114,184,103,20,0,0,0,0,
  937.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  938.     0,0,0,0,
  939.     0,0,0,0,0,0,0,17,37,28,28,28,32,40,49,30,
  940.     49,49,92,49,43,62,44,49,40,91,49,105,5,112,112,5,
  941.     9,108,40,44,52,47,52,43,43,44,62,32,58,43,40,40,
  942.     48,49,92,49,43,62,44,49,43,58,49,49,44,47,62,44,
  943.     49,44,43,44,52,108,101,17,103,89,0,0,0,0,0,0,
  944.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  945.     0,0,0,0,
  946.     0,0,0,0,0,0,0,41,37,41,28,28,28,30,49,62,
  947.     48,62,30,40,43,44,43,92,44,32,49,49,44,117,15,21,
  948.     112,5,105,84,47,48,44,30,49,30,49,43,49,40,49,62,
  949.     48,62,30,40,43,62,43,92,44,40,40,49,43,52,49,48,
  950.     44,49,43,82,114,22,94,76,76,0,0,0,0,0,0,0,
  951.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  952.     0,0,0,0,
  953.     0,0,0,0,0,0,0,37,37,28,28,29,30,30,49,30,
  954.     43,49,43,52,43,32,52,44,49,43,40,52,30,32,113,6,
  955.     114,18,184,114,8,117,47,62,43,43,52,49,49,43,49,40,
  956.     44,49,48,52,43,30,43,52,49,43,43,62,32,49,47,43,
  957.     105,131,15,111,112,13,50,4,0,0,0,0,0,0,0,0,
  958.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  959.     0,0,0,0,
  960.     0,0,0,0,0,0,0,237,28,41,29,28,29,30,49,49,
  961.     30,43,43,44,43,52,7,106,242,243,3,0,3,180,244,95,
  962.     57,6,110,103,21,103,98,99,108,52,43,47,40,32,43,40,
  963.     30,43,44,52,47,58,40,40,92,62,43,40,96,152,15,93,
  964.     22,103,89,184,245,9,242,0,0,0,0,0,0,0,0,0,
  965.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  966.     0,0,0,0,
  967.     0,0,0,0,0,0,0,0,0,106,77,28,30,30,28,49,
  968.     49,145,7,111,4,0,0,0,0,0,0,0,0,0,0,0,
  969.     3,13,53,95,87,134,94,94,50,143,119,174,174,155,95,96,
  970.     155,43,113,44,43,148,83,108,73,95,110,13,14,18,18,17,
  971.     17,119,99,174,47,13,0,0,0,0,0,0,0,0,0,0,
  972.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  973.     0,0,0,0,
  974.     0,0,0,0,0,0,0,0,0,0,0,4,89,177,180,177,
  975.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  976.     0,0,0,180,106,105,100,8,99,119,111,22,22,112,17,13,
  977.     119,245,5,13,5,93,112,111,240,50,175,111,112,94,131,174,
  978.     174,116,97,58,98,0,0,0,0,0,0,0,0,0,0,0,
  979.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  980.     0,0,0,0,
  981.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  982.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  983.     0,0,0,0,0,0,4,111,114,95,6,8,114,14,13,103,
  984.     112,111,21,103,17,112,19,89,94,119,22,15,8,95,57,58,
  985.     43,40,48,116,36,0,0,0,0,0,0,0,0,0,0,0,
  986.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  987.     0,0,0,0,
  988.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  989.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  990.     0,0,0,0,0,0,0,0,0,0,3,89,15,99,113,95,
  991.     117,105,105,6,9,12,15,98,105,108,84,47,43,49,62,49,
  992.     43,43,10,1,36,0,0,0,0,0,0,0,0,0,0,0,
  993.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  994.     0,0,0,0,
  995.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  996.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  997.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,
  998.     180,99,99,155,49,30,44,49,43,49,148,43,52,52,44,44,
  999.     116,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  1000.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  1001.     0,0,0,0,
  1002.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  1003.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  1004.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  1005.     0,0,0,0,0,1,180,243,180,244,98,9,7,180,180,1,
  1006.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  1007.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  1008.     0,0,0,0
  1009.     };
  1010. /*
  1011.  * This structure is used for persistent data.
  1012.  */
  1013.  
  1014. #define B_W        0L  /* colors setting */
  1015. #define USE_FG_BG  1L
  1016. #define USE_COLORS 2L
  1017.  
  1018. #define LINEAR     0L  /* colorization settings */
  1019. #define BILINEAR   1L
  1020. #define SINUS      2L
  1021.  
  1022. #define IDEAL      0L  /* Perturbation settings */
  1023. #define PERTURBED  1L
  1024.  
  1025. typedef struct
  1026. {
  1027.   gdouble   scalex;
  1028.   gdouble   scaley;
  1029.   gdouble   cmplx;
  1030.   gdouble   blend_power;
  1031.   gint      seed;
  1032.   gint      tiling;
  1033.   glong     perturbation;
  1034.   glong     colorization;
  1035.   glong     colors;
  1036.   guchar    col1[4];
  1037.   guchar    col2[4];
  1038. } SinusVals;
  1039.  
  1040. static SinusVals svals = 
  1041. {
  1042.   15.0,
  1043.   15.0,
  1044.   1.0,
  1045.   0.0,
  1046.   42,
  1047.   TRUE,
  1048.   PERTURBED,
  1049.   LINEAR, 
  1050.   USE_COLORS,
  1051.   { 255, 255, 0, 255 },
  1052.   { 0, 0, 255, 255 }
  1053. };
  1054.  
  1055. typedef struct
  1056. {
  1057.   gint   height, width;
  1058.   double c11, c12, c13, c21, c22, c23, c31, c32, c33;
  1059.   double (*blend) (double );
  1060.   guchar r, g, b, a;
  1061.   int    dr, dg, db, da;
  1062. } params;
  1063.  
  1064.  
  1065. static gint              drawable_is_grayscale = FALSE;
  1066. static struct mwPreview *thePreview;
  1067. static GimpDrawable     *drawable;
  1068.  
  1069. /*  preview stuff -- to be removed as soon as we have a real libgimp preview  */
  1070.  
  1071. struct mwPreview
  1072. {
  1073.   gint     width;
  1074.   gint     height;
  1075.   gint     bpp;
  1076.   gdouble  scale;
  1077.   guchar  *bits;
  1078. };
  1079.  
  1080. #define PREVIEW_SIZE 100
  1081.  
  1082. static gint do_preview = TRUE;
  1083.  
  1084. static GtkWidget        * mw_preview_new          (GtkWidget        *parent,
  1085.                            struct mwPreview *mwp);
  1086. static struct mwPreview * mw_preview_build_virgin (GimpDrawable     *drw);
  1087.  
  1088. /* Declare functions */
  1089.  
  1090. static void query (void);
  1091. static void run   (gchar      *name,
  1092.            gint        nparams,
  1093.            GimpParam  *param,
  1094.            gint       *nreturn_vals,
  1095.            GimpParam **return_vals);
  1096. static void sinus (void);
  1097.  
  1098. static gdouble linear   (gdouble v);
  1099. static gdouble bilinear (gdouble v);
  1100. static gdouble cosinus  (gdouble v);
  1101.  
  1102. static gint    sinus_dialog     (void);
  1103. static void    sinus_do_preview (GtkWidget *widget);
  1104.  
  1105. static inline void compute_block_4 (guchar *dest_row, guint rowstride,
  1106.                     gint x0, gint y0, gint h, gint w, params *p);
  1107. static inline void compute_block_3 (guchar *dest_row, guint rowstride,
  1108.                     gint x0, gint y0, gint h, gint w, params *p);
  1109. static inline void compute_block_2 (guchar *dest_row, guint rowstride,
  1110.                     gint x0, gint y0, gint h, gint w, params *p);
  1111. static inline void compute_block_1 (guchar *dest_row, guint rowstride,
  1112.                     gint x0, gint y0, gint h, gint w, params *p);
  1113.  
  1114. GimpPlugInInfo PLUG_IN_INFO =
  1115. {
  1116.   NULL,  /* init_proc  */
  1117.   NULL,  /* quit_proc  */
  1118.   query, /* query_proc */
  1119.   run,   /* run_proc   */
  1120. };
  1121.  
  1122. MAIN ()
  1123.  
  1124. static void
  1125. query (void)
  1126. {
  1127.   static GimpParamDef args[] =
  1128.   {
  1129.     { GIMP_PDB_INT32,    "run_mode", "Interactive, non-interactive" },
  1130.     { GIMP_PDB_IMAGE,    "image", "Input image (unused)" },
  1131.     { GIMP_PDB_DRAWABLE, "drawable", "Input drawable" },
  1132.  
  1133.     { GIMP_PDB_FLOAT,    "xscale", "Scale value for x axis" },
  1134.     { GIMP_PDB_FLOAT,    "yscale", "Scale value dor y axis" },
  1135.     { GIMP_PDB_FLOAT,    "complex", "Complexity factor" },
  1136.     { GIMP_PDB_INT32,    "seed", "Seed value for random number generator" },
  1137.     { GIMP_PDB_INT32,    "tiling", "If set, the pattern generated will tile" },
  1138.     { GIMP_PDB_INT32,    "perturb", "If set, the pattern is a little more distorted..." },
  1139.     { GIMP_PDB_INT32,    "colors", "where to take the colors (0= B&W,  1= fg/bg, 2= col1/col2)"},
  1140.     { GIMP_PDB_COLOR,    "col1", "fist color (sometimes unused)" },
  1141.     { GIMP_PDB_COLOR,    "col2", "second color (sometimes unused)" },
  1142.     { GIMP_PDB_FLOAT,    "alpha1", "alpha for the first color (used if the drawable has an alpha chanel)" },
  1143.     { GIMP_PDB_FLOAT,    "alpha2", "alpha for the second color (used if the drawable has an alpha chanel)" },
  1144.     { GIMP_PDB_INT32,    "blend", "0= linear, 1= bilinear, 2= sinusoidal" },
  1145.     { GIMP_PDB_FLOAT,    "blend_power", "Power used to strech the blend" }
  1146.   };
  1147.   static gint nargs = sizeof (args) / sizeof (args[0]);
  1148.  
  1149.   INIT_I18N ();
  1150.  
  1151.   gimp_install_procedure ("plug_in_sinus",
  1152.               "Generates a texture with sinus functions",
  1153.               "FIX ME: sinus help",
  1154.               "Xavier Bouchoux",
  1155.               "Xavier Bouchoux",
  1156.               "1997",
  1157.               N_("<Image>/Filters/Render/Sinus..."),
  1158.               "RGB*, GRAY*",
  1159.               GIMP_PLUGIN,
  1160.               nargs, 0,
  1161.               args, NULL);
  1162. }
  1163.  
  1164. static void 
  1165. run (gchar      *name,
  1166.      gint        nparams,
  1167.      GimpParam  *param,
  1168.      gint       *nreturn_vals,
  1169.      GimpParam **return_vals)
  1170. {
  1171.   static GimpParam values[1];
  1172.   GimpRunModeType run_mode;
  1173.   GimpPDBStatusType status = GIMP_PDB_SUCCESS;
  1174.  
  1175.   run_mode = param[0].data.d_int32;
  1176.  
  1177.   *nreturn_vals = 1;
  1178.   *return_vals = values;
  1179.  
  1180.   INIT_I18N_UI();
  1181.  
  1182.   values[0].type = GIMP_PDB_STATUS;
  1183.   values[0].data.d_status = status;
  1184.  
  1185.   switch (run_mode)
  1186.     {
  1187.     case GIMP_RUN_INTERACTIVE:
  1188.       /*  Possibly retrieve data  */
  1189.       gimp_get_data ("plug_in_sinus", &svals);
  1190.  
  1191.       /* In order to prepare the dialog I need to know wether it's grayscale or not */
  1192.       drawable = gimp_drawable_get (param[2].data.d_drawable);
  1193.       thePreview = mw_preview_build_virgin(drawable);
  1194.       if (gimp_drawable_is_gray (drawable->id))
  1195.     drawable_is_grayscale = TRUE;
  1196.       else
  1197.     drawable_is_grayscale = FALSE;
  1198.  
  1199.       if (!sinus_dialog())
  1200.         return;
  1201.  
  1202.       break;
  1203.  
  1204.     case GIMP_RUN_NONINTERACTIVE:
  1205.       /*  Make sure all the arguments are there!  */
  1206.       if (nparams != 16)
  1207.     {
  1208.       status = GIMP_PDB_CALLING_ERROR;
  1209.     }
  1210.       else
  1211.     {
  1212.       svals.scalex       = param[3].data.d_float;
  1213.       svals.scaley       = param[4].data.d_float;
  1214.       svals.cmplx        = param[5].data.d_float;
  1215.       svals.seed         = param[6].data.d_int32;
  1216.       svals.tiling       = param[7].data.d_int32;
  1217.       svals.perturbation = param[8].data.d_int32;
  1218.       svals.colors       = param[9].data.d_int32;
  1219.       svals.col1[0]      = param[10].data.d_color.red;
  1220.       svals.col1[1]      = param[10].data.d_color.green;
  1221.       svals.col1[2]      = param[10].data.d_color.blue;
  1222.       svals.col2[0]      = param[11].data.d_color.red;
  1223.       svals.col2[1]      = param[11].data.d_color.green;
  1224.       svals.col2[2]      = param[11].data.d_color.blue;
  1225.       svals.col1[3]      = param[12].data.d_float * 255.0;
  1226.       svals.col2[3]      = param[13].data.d_float * 255.0;
  1227.       svals.colorization = param[14].data.d_int32;
  1228.       svals.blend_power  = param[15].data.d_float;
  1229.     }
  1230.       break;
  1231.  
  1232.     case GIMP_RUN_WITH_LAST_VALS:
  1233.       /*  Possibly retrieve data  */
  1234.       gimp_get_data ("plug_in_sinus", &svals);
  1235.       break;
  1236.  
  1237.     default:
  1238.       break;
  1239.     }
  1240.  
  1241.   /*  Get the specified drawable  */
  1242.   drawable = gimp_drawable_get (param[2].data.d_drawable);
  1243.  
  1244.   /*  Make sure that the drawable is gray or RGB */
  1245.   if ((status == GIMP_PDB_SUCCESS) &&
  1246.       (gimp_drawable_is_rgb (drawable->id) ||
  1247.        gimp_drawable_is_gray (drawable->id)))
  1248.     {
  1249.       gimp_progress_init (_("Sinus: rendering..."));
  1250.       gimp_tile_cache_ntiles (1);
  1251.       sinus ();
  1252.  
  1253.       if (run_mode != GIMP_RUN_NONINTERACTIVE)
  1254.     gimp_displays_flush ();
  1255.  
  1256.       /*  Store data  */
  1257.       if (run_mode == GIMP_RUN_INTERACTIVE)
  1258.         gimp_set_data ("plug_in_sinus", &svals, sizeof (SinusVals));
  1259.     }
  1260.   else
  1261.     {
  1262.       status = GIMP_PDB_EXECUTION_ERROR;
  1263.     }
  1264.  
  1265.   values[0].data.d_status = status;
  1266.  
  1267.   gimp_drawable_detach (drawable);
  1268. }
  1269.  
  1270. /*
  1271.  *  Main procedure
  1272.  */
  1273.  
  1274. static void 
  1275. prepare_coef (params *p)
  1276. {
  1277.   typedef struct { guchar r, g, b, a; } type_color;
  1278.   type_color col1,col2;
  1279.   double scalex = svals.scalex;
  1280.   double scaley = svals.scaley;
  1281.  
  1282.   srand(svals.seed);
  1283.   switch (svals.colorization)
  1284.     {
  1285.     case BILINEAR:
  1286.       p->blend = bilinear;
  1287.       break;
  1288.     case SINUS:
  1289.       p->blend = cosinus;
  1290.       break;
  1291.     case LINEAR:
  1292.     default:
  1293.       p->blend = linear;
  1294.     }
  1295.  
  1296.   if (svals.perturbation==IDEAL)
  1297.     {
  1298.       p->c11= 0*rand();
  1299.       p->c12= (2.0*rand()/(G_MAXRAND+1.0)-1)*scaley; /*rand+rand is used to keep */
  1300.       p->c13= (2*G_PI*rand())/G_MAXRAND;
  1301.       p->c21= 0*rand();
  1302.       p->c22= (2.0*rand()/(G_MAXRAND+1.0)-1)*scaley; /*correspondance beetween Ideal*/
  1303.       p->c23= (2*G_PI*rand())/G_MAXRAND;
  1304.       p->c31= (2.0*rand()/(G_MAXRAND+1.0)-1)*scalex; /*and perturbed coefs (I hope...)*/
  1305.       p->c32= 0*rand();
  1306.       p->c33= (2*G_PI*rand())/G_MAXRAND;
  1307.     }
  1308.   else
  1309.     {
  1310.       p->c11= (2.0*rand()/(G_MAXRAND+1.0)-1)*scalex;
  1311.       p->c12= (2.0*rand()/(G_MAXRAND+1.0)-1)*scaley;
  1312.       p->c13= (2*G_PI*rand())/G_MAXRAND;
  1313.       p->c21= (2.0*rand()/(G_MAXRAND+1.0)-1)*scalex;
  1314.       p->c22= (2.0*rand()/(G_MAXRAND+1.0)-1)*scaley;
  1315.       p->c23= (2*G_PI*rand())/G_MAXRAND;
  1316.       p->c31= (2.0*rand()/(G_MAXRAND+1.0)-1)*scalex;
  1317.       p->c32= (2.0*rand()/(G_MAXRAND+1.0)-1)*scaley;
  1318.       p->c33= (2*G_PI*rand())/G_MAXRAND;
  1319.     }
  1320.  
  1321.   if (svals.tiling)
  1322.     {
  1323.       p->c11= ROUND (p->c11/(2*G_PI))*2*G_PI;
  1324.       p->c12= ROUND (p->c12/(2*G_PI))*2*G_PI;
  1325.       p->c21= ROUND (p->c21/(2*G_PI))*2*G_PI;
  1326.       p->c22= ROUND (p->c22/(2*G_PI))*2*G_PI;
  1327.       p->c31= ROUND (p->c31/(2*G_PI))*2*G_PI;
  1328.       p->c32= ROUND (p->c32/(2*G_PI))*2*G_PI;
  1329.     }
  1330.  
  1331.   col2.a=svals.col2[3];
  1332.   col1.a=svals.col1[3];
  1333.  
  1334.   if (drawable_is_grayscale)
  1335.     {
  1336.       col1.r=col1.g=col1.b=255;
  1337.       col2.r=col2.g=col2.b=0;
  1338.     }
  1339.   else
  1340.     {
  1341.       switch (svals.colors)
  1342.     {
  1343.     case USE_COLORS:
  1344.       col1.r=svals.col1[0];
  1345.       col1.g=svals.col1[1];
  1346.       col1.b=svals.col1[2];
  1347.       col2.r=svals.col2[0];
  1348.       col2.g=svals.col2[1];
  1349.       col2.b=svals.col2[2];
  1350.       break;
  1351.     case B_W:
  1352.       col1.r=col1.g=col1.b=255;
  1353.       col2.r=col2.g=col2.b=0;
  1354.       break;
  1355.     case USE_FG_BG:
  1356.       gimp_palette_get_foreground(&col2.r, &col2.g, &col2.b);
  1357.       gimp_palette_get_background(&col1.r, &col1.g, &col1.b);
  1358.       break;
  1359.     }
  1360.     }
  1361.   p->r = col1.r;
  1362.   p->g = col1.g;
  1363.   p->b = col1.b;
  1364.   p->a = col1.a;
  1365.   p->dr=(int)col2.r-col1.r;
  1366.   p->dg=(int)col2.g-col1.g;
  1367.   p->db=(int)col2.b-col1.b;
  1368.   p->da=(int)col2.a-col1.a;
  1369. }
  1370.  
  1371. static void
  1372. sinus (void)
  1373. {
  1374.   params  p;
  1375.   gint    bytes;
  1376.   GimpPixelRgn dest_rgn;
  1377.   int     ix1, iy1, ix2, iy2;     /* Selected image size. */
  1378.   gpointer pr;
  1379.   gint progress, max_progress;
  1380.   
  1381.   prepare_coef(&p);
  1382.   
  1383.   gimp_drawable_mask_bounds(drawable->id, &ix1, &iy1, &ix2, &iy2);
  1384.   
  1385.   p.width = drawable->width;
  1386.   p.height = drawable->height;
  1387.   bytes = drawable->bpp;
  1388.   
  1389.   gimp_pixel_rgn_init(&dest_rgn, drawable, ix1, iy1, ix2-ix1, iy2-iy1, TRUE,TRUE);
  1390.   progress = 0;
  1391.   max_progress = (ix2-ix1)*(iy2-iy1);
  1392.   
  1393.   for (pr = gimp_pixel_rgns_register (1, &dest_rgn);
  1394.        pr != NULL;
  1395.        pr = gimp_pixel_rgns_process (pr))
  1396.     {
  1397.       switch (bytes)
  1398.     {
  1399.     case 4:
  1400.       compute_block_4 (dest_rgn.data, dest_rgn.rowstride,
  1401.                dest_rgn.x, dest_rgn.y, dest_rgn.w, dest_rgn.h, &p);
  1402.       break;
  1403.     case 3:
  1404.       compute_block_3 (dest_rgn.data, dest_rgn.rowstride,
  1405.                dest_rgn.x, dest_rgn.y, dest_rgn.w, dest_rgn.h, &p);
  1406.       break;
  1407.     case 2:
  1408.       compute_block_2 (dest_rgn.data, dest_rgn.rowstride,
  1409.                dest_rgn.x, dest_rgn.y, dest_rgn.w, dest_rgn.h, &p);
  1410.       break;
  1411.     case 1:
  1412.       compute_block_1 (dest_rgn.data, dest_rgn.rowstride,
  1413.                dest_rgn.x, dest_rgn.y, dest_rgn.w, dest_rgn.h, &p);
  1414.       break;
  1415.     }
  1416.       progress += dest_rgn.w * dest_rgn.h;
  1417.       gimp_progress_update ((double) progress / (double) max_progress);
  1418.     }
  1419.  
  1420.   gimp_drawable_flush (drawable);
  1421.   gimp_drawable_merge_shadow (drawable->id, TRUE);
  1422.   gimp_drawable_update (drawable->id, ix1, iy1, (ix2-ix1), (iy2-iy1));
  1423. }
  1424.  
  1425. static gdouble 
  1426. linear (gdouble v)
  1427. {
  1428.   register double a = v - (int) v;
  1429.  
  1430.   return (a < 0 ? 1.0 + a : a);
  1431. }
  1432.  
  1433. static gdouble 
  1434. bilinear (gdouble v)
  1435. {
  1436.   register double a = v - (int) v;
  1437.  
  1438.   a = (a < 0 ? 1.0 + a : a);
  1439.   return (a > 0.5 ? 2 - 2 * a : 2 * a);
  1440. }
  1441.  
  1442. static gdouble 
  1443. cosinus (gdouble v)
  1444. {
  1445.   return 0.5 - 0.5 * sin ((v + 0.25) * G_PI * 2);
  1446. }
  1447.  
  1448. static inline void 
  1449. compute_block_4 (guchar *dest_row, 
  1450.          guint   rowstride,
  1451.          gint    x0,
  1452.          gint    y0,
  1453.          gint    w,
  1454.          gint    h, 
  1455.          params *p)
  1456. {
  1457.   gint i,j;
  1458.   double x,y, grey;
  1459.   guchar *dest;
  1460.  
  1461.   for (j = y0; j < (y0 + h); j++)
  1462.     {
  1463.       y=((double)j)/p->height;
  1464.       dest = dest_row;
  1465.       for (i= x0; i<(x0+w); i++)
  1466.     {
  1467.       x=((double)i)/p->width;
  1468.  
  1469.       grey = sin(p->c11*x + p->c12*y + p->c13) * (0.5+0.5*sin(p->c31*x + p->c32*y +p->c33)) \
  1470.         + sin(p->c21*x + p->c22*y + p->c23) * (0.5-0.5*sin(p->c31*x + p->c32*y +p->c33));
  1471.       grey=pow(p->blend(svals.cmplx*(0.5+0.5*grey)),exp(svals.blend_power));
  1472.  
  1473.       *dest++= p->r+(int)(grey*p->dr);
  1474.       *dest++= p->g+(int)(grey*p->dg);
  1475.       *dest++= p->b+(int)(grey*p->db);
  1476.       *dest++= p->a+(int)(grey*p->da);
  1477.     }
  1478.       dest_row += rowstride;
  1479.     }
  1480. }
  1481.  
  1482. static inline void 
  1483. compute_block_3 (guchar *dest_row, 
  1484.          guint   rowstride,
  1485.          gint    x0,
  1486.          gint    y0,
  1487.          gint    w,
  1488.          gint    h, 
  1489.          params *p)
  1490. {
  1491.   gint i,j;
  1492.   double x,y, grey;
  1493.   guchar *dest;
  1494.  
  1495.   for (j=y0; j<(y0+h); j++)
  1496.     {
  1497.       y=((double)j)/p->height;
  1498.       dest = dest_row;
  1499.       for (i= x0; i<(x0+w); i++)
  1500.     {
  1501.       x=((double)i)/p->width;
  1502.  
  1503.       grey = sin(p->c11*x + p->c12*y + p->c13) * (0.5+0.5*sin(p->c31*x + p->c32*y +p->c33)) \
  1504.         + sin(p->c21*x + p->c22*y + p->c23) * (0.5-0.5*sin(p->c31*x + p->c32*y +p->c33));
  1505.       grey=pow(p->blend(svals.cmplx*(0.5+0.5*grey)),exp(svals.blend_power));
  1506.  
  1507.       *dest++= p->r+(int)(grey*p->dr);
  1508.       *dest++= p->g+(int)(grey*p->dg);
  1509.       *dest++= p->b+(int)(grey*p->db);
  1510.     }
  1511.       dest_row += rowstride;
  1512.     }
  1513. }
  1514.  
  1515. static inline void 
  1516. compute_block_2 (guchar *dest_row, 
  1517.          guint   rowstride,
  1518.          gint    x0,
  1519.          gint    y0,
  1520.          gint    w,
  1521.          gint    h, 
  1522.          params *p)
  1523. {
  1524.   gint i,j;
  1525.   double x,y, grey;
  1526.   guchar *dest;
  1527.  
  1528.   for (j=y0; j<(y0+h); j++)
  1529.     {
  1530.       y=((double)j)/p->height;
  1531.       dest = dest_row;
  1532.       for (i= x0; i<(x0+w); i++)
  1533.     {
  1534.       x=((double)i)/p->width;
  1535.  
  1536.       grey = sin(p->c11*x + p->c12*y + p->c13) * (0.5+0.5*sin(p->c31*x + p->c32*y +p->c33)) \
  1537.         + sin(p->c21*x + p->c22*y + p->c23) * (0.5-0.5*sin(p->c31*x + p->c32*y +p->c33));
  1538.       grey=pow(p->blend(svals.cmplx*(0.5+0.5*grey)),exp(svals.blend_power));
  1539.  
  1540.       *dest++= (guchar)(grey*255.0);
  1541.       *dest++= p->a+(int)(grey*p->da);
  1542.     }
  1543.       dest_row += rowstride;
  1544.     }
  1545. }
  1546.  
  1547. static inline void 
  1548. compute_block_1 (guchar *dest_row, 
  1549.          guint   rowstride,
  1550.          gint    x0,
  1551.          gint    y0,
  1552.          gint    w,
  1553.          gint    h, 
  1554.          params *p)
  1555. {
  1556.   gint i,j;
  1557.   double x,y, grey;
  1558.   guchar *dest;
  1559.  
  1560.   for (j=y0; j<(y0+h); j++)
  1561.     {
  1562.       y=((double)j)/p->height;
  1563.       dest = dest_row;
  1564.       for (i= x0; i<(x0+w); i++)
  1565.     {
  1566.       x=((double)i)/p->width;
  1567.  
  1568.       grey = sin(p->c11*x + p->c12*y + p->c13) * (0.5+0.5*sin(p->c31*x + p->c32*y +p->c33)) \
  1569.         + sin(p->c21*x + p->c22*y + p->c23) * (0.5-0.5*sin(p->c31*x + p->c32*y +p->c33));
  1570.       grey=pow(p->blend(svals.cmplx*(0.5+0.5*grey)),exp(svals.blend_power));
  1571.  
  1572.       *dest++= (guchar)(grey*255.0);
  1573.     }
  1574.       dest_row += rowstride;
  1575.     }
  1576. }
  1577.  
  1578. /* ---------------------------------------------------------------*/
  1579. /*  -------------------------- UI ------------------------------- */
  1580. /* -------------------------------------------------------------- */
  1581.  
  1582. static void
  1583. alpha_scale_cb (GtkAdjustment *adj,
  1584.         gpointer       data)
  1585. {
  1586.   guchar *val;
  1587.   GtkWidget *color_button;
  1588.  
  1589.   val = (guchar*) data;
  1590.  
  1591.   *val = (guchar)(adj->value * 255.0);
  1592.  
  1593.   color_button = gtk_object_get_user_data (GTK_OBJECT (adj));
  1594.   if (GIMP_IS_COLOR_BUTTON (color_button))
  1595.     gimp_color_button_update (GIMP_COLOR_BUTTON (color_button));
  1596. }
  1597.  
  1598. static void
  1599. alpha_scale_update (GtkWidget *color_button,
  1600.             gpointer   data)
  1601. {
  1602.   guchar *val;
  1603.   GtkWidget *adj;
  1604.  
  1605.   val = (guchar*)data;
  1606.  
  1607.   adj = gtk_object_get_user_data (GTK_OBJECT (color_button));
  1608.   gtk_signal_handler_block_by_data (GTK_OBJECT (adj), data);
  1609.   gtk_adjustment_set_value (GTK_ADJUSTMENT (adj), (gfloat)(*val) / 255.0);
  1610.   gtk_signal_handler_unblock_by_data (GTK_OBJECT (adj), data);
  1611.  
  1612.   if (do_preview)
  1613.     sinus_do_preview (NULL);
  1614. }
  1615.  
  1616. gboolean run_flag = FALSE;
  1617.  
  1618. static void
  1619. sinus_ok_callback (GtkWidget *widget,
  1620.            gpointer   data)
  1621. {
  1622.   run_flag = TRUE;
  1623.  
  1624.   gtk_widget_destroy (GTK_WIDGET (data));
  1625. }
  1626.  
  1627. static void
  1628. sinus_toggle_button_update (GtkWidget *widget,
  1629.                 gpointer   data)
  1630. {
  1631.   gimp_toggle_button_update (widget, data);
  1632.  
  1633.   if (do_preview)
  1634.     sinus_do_preview (NULL);
  1635. }
  1636.  
  1637. static void
  1638. sinus_radio_button_update (GtkWidget *widget,
  1639.                gpointer   data)
  1640. {
  1641.   gimp_radio_button_update (widget, data);
  1642.  
  1643.   if (do_preview)
  1644.     sinus_do_preview (NULL);
  1645. }
  1646.  
  1647. static void
  1648. sinus_int_adjustment_update (GtkAdjustment *adjustment,
  1649.                  gpointer       data)
  1650. {
  1651.   gimp_int_adjustment_update (adjustment, data);
  1652.  
  1653.   if (do_preview)
  1654.     sinus_do_preview (NULL);
  1655. }
  1656.  
  1657. static void
  1658. sinus_double_adjustment_update (GtkAdjustment *adjustment,
  1659.                 gpointer       data)
  1660. {
  1661.   gimp_double_adjustment_update (adjustment, data);
  1662.  
  1663.   if (do_preview)
  1664.     sinus_do_preview (NULL);
  1665. }
  1666.  
  1667. /*****************************************/
  1668. /* The note book                         */
  1669. /*****************************************/
  1670.  
  1671. gint
  1672. sinus_dialog (void)
  1673. {
  1674.   GtkWidget *dlg;
  1675.   GtkWidget *main_hbox;
  1676.   GtkWidget *preview;
  1677.   GtkWidget *notebook;
  1678.   GtkWidget *page;
  1679.   GtkWidget *frame;
  1680.   GtkWidget *label;
  1681.   GtkWidget *vbox;
  1682.   GtkWidget *vbox2;
  1683.   GtkWidget *hbox;
  1684.   GtkWidget *table;
  1685.   GtkWidget *toggle;
  1686.   GtkWidget *push_col1 = NULL;
  1687.   GtkWidget *push_col2 = NULL;
  1688.   GtkWidget *spinbutton;
  1689.   GtkObject *adj;
  1690.   GtkWidget *logo;
  1691.   gint x,y;
  1692.   char buf[3*100];
  1693.   guchar *data;
  1694.  
  1695.   gimp_ui_init ("sinus", TRUE);
  1696.  
  1697.   /* Create Main window with a vbox */
  1698.   /* ============================== */
  1699.   dlg = gimp_dialog_new (_("Sinus"), "sinus",
  1700.              gimp_standard_help_func, "filters/sinus.html",
  1701.              GTK_WIN_POS_MOUSE,
  1702.              FALSE, TRUE, FALSE,
  1703.  
  1704.              _("OK"), sinus_ok_callback,
  1705.              NULL, NULL, NULL, TRUE, FALSE,
  1706.              _("Cancel"), gtk_widget_destroy,
  1707.              NULL, 1, NULL, FALSE, TRUE,
  1708.  
  1709.              NULL);
  1710.  
  1711.   gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
  1712.               GTK_SIGNAL_FUNC (gtk_main_quit),
  1713.               NULL);
  1714.  
  1715.   main_hbox = gtk_hbox_new (FALSE, 6);
  1716.   gtk_container_set_border_width (GTK_CONTAINER (main_hbox), 6);
  1717.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), main_hbox,
  1718.               TRUE, TRUE, 0);
  1719.   gtk_widget_show (main_hbox);
  1720.  
  1721.   /* Create preview */
  1722.   /* ============== */
  1723.   vbox = gtk_vbox_new (TRUE, 4);
  1724.   gtk_box_pack_start (GTK_BOX (main_hbox), vbox, FALSE, FALSE, 0);
  1725.   gtk_widget_show (vbox);
  1726.  
  1727.   preview = mw_preview_new (vbox, thePreview);
  1728.   sinus_do_preview (preview);
  1729.  
  1730.   logo = gtk_preview_new (GTK_PREVIEW_COLOR);
  1731.   gtk_preview_size (GTK_PREVIEW(logo), 100, 100);
  1732.   gtk_box_pack_start (GTK_BOX (vbox), logo, TRUE, FALSE, 0);
  1733.   gtk_widget_show (logo);
  1734.  
  1735.   data = (guchar *) logo_data;
  1736.   for (y = 0; y < 100; y++)
  1737.     {
  1738.       for (x=0; x<100; x++)
  1739.     {
  1740.       HEADER_PIXEL (data, (&buf[3 * x]));
  1741.     }
  1742.       gtk_preview_draw_row (GTK_PREVIEW(logo), (guchar *) buf, 0, y, 100);
  1743.     }
  1744.  
  1745.   /* Create the notebook */
  1746.   /* =================== */
  1747.   notebook = gtk_notebook_new ();
  1748.   gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);
  1749.   gtk_box_pack_start (GTK_BOX (main_hbox), notebook, FALSE, FALSE, 0);
  1750.   gtk_widget_show (notebook);
  1751.  
  1752.   /* Create the drawing settings frame */
  1753.   /* ================================= */
  1754.   page = gtk_vbox_new (FALSE, 5);
  1755.   gtk_container_set_border_width (GTK_CONTAINER (page), 4);
  1756.  
  1757.   frame = gtk_frame_new (_("Drawing Settings"));
  1758.   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
  1759.   gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
  1760.   gtk_widget_show (frame);
  1761.  
  1762.   table = gtk_table_new(3, 3, FALSE);
  1763.   gtk_table_set_col_spacings (GTK_TABLE (table), 4);
  1764.   gtk_table_set_row_spacings (GTK_TABLE (table), 2);
  1765.   gtk_container_set_border_width (GTK_CONTAINER (table), 4);
  1766.   gtk_container_add (GTK_CONTAINER(frame), table);
  1767.  
  1768.   adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
  1769.                   _("X Scale:"), 140, 0,
  1770.                   svals.scalex, 0.0001, 100.0, 0.0001, 5, 4,
  1771.                   TRUE, 0, 0,
  1772.                   NULL, NULL);
  1773.   gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
  1774.               GTK_SIGNAL_FUNC (sinus_double_adjustment_update),
  1775.               &svals.scalex);
  1776.   
  1777.   adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
  1778.                   _("Y Scale:"), 140, 0,
  1779.                   svals.scaley, 0.0001, 100.0, 0.0001, 5, 4,
  1780.                   TRUE, 0, 0,
  1781.                   NULL, NULL);
  1782.   gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
  1783.               GTK_SIGNAL_FUNC (sinus_double_adjustment_update),
  1784.               &svals.scaley);
  1785.   
  1786.   adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
  1787.                   _("Complexity:"), 140, 0,
  1788.                   svals.cmplx, 0.0, 15.0, 0.01, 5, 2,
  1789.                   TRUE, 0, 0,
  1790.                   NULL, NULL);
  1791.   gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
  1792.               GTK_SIGNAL_FUNC (sinus_double_adjustment_update),
  1793.               &svals.cmplx);
  1794.  
  1795.   gtk_widget_show (table);
  1796.  
  1797.   frame= gtk_frame_new (_("Calculation Settings"));
  1798.   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
  1799.   gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
  1800.   gtk_widget_show (frame);
  1801.  
  1802.   vbox = gtk_vbox_new (FALSE, 4);
  1803.   gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
  1804.   gtk_container_add (GTK_CONTAINER (frame), vbox);
  1805.   gtk_widget_show (vbox);
  1806.  
  1807.   hbox = gtk_hbox_new (FALSE, 4);
  1808.   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
  1809.   gtk_widget_show (hbox);
  1810.  
  1811.   label = gtk_label_new (_("Random Seed:"));
  1812.   gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
  1813.   gtk_widget_show (label);
  1814.  
  1815.   spinbutton = gimp_spin_button_new (&adj, svals.seed,
  1816.                      -10000000000.0, 1000000000.0, 1.0, 10.0,
  1817.                      0.0, 0.0, 0);
  1818.   gtk_widget_set_usize (spinbutton, 100, -1);
  1819.   gtk_box_pack_start (GTK_BOX (hbox), spinbutton, FALSE, FALSE, 0);
  1820.   gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
  1821.               GTK_SIGNAL_FUNC (sinus_int_adjustment_update),
  1822.               &svals.seed);
  1823.   gtk_widget_show (spinbutton);
  1824.  
  1825.   toggle = gtk_check_button_new_with_label (_("Force Tiling?"));
  1826.   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), svals.tiling);
  1827.   gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
  1828.   gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
  1829.               GTK_SIGNAL_FUNC (sinus_toggle_button_update),
  1830.               &svals.tiling);
  1831.   gtk_widget_show (toggle);
  1832.  
  1833.   vbox2 =
  1834.     gimp_radio_group_new2 (FALSE, NULL,
  1835.                sinus_radio_button_update,
  1836.                &svals.perturbation, (gpointer) svals.perturbation,
  1837.  
  1838.                _("Ideal"),     (gpointer) IDEAL, NULL,
  1839.                _("Distorted"), (gpointer) PERTURBED, NULL,
  1840.  
  1841.                NULL);
  1842.  
  1843.   gtk_container_set_border_width (GTK_CONTAINER (vbox2), 0);
  1844.   gtk_box_pack_start (GTK_BOX (vbox), vbox2, FALSE, FALSE, 0);
  1845.   gtk_widget_show (vbox2);
  1846.  
  1847.   label = gtk_label_new (_("Settings"));
  1848.   gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  1849.   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, label);
  1850.   gtk_widget_show (page);
  1851.  
  1852.   /* Color settings dialog: */
  1853.   /* ====================== */
  1854.   page = gtk_vbox_new (FALSE, 4);
  1855.   gtk_container_set_border_width (GTK_CONTAINER (page), 4);
  1856.  
  1857.   if (drawable_is_grayscale) 
  1858.     {
  1859.       frame = gtk_frame_new (_("Colors"));
  1860.       gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
  1861.       gtk_box_pack_start(GTK_BOX(page), frame, FALSE, FALSE, 0);
  1862.       gtk_widget_show (frame);
  1863.  
  1864.       vbox = gtk_vbox_new (FALSE, 2);
  1865.       gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
  1866.       gtk_container_add (GTK_CONTAINER (frame), vbox);
  1867.       gtk_widget_show (vbox);
  1868.  
  1869.       /*if in grey scale, the colors are necessarily black and white */
  1870.       label = gtk_label_new (_("The colors are white and black."));
  1871.       gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  1872.       gtk_container_add (GTK_CONTAINER (vbox), label);
  1873.       gtk_widget_show (label);
  1874.     } 
  1875.   else
  1876.     {
  1877.       frame = gimp_radio_group_new2 (TRUE, _("Colors"),
  1878.                      sinus_radio_button_update,
  1879.                      &svals.colors, (gpointer) svals.colors,
  1880.  
  1881.                      _("Black & White"),
  1882.                      (gpointer) B_W, NULL,
  1883.                      _("Foreground & Background"),
  1884.                      (gpointer) USE_FG_BG, NULL,
  1885.                      _("Choose here:"),
  1886.                      (gpointer) USE_COLORS, NULL,
  1887.  
  1888.                      NULL);
  1889.  
  1890.       gtk_box_pack_start(GTK_BOX(page), frame, FALSE, FALSE, 0);
  1891.       gtk_widget_show (frame);
  1892.  
  1893.       vbox = GTK_BIN (frame)->child;
  1894.  
  1895.       hbox = gtk_hbox_new (TRUE, 20);
  1896.       gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
  1897.       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
  1898.  
  1899.       push_col1 = gimp_color_button_new (_("First Color"),
  1900.                      32, 32, svals.col1, 4);
  1901.       gtk_box_pack_start (GTK_BOX (hbox), push_col1, FALSE, FALSE, 0);
  1902.       gtk_widget_show (push_col1);
  1903.  
  1904.       push_col2 = gimp_color_button_new (_("Second Color"),
  1905.                      32, 32, svals.col2, 4);
  1906.       gtk_box_pack_start (GTK_BOX (hbox), push_col2, FALSE, FALSE, 0);
  1907.       gtk_widget_show (push_col2);
  1908.  
  1909.       gtk_widget_show (hbox);
  1910.     }
  1911.  
  1912.   frame = gtk_frame_new (_("Alpha Channels"));
  1913.   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
  1914.   gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
  1915.   gtk_widget_show (frame);
  1916.  
  1917.   table = gtk_table_new (2, 3, FALSE);
  1918.   gtk_table_set_col_spacings (GTK_TABLE (table), 4);
  1919.   gtk_table_set_row_spacings (GTK_TABLE (table), 2);
  1920.   gtk_container_set_border_width (GTK_CONTAINER (table), 4);
  1921.   gtk_container_add (GTK_CONTAINER (frame), table);
  1922.  
  1923.   adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
  1924.                   _("First Color:"), 0, 0,
  1925.                   svals.col1[3] / 255.0, 0.0, 1.0, 0.01, 0.1, 2,
  1926.                   TRUE, 0, 0,
  1927.                   NULL, NULL);
  1928.  
  1929.   gtk_object_set_user_data (GTK_OBJECT (adj), push_col1);      
  1930.   gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
  1931.                       GTK_SIGNAL_FUNC (alpha_scale_cb),
  1932.                       &svals.col1[3]);
  1933.  
  1934.   if (push_col1)
  1935.     {
  1936.       gtk_object_set_user_data (GTK_OBJECT (push_col1), adj);
  1937.       gtk_signal_connect (GTK_OBJECT (push_col1), "color_changed",
  1938.               GTK_SIGNAL_FUNC (alpha_scale_update),
  1939.               &svals.col1[3]);
  1940.     }
  1941.  
  1942.   adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
  1943.                   _("Second Color:"), 0, 0,
  1944.                   svals.col2[3] / 255.0, 0.0, 1.0, 0.01, 0.1, 2,
  1945.                   TRUE, 0, 0,
  1946.                   NULL, NULL);
  1947.  
  1948.   gtk_object_set_user_data (GTK_OBJECT (adj), push_col2);
  1949.   gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
  1950.                       GTK_SIGNAL_FUNC (alpha_scale_cb),
  1951.                       &svals.col2[3]);
  1952.  
  1953.   if (push_col2)
  1954.     {
  1955.       gtk_object_set_user_data (GTK_OBJECT (push_col2), adj);
  1956.       gtk_signal_connect (GTK_OBJECT (push_col2), "color_changed",
  1957.               GTK_SIGNAL_FUNC (alpha_scale_update),
  1958.               &svals.col2[3]);
  1959.     }
  1960.  
  1961.   gtk_widget_show (table);
  1962.  
  1963.   label = gtk_label_new (_("Colors"));
  1964.   gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  1965.   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, label);
  1966.   gtk_widget_show (page);
  1967.  
  1968.   /* blend settings dialog: */
  1969.   /* ====================== */
  1970.   page = gtk_vbox_new (FALSE, 4);
  1971.   gtk_container_set_border_width (GTK_CONTAINER (page), 4);
  1972.  
  1973.   frame = gtk_frame_new (_("Blend Settings"));
  1974.   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
  1975.   gtk_box_pack_start (GTK_BOX (page), frame, TRUE, TRUE, 0);
  1976.   gtk_widget_show (frame);
  1977.  
  1978.   vbox = gtk_vbox_new (FALSE, 4);
  1979.   gtk_container_add (GTK_CONTAINER (frame), vbox);
  1980.   gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
  1981.   gtk_widget_show (vbox);
  1982.  
  1983.   frame =
  1984.     gimp_radio_group_new2 (TRUE, _("Gradient"),
  1985.                sinus_radio_button_update,
  1986.                &svals.colorization, (gpointer) svals.colorization,
  1987.  
  1988.                _("Linear"),     (gpointer) LINEAR, NULL,
  1989.                _("Bilinear"),   (gpointer) BILINEAR, NULL,
  1990.                _("Sinusodial"), (gpointer) SINUS, NULL,
  1991.  
  1992.                NULL);
  1993.  
  1994.   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
  1995.   gtk_widget_show (frame);
  1996.  
  1997.   table = gtk_table_new (1, 3, FALSE);
  1998.   gtk_table_set_col_spacings (GTK_TABLE (table), 4);
  1999.   gtk_container_add (GTK_CONTAINER (vbox), table);
  2000.  
  2001.   adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
  2002.                   _("Exponent:"), 0, 0,
  2003.                   svals.blend_power, -7.5, 7.5, 0.01, 5.0, 2,
  2004.                   TRUE, 0, 0,
  2005.                   NULL, NULL);
  2006.   gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
  2007.               GTK_SIGNAL_FUNC (sinus_double_adjustment_update),
  2008.               &svals.blend_power);
  2009.  
  2010.   gtk_widget_show (table);
  2011.  
  2012.   label = gtk_label_new (_("Blend"));
  2013.   gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  2014.   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, label);
  2015.   gtk_widget_show (page);
  2016.  
  2017.   gtk_widget_show (dlg);
  2018.  
  2019.   gtk_main ();
  2020.   gdk_flush ();
  2021.  
  2022.   return run_flag;
  2023. }
  2024.  
  2025. /******************************************************************/
  2026. /* Draw preview image. if DoCompute is TRUE then recompute image. */
  2027. /******************************************************************/
  2028.  
  2029. void
  2030. sinus_do_preview (GtkWidget *widget)
  2031. {
  2032.   static GtkWidget *theWidget = NULL;
  2033.   gint y,rowsize;
  2034.   guchar *buf, *savbuf;
  2035.   params p;
  2036.  
  2037.   if (theWidget == NULL)
  2038.     {
  2039.       theWidget = widget;
  2040.     }
  2041.  
  2042.   rowsize = thePreview->width * thePreview->bpp;
  2043.   savbuf = buf = g_new (guchar, thePreview->width*thePreview->height*thePreview->bpp);
  2044.   if (buf != NULL)
  2045.     {
  2046.       p.height = thePreview->height;
  2047.       p.width = thePreview->width;
  2048.       prepare_coef (&p);
  2049.  
  2050.       if (thePreview->bpp == 3)
  2051.     compute_block_3 (buf, rowsize, 0, 0,
  2052.              thePreview->width, thePreview->height, &p);
  2053.       else if (thePreview->bpp == 1)
  2054.     {
  2055.       compute_block_1 (buf, rowsize, 0, 0,
  2056.                thePreview->width, thePreview->height, &p);
  2057.     }
  2058.       else
  2059.     fprintf (stderr, "Uh Oh....  Little sinus preview-only problem...\n");
  2060.  
  2061.       for (y = 0; y < thePreview->height; y++)
  2062.     {
  2063.       gtk_preview_draw_row (GTK_PREVIEW (theWidget),
  2064.                 buf, 0, y, thePreview->width);
  2065.       buf += rowsize;
  2066.     }
  2067.       g_free (savbuf);
  2068.       gtk_widget_draw (theWidget, NULL);
  2069.       gdk_flush ();
  2070.     }
  2071.   else
  2072.     {
  2073.       fprintf (stderr,"Not enough mem for sinus Preview...\n");
  2074.     }
  2075. }
  2076.  
  2077. static void
  2078. mw_preview_toggle_callback (GtkWidget *widget,
  2079.                             gpointer   data)
  2080. {
  2081.   gimp_toggle_button_update (widget, data);
  2082.  
  2083.   if (do_preview)
  2084.     sinus_do_preview (NULL);
  2085. }
  2086.  
  2087. static struct mwPreview *
  2088. mw_preview_build_virgin (GimpDrawable *drw)
  2089. {
  2090.   struct mwPreview *mwp;
  2091.  
  2092.   mwp = g_new (struct mwPreview, 1);
  2093.  
  2094.   if (drw->width > drw->height)
  2095.     {
  2096.       mwp->scale  = (gdouble) drw->width / (gdouble) PREVIEW_SIZE;
  2097.       mwp->width  = PREVIEW_SIZE;
  2098.       mwp->height = drw->height / mwp->scale;
  2099.     }
  2100.   else
  2101.     {
  2102.       mwp->scale  = (gdouble) drw->height / (gdouble) PREVIEW_SIZE;
  2103.       mwp->height = PREVIEW_SIZE;
  2104.       mwp->width  = drw->width / mwp->scale;
  2105.     }
  2106.  
  2107.   mwp->bpp  = 3;
  2108.   mwp->bits = NULL;
  2109.  
  2110.   return mwp;
  2111. }
  2112.  
  2113. static GtkWidget *
  2114. mw_preview_new (GtkWidget        *parent,
  2115.                 struct mwPreview *mwp)
  2116. {
  2117.   GtkWidget *preview;
  2118.   GtkWidget *frame;
  2119.   GtkWidget *pframe;
  2120.   GtkWidget *vbox;
  2121.   GtkWidget *button;
  2122.  
  2123.   frame = gtk_frame_new (_("Preview"));
  2124.   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
  2125.   gtk_box_pack_start (GTK_BOX (parent), frame, FALSE, FALSE, 0);
  2126.   gtk_widget_show (frame);
  2127.  
  2128.   vbox = gtk_vbox_new (FALSE, 2);
  2129.   gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
  2130.   gtk_container_add (GTK_CONTAINER (frame), vbox);
  2131.   gtk_widget_show (vbox);
  2132.  
  2133.   pframe = gtk_frame_new (NULL);
  2134.   gtk_frame_set_shadow_type (GTK_FRAME(pframe), GTK_SHADOW_IN);
  2135.   gtk_box_pack_start (GTK_BOX (vbox), pframe, FALSE, FALSE, 0);
  2136.   gtk_widget_show (pframe);
  2137.  
  2138.   preview = gtk_preview_new (GTK_PREVIEW_COLOR);
  2139.   gtk_preview_size (GTK_PREVIEW (preview), mwp->width, mwp->height);
  2140.   gtk_container_add (GTK_CONTAINER (pframe), preview);
  2141.   gtk_widget_show (preview);
  2142.  
  2143.   button = gtk_check_button_new_with_label (_("Do Preview"));
  2144.   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), do_preview);
  2145.   gtk_signal_connect (GTK_OBJECT (button), "toggled",
  2146.                       GTK_SIGNAL_FUNC (mw_preview_toggle_callback),
  2147.                       &do_preview);
  2148.   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
  2149.   gtk_widget_show (button);
  2150.  
  2151.   return preview;
  2152. }
  2153.