BigEasy/BigEasyGrafish.c

/*
    File:       BigEasyGrafish.c
 
    Contains:   xxx put contents here xxx
 
    Written by: xxx put writers here xxx
 
    Copyright:  © 1991, 1994 by Apple Computer, Inc., all rights reserved.
 
    This file is used in these builds: Warhol
 
    Change History (most recent first):
 
         <6+> universal headers
         <6>      9-8-94    dvb     
         <4>     1/20/92    dvb     Add more routines.
         <3>     5/23/91    PH      changes for THINK 5
         <2>     4/25/91    JB      Changing to new THINK_C interface files
 
    To Do:
*/
 
/* file: BigEasyGrafish.c
 *
 * Started 4 August 1989, more or less.
 *
 * A set of routines for doing certain
 * QuickDraw like operations on the Macintosh.
 *
 */
 
 
 
/*--------------------------------
    Inclusions
--------------------------------*/
 
#include <QuickDraw.h>
#include <Resources.h>
#include <Memory.h>
#include <Palettes.h>
#include <Gestalt.h>
 
#define BigEasyGrafish
 
#include "BigEasyGrafish.h"
 
 
/*--------------------------------
    Data
--------------------------------*/
 
unsigned char dGrayPat[] = {0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA};
unsigned char dBlackPat[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
 
 
/*--------------------------------
    Local Variables & Routines
--------------------------------*/
 
static Boolean GestaltColor(void);
static Boolean gBEGHasColor;
static Boolean gDoneColorGestalt = false;
 
 
/*--------------------------------
    Routines
--------------------------------*/
 
void RGBFore(unsigned short r,unsigned short g,unsigned short b)
    {
    GestaltColor();
    if(gBEGHasColor || 1)
        {
        RGBColor c;
 
        c.red = r;
        c.green = g;
        c.blue = b;
        RGBForeColor(&c);
        }
    else
        {
        unsigned long x;
 
        x = r + g + b;
        if ( x > (3 * 32768))
            ForeColor(whiteColor);
        else
            ForeColor(blackColor);
        }
    }
 
void RGBBack(unsigned short r,unsigned short g,unsigned short b)
    {
    GestaltColor();
    if(gBEGHasColor || 1)
        {
        RGBColor c;
 
        c.red = r;
        c.green = g;
        c.blue = b;
        RGBBackColor(&c);
        }
    else
        {
        unsigned long x;
 
        x = r + g + b;
        if ( x > (3 * 32768))
            BackColor(whiteColor);
        else
            BackColor(blackColor);
        }
    }
 
void GoWhite()
    {
    PenPat((Pattern *)dBlackPat);
    ForeColor(whiteColor);
    }
 
void GoGray()
    {
    PenPat((Pattern *)dBlackPat);
    RGBFore(32768,32768,32768);
    }
 
void GoBlack()
    {
    PenPat((Pattern *)dBlackPat);
    ForeColor(blackColor);
    }
 
void GoBW()
    {
    PenNormal();
    ForeColor(blackColor);
    BackColor(whiteColor);
    }
 
void RGBOp(unsigned short r,unsigned short g,unsigned short b)
    {
    RGBColor c;
    c.red = r;
    c.green = g;
    c.blue = b;
    OpColor(&c);
    }
 
void RGBHilite(unsigned short r,unsigned short g,unsigned short b)
    {
    RGBColor c;
    c.red = r;
    c.green = g;
    c.blue = b;
    HiliteColor(&c);
    }
 
void PmHilite(short h)
    {
    PaletteHandle ph;
    RGBColor c;
 
    ph = GetPalette(FrontWindow());
    GetEntryColor(ph,h,&c);
    HiliteColor(&c);
    }
 
 
 
void RampColorTable(CTabHandle ctH,short start,short length,
        unsigned short r1,unsigned short g1,unsigned short b1,
        unsigned short r2,unsigned short g2,unsigned short b2)
/*
  * Make an rgb ramp in the color table handle passed.
  */
    {
    long dr,dg,db;
    short i;
    ColorSpec *c;
 
    dr = r2-r1;
    dg = g2-g1;
    db = b2-b1;
 
    c = &(**ctH).ctTable[start];
    for(i = 0; i< length; i++)
        {
        c->value = start+i;
        c->rgb.red = r1+ dr*i/length;
        c->rgb.green = g1+ dg*i/length;
        c->rgb.blue = b1+ db*i/length;
        c++;
        }
    }
    
void FrameRectOutside(Rect *r)
    {
    Rect r2;
    PenState ps;
 
    r2 = *r;
    GetPenState(&ps);
    InsetRect(&r2,-ps.pnSize.h,-ps.pnSize.v);
    FrameRect(&r2);
    }
 
void DrawIcl8Resource(short id,Rect *r)
/*
 * Draw the icl8, disregarding masks and such
 */
    {
    PixMap pm;
    Handle h;
 
    h = GetResource('icl8',id);
    if(!h)
        {
        PaintRect(r);
        return;
        }
 
    HLock(h);
 
    pm.baseAddr = *h;
    pm.rowBytes = 32 | 0x8000;
    pm.bounds.top = pm.bounds.left = 0;
    pm.bounds.bottom = pm.bounds.right = 32;
    pm.pmVersion = 0;
    pm.packType = 0;
    pm.packSize = 0;
    pm.hRes = pm.vRes = 0x00480000;
    pm.pixelType = 0;
    pm.pixelSize = 8;
    pm.cmpCount = 1;
    pm.cmpSize = 8;
    pm.planeBytes = 0;
    pm.pmTable = GetCTable(8);
    pm.pmReserved = 0;
 
    CopyBits((void *)&pm,&qd.thePort->portBits,&pm.bounds,r,0,0);
 
    DisposeCTable(pm.pmTable);
    HUnlock(h);
    ReleaseResource(h);
    }
 
 
Boolean EasyHasColor(void)
/*
 * In a nutshell: returns True of the
 * 0,0-point of the current port is
 * anything besides a b/w situation.
 */
    {
    GDHandle gdH;
    Rect r;
    Boolean b;
 
    if(GestaltColor)
        {
        r = qd.thePort->portRect;
        LocalToGlobal((Point *)&r.top);
        LocalToGlobal((Point *)&r.bottom);
        gdH = GetMaxDevice(&r);
        if(gdH)
            b = (**(**gdH).gdPMap).pixelSize > 1;
        else
            b = false;      /* not on any device... whatever */
        }
    else
        b = false;
 
    return b;
    }
 
 
Boolean GestaltColor(void)
    {
    long result;
 
    if(!gDoneColorGestalt)
        gBEGHasColor = (Gestalt('qdrw',&result)) ?
                false : (result & (1<<gestaltHasDeepGWorlds)) != 0;
 
    return gBEGHasColor;
    }
 
void DrawPixMap(PixMap *pm,Rect *src,Rect *dst,short mode)
    {
    Rect srcR,dstR;
 
    if(src)
        srcR = *src;
    else
        srcR = pm->bounds;
 
    if(dst)
        dstR = *dst;
    else
        dstR = srcR;
 
    CopyBits((BitMap *)pm,&qd.thePort->portBits,&srcR,&dstR,mode,nil);
    }
 
void DrawPixMapOffset(PixMap *pm,short x,short y,short mode)
    {
    Rect r;
 
    r = pm->bounds;
    OffsetRect(&r,x,y);
    DrawPixMap(pm,nil,&r,mode);
    }