mirror of
https://github.com/n5ac/mmsstv.git
synced 2025-12-06 04:12:03 +01:00
5930 lines
131 KiB
C++
5930 lines
131 KiB
C++
//Copyright+LGPL
|
||
|
||
//-----------------------------------------------------------------------------------------------------------------------------------------------
|
||
// Copyright 2000-2013 Makoto Mori, Nobuyuki Oba
|
||
//-----------------------------------------------------------------------------------------------------------------------------------------------
|
||
// This file is part of MMSSTV.
|
||
|
||
// MMSSTV is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License
|
||
// as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||
|
||
// MMSSTV is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||
|
||
// You should have received a copy of the GNU Lesser General Public License along with MMTTY. If not, see
|
||
// <http://www.gnu.org/licenses/>.
|
||
//-----------------------------------------------------------------------------------------------------------------------------------------------
|
||
|
||
|
||
|
||
//---------------------------------------------------------------------------
|
||
#include <vcl.h>
|
||
#pragma hdrstop
|
||
|
||
#include "Draw.h"
|
||
#include "main.h"
|
||
|
||
#include "LineSet.h"
|
||
#include "TextIn.h"
|
||
#include "ColorBar.h"
|
||
#include "PicSel.h"
|
||
#include "PicRect.h"
|
||
#include "MacroKey.h"
|
||
#include "ColorSet.h"
|
||
#include "ZoomView.h"
|
||
#include "PicFilte.h"
|
||
|
||
TColor TransCol;
|
||
CDrawGroup DrawPara;
|
||
CLIBL Libl;
|
||
|
||
LPCSTR _ShapePIC[2][7]={
|
||
{ "Rectangle", "Round Rect 1", "Round Rect 2", "Round Rect 3", "Ellipse", "Polygon", NULL },
|
||
{ "’·•ûŒ`", "ŠÛ’·•ûŒ`1", "ŠÛ’·•ûŒ`2", "ŠÛ’·•ûŒ`3", "‘ȉ~", "‘½ŠpŒ`", NULL },
|
||
};
|
||
LPCSTR _ShapeBOX[2][7]={
|
||
{ "Rectangle", "Round Rect 1", "Round Rect 2", "Round Rect 3", "Ellipse", "Circle", NULL },
|
||
{ "’·•ûŒ`", "ŠÛ’·•ûŒ`1", "ŠÛ’·•ûŒ`2", "ŠÛ’·•ûŒ`3", "‘ȉ~", "‰~", NULL },
|
||
};
|
||
|
||
int SXW;
|
||
int SYW;
|
||
void __fastcall SetDrawSize(int x, int y)
|
||
{
|
||
if( x >= 320 ) SXW = x;
|
||
if( y >= 256 ) SYW = y;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
static CDrawText CurText;
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall IsInside(POINT &pnt, RECT &rc)
|
||
{
|
||
if( rc.left < rc.right ){
|
||
if( pnt.x < rc.left ) return FALSE;
|
||
if( pnt.x > rc.right ) return FALSE;
|
||
}
|
||
else {
|
||
if( pnt.x > rc.left ) return FALSE;
|
||
if( pnt.x < rc.right ) return FALSE;
|
||
}
|
||
if( rc.top > rc.bottom ){
|
||
if( pnt.y > rc.top ) return FALSE;
|
||
if( pnt.y < rc.bottom ) return FALSE;
|
||
}
|
||
else {
|
||
if( pnt.y < rc.top ) return FALSE;
|
||
if( pnt.y > rc.bottom ) return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
int __fastcall IsNear(POINT &pnt, POINT &tpnt, int Width)
|
||
{
|
||
RECT rc;
|
||
rc.left = tpnt.x - Width;
|
||
rc.right = tpnt.x + Width;
|
||
rc.top = tpnt.y + Width;
|
||
rc.bottom = tpnt.y - Width;
|
||
return IsInside(pnt, rc);
|
||
}
|
||
|
||
int __fastcall IsLine(POINT &pnt, POINT &spnt, POINT &tpnt, int Width)
|
||
{
|
||
int Xw = tpnt.x - spnt.x;
|
||
int Yw = tpnt.y - spnt.y;
|
||
double A, B;
|
||
int C;
|
||
|
||
if( IsNear(pnt, spnt, Width)==TRUE ){
|
||
return HT_P1; /* Žn“_‚ƈê’v */
|
||
}
|
||
else if( IsNear(pnt, tpnt, Width)==TRUE ){
|
||
return HT_P2; /* <20>I“_‚ƈê’v */
|
||
}
|
||
if( spnt.x > tpnt.x ){ /* X•ûŒü‚Ì“ü‚ê‘Ö‚¦ */
|
||
POINT bpnt = spnt;
|
||
spnt = tpnt;
|
||
tpnt = bpnt;
|
||
}
|
||
if( (pnt.x >= (spnt.x-Width)) && (pnt.x <= (tpnt.x+Width)) ){
|
||
if( Xw ){
|
||
A = double(Yw)/double(Xw);
|
||
B = double(spnt.y) - (A * double(spnt.x));
|
||
C = int((A * double(pnt.x)) + B);
|
||
A = A < 0.0 ? -A : A;
|
||
if( A >= 1.0 ){
|
||
Width = int(double(Width) * A);
|
||
}
|
||
if( (pnt.y < (C+Width)) && (pnt.y >= (C-Width)) ){
|
||
return HT_PM;
|
||
}
|
||
}
|
||
else if( spnt.y > tpnt.y ){
|
||
if( (pnt.y < spnt.y) && (pnt.y > tpnt.y) ){
|
||
return HT_PM;
|
||
}
|
||
}
|
||
else if( (pnt.y > spnt.y) && (pnt.y < tpnt.y) ){
|
||
return HT_PM;
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int __fastcall IsLine(POINT &pnt, POINT &spnt, POINT &tpnt)
|
||
{
|
||
int r = IsLine(pnt, spnt, tpnt, 4);
|
||
if( (r == HT_P1)||(r == HT_P2) ) return r;
|
||
return IsLine(pnt, spnt, tpnt, 10) ? HT_PM : 0;
|
||
}
|
||
|
||
//---------------------------------------------------------------------------
|
||
// ŽÀŒ»<C592>F‚ð•Ô‚·
|
||
TColor __fastcall GetNearestColor(TColor col)
|
||
{
|
||
if( (sys.m_BitPixel < 24) && Mmsstv->pBitmapNearest ){
|
||
TCanvas *pCanvas = Mmsstv->pBitmapNearest->Canvas;
|
||
pCanvas->Pixels[0][0] = TColor(col);
|
||
col = pCanvas->Pixels[0][0];
|
||
}
|
||
return col;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
TColor __fastcall GetUniqueColor(TColor col)
|
||
{
|
||
#if 1
|
||
col = TColor(DWORD(col) & 0x00f0f0f0);
|
||
COLD c;
|
||
c.c = col;
|
||
DWORD r;
|
||
|
||
while(!c.d || (c.c == col)){
|
||
r = rand(); r = r << 4;
|
||
c.b.r = (BYTE)(r & 0x00f0); r = r >> 4;
|
||
c.b.g = (BYTE)(r & 0x00f0); r = r >> 4;
|
||
c.b.b = (BYTE)(r & 0x00f0);
|
||
}
|
||
col = GetNearestColor(c.c);
|
||
return col;
|
||
#else
|
||
col = TColor(DWORD(col) & 0x00e0e0e0);
|
||
DWORD c = DWORD(col);
|
||
|
||
while(!c || (c == DWORD(col))){
|
||
|
||
c = (rand() & 0x00e0) + ((rand() & 0x00e0) << 8) + ((rand() & 0x00e0) << 16);
|
||
}
|
||
col = GetNearestColor(TColor(c));
|
||
return col;
|
||
#endif
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
HBITMAP __cdecl mmLoadImageMenu(DWORD sw, int xw, int yw)
|
||
{
|
||
HBITMAP hb = NULL;
|
||
|
||
int x = xw;
|
||
int y = yw;
|
||
if( sw ){
|
||
x = 320; y = 256;
|
||
}
|
||
Graphics::TBitmap* pBitmap = CreateBitmap(x, y, pf24bit);
|
||
if( Mmsstv->LoadBitmapMenu(pBitmap, sw) ){
|
||
hb = pBitmap->ReleaseHandle();
|
||
}
|
||
delete pBitmap;
|
||
return hb;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
HBITMAP __cdecl mmLoadImage(LPCSTR pName)
|
||
{
|
||
HBITMAP hb = NULL;
|
||
|
||
Graphics::TBitmap* pBitmap = new Graphics::TBitmap;
|
||
pBitmap->PixelFormat = pf24bit;
|
||
if( LoadImage(pBitmap, pName) ){
|
||
hb = pBitmap->ReleaseHandle();
|
||
}
|
||
delete pBitmap;
|
||
return hb;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
HBITMAP __fastcall LoadRefImage(Graphics::TBitmap *pRef)
|
||
{
|
||
Graphics::TBitmap* pBitmap = new Graphics::TBitmap;
|
||
pBitmap->PixelFormat = pf24bit;
|
||
CopyBitmap(pBitmap, pRef);
|
||
HBITMAP hb = pBitmap->ReleaseHandle();
|
||
delete pBitmap;
|
||
return hb;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
HBITMAP __cdecl mmLoadHistImage(void)
|
||
{
|
||
return LoadRefImage(Mmsstv->pBitmapHist);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
HBITMAP __cdecl mmLoadRxImage(void)
|
||
{
|
||
return LoadRefImage(Mmsstv->pBitmapRX);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __cdecl mmSaveImageMenu(HBITMAP hb, LPCSTR pName, LPCSTR pFolder)
|
||
{
|
||
Graphics::TBitmap* pBitmap = new Graphics::TBitmap;
|
||
pBitmap->Handle = hb;
|
||
int r = Mmsstv->SaveBitmapMenu(pBitmap, pName, pFolder);
|
||
pBitmap->ReleaseHandle();
|
||
delete pBitmap;
|
||
return r;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __cdecl mmSaveImage(HBITMAP hb, LPCSTR pName)
|
||
{
|
||
Graphics::TBitmap* pBitmap = new Graphics::TBitmap;
|
||
pBitmap->Handle = hb;
|
||
int r = SaveImage(pBitmap, pName);
|
||
pBitmap->ReleaseHandle();
|
||
delete pBitmap;
|
||
return r;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
HBITMAP __cdecl mmPasteImage(int sw, int xw, int yw)
|
||
{
|
||
HBITMAP hb = NULL;
|
||
|
||
int x = xw;
|
||
int y = yw;
|
||
if( sw ){
|
||
x = 16; y = 16;
|
||
}
|
||
Graphics::TBitmap* pBitmap = CreateBitmap(x, y, pf24bit);
|
||
if( Mmsstv->PasteBitmap(pBitmap, sw) ){
|
||
hb = pBitmap->ReleaseHandle();
|
||
}
|
||
delete pBitmap;
|
||
return hb;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __cdecl mmGetMacKey(LPSTR tDest, int len)
|
||
{
|
||
int r = FALSE;
|
||
TMacroKeyDlg *pBox = new TMacroKeyDlg(Mmsstv);
|
||
AnsiString as;
|
||
if( pBox->Execute(as) > 0 ){
|
||
StrCopy(tDest, as.c_str(), len - 1);
|
||
r = TRUE;
|
||
}
|
||
delete pBox;
|
||
return r;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __cdecl mmConvMac(LPSTR tDest, LPCSTR pKey, int len)
|
||
{
|
||
return Mmsstv->MacroText(tDest, pKey, len-1);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
HBITMAP __cdecl mmCreateDIB(int xw, int yw)
|
||
{
|
||
Graphics::TBitmap* pBitmap = CreateBitmap(xw, yw, pf24bit);
|
||
HBITMAP hb = pBitmap->ReleaseHandle();
|
||
delete pBitmap;
|
||
return hb;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __cdecl mmColorComp(LPDWORD pCol)
|
||
{
|
||
TColorSetDlg *pBox = new TColorSetDlg(Mmsstv);
|
||
int r = pBox->Execute((TColor *)pCol);
|
||
delete pBox;
|
||
return r;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __cdecl mmView(HBITMAP hb)
|
||
{
|
||
Graphics::TBitmap* pBitmap = new Graphics::TBitmap;
|
||
pBitmap->Handle = hb;
|
||
TZoomViewDlg *pBox = new TZoomViewDlg(Mmsstv);
|
||
pBox->SetInitSize(pBitmap->Width, pBitmap->Height);
|
||
pBox->Execute(pBitmap, FALSE);
|
||
delete pBox;
|
||
pBitmap->ReleaseHandle();
|
||
delete pBitmap;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __cdecl mmAdjCol(HBITMAP hb)
|
||
{
|
||
Graphics::TBitmap* pBitmap = new Graphics::TBitmap;
|
||
pBitmap->Handle = hb;
|
||
|
||
TPicFilterDlg *pBox = new TPicFilterDlg(Mmsstv);
|
||
int r = pBox->Execute(pBitmap);
|
||
delete pBox;
|
||
pBitmap->ReleaseHandle();
|
||
delete pBitmap;
|
||
return r;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __cdecl mmClip(HBITMAP hbDest, HBITMAP hbSrc)
|
||
{
|
||
Graphics::TBitmap* pSrc = new Graphics::TBitmap;
|
||
pSrc->Handle = hbSrc;
|
||
Graphics::TBitmap* pDest = new Graphics::TBitmap;
|
||
pDest->Handle = hbDest;
|
||
|
||
TPicRectDlg *pBox = new TPicRectDlg(Mmsstv);
|
||
CopyBitmap(pBox->pBitmap, pSrc);
|
||
int r = pBox->Execute(pDest);
|
||
delete pBox;
|
||
pSrc->ReleaseHandle();
|
||
pDest->ReleaseHandle();
|
||
delete pSrc; delete pDest;
|
||
return r;
|
||
}
|
||
//
|
||
//
|
||
//
|
||
//---------------------------------------------------------------------------
|
||
__fastcall CDraw::CDraw()
|
||
{
|
||
m_Ver = 0;
|
||
m_Cursor = 0;
|
||
m_CX1 = m_CY1 = 0;
|
||
m_CX2 = m_CY2 = 0;
|
||
m_LineColor = clBlack;
|
||
m_LineStyle = psSolid;
|
||
m_LineWidth = 1;
|
||
m_X1 = m_Y1 = m_X2 = m_Y2 = 0;
|
||
m_BX = m_BY = m_MF = 0;
|
||
m_BoxStyle = 0;
|
||
pc = NULL;
|
||
pBox = NULL;
|
||
}
|
||
|
||
void __fastcall CDraw::Start(TCanvas *tp, int x, int y)
|
||
{
|
||
pc = tp;
|
||
m_CX1 = m_X1 = x;
|
||
m_CY1 = m_Y1 = y;
|
||
}
|
||
|
||
void __fastcall CDraw::StartMove(TCanvas *tp, int x, int y, int code)
|
||
{
|
||
pc = tp;
|
||
m_BX = x;
|
||
m_BY = y;
|
||
m_MF = 0;
|
||
m_MC = code;
|
||
m_CX1 = m_X1;
|
||
m_CX2 = m_X2;
|
||
m_CY1 = m_Y1;
|
||
m_CY2 = m_Y2;
|
||
}
|
||
|
||
int __fastcall CDraw::Edit(void)
|
||
{
|
||
TLineSetDlg *pBox = new TLineSetDlg(Mmsstv);
|
||
int r = pBox->Execute(this);
|
||
delete pBox;
|
||
return r;
|
||
}
|
||
|
||
int __fastcall CDraw::Color(void)
|
||
{
|
||
TColorDialog *pDialog = Mmsstv->ColorDialog;
|
||
InitCustomColor(pDialog);
|
||
AddCustomColor(pDialog, m_LineColor);
|
||
pDialog->Color = m_LineColor;
|
||
SetDisPaint();
|
||
if( pDialog->Execute() == TRUE ){
|
||
m_LineColor = pDialog->Color;
|
||
ResDisPaint();
|
||
return TRUE;
|
||
}
|
||
ResDisPaint();
|
||
return FALSE;
|
||
}
|
||
|
||
void __fastcall CDraw::SaveToStream(TStream *sp)
|
||
{
|
||
sp->Write(&m_Command, sizeof(m_Command));
|
||
sp->Write(&m_Ver, sizeof(m_Ver));
|
||
sp->Write(&m_X1, sizeof(m_X1));
|
||
sp->Write(&m_Y1, sizeof(m_Y1));
|
||
sp->Write(&m_X2, sizeof(m_X2));
|
||
sp->Write(&m_Y2, sizeof(m_Y2));
|
||
sp->Write(&m_LineColor, sizeof(m_LineColor));
|
||
sp->Write(&m_LineStyle, sizeof(m_LineStyle));
|
||
if( m_BoxStyle ){
|
||
DWORD bver = 0x55aa0000;
|
||
sp->Write(&bver, sizeof(bver));
|
||
sp->Write(&m_BoxStyle, sizeof(m_BoxStyle));
|
||
}
|
||
sp->Write(&m_LineWidth, sizeof(m_LineWidth));
|
||
}
|
||
|
||
int __fastcall CDraw::LoadFromStream(TCanvas *tp, TStream *sp)
|
||
{
|
||
try {
|
||
pc = tp;
|
||
sp->Read(&m_Ver, sizeof(m_Ver));
|
||
sp->Read(&m_X1, sizeof(m_X1));
|
||
sp->Read(&m_Y1, sizeof(m_Y1));
|
||
sp->Read(&m_X2, sizeof(m_X2));
|
||
sp->Read(&m_Y2, sizeof(m_Y2));
|
||
sp->Read(&m_LineColor, sizeof(m_LineColor));
|
||
sp->Read(&m_LineStyle, sizeof(m_LineStyle));
|
||
DWORD bver;
|
||
sp->Read(&bver, sizeof(bver));
|
||
if( (bver & 0xffff0000) != 0x55aa0000 ){
|
||
m_LineWidth = bver;
|
||
m_BoxStyle = 0;
|
||
}
|
||
else {
|
||
bver &= 0x0000ffff;
|
||
sp->Read(&m_BoxStyle, sizeof(m_BoxStyle));
|
||
sp->Read(&m_LineWidth, sizeof(m_LineWidth));
|
||
}
|
||
// sp->Read(&m_LineWidth, sizeof(m_LineWidth));
|
||
return TRUE;
|
||
}
|
||
catch(...){
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
void __fastcall CDraw::SaveBitmap(TStream *sp, Graphics::TBitmap *pBitmap)
|
||
{
|
||
int xw = 0;
|
||
int yw = 0;
|
||
if( pBitmap != NULL ){
|
||
xw = pBitmap->Width;
|
||
yw = pBitmap->Height;
|
||
}
|
||
sp->Write(&xw, sizeof(xw));
|
||
sp->Write(&yw, sizeof(yw));
|
||
if( xw && yw ){
|
||
pBitmap->SaveToStream(sp);
|
||
}
|
||
}
|
||
|
||
int __fastcall CDraw::LoadBitmap(TStream *sp, Graphics::TBitmap *pBitmap)
|
||
{
|
||
try {
|
||
int xw;
|
||
int yw;
|
||
sp->Read(&xw, sizeof(xw));
|
||
sp->Read(&yw, sizeof(yw));
|
||
if( xw && yw ){
|
||
pBitmap->LoadFromStream(sp);
|
||
}
|
||
return TRUE;
|
||
}
|
||
catch(...){
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
void __fastcall CDraw::Copy(CDraw *dp)
|
||
{
|
||
m_X1 = dp->m_X1;
|
||
m_Y1 = dp->m_Y1;
|
||
m_X2 = dp->m_X2;
|
||
m_Y2 = dp->m_Y2;
|
||
m_LineColor = dp->m_LineColor;
|
||
m_LineStyle = dp->m_LineStyle;
|
||
m_LineWidth = dp->m_LineWidth;
|
||
m_BoxStyle = dp->m_BoxStyle;
|
||
pc = dp->pc;
|
||
}
|
||
|
||
void __fastcall CDraw::SaveString(TStream *sp, AnsiString &as)
|
||
{
|
||
int len = strlen(as.c_str());
|
||
sp->Write(&len, sizeof(len));
|
||
if( len ){
|
||
sp->Write(as.c_str(), len);
|
||
}
|
||
}
|
||
|
||
void __fastcall CDraw::LoadString(TStream *sp, AnsiString &as)
|
||
{
|
||
int len;
|
||
sp->Read(&len, sizeof(len));
|
||
if( len ){
|
||
LPSTR bp = new char[len + 1];
|
||
sp->Read(bp, len);
|
||
bp[len] = 0;
|
||
as = bp;
|
||
delete bp;
|
||
}
|
||
else {
|
||
as = "";
|
||
}
|
||
}
|
||
|
||
TColor __fastcall GetCol(TColor c1, TColor c2, int x, int xw)
|
||
{
|
||
if( xw ){
|
||
int R1 = DWORD(c1) & 0x000000ff;
|
||
int G1 = (DWORD(c1) >> 8) & 0x000000ff;
|
||
int B1 = (DWORD(c1) >> 16) & 0x000000ff;
|
||
int R2 = DWORD(c2) & 0x000000ff;
|
||
int G2 = (DWORD(c2) >> 8) & 0x000000ff;
|
||
int B2 = (DWORD(c2) >> 16) & 0x000000ff;
|
||
if( x > xw ) x = xw;
|
||
R1 += (R2 - R1) * x / xw;
|
||
G1 += (G2 - G1) * x / xw;
|
||
B1 += (B2 - B1) * x / xw;
|
||
LimitRGB(R1, G1, B1);
|
||
return TColor((B1 << 16) + (G1 << 8) + R1);
|
||
}
|
||
else {
|
||
return c1;
|
||
}
|
||
}
|
||
|
||
void __fastcall CDraw::Normal(void)
|
||
{
|
||
NormalRect(m_X1, m_Y1, m_X2, m_Y2);
|
||
}
|
||
|
||
void __fastcall CDraw::AdjustRect(void)
|
||
{
|
||
int XW = SXW - 1;
|
||
int YW = SYW - 1;
|
||
if( m_X1 > XW ){
|
||
m_X1 = XW - (m_X2 - m_X1);
|
||
m_X2 = XW;
|
||
}
|
||
else if( m_X2 < 0 ){
|
||
m_X2 = m_X2 - m_X1;
|
||
m_X1 = 0;
|
||
}
|
||
if( m_Y1 > YW ){
|
||
m_Y1 = YW - (m_Y2 - m_Y1);
|
||
m_Y2 = YW;
|
||
}
|
||
else if( m_Y2 < 0 ){
|
||
m_Y2 = m_Y2 - m_Y1;
|
||
m_Y1 = 0;
|
||
}
|
||
|
||
}
|
||
|
||
//---------------------------------------------------------------------------
|
||
__fastcall CDrawLine::CDrawLine()
|
||
{
|
||
m_Command = CM_LINE;
|
||
m_Cursor = 0;
|
||
}
|
||
|
||
int __fastcall CDrawLine::Finish(int x, int y)
|
||
{
|
||
m_X2 = x;
|
||
m_Y2 = y;
|
||
return ((m_X1 != m_X2)||(m_Y1 != m_Y2)) ? TRUE : FALSE;
|
||
}
|
||
|
||
void __fastcall DrawSiege(TCanvas *tp, int X1, int Y1, int X2, int Y2, TColor SCol, int e)
|
||
{
|
||
e = (e == 5) ? 4 : 3;
|
||
int x1 = X1;
|
||
int y1 = Y1;
|
||
int x2 = X2;
|
||
int y2 = Y2;
|
||
TColor col = SCol;
|
||
TColor tcol = SCol == clBlack ? clWhite : clBlack;
|
||
int i;
|
||
for( i = 0; i < e; i++ ){
|
||
tp->Pen->Color = GetCol(col, tcol, i, e);
|
||
tp->MoveTo(x1, y1);
|
||
tp->LineTo(x2, y2);
|
||
if( ABS(x2 - x1) > ABS(y2 - y1) ){
|
||
y1--; y2--;
|
||
}
|
||
else {
|
||
x1--; x2--;
|
||
}
|
||
}
|
||
x1 = X1;
|
||
y1 = Y1;
|
||
x2 = X2;
|
||
y2 = Y2;
|
||
for( i = 0; i < e; i++ ){
|
||
tp->Pen->Color = GetCol(col, tcol, i, e);
|
||
tp->MoveTo(x1, y1);
|
||
tp->LineTo(x2, y2);
|
||
if( ABS(x2 - x1) > ABS(y2 - y1) ){
|
||
y1++; y2++;
|
||
}
|
||
else {
|
||
x1++; x2++;
|
||
}
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawLine::Draw(TCanvas *tp)
|
||
{
|
||
tp->Pen->Color = m_LineColor;
|
||
if( m_LineStyle >= 5 ){
|
||
tp->Pen->Style = psSolid;
|
||
tp->Pen->Width = 1;
|
||
DrawSiege(tp, m_X1, m_Y1, m_X2, m_Y2, m_LineColor, m_LineStyle);
|
||
}
|
||
else if( m_LineStyle >= 0 ){
|
||
tp->Pen->Style = m_LineStyle;
|
||
tp->Pen->Width = m_LineWidth;
|
||
tp->MoveTo(m_X1, m_Y1);
|
||
tp->LineTo(m_X2, m_Y2);
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawLine::DrawSel(TCanvas *tp, int sw)
|
||
{
|
||
tp->Pen->Color = clBlue;
|
||
tp->Pen->Style = psDot;
|
||
tp->Pen->Width = 1;
|
||
tp->MoveTo(m_X1, m_Y1);
|
||
int rop = ::SetROP2(tp->Handle, sw ? R2_NOT : R2_COPYPEN);
|
||
tp->LineTo(m_X2, m_Y2);
|
||
::SetROP2(tp->Handle, rop);
|
||
}
|
||
|
||
void __fastcall CDrawLine::DrawCursor(void)
|
||
{
|
||
pc->Pen->Style = psDot;
|
||
pc->Pen->Width = 1;
|
||
pc->MoveTo(m_CX1, m_CY1);
|
||
int Sop = ::SetROP2(pc->Handle, R2_NOT);
|
||
pc->LineTo(m_CX2, m_CY2);
|
||
::SetROP2(pc->Handle, Sop);
|
||
}
|
||
|
||
void __fastcall CDrawLine::Making(int x, int y)
|
||
{
|
||
if( m_Cursor ) DrawCursor();
|
||
m_CX2 = x;
|
||
m_CY2 = y;
|
||
DrawCursor();
|
||
m_Cursor = 1;
|
||
}
|
||
|
||
int __fastcall CDrawLine::HitTest(int x, int y)
|
||
{
|
||
POINT N;
|
||
POINT B, E;
|
||
N.x = x; N.y = y;
|
||
B.x = m_X1; B.y = m_Y1;
|
||
E.x = m_X2; E.y = m_Y2;
|
||
return IsLine(N, B, E, 5) ? HT_I : HT_NONE;
|
||
}
|
||
|
||
void __fastcall CDrawLine::Moving(int x, int y)
|
||
{
|
||
if( m_Cursor ) DrawCursor();
|
||
if( !m_MF ){
|
||
if( m_BX != x ) m_MF = 1;
|
||
if( m_BY != y ) m_MF = 1;
|
||
}
|
||
x -= m_BX;
|
||
y -= m_BY;
|
||
m_CX1 = m_X1 + x;
|
||
m_CX2 = m_X2 + x;
|
||
m_CY1 = m_Y1 + y;
|
||
m_CY2 = m_Y2 + y;
|
||
DrawCursor();
|
||
m_Cursor = 1;
|
||
}
|
||
|
||
void __fastcall CDrawLine::Move(int x, int y)
|
||
{
|
||
m_X1 = m_CX1;
|
||
m_Y1 = m_CY1;
|
||
m_X2 = m_CX2;
|
||
m_Y2 = m_CY2;
|
||
}
|
||
|
||
//---------------------------------------------------------------------------
|
||
__fastcall CDrawBox::CDrawBox()
|
||
{
|
||
m_Command = CM_BOX;
|
||
}
|
||
|
||
int __fastcall CDrawBox::Finish(int x, int y)
|
||
{
|
||
m_X2 = x;
|
||
m_Y2 = y;
|
||
Normal();
|
||
return ((m_X1 != m_X2)&&(m_Y1 != m_Y2)) ? TRUE : FALSE;
|
||
}
|
||
|
||
static void __fastcall DBox(TCanvas *tp, int cmd, int x1, int y1, int x2, int y2)
|
||
{
|
||
int xw = ABS(x2 - x1);
|
||
int yw = ABS(y2 - y1);
|
||
switch(cmd){
|
||
case 0:
|
||
tp->MoveTo(x1, y1);
|
||
tp->LineTo(x2, y1);
|
||
tp->LineTo(x2, y2);
|
||
tp->LineTo(x1, y2);
|
||
tp->LineTo(x1, y1);
|
||
break;
|
||
case 1:
|
||
tp->RoundRect(x1, y1, x2, y2, xw/3, yw/3);
|
||
break;
|
||
case 2:
|
||
tp->RoundRect(x1, y1, x2, y2, xw/2, yw/2);
|
||
break;
|
||
case 3:
|
||
tp->RoundRect(x1, y1, x2, y2, xw*3/4, yw*3/4);
|
||
break;
|
||
case 4:
|
||
case 5:
|
||
tp->Ellipse(x1, y1, x2, y2);
|
||
break;
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawBox::RoundRect(TCanvas *tp, int xw, int yw)
|
||
{
|
||
if( m_LineStyle < 0 ) return;
|
||
|
||
if( m_LineStyle >= 5 ){
|
||
int e = (m_LineStyle == 5) ? 4 : 3;
|
||
tp->Pen->Style = psSolid;
|
||
tp->Pen->Width = 1;
|
||
int x1 = m_X1;
|
||
int y1 = m_Y1;
|
||
int x2 = m_X2;
|
||
int y2 = m_Y2;
|
||
int xxw = xw;
|
||
int yyw = yw;
|
||
TColor col = m_LineColor;
|
||
TColor tcol = m_LineColor == clBlack ? clWhite : clBlack;
|
||
// TColor tcol = TColor(DWORD(m_LineColor) ^ 0x00ffffff);
|
||
int i;
|
||
for( i = 0; i < e; i++ ){
|
||
tp->Pen->Color = GetCol(col, tcol, i, e);
|
||
tp->RoundRect(x1, y1, x2, y2, xxw, yyw);
|
||
x1--; y1--;
|
||
x2++; y2++;
|
||
xxw += 2;
|
||
yyw += 2;
|
||
}
|
||
x1 = m_X1+1;
|
||
y1 = m_Y1+1;
|
||
x2 = m_X2-1;
|
||
y2 = m_Y2-1;
|
||
xxw = xw;
|
||
yyw = yw;
|
||
for( i = 1; i < e; i++ ){
|
||
tp->Pen->Color = GetCol(col, tcol, i, e);
|
||
tp->RoundRect(x1, y1, x2, y2, xxw, yyw);
|
||
x1++; y1++;
|
||
x2--; y2--;
|
||
xxw -= 2;
|
||
yyw -= 2;
|
||
}
|
||
}
|
||
else {
|
||
tp->Pen->Style = m_LineStyle;
|
||
tp->Pen->Width = m_LineWidth;
|
||
tp->RoundRect(m_X1, m_Y1, m_X2, m_Y2, xw, yw);
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawBox::Draw(TCanvas *tp)
|
||
{
|
||
tp->Pen->Color = m_LineColor;
|
||
int xw = m_X2 - m_X1;
|
||
int yw = m_Y2 - m_Y1;
|
||
HBRUSH hold = (HBRUSH)::SelectObject(tp->Handle, GetStockObject(NULL_BRUSH)); //ja7ude 0521
|
||
switch(m_BoxStyle){
|
||
case 0:
|
||
RoundRect(tp, 0, 0);
|
||
break;
|
||
case 1:
|
||
RoundRect(tp, xw/3, yw/3);
|
||
break;
|
||
case 2:
|
||
RoundRect(tp, xw/2, yw/2);
|
||
break;
|
||
case 3:
|
||
RoundRect(tp, xw*3/4, yw*3/4);
|
||
break;
|
||
case 4:
|
||
case 5:
|
||
RoundRect(tp, xw, yw);
|
||
break;
|
||
}
|
||
::SelectObject(tp->Handle, hold);
|
||
}
|
||
|
||
void __fastcall CDrawBox::DrawSel(TCanvas *tp, int sw)
|
||
{
|
||
if( m_BoxStyle ){
|
||
Draw(tp);
|
||
}
|
||
tp->Brush->Color = clWhite;
|
||
tp->Pen->Color = clBlue;
|
||
tp->Pen->Width = 1;
|
||
tp->Pen->Style = psDot;
|
||
tp->MoveTo(m_X1, m_Y1);
|
||
int rop = ::SetROP2(tp->Handle, sw ? R2_NOT : R2_COPYPEN);
|
||
tp->LineTo(m_X2, m_Y1);
|
||
tp->LineTo(m_X2, m_Y2);
|
||
tp->LineTo(m_X1, m_Y2);
|
||
tp->LineTo(m_X1, m_Y1);
|
||
::SetROP2(tp->Handle, rop);
|
||
}
|
||
|
||
void __fastcall CDrawBox::DrawCursor(void)
|
||
{
|
||
pc->Pen->Style = psDot;
|
||
pc->Pen->Width = 1;
|
||
pc->MoveTo(m_CX1, m_CY1);
|
||
int Sop = ::SetROP2(pc->Handle, R2_NOT);
|
||
pc->LineTo(m_CX2, m_CY1);
|
||
pc->LineTo(m_CX2, m_CY2);
|
||
pc->LineTo(m_CX1, m_CY2);
|
||
pc->LineTo(m_CX1, m_CY1);
|
||
::SetROP2(pc->Handle, Sop);
|
||
}
|
||
|
||
void __fastcall CDrawBox::Making(int x, int y)
|
||
{
|
||
if( m_Cursor ) DrawCursor();
|
||
m_CX2 = x;
|
||
m_CY2 = y;
|
||
DrawCursor();
|
||
m_Cursor = 1;
|
||
}
|
||
|
||
int __fastcall CDrawBox::HitTest(int x, int y)
|
||
{
|
||
POINT N;
|
||
POINT B, E;
|
||
N.x = x; N.y = y;
|
||
B.x = m_X1; B.y = m_Y1;
|
||
E.x = m_X2; E.y = m_Y1;
|
||
int r = IsLine(N, B, E, 5);
|
||
if( r ){
|
||
switch(r){
|
||
case HT_P1:
|
||
return HT_LT;
|
||
case HT_P2:
|
||
return HT_RT;
|
||
default:
|
||
return HT_T;
|
||
}
|
||
}
|
||
B.x = m_X2; B.y = m_Y1;
|
||
E.x = m_X2; E.y = m_Y2;
|
||
r = IsLine(N, B, E, 5);
|
||
if( r ){
|
||
switch(r){
|
||
case HT_P1:
|
||
return HT_RT;
|
||
case HT_P2:
|
||
return HT_RB;
|
||
default:
|
||
return HT_R;
|
||
}
|
||
}
|
||
B.x = m_X2; B.y = m_Y2;
|
||
E.x = m_X1; E.y = m_Y2;
|
||
r = IsLine(N, B, E, 5);
|
||
if( r ){
|
||
switch(r){
|
||
case HT_P1:
|
||
return HT_RB;
|
||
case HT_P2:
|
||
return HT_LB;
|
||
default:
|
||
return HT_B;
|
||
}
|
||
}
|
||
B.x = m_X1; B.y = m_Y2;
|
||
E.x = m_X1; E.y = m_Y1;
|
||
r = IsLine(N, B, E, 5);
|
||
if( r ){
|
||
switch(r){
|
||
case HT_P1:
|
||
return HT_LB;
|
||
case HT_P2:
|
||
return HT_LT;
|
||
default:
|
||
return HT_L;
|
||
}
|
||
}
|
||
if( (x < m_X1) || (x > m_X2) ) return FALSE;
|
||
if( (y < m_Y1) || (y > m_Y2) ) return FALSE;
|
||
return HT_I;
|
||
}
|
||
|
||
void __fastcall CDrawBox::Moving(int x, int y)
|
||
{
|
||
if( m_Cursor ) DrawCursor();
|
||
if( !m_MF ){
|
||
if( m_BX != x ) m_MF = 1;
|
||
if( m_BY != y ) m_MF = 1;
|
||
}
|
||
x -= m_BX;
|
||
y -= m_BY;
|
||
int bs = 0;
|
||
switch(m_MC){
|
||
case HT_LT:
|
||
m_CX1 = m_X1 + x;
|
||
m_CY1 = m_Y1 + y;
|
||
if( m_BoxStyle == 5 ) bs = 3;
|
||
break;
|
||
case HT_T:
|
||
m_CY1 = m_Y1 + y;
|
||
if( m_BoxStyle == 5 ) bs = 1;
|
||
break;
|
||
case HT_RT:
|
||
m_CX2 = m_X2 + x;
|
||
m_CY1 = m_Y1 + y;
|
||
if( m_BoxStyle == 5 ) bs = 1;
|
||
break;
|
||
case HT_R:
|
||
m_CX2 = m_X2 + x;
|
||
if( m_BoxStyle == 5 ) bs = 2;
|
||
break;
|
||
case HT_RB:
|
||
m_CX2 = m_X2 + x;
|
||
m_CY2 = m_Y2 + y;
|
||
if( m_BoxStyle == 5 ) bs = 2;
|
||
break;
|
||
case HT_B:
|
||
m_CY2 = m_Y2 + y;
|
||
if( m_BoxStyle == 5 ) bs = 1;
|
||
break;
|
||
case HT_LB:
|
||
m_CX1 = m_X1 + x;
|
||
m_CY2 = m_Y2 + y;
|
||
if( m_BoxStyle == 5 ) bs = 2;
|
||
break;
|
||
case HT_L:
|
||
m_CX1 = m_X1 + x;
|
||
if( m_BoxStyle == 5 ) bs = 2;
|
||
break;
|
||
default:
|
||
m_CX1 = m_X1 + x;
|
||
m_CX2 = m_X2 + x;
|
||
m_CY1 = m_Y1 + y;
|
||
m_CY2 = m_Y2 + y;
|
||
break;
|
||
}
|
||
switch(bs){
|
||
case 1:
|
||
m_CX2 = m_CX1 + (m_CY2 - m_CY1);
|
||
break;
|
||
case 2:
|
||
m_CY2 = m_CY1 + (m_CX2 - m_CX1);
|
||
break;
|
||
case 3:
|
||
m_CX1 = m_CX2 - (m_CY2 - m_CY1);
|
||
break;
|
||
}
|
||
DrawCursor();
|
||
m_Cursor = 1;
|
||
}
|
||
|
||
void __fastcall CDrawBox::Move(int x, int y)
|
||
{
|
||
m_X1 = m_CX1;
|
||
m_Y1 = m_CY1;
|
||
m_X2 = m_CX2;
|
||
m_Y2 = m_CY2;
|
||
Normal();
|
||
AdjustRect();
|
||
}
|
||
|
||
//---------------------------------------------------------------------------
|
||
__fastcall CDrawBoxS::CDrawBoxS()
|
||
{
|
||
m_Command = CM_BOXS;
|
||
m_LineStyle = TPenStyle(-1);
|
||
}
|
||
|
||
void __fastcall CDrawBoxS::Draw(TCanvas *tp)
|
||
{
|
||
tp->Brush->Color = m_LineColor;
|
||
tp->Pen->Color = m_LineColor;
|
||
tp->Pen->Style = psSolid;
|
||
tp->Pen->Style = m_LineStyle < 5 ? m_LineStyle : psSolid;
|
||
tp->Pen->Width = m_LineWidth;
|
||
if( m_BoxStyle ){
|
||
tp->Pen->Style = m_LineStyle;
|
||
tp->Pen->Width = m_LineWidth;
|
||
DBox(tp, m_BoxStyle, m_X1, m_Y1, m_X2, m_Y2);
|
||
}
|
||
else {
|
||
TRect rc;
|
||
rc.Left = m_X1; rc.Top = m_Y1;
|
||
rc.Right = m_X2; rc.Bottom = m_Y2;
|
||
tp->FillRect(rc);
|
||
}
|
||
TColor col = m_LineColor;
|
||
m_LineColor = clWhite;
|
||
CDrawBox::Draw(tp);
|
||
m_LineColor = col;
|
||
}
|
||
|
||
//---------------------------------------------------------------------------
|
||
__fastcall CDrawTitle::CDrawTitle()
|
||
{
|
||
m_Command = CM_TITLE;
|
||
m_Type = 1;
|
||
m_Col1 = sys.m_ColBar[0];
|
||
m_Col2 = sys.m_ColBar[1];
|
||
m_Col3 = sys.m_ColBar[2];
|
||
m_Col4 = sys.m_ColBar[3];
|
||
m_X1 = m_Y1 = 0;
|
||
m_X2 = 319;
|
||
m_Y2 = 15;
|
||
m_Ver = 3;
|
||
m_ColVert = 0;
|
||
m_Sound = "1356865313568888";
|
||
// m_Sound = "5888531133865555";
|
||
// m_Sound = "1588531133531111";
|
||
// m_Sound = "1355135585313533";
|
||
pBitmap = NULL;
|
||
}
|
||
|
||
__fastcall CDrawTitle::~CDrawTitle()
|
||
{
|
||
if( pBitmap != NULL ){
|
||
delete pBitmap;
|
||
pBitmap = NULL;
|
||
}
|
||
}
|
||
|
||
int __fastcall CDrawTitle::HitTest(int x, int y)
|
||
{
|
||
int r = CDrawBox::HitTest(x, y);
|
||
switch(r){
|
||
case 0:
|
||
return HT_NONE;
|
||
case HT_B:
|
||
return r;
|
||
default:
|
||
return HT_I;
|
||
}
|
||
};
|
||
|
||
void __fastcall CDrawTitle::Start(TCanvas *tp, int x, int y)
|
||
{
|
||
pc = tp;
|
||
m_CY1 = m_Y1 = y;
|
||
m_CX1 = m_X1;
|
||
m_CX2 = m_X2;
|
||
}
|
||
|
||
int __fastcall CDrawTitle::Finish(int x, int y)
|
||
{
|
||
m_X1 = 0;
|
||
m_X2 = SXW - 1;
|
||
m_Y1 = y;
|
||
m_Y2 = y + 15;
|
||
return TRUE;
|
||
}
|
||
|
||
void __fastcall CDrawTitle::FillPic(TCanvas *tp, TColor col, int sw, double sx, double sy, int off)
|
||
{
|
||
TRect rc;
|
||
switch(sw){
|
||
case 2:
|
||
rc.Left = m_X1;
|
||
rc.Top = m_Y1 - 16;
|
||
rc.Right = m_X2 + 1;
|
||
rc.Bottom = m_Y2 - 16;
|
||
break;
|
||
case 4:
|
||
rc.Left = m_X1;
|
||
rc.Top = m_Y1 * 240 / 256;
|
||
rc.Right = m_X2 + 1;
|
||
rc.Bottom = (m_Y2 * 240 / 256);
|
||
break;
|
||
case -1:
|
||
rc.Left = m_X1;
|
||
rc.Top = m_Y1 + off;
|
||
rc.Right = (m_X2 + 1);
|
||
rc.Bottom = m_Y2 + off;
|
||
break;
|
||
default:
|
||
rc.Left = m_X1 * sx;
|
||
rc.Top = m_Y1 * sy;
|
||
rc.Right = (m_X2 + 1) * sx;
|
||
rc.Bottom = m_Y2 * sy;
|
||
break;
|
||
}
|
||
rc.Bottom++;
|
||
tp->Brush->Color = col;
|
||
tp->Pen->Color = col;
|
||
tp->FillRect(rc);
|
||
}
|
||
|
||
void __fastcall CDrawTitle::Draw(TCanvas *tp)
|
||
{
|
||
m_X2 = SXW - 1;
|
||
int x, y;
|
||
int X1, X2, Y1, Y2;
|
||
int XW, YW;
|
||
tp->Pen->Style = psSolid;
|
||
switch(m_Type){
|
||
case 0:
|
||
{
|
||
TRect rc;
|
||
rc.Top = m_Y1;
|
||
rc.Left = m_X1;
|
||
rc.Right = m_X2 + 1;
|
||
rc.Bottom = m_Y2 + 1;
|
||
tp->Brush->Style = bsSolid;
|
||
tp->Brush->Color = m_Col1;
|
||
tp->FillRect(rc);
|
||
}
|
||
break;
|
||
case 1:
|
||
if( m_ColVert ){
|
||
for( y = m_Y1; y <= m_Y2; y++ ){
|
||
tp->Pen->Color = GetCol(m_Col1, m_Col2, y, m_Y2);
|
||
tp->MoveTo(m_X1, y); tp->LineTo(m_X2+1, y);
|
||
}
|
||
}
|
||
else {
|
||
for( x = m_X1; x <= m_X2; x++ ){
|
||
tp->Pen->Color = GetCol(m_Col1, m_Col2, x, m_X2);
|
||
tp->MoveTo(x, m_Y1); tp->LineTo(x, m_Y2+1);
|
||
}
|
||
}
|
||
break;
|
||
case 2:
|
||
if( m_ColVert ){
|
||
YW = (m_Y2 - m_Y1) / 3;
|
||
Y1 = YW + m_Y1;
|
||
Y2 = YW + Y1;
|
||
for( y = m_Y1; y < Y1; y++ ){
|
||
tp->Pen->Color = GetCol(m_Col1, m_Col2, y - m_Y1, YW);
|
||
tp->MoveTo(m_X1, y); tp->LineTo(m_X2+1, y);
|
||
}
|
||
for( ; y < Y2; y++ ){
|
||
tp->Pen->Color = GetCol(m_Col2, m_Col3, y - Y1, YW);
|
||
tp->MoveTo(m_X1, y); tp->LineTo(m_X2+1, y);
|
||
}
|
||
for( ; y <= m_Y2; y++ ){
|
||
tp->Pen->Color = GetCol(m_Col3, m_Col4, y - Y2, YW);
|
||
tp->MoveTo(m_X1, y); tp->LineTo(m_X2+1, y);
|
||
}
|
||
}
|
||
else {
|
||
XW = (m_X2 - m_X1) / 3;
|
||
X1 = XW + m_X1;
|
||
X2 = XW + X1;
|
||
for( x = m_X1; x < X1; x++ ){
|
||
tp->Pen->Color = GetCol(m_Col1, m_Col2, x - m_X1, XW);
|
||
tp->MoveTo(x, m_Y1); tp->LineTo(x, m_Y2+1);
|
||
}
|
||
for( ; x < X2; x++ ){
|
||
tp->Pen->Color = GetCol(m_Col2, m_Col3, x - X1, XW);
|
||
tp->MoveTo(x, m_Y1); tp->LineTo(x, m_Y2+1);
|
||
}
|
||
for( ; x <= m_X2; x++ ){
|
||
tp->Pen->Color = GetCol(m_Col3, m_Col4, x - X2, XW);
|
||
tp->MoveTo(x, m_Y1); tp->LineTo(x, m_Y2+1);
|
||
}
|
||
}
|
||
break;
|
||
case 3:
|
||
if( pBitmap != NULL ){
|
||
if( pBitmap->Height != (m_Y2 - m_Y1 + 1) ){
|
||
TRect rc;
|
||
rc.Left = m_X1; rc.Top = m_Y1;
|
||
rc.Right = m_X2 + 1;
|
||
rc.Bottom = m_Y2 + 1;
|
||
int Sop = ::SetStretchBltMode(tp->Handle, HALFTONE);
|
||
tp->StretchDraw(rc, pBitmap);
|
||
::SetStretchBltMode(tp->Handle, Sop);
|
||
}
|
||
else {
|
||
tp->Draw(m_X1, m_Y1, pBitmap);
|
||
}
|
||
}
|
||
break;
|
||
case 4:
|
||
{
|
||
const BYTE _ft[]={0, 29, 60, 92, 126, 162, 201, 242};
|
||
LPCSTR p = m_Sound.c_str();
|
||
DWORD col;
|
||
for( y = m_Y1; *p; p++, y++ ){
|
||
if( (*p >= '1') && (*p <= '8') ){
|
||
col = _ft[(*p & 0x0f) - 1];
|
||
tp->Pen->Color = TColor(col + (col * 256) + (col * 65536));
|
||
tp->MoveTo(m_X1, y); tp->LineTo(m_X2+1, y);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawTitle::DrawFast(TCanvas *tp)
|
||
{
|
||
m_X2 = SXW - 1;
|
||
TRect rc;
|
||
rc.Left = m_X1;
|
||
rc.Top = m_Y1;
|
||
rc.Right = m_X2 + 1;
|
||
rc.Bottom = m_Y2;
|
||
tp->Brush->Color = m_Col1;
|
||
tp->Pen->Color = m_Col1;
|
||
tp->FillRect(rc);
|
||
}
|
||
|
||
void __fastcall CDrawTitle::Moving(int x, int y)
|
||
{
|
||
if( m_Cursor ) DrawCursor();
|
||
if( !m_MF ){
|
||
if( m_BY != y ) m_MF = 1;
|
||
}
|
||
y -= m_BY;
|
||
int h = m_Y2 - m_Y1;
|
||
switch(m_MC){
|
||
case HT_I:
|
||
y += m_Y1;
|
||
if( y < 0 ) y = 0;
|
||
if( y > (SYW - h) ) y = SYW - h;
|
||
m_CY1 = y;
|
||
m_CY2 = m_CY1 + h;
|
||
break;
|
||
case HT_B:
|
||
y += m_Y2;
|
||
if( y < 0 ) y = 0;
|
||
if( y > (SYW-1) ) y = SYW-1;
|
||
if( y != m_CY1 ) m_CY2 = y;
|
||
break;
|
||
}
|
||
DrawCursor();
|
||
m_Cursor = 1;
|
||
}
|
||
|
||
void __fastcall CDrawTitle::StartMove(TCanvas *tp, int x, int y, int code)
|
||
{
|
||
pc = tp;
|
||
m_BY = y;
|
||
m_MF = 0;
|
||
m_MC = code;
|
||
m_CX1 = m_X1;
|
||
m_CX2 = m_X2;
|
||
m_Cursor = 0;
|
||
}
|
||
|
||
void __fastcall CDrawTitle::Move(int x, int y)
|
||
{
|
||
if( m_CY1 < m_CY2 ){
|
||
m_Y1 = m_CY1;
|
||
m_Y2 = m_CY2;
|
||
}
|
||
else {
|
||
m_Y1 = m_CY2;
|
||
m_Y2 = m_CY1;
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawTitle::Copy(CDraw *dp)
|
||
{
|
||
CDrawBox::Copy(dp);
|
||
|
||
CDrawTitle *sp = (CDrawTitle *)dp;
|
||
m_Type = sp->m_Type;
|
||
m_ColVert = sp->m_ColVert;
|
||
m_Col1 = sp->m_Col1;
|
||
m_Col2 = sp->m_Col2;
|
||
m_Col3 = sp->m_Col3;
|
||
m_Col4 = sp->m_Col4;
|
||
m_Sound = sp->m_Sound;
|
||
if( sp->pBitmap != NULL ){
|
||
if( pBitmap == NULL ){
|
||
pBitmap = new Graphics::TBitmap();
|
||
AdjustBitmapFormat(pBitmap);
|
||
}
|
||
pBitmap->Assign(sp->pBitmap);
|
||
}
|
||
else if( pBitmap != NULL ){
|
||
delete pBitmap;
|
||
pBitmap = NULL;
|
||
}
|
||
}
|
||
|
||
int __fastcall CDrawTitle::Edit(void)
|
||
{
|
||
TColorBarDlg *pBox = new TColorBarDlg(Mmsstv);
|
||
int r = pBox->Execute(this);
|
||
delete pBox;
|
||
if( r == TRUE ){
|
||
m_X2 = SXW - 1;
|
||
sys.m_ColBar[0] = m_Col1;
|
||
sys.m_ColBar[1] = m_Col2;
|
||
sys.m_ColBar[2] = m_Col3;
|
||
sys.m_ColBar[3] = m_Col4;
|
||
}
|
||
return r;
|
||
}
|
||
|
||
void __fastcall CDrawTitle::SaveToStream(TStream *sp)
|
||
{
|
||
m_Ver = 3;
|
||
CDrawBox::SaveToStream(sp);
|
||
|
||
sp->Write(&m_Type, sizeof(m_Type));
|
||
sp->Write(&m_ColVert, sizeof(m_ColVert));
|
||
sp->Write(&m_Col1, sizeof(m_Col1));
|
||
sp->Write(&m_Col2, sizeof(m_Col2));
|
||
sp->Write(&m_Col3, sizeof(m_Col3));
|
||
sp->Write(&m_Col4, sizeof(m_Col4));
|
||
if( m_Type == 4 ) SaveString(sp, m_Sound);
|
||
if( m_Type == 3 ){
|
||
SaveBitmap(sp, pBitmap);
|
||
}
|
||
}
|
||
|
||
int __fastcall CDrawTitle::LoadFromStream(TCanvas *tp, TStream *sp)
|
||
{
|
||
if( CDrawBox::LoadFromStream(tp, sp) == FALSE ) return FALSE;
|
||
|
||
try {
|
||
if( m_Ver >= 1 ){
|
||
sp->Read(&m_Type, sizeof(m_Type));
|
||
if( m_Ver >= 2 ){
|
||
sp->Read(&m_ColVert, sizeof(m_ColVert));
|
||
}
|
||
sp->Read(&m_Col1, sizeof(m_Col1));
|
||
sp->Read(&m_Col2, sizeof(m_Col2));
|
||
sp->Read(&m_Col3, sizeof(m_Col3));
|
||
sp->Read(&m_Col4, sizeof(m_Col4));
|
||
if( (m_Ver >= 3) && (m_Type == 4) ){
|
||
LoadString(sp, m_Sound);
|
||
}
|
||
if( m_Type == 3 ){
|
||
if( pBitmap == NULL ){
|
||
pBitmap = new Graphics::TBitmap();
|
||
AdjustBitmapFormat(pBitmap);
|
||
}
|
||
LoadBitmap(sp, pBitmap);
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
catch(...){
|
||
return FALSE;
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
__fastcall CDrawText::CDrawText()
|
||
{
|
||
m_Command = CM_TEXT;
|
||
|
||
m_Grade = sys.m_TextGrade;
|
||
m_Shadow = sys.m_TextShadow;
|
||
m_Zero = sys.m_TextZero;
|
||
m_Rot = sys.m_TextRot;
|
||
m_RightAdj = 0;
|
||
m_X2 = m_Y2 = 0;
|
||
m_LineColor = clBlack;
|
||
m_LineStyle = psSolid;
|
||
m_Stack = sys.m_TextStack >> 16;
|
||
m_StackPara = sys.m_TextStack & 0x0000ffff;
|
||
m_Vert = sys.m_TextVert;
|
||
m_VertH = sys.m_TextVertH;
|
||
|
||
m_Text = sys.m_TextList[0].c_str();
|
||
m_Col1 = sys.m_ColText[0];
|
||
m_Col2 = sys.m_ColText[1];
|
||
m_Col3 = sys.m_ColText[2];
|
||
m_Col4 = sys.m_ColText[3];
|
||
m_ColS = sys.m_ColText[4];
|
||
m_ColB = sys.m_ColText[5];
|
||
|
||
pFont = NULL;
|
||
pBitmap = NULL;
|
||
pBrushBitmap = NULL;
|
||
|
||
m_PerSpect = 0;
|
||
m_sperspect.ax = 2.0; m_sperspect.ay = 6.0;
|
||
m_sperspect.px = 0.05;
|
||
m_sperspect.py = m_sperspect.pz = 0.0;
|
||
m_sperspect.rz = -180; m_sperspect.rx = -70; m_sperspect.ry = 0;
|
||
m_sperspect.v = 10; m_sperspect.s = 4.9;
|
||
|
||
m_Ver = 7;
|
||
}
|
||
|
||
//---------------------------------------------------------------------------
|
||
__fastcall CDrawText::~CDrawText()
|
||
{
|
||
if( pFont != NULL ){
|
||
delete pFont;
|
||
pFont = NULL;
|
||
}
|
||
if( pBitmap != NULL ){
|
||
delete pBitmap;
|
||
pBitmap = NULL;
|
||
}
|
||
if( pBrushBitmap != NULL ){
|
||
delete pBrushBitmap;
|
||
pBrushBitmap = NULL;
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawText::ReleaseResource(void)
|
||
{
|
||
if( pBitmap != NULL ){
|
||
delete pBitmap;
|
||
pBitmap = NULL;
|
||
}
|
||
}
|
||
|
||
int __fastcall CDrawText::ZeroConv(BYTE charset, LPSTR s)
|
||
{
|
||
int f = 0;
|
||
|
||
char bf[1228];
|
||
LPSTR t = bf;
|
||
LPSTR p = s;
|
||
for( ; *p; p++ ){
|
||
if( *p == '0' ){
|
||
switch(charset){
|
||
case SHIFTJIS_CHARSET:
|
||
*t++ = 0x83;
|
||
*t++ = 0xd3;
|
||
break;
|
||
case HANGEUL_CHARSET:
|
||
*t++ = 0xa8; // 0xa9
|
||
*t++ = 0xaa;
|
||
break;
|
||
case CHINESEBIG5_CHARSET: // ‘ä˜p
|
||
*t++ = 0xa3;
|
||
*t++ = 0x58;
|
||
break;
|
||
case 134: // ’†<E28099>‘ŒêŠÈ—ª
|
||
*t++ = 0xa6;
|
||
*t++ = 0xd5;
|
||
break;
|
||
default:
|
||
if( (lcid == LANG_KOREAN) || (lcid == LANG_CHINESE) ){
|
||
f++;
|
||
*t++ = '0';
|
||
}
|
||
else {
|
||
*t++ = 'Ø';
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
else {
|
||
*t++ = *p;
|
||
}
|
||
}
|
||
*t = 0;
|
||
StrCopy(s, bf, 1023);
|
||
return f;
|
||
}
|
||
|
||
int __fastcall CDrawText::GetMaxWidth(int &n, LPCSTR p)
|
||
{
|
||
n = 0;
|
||
int max = 0;
|
||
|
||
char bf[4];
|
||
while(*p){
|
||
if( (_mbsbtype((const unsigned char *)p, 0) == _MBC_LEAD) && *(p+1) ){
|
||
// if( IsDBCSLeadByte(*(const unsigned char *)p) && *(p+1) ){
|
||
bf[0] = *p++;
|
||
bf[1] = *p++;
|
||
bf[2] = 0;
|
||
}
|
||
else {
|
||
bf[0] = *p++;
|
||
bf[1] = 0;
|
||
}
|
||
int len = pc->TextWidth(bf);
|
||
if( max < len ){
|
||
max = len;
|
||
}
|
||
n++;
|
||
}
|
||
return max;
|
||
}
|
||
|
||
inline TXOut(TCanvas *cp, int x, int y, LPCSTR p){cp->TextOut(x, y, p); return 0;};
|
||
|
||
void __fastcall CDrawText::DrawTextVert(TCanvas *tp, int xc, int y, int fh, LPCSTR p)
|
||
{
|
||
char bf[4];
|
||
|
||
int tm = ::SetBkMode(tp->Handle, TRANSPARENT);
|
||
while(*p){
|
||
if( (_mbsbtype((const unsigned char *)p, 0) == _MBC_LEAD) && *(p+1) ){
|
||
bf[0] = *p++;
|
||
bf[1] = *p++;
|
||
bf[2] = 0;
|
||
}
|
||
else if( (*p == '0') && m_Zero ){
|
||
bf[0] = 'Ø';
|
||
bf[1] = 0;
|
||
p++;
|
||
}
|
||
else {
|
||
bf[0] = *p++;
|
||
bf[1] = 0;
|
||
}
|
||
int FW = tp->TextWidth(bf);
|
||
int FH = tp->TextHeight(bf);
|
||
#if 1
|
||
TXOut(tp, xc - (FW/2), y, bf);
|
||
#else
|
||
tp->TextOut(xc - (FW/2), y, bf);
|
||
#endif
|
||
y += (FH + fh);
|
||
}
|
||
::SetBkMode(tp->Handle, tm);
|
||
}
|
||
|
||
void __fastcall CDrawText::DrawTextHoriANSI(TCanvas *tp, int x, int y, LPCSTR p)
|
||
{
|
||
char bf[4];
|
||
|
||
int tm = ::SetBkMode(tp->Handle, TRANSPARENT);
|
||
int FW;
|
||
double rot = m_Rot * PI/180.0;
|
||
while(*p){
|
||
if( (_mbsbtype((const unsigned char *)p, 0) == _MBC_LEAD) && *(p+1) ){
|
||
bf[0] = *p++;
|
||
bf[1] = *p++;
|
||
bf[2] = 0;
|
||
}
|
||
else if( *p == '0' ){
|
||
bf[0] = 'Ø';
|
||
bf[1] = 0;
|
||
p++;
|
||
}
|
||
else {
|
||
bf[0] = *p++;
|
||
bf[1] = 0;
|
||
}
|
||
FW = tp->TextWidth(bf);
|
||
#if 1
|
||
TXOut(tp, x, y, bf);
|
||
#else
|
||
tp->TextOut(x, y, bf);
|
||
#endif
|
||
if( m_Rot ){
|
||
x += FW * cos(rot);
|
||
y -= FW * sin(rot);
|
||
}
|
||
else {
|
||
x += FW;
|
||
}
|
||
}
|
||
::SetBkMode(tp->Handle, tm);
|
||
}
|
||
|
||
void __fastcall CDrawText::DrawText(TCanvas *cp, int x, int y, LPCSTR p, int zc)
|
||
{
|
||
if( m_Vert ){
|
||
DrawTextVert(cp, x, y, m_VertH, p);
|
||
}
|
||
else if( zc ){
|
||
DrawTextHoriANSI(cp, x, y, p);
|
||
}
|
||
else {
|
||
#if 1
|
||
TXOut(cp, x, y, p);
|
||
#else
|
||
cp->TextOut(x, y, p);
|
||
#endif
|
||
// DrawTextHoriANSI(cp, x, y, p); // test of Korean Windows
|
||
}
|
||
}
|
||
|
||
Graphics::TBitmap * __fastcall CDrawText::DupeB(TColor col)
|
||
{
|
||
MultProc();
|
||
pBitmap->Transparent = TRUE;
|
||
pBitmap->TransparentMode = tmAuto;
|
||
Graphics::TBitmap *pBit = new Graphics::TBitmap();
|
||
// AdjustBitmapFormat(pBit);
|
||
pBit->Assign(pBitmap);
|
||
MultProc();
|
||
FillBitmap(pBit, col);
|
||
return pBit;
|
||
}
|
||
|
||
Graphics::TBitmap * __fastcall CDrawText::ConvToDDB(Graphics::TBitmap *pBmp)
|
||
{
|
||
if( (sys.m_BitPixel == 16) && (pBmp->PixelFormat == pf24bit) ){
|
||
pBmp->Transparent = FALSE;
|
||
Graphics::TBitmap *pNew = DupeBitmap(pBmp, -1);
|
||
pNew->Canvas->Font->Assign(pBmp->Canvas->Font);
|
||
delete pBmp;
|
||
pBmp = pNew;
|
||
}
|
||
return pBmp;
|
||
}
|
||
|
||
Graphics::TBitmap * __fastcall CDrawText::ConvToDIB(Graphics::TBitmap *pBmp)
|
||
{
|
||
if( pBmp->PixelFormat != pf24bit ){
|
||
pBmp->Transparent = FALSE;
|
||
Graphics::TBitmap *pNew = DupeBitmap(pBmp, pf24bit);
|
||
delete pBmp;
|
||
pBmp = pNew;
|
||
}
|
||
return pBmp;
|
||
}
|
||
|
||
void __fastcall CDrawText::MakeBitmap(void)
|
||
{
|
||
if( m_Text.IsEmpty() ) return;
|
||
char bf[1024];
|
||
Mmsstv->MacroText(bf, m_Text.c_str(), sizeof(bf)-1);
|
||
int ZC = 0;
|
||
if( m_Zero ) ZC = ZeroConv(pFont->Charset, bf);
|
||
|
||
CWaitCursor wait;
|
||
if( pBitmap != NULL ){
|
||
delete pBitmap;
|
||
}
|
||
pc->Font->Assign(pFont);
|
||
int wx = (pFont->Size + 15)/ 16;
|
||
int x2 = m_X2;
|
||
int y2 = m_Y2;
|
||
if( m_Rot ){
|
||
m_X1 = m_X;
|
||
m_Y1 = m_Y;
|
||
}
|
||
else {
|
||
m_X = m_X1;
|
||
m_Y = m_Y1;
|
||
}
|
||
if( m_Vert ){
|
||
SetMBCP(pFont->Charset);
|
||
int len;
|
||
m_X2 = m_X1 + GetMaxWidth(len, bf);
|
||
m_Y2 = m_Y1 + ((pc->TextHeight(bf) + m_VertH) * len) + wx + wx;
|
||
}
|
||
else {
|
||
m_X2 = m_X1 + pc->TextWidth(bf) + wx + wx;
|
||
m_Y2 = m_Y1 + pc->TextHeight(bf) + wx;
|
||
if( ZC ) m_X2 += (pc->TextWidth("0") * ZC);
|
||
}
|
||
int xt, yt;
|
||
switch(m_Shadow){
|
||
case 1:
|
||
xt = yt = m_LineWidth + 1;
|
||
break;
|
||
case 4:
|
||
case 5:
|
||
if( !m_Stack ){
|
||
xt = yt = 0;
|
||
break;
|
||
}
|
||
case 6:
|
||
case 7:
|
||
xt = yt = 2;
|
||
break;
|
||
default:
|
||
xt = yt = 0;
|
||
break;
|
||
}
|
||
if( m_Vert ) xt += (m_X2-m_X1)/2;
|
||
if( m_Rot ){
|
||
m_Y1 -= wx;
|
||
m_X1 -= wx;
|
||
m_X2 += wx;
|
||
m_Y2 += wx;
|
||
double s = 2 * PI * m_Rot / 360;
|
||
double cosk = cos(s);
|
||
double sink = sin(s);
|
||
int xc = (m_X1 + m_X2)/2;
|
||
int yc = (m_Y1 + m_Y2)/2;
|
||
POINT N[5];
|
||
N[0].x = m_X1 - xc;
|
||
N[0].y = m_Y1 - yc;
|
||
N[1].x = m_X2 - xc;
|
||
N[1].y = m_Y1 - yc;
|
||
N[2].x = m_X2 - xc;
|
||
N[2].y = m_Y2 - yc;
|
||
N[3].x = m_X1 - xc;
|
||
N[3].y = m_Y2 - yc;
|
||
N[4].x = xt + m_X1 - xc;
|
||
N[4].y = yt + m_Y1 - yc;
|
||
int i;
|
||
for( i = 0; i < 5; i++ ){
|
||
int x = N[i].x * cosk + N[i].y * sink;
|
||
int y = -N[i].x * sink + N[i].y * cosk;
|
||
N[i].x = x + xc; N[i].y = y + yc;
|
||
}
|
||
m_X1 = m_X2 = N[0].x; m_Y1 = m_Y2 = N[0].y;
|
||
for( i = 1; i < 4; i++ ){
|
||
if( m_X1 > N[i].x ) m_X1 = N[i].x;
|
||
if( m_X2 < N[i].x ) m_X2 = N[i].x;
|
||
if( m_Y1 > N[i].y ) m_Y1 = N[i].y;
|
||
if( m_Y2 < N[i].y ) m_Y2 = N[i].y;
|
||
}
|
||
xt = N[4].x - m_X1;
|
||
yt = N[4].y - m_Y1;
|
||
}
|
||
switch(m_Shadow){
|
||
case 0:
|
||
break;
|
||
case 1:
|
||
m_X2 += m_LineWidth + m_LineWidth + 2;
|
||
m_Y2 += m_LineWidth + m_LineWidth + 2;
|
||
break;
|
||
case 2:
|
||
case 3:
|
||
case 4:
|
||
case 5:
|
||
case 7:
|
||
m_X2 += wx;
|
||
m_Y2 += wx;
|
||
case 6:
|
||
m_X2 += wx + wx;
|
||
m_Y2 += wx;
|
||
break;
|
||
}
|
||
int ax, ay;
|
||
if( m_Stack ){
|
||
ax = int(char(m_StackPara & 0x000000ff));
|
||
ay = int(char((m_StackPara >> 8) & 0x000000ff));
|
||
if( ax > 0 ){
|
||
xt += ax;
|
||
}
|
||
m_X2 += ABS(ax);
|
||
if( ay > 0 ){
|
||
yt += ay;
|
||
}
|
||
m_Y2 += ABS(ay);
|
||
ax = -ax; ay = -ay;
|
||
}
|
||
AdjustRect();
|
||
TFontStyles ts = pFont->Style;
|
||
int fsw = FontStyle2Code(ts);
|
||
if( fsw & FSITALIC ) m_X2 += wx * 3;
|
||
int pf24 = sys.m_Temp24;
|
||
pBitmap = CreateBitmap(m_X2 - m_X1 + 1, m_Y2 - m_Y1 + 1, pf24 ? pf24bit : -1);
|
||
COLD cBack;
|
||
cBack.c = TransCol;
|
||
if( cBack.c == m_Col1 ){
|
||
cBack.c = GetUniqueColor(m_Col1);
|
||
}
|
||
if( m_Shadow && (cBack.c == m_ColS) ){
|
||
cBack.c = GetUniqueColor(cBack.c);
|
||
}
|
||
FillBitmap(pBitmap, cBack.c);
|
||
cBack.c = pBitmap->Canvas->Pixels[0][0];
|
||
if( m_RightAdj ){
|
||
if( m_Vert && y2 ){
|
||
y2 = m_Y2 - y2;
|
||
m_Y1 -= y2; m_Y2 -= y2;
|
||
}
|
||
else if( x2 ){
|
||
x2 = m_X2 - x2;
|
||
m_X1 -= x2; m_X2 -= x2;
|
||
}
|
||
}
|
||
MultProc();
|
||
|
||
if( m_Rot || sys.m_DisFontSmooth ){
|
||
LOGFONT lf;
|
||
memset(&lf, 0, sizeof(lf));
|
||
lf.lfHeight = pFont->Height;
|
||
lf.lfWidth = 0;
|
||
lf.lfEscapement = m_Rot * 10;
|
||
lf.lfOrientation = m_Rot * 10;
|
||
lf.lfWeight = fsw & FSBOLD ? 700 : 400;
|
||
lf.lfItalic = BYTE(fsw & FSITALIC ? TRUE : FALSE);
|
||
lf.lfUnderline = BYTE(fsw & FSUNDERLINE ? TRUE : FALSE);
|
||
lf.lfStrikeOut = BYTE(fsw & FSSTRIKEOUT ? TRUE : FALSE);
|
||
lf.lfCharSet = pFont->Charset;
|
||
lf.lfOutPrecision = OUT_CHARACTER_PRECIS;
|
||
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
|
||
lf.lfQuality = BYTE(sys.m_DisFontSmooth ? NONANTIALIASED_QUALITY : PROOF_QUALITY);
|
||
lf.lfPitchAndFamily = DEFAULT_PITCH;
|
||
strcpy(lf.lfFaceName, AnsiString(pFont->Name).c_str()); //ja7ude 0521
|
||
|
||
pBitmap->Canvas->Font->Handle = CreateFontIndirect(&lf);
|
||
}
|
||
else {
|
||
pBitmap->Canvas->Font = pFont;
|
||
}
|
||
pBitmap->Canvas->Font->Color = m_Col1;
|
||
DrawText(pBitmap->Canvas, xt, yt, bf, ZC);
|
||
|
||
COLD col;
|
||
int x, y;
|
||
int XW = pBitmap->Width;
|
||
int YW = pBitmap->Height;
|
||
int XL = XW;
|
||
int XR = 0;
|
||
int YT = YW;
|
||
int YB = 0;
|
||
BYTE **pY = NULL;
|
||
BYTE *bp = NULL;
|
||
BYTE *sp;
|
||
BYTE *wp;
|
||
if( m_Grade || m_Shadow ){
|
||
bp = new BYTE[XW * YW];
|
||
wp = bp;
|
||
if( pf24 ){
|
||
col.d = 0;
|
||
pY = new BYTE*[YW];
|
||
for( y = 0; y < YW; y++ ){
|
||
sp = (BYTE *)pBitmap->ScanLine[y];
|
||
pY[y] = sp;
|
||
for( x = 0; x < XW; x++, wp++ ){
|
||
col.b.b = *sp++;
|
||
col.b.g = *sp++;
|
||
col.b.r = *sp++;
|
||
if( col.c != cBack.c ){
|
||
if( XL > x ) XL = x;
|
||
if( XR < x ) XR = x;
|
||
if( YT > y ) YT = y;
|
||
if( YB < y ) YB = y;
|
||
*wp = 1;
|
||
}
|
||
else {
|
||
*wp = 0;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
for( y = 0; y < YW; y++ ){
|
||
for( x = 0; x < XW; x++, wp++ ){
|
||
if( pBitmap->Canvas->Pixels[x][y] != cBack.c ){
|
||
if( XL > x ) XL = x;
|
||
if( XR < x ) XR = x;
|
||
if( YT > y ) YT = y;
|
||
if( YB < y ) YB = y;
|
||
*wp = 1;
|
||
}
|
||
else {
|
||
*wp = 0;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
}
|
||
int X1, X2, Y1, Y2;
|
||
switch(m_Grade){
|
||
case 0:
|
||
if( m_Shadow ){
|
||
col.c = m_Col1;
|
||
if( pf24 ){
|
||
for( y = YT; y <= YB; y++ ){
|
||
sp = &bp[y*XW + XL];
|
||
// wp = (BYTE *)pBitmap->ScanLine[y] + (XL * 3);
|
||
wp = (BYTE *)pY[y] + (XL * 3);
|
||
for( x = XL; x <= XR; x++, sp++ ){
|
||
if( *sp ){
|
||
*wp++ = col.b.b;
|
||
*wp++ = col.b.g;
|
||
*wp++ = col.b.r;
|
||
}
|
||
else {
|
||
wp += 3;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
for( y = YT; y <= YB; y++ ){
|
||
sp = &bp[y*XW + XL];
|
||
for( x = XL; x <= XR; x++, sp++ ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = col.c;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case 1:
|
||
if( pf24 ){
|
||
X1 = (XR - XL) / 3;
|
||
for( x = XL; x < X1+XL; x++ ){
|
||
col.c = GetCol(m_Col1, m_Col2, x - XL, X1);
|
||
sp = &bp[YT*XW + x];
|
||
for( y = YT; y <= YB; y++, sp += XW ){
|
||
if( *sp ){
|
||
// wp = (BYTE *)pBitmap->ScanLine[y] + (x * 3);
|
||
wp = (BYTE *)pY[y] + (x * 3);
|
||
*wp++ = col.b.b;
|
||
*wp++ = col.b.g;
|
||
*wp = col.b.r;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
X2 = X1+X1;
|
||
for( ; x < X2+XL; x++ ){
|
||
col.c = GetCol(m_Col2, m_Col3, x - X1 - XL, X1);
|
||
sp = &bp[YT*XW + x];
|
||
for( y = YT; y <= YB; y++, sp += XW ){
|
||
if( *sp ){
|
||
// wp = (BYTE *)pBitmap->ScanLine[y] + (x * 3);
|
||
wp = (BYTE *)pY[y] + (x * 3);
|
||
*wp++ = col.b.b;
|
||
*wp++ = col.b.g;
|
||
*wp = col.b.r;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
for( ; x <= XR; x++ ){
|
||
col.c = GetCol(m_Col3, m_Col4, x - X2 - XL, X1);
|
||
sp = &bp[YT*XW + x];
|
||
for( y = YT; y <= YB; y++, sp += XW ){
|
||
if( *sp ){
|
||
// wp = (BYTE *)pBitmap->ScanLine[y] + (x * 3);
|
||
wp = (BYTE *)pY[y] + (x * 3);
|
||
*wp++ = col.b.b;
|
||
*wp++ = col.b.g;
|
||
*wp = col.b.r;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
X1 = (XR - XL) / 3;
|
||
for( x = XL; x < X1+XL; x++ ){
|
||
col.c = GetCol(m_Col1, m_Col2, x - XL, X1);
|
||
sp = &bp[YT*XW + x];
|
||
for( y = YT; y <= YB; y++, sp += XW ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = col.c;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
X2 = X1+X1;
|
||
for( ; x < X2+XL; x++ ){
|
||
col.c = GetCol(m_Col2, m_Col3, x - X1 - XL, X1);
|
||
sp = &bp[YT*XW + x];
|
||
for( y = YT; y <= YB; y++, sp += XW ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = col.c;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
for( ; x <= XR; x++ ){
|
||
col.c = GetCol(m_Col3, m_Col4, x - X2 - XL, X1);
|
||
sp = &bp[YT*XW + x];
|
||
for( y = YT; y <= YB; y++, sp += XW ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = col.c;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case 2:
|
||
if( pf24 ){
|
||
Y1 = (YB - YT) / 3;
|
||
for( y = YT; y < Y1+YT; y++ ){
|
||
col.c = GetCol(m_Col1, m_Col2, y - YT, Y1);
|
||
sp = &bp[y*XW + XL];
|
||
// wp = (BYTE *)pBitmap->ScanLine[y] + (XL * 3);
|
||
wp = (BYTE *)pY[y] + (XL * 3);
|
||
for( x = XL; x <= XR; x++, sp++ ){
|
||
if( *sp ){
|
||
*wp++ = col.b.b;
|
||
*wp++ = col.b.g;
|
||
*wp++ = col.b.r;
|
||
}
|
||
else {
|
||
wp += 3;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
Y2 = Y1+Y1;
|
||
for( ; y < Y2 + YT; y++ ){
|
||
col.c = GetCol(m_Col2, m_Col3, y - Y1 - YT, Y1);
|
||
sp = &bp[y*XW + XL];
|
||
// wp = (BYTE *)pBitmap->ScanLine[y] + (XL * 3);
|
||
wp = (BYTE *)pY[y] + (XL * 3);
|
||
for( x = XL; x <= XR; x++, sp++ ){
|
||
if( *sp ){
|
||
*wp++ = col.b.b;
|
||
*wp++ = col.b.g;
|
||
*wp++ = col.b.r;
|
||
}
|
||
else {
|
||
wp += 3;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
for( ; y <= YB; y++ ){
|
||
col.c = GetCol(m_Col3, m_Col4, y - Y2 - YT, Y1);
|
||
sp = &bp[y*XW + XL];
|
||
// wp = (BYTE *)pBitmap->ScanLine[y] + (XL * 3);
|
||
wp = (BYTE *)pY[y] + (XL * 3);
|
||
for( x = XL; x <= XR; x++, sp++ ){
|
||
if( *sp ){
|
||
*wp++ = col.b.b;
|
||
*wp++ = col.b.g;
|
||
*wp++ = col.b.r;
|
||
}
|
||
else {
|
||
wp += 3;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
Y1 = (YB - YT) / 3;
|
||
for( y = YT; y < Y1+YT; y++ ){
|
||
col.c = GetCol(m_Col1, m_Col2, y - YT, Y1);
|
||
sp = &bp[y*XW + XL];
|
||
for( x = XL; x <= XR; x++, sp++ ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = col.c;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
Y2 = Y1+Y1;
|
||
for( ; y < Y2 + YT; y++ ){
|
||
col.c = GetCol(m_Col2, m_Col3, y - Y1 - YT, Y1);
|
||
sp = &bp[y*XW + XL];
|
||
for( x = XL; x <= XR; x++, sp++ ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = col.c;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
for( ; y <= YB; y++ ){
|
||
col.c = GetCol(m_Col3, m_Col4, y - Y2 - YT, Y1);
|
||
sp = &bp[y*XW + XL];
|
||
for( x = XL; x <= XR; x++, sp++ ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = col.c;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case 3:
|
||
if( (pBrushBitmap != NULL) && pBrushBitmap->Width && pBrushBitmap->Height ){
|
||
if( pf24 ){
|
||
for( y = YT; y <= YB; y++ ){
|
||
sp = &bp[y*XW + XL];
|
||
// wp = (BYTE *)pBitmap->ScanLine[y] + (XL * 3);
|
||
wp = (BYTE *)pY[y] + (XL * 3);
|
||
for( x = XL; x <= XR; x++, sp++ ){
|
||
if( *sp ){
|
||
col.c = pBrushBitmap->Canvas->Pixels[x % pBrushBitmap->Width][y % pBrushBitmap->Height];
|
||
*wp++ = col.b.b;
|
||
*wp++ = col.b.g;
|
||
*wp++ = col.b.r;
|
||
}
|
||
else {
|
||
wp += 3;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
for( y = YT; y <= YB; y++ ){
|
||
sp = &bp[y*XW + XL];
|
||
for( x = XL; x <= XR; x++, sp++ ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = pBrushBitmap->Canvas->Pixels[x % pBrushBitmap->Width][y % pBrushBitmap->Height];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
|
||
MultProc();
|
||
|
||
Graphics::TBitmap *pBit;
|
||
int f, lw;
|
||
switch(m_Shadow){
|
||
case 1:
|
||
// if( wx > 1 ) wx--;
|
||
col.c = m_ColS;
|
||
lw = m_LineWidth;
|
||
_sh1:
|
||
if( pf24 ){
|
||
for( x = 0; x < XW; x++ ){
|
||
f = 0;
|
||
sp = &bp[x];
|
||
for( y = 0; y < YW; y++, sp += XW ){
|
||
if( *sp ){
|
||
f = lw;
|
||
}
|
||
else if( f ){
|
||
// wp = (BYTE *)pBitmap->ScanLine[y] + (x * 3);
|
||
wp = (BYTE *)pY[y] + (x * 3);
|
||
*wp++ = col.b.b;
|
||
*wp++ = col.b.g;
|
||
*wp = col.b.r;
|
||
*sp = 1;
|
||
f--;
|
||
}
|
||
}
|
||
f = 0;
|
||
y = YW - 1;
|
||
sp = &bp[y*XW+x];
|
||
for( ; y > 0; y--, sp -= XW ){
|
||
if( *sp ){
|
||
f = lw;
|
||
}
|
||
else if( f ){
|
||
// wp = (BYTE *)pBitmap->ScanLine[y] + (x * 3);
|
||
wp = (BYTE *)pY[y] + (x * 3);
|
||
*wp++ = col.b.b;
|
||
*wp++ = col.b.g;
|
||
*wp = col.b.r;
|
||
*sp = 1;
|
||
f--;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
for( y = 0; y < YW; y++ ){
|
||
f = 0;
|
||
sp = &bp[y*XW];
|
||
// wp = (BYTE *)pBitmap->ScanLine[y];
|
||
wp = (BYTE *)pY[y];
|
||
for( x = 0; x < XW; x++, sp++, wp+=3 ){
|
||
if( *sp ){
|
||
f = lw;
|
||
}
|
||
else if( f ){
|
||
*wp++ = col.b.b;
|
||
*wp++ = col.b.g;
|
||
*wp = col.b.r;
|
||
wp -= 2;
|
||
*sp = 1;
|
||
f--;
|
||
}
|
||
}
|
||
f = 0;
|
||
x = XW - 1;
|
||
sp = &bp[y*XW+x];
|
||
// wp = (BYTE *)pBitmap->ScanLine[y] + (x * 3);
|
||
wp = (BYTE *)pY[y] + (x * 3);
|
||
for( ; x > 0; x--, sp--, wp-=3 ){
|
||
if( *sp ){
|
||
f = lw;
|
||
}
|
||
else if( f ){
|
||
*wp++ = col.b.b;
|
||
*wp++ = col.b.g;
|
||
*wp = col.b.r;
|
||
wp -= 2;
|
||
f--;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
for( x = 0; x < XW; x++ ){
|
||
f = 0;
|
||
sp = &bp[x];
|
||
for( y = 0; y < YW; y++, sp += XW ){
|
||
if( *sp ){
|
||
f = lw;
|
||
}
|
||
else if( f ){
|
||
pBitmap->Canvas->Pixels[x][y] = col.c;
|
||
*sp = 1;
|
||
f--;
|
||
}
|
||
}
|
||
f = 0;
|
||
y = YW - 1;
|
||
sp = &bp[y*XW+x];
|
||
for( ; y > 0; y--, sp -= XW ){
|
||
if( *sp ){
|
||
f = lw;
|
||
}
|
||
else if( f ){
|
||
pBitmap->Canvas->Pixels[x][y] = col.c;
|
||
*sp = 1;
|
||
f--;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
for( y = 0; y < YW; y++ ){
|
||
f = 0;
|
||
sp = &bp[y*XW];
|
||
for( x = 0; x < XW; x++, sp++ ){
|
||
if( *sp ){
|
||
f = lw;
|
||
}
|
||
else if( f ){
|
||
pBitmap->Canvas->Pixels[x][y] = col.c;
|
||
*sp = 1;
|
||
f--;
|
||
}
|
||
}
|
||
f = 0;
|
||
x = XW - 1;
|
||
sp = &bp[y*XW+x];
|
||
for( ; x > 0; x--, sp-- ){
|
||
if( *sp ){
|
||
f = lw;
|
||
}
|
||
else if( f ){
|
||
pBitmap->Canvas->Pixels[x][y] = col.c;
|
||
f--;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case 2:
|
||
if( pf24 ) pBitmap = ConvToDDB(pBitmap);
|
||
pBit = DupeB(cBack.c);
|
||
pBit->Canvas->Font = pBitmap->Canvas->Font;
|
||
pBit->Canvas->Font->Color = m_ColS;
|
||
DrawText(pBit->Canvas, xt+wx, yt+wx, bf, ZC);
|
||
pBit->Canvas->Draw(0, 0, pBitmap);
|
||
delete pBitmap;
|
||
pBitmap = pBit;
|
||
break;
|
||
case 3:
|
||
if( pf24 ){
|
||
col.c = m_ColS;
|
||
for( x = 0; x < XW; x++ ){
|
||
f = 0;
|
||
sp = &bp[x];
|
||
for( y = 0; y < YW; y++, sp += XW ){
|
||
if( *sp ){
|
||
f = wx;
|
||
}
|
||
else if( f ){
|
||
// wp = (BYTE *)pBitmap->ScanLine[y] + (x * 3);
|
||
wp = (BYTE *)pY[y] + (x * 3);
|
||
*wp++ = col.b.b;
|
||
*wp++ = col.b.g;
|
||
*wp = col.b.r;
|
||
*sp = 1;
|
||
f--;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
for( y = 0; y < YW; y++ ){
|
||
f = 0;
|
||
sp = &bp[y*XW];
|
||
// wp = (BYTE *)pBitmap->ScanLine[y];
|
||
wp = (BYTE *)pY[y];
|
||
for( x = 0; x < XW; x++, sp++, wp+=3 ){
|
||
if( *sp ){
|
||
f = wx;
|
||
}
|
||
else if( f ){
|
||
*wp++ = col.b.b;
|
||
*wp++ = col.b.g;
|
||
*wp = col.b.r;
|
||
wp -= 2;
|
||
f--;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
col.c = m_ColS;
|
||
for( x = 0; x < XW; x++ ){
|
||
f = 0;
|
||
sp = &bp[x];
|
||
for( y = 0; y < YW; y++, sp += XW ){
|
||
if( *sp ){
|
||
f = wx;
|
||
}
|
||
else if( f ){
|
||
pBitmap->Canvas->Pixels[x][y] = col.c;
|
||
*sp = 1;
|
||
f--;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
for( y = 0; y < YW; y++ ){
|
||
f = 0;
|
||
sp = &bp[y*XW];
|
||
for( x = 0; x < XW; x++, sp++ ){
|
||
if( *sp ){
|
||
f = wx;
|
||
}
|
||
else if( f ){
|
||
pBitmap->Canvas->Pixels[x][y] = col.c;
|
||
f--;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case 4:
|
||
case 5:
|
||
case 6:
|
||
if( pf24 ) pBitmap = ConvToDDB(pBitmap);
|
||
pBit = DupeB(cBack.c);
|
||
pBit->Canvas->Font = pBitmap->Canvas->Font;
|
||
{
|
||
if( !m_Stack ){
|
||
switch(m_Shadow){
|
||
case 4:
|
||
ax = wx;
|
||
ay = wx*2;
|
||
break;
|
||
case 5:
|
||
ax = wx*2;
|
||
ay = wx;
|
||
break;
|
||
case 6:
|
||
ax = wx*2;
|
||
ay = wx*2;
|
||
break;
|
||
}
|
||
ax++; ay++;
|
||
}
|
||
int m = ABS(ax);
|
||
if( ABS(ax) < ABS(ay) ) m = ABS(ay);
|
||
if( m_StackPara ){
|
||
for( f = m; f > 0; f-- ){
|
||
col.c = GetCol(m_ColS, m_ColB, f-1, m);
|
||
pBit->Canvas->Font->Color = col.c;
|
||
::SetBkMode(pBit->Canvas->Handle, TRANSPARENT);
|
||
DrawText(pBit->Canvas, xt+(f*ax/m), yt+(f*ay/m), bf, ZC);
|
||
}
|
||
}
|
||
MultProc();
|
||
pBit->Canvas->Draw(0, 0, pBitmap);
|
||
delete pBitmap;
|
||
pBitmap = pBit;
|
||
}
|
||
if( (m_Shadow == 6) || m_Stack ){
|
||
lw = 1;
|
||
switch(m_Shadow){
|
||
case 4:
|
||
col.c = clBlack;
|
||
break;
|
||
case 5:
|
||
col.c = clWhite;
|
||
break;
|
||
case 6:
|
||
col.c = m_LineColor;
|
||
lw = m_LineWidth;
|
||
break;
|
||
}
|
||
MultProc();
|
||
if( pf24 ) pBitmap = ConvToDIB(pBitmap);
|
||
if( pY ){
|
||
for( y = 0; y < YW; y++ ){
|
||
pY[y] = (BYTE *)pBitmap->ScanLine[y];
|
||
}
|
||
}
|
||
goto _sh1;
|
||
}
|
||
break;
|
||
case 7:
|
||
if( pf24 ) pBitmap = ConvToDDB(pBitmap);
|
||
pBit = DupeB(cBack.c);
|
||
pBit->Canvas->Font = pBitmap->Canvas->Font;
|
||
pBit->Canvas->Font->Color = m_ColS;
|
||
::SetBkMode(pBit->Canvas->Handle, TRANSPARENT);
|
||
DrawText(pBit->Canvas, xt-1, yt-1, bf, ZC);
|
||
pBit->Canvas->Font->Color = m_ColB;
|
||
::SetBkMode(pBit->Canvas->Handle, TRANSPARENT);
|
||
DrawText(pBit->Canvas, xt+1, yt+1, bf, ZC);
|
||
pBit->Canvas->Draw(0, 0, pBitmap);
|
||
delete pBitmap;
|
||
pBitmap = pBit;
|
||
break;
|
||
}
|
||
if( bp != NULL ) delete bp;
|
||
if( pY != NULL ) delete pY;
|
||
if( m_Stack && m_StackPara && ((m_Shadow < 4) || (m_Shadow > 6)) ){
|
||
MultProc();
|
||
if( pf24 ) pBitmap = ConvToDDB(pBitmap);
|
||
pBit = DupeB(cBack.c);
|
||
int m = ABS(ax);
|
||
if( ABS(ax) < ABS(ay) ) m = ABS(ay);
|
||
for( f = m; f >= 0; f-- ){
|
||
pBit->Canvas->Draw(f*ax/m, f*ay/m, pBitmap);
|
||
}
|
||
delete pBitmap;
|
||
pBitmap = pBit;
|
||
}
|
||
if( m_PerSpect ){
|
||
MultProc();
|
||
pBit = CreateBitmap(pBitmap->Width, pBitmap->Height, -1);
|
||
pBitmap->Transparent = FALSE;
|
||
Perspect(pBitmap, pBit, &m_sperspect, cBack.c);
|
||
delete pBitmap;
|
||
pBitmap = pBit;
|
||
pBitmap->Transparent = TRUE;
|
||
pBitmap->TransparentMode = tmFixed;
|
||
pBitmap->TransparentColor = pBitmap->Canvas->Pixels[0][0];
|
||
}
|
||
else {
|
||
if( pf24 ) pBitmap = ConvToDDB(pBitmap);
|
||
pBitmap->Transparent = TRUE;
|
||
pBitmap->TransparentMode = tmAuto;
|
||
}
|
||
if( m_Vert ) SetMBCP();
|
||
}
|
||
|
||
#if 0
|
||
void __fastcall CDrawText::MakeBitmap16(void)
|
||
{
|
||
if( m_Text.IsEmpty() ) return;
|
||
char bf[1024];
|
||
Mmsstv->MacroText(bf, m_Text.c_str(), sizeof(bf)-1);
|
||
int ZC = 0;
|
||
if( m_Zero ) ZC = ZeroConv(pFont->Charset, bf);
|
||
|
||
CWaitCursor wait;
|
||
if( pBitmap != NULL ){
|
||
delete pBitmap;
|
||
}
|
||
pc->Font->Assign(pFont);
|
||
int wx = (pFont->Size + 15)/ 16;
|
||
int x2 = m_X2;
|
||
int y2 = m_Y2;
|
||
if( m_Rot ){
|
||
m_X1 = m_X;
|
||
m_Y1 = m_Y;
|
||
}
|
||
else {
|
||
m_X = m_X1;
|
||
m_Y = m_Y1;
|
||
}
|
||
if( m_Vert ){
|
||
SetMBCP(pFont->Charset);
|
||
int len;
|
||
m_X2 = m_X1 + GetMaxWidth(len, bf);
|
||
m_Y2 = m_Y1 + ((pc->TextHeight(bf) + m_VertH) * len) + wx + wx;
|
||
}
|
||
else {
|
||
m_X2 = m_X1 + pc->TextWidth(bf) + wx + wx;
|
||
m_Y2 = m_Y1 + pc->TextHeight(bf) + wx;
|
||
if( ZC ) m_X2 += (pc->TextWidth("0") * ZC);
|
||
}
|
||
int xt, yt;
|
||
switch(m_Shadow){
|
||
case 1:
|
||
xt = yt = m_LineWidth + 1;
|
||
break;
|
||
case 4:
|
||
case 5:
|
||
if( !m_Stack ){
|
||
xt = yt = 0;
|
||
break;
|
||
}
|
||
case 6:
|
||
case 7:
|
||
xt = yt = 2;
|
||
break;
|
||
default:
|
||
xt = yt = 0;
|
||
break;
|
||
}
|
||
if( m_Vert ) xt += (m_X2-m_X1)/2;
|
||
if( m_Rot ){
|
||
m_Y1 -= wx;
|
||
m_X1 -= wx;
|
||
m_X2 += wx;
|
||
m_Y2 += wx;
|
||
double s = 2 * PI * m_Rot / 360;
|
||
double cosk = cos(s);
|
||
double sink = sin(s);
|
||
int xc = (m_X1 + m_X2)/2;
|
||
int yc = (m_Y1 + m_Y2)/2;
|
||
POINT N[5];
|
||
N[0].x = m_X1 - xc;
|
||
N[0].y = m_Y1 - yc;
|
||
N[1].x = m_X2 - xc;
|
||
N[1].y = m_Y1 - yc;
|
||
N[2].x = m_X2 - xc;
|
||
N[2].y = m_Y2 - yc;
|
||
N[3].x = m_X1 - xc;
|
||
N[3].y = m_Y2 - yc;
|
||
N[4].x = xt + m_X1 - xc;
|
||
N[4].y = yt + m_Y1 - yc;
|
||
int i;
|
||
for( i = 0; i < 5; i++ ){
|
||
int x = N[i].x * cosk + N[i].y * sink;
|
||
int y = -N[i].x * sink + N[i].y * cosk;
|
||
N[i].x = x + xc; N[i].y = y + yc;
|
||
}
|
||
m_X1 = m_X2 = N[0].x; m_Y1 = m_Y2 = N[0].y;
|
||
for( i = 1; i < 4; i++ ){
|
||
if( m_X1 > N[i].x ) m_X1 = N[i].x;
|
||
if( m_X2 < N[i].x ) m_X2 = N[i].x;
|
||
if( m_Y1 > N[i].y ) m_Y1 = N[i].y;
|
||
if( m_Y2 < N[i].y ) m_Y2 = N[i].y;
|
||
}
|
||
xt = N[4].x - m_X1;
|
||
yt = N[4].y - m_Y1;
|
||
}
|
||
switch(m_Shadow){
|
||
case 0:
|
||
break;
|
||
case 1:
|
||
m_X2 += m_LineWidth + m_LineWidth + 2;
|
||
m_Y2 += m_LineWidth + m_LineWidth + 2;
|
||
break;
|
||
case 2:
|
||
case 3:
|
||
case 4:
|
||
case 5:
|
||
case 7:
|
||
m_X2 += wx;
|
||
m_Y2 += wx;
|
||
case 6:
|
||
m_X2 += wx + wx;
|
||
m_Y2 += wx;
|
||
break;
|
||
}
|
||
int ax, ay;
|
||
if( m_Stack ){
|
||
ax = int(char(m_StackPara & 0x000000ff));
|
||
ay = int(char((m_StackPara >> 8) & 0x000000ff));
|
||
if( ax > 0 ){
|
||
xt += ax;
|
||
}
|
||
m_X2 += ABS(ax);
|
||
if( ay > 0 ){
|
||
yt += ay;
|
||
}
|
||
m_Y2 += ABS(ay);
|
||
ax = -ax; ay = -ay;
|
||
}
|
||
AdjustRect();
|
||
TFontStyles ts = pFont->Style;
|
||
int fsw = FontStyle2Code(ts);
|
||
if( fsw & FSITALIC ) m_X2 += wx * 3;
|
||
pBitmap = CreateBitmap(m_X2 - m_X1 + 1, m_Y2 - m_Y1 + 1, -1);
|
||
TColor cBack = TransCol;
|
||
if( cBack == m_Col1 ){
|
||
cBack = GetUniqueColor(m_Col1);
|
||
}
|
||
if( m_Shadow && (cBack == m_ColS) ){
|
||
cBack = GetUniqueColor(cBack);
|
||
}
|
||
FillBitmap(pBitmap, cBack);
|
||
cBack = pBitmap->Canvas->Pixels[0][0];
|
||
|
||
if( m_RightAdj ){
|
||
if( m_Vert && y2 ){
|
||
y2 = m_Y2 - y2;
|
||
m_Y1 -= y2; m_Y2 -= y2;
|
||
}
|
||
else if( x2 ){
|
||
x2 = m_X2 - x2;
|
||
m_X1 -= x2; m_X2 -= x2;
|
||
}
|
||
}
|
||
|
||
MultProc();
|
||
|
||
if( m_Rot || sys.m_DisFontSmooth ){
|
||
LOGFONT lf;
|
||
memset(&lf, 0, sizeof(lf));
|
||
lf.lfHeight = pFont->Height;
|
||
lf.lfWidth = 0;
|
||
lf.lfEscapement = m_Rot * 10;
|
||
lf.lfOrientation = m_Rot * 10;
|
||
lf.lfWeight = fsw & FSBOLD ? 700 : 400;
|
||
lf.lfItalic = BYTE(fsw & FSITALIC ? TRUE : FALSE);
|
||
lf.lfUnderline = BYTE(fsw & FSUNDERLINE ? TRUE : FALSE);
|
||
lf.lfStrikeOut = BYTE(fsw & FSSTRIKEOUT ? TRUE : FALSE);
|
||
lf.lfCharSet = pFont->Charset;
|
||
lf.lfOutPrecision = OUT_CHARACTER_PRECIS;
|
||
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
|
||
lf.lfQuality = BYTE(sys.m_DisFontSmooth ? NONANTIALIASED_QUALITY : PROOF_QUALITY);
|
||
lf.lfPitchAndFamily = DEFAULT_PITCH;
|
||
strcpy(lf.lfFaceName, pFont->Name.c_str());
|
||
|
||
pBitmap->Canvas->Font->Handle = CreateFontIndirect(&lf);
|
||
}
|
||
else {
|
||
pBitmap->Canvas->Font = pFont;
|
||
}
|
||
pBitmap->Canvas->Font->Color = m_Col1;
|
||
DrawText(pBitmap->Canvas, xt, yt, bf, ZC);
|
||
|
||
TColor col;
|
||
int x, y;
|
||
int XW = pBitmap->Width;
|
||
int YW = pBitmap->Height;
|
||
int XL = XW;
|
||
int XR = 0;
|
||
int YT = YW;
|
||
int YB = 0;
|
||
BYTE *bp = NULL;
|
||
BYTE *sp;
|
||
if( m_Grade || m_Shadow ){
|
||
bp = new BYTE[XW * YW];
|
||
sp = bp;
|
||
for( y = 0; y < YW; y++ ){
|
||
for( x = 0; x < XW; x++, sp++ ){
|
||
if( pBitmap->Canvas->Pixels[x][y] != cBack ){
|
||
if( XL > x ) XL = x;
|
||
if( XR < x ) XR = x;
|
||
if( YT > y ) YT = y;
|
||
if( YB < y ) YB = y;
|
||
*sp = 1;
|
||
}
|
||
else {
|
||
*sp = 0;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
}
|
||
int X1, X2, Y1, Y2;
|
||
switch(m_Grade){
|
||
case 0:
|
||
if( m_Shadow ){
|
||
for( y = YT; y <= YB; y++ ){
|
||
sp = &bp[y*XW + XL];
|
||
for( x = XL; x <= XR; x++, sp++ ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = m_Col1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case 1:
|
||
X1 = (XR - XL) / 3;
|
||
for( x = XL; x < X1+XL; x++ ){
|
||
col = GetCol(m_Col1, m_Col2, x - XL, X1);
|
||
sp = &bp[YT*XW + x];
|
||
for( y = YT; y <= YB; y++, sp += XW ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = col;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
X2 = X1+X1;
|
||
for( ; x < X2+XL; x++ ){
|
||
col = GetCol(m_Col2, m_Col3, x - X1 - XL, X1);
|
||
sp = &bp[YT*XW + x];
|
||
for( y = YT; y <= YB; y++, sp += XW ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = col;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
for( ; x <= XR; x++ ){
|
||
col = GetCol(m_Col3, m_Col4, x - X2 - XL, X1);
|
||
sp = &bp[YT*XW + x];
|
||
for( y = YT; y <= YB; y++, sp += XW ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = col;
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case 2:
|
||
Y1 = (YB - YT) / 3;
|
||
for( y = YT; y < Y1+YT; y++ ){
|
||
col = GetCol(m_Col1, m_Col2, y - YT, Y1);
|
||
sp = &bp[y*XW + XL];
|
||
for( x = XL; x <= XR; x++, sp++ ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = col;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
Y2 = Y1+Y1;
|
||
for( ; y < Y2 + YT; y++ ){
|
||
col = GetCol(m_Col2, m_Col3, y - Y1 - YT, Y1);
|
||
sp = &bp[y*XW + XL];
|
||
for( x = XL; x <= XR; x++, sp++ ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = col;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
for( ; y <= YB; y++ ){
|
||
col = GetCol(m_Col3, m_Col4, y - Y2 - YT, Y1);
|
||
sp = &bp[y*XW + XL];
|
||
for( x = XL; x <= XR; x++, sp++ ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = col;
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case 3:
|
||
if( (pBrushBitmap != NULL) && pBrushBitmap->Width && pBrushBitmap->Height ){
|
||
for( y = YT; y <= YB; y++ ){
|
||
sp = &bp[y*XW + XL];
|
||
for( x = XL; x <= XR; x++, sp++ ){
|
||
if( *sp ){
|
||
pBitmap->Canvas->Pixels[x][y] = pBrushBitmap->Canvas->Pixels[x % pBrushBitmap->Width][y % pBrushBitmap->Height];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
|
||
MultProc();
|
||
|
||
Graphics::TBitmap *pBit;
|
||
int f, lw;
|
||
switch(m_Shadow){
|
||
case 1:
|
||
// if( wx > 1 ) wx--;
|
||
col = m_ColS;
|
||
lw = m_LineWidth;
|
||
_sh1:
|
||
for( x = 0; x < XW; x++ ){
|
||
f = 0;
|
||
sp = &bp[x];
|
||
for( y = 0; y < pBitmap->Height; y++, sp += XW ){
|
||
if( *sp ){
|
||
f = lw;
|
||
}
|
||
else if( f ){
|
||
pBitmap->Canvas->Pixels[x][y] = col;
|
||
*sp = 1;
|
||
f--;
|
||
}
|
||
}
|
||
f = 0;
|
||
y = YW - 1;
|
||
sp = &bp[y*XW+x];
|
||
for( ; y > 0; y--, sp -= XW ){
|
||
if( *sp ){
|
||
f = lw;
|
||
}
|
||
else if( f ){
|
||
pBitmap->Canvas->Pixels[x][y] = col;
|
||
*sp = 1;
|
||
f--;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
for( y = 0; y < YW; y++ ){
|
||
f = 0;
|
||
sp = &bp[y*XW];
|
||
for( x = 0; x < XW; x++, sp++ ){
|
||
if( *sp ){
|
||
f = lw;
|
||
}
|
||
else if( f ){
|
||
pBitmap->Canvas->Pixels[x][y] = col;
|
||
*sp = 1;
|
||
f--;
|
||
}
|
||
}
|
||
f = 0;
|
||
x = XW - 1;
|
||
sp = &bp[y*XW+x];
|
||
for( ; x > 0; x--, sp-- ){
|
||
if( *sp ){
|
||
f = lw;
|
||
}
|
||
else if( f ){
|
||
pBitmap->Canvas->Pixels[x][y] = col;
|
||
f--;
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case 2:
|
||
pBit = DupeB(cBack);
|
||
pBit->Canvas->Font = pBitmap->Canvas->Font;
|
||
pBit->Canvas->Font->Color = m_ColS;
|
||
DrawText(pBit->Canvas, xt+wx, yt+wx, bf, ZC);
|
||
pBit->Canvas->Draw(0, 0, pBitmap);
|
||
delete pBitmap;
|
||
pBitmap = pBit;
|
||
break;
|
||
case 3:
|
||
col = m_ColS;
|
||
for( x = 0; x < XW; x++ ){
|
||
f = 0;
|
||
sp = &bp[x];
|
||
for( y = 0; y < YW; y++, sp += XW ){
|
||
if( *sp ){
|
||
f = wx;
|
||
}
|
||
else if( f ){
|
||
pBitmap->Canvas->Pixels[x][y] = col;
|
||
*sp = 1;
|
||
f--;
|
||
}
|
||
}
|
||
}
|
||
MultProc();
|
||
for( y = 0; y < YW; y++ ){
|
||
f = 0;
|
||
sp = &bp[y*XW];
|
||
for( x = 0; x < XW; x++, sp++ ){
|
||
if( *sp ){
|
||
f = wx;
|
||
}
|
||
else if( f ){
|
||
pBitmap->Canvas->Pixels[x][y] = col;
|
||
f--;
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case 4:
|
||
case 5:
|
||
case 6:
|
||
pBit = DupeB(cBack);
|
||
pBit->Canvas->Font = pBitmap->Canvas->Font;
|
||
{
|
||
if( !m_Stack ){
|
||
switch(m_Shadow){
|
||
case 4:
|
||
ax = wx;
|
||
ay = wx*2;
|
||
break;
|
||
case 5:
|
||
ax = wx*2;
|
||
ay = wx;
|
||
break;
|
||
case 6:
|
||
ax = wx*2;
|
||
ay = wx*2;
|
||
break;
|
||
}
|
||
ax++; ay++;
|
||
}
|
||
int m = ABS(ax);
|
||
if( ABS(ax) < ABS(ay) ) m = ABS(ay);
|
||
if( m_StackPara ){
|
||
for( f = m; f > 0; f-- ){
|
||
col = GetCol(m_ColS, m_ColB, f-1, m);
|
||
pBit->Canvas->Font->Color = col;
|
||
::SetBkMode(pBit->Canvas->Handle, TRANSPARENT);
|
||
DrawText(pBit->Canvas, xt+(f*ax/m), yt+(f*ay/m), bf, ZC);
|
||
}
|
||
}
|
||
MultProc();
|
||
pBit->Canvas->Draw(0, 0, pBitmap);
|
||
delete pBitmap;
|
||
pBitmap = pBit;
|
||
}
|
||
if( (m_Shadow == 6) || m_Stack ){
|
||
lw = 1;
|
||
switch(m_Shadow){
|
||
case 4:
|
||
col = clBlack;
|
||
break;
|
||
case 5:
|
||
col = clWhite;
|
||
break;
|
||
case 6:
|
||
col = m_LineColor;
|
||
lw = m_LineWidth;
|
||
break;
|
||
}
|
||
MultProc();
|
||
goto _sh1;
|
||
}
|
||
break;
|
||
case 7:
|
||
pBit = DupeB(cBack);
|
||
pBit->Canvas->Font = pBitmap->Canvas->Font;
|
||
pBit->Canvas->Font->Color = m_ColS;
|
||
::SetBkMode(pBit->Canvas->Handle, TRANSPARENT);
|
||
DrawText(pBit->Canvas, xt-1, yt-1, bf, ZC);
|
||
pBit->Canvas->Font->Color = m_ColB;
|
||
::SetBkMode(pBit->Canvas->Handle, TRANSPARENT);
|
||
DrawText(pBit->Canvas, xt+1, yt+1, bf, ZC);
|
||
pBit->Canvas->Draw(0, 0, pBitmap);
|
||
delete pBitmap;
|
||
pBitmap = pBit;
|
||
break;
|
||
}
|
||
if( bp != NULL ) delete bp;
|
||
if( m_Stack && m_StackPara && ((m_Shadow < 4) || (m_Shadow > 6)) ){
|
||
MultProc();
|
||
pBit = DupeB(cBack);
|
||
int m = ABS(ax);
|
||
if( ABS(ax) < ABS(ay) ) m = ABS(ay);
|
||
for( f = m; f >= 0; f-- ){
|
||
pBit->Canvas->Draw(f*ax/m, f*ay/m, pBitmap);
|
||
}
|
||
delete pBitmap;
|
||
pBitmap = pBit;
|
||
}
|
||
if( m_PerSpect ){
|
||
MultProc();
|
||
pBit = CreateBitmap(pBitmap->Width, pBitmap->Height, pBitmap->PixelFormat);
|
||
pBitmap->Transparent = FALSE;
|
||
Perspect(pBitmap, pBit, &m_sperspect, cBack);
|
||
delete pBitmap;
|
||
pBitmap = pBit;
|
||
pBitmap->Transparent = TRUE;
|
||
pBitmap->TransparentMode = tmFixed;
|
||
pBitmap->TransparentColor = pBitmap->Canvas->Pixels[0][0];
|
||
}
|
||
else {
|
||
pBitmap->Transparent = TRUE;
|
||
pBitmap->TransparentMode = tmAuto;
|
||
}
|
||
if( m_Vert ) SetMBCP();
|
||
}
|
||
#endif
|
||
|
||
void __fastcall CDrawText::Move(int x, int y)
|
||
{
|
||
if( (m_CX1 == m_CX2) || (m_CY1 == m_CY2) ){
|
||
return;
|
||
}
|
||
if( m_MC != HT_I ){
|
||
double dx = fabs(double(m_CX2 - m_CX1)/double(m_X2 - m_X1));
|
||
double dy = fabs(double(m_CY2 - m_CY1)/double(m_Y2 - m_Y1));
|
||
double dxx = fabs(dx - 1.0);
|
||
double dyy = fabs(dy - 1.0);
|
||
if( dxx < dyy ) dx = dy;
|
||
int sz = pFont->Size;
|
||
sz = sz * dx + 0.5;
|
||
if( sz && (sz != pFont->Size) ){
|
||
pFont->Size = sz;
|
||
CDrawBox::Move(x, y);
|
||
MakeBitmap();
|
||
}
|
||
}
|
||
else {
|
||
int xx = m_X1;
|
||
int yy = m_Y1;
|
||
CDrawBox::Move(x, y);
|
||
m_X += m_X1 - xx;
|
||
m_Y += m_Y1 - yy;
|
||
}
|
||
}
|
||
|
||
int __fastcall CDrawText::Finish(int x, int y)
|
||
{
|
||
m_X2 = x;
|
||
m_Y2 = y;
|
||
m_X = m_X1;
|
||
m_Y = m_Y1;
|
||
pFont = new TFont();
|
||
if( CurText.pFont != NULL ){
|
||
pFont->Assign(CurText.pFont);
|
||
}
|
||
else {
|
||
pFont->Assign(pc->Font);
|
||
pFont->Size = 18;
|
||
}
|
||
MakeBitmap();
|
||
return Edit();
|
||
}
|
||
|
||
void __fastcall CDrawText::Draw(TCanvas *tp)
|
||
{
|
||
if( pBitmap == NULL ){
|
||
MakeBitmap();
|
||
if( pBitmap == NULL ) return;
|
||
}
|
||
tp->Draw(m_X1, m_Y1, pBitmap);
|
||
}
|
||
|
||
void __fastcall CDrawText::DrawFast(TCanvas *tp)
|
||
{
|
||
// CDrawBoxS::Draw(tp);
|
||
|
||
if( m_Text.IsEmpty() ) return;
|
||
char bf[1024];
|
||
Mmsstv->MacroText(bf, m_Text.c_str(), sizeof(bf)-1);
|
||
|
||
tp->Font->Assign(pFont);
|
||
tp->Font = pFont;
|
||
tp->Font->Color = (m_Col1 != tp->Brush->Color) ? m_Col1 : TColor(m_Col1 ^ 0x00ffffff);
|
||
int tm = ::SetBkMode(tp->Handle, TRANSPARENT);
|
||
if( m_Vert ){
|
||
DrawTextVert(tp, m_X1 + ((m_X2 - m_X1)/2), m_Y1, m_VertH, bf);
|
||
}
|
||
else {
|
||
int x = m_X1;
|
||
int y = m_Y1;
|
||
if( m_RightAdj ){
|
||
x = m_X2 - tp->TextWidth(bf);
|
||
}
|
||
if( m_Shadow == 1 ){
|
||
x += m_LineWidth + 1;
|
||
y += m_LineWidth + 1;
|
||
}
|
||
tp->TextOut(x, y, bf);
|
||
}
|
||
::SetBkMode(tp->Handle, tm);
|
||
}
|
||
|
||
int __fastcall CDrawText::Edit(void)
|
||
{
|
||
TTextInDlg *pBox = new TTextInDlg(Mmsstv);
|
||
int r = pBox->Execute(this);
|
||
delete pBox;
|
||
if( r == TRUE ){
|
||
if( m_Text.IsEmpty() ){
|
||
r = FALSE;
|
||
}
|
||
else {
|
||
MakeBitmap();
|
||
sys.m_ColText[0] = m_Col1;
|
||
sys.m_ColText[1] = m_Col2;
|
||
sys.m_ColText[2] = m_Col3;
|
||
sys.m_ColText[3] = m_Col4;
|
||
sys.m_ColText[4] = m_ColS;
|
||
sys.m_ColText[5] = m_ColB;
|
||
|
||
sys.m_TextGrade = m_Grade;
|
||
sys.m_TextShadow = m_Shadow;
|
||
sys.m_TextZero = m_Zero;
|
||
sys.m_TextRot = m_Rot;
|
||
sys.m_TextVert = m_Vert;
|
||
sys.m_TextVertH = m_VertH;
|
||
sys.m_TextStack = (m_Stack << 16) | m_StackPara;
|
||
if( CurText.pFont == NULL ){
|
||
CurText.pFont = new TFont;
|
||
}
|
||
CurText.pFont->Assign(pFont);
|
||
}
|
||
}
|
||
return r;
|
||
}
|
||
|
||
void __fastcall CDrawText::UpdateFont(TFont *pf)
|
||
{
|
||
if( pFont == NULL ){
|
||
pFont = new TFont();
|
||
}
|
||
pFont->Assign(pf);
|
||
MakeBitmap();
|
||
if( CurText.pFont == NULL ){
|
||
CurText.pFont = new TFont();
|
||
}
|
||
CurText.pFont->Assign(pFont);
|
||
}
|
||
|
||
void __fastcall CDrawText::SaveToStream(TStream *sp)
|
||
{
|
||
m_Ver = 7;
|
||
CDrawBox::SaveToStream(sp);
|
||
|
||
sp->Write(&m_Grade, sizeof(m_Grade));
|
||
sp->Write(&m_Shadow, sizeof(m_Shadow));
|
||
sp->Write(&m_Zero, sizeof(m_Zero));
|
||
sp->Write(&m_Rot, sizeof(m_Rot));
|
||
sp->Write(&m_X, sizeof(m_X));
|
||
sp->Write(&m_Y, sizeof(m_Y));
|
||
sp->Write(&m_RightAdj, sizeof(m_RightAdj));
|
||
sp->Write(&m_Stack, sizeof(m_Stack));
|
||
sp->Write(&m_StackPara, sizeof(m_StackPara));
|
||
sp->Write(&m_PerSpect, sizeof(m_PerSpect));
|
||
if( m_PerSpect ){
|
||
sp->Write(&m_sperspect, sizeof(m_sperspect));
|
||
}
|
||
sp->Write(&m_Vert, sizeof(m_Vert));
|
||
sp->Write(&m_VertH, sizeof(m_VertH));
|
||
|
||
SaveString(sp, m_Text);
|
||
sp->Write(&m_Col1, sizeof(m_Col1));
|
||
sp->Write(&m_Col2, sizeof(m_Col2));
|
||
sp->Write(&m_Col3, sizeof(m_Col3));
|
||
sp->Write(&m_Col4, sizeof(m_Col4));
|
||
sp->Write(&m_ColS, sizeof(m_ColS));
|
||
sp->Write(&m_ColB, sizeof(m_ColB));
|
||
|
||
AnsiString pFontName = pFont->Name;
|
||
SaveString(sp, pFontName); //ja7ude 0521
|
||
int d = pFont->Charset;
|
||
sp->Write(&d, sizeof(d));
|
||
d = pFont->Height;
|
||
if( d >= 0 ) d = -d;
|
||
sp->Write(&d, sizeof(d));
|
||
TFontStyles ts = pFont->Style;
|
||
d = FontStyle2Code(ts);
|
||
sp->Write(&d, sizeof(d));
|
||
d = 0;
|
||
sp->Write(&d, sizeof(d)); // dummy
|
||
if( m_Grade == 3 ){
|
||
SaveBitmap(sp, pBrushBitmap);
|
||
}
|
||
}
|
||
|
||
int __fastcall CDrawText::LoadFromStream(TCanvas *tp, TStream *sp)
|
||
{
|
||
if( CDrawBox::LoadFromStream(tp, sp) == FALSE ) return FALSE;
|
||
|
||
try {
|
||
sp->Read(&m_Grade, sizeof(m_Grade));
|
||
sp->Read(&m_Shadow, sizeof(m_Shadow));
|
||
if( m_Ver >= 1 ){
|
||
sp->Read(&m_Zero, sizeof(m_Zero));
|
||
}
|
||
if( m_Ver >= 2 ){
|
||
sp->Read(&m_Rot, sizeof(m_Rot));
|
||
sp->Read(&m_X, sizeof(m_X));
|
||
sp->Read(&m_Y, sizeof(m_Y));
|
||
}
|
||
else {
|
||
m_X = m_X1; m_Y = m_Y1;
|
||
}
|
||
if( m_Ver >= 4 ){
|
||
sp->Read(&m_RightAdj, sizeof(m_RightAdj));
|
||
}
|
||
else {
|
||
m_X2 = 0;
|
||
}
|
||
if( m_Ver >= 5 ){
|
||
sp->Read(&m_Stack, sizeof(m_Stack));
|
||
sp->Read(&m_StackPara, sizeof(m_StackPara));
|
||
|
||
sp->Read(&m_PerSpect, sizeof(m_PerSpect));
|
||
if( m_PerSpect ){
|
||
sp->Read(&m_sperspect, sizeof(m_sperspect));
|
||
}
|
||
}
|
||
else {
|
||
m_Stack = 0;
|
||
m_PerSpect = 0;
|
||
}
|
||
if( m_Ver >= 6 ){
|
||
sp->Read(&m_Vert, sizeof(m_Vert));
|
||
sp->Read(&m_VertH, sizeof(m_VertH));
|
||
}
|
||
else {
|
||
m_Vert = 0; m_VertH = -6;
|
||
}
|
||
LoadString(sp, m_Text);
|
||
sp->Read(&m_Col1, sizeof(m_Col1));
|
||
sp->Read(&m_Col2, sizeof(m_Col2));
|
||
sp->Read(&m_Col3, sizeof(m_Col3));
|
||
sp->Read(&m_Col4, sizeof(m_Col4));
|
||
sp->Read(&m_ColS, sizeof(m_ColS));
|
||
if( m_Ver >= 3 ){
|
||
sp->Read(&m_ColB, sizeof(m_ColB));
|
||
}
|
||
if( pFont == NULL ){
|
||
pFont = new TFont();
|
||
}
|
||
|
||
AnsiString as;
|
||
LoadString(sp, as);
|
||
pFont->Name = as;
|
||
int d;
|
||
sp->Read(&d, sizeof(d));
|
||
pFont->Charset = BYTE(d);
|
||
sp->Read(&d, sizeof(d));
|
||
if( d < 0 ){
|
||
pFont->Height = d;
|
||
}
|
||
else {
|
||
pFont->Size = d;
|
||
}
|
||
sp->Read(&d, sizeof(d));
|
||
TFontStyles ts = Code2FontStyle(d);
|
||
pFont->Style = ts;
|
||
sp->Read(&d, sizeof(d)); // dummy
|
||
if( m_Grade == 3 ){
|
||
if( pBrushBitmap == NULL ){
|
||
pBrushBitmap = new Graphics::TBitmap();
|
||
AdjustBitmapFormat(pBrushBitmap);
|
||
}
|
||
LoadBitmap(sp, pBrushBitmap);
|
||
}
|
||
if( (m_Ver <= 6) && (m_Shadow == 6) && !m_Stack ){
|
||
m_LineColor = m_ColS;
|
||
}
|
||
return TRUE;
|
||
}
|
||
catch(...){
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
|
||
void __fastcall CDrawText::Copy(CDraw *dp)
|
||
{
|
||
Copy(dp, 1);
|
||
}
|
||
|
||
void __fastcall CDrawText::Copy(CDraw *dp, int sw)
|
||
{
|
||
CDrawBox::Copy(dp);
|
||
CDrawText *sp = (CDrawText *)dp;
|
||
|
||
m_Grade = sp->m_Grade;
|
||
m_Shadow = sp->m_Shadow;
|
||
m_Zero = sp->m_Zero;
|
||
m_Rot = sp->m_Rot;
|
||
m_RightAdj = sp->m_RightAdj;
|
||
m_PerSpect = sp->m_PerSpect;
|
||
memcpy(&m_sperspect, &sp->m_sperspect, sizeof(m_sperspect));
|
||
m_Stack = sp->m_Stack;
|
||
m_StackPara = sp->m_StackPara;
|
||
m_Vert = sp->m_Vert;
|
||
m_VertH = sp->m_VertH;
|
||
m_X = sp->m_X;
|
||
m_Y = sp->m_Y;
|
||
m_Text = sp->m_Text;
|
||
if( pFont == NULL ){
|
||
pFont = new TFont;
|
||
}
|
||
pFont->Assign(sp->pFont);
|
||
if( sp->pBrushBitmap != NULL ){
|
||
if( pBrushBitmap == NULL ){
|
||
pBrushBitmap = new Graphics::TBitmap();
|
||
AdjustBitmapFormat(pBrushBitmap);
|
||
}
|
||
pBrushBitmap->Assign(sp->pBrushBitmap);
|
||
}
|
||
else if( pBrushBitmap != NULL ){
|
||
delete pBrushBitmap;
|
||
pBrushBitmap = NULL;
|
||
}
|
||
m_Col1 = sp->m_Col1;
|
||
m_Col2 = sp->m_Col2;
|
||
m_Col3 = sp->m_Col3;
|
||
m_Col4 = sp->m_Col4;
|
||
m_ColS = sp->m_ColS;
|
||
m_ColB = sp->m_ColB;
|
||
if( sw ){
|
||
MakeBitmap();
|
||
}
|
||
else if( pBitmap == NULL ){
|
||
pBitmap = new Graphics::TBitmap();
|
||
AdjustBitmapFormat(pBitmap);
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawText::UpdateText(void)
|
||
{
|
||
MakeBitmap();
|
||
}
|
||
|
||
void __fastcall CDrawText::UpdateTimeText(void)
|
||
{
|
||
if( IsTimeMacro() ){
|
||
MakeBitmap();
|
||
}
|
||
}
|
||
|
||
int __fastcall CDrawText::IsTimeMacro(void)
|
||
{
|
||
char bf[1024];
|
||
return Mmsstv->MacroText(bf, m_Text.c_str(), sizeof(bf)-1);
|
||
}
|
||
|
||
//---------------------------------------------------------------------------
|
||
__fastcall CDrawPic::CDrawPic()
|
||
{
|
||
m_Command = CM_PIC;
|
||
m_Type = 0;
|
||
m_Shape = sys.m_PicShape;
|
||
m_Adjust = sys.m_PicAdjust;
|
||
m_TransPoint = 0;
|
||
m_Ver = 5;
|
||
pBitmap = NULL;
|
||
pLoadBitmap = NULL;
|
||
m_LineStyle = TPenStyle(sys.m_PicLineStyle);
|
||
m_LineColor = sys.m_PicLineColor;
|
||
}
|
||
|
||
__fastcall CDrawPic::~CDrawPic()
|
||
{
|
||
if( pBitmap != NULL ){
|
||
delete pBitmap;
|
||
pBitmap = NULL;
|
||
}
|
||
if( pLoadBitmap != NULL ){
|
||
delete pLoadBitmap;
|
||
pLoadBitmap = NULL;
|
||
}
|
||
}
|
||
|
||
int __fastcall CDrawPic::Finish(int x, int y)
|
||
{
|
||
m_X2 = x;
|
||
m_Y2 = y;
|
||
Normal();
|
||
if( !((m_X1 != m_X2) && (m_Y1 != m_Y2)) ) return FALSE;
|
||
CreateBitmap();
|
||
StretchCopy(pBitmap, Mmsstv->pBitmapHistF, HALFTONE);
|
||
SetLoadBitmap(Mmsstv->pBitmapHistF);
|
||
return Edit();
|
||
}
|
||
|
||
void __fastcall CDrawPic::CreateBitmap(void)
|
||
{
|
||
pBitmap = ::CreateBitmap(m_X2 - m_X1 - 1, m_Y2 - m_Y1 - 1, -1);
|
||
}
|
||
|
||
int __fastcall CDrawPic::FinishR(int x, int y)
|
||
{
|
||
m_X2 = x;
|
||
m_Y2 = y;
|
||
Normal();
|
||
if( !((m_X1 != m_X2) && (m_Y1 != m_Y2)) ) return FALSE;
|
||
CreateBitmap();
|
||
return TRUE;
|
||
}
|
||
|
||
void __fastcall CDrawPic::SetLoadBitmap(Graphics::TBitmap *pBmp)
|
||
{
|
||
if( pLoadBitmap != NULL ) delete pLoadBitmap;
|
||
pLoadBitmap = DupeBitmap(pBmp, -1);
|
||
}
|
||
|
||
void __fastcall CDrawPic::AdjustSize(void)
|
||
{
|
||
ASSERT(pBitmap);
|
||
if( (m_Type == 2) && (sys.m_BitPixel == 16) ){
|
||
pBitmap = RemakeBitmap(pBitmap, -1);
|
||
}
|
||
pBitmap->Width = m_X2 - m_X1 - 1;
|
||
pBitmap->Height = m_Y2 - m_Y1 - 1;
|
||
if( m_Type && (pLoadBitmap != NULL) ){
|
||
if( m_Type == 2 ){
|
||
StretchCopy(pBitmap, pLoadBitmap, COLORONCOLOR);
|
||
}
|
||
else {
|
||
StretchCopy(pBitmap, NULL, pLoadBitmap, NULL);
|
||
}
|
||
}
|
||
m_DrawPolygon.Copy(&m_Polygon);
|
||
m_DrawPolygon.XW = pBitmap->Width;
|
||
m_DrawPolygon.YW = pBitmap->Height;
|
||
m_DrawPolygon.Stretch(m_Polygon);
|
||
}
|
||
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawPic::IsOrgSize(void)
|
||
{
|
||
Graphics::TBitmap *pSrc = m_Type ? pLoadBitmap : Mmsstv->pBitmapHist;
|
||
if( pSrc == NULL ) return TRUE;
|
||
|
||
if( (pBitmap->Width) != pSrc->Width ) return FALSE;
|
||
if( (pBitmap->Height) != pSrc->Height ) return FALSE;
|
||
return TRUE;
|
||
}
|
||
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawPic::SetOrgSize(void)
|
||
{
|
||
Graphics::TBitmap *pSrc = m_Type ? pLoadBitmap : Mmsstv->pBitmapHist;
|
||
if( pSrc == NULL ) return;
|
||
|
||
m_X2 = m_X1 + pSrc->Width + 1;
|
||
m_Y2 = m_Y1 + pSrc->Height + 1;
|
||
AdjustSize();
|
||
}
|
||
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawPic::KeepAspect(void)
|
||
{
|
||
Graphics::TBitmap *pSrc = m_Type ? pLoadBitmap : Mmsstv->pBitmapHist;
|
||
if( pSrc == NULL ) return;
|
||
|
||
int lx = pBitmap->Width;
|
||
int ly = pBitmap->Height;
|
||
::KeepAspect(lx, ly, pSrc->Width, pSrc->Height);
|
||
m_X2 = m_X1 + lx + 1;
|
||
m_Y2 = m_Y1 + ly + 1;
|
||
AdjustSize();
|
||
}
|
||
|
||
void __fastcall CDrawPic::Move(int x, int y)
|
||
{
|
||
CDrawBox::Move(x, y);
|
||
if( (m_X1 == m_X2) || (m_Y1 == m_Y2) ){
|
||
return;
|
||
}
|
||
if( m_MC != HT_I ){
|
||
if( pBitmap == NULL ){
|
||
pBitmap = new Graphics::TBitmap();
|
||
}
|
||
else if( m_Type && (pLoadBitmap == NULL) ){
|
||
pBitmap->Transparent = FALSE;
|
||
pLoadBitmap = DupeBitmap(pBitmap, -1);
|
||
}
|
||
AdjustBitmapFormat(pBitmap);
|
||
AdjustSize();
|
||
}
|
||
}
|
||
|
||
#if 0
|
||
void __fastcall CDrawPic::RoundRect(TCanvas *tp, int xw, int yw)
|
||
{
|
||
if( m_LineStyle < 0 ) return;
|
||
|
||
if( m_LineStyle >= 5 ){
|
||
int e = (m_LineStyle == 5) ? 4 : 3;
|
||
tp->Pen->Style = psSolid;
|
||
tp->Pen->Width = 1;
|
||
int x1 = m_X1;
|
||
int y1 = m_Y1;
|
||
int x2 = m_X2;
|
||
int y2 = m_Y2;
|
||
int xxw = xw;
|
||
int yyw = yw;
|
||
TColor col = m_LineColor;
|
||
TColor tcol = m_LineColor == clBlack ? clWhite : clBlack;
|
||
// TColor tcol = TColor(DWORD(m_LineColor) ^ 0x00ffffff);
|
||
int i;
|
||
for( i = 0; i < e; i++ ){
|
||
tp->Pen->Color = GetCol(col, tcol, i, e);
|
||
tp->RoundRect(x1, y1, x2, y2, xxw, yyw);
|
||
x1--; y1--;
|
||
x2++; y2++;
|
||
xxw += 2;
|
||
yyw += 2;
|
||
}
|
||
x1 = m_X1+1;
|
||
y1 = m_Y1+1;
|
||
x2 = m_X2-1;
|
||
y2 = m_Y2-1;
|
||
xxw = xw;
|
||
yyw = yw;
|
||
for( i = 1; i < e; i++ ){
|
||
tp->Pen->Color = GetCol(col, tcol, i, e);
|
||
tp->RoundRect(x1, y1, x2, y2, xxw, yyw);
|
||
x1++; y1++;
|
||
x2--; y2--;
|
||
xxw -= 2;
|
||
yyw -= 2;
|
||
}
|
||
}
|
||
else {
|
||
tp->Pen->Style = m_LineStyle;
|
||
tp->RoundRect(m_X1, m_Y1, m_X2, m_Y2, xw, yw);
|
||
}
|
||
}
|
||
#endif
|
||
|
||
void __fastcall CDrawPic::Draw(TCanvas *tp)
|
||
{
|
||
if( m_Type ){
|
||
if( pBitmap == NULL ) return;
|
||
}
|
||
else {
|
||
if( pBitmap == NULL ) CreateBitmap();
|
||
UpdateHistPic(Mmsstv->pBitmapHistF);
|
||
}
|
||
|
||
if( m_Type == 2 ){ // ƒIƒo<C692>[ƒŒƒC
|
||
int x = m_TransPoint & 0x0000ffff;
|
||
int y = m_TransPoint >> 16;
|
||
if( m_TransPoint && (pLoadBitmap != NULL) ){
|
||
x = x * pBitmap->Width / pLoadBitmap->Width;
|
||
y = y * pBitmap->Height / pLoadBitmap->Height;
|
||
}
|
||
pBitmap->Transparent = TRUE;
|
||
pBitmap->TransparentMode = tmFixed;
|
||
pBitmap->TransparentColor = pBitmap->Canvas->Pixels[x][y];
|
||
tp->Draw(m_X1 + 1, m_Y1 + 1, pBitmap);
|
||
pBitmap->Transparent = FALSE;
|
||
}
|
||
else if( m_Shape ){
|
||
TRect rc;
|
||
rc.Left = 0; rc.Top = 0;
|
||
rc.Right = pBitmap->Width;
|
||
rc.Bottom = pBitmap->Height;
|
||
|
||
Graphics::TBitmap *pbmpS = DupeBitmap(pBitmap, pBitmap->PixelFormat);
|
||
MultProc();
|
||
Graphics::TBitmap *pbmp = ::CreateBitmap(pBitmap->Width, pBitmap->Height, -1);
|
||
pbmp->Canvas->Brush->Color = tp->Brush->Color;
|
||
pbmp->Canvas->Pen->Color = tp->Brush->Color;
|
||
pbmp->Canvas->FillRect(rc);
|
||
#if 1
|
||
TColor bcol = pbmp->Canvas->Pixels[0][0];
|
||
#else
|
||
TColor bcol = tp->Brush->Color;
|
||
#endif
|
||
if( bcol != clBlack ){
|
||
pbmp->Canvas->Brush->Color = clBlack;
|
||
pbmp->Canvas->Pen->Color = clBlack;
|
||
}
|
||
else {
|
||
pbmp->Canvas->Brush->Color = clYellow;
|
||
pbmp->Canvas->Pen->Color = clYellow;
|
||
}
|
||
switch(m_Shape){
|
||
case 1:
|
||
case 2:
|
||
case 3:
|
||
case 4:
|
||
DBox(pbmp->Canvas, m_Shape, 0, 0, pBitmap->Width, pBitmap->Height);
|
||
break;
|
||
case 5:
|
||
pbmp->Canvas->Polygon((TPoint*)m_DrawPolygon.pBase, m_DrawPolygon.Cnt - 1);
|
||
break;
|
||
}
|
||
MultProc();
|
||
pbmp->Transparent = TRUE;
|
||
pbmp->TransparentMode = tmFixed;
|
||
pbmp->TransparentColor = pbmp->Canvas->Brush->Color;
|
||
pbmpS->Canvas->Draw(0, 0, pbmp);
|
||
MultProc();
|
||
pbmpS->Transparent = TRUE;
|
||
pbmpS->TransparentMode = tmFixed;
|
||
pbmpS->TransparentColor = bcol;
|
||
MultProc();
|
||
tp->Draw(m_X1 + 1, m_Y1 + 1, pbmpS);
|
||
delete pbmp;
|
||
delete pbmpS;
|
||
MultProc();
|
||
// if( (m_LineStyle >= 0) && ((m_LineColor != clWhite) || (m_LineStyle != psSolid)) ){
|
||
if( m_LineStyle >= 0 ){
|
||
tp->Pen->Color = m_LineColor;
|
||
tp->Pen->Style = m_LineStyle < 5 ? m_LineStyle : psSolid;
|
||
tp->Pen->Width = m_LineWidth;
|
||
tp->Brush->Style = bsClear;
|
||
switch(m_Shape){
|
||
case 1:
|
||
RoundRect(tp, pBitmap->Width/3, pBitmap->Height/3);
|
||
break;
|
||
case 2:
|
||
RoundRect(tp, pBitmap->Width/2, pBitmap->Height/2);
|
||
break;
|
||
case 3:
|
||
RoundRect(tp, pBitmap->Width*3/4, pBitmap->Height*3/4);
|
||
break;
|
||
case 4:
|
||
RoundRect(tp, pBitmap->Width, pBitmap->Height);
|
||
// tp->Ellipse(m_X1, m_Y1, m_X2, m_Y2);
|
||
break;
|
||
case 5:
|
||
if( m_LineStyle >= 5 ){
|
||
CPolygon Pol;
|
||
Pol.Copy(&m_DrawPolygon);
|
||
Pol.DrawOffsetSiege(tp, m_X1, m_Y1, m_LineColor, m_LineStyle);
|
||
}
|
||
else {
|
||
CPolygon Pol;
|
||
Pol.Copy(&m_DrawPolygon);
|
||
Pol.Stretch(m_X2-m_X1+1, m_Y2-m_Y1+1, Pol.XW, Pol.YW);
|
||
Pol.DrawOffset(tp, m_X1, m_Y1);
|
||
}
|
||
break;
|
||
}
|
||
tp->Brush->Style = bsSolid;
|
||
}
|
||
}
|
||
else {
|
||
tp->Draw(m_X1 + 1, m_Y1 + 1, pBitmap);
|
||
CDrawBox::Draw(tp);
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawPic::FillPic(TCanvas *tp, TColor col, int sw, double sx, double sy, int off)
|
||
{
|
||
if( pBitmap == NULL ) return;
|
||
if( m_Type == 2 ) return;
|
||
|
||
TRect rc;
|
||
switch(sw){
|
||
case 2:
|
||
rc.Left = m_X1;
|
||
rc.Top = m_Y1 - 16;
|
||
rc.Right = m_X2;
|
||
rc.Bottom = m_Y2 - 16;
|
||
break;
|
||
case 4:
|
||
rc.Left = m_X1;
|
||
rc.Top = m_Y1 * 240 / 256;
|
||
rc.Right = m_X2;
|
||
rc.Bottom = (m_Y2 * 240 / 256);
|
||
break;
|
||
case -1:
|
||
rc.Left = m_X1;
|
||
rc.Top = m_Y1 + off;
|
||
rc.Right = (m_X2 + 1);
|
||
rc.Bottom = m_Y2 + off;
|
||
break;
|
||
default:
|
||
rc.Left = m_X1 * sx;
|
||
rc.Top = m_Y1 * sy;
|
||
rc.Right = m_X2 * sx;
|
||
rc.Bottom = m_Y2 * sy;
|
||
break;
|
||
}
|
||
if( m_LineStyle == 5 ){
|
||
rc.Top -= 2;
|
||
rc.Left -= 2;
|
||
rc.Right += 2;
|
||
rc.Bottom += 2;
|
||
}
|
||
else if( m_LineStyle == 6 ){
|
||
rc.Top--;
|
||
rc.Left--;
|
||
}
|
||
else if( m_LineStyle < 0 ){
|
||
rc.Top++;
|
||
rc.Left++;
|
||
}
|
||
tp->Brush->Color = col;
|
||
tp->Pen->Color = col;
|
||
switch(m_Shape){
|
||
case 0:
|
||
tp->FillRect(rc);
|
||
break;
|
||
case 1:
|
||
tp->RoundRect(rc.Left, rc.Top, rc.Right, rc.Bottom, pBitmap->Width/3, pBitmap->Height/3);
|
||
break;
|
||
case 2:
|
||
tp->RoundRect(rc.Left, rc.Top, rc.Right, rc.Bottom, pBitmap->Width/2, pBitmap->Height/2);
|
||
break;
|
||
case 3:
|
||
tp->RoundRect(rc.Left, rc.Top, rc.Right, rc.Bottom, pBitmap->Width*3/4, pBitmap->Height*3/4);
|
||
break;
|
||
case 4:
|
||
tp->Ellipse(rc.Left, rc.Top, rc.Right, rc.Bottom);
|
||
break;
|
||
case 5:
|
||
{
|
||
CPolygon Pol;
|
||
Pol.Copy(&m_DrawPolygon);
|
||
Pol.Stretch(rc.Right-rc.Left, rc.Bottom-rc.Top, m_X2-m_X1, m_Y2-m_Y1);
|
||
Pol.DrawOffset(tp, rc.Left+1, rc.Top+1);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawPic::UpdateHistPic(Graphics::TBitmap *pBmp)
|
||
{
|
||
if( pBitmap == NULL ) return;
|
||
if( m_Type ) return;
|
||
|
||
TRect rc;
|
||
rc.Left = 0; rc.Top = 0;
|
||
rc.Right = pBitmap->Width;
|
||
rc.Bottom = pBitmap->Height;
|
||
int Sop = ::SetStretchBltMode(pBitmap->Canvas->Handle, HALFTONE);
|
||
if( m_Adjust && (m_Shape != 5) ){
|
||
int x;
|
||
int y = pBmp->Height - 1;
|
||
TColor col = pBmp->Canvas->Pixels[0][y];
|
||
for( ; y >= 0; y-- ){
|
||
if( pBmp->Canvas->Pixels[0][y] == col ){
|
||
for( x = 1; x < pBmp->Width; x++ ){
|
||
if( pBmp->Canvas->Pixels[x][y] != col ) break;
|
||
}
|
||
if( x != pBmp->Width ) break;
|
||
}
|
||
else {
|
||
break;
|
||
}
|
||
}
|
||
if( y == (pBmp->Height - 1) ){
|
||
pBitmap->Canvas->StretchDraw(rc, (TGraphic*)pBmp);
|
||
}
|
||
else if( y ){
|
||
TRect sc;
|
||
sc.Left = 0; sc.Top = 0;
|
||
sc.Right = pBmp->Width;
|
||
sc.Bottom = y + 1;
|
||
pBitmap->Canvas->CopyRect(rc, pBmp->Canvas, sc);
|
||
}
|
||
else {
|
||
FillBitmap(pBitmap, col);
|
||
}
|
||
}
|
||
else {
|
||
pBitmap->Canvas->StretchDraw(rc, (TGraphic*)pBmp);
|
||
}
|
||
::SetStretchBltMode(pBitmap->Canvas->Handle, Sop);
|
||
}
|
||
|
||
void __fastcall CDrawPic::SaveToStream(TStream *sp)
|
||
{
|
||
m_Ver = 5;
|
||
CDrawBox::SaveToStream(sp);
|
||
|
||
sp->Write(&m_Type, sizeof(m_Type));
|
||
sp->Write(&m_Shape, sizeof(m_Shape));
|
||
sp->Write(&m_Adjust, sizeof(m_Adjust));
|
||
sp->Write(&m_TransPoint, sizeof(m_TransPoint));
|
||
if( m_Type ){
|
||
SaveBitmap(sp, pBitmap);
|
||
}
|
||
if( m_Shape == 5 ){
|
||
m_Polygon.SaveToStream(sp);
|
||
}
|
||
}
|
||
|
||
int __fastcall CDrawPic::LoadFromStream(TCanvas *tp, TStream *sp)
|
||
{
|
||
if( CDrawBox::LoadFromStream(tp, sp) == FALSE ) return FALSE;
|
||
|
||
try {
|
||
if( pLoadBitmap != NULL ){
|
||
delete pLoadBitmap;
|
||
pLoadBitmap = NULL;
|
||
}
|
||
if( pBitmap != NULL ){
|
||
delete pBitmap;
|
||
pBitmap = NULL;
|
||
}
|
||
CreateBitmap();
|
||
if( m_Ver >= 1 ){
|
||
sp->Read(&m_Type, sizeof(m_Type));
|
||
if( m_Ver >= 2 ){
|
||
sp->Read(&m_Shape, sizeof(m_Shape));
|
||
}
|
||
if( m_Ver >= 4 ){
|
||
sp->Read(&m_Adjust, sizeof(m_Adjust));
|
||
}
|
||
if( m_Ver >= 5 ){
|
||
sp->Read(&m_TransPoint, sizeof(m_TransPoint));
|
||
}
|
||
if( m_Type ){
|
||
LoadBitmap(sp, pBitmap);
|
||
if( (m_Type == 2) && (sys.m_BitPixel == 16) ){
|
||
Graphics::TBitmap *pbmp = DupeBitmap(pBitmap, -1);
|
||
delete pBitmap;
|
||
pBitmap = pbmp;
|
||
}
|
||
}
|
||
if( m_Shape == 5 ){
|
||
m_Polygon.LoadFromStream(sp);
|
||
m_DrawPolygon.Copy(&m_Polygon);
|
||
m_DrawPolygon.XW = pBitmap->Width;
|
||
m_DrawPolygon.YW = pBitmap->Height;
|
||
m_DrawPolygon.Stretch(m_Polygon);
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
catch(...){
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawPic::Copy(CDraw *dp)
|
||
{
|
||
CDrawBox::Copy(dp);
|
||
if( pBitmap != NULL ){
|
||
delete pBitmap;
|
||
pBitmap = NULL;
|
||
}
|
||
if( pLoadBitmap != NULL ){
|
||
delete pLoadBitmap;
|
||
pLoadBitmap = NULL;
|
||
}
|
||
CreateBitmap();
|
||
CDrawPic *sp = (CDrawPic *)dp;
|
||
m_Type = sp->m_Type;
|
||
m_Shape = sp->m_Shape;
|
||
m_Adjust = sp->m_Adjust;
|
||
m_TransPoint = sp->m_TransPoint;
|
||
if( m_Type && (sp->pBitmap != NULL) ){
|
||
pBitmap->Assign(sp->pBitmap);
|
||
}
|
||
m_Polygon.Copy(&sp->m_Polygon);
|
||
m_DrawPolygon.Copy(&m_Polygon);
|
||
m_DrawPolygon.XW = pBitmap->Width;
|
||
m_DrawPolygon.YW = pBitmap->Height;
|
||
m_DrawPolygon.Stretch(m_Polygon);
|
||
}
|
||
|
||
int __fastcall CDrawPic::Edit(void)
|
||
{
|
||
TPicSelDlg *pBox = new TPicSelDlg(Mmsstv);
|
||
int r = pBox->Execute(this);
|
||
if( r == TRUE ){
|
||
if( m_Shape != 5 ){
|
||
sys.m_PicShape = m_Shape;
|
||
sys.m_PicAdjust = m_Adjust;
|
||
sys.m_PicLineStyle = m_LineStyle;
|
||
sys.m_PicLineColor = m_LineColor;
|
||
}
|
||
}
|
||
delete pBox;
|
||
return r;
|
||
}
|
||
///
|
||
///
|
||
//---------------------------------------------------------------------------
|
||
__fastcall CDrawOle::CDrawOle()
|
||
{
|
||
m_Command = CM_OLE;
|
||
m_Ver = 1;
|
||
m_Trans = 1;
|
||
m_Stretch = 0;
|
||
pContainer = NULL;
|
||
m_LineStyle = TPenStyle(-1);
|
||
m_LineColor = clWhite;
|
||
m_X1 = 0; m_Y1 = 0;
|
||
m_X2 = m_OrgXW = 160; m_Y2 = m_OrgYW = 128;
|
||
pOleView = NULL;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
__fastcall CDrawOle::~CDrawOle()
|
||
{
|
||
if( pContainer != NULL ){
|
||
delete pContainer;
|
||
pContainer = NULL;
|
||
}
|
||
if( pOleView != NULL ){
|
||
delete pOleView;
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawOle::Finish(int x, int y)
|
||
{
|
||
m_X2 = x;
|
||
m_Y2 = y;
|
||
Normal();
|
||
if( !((m_X1 != m_X2) && (m_Y1 != m_Y2)) ) return FALSE;
|
||
return Edit();
|
||
}
|
||
|
||
//---------------------------------------------------------------------------
|
||
Graphics::TBitmap* __fastcall CDrawOle::MakeBitmap(void)
|
||
{
|
||
if( pContainer == NULL ) return NULL;
|
||
|
||
Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
|
||
AdjustBitmapFormat(pBitmap);
|
||
if( m_Stretch ){
|
||
pContainer->SizeMode = smAutoSize;
|
||
pBitmap->Width = pContainer->ClientWidth;
|
||
pBitmap->Height = pContainer->ClientHeight;
|
||
}
|
||
else {
|
||
pBitmap->Width = m_X2 - m_X1;
|
||
pBitmap->Height = m_Y2 - m_Y1;
|
||
pContainer->ClientWidth = ABS(m_X2 - m_X1);
|
||
pContainer->ClientHeight = ABS(m_Y2 - m_Y1);
|
||
}
|
||
pBitmap->Transparent = FALSE;
|
||
pContainer->PaintTo(pBitmap->Canvas->Handle, 0, 0);
|
||
if( m_Stretch ){
|
||
pContainer->SizeMode = smStretch;
|
||
Graphics::TBitmap *pBmp = CreateBitmap(m_X2 - m_X1, m_Y2 - m_Y1, -1);
|
||
TRect rc;
|
||
rc.Left = 0; rc.Right = pBmp->Width;
|
||
rc.Top = 0; rc.Bottom = pBmp->Height;
|
||
::SetStretchBltMode(pBmp->Canvas->Handle, m_Trans ? COLORONCOLOR : HALFTONE);
|
||
pBmp->Canvas->StretchDraw(rc, pBitmap);
|
||
delete pBitmap;
|
||
pBitmap = pBmp;
|
||
}
|
||
return pBitmap;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawOle::Draw(TCanvas *tp)
|
||
{
|
||
if( pContainer == NULL ) return;
|
||
|
||
Graphics::TBitmap *pBitmap = MakeBitmap();
|
||
if( m_Trans ){
|
||
pBitmap->Transparent = TRUE;
|
||
pBitmap->TransparentMode = tmFixed;
|
||
pBitmap->TransparentColor = pBitmap->Canvas->Pixels[0][0];
|
||
}
|
||
tp->Draw(m_X1, m_Y1, pBitmap);
|
||
delete pBitmap;
|
||
CDrawBox::Draw(tp);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawOle::SaveToStream(TStream *sp)
|
||
{
|
||
m_Ver = 1;
|
||
CDrawBox::SaveToStream(sp);
|
||
|
||
sp->Write(&m_Trans, sizeof(m_Trans));
|
||
sp->Write(&m_Stretch, sizeof(m_Stretch));
|
||
pContainer->SaveToStream(sp);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawOle::LoadFromStream(TCanvas *tp, TStream *sp)
|
||
{
|
||
if( CDrawBox::LoadFromStream(tp, sp) == FALSE ) return FALSE;
|
||
|
||
sp->Read(&m_Trans, sizeof(m_Trans));
|
||
sp->Read(&m_Stretch, sizeof(m_Stretch));
|
||
try {
|
||
MakeItem();
|
||
pContainer->LoadFromStream(sp);
|
||
if( pContainer->Linked ) pContainer->UpdateObject();
|
||
GetOrgSize();
|
||
return TRUE;
|
||
}
|
||
catch(...){
|
||
return FALSE;
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawOle::Copy(CDraw *dp)
|
||
{
|
||
CDrawOle *sp = (CDrawOle *)dp;
|
||
if( sp->pContainer == NULL ) return;
|
||
|
||
CDrawBox::Copy(dp);
|
||
m_Trans = sp->m_Trans;
|
||
m_Stretch = sp->m_Stretch;
|
||
m_OrgXW = sp->m_OrgXW;
|
||
m_OrgYW = sp->m_OrgYW;
|
||
TMemoryStream *tm = new TMemoryStream;
|
||
tm->Seek(0, soFromBeginning);
|
||
sp->pContainer->SaveToStream(tm);
|
||
MakeItem();
|
||
tm->Seek(0, soFromBeginning);
|
||
pContainer->LoadFromStream(tm);
|
||
delete tm;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawOle::GetOrgSize(void)
|
||
{
|
||
pContainer->SizeMode = smAutoSize;
|
||
m_OrgXW = pContainer->ClientWidth;
|
||
m_OrgYW = pContainer->ClientHeight;
|
||
pContainer->SizeMode = smStretch;
|
||
if( m_OrgXW <= 0 ) m_OrgXW = 16;
|
||
if( m_OrgYW <= 0 ) m_OrgYW = 16;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawOle::SetInitSize(void)
|
||
{
|
||
int lx = 256;
|
||
int ly = 200;
|
||
if( lx > m_OrgXW ) lx = m_OrgXW;
|
||
if( ly > m_OrgYW ) ly = m_OrgYW;
|
||
::KeepAspect(lx, ly, m_OrgXW, m_OrgYW);
|
||
if( m_X1 < 0 ){
|
||
m_X1 = (Mmsstv->DrawMain.m_SX - lx) / 2;
|
||
m_Y1 = (Mmsstv->DrawMain.m_SY - ly) / 2;
|
||
}
|
||
m_X2 = m_X1 + lx;
|
||
m_Y2 = m_Y1 + ly;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawOle::MakeItem(void)
|
||
{
|
||
if( pContainer != NULL ){
|
||
delete pContainer;
|
||
pContainer = NULL;
|
||
}
|
||
pContainer = new TOleContainer(Mmsstv);
|
||
pContainer->Visible = FALSE;
|
||
pContainer->Caption = "MMSSTV";
|
||
pContainer->Parent = Mmsstv->PanelTemp;
|
||
pContainer->TabStop = FALSE;
|
||
pContainer->Left = 0;
|
||
pContainer->Top = 0;
|
||
pContainer->ClientWidth = 256;
|
||
pContainer->ClientHeight = 200;
|
||
pContainer->BorderStyle = bsNone;
|
||
pContainer->SizeMode = smStretch;
|
||
pContainer->AllowInPlace = FALSE;
|
||
pContainer->AutoActivate = aaManual;
|
||
pContainer->AllowActiveDoc = FALSE;
|
||
pContainer->AutoVerbMenu = FALSE;
|
||
pContainer->OldStreamFormat = FALSE;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawOle::SyncVerb(void)
|
||
{
|
||
while(pContainer->State == osOpen){
|
||
Application->ProcessMessages();
|
||
if( !Mmsstv->Timer->Enabled ) return;
|
||
MultProc();
|
||
::Sleep(1);
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawOle::ViewVerb(int sw)
|
||
{
|
||
if( sw ){
|
||
if( pOleView == NULL ){
|
||
pOleView = new TForm(Mmsstv);
|
||
pOleView->AutoScroll = FALSE;
|
||
pOleView->Scaled = FALSE;
|
||
}
|
||
pOleView->SetBounds(-m_OrgXW, -m_OrgYW, m_OrgXW, m_OrgYW);
|
||
pContainer->Parent = pOleView;
|
||
pContainer->Visible = TRUE;
|
||
pOleView->Visible = TRUE;
|
||
}
|
||
else if( pOleView != NULL ){
|
||
pOleView->Visible = FALSE;
|
||
pContainer->Visible = FALSE;
|
||
pContainer->Parent = Mmsstv->PanelTemp;
|
||
delete pOleView;
|
||
pOleView = NULL;
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawOle::MakeError(void)
|
||
{
|
||
delete pContainer;
|
||
pContainer = NULL;
|
||
InfoMB( "Can not handle the object." );
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawOle::Edit(void)
|
||
{
|
||
SetDisPaint();
|
||
int First = FALSE;
|
||
CWaitCursor w;
|
||
if( pContainer == NULL ){
|
||
First = TRUE;
|
||
MakeItem();
|
||
MultProc();
|
||
if( pContainer->InsertObjectDialog() != TRUE ){
|
||
MultProc();
|
||
ResDisPaint();
|
||
return FALSE;
|
||
}
|
||
}
|
||
MultProc();
|
||
try {
|
||
if( !First || !pContainer->Linked ){
|
||
pContainer->AllowInPlace = FALSE;
|
||
ViewVerb(1);
|
||
pContainer->DoVerb(ovShow);
|
||
SyncVerb();
|
||
ViewVerb(0);
|
||
}
|
||
GetOrgSize();
|
||
if( First ){
|
||
SetInitSize();
|
||
}
|
||
}
|
||
catch(...){
|
||
ViewVerb(0);
|
||
if( First ){
|
||
MakeError();
|
||
}
|
||
}
|
||
ResDisPaint();
|
||
return (pContainer != NULL) ? TRUE : FALSE;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawOle::LoadFromFile(int x, int y, LPCSTR pName)
|
||
{
|
||
int r = TRUE;
|
||
CWaitCursor w;
|
||
|
||
MakeItem();
|
||
m_X1 = x;
|
||
m_Y1 = y;
|
||
try {
|
||
MultProc();
|
||
pContainer->CreateObjectFromFile(pName, FALSE);
|
||
MultProc();
|
||
GetOrgSize();
|
||
SetInitSize();
|
||
}
|
||
catch(...){
|
||
MakeError();
|
||
r = FALSE;
|
||
}
|
||
return r;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawOle::LoadFromBitmap(int x, int y, Graphics::TBitmap *pBmp)
|
||
{
|
||
CWaitCursor w;
|
||
|
||
char name[256];
|
||
sprintf(name, "%sTEMP.bmp", BgnDir);
|
||
if( SaveBitmap24(pBmp, name) == TRUE ){
|
||
LoadFromFile(x, y, name);
|
||
}
|
||
unlink(name);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawOle::Paste(void)
|
||
{
|
||
int r = TRUE;
|
||
MakeItem();
|
||
try {
|
||
pContainer->Paste();
|
||
GetOrgSize();
|
||
SetInitSize();
|
||
}
|
||
catch(...){
|
||
MakeError();
|
||
r = FALSE;
|
||
}
|
||
return r;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawOle::DoPrimary(void)
|
||
{
|
||
if( pContainer != NULL ){
|
||
SetDisPaint();
|
||
try {
|
||
ViewVerb(1);
|
||
pContainer->DoVerb(ovPrimary);
|
||
SyncVerb();
|
||
ViewVerb(0);
|
||
GetOrgSize();
|
||
}
|
||
catch(...){
|
||
ViewVerb(0);
|
||
}
|
||
ResDisPaint();
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawOle::ObjectProperties(void)
|
||
{
|
||
SetDisPaint();
|
||
int r = FALSE;
|
||
try {
|
||
ViewVerb(1);
|
||
r = pContainer->ObjectPropertiesDialog();
|
||
ViewVerb(0);
|
||
}
|
||
catch(...){
|
||
ViewVerb(0);
|
||
}
|
||
ResDisPaint();
|
||
return r;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawOle::IsOrgSize(void)
|
||
{
|
||
if( (m_X2 - m_X1) != m_OrgXW ) return FALSE;
|
||
if( (m_Y2 - m_Y1) != m_OrgYW ) return FALSE;
|
||
return TRUE;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawOle::SetOrgSize(void)
|
||
{
|
||
m_X2 = m_X1 + m_OrgXW;
|
||
m_Y2 = m_Y1 + m_OrgYW;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawOle::KeepAspect(void)
|
||
{
|
||
int lx = m_X2 - m_X1;
|
||
int ly = m_Y2 - m_Y1;
|
||
::KeepAspect(lx, ly, m_OrgXW, m_OrgYW);
|
||
m_X2 = m_X1 + lx + 1;
|
||
m_Y2 = m_Y1 + ly + 1;
|
||
}
|
||
//***************************************************************************
|
||
//DrawLibƒNƒ‰ƒX
|
||
//---------------------------------------------------------------------------
|
||
__fastcall CDrawLib::CDrawLib()
|
||
{
|
||
m_Command = CM_LIB;
|
||
m_Ver = 1;
|
||
m_Type = 0;
|
||
m_Name = "";
|
||
hLib = NULL;
|
||
hObj = NULL;
|
||
pBitmap = NULL;
|
||
m_LineStyle = TPenStyle(-1);
|
||
m_LineColor = clWhite;
|
||
m_X1 = 0; m_Y1 = 0;
|
||
m_X2 = m_OrgXW = 160; m_Y2 = m_OrgYW = 128;
|
||
m_Text = "";
|
||
Delete();
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
__fastcall CDrawLib::~CDrawLib()
|
||
{
|
||
Delete();
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::Delete(void)
|
||
{
|
||
if( hObj != NULL ){
|
||
if( hLib && fDeleteObject ) fDeleteObject(hObj);
|
||
hObj = NULL;
|
||
}
|
||
hLib = NULL;
|
||
if( pBitmap != NULL ){
|
||
delete pBitmap;
|
||
pBitmap = NULL;
|
||
}
|
||
|
||
fFunc=NULL;
|
||
fLanguage=NULL;
|
||
fAboutDialog = NULL;
|
||
fGetItemType = NULL;
|
||
fCreateObject = NULL;
|
||
fCreateStorage = NULL;
|
||
fDeleteStorage = NULL;
|
||
fDeleteObject = NULL;
|
||
fEdit = NULL;
|
||
fFont = NULL;
|
||
fGetOrgSize = NULL;
|
||
fPos = NULL;
|
||
fGetUserText = NULL;
|
||
fUpdateText = NULL;
|
||
fUpdateImage = NULL;
|
||
fSetDraft = NULL;
|
||
fSetEx = NULL;
|
||
fGetFont = NULL;
|
||
fSetFont = NULL;
|
||
m_Type = 0;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
FARPROC __fastcall CDrawLib::GetProc(LPCSTR pName)
|
||
{
|
||
FARPROC fp = ::GetProcAddress(hLib, pName);
|
||
if( fp != NULL ) return fp;
|
||
fp = ::GetProcAddress(hLib, pName+1);
|
||
return fp;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::LoadLib(int emsg)
|
||
{
|
||
hLib = NULL;
|
||
if( m_Name.IsEmpty() ) return;
|
||
LPCSTR pName = m_Name.c_str();
|
||
hLib = (HINSTANCE)Libl.LoadLibrary(pName);
|
||
if( hLib != NULL ){
|
||
fGetItemType = (mcmGetItemType)GetProc("_mcmGetItemType");
|
||
fCreateObject = (mcmCreateObject)GetProc("_mcmCreateObject");
|
||
fDeleteObject = (mcmDeleteObject)GetProc("_mcmDeleteObject");
|
||
if( !fGetItemType || !fCreateObject || !fDeleteObject ){
|
||
Libl.DeleteLibrary(hLib);
|
||
hLib = NULL;
|
||
if( emsg ) InfoMB( "Can not invoke %s as MMSSTV's custom item.", pName);
|
||
return;
|
||
}
|
||
fFunc = (mcmFunc)GetProc("_mcmFunc");
|
||
fLanguage = (mcmLanguage)GetProc("_mcmLanguage");
|
||
fAboutDialog = (mcmAboutDialog)GetProc("_mcmAboutDialog");
|
||
fCreateStorage = (mcmCreateStorage)GetProc("_mcmCreateStorage");
|
||
fDeleteStorage = (mcmDeleteStorage)GetProc("_mcmDeleteStorage");
|
||
fEdit = (mcmEdit)GetProc("_mcmEdit");
|
||
fFont = (mcmEdit)GetProc("_mcmFont");
|
||
fGetOrgSize = (mcmGetOrgSize)GetProc("_mcmGetOrgSize");
|
||
fPos = (mcmPos)GetProc("_mcmPos");
|
||
fGetUserText = (mcmGetUserText)GetProc("_mcmGetUserText");
|
||
fUpdateText = (mcmUpdateText)GetProc("_mcmUpdateText");
|
||
fUpdateImage = (mcmUpdateImage)GetProc("_mcmUpdateImage");
|
||
fSetDraft = (mcmSetDraft)GetProc("_mcmSetDraft");
|
||
fSetEx = (mcmSetEx)GetProc("_mcmSetEx");
|
||
fGetFont = (mcmGetFont)GetProc("_mcmGetFont");
|
||
fSetFont = (mcmSetFont)GetProc("_mcmSetFont");
|
||
if( fFunc ){
|
||
fFunc(0, (FARPROC)mmLoadImageMenu);
|
||
fFunc(1, (FARPROC)mmLoadImage);
|
||
fFunc(2, (FARPROC)mmLoadHistImage);
|
||
fFunc(3, (FARPROC)mmSaveImageMenu);
|
||
fFunc(4, (FARPROC)mmSaveImage);
|
||
fFunc(5, (FARPROC)mmPasteImage);
|
||
fFunc(6, (FARPROC)mmGetMacKey);
|
||
fFunc(7, (FARPROC)mmConvMac);
|
||
fFunc(8, (FARPROC)mmCreateDIB);
|
||
fFunc(9, (FARPROC)MultProcA);
|
||
fFunc(10, (FARPROC)MultProc);
|
||
fFunc(11, (FARPROC)mmColorComp);
|
||
fFunc(12, (FARPROC)mmLoadRxImage);
|
||
fFunc(13, (FARPROC)mmView);
|
||
fFunc(14, (FARPROC)mmAdjCol);
|
||
fFunc(15, (FARPROC)mmClip);
|
||
}
|
||
if( fLanguage ) fLanguage(MsgEng);
|
||
}
|
||
else if( emsg ){
|
||
InfoMB( "Can not load '%s'", pName);
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawLib::MakeR(LPCSTR pName)
|
||
{
|
||
char drive[_MAX_DRIVE];
|
||
char dir[_MAX_DIR];
|
||
char name[_MAX_FNAME];
|
||
char ext[_MAX_EXT];
|
||
::_splitpath( pName, drive, dir, name, ext );
|
||
m_Name = drive;
|
||
m_Name += dir;
|
||
if( !strcmpi(m_Name.c_str(), BgnDir) ){
|
||
m_Name = name;
|
||
m_Name += ext;
|
||
}
|
||
else {
|
||
m_Name = pName;
|
||
}
|
||
if( m_Name.IsEmpty() ) return FALSE;
|
||
LoadLib(TRUE);
|
||
if( hLib == NULL ) return FALSE;
|
||
hObj = fCreateObject(NULL, 0);
|
||
if( hObj == NULL ){
|
||
InfoMB( "Fail to create the object from '%s'", m_Name.c_str());
|
||
return FALSE;
|
||
}
|
||
Pos();
|
||
m_Type = fGetItemType(hObj);
|
||
if( m_Type & 3 ) Update();
|
||
return TRUE;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawLib::Finish(int x, int y)
|
||
{
|
||
m_X2 = x;
|
||
m_Y2 = y;
|
||
Normal();
|
||
if( !((m_X1 != m_X2) && (m_Y1 != m_Y2)) ) return FALSE;
|
||
TOpenDialog *pDialog = Mmsstv->OpenDialog;
|
||
pDialog->Options >> ofCreatePrompt;
|
||
pDialog->Options << ofFileMustExist;
|
||
pDialog->Title = Mmsstv->KTCI->Caption;
|
||
pDialog->Filter = GetLibFilter();
|
||
pDialog->FileName = "";
|
||
pDialog->DefaultExt = "dll";
|
||
pDialog->InitialDir = BgnDir;
|
||
SetDisPaint();
|
||
if( Mmsstv->OpenDialogExecute(FALSE) == TRUE ){
|
||
ResDisPaint();
|
||
if( MakeR(AnsiString(pDialog->FileName).c_str()) ){ //ja7ude 0521
|
||
return Edit();
|
||
}
|
||
else {
|
||
return FALSE;
|
||
}
|
||
}
|
||
ResDisPaint();
|
||
return FALSE;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::Move(int x, int y)
|
||
{
|
||
CDrawBox::Move(x, y);
|
||
if( (m_X1 == m_X2) || (m_Y1 == m_Y2) ){
|
||
return;
|
||
}
|
||
if( (m_MC != HT_I) || (m_Type & 0x00000010) ){
|
||
Update();
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::SwapHandle(HBITMAP hb)
|
||
{
|
||
if( hb ){
|
||
pBitmap->ReleaseHandle();
|
||
pBitmap->Handle = hb;
|
||
int x2 = m_X2;
|
||
int y2 = m_Y2;
|
||
m_X2 = m_X1 + pBitmap->Width;
|
||
m_Y2 = m_Y1 + pBitmap->Height;
|
||
Pos();
|
||
m_Type = fGetItemType(hObj);
|
||
if( m_Type & 0x00400000 ){ // X’†‰›
|
||
int xw = (m_X2 - x2)/2;
|
||
m_X1 -= xw; m_X2 -= xw;
|
||
}
|
||
else if( m_Type & 0x00100000 ){ // ‰E‹l
|
||
int xw = m_X2 - x2;
|
||
m_X1 -= xw; m_X2 -= xw;
|
||
}
|
||
if( m_Type & 0x00800000 ){ // Y’†‰›
|
||
int yw = (m_Y2 - y2)/2;
|
||
m_Y1 -= yw; m_Y2 -= yw;
|
||
}
|
||
else if( m_Type & 0x00200000 ){ // ‰º‹l
|
||
int yw = m_Y2 - y2;
|
||
m_Y1 -= yw; m_Y2 -= yw;
|
||
}
|
||
AdjustRect();
|
||
Pos();
|
||
}
|
||
if( fGetOrgSize ){
|
||
ULONG size = fGetOrgSize(hObj);
|
||
m_OrgXW = size & 0x0000ffff;
|
||
m_OrgYW = size >> 16;
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::Pos(void)
|
||
{
|
||
if( !fPos ) return;
|
||
|
||
DWORD pos = m_X1 + (m_Y1 << 16);
|
||
DWORD size = (m_X2 - m_X1) + ((m_Y2 - m_Y1) << 16);
|
||
DWORD tsize = SXW + (SYW << 16);
|
||
fPos(hObj, pos, size, tsize);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::Update(void)
|
||
{
|
||
if( !hLib ) return;
|
||
if( !hObj ) return;
|
||
|
||
switch(m_Type & 3){
|
||
case 0:
|
||
if( !fUpdateImage ) return;
|
||
|
||
SetBitmapSize();
|
||
Pos();
|
||
SwapHandle(fUpdateImage(hObj, pBitmap->Handle, NULL));
|
||
break;
|
||
case 1:
|
||
UpdatePic(Mmsstv->pBitmapHistF);
|
||
break;
|
||
default:
|
||
UpdateText();
|
||
break;
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::SetBitmapSize(void)
|
||
{
|
||
if( pBitmap == NULL ){
|
||
pBitmap = new Graphics::TBitmap;
|
||
}
|
||
pBitmap->PixelFormat = pf24bit;
|
||
pBitmap->Width = m_X2 - m_X1;
|
||
pBitmap->Height = m_Y2 - m_Y1;
|
||
FillBitmap(pBitmap, TransCol);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::DrawFast(TCanvas *tp)
|
||
{
|
||
if( hLib && hObj ){
|
||
if( fSetDraft ) fSetDraft(hObj, 1);
|
||
Draw(tp);
|
||
if( fSetDraft ) fSetDraft(hObj, 0);
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::Draw(TCanvas *tp)
|
||
{
|
||
if( !hLib || !hObj ){
|
||
SetBitmapSize();
|
||
pBitmap->Canvas->Font->Color = clRed;
|
||
pBitmap->Canvas->TextOut(1, 1, m_Name);
|
||
m_Type = 0;
|
||
}
|
||
if( pBitmap == NULL ){
|
||
Update();
|
||
if( pBitmap == NULL ) return;
|
||
}
|
||
|
||
ASSERT(pBitmap);
|
||
|
||
Graphics::TBitmap *pbmp = pBitmap;
|
||
if( sys.m_BitPixel == 16 ){
|
||
pbmp = DupeBitmap(pBitmap, -1);
|
||
}
|
||
|
||
if( m_Type & 0x00010000 ){
|
||
pbmp->Transparent = TRUE;
|
||
pbmp->TransparentMode = tmFixed;
|
||
pbmp->TransparentColor = pbmp->Canvas->Pixels[0][0];
|
||
}
|
||
|
||
tp->Draw(m_X1, m_Y1, pbmp);
|
||
pbmp->Transparent = FALSE;
|
||
if( pbmp != pBitmap ) delete pbmp;
|
||
CDrawBox::Draw(tp);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawLib::Edit(int sw)
|
||
{
|
||
int r;
|
||
if( hLib ){
|
||
if( !hObj ) return FALSE;
|
||
|
||
if( fLanguage ) fLanguage(MsgEng);
|
||
SetDisPaint();
|
||
MultProc();
|
||
if( sw ){
|
||
r = fFont(hObj, Screen->ActiveForm->Handle);
|
||
}
|
||
else {
|
||
r = fEdit(hObj, Screen->ActiveForm->Handle);
|
||
}
|
||
MultProc();
|
||
ResDisPaint();
|
||
if( r ){
|
||
Pos();
|
||
m_Type = fGetItemType(hObj);
|
||
Update();
|
||
}
|
||
}
|
||
else {
|
||
r = Finish(m_X2, m_Y2);
|
||
}
|
||
return r;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawLib::Edit(void)
|
||
{
|
||
if( !fEdit ) return FALSE;
|
||
return Edit(0);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawLib::Font(void)
|
||
{
|
||
if( !fFont ) return Edit();
|
||
return Edit(1);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::ObjectProperties(void)
|
||
{
|
||
if( hLib ){
|
||
if( !fAboutDialog ) return;
|
||
|
||
if( fLanguage ) fLanguage(MsgEng);
|
||
fAboutDialog(Screen->ActiveForm->Handle);
|
||
}
|
||
else {
|
||
InfoMB( "Could not load '%s', the item is inactive.", m_Name.c_str());
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::SaveToStream(TStream *sp)
|
||
{
|
||
m_Ver = 1;
|
||
CDrawBox::SaveToStream(sp);
|
||
|
||
SaveString(sp, m_Name);
|
||
ULONG size = 0;
|
||
const BYTE *p = NULL;
|
||
if( fCreateStorage ) p = fCreateStorage(hObj, &size);
|
||
if( p == NULL ) size = 0;
|
||
sp->Write(&size, sizeof(size));
|
||
if( size ) sp->Write(p, size);
|
||
if( fDeleteStorage ) fDeleteStorage(hObj, p);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawLib::LoadFromStream(TCanvas *tp, TStream *sp)
|
||
{
|
||
Delete();
|
||
if( CDrawBox::LoadFromStream(tp, sp) == FALSE ) return FALSE;
|
||
|
||
LoadString(sp, m_Name);
|
||
ULONG size = 0;
|
||
BYTE *p = NULL;
|
||
sp->Read(&size, sizeof(size));
|
||
if( size ){
|
||
p = new BYTE[size];
|
||
sp->Read(p, size);
|
||
}
|
||
LoadLib(FALSE);
|
||
if( hLib && fCreateObject ){
|
||
hObj = fCreateObject(p, size);
|
||
if( hObj != NULL ){
|
||
Pos();
|
||
m_Type = fGetItemType(hObj);
|
||
}
|
||
}
|
||
if( p != NULL ) delete p;
|
||
return TRUE;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::Copy(CDraw *dp)
|
||
{
|
||
CDrawLib *sp = (CDrawLib *)dp;
|
||
|
||
TMemoryStream *tm = new TMemoryStream;
|
||
tm->Seek(0, soFromBeginning);
|
||
sp->SaveToStream(tm);
|
||
tm->Seek(0, soFromBeginning);
|
||
int cmd;
|
||
tm->Read(&cmd, sizeof(cmd));
|
||
if( cmd == CM_LIB ){
|
||
LoadFromStream(Mmsstv->pBitmapTemp->Canvas, tm);
|
||
}
|
||
delete tm;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawLib::IsOrgSize(void)
|
||
{
|
||
if( !hLib ) return TRUE;
|
||
|
||
if( m_OrgXW != (m_X2 - m_X1) ) return FALSE;
|
||
if( m_OrgYW != (m_Y2 - m_Y1) ) return FALSE;
|
||
return TRUE;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::SetOrgSize(void)
|
||
{
|
||
if( !hLib ) return;
|
||
|
||
m_X2 = m_X1 + m_OrgXW;
|
||
m_Y2 = m_Y1 + m_OrgYW;
|
||
Update();
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::KeepAspect(void)
|
||
{
|
||
if( !hLib ) return;
|
||
|
||
int lx = m_X2 - m_X1;
|
||
int ly = m_Y2 - m_Y1;
|
||
::KeepAspect(lx, ly, m_OrgXW, m_OrgYW);
|
||
m_X2 = m_X1 + lx + 1;
|
||
m_Y2 = m_Y1 + ly + 1;
|
||
Update();
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::UpdatePic(Graphics::TBitmap *pBmp)
|
||
{
|
||
if( !(m_Type & 1) ) return;
|
||
if( !hLib ) return;
|
||
if( !hObj ) return;
|
||
if( !fUpdateImage ) return;
|
||
|
||
SetBitmapSize();
|
||
Pos();
|
||
Graphics::TBitmap *ps = (pBmp->PixelFormat != pf24bit) ? DupeBitmap(pBmp, pf24bit) : pBmp;
|
||
SwapHandle(fUpdateImage(hObj, pBitmap->Handle, ps->Handle));
|
||
if( ps != pBmp ) delete ps;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::UpdateText(int f)
|
||
{
|
||
if( !(m_Type & 2) ) return;
|
||
if( !hLib ) return;
|
||
if( !hObj ) return;
|
||
if( !fGetUserText ) return;
|
||
if( !fUpdateText ) return;
|
||
|
||
if( fSetEx ) fSetEx(hObj, sys.m_DisFontSmooth);
|
||
|
||
char bf[1024];
|
||
LPCSTR pText = fGetUserText(hObj);
|
||
if( Mmsstv->MacroText(bf, pText, sizeof(bf)-1) || f ){
|
||
SetBitmapSize();
|
||
Pos();
|
||
SwapHandle(fUpdateText(hObj, pBitmap->Handle, bf));
|
||
}
|
||
m_Text = pText;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::UpdateText(void)
|
||
{
|
||
UpdateText(1);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CDrawLib::UpdateTimeText(void)
|
||
{
|
||
UpdateText(0);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawLib::IsTimeMacro(void)
|
||
{
|
||
char bf[1024];
|
||
return Mmsstv->MacroText(bf, m_Text.c_str(), sizeof(bf)-1);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawLib::GetFont(LOGFONT *pLogfont)
|
||
{
|
||
if( !hLib || !hObj || !fGetFont ) return FALSE;
|
||
fGetFont(hObj, pLogfont);
|
||
return TRUE;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall CDrawLib::SetFont(LOGFONT *pLogfont)
|
||
{
|
||
if( !hLib || !hObj || !fGetFont ) return FALSE;
|
||
fSetFont(hObj, pLogfont);
|
||
Update();
|
||
return TRUE;
|
||
}
|
||
//***************************************************************************
|
||
//DrawGroupƒNƒ‰ƒX
|
||
//---------------------------------------------------------------------------
|
||
__fastcall CDrawGroup::CDrawGroup()
|
||
{
|
||
m_Command = CM_GROUP;
|
||
m_Cnt = 0;
|
||
m_Max = 0;
|
||
m_TransX = 319;
|
||
m_TransY = 255;
|
||
m_TransCol = TColor(0x00f8f8f8);
|
||
m_SX = 320;
|
||
m_SY = 256;
|
||
m_Ver = 2;
|
||
pBase = NULL;
|
||
pSel = NULL;
|
||
}
|
||
|
||
__fastcall CDrawGroup::~CDrawGroup()
|
||
{
|
||
Free();
|
||
}
|
||
|
||
void __fastcall CDrawGroup::Free(void)
|
||
{
|
||
if( pBase != NULL ){
|
||
delete pBase;
|
||
pBase = NULL;
|
||
}
|
||
m_Cnt = m_Max = 0;
|
||
}
|
||
|
||
void __fastcall CDrawGroup::FreeItem(void)
|
||
{
|
||
if( pBase == NULL ) return;
|
||
|
||
for( int i = 0; i < m_Cnt; i++ ){
|
||
if( pBase[i]->m_Command == CM_GROUP ){
|
||
((CDrawGroup *)(pBase[i]))->FreeItem();
|
||
}
|
||
delete pBase[i];
|
||
}
|
||
delete pBase;
|
||
pBase = NULL;
|
||
m_Cnt = m_Max = 0;
|
||
pSel = NULL;
|
||
m_TransX = 319;
|
||
m_TransY = 255;
|
||
m_TransCol = TColor(0x00f8f8f8);
|
||
}
|
||
|
||
void __fastcall CDrawGroup::ReleaseResource(void)
|
||
{
|
||
if( pBase == NULL ) return;
|
||
|
||
for( int i = 0; i < m_Cnt; i++ ){
|
||
pBase[i]->ReleaseResource();
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawGroup::UpdatePic(Graphics::TBitmap *pBmp)
|
||
{
|
||
if( pBase == NULL ) return;
|
||
|
||
TransCol = m_TransCol;
|
||
for( int i = 0; i < m_Cnt; i++ ){
|
||
pBase[i]->UpdatePic(pBmp);
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawGroup::AddItem(CDraw *dp)
|
||
{
|
||
if( m_Cnt >= m_Max ){
|
||
m_Max = m_Max ? m_Max * 2 : 16;
|
||
CDraw **np = new CDraw*[m_Max];
|
||
if( pBase != NULL ){
|
||
memcpy(np, pBase, sizeof(CDraw*)*m_Cnt);
|
||
delete pBase;
|
||
}
|
||
pBase = np;
|
||
}
|
||
pBase[m_Cnt] = dp;
|
||
m_Cnt++;
|
||
}
|
||
|
||
void __fastcall CDrawGroup::DeleteItem(CDraw *dp)
|
||
{
|
||
if( pBase == NULL ) return;
|
||
|
||
for( int i = 0; i < m_Cnt; i++ ){
|
||
if( pBase[i] == dp ){
|
||
delete pBase[i];
|
||
for( ; i < (m_Cnt - 1); i++ ){
|
||
pBase[i] = pBase[i+1];
|
||
}
|
||
pBase[i] = NULL;
|
||
m_Cnt--;
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawGroup::ReleaseItem(CDraw *dp)
|
||
{
|
||
if( pBase == NULL ) return;
|
||
|
||
for( int i = 0; i < m_Cnt; i++ ){
|
||
if( pBase[i] == dp ){
|
||
for( ; i < (m_Cnt - 1); i++ ){
|
||
pBase[i] = pBase[i+1];
|
||
}
|
||
pBase[i] = NULL;
|
||
m_Cnt--;
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
CDraw * __fastcall CDrawGroup::AddItemCopy(CDraw *dp)
|
||
{
|
||
CDraw *pItem = MakeItem(dp->m_Command);
|
||
pItem->Copy(dp);
|
||
AddItem(pItem);
|
||
return pItem;
|
||
}
|
||
|
||
void __fastcall CDrawGroup::FillPic(TCanvas *tp, TColor col, int sw, double sx, double sy, int off)
|
||
{
|
||
if( pBase == NULL ) return;
|
||
|
||
for( int i = 0; i < m_Cnt; i++ ){
|
||
pBase[i]->FillPic(tp, col, sw, sx, sy, off);
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawGroup::Draw(TCanvas *tp)
|
||
{
|
||
if( pBase == NULL ) return;
|
||
|
||
TransCol = m_TransCol;
|
||
SetDrawSize(m_SX, m_SY);
|
||
for( int i = 0; i < m_Cnt; i++ ){
|
||
tp->Brush->Color = m_TransCol;
|
||
pBase[i]->Draw(tp);
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawGroup::DrawFast(TCanvas *tp)
|
||
{
|
||
if( pBase == NULL ) return;
|
||
|
||
TransCol = m_TransCol;
|
||
SetDrawSize(m_SX, m_SY);
|
||
for( int i = 0; i < m_Cnt; i++ ){
|
||
tp->Brush->Color = m_TransCol;
|
||
pBase[i]->DrawFast(tp);
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawGroup::DrawNotSel(TCanvas *tp)
|
||
{
|
||
if( pBase == NULL ) return;
|
||
|
||
TransCol = m_TransCol;
|
||
SetDrawSize(m_SX, m_SY);
|
||
for( int i = 0; i < m_Cnt; i++ ){
|
||
if( (pBase[i] != pSel) ||
|
||
(pBase[i]->m_Command == CM_TEXT) ||
|
||
(pBase[i]->m_Command == CM_PIC) ||
|
||
(pBase[i]->m_Command == CM_BOXS) ||
|
||
(pBase[i]->m_Command == CM_OLE) ||
|
||
(pBase[i]->m_Command == CM_LIB) ||
|
||
(pBase[i]->m_Command == CM_GROUP)
|
||
){
|
||
tp->Brush->Color = m_TransCol;
|
||
pBase[i]->Draw(tp);
|
||
}
|
||
}
|
||
}
|
||
|
||
CDraw* __fastcall CDrawGroup::SelectItem(int X, int Y)
|
||
{
|
||
if( pBase == NULL ) return NULL;
|
||
|
||
for( int i = m_Cnt - 1; i >= 0; i-- ){
|
||
if( (m_Hit = pBase[i]->HitTest(X, Y)) != 0 ){
|
||
return pBase[i];
|
||
}
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
CDraw* __fastcall CDrawGroup::MakeItem(int cmd)
|
||
{
|
||
TransCol = m_TransCol;
|
||
CDraw *pItem = NULL;
|
||
switch(cmd){
|
||
case CM_LINE:
|
||
pItem = new CDrawLine;
|
||
break;
|
||
case CM_BOX:
|
||
pItem = new CDrawBox;
|
||
break;
|
||
case CM_BOXS:
|
||
pItem = new CDrawBoxS;
|
||
break;
|
||
case CM_TEXT:
|
||
pItem = new CDrawText;
|
||
break;
|
||
case CM_PIC:
|
||
pItem = new CDrawPic;
|
||
break;
|
||
case CM_TITLE:
|
||
pItem = new CDrawTitle;
|
||
break;
|
||
case CM_OLE:
|
||
pItem = new CDrawOle;
|
||
break;
|
||
case CM_LIB:
|
||
pItem = new CDrawLib;
|
||
break;
|
||
case CM_GROUP:
|
||
pItem = new CDrawGroup;
|
||
break;
|
||
}
|
||
return pItem;
|
||
}
|
||
|
||
void __fastcall CDrawGroup::SaveToStream(TStream *sp)
|
||
{
|
||
m_Ver = 2;
|
||
CDrawBox::SaveToStream(sp);
|
||
|
||
sp->Write(&m_TransX, sizeof(m_TransX));
|
||
sp->Write(&m_TransY, sizeof(m_TransY));
|
||
sp->Write(&m_TransCol, sizeof(m_TransCol));
|
||
sp->Write(&m_SX, sizeof(m_SX));
|
||
sp->Write(&m_SY, sizeof(m_SY));
|
||
sp->Write(&m_Cnt, sizeof(m_Cnt));
|
||
for( int i = 0; i < m_Cnt; i++ ){
|
||
pBase[i]->SaveToStream(sp);
|
||
}
|
||
}
|
||
|
||
int __fastcall CDrawGroup::LoadFromStream(TCanvas *tp, TStream *sp)
|
||
{
|
||
FreeItem();
|
||
MultProc();
|
||
try {
|
||
int cnt, cmd;
|
||
sp->Read(&cmd, sizeof(cmd));
|
||
if( cmd != CM_GROUP ){
|
||
goto _err;
|
||
}
|
||
|
||
if( CDrawBox::LoadFromStream(tp, sp) == FALSE ) goto _err;
|
||
if( m_Ver >= 1 ){
|
||
sp->Read(&m_TransX, sizeof(m_TransX));
|
||
sp->Read(&m_TransY, sizeof(m_TransY));
|
||
sp->Read(&m_TransCol, sizeof(m_TransCol));
|
||
}
|
||
if( m_Ver >= 2 ){
|
||
sp->Read(&m_SX, sizeof(m_SX));
|
||
sp->Read(&m_SY, sizeof(m_SY));
|
||
}
|
||
SetDrawSize(m_SX, m_SY);
|
||
pSel = NULL;
|
||
sp->Read(&cnt, sizeof(cnt));
|
||
for( int i = 0; i < cnt; i++ ){
|
||
MultProcA();
|
||
sp->Read(&cmd, sizeof(cmd));
|
||
CDraw *pItem = MakeItem(cmd);
|
||
if( pItem != NULL ){
|
||
if( pItem->LoadFromStream(tp, sp) == FALSE ){
|
||
delete pItem;
|
||
goto _err;
|
||
}
|
||
AddItem(pItem);
|
||
}
|
||
else {
|
||
goto _err;
|
||
}
|
||
}
|
||
if( !m_Cnt ) m_TransCol = TColor(0x00f8f8f8);
|
||
m_Ver = 2;
|
||
return TRUE;
|
||
}
|
||
catch(...){
|
||
}
|
||
_err:;
|
||
FreeItem();
|
||
m_Ver = 1;
|
||
return FALSE;
|
||
}
|
||
|
||
void __fastcall CDrawGroup::Copy(CDraw *dp)
|
||
{
|
||
FreeItem();
|
||
|
||
CDrawGroup *sp = (CDrawGroup *)dp;
|
||
SetDrawSize(sp->m_SX, sp->m_SY);
|
||
m_TransX = sp->m_TransX;
|
||
m_TransY = sp->m_TransY;
|
||
m_TransCol = sp->m_TransCol;
|
||
m_SX = sp->m_SX;
|
||
m_SY = sp->m_SY;
|
||
for( int i = 0; i < sp->m_Cnt; i++ ){
|
||
AddItemCopy(sp->pBase[i]);
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawGroup::UpdateText(void)
|
||
{
|
||
CWaitCursor w;
|
||
|
||
TransCol = m_TransCol;
|
||
SetDrawSize(m_SX, m_SY);
|
||
for( int i = 0; i < m_Cnt; i++ ){
|
||
pBase[i]->UpdateText();
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawGroup::UpdateTimeText(void)
|
||
{
|
||
TransCol = m_TransCol;
|
||
SetDrawSize(m_SX, m_SY);
|
||
for( int i = 0; i < m_Cnt; i++ ){
|
||
pBase[i]->UpdateTimeText();
|
||
}
|
||
}
|
||
|
||
int __fastcall CDrawGroup::IsMacro(LPCSTR pKey)
|
||
{
|
||
LPCSTR pText;
|
||
for( int i = 0; i < m_Cnt; i++ ){
|
||
pText = pBase[i]->GetText();
|
||
if( pText != NULL ){
|
||
if( strstr(pText, pKey) != NULL ) return 1;
|
||
}
|
||
#if 0
|
||
if( pBase[i]->m_Command == CM_TEXT ){
|
||
LPCSTR p = ((CDrawText *)pBase[i])->m_Text.c_str();
|
||
if( strstr(p, pKey) != NULL ) return 1;
|
||
}
|
||
#endif
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int __fastcall CDrawGroup::IsTimeMacro(void)
|
||
{
|
||
for( int i = 0; i < m_Cnt; i++ ){
|
||
if( pBase[i]->IsTimeMacro() ) return 1;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
void __fastcall CDrawGroup::BackItem(CDraw *pItem)
|
||
{
|
||
int i, k;
|
||
for( i = m_Cnt - 1; i >= 0; i-- ){
|
||
if( pBase[i] == pItem ){
|
||
for( k = i; k > 0; k-- ){
|
||
pBase[k] = pBase[k-1];
|
||
}
|
||
pBase[0] = pItem;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
void __fastcall CDrawGroup::FrontItem(CDraw *pItem)
|
||
{
|
||
int i, k;
|
||
for( i = 0; i < m_Cnt; i++ ){
|
||
if( pBase[i] == pItem ){
|
||
for( k = i; k < m_Cnt - 1; k++ ){
|
||
pBase[k] = pBase[k+1];
|
||
}
|
||
pBase[k] = pItem;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
int __fastcall CDrawGroup::UpItem(int n)
|
||
{
|
||
if( n ){
|
||
CDraw *pItem = pBase[n-1];
|
||
pBase[n-1] = pBase[n];
|
||
pBase[n] = pItem;
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
int __fastcall CDrawGroup::DownItem(int n)
|
||
{
|
||
if( n < (m_Cnt - 1) ){
|
||
CDraw *pItem = pBase[n+1];
|
||
pBase[n+1] = pBase[n];
|
||
pBase[n] = pItem;
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
//--------------------------------------------------------------------------
|
||
void __fastcall DrawTrans(TCanvas *tp, int x, int y)
|
||
{
|
||
int rop = ::SetROP2(tp->Handle, R2_NOT);
|
||
tp->MoveTo(x - 5, y - 5);
|
||
tp->LineTo(x + 5, y - 5);
|
||
tp->LineTo(x + 5, y + 5);
|
||
tp->LineTo(x - 5, y + 5);
|
||
tp->LineTo(x - 5, y - 5);
|
||
tp->MoveTo(x - 5, y - 5);
|
||
tp->LineTo(x + 5, y + 5);
|
||
tp->MoveTo(x - 5, y + 5);
|
||
tp->LineTo(x + 5, y - 5);
|
||
::SetROP2(tp->Handle, rop);
|
||
}
|
||
//--------------------------------------------------------------------------
|
||
void __fastcall CDrawGroup::DrawTrans(TCanvas *tp)
|
||
{
|
||
::DrawTrans(tp, m_TransX, m_TransY);
|
||
}
|
||
//--------------------------------------------------------------------------
|
||
void __fastcall CDrawGroup::AdjustTransPoint(void)
|
||
{
|
||
MultProc();
|
||
int i;
|
||
int f = 0;
|
||
int XW = 320;
|
||
int YW = 256;
|
||
for( i = 0; i < m_Cnt; i++ ){
|
||
if( pBase[i]->HitTest(m_TransX, m_TransY) ){
|
||
for( m_TransX = XW-1; m_TransX >= 0; m_TransX -= 5 ){
|
||
for( m_TransY = YW-1; m_TransY >= 0; m_TransY-- ){
|
||
f = 0;
|
||
for( i = 0; i < m_Cnt; i++ ){
|
||
if( pBase[i]->HitTest(m_TransX, m_TransY) ){
|
||
f++;
|
||
break;
|
||
}
|
||
}
|
||
if( !f ) return;
|
||
}
|
||
MultProc();
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
if( f ){
|
||
for( i = 0; i < m_Cnt; i++ ){
|
||
if( pBase[i]->m_Command == CM_PIC ){
|
||
CDrawPic *pPic = (CDrawPic *)pBase[i];
|
||
if( pPic->m_Type == 2 ){
|
||
m_TransX = pPic->m_X1 + (pPic->m_TransPoint & 0x0000ffff) + 1;
|
||
m_TransY = pPic->m_Y1 + (pPic->m_TransPoint >> 16) + 1;
|
||
if( m_TransX < 0 ) m_TransX = 0;
|
||
if( m_TransY < 0 ) m_TransY = 0;
|
||
if( m_TransX >= XW ) m_TransX = XW-1;
|
||
if( m_TransY >= YW ) m_TransY = YW-1;
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
m_TransX = XW-1;
|
||
m_TransY = YW-1;
|
||
}
|
||
}
|
||
//--------------------------------------------------------------------------
|
||
void __fastcall CDrawGroup::AdjustTransColor(Graphics::TBitmap *pBmp)
|
||
{
|
||
TColor org = m_TransCol;
|
||
// m_TransCol = clWhite;
|
||
m_TransCol = GetUniqueColor(m_TransCol);
|
||
if( !m_Cnt ) return;
|
||
|
||
CWaitCursor wait;
|
||
|
||
int XW = pBmp->Width;
|
||
int YW = pBmp->Height;
|
||
int i, y, x, f;
|
||
for( i = 0; i < 512; i++ ){
|
||
f = 0;
|
||
for( y = 0; y < YW; y++ ){
|
||
for( x = 0; x < XW; x++ ){
|
||
if( pBmp->Canvas->Pixels[x][y] == m_TransCol ){
|
||
f++;
|
||
break;
|
||
}
|
||
}
|
||
if( f ) break;
|
||
}
|
||
if( !f ) break;
|
||
m_TransCol = GetUniqueColor(m_TransCol);
|
||
MultProc();
|
||
}
|
||
if( org != m_TransCol ){
|
||
UpdateText();
|
||
}
|
||
}
|
||
|
||
//--------------------------------------------------------------------------
|
||
void __fastcall CDrawGroup::GetColorBarPos(int &Y1, int &Y2)
|
||
{
|
||
int H = Y2;
|
||
int i;
|
||
for( i = 0; i < m_Cnt; i++ ){
|
||
CDraw *pItem = pBase[i];
|
||
if( pItem->m_Command == CM_TITLE ){
|
||
if( pItem->m_Y2 < 20 ){
|
||
Y1 = pItem->m_Y2;
|
||
}
|
||
else if( pItem->m_Y1 >= (H - 20) ){
|
||
Y2 = pItem->m_Y1;
|
||
}
|
||
}
|
||
}
|
||
if( Y1 < 0 ) Y1 = 0;
|
||
if( Y2 > H ) Y2 = H;
|
||
}
|
||
//--------------------------------------------------------------------------
|
||
CDraw* __fastcall CDrawGroup::GetLastItem(void)
|
||
{
|
||
return m_Cnt ? pBase[m_Cnt-1]: NULL;
|
||
}
|
||
//--------------------------------------------------------------------------
|
||
int __fastcall CDrawGroup::IsConvBitmap(CDraw *pItem)
|
||
{
|
||
if( pItem == NULL ) return FALSE;
|
||
|
||
switch(pItem->m_Command){
|
||
case CM_PIC:
|
||
{
|
||
CDrawPic *pPic = (CDrawPic *)pItem;
|
||
return pPic->m_Type != 1 ? TRUE : FALSE;
|
||
}
|
||
case CM_TEXT:
|
||
{
|
||
CDrawText *pText = (CDrawText *)pItem;
|
||
if( pText->pBitmap == NULL ) return FALSE;
|
||
}
|
||
return TRUE;
|
||
case CM_OLE:
|
||
return TRUE;
|
||
case CM_LIB:
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
//--------------------------------------------------------------------------
|
||
CDrawPic* __fastcall CDrawGroup::MakePic(int x, int y, Graphics::TBitmap *pBitmap, int ov)
|
||
{
|
||
CDrawPic *pPic = new CDrawPic;
|
||
pPic->Start(Mmsstv->PBoxTemp->Canvas, x, y);
|
||
if( pPic->FinishR(x + pBitmap->Width + 1, y + pBitmap->Height + 1) ){
|
||
pPic->m_Type = ov ? 2 : 1;
|
||
pPic->m_Shape = 0;
|
||
pPic->m_LineStyle = TPenStyle(-1);
|
||
pBitmap->Transparent = FALSE;
|
||
pPic->pBitmap->Canvas->Draw(0, 0, pBitmap);
|
||
return pPic;
|
||
}
|
||
return NULL;
|
||
}
|
||
//--------------------------------------------------------------------------
|
||
void __fastcall CDrawGroup::ConvBitmap(CDraw *pItem)
|
||
{
|
||
if( pItem == NULL ) return;
|
||
|
||
int i;
|
||
for( i = 0; i < m_Cnt; i++ ){
|
||
if( pBase[i] == pItem ){
|
||
switch(pItem->m_Command){
|
||
case CM_PIC:
|
||
{
|
||
CDrawPic *pPic = (CDrawPic *)pItem;
|
||
pPic->m_Type = 1;
|
||
}
|
||
break;
|
||
case CM_TEXT:
|
||
{
|
||
CDrawText *pText = (CDrawText *)pItem;
|
||
if( pText->pBitmap == NULL ) return;
|
||
pSel = MakePic(pText->m_X1 - 1, pText->m_Y1 - 1, pText->pBitmap, 1);
|
||
if( pSel != NULL ){
|
||
pBase[i] = pSel;
|
||
delete pText;
|
||
}
|
||
}
|
||
break;
|
||
case CM_OLE:
|
||
{
|
||
CDrawOle *pOle = (CDrawOle *)pItem;
|
||
Graphics::TBitmap *pBitmap = pOle->MakeBitmap();
|
||
pSel = MakePic(pOle->m_X1 - 1, pOle->m_Y1 - 1, pBitmap, pOle->m_Trans);
|
||
if( pSel != NULL ){
|
||
pBase[i] = pSel;
|
||
delete pOle;
|
||
}
|
||
delete pBitmap;
|
||
}
|
||
break;
|
||
case CM_LIB:
|
||
{
|
||
CDrawLib *pLib = (CDrawLib *)pItem;
|
||
if( pLib->pBitmap == NULL ) return;
|
||
pSel = MakePic(pLib->m_X1 - 1, pLib->m_Y1 - 1, pLib->pBitmap, pLib->m_Type & 0x00010000);
|
||
if( pSel != NULL ){
|
||
pBase[i] = pSel;
|
||
delete pLib;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
//**************************************************************************
|
||
//
|
||
//---------------------------------------------------------------------------
|
||
// ƒtƒ@ƒCƒ‹‚©‚çƒ<C3A7><C692>[ƒh
|
||
int __fastcall LoadTemplate(CDrawGroup *pItem, LPCSTR pName, TCanvas *tp)
|
||
{
|
||
int r = FALSE;
|
||
try {
|
||
TFileStream *sp = new TFileStream(pName, fmOpenRead);
|
||
r = pItem->LoadFromStream((tp != NULL) ? tp : Mmsstv->PBoxTemp->Canvas, sp);
|
||
delete sp;
|
||
r = TRUE;
|
||
}
|
||
catch(...){
|
||
}
|
||
if( r == FALSE ){
|
||
if( IsFile(pName) ){
|
||
ErrorMB( MsgEng ? "The template file (%s) is not a correct format":"ƒeƒ“ƒvƒŒ<EFBFBD>[ƒg(%s)‚Í<E2809A>³‚µ‚¢ƒtƒ@ƒCƒ‹Œ`Ž®‚ł͂ ‚è‚Ü‚¹‚ñ.", pName);
|
||
unlink(pName);
|
||
}
|
||
}
|
||
MultProc();
|
||
return r;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
// ƒtƒ@ƒCƒ‹‚ւ̃Z<C692>[ƒu
|
||
int __fastcall SaveTemplate(CDrawGroup *pItem, LPCSTR pName)
|
||
{
|
||
int r = FALSE;
|
||
try {
|
||
TFileStream *sp = new TFileStream(pName, fmCreate);
|
||
pItem->SaveToStream(sp);
|
||
delete sp;
|
||
r = TRUE;
|
||
}
|
||
catch(...){
|
||
if( IsFile(pName) && (GetFileAttributes(pName) & FILE_ATTRIBUTE_READONLY) ){
|
||
ErrorMB("'%s' is read-only.", pName);
|
||
}
|
||
else {
|
||
ErrorMB( MsgEng ? "Cannot update '%s":"'%s'‚ð<E2809A>X<EFBFBD>V‚Å‚«‚Ü‚¹‚ñ.", pName);
|
||
}
|
||
}
|
||
MultProc();
|
||
return r;
|
||
}
|
||
//**************************************************************************
|
||
//
|
||
//--------------------------------------------------------------------------
|
||
void __fastcall CPolygon::Free(void)
|
||
{
|
||
if( pBase != NULL ){
|
||
delete pBase;
|
||
pBase = NULL;
|
||
}
|
||
}
|
||
|
||
void __fastcall CPolygon::AddPoint(int X, int Y)
|
||
{
|
||
if( Cnt ){
|
||
if( (pBase[Cnt-1].x == X) && (pBase[Cnt-1].y == Y) ) return;
|
||
}
|
||
if( Cnt >= Max ){
|
||
int max = Max ? Max * 2 : 4;
|
||
POINT *pNew = new POINT[max];
|
||
if( pBase != NULL ){
|
||
memcpy(pNew, pBase, Cnt * sizeof(POINT));
|
||
delete pBase;
|
||
}
|
||
pBase = pNew;
|
||
Max = max;
|
||
}
|
||
pBase[Cnt].x = X;
|
||
pBase[Cnt].y = Y;
|
||
Cnt++;
|
||
}
|
||
|
||
void __fastcall CPolygon::SaveToStream(TStream *sp)
|
||
{
|
||
int id = 0x55aa2233;
|
||
sp->Write(&id, sizeof(id));
|
||
sp->Write(&Cnt, sizeof(Cnt));
|
||
sp->Write(&XW, sizeof(XW));
|
||
sp->Write(&YW, sizeof(YW));
|
||
int i;
|
||
POINT *p = pBase;
|
||
for( i = 0; i < Cnt; i++, p++ ){
|
||
sp->Write(p, sizeof(POINT));
|
||
}
|
||
}
|
||
|
||
int __fastcall CPolygon::LoadFromStream(TStream *sp)
|
||
{
|
||
sp->Read(&Cnt, sizeof(Cnt));
|
||
if( Cnt == 0x55aa2233 ){
|
||
sp->Read(&Cnt, sizeof(Cnt));
|
||
sp->Read(&XW, sizeof(XW));
|
||
sp->Read(&YW, sizeof(YW));
|
||
}
|
||
else {
|
||
XW = 256;
|
||
YW = 200;
|
||
}
|
||
if( pBase != NULL ){
|
||
delete pBase;
|
||
}
|
||
Max = Cnt;
|
||
if( Cnt ){
|
||
pBase = new POINT[Max];
|
||
POINT *p = pBase;
|
||
for( Cnt = 0; Cnt < Max; Cnt++, p++ ){
|
||
sp->Read(p, sizeof(POINT));
|
||
if( XW != 320 ) p->x = p->x * 320 / XW;
|
||
if( YW != 256 ) p->y = p->y * 256 / XW;
|
||
}
|
||
}
|
||
XW = 320;
|
||
YW = 256;
|
||
return TRUE;
|
||
}
|
||
|
||
void __fastcall CPolygon::Draw(TCanvas *tp, int loop)
|
||
{
|
||
if( !Cnt ) return;
|
||
|
||
tp->Brush->Color = clWhite;
|
||
tp->Pen->Color = sys.m_PicSelCurCol;
|
||
// tp->Pen->Color = clBlue;
|
||
tp->Pen->Width = 2;
|
||
tp->Pen->Style = psSolid;
|
||
// int rop = ::SetROP2(tp->Handle, R2_MERGEPENNOT);
|
||
for( int i = 0; i < Cnt; i++ ){
|
||
if( i ){
|
||
tp->LineTo(pBase[i].x, pBase[i].y);
|
||
}
|
||
else {
|
||
tp->MoveTo(pBase[i].x, pBase[i].y);
|
||
}
|
||
}
|
||
if( loop ){
|
||
tp->LineTo(pBase[0].x, pBase[0].y);
|
||
}
|
||
// ::SetROP2(tp->Handle, rop);
|
||
}
|
||
|
||
void __fastcall CPolygon::Copy(CPolygon *p)
|
||
{
|
||
if( pBase != NULL ){
|
||
delete pBase;
|
||
}
|
||
Max = Cnt = p->Cnt;
|
||
pBase = new POINT[Max];
|
||
memcpy(pBase, p->pBase, sizeof(POINT) * Cnt);
|
||
XW = p->XW;
|
||
YW = p->YW;
|
||
}
|
||
|
||
void __fastcall CPolygon::GetCenter(int &xc, int &yc)
|
||
{
|
||
if( Cnt < 3 ){
|
||
xc = XW/2;
|
||
yc = YW/2;
|
||
}
|
||
else {
|
||
int X, Y;
|
||
int XL = 640;
|
||
int YT = 496;
|
||
int XR = 0;
|
||
int YB = 0;
|
||
int i;
|
||
for( i = 0; i < Cnt; i++ ){
|
||
X = pBase[i].x;
|
||
Y = pBase[i].y;
|
||
if( XL > X ) XL = X;
|
||
if( XR < X ) XR = X;
|
||
if( YT > Y ) YT = Y;
|
||
if( YB < Y ) YB = Y;
|
||
}
|
||
xc = (XR + XL)/2;
|
||
yc = (YB + YT)/2;
|
||
}
|
||
}
|
||
|
||
void __fastcall CPolygon::DrawOffset(TCanvas *tp, int x, int y)
|
||
{
|
||
POINT *pTemp = new POINT[Cnt];
|
||
for( int i = 0; i < Cnt; i++ ){
|
||
pTemp[i].x = pBase[i].x + x;
|
||
pTemp[i].y = pBase[i].y + y;
|
||
}
|
||
tp->Polygon(pTemp, Cnt-1);
|
||
delete pTemp;
|
||
}
|
||
|
||
void __fastcall CPolygon::DrawOffsetSiege(TCanvas *tp, int x, int y, TColor SCol, int e)
|
||
{
|
||
if( Cnt < 3 ) return;
|
||
int XC, YC;
|
||
GetCenter(XC, YC);
|
||
|
||
e = e == 5 ? 4 : 3;
|
||
int i, j;
|
||
POINT *pTemp = new POINT[Cnt];
|
||
tp->Pen->Style = psSolid;
|
||
tp->Pen->Width = 1;
|
||
tp->Brush->Style = bsClear;
|
||
TColor col = SCol;
|
||
TColor tcol = SCol == clBlack ? clWhite : clBlack;
|
||
double deg, r, xx, yy;
|
||
for( i = 0; i < e; i++ ){
|
||
for( j = 0; j < Cnt; j++ ){
|
||
#if 0
|
||
if( pBase[j].x > XC ){
|
||
pTemp[j].x = x + pBase[j].x + i;
|
||
}
|
||
else {
|
||
pTemp[j].x = x + pBase[j].x - i;
|
||
}
|
||
if( pBase[j].y > YC ){
|
||
pTemp[j].y = y + pBase[j].y + i;
|
||
}
|
||
else {
|
||
pTemp[j].y = y + pBase[j].y - i;
|
||
}
|
||
#else
|
||
xx = pBase[j].x - XC;
|
||
yy = YC - pBase[j].y;
|
||
if( xx > 0 ){
|
||
deg = atan(double(yy)/double(xx));
|
||
r = sqrt(xx * xx + yy * yy);
|
||
}
|
||
else if( xx < 0 ){
|
||
deg = atan(double(yy)/double(xx));
|
||
deg += PI;
|
||
r = sqrt(xx * xx + yy * yy);
|
||
}
|
||
else {
|
||
deg = yy < 0 ? -PI/2 : PI/2;
|
||
r = ABS(yy);
|
||
}
|
||
r += i;
|
||
pTemp[j].x = x + XC + r * cos(deg) + 0.5;
|
||
pTemp[j].y = y + YC - r * sin(deg) + 0.5;
|
||
#endif
|
||
}
|
||
tp->Pen->Color = GetCol(col, tcol, i, e);
|
||
tp->Polygon(pTemp, Cnt - 1);
|
||
}
|
||
for( i = 1; i < e; i++ ){
|
||
for( j = 0; j < Cnt; j++ ){
|
||
#if 0
|
||
if( pBase[j].x > XC ){
|
||
pTemp[j].x = x + pBase[j].x - i;
|
||
}
|
||
else {
|
||
pTemp[j].x = x + pBase[j].x + i;
|
||
}
|
||
if( pBase[j].y > YC ){
|
||
pTemp[j].y = y + pBase[j].y - i;
|
||
}
|
||
else {
|
||
pTemp[j].y = y + pBase[j].y + i;
|
||
}
|
||
#else
|
||
xx = pBase[j].x - XC;
|
||
yy = YC - pBase[j].y;
|
||
if( xx > 0 ){
|
||
deg = atan(double(yy)/double(xx));
|
||
r = sqrt(xx * xx + yy * yy);
|
||
}
|
||
else if( xx < 0 ){
|
||
deg = atan(double(yy)/double(xx));
|
||
deg += PI;
|
||
r = sqrt(xx * xx + yy * yy);
|
||
}
|
||
else {
|
||
deg = yy < 0 ? -PI/2 : PI/2;
|
||
r = ABS(yy);
|
||
}
|
||
r -= i;
|
||
pTemp[j].x = x + XC + r * cos(deg) + 0.5;
|
||
pTemp[j].y = y + YC - r * sin(deg) + 0.5;
|
||
#endif
|
||
}
|
||
tp->Pen->Color = GetCol(col, tcol, i, e);
|
||
tp->Polygon(pTemp, Cnt - 1);
|
||
}
|
||
delete pTemp;
|
||
tp->Brush->Style = bsSolid;
|
||
}
|
||
|
||
void __fastcall CPolygon::Stretch(int xw, int yw, int oxw, int oyw)
|
||
{
|
||
if( (xw == oxw) && (oxw == oyw) ) return;
|
||
|
||
double sx = double(xw)/double(oxw);
|
||
double sy = double(yw)/double(oyw);
|
||
for( int i = 0; i < Cnt; i++ ){
|
||
pBase[i].x *= sx;
|
||
pBase[i].y *= sy;
|
||
}
|
||
}
|
||
|
||
void __fastcall CPolygon::Stretch(CPolygon &pol)
|
||
{
|
||
Stretch(XW, YW, pol.XW, pol.YW);
|
||
}
|
||
|
||
//---------------------------------------------------------------------------
|
||
// “§Ž‹•ÏŠ·
|
||
static void __fastcall Matrix(double l[4][4], double m[4][4], double n[4][4])
|
||
{
|
||
int i, j, k;
|
||
double d;
|
||
|
||
for( i = 0; i < 4; i++ ){
|
||
for( j = 0; j < 4; j++ ){
|
||
for( k = 0, d = 0.0; k < 4; k++ ) d += l[i][k] * m[k][j];
|
||
n[i][j] = d;
|
||
}
|
||
}
|
||
}
|
||
|
||
void __fastcall PerspectPara(double k[9], const SPERSPECT *pPar, int xs, int ys)
|
||
{
|
||
double l[4][4]; double m[4][4]; double n[4][4];
|
||
double k1, k2, k3, k4, k5, k6, k7, k8, k9;
|
||
double u, v, w;
|
||
|
||
u = pPar->rx * PI / 180;
|
||
v = pPar->ry * PI / 180;
|
||
w = pPar->rz * PI / 180;
|
||
memset(l, 0, sizeof(l)); memset(m, 0, sizeof(m));
|
||
l[0][0] = 1.0/xs; l[1][1] = -1.0/xs; l[2][2] = 1.0; l[3][3] = 1.0;
|
||
m[0][0] = pPar->ax; m[1][1] = pPar->ay; m[2][2] = 1.0; m[3][3] = 1.0;
|
||
Matrix(l, m, n);
|
||
memset(l, 0, sizeof(l));
|
||
l[0][0] = 1.0; l[1][1] = 1.0; l[2][2] = 1.0;
|
||
l[3][0] = pPar->px; l[3][1] = pPar->py; l[3][2] = pPar->pz; l[3][3] = 1.0;
|
||
Matrix(n, l, m);
|
||
memset(n, 0, sizeof(n));
|
||
n[0][0] = cos(w); n[0][1] = sin(w);
|
||
n[1][0] = -n[0][1]; n[1][1] = n[0][0];
|
||
n[2][2] = 1.0; n[3][3] = 1.0;
|
||
Matrix(m, n, l);
|
||
memset(m, 0, sizeof(m));
|
||
m[0][0] = 1.0; m[1][1] = cos(u); m[1][2] = sin(u);
|
||
m[2][1] = -m[1][2]; m[2][2] = m[1][1]; m[3][3] = 1.0;
|
||
Matrix(l, m, n);
|
||
memset(l, 0, sizeof(l));
|
||
l[0][0] = cos(v); l[0][2] = sin(v); l[1][1] = 1.0;
|
||
l[2][0] = -l[0][2]; l[2][2] = l[0][0]; l[3][3] = 1.0;
|
||
Matrix(n, l, m);
|
||
memset(n, 0, sizeof(n));
|
||
n[0][0] = 1.0; n[1][1] = 1.0; n[2][2] = -1.0; n[3][2] = -pPar->v; n[3][3] = 1.0;
|
||
Matrix(m, n, l);
|
||
memset(m, 0, sizeof(m));
|
||
m[0][0] = 1.0; m[1][1] = 1.0; m[2][2] = 1/pPar->s; m[2][3] = m[2][2];
|
||
m[3][2] = -1.0;
|
||
Matrix(l, m, n);
|
||
memset(l, 0, sizeof(l));
|
||
l[0][0] = xs; l[1][1] = -xs; l[2][2] = 1.0; l[3][3] = 1.0;
|
||
Matrix(n, l, m);
|
||
|
||
k1 = m[0][3]; k2 = m[1][3]; k3 = m[3][3];
|
||
k4 = m[0][0]; k5 = m[1][0]; k6 = m[3][0];
|
||
k7 = m[0][1]; k8 = m[1][1]; k9 = m[3][1];
|
||
|
||
k[0] = k7*k2 - k8*k1; k[1] = k5*k1 - k4*k2; k[2] = k4*k8 - k7*k5;
|
||
k[3] = k8*k3 - k9*k2; k[6] = k9*k1 - k7*k5; k[4] = k6*k2 - k5*k3;
|
||
k[7] = k4*k3 - k6*k1; k[5] = k5*k9 - k8*k6; k[8] = k7*k6 - k4*k9;
|
||
}
|
||
|
||
void __fastcall Perspect(Graphics::TBitmap *pSrc, Graphics::TBitmap *pTer, const SPERSPECT *pPar, TColor back)
|
||
{
|
||
if( (pSrc->Width < 2) || (pSrc->Height < 2) ){
|
||
CopyBitmap(pTer, pSrc);
|
||
}
|
||
else {
|
||
Graphics::TBitmap *pS = DupeBitmap(pSrc, pf24bit);
|
||
Graphics::TBitmap *pT = new Graphics::TBitmap;
|
||
pT->PixelFormat = pf24bit;
|
||
pT->Width = pTer->Width;
|
||
pT->Height = pTer->Height;
|
||
if( pT->Width & 1 ) pT->Width--;
|
||
if( pT->Height & 1 ) pT->Height--;
|
||
int i, j, m, n;
|
||
double x, y, w, p, q;
|
||
double k[9];
|
||
int xs = pT->Width / 2;
|
||
int ys = pT->Height / 2;
|
||
PerspectPara(k, pPar, xs, ys);
|
||
BYTE *sp1, *sp2;
|
||
BYTE *tp;
|
||
sp1 = (BYTE *)pS->ScanLine[0];
|
||
BYTE br = *sp1++;
|
||
BYTE bg = *sp1++;
|
||
BYTE bb = *sp1;
|
||
int r, g, b;
|
||
for( i = -ys; i < ys; i++ ){
|
||
tp = (BYTE *)pT->ScanLine[i+ys];
|
||
for( j = -xs; j < xs; j++ ){
|
||
w = k[0] * j + k[1] * i + k[2];
|
||
x = k[3] * j + k[4] * i + k[5];
|
||
y = k[6] * j + k[7] * i + k[8];
|
||
x = x / w;
|
||
y = y / w;
|
||
if( y > 0 ){ m = int(y); } else { m = int(y-1); }
|
||
if( x > 0 ){ n = int(x); } else { n = int(x-1); }
|
||
q = y - m;
|
||
p = x - n;
|
||
double pp = 1.0 - p;
|
||
double qq = 1.0 - q;
|
||
if( (m >= -ys) && (m < ys-1) && (n >= -xs) && (n < xs-1) ){
|
||
sp1 = (BYTE *)pS->ScanLine[m+ys] + (n+xs)*3;
|
||
sp2 = (BYTE *)pS->ScanLine[m+ys+1] + (n+xs)*3;
|
||
if( (*sp1 != *sp2) || (*sp1 != *(sp1+3)) || (*sp1 != *(sp2+3)) ){
|
||
r = (int)(qq*(pp*(*sp1) + p*(*(sp1+3)))
|
||
+ q * (pp*(*sp2) + p*(*(sp2+3))));
|
||
// if( ABS(r-br) < 16 ) r = br;
|
||
}
|
||
else {
|
||
r = *sp1;
|
||
}
|
||
sp1++; sp2++;
|
||
if( (*sp1 != *sp2) || (*sp1 != *(sp1+3)) || (*sp1 != *(sp2+3)) ){
|
||
g = (int)(qq*(pp*(*sp1) + p*(*(sp1+3)))
|
||
+ q * (pp*(*sp2) + p*(*(sp2+3))));
|
||
// if( ABS(g-bg) < 16 ) g = bg;
|
||
}
|
||
else {
|
||
g = *sp1;
|
||
}
|
||
sp1++; sp2++;
|
||
if( (*sp1 != *sp2) || (*sp1 != *(sp1+3)) || (*sp1 != *(sp2+3)) ){
|
||
b = (int)(qq*(pp*(*sp1) + p*(*(sp1+3)))
|
||
+ q * (pp*(*sp2) + p*(*(sp2+3))));
|
||
// if( ABS(b-bb) < 16 ) b = bb;
|
||
}
|
||
else {
|
||
b = *sp1;
|
||
}
|
||
if( r < 0 ) r = 0;
|
||
if( r > 255 ) r = 255;
|
||
if( g < 0 ) g = 0;
|
||
if( g > 255 ) g = 255;
|
||
if( b < 0 ) b = 0;
|
||
if( b > 255 ) b = 255;
|
||
*tp++ = BYTE(r);
|
||
*tp++ = BYTE(g);
|
||
*tp++ = BYTE(b);
|
||
}
|
||
else {
|
||
*tp++ = br;
|
||
*tp++ = bg;
|
||
*tp++ = bb;
|
||
}
|
||
}
|
||
}
|
||
pTer->Width = pT->Width;
|
||
pTer->Height = pT->Height;
|
||
pTer->Palette = NULL;
|
||
pTer->Canvas->Draw(0, 0, pT);
|
||
delete pT;
|
||
delete pS;
|
||
}
|
||
}
|
||
//
|
||
//
|
||
//***************************************************************************
|
||
//CLIBLƒNƒ‰ƒX
|
||
//***************************************************************************
|
||
//
|
||
//
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CLIBL::Alloc(void)
|
||
{
|
||
int am = m_AMax ? (m_AMax * 2) : 16;
|
||
LIBD *pN = new LIBD[am];
|
||
if( m_pBase != NULL ){
|
||
memcpy(pN, m_pBase, sizeof(LIBD)*m_Count);
|
||
delete m_pBase;
|
||
}
|
||
m_pBase = pN;
|
||
m_AMax = am;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CLIBL::Delete(void)
|
||
{
|
||
if( m_pBase != NULL ){
|
||
LIBD *cp = m_pBase;
|
||
for( int i = 0; i < m_Count; i++, cp++ ){
|
||
delete cp->pName;
|
||
::FreeLibrary(cp->hLib);
|
||
}
|
||
delete m_pBase;
|
||
}
|
||
m_pBase = NULL;
|
||
m_AMax = 0;
|
||
m_Count = 0;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CLIBL::Add(LPCSTR pName, HANDLE hLib)
|
||
{
|
||
if( m_Count >= m_AMax ) Alloc();
|
||
LIBD *cp = &m_pBase[m_Count];
|
||
cp->pName = StrDupe(pName);
|
||
cp->hLib = (HINSTANCE)hLib;
|
||
m_Count++;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
HANDLE __fastcall CLIBL::LoadLibrary(LPCSTR pName)
|
||
{
|
||
LIBD *cp = m_pBase;
|
||
for( int i = 0; i < m_Count; i++, cp++ ){
|
||
if( !strcmpi(cp->pName, pName) ){
|
||
if( cp->hLib == NULL ){
|
||
cp->hLib = ::LoadLibrary(pName);
|
||
}
|
||
return cp->hLib;
|
||
}
|
||
}
|
||
HANDLE hLib = ::LoadLibrary(pName);
|
||
if( hLib != NULL ) Add(pName, hLib);
|
||
return hLib;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CLIBL::DeleteLibrary(HANDLE hLib)
|
||
{
|
||
if( hLib == NULL ) return;
|
||
|
||
LIBD *cp = m_pBase;
|
||
for( int i = 0; i < m_Count; i++, cp++ ){
|
||
if( cp->hLib == hLib ){
|
||
::FreeLibrary((HINSTANCE)hLib);
|
||
cp->hLib = NULL;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
#if 0
|
||
//---------------------------------------------------------------------------
|
||
__fastcall CGrid::CGrid()
|
||
{
|
||
m_Flag = 0;
|
||
m_Intval = 16;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CGrid::Draw(TCanvas *tp, int xw, int yw)
|
||
{
|
||
if( !m_Flag ) return;
|
||
|
||
int x, y, xx, yy;
|
||
|
||
tp->Pen->Width = 1;
|
||
int rop = ::SetROP2(tp->Handle, R2_NOT);
|
||
for( x = 0; x < xw; x += m_Intval ){
|
||
xx = x * 320 / xw;
|
||
tp->MoveTo(xx, 0);
|
||
tp->LineTo(xx, yw-1);
|
||
}
|
||
for( y = 0; y < yw; y += m_Intval ){
|
||
yy = y * 256 / yw;
|
||
tp->MoveTo(0, yy);
|
||
tp->LineTo(xw-1, yy);
|
||
}
|
||
::SetROP2(tp->Handle, rop);
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CGrid::Align(int &x1, int &y1, int &x2, int &y2)
|
||
{
|
||
if( !m_Flag ) return;
|
||
|
||
int xw = x2 - x1;
|
||
int yw = y2 - y1;
|
||
x1 = int((double(x1) / m_Intval) + 0.5) * m_Intval;
|
||
x2 = x1 + xw;
|
||
y1 = int((double(y1) / m_Intval) + 0.5) * m_Intval;
|
||
y2 = y1 + yw;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall CGrid::Align(CDraw *pItem)
|
||
{
|
||
Align(pItem->m_X1, pItem->m_Y1, pItem->m_X2, pItem->m_Y2);
|
||
}
|
||
#endif
|
||
|
||
#pragma package(smart_init)
|
||
|