home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #3 / amigamamagazinepolishissue1998.iso / kolekcje / stanislaw_weslawski / garshnee / blankers / circles / blank.c next >
C/C++ Source or Header  |  1995-07-30  |  7KB  |  274 lines

  1. /*
  2.  *  Copyright (c) 1995 Andreas Schmitz
  3.  *  All rights reserved.
  4.  *
  5.  *  This is a blanker-module for Garshne-Blanker 3.6
  6.  *
  7.  *  Circles 38.1
  8.  *
  9.  */
  10.  
  11. #include <exec/types.h>
  12. #include <exec/memory.h>
  13. #include <graphics/gfx.h>
  14. #include <graphics/gfxmacros.h>
  15. #include <intuition/intuition.h>
  16. #include <intuition/screens.h>
  17.  
  18. #include <clib/exec_protos.h>
  19. #include <clib/dos_protos.h>
  20. #include <clib/intuition_protos.h>
  21.  
  22. #include <stdio.h>
  23. #include <math.h>
  24. #include <time.h>
  25. #include <float.h>
  26. #include <stdlib.h>
  27.  
  28. #include "/includes.h"
  29.  
  30. #include "liste.h"
  31.  
  32. #define NOCHANCE (-2)
  33.  
  34. #define WHEEL   0
  35. #define SCRMODE 2
  36.  
  37. #define PUNKTE 25751
  38.  
  39. #include "Circles_rev.h"
  40. STATIC const UBYTE VersTag[] = VERSTAG;
  41.  
  42. VOID Defaults( PrefObject *Prefs )
  43. {
  44.    Prefs[WHEEL].po_Active = 1;
  45.     Prefs[SCRMODE].po_Depth = 4;
  46. }
  47.  
  48. /* Kreis so gross wie es geht zeichnen (auf Farbe 0) */
  49. int kreis_expand1(UBYTE *tabelle,struct RastPort *rp,int cx,int cy)
  50. {
  51.    int i,x,y,back;
  52.  
  53.    if (ReadPixel(rp,cx,cy)!=0) return(NOCHANCE);
  54.    WritePixel(rp,cx,cy);
  55.  
  56.    for (i=0;i<PUNKTE;i++) {
  57.       if (i%700==10) {
  58.          back=ContinueBlanking();
  59.          if (back!=OK) return(back);
  60.       }
  61.       x=tabelle[i*2];
  62.       y=tabelle[i*2+1];
  63.       if (y==0) {
  64.          back=ReadPixel(rp,cx+x,cy)+ReadPixel(rp,cx-x,cy);
  65.          if (back>0) break;
  66.          back=ReadPixel(rp,cx,cy+x)+ReadPixel(rp,cx,cy-x);
  67.          if (back>0) break;
  68.          WritePixel(rp,cx+x,cy);
  69.          WritePixel(rp,cx-x,cy);
  70.          WritePixel(rp,cx,cy+x);
  71.          WritePixel(rp,cx,cy-x);
  72.          continue;
  73.       }
  74.       if (x==y) {
  75.          back=ReadPixel(rp,cx+x,cy+y)+ReadPixel(rp,cx+x,cy-y);
  76.          if (back>0) break;
  77.          back=ReadPixel(rp,cx-x,cy+y)+ReadPixel(rp,cx-x,cy-y);
  78.          if (back>0) break;
  79.          WritePixel(rp,cx+x,cy+y);
  80.          WritePixel(rp,cx+x,cy-y);
  81.          WritePixel(rp,cx-x,cy+y);
  82.          WritePixel(rp,cx-x,cy-y);
  83.       }
  84.       else {
  85.          back=ReadPixel(rp,cx+x,cy+y)+ReadPixel(rp,cx+x,cy-y);
  86.          if (back>0) break;
  87.          back=ReadPixel(rp,cx-x,cy+y)+ReadPixel(rp,cx-x,cy-y);
  88.          if (back>0) break;
  89.          back=ReadPixel(rp,cx+y,cy+x)+ReadPixel(rp,cx+y,cy-x);
  90.          if (back>0) break;
  91.          back=ReadPixel(rp,cx-y,cy+x)+ReadPixel(rp,cx-y,cy-x);
  92.          if (back>0) break;
  93.          WritePixel(rp,cx+x,cy+y);
  94.          WritePixel(rp,cx+x,cy-y);
  95.          WritePixel(rp,cx-x,cy+y);
  96.          WritePixel(rp,cx-x,cy-y);
  97.          WritePixel(rp,cx+y,cy+x);
  98.          WritePixel(rp,cx+y,cy-x);
  99.          WritePixel(rp,cx-y,cy+x);
  100.          WritePixel(rp,cx-y,cy-x);
  101.       }
  102.    }
  103.    return(OK);
  104. }
  105.  
  106. /* Kreis so gross wie es geht zeichnen */
  107. int kreis_expand2(UBYTE *tabelle,struct RastPort *rp,int cx,int cy)
  108. {
  109.    int i,x,y,back,farbe;
  110.  
  111.    farbe=ReadPixel(rp,cx,cy);
  112.    WritePixel(rp,cx,cy);
  113.  
  114.    for (i=0;i<PUNKTE;i++) {
  115.       if (i%700==10) {
  116.          back=ContinueBlanking();
  117.          if (back!=OK) return(back);
  118.       }
  119.       x=tabelle[i*2];
  120.       y=tabelle[i*2+1];
  121.       if (y==0) {
  122.          back=ReadPixel(rp,cx+x,cy);
  123.          if (back!=farbe) break;
  124.          back=ReadPixel(rp,cx-x,cy);
  125.          if (back!=farbe) break;
  126.          back=ReadPixel(rp,cx,cy+x);
  127.          if (back!=farbe) break;
  128.          back=ReadPixel(rp,cx,cy-x);
  129.          if (back!=farbe) break;
  130.          WritePixel(rp,cx+x,cy);
  131.          WritePixel(rp,cx-x,cy);
  132.          WritePixel(rp,cx,cy+x);
  133.          WritePixel(rp,cx,cy-x);
  134.          continue;
  135.       }
  136.       if (x==y) {
  137.          back=ReadPixel(rp,cx+x,cy+y);
  138.          if (back!=farbe) break;
  139.          back=ReadPixel(rp,cx+x,cy-y);
  140.          if (back!=farbe) break;
  141.          back=ReadPixel(rp,cx-x,cy+y);
  142.          if (back!=farbe) break;
  143.          back=ReadPixel(rp,cx-x,cy-y);
  144.          if (back!=farbe) break;
  145.          WritePixel(rp,cx+x,cy+y);
  146.          WritePixel(rp,cx+x,cy-y);
  147.          WritePixel(rp,cx-x,cy+y);
  148.          WritePixel(rp,cx-x,cy-y);
  149.       }
  150.       else {
  151.          back=ReadPixel(rp,cx+x,cy+y);
  152.          if (back!=farbe) break;
  153.          back=ReadPixel(rp,cx+x,cy-y);
  154.          if (back!=farbe) break;
  155.          back=ReadPixel(rp,cx-x,cy+y);
  156.          if (back!=farbe) break;
  157.          back=ReadPixel(rp,cx-x,cy-y);
  158.          if (back!=farbe) break;
  159.          back=ReadPixel(rp,cx+y,cy+x);
  160.          if (back!=farbe) break;
  161.          back=ReadPixel(rp,cx+y,cy-x);
  162.          if (back!=farbe) break;
  163.          back=ReadPixel(rp,cx-y,cy+x);
  164.          if (back!=farbe) break;
  165.          back=ReadPixel(rp,cx-y,cy-x);
  166.          if (back!=farbe) break;
  167.          WritePixel(rp,cx+x,cy+y);
  168.          WritePixel(rp,cx+x,cy-y);
  169.          WritePixel(rp,cx-x,cy+y);
  170.          WritePixel(rp,cx-x,cy-y);
  171.          WritePixel(rp,cx+y,cy+x);
  172.          WritePixel(rp,cx+y,cy-x);
  173.          WritePixel(rp,cx-y,cy+x);
  174.          WritePixel(rp,cx-y,cy-x);
  175.       }
  176.    }
  177.    if (i==0) return(NOCHANCE);
  178.    return(OK);
  179. }
  180.  
  181. /* This is the blanker */
  182. LONG Kreise( struct Screen *Scr, SHORT breit, SHORT hoch, UBYTE *tabelle,char whinawh)
  183. {
  184.     struct RastPort *RP = &( Scr->RastPort );
  185.    struct ViewPort *VP = &( Scr->ViewPort );
  186.  
  187.    int   x,y,colors,
  188.          zeit,
  189.          back,count;
  190.  
  191.    srand((unsigned)clock());
  192.  
  193.    colors = (1L << RP->BitMap->Depth);
  194.    SetRGB4( VP, 0, 0, 0, 0 );
  195.     SetRGB4( VP, 1, 0, 0, 0 );
  196.    for (x=2;x<colors;x++) SetRGB4(VP,x,rand()%16,rand()%16,rand()%16);
  197.    colors=colors-2;
  198.  
  199.    SetOPen(RP,1);
  200.    SetAPen(RP,0);
  201.    RectFill(RP,0,0,breit-1,hoch-1);
  202.  
  203.     ScreenToFront( Scr );
  204.  
  205.    zeit=clock()+10;
  206.  
  207.     while(1) {
  208.  
  209.        x=1+rand()%(breit-2);
  210.       y=1+rand()%(hoch-2);
  211.  
  212.        SetAPen(RP,2+rand()%colors);
  213.  
  214.       if (whinawh==0) {
  215.          back=kreis_expand1(tabelle,RP,x,y);
  216.       }
  217.       else {
  218.          back=kreis_expand2(tabelle,RP,x,y);
  219.       }
  220.       if (back==NOCHANCE) {
  221.          count++;
  222.          if (count>breit*hoch/700) return(OK);
  223.       }
  224.       else {
  225.          if (back!=OK) return(back);
  226.          count=0;
  227.       }
  228.  
  229.       if (clock()>zeit) {
  230.          back=ContinueBlanking();
  231.          if (back!=OK) return(back);
  232.          ScreenToFront( Scr );
  233.          zeit=clock()+10;
  234.       }
  235.     }
  236.  
  237.     return 0;
  238. }
  239.  
  240. LONG Blank( PrefObject *Prefs )
  241. {
  242.     struct Screen *Scr;
  243.     struct Window *Wnd;
  244.    UBYTE *tabelle;
  245.     LONG RetVal;
  246.    char depth;
  247.     
  248.    tabelle=(UBYTE *)liste;
  249.  
  250.    depth=Prefs[SCRMODE].po_Depth;
  251.    if (depth==1) depth=2;
  252.  
  253.     if( Scr = OpenScreenTags( NULL, SA_Depth, depth,
  254.                              SA_Quiet, TRUE, SA_DisplayID, Prefs[SCRMODE].po_ModeID,
  255.                              SA_Behind, TRUE, SA_Overscan, OSCAN_STANDARD,
  256.                              TAG_DONE ))
  257.     {
  258.  
  259.       SetRGB4( &( Scr->ViewPort ),0,0,0,0);
  260.         Wnd = BlankMousePointer( Scr );
  261.        ScreenToFront( Scr );
  262.  
  263.         do
  264.             RetVal=Kreise(Scr,Scr->Width,Scr->Height,tabelle,(char)Prefs[WHEEL].po_Active);
  265.         while( RetVal == OK );
  266.         
  267.         UnblankMousePointer( Wnd );
  268.         CloseScreen( Scr );
  269.     }
  270.     else RetVal = FAILED;
  271.  
  272.     return RetVal;
  273. }
  274.