Directory Contents Search


DaVinci 4: Quellcode der Funktion RotateDIB (Vereinfacht)

/*------------------------------------------------------------------

L E O N A R D O : Statische Linkbibliothek mit Routinen zur

      

Handhabung von DIBs (Device-Independend-Bitmaps)

    

im Anwendungsprogramm

(C) 1993-1995  Dipl. Ing. Bernd Herd

    

Ketteler Str. 35

    

68642 Bürstadt

rotate.c:   Rotiere Bitmap

------------------------------------------------------------------*/

#include <windows.h>

#include "Leonardo.h"

    

// Headerfile für Anwendungsprogramme

#include "Leonardi.h"

    

// Bibliotheksinterner Headerfile

#pragma hdrstop

#include <string.h>

#include <math.h>

#define SCALE 10000

#define PI 3.141592655

// ---------- Übergabedaten Callback --------------------

typedef struct {

RECT rc;      // Lage des Ziel-Rechtecks im Quell-Rechteck

int sinval, cosval;    // Sinus und Cosinus des Drehwinkels

} ROTPARAM;

BOOL CALLBACK RotateCallback(UINT msg, LPPOINT lppt, LONG lParam)

{ ROTPARAM FAR *rtp = (ROTPARAM FAR *) lParam;

POINT pt;

if (msg == TRFM_PIXEL) {

pt = *lppt;

pt.x += rtp->rc.left;

pt.y += rtp->rc.bottom;

/* pt.y = (int) ((fabs(sin(pt.y * PI/2 / (rtp->rc.top-rtp->rc.bottom) )) * (rtp->rc.top -rtp->rc.bottom)));

pt.x = (int) ((fabs(cos(pt.x * PI/2 / (rtp->rc.right-rtp->rc.left) )) * (rtp->rc.right-rtp->rc.left ))); */

lppt->x = MulDiv(pt.x, rtp->cosval, SCALE) + MulDiv(pt.y, rtp->sinval, SCALE);

lppt->y = MulDiv(pt.x, -rtp->sinval, SCALE) + MulDiv(pt.y, rtp->cosval, SCALE);

}

return TRUE;

}

/* RotateDIB -------------------------------------------------------------

Erzeugt eine neue DIB gleichen Aufbaus die eine gedrehte Darstellung

der übergebenen DIB enthält. Benutzt DIBTransform

hdib : Handle der zu drehenden DIB

Angle : Winkel in 1/10 Grad, Positiv für Linksdrehung

RückGabe : NULL

Wenn erfolglos

hDIB     Wenn erfolgreich

-------------------------------------------------------------------------*/

HDIB API RotateDIB(HDIB hdib, int Angle, COLORREF clBkColor)

{ LPBITMAPINFOHEADER lpbmi;

HDIB

  

hnewdib=NULL;

UINT

  

Width, Height;

POINT

  

rect[4];

int

  

sinval = (int) (sin(Angle * (PI / 180.0 / 10.0)) * SCALE),

  

cosval = (int) (cos(Angle * (PI / 180.0 / 10.0)) * SCALE);

int

  

i;

POINT

pt;

RECT

  

rc;

ROTPARAM

rtp;

if (NULL != hdib &&

NULL != (lpbmi = (LPBITMAPINFOHEADER) GlobalLock(hdib) )

) {

Width = (int) lpbmi->biWidth;

Height= (int) lpbmi->biHeight;

// --------- Berechnen gedrehte Randkoordinaten ----------

rect[0].x = rect[3].x =

rect[0].y = rect[1].y = 0;

  

rect[1].x = rect[2].x =   Width -1;

    

rect[2].y = rect[3].y = Height-1;

SetRect(&rc, 32767, -32767, -32767, 32767);

for (i=0; i<4; ++i) {

pt.x = MulDiv(rect[i].x, cosval, SCALE) + MulDiv(rect[i].y, -sinval, SCALE);

pt.y = MulDiv(rect[i].x, sinval, SCALE) + MulDiv(rect[i].y, cosval, SCALE);

rect[i] = pt;

// --------- Neue Bitmapgröße und- Lage ------------------

if (pt.x < rc.left) rc.left =pt.x;

if (pt.x > rc.right) rc.right=pt.x;

if (pt.y < rc.bottom)rc.bottom=pt.y;

if (pt.y > rc.top) rc.top =pt.y;

}

// ----------- Erzeuge DIB der neuen Größe ---------------

hnewdib = CreatecompatibleDIB(hdib, rc.right-rc.left, rc.top-rc.bottom);

if (hnewdib) {

rtp.rc = rc;

rtp.sinval = sinval;

rtp.cosval = cosval;

TransformDIB(hdib, hnewdib, RotateCallback, NULL, (LPARAM) (LPSTR) &rtp, clBkColor);

}

GlobalUnlock(hdib);

}

return hnewdib;

}

-


Valid HTML 4.01!