home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 6 / FreshFish_September1994.bin / bbs / misc / cp-4.3.lha / cP / Source / verttext.c < prev   
C/C++ Source or Header  |  1994-07-14  |  5KB  |  191 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <graphics/rastport.h>
  4. #include <proto/exec.h>
  5. #include <proto/graphics.h>
  6.  
  7.  
  8. struct RastPort *AllocRastPort(UWORD, UWORD, UWORD);
  9. struct RastPort *FreeRastPort(struct RastPort *);
  10. void Rotate(struct RastPort *, struct RastPort *);
  11.  
  12. /* Function to write Text vertically. Function allocates
  13.    two temporary rastports with bitmaps sized to fit the
  14.    text string using the source rastport's font. Next, it
  15.    calls Text() to write the string into tempRP then rotates
  16.    the text 90 degrees into vertRP. Finally,it uses ClipBlit
  17.    to place the text back into the source rastport at the
  18.    current position. Works with colorfonts and proportional
  19.    fonts. No guarantee it is bug free, or if it will work at
  20.    all ("it works here").
  21.  
  22.    Its arguments are the RastPort, the string, and the stringlength.
  23. */
  24.  
  25. void VertText(struct RastPort *r, UBYTE *s, LONG l)
  26. {
  27. struct TextExtent txex;
  28. struct RastPort  *tempRP;
  29. struct RastPort  *vertRP;
  30. UWORD   d, w, h;
  31.  
  32.      TextExtent( r, s, l, &txex);
  33.      
  34.      w = txex.te_Width + 8;  /* add 1 byte to be sure it fits */
  35.      h = txex.te_Height;
  36.      d = r->BitMap->Depth;
  37.      
  38.      tempRP = AllocRastPort( d, w, h);
  39.      vertRP = AllocRastPort( d, h, w);
  40.  
  41.      if ( tempRP && vertRP )
  42.        {
  43.           SetRast( tempRP, 0);
  44.           SetRast( vertRP, 0);
  45.  
  46.           SetFont( tempRP, r->Font);
  47.           SetAPen( tempRP, r->FgPen);
  48.  
  49.           Move( tempRP, 0, tempRP->Font->tf_Baseline);
  50.           Text( tempRP, s, l);
  51.  
  52.           Rotate( tempRP, vertRP);
  53.      
  54.           ClipBlit(vertRP, 0, 0, r, r->cp_x - r->Font->tf_Baseline, r->cp_y - w, h, w, 0x60);
  55.        }
  56.      if (vertRP) FreeRastPort( vertRP );
  57.      if (tempRP) FreeRastPort( tempRP );
  58. }
  59. /* Allocates and initializes a rastport. Must be freed
  60.    by call to FreeRastPort.
  61. */
  62. struct RastPort *AllocRastPort( UWORD depth, UWORD width, UWORD height)
  63. {
  64.    WORD i;
  65.  
  66.    struct BitMap   *b;
  67.    struct RastPort *r;
  68.  
  69.    b = (struct BitMap *) AllocMem(sizeof(struct BitMap), MEMF_CLEAR|MEMF_CHIP);
  70.    if (b == NULL) return(NULL);
  71.  
  72.    r = (struct RastPort *) AllocMem(sizeof(struct RastPort), MEMF_CLEAR);
  73.    if (r == NULL) goto cleanup;
  74.  
  75.    if (width & 0x7) width = (width & 0xFFF8) + 8;
  76.  
  77.    InitBitMap(b, depth, width, height);
  78.  
  79.    for (i = 0; i < depth; i++)
  80.      {
  81.           b->Planes[i] = (PLANEPTR) AllocRaster( width, height);
  82.           if (b->Planes[i] == NULL) goto cleanup;
  83.      }
  84.  
  85.    InitRastPort(r);
  86.    r->BitMap = b;
  87.  
  88.    return(r);
  89.  
  90. cleanup:
  91.    if (b) {
  92.       width = b->BytesPerRow << 3;
  93.       height = b->Rows;
  94.  
  95.       for (i = 0; i < depth; i++)
  96.          if (b->Planes[i]) FreeRaster(b->Planes[i], width, height);
  97.  
  98.       FreeMem(b, sizeof(struct BitMap));
  99.    }
  100.    if (r) FreeMem(r, sizeof(struct RastPort));
  101.  
  102.    return(NULL);
  103. }
  104.  
  105. /*
  106.    This function frees a RastPort allocated by AllocRastPort()
  107. */
  108. struct RastPort *FreeRastPort(struct RastPort *r)
  109. {
  110.    struct BitMap *b;
  111.    UWORD  width, height;
  112.    WORD   i;
  113.  
  114.    if (r == NULL) return(NULL);
  115.  
  116.    if (b = r->BitMap)
  117.      {
  118.           width = b->BytesPerRow << 3;
  119.           height = b->Rows;
  120.           for (i = 0; i < (int) b->Depth; i++)
  121.                if (b->Planes[i]) FreeRaster(b->Planes[i], width, height);
  122.           FreeMem(b, sizeof(struct BitMap));
  123.      }
  124.    FreeMem(r, sizeof(struct RastPort));
  125.  
  126.    return(NULL);
  127. }
  128. /* Rotates bitmap in source rastport (srp) 90 degrees and places result
  129.    in destination bitmap (drp). Both bitmaps should be allocated by call
  130.    to AllocRastPort(). Destination bitmap should be allocated with the
  131.    width and height reversed. This function does not check for this and
  132.    the results will be very unpredicatable if this is not the case.
  133.    This function splits up source bitmap into blocks of 8*8 bits and
  134.    rotates each block then writes them to the correct block in the
  135.    destination bitmap. 
  136. */
  137. void Rotate(struct RastPort *srp, struct RastPort *drp)
  138. {
  139.    static UWORD cbits[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
  140.  
  141.    UBYTE  *sptr, *dptr, *ptr;
  142.    UBYTE  nbits[8]; 
  143.    UWORD  bits;
  144.    WORD   i, j, k, l, m, n;
  145.    UWORD  drxbp, dblkc;
  146.  
  147.    /* offset to start of lower left block of destination bitmap */
  148.    drxbp = (drp->BitMap->Rows - 8) * drp->BitMap->BytesPerRow;
  149.  
  150.    /* destination block decrement */
  151.    dblkc =  drp->BitMap->BytesPerRow << 3;
  152.  
  153.    for (i = 0; i < srp->BitMap->Depth; i++)
  154.      {
  155.           sptr = (UBYTE *) srp->BitMap->Planes[i];
  156.           dptr = (UBYTE *) drp->BitMap->Planes[i];
  157.           
  158.           for (j = 0; j < drp->BitMap->BytesPerRow; j++)
  159.             {
  160.                n = srp->BitMap->BytesPerRow * j<<3;
  161.  
  162.                for (k = drxbp + j; k >= j; k -= dblkc)
  163.                  {
  164.                    for (l = 0; l < 8; l++) nbits[l] = 0;
  165.  
  166.                     ptr = &sptr[n];
  167.                     for (l = 0; l < 8; l++)
  168.                       {
  169.                          bits = ptr[0];
  170.                          for (m = 0; m < 8; m++)
  171.                            {
  172.                               if (bits & cbits[m]) nbits[7 - m] |= cbits[l];
  173.                            }
  174.                          ptr += srp->BitMap->BytesPerRow;
  175.                       }
  176.  
  177.                     ptr = &dptr[k];  
  178.                     for (l = 0; l < 8; l++)
  179.                       {
  180.                          ptr[0] = nbits[l];
  181.                          ptr   += drp->BitMap->BytesPerRow;
  182.                       }
  183.  
  184.                     n++; /* increment source block key */
  185.                  }  
  186.             }
  187.      }
  188.  
  189.    return;
  190. }
  191.