//--------------------------------------------------------------------------- #include #include #include #pragma hdrstop #include "Text_F.h" #include "MainImage.h" #include "Palette.h" #include "Undo.h" #include "winbase.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "TPSpin" #pragma link "RXSpin" //#pragma link "RXCtrls" #pragma resource "*.dfm" //--------------------------------------------------------------------------- #define IDS_FONT StringTable[0] #define IDS_SHAPE StringTable[1] #define IDS_HORV StringTable[2] #define IDS_CIRCLE StringTable[3] #define IDS_INTERVAL StringTable[4] #define IDS_TUNNELCOUNT StringTable[5] #define IDS_RUNTUNNEL StringTable[6] #define IDS_REARRANGE StringTable[7] #define IDS_TUNNEL StringTable[8] #define IDS_CONTINUOUS StringTable[9] //#define IDS_VER StringTable[9] //--------------------------------------------------------------------------- TTextForm *TextForm; //--------------------------------------------------------------------------- FIXED __fastcall FixedFormDouble(double d) { long l; l = (long)(d*65536L); return *(FIXED *)&l; } //--------------------------------------------------------------------------- __fastcall TTextForm::TTextForm(TComponent* Owner) : TForm(Owner) { //========================================================== StringTable.Create(DirectoryCommon, Language, "Text"); SetSmallFont(Font); SetSmallFont(rxHeight->Font); SetSmallFont(rxInterval->Font); SetSmallFont(ComboBoxShape->Font); SetSmallFont(Label1->Font); SetSmallFont(Label2->Font); SetSmallFont(Label3->Font); SetSmallFont(Label4->Font); SetSmallFont(Label6->Font); SetSmallFont(spRun->Font); SetSmallFont(spReArrange->Font); SetSmallFont(LabelFont->Font); SetSmallFont(ButtonFont->Font); SetSmallFont(Edit->Font); ButtonFont->Caption = IDS_FONT; Label1->Caption = IDS_FONT; Label2->Caption = IDS_COMMON_SIZE; Label3->Caption = IDS_SHAPE; Label4->Caption = IDS_INTERVAL; Label6->Caption = IDS_TUNNELCOUNT; CheckBox1->Caption = IDS_CONTINUOUS; CheckBox2->Caption = IDS_COMMON_REPEAT; spRun->Caption = IDS_RUNTUNNEL; spReArrange->Caption = IDS_REARRANGE; ComboBoxShape->Items->Clear(); ComboBoxShape->Items->Add(IDS_HORV); ComboBoxShape->Items->Add(IDS_COMMON_OBLIQUE); ComboBoxShape->Items->Add(IDS_CIRCLE); ComboBoxShape->Items->Add(IDS_TUNNEL); ComboBoxShape->Items->Add(IDS_COMMON_CURVE); //============================================= by hjs ³ªÁß¿¡ tdw ÆÄÀÏÀ» º¯°æÇؾßÇÔ... // ComboBoxShape->Items->Add(IDS_VER); // ¼öÁ÷¾²±â Àü¿ë //============================================== ButtonOK->Caption = IDS_COMMON_BUTTONOK; #ifdef JAPAN Edit->Text = "AlphaGear"; #endif //=========================================================== } //--------------------------------------------------------------------------- void __fastcall TTextForm::FormCreate(TObject *Sender) { // } //--------------------------------------------------------------------------- void __fastcall TTextForm::seHeightChange(TObject *Sender) { double rval; int DPI = MainImageForm->CanvasInfor.DotsPerInch; if (seHeight->Text.Length()>0) { if (seHeight->Value < 0) { ChangeValue(int(DPI/2.54)); } FHeight = ConvertToDot(seHeight->Value); if (SizeItem == 0) { MainImageForm->iMainImage->Canvas->Font->Size = FHeight; } GetTextMetrics(MainImageForm->iMainImage->Canvas->Handle, &TextMetric); } /* // Old Version if (seHeight->Text.Length()>0) { if (seHeight->Value < 0) seHeight->Value = 0; DPI = MainImageForm->CanvasInfor.DotsPerInch; FHeight = int(seHeight->Value*DPI/2.54); if (SizeItem == 0) { MainImageForm->iMainImage->Canvas->Font->Size = FHeight; } GetTextMetrics(MainImageForm->iMainImage->Canvas->Handle, &TextMetric); UpdateMenu(); } */ } //--------------------------------------------------------------------------- void __fastcall TTextForm::seIntervalChange(TObject *Sender) { if (seInterval->Text.Length()>0) { if (seInterval->Value < 0) seInterval->Value = 0; GetTextMetrics(MainImageForm->iMainImage->Canvas->Handle, &TextMetric); } } //--------------------------------------------------------------------------- void __fastcall TTextForm::ButtonFontClick(TObject *Sender) { FontDialog->Font->Assign(MainImageForm->iMainImage->Canvas->Font); if (FontDialog->Execute()) { MainImageForm->iMainImage->Canvas->Font->Assign(FontDialog->Font); // MainImageForm->iMainImage->Canvas->Font->PixelsPerInch = FontDialog->Font->PixelsPerInch; GetTextMetrics(MainImageForm->iMainImage->Canvas->Handle, &TextMetric); IsPosition(); //Edit->SetFocus(); View(); EditChange(NULL); } } //--------------------------------------------------------------------------- void __fastcall TTextForm::ComboBoxShapeChange(TObject *Sender) { pstore->Clear(); if(ComboBoxShape->ItemIndex == 3) { if (SizeItem>0) { Shape = ComboBoxShape->ItemIndex; } else { ShowMessage(IDS_MESSAGE_NOTTUNNEL); //lhskys ¿¡·¯ ¸Þ¼¼Áö Áß Fix size »èÁ¦ ComboBoxShape->ItemIndex = Shape; } } else if(ComboBoxShape->ItemIndex == 4) { if(SizeItem==1) Shape = ComboBoxShape->ItemIndex; else { ShowMessage(IDS_MESSAGE_NOTCURVE); ComboBoxShape->ItemIndex = Shape; } } else { Shape = ComboBoxShape->ItemIndex; } if(ComboBoxShape->ItemIndex == 4&&SizeItem==1) CheckBox1->Enabled=true; else CheckBox1->Enabled=false; CheckBox2->Enabled=CheckBox1->Enabled; MainImageForm->ResetDraw(true); UpdateMenu(); Step = 0; bPosition = false; IsPosition(); } //--------------------------------------------------------------------------- void __fastcall TTextForm::EditChange(TObject *Sender) { int tnt=0; if (OSVERSION < 2) { // win 98, win 95, win 3.1 if (SizeItem == 0) { if (bPosition) { CursorOldPos = CursorNewPos; CursorNewPos = Edit->SelStart; if (Shape == 2) ViewCircle(); else ViewOblique(); } } } else { // NT, win 2000 if (SizeItem == 0) { if (bPosition) { CursorOldPos = CursorNewPos; tnt = Edit->SelStart; if ((tnt - CursorNewPos) % 2) { // Language = English CursorNewPos = tnt; } else { // Language = Koran CursorNewPos = tnt-2; } if (Shape == 2) ViewCircle(); else ViewOblique(); } } } } //--------------------------------------------------------------------------- void __fastcall TTextForm::EditClick(TObject *Sender) { Edit->SetFocus(); } //--------------------------------------------------------------------------- void __fastcall TTextForm::ButtonOKClick(TObject *Sender) { ///* //BeConverted by linuxjun Don't Forget!! Undo_Method bool undoSw = false; THistoryData *ud; int ec = EC_NONE; if(Shape!=4)DeleteText(); if(Shape==4){ Curve_TextOut(pstore); } if (MainImageForm->AutoRepeat && (MainImageForm->LayerCNT == MainImageForm->ARLayerCnt)) MainImageForm->RedrawingRepeat(false, false); //2001.6.19 by lhskys autorepeat if ((undoSw = MainImageForm->UndoSave(UK_PATTERN, Rect(0, 0, 0, 0))) == false) { ec = EC_MEMORY_LACK; goto fail; } if ((ud = MainImageForm->Undo->GetLast())==NULL) { ec = EC_UNDO_NONE; goto fail; } MainImageForm->iMainImage->uBitmap->PartialUndo->LoadLast(ud->FromRgb); // Original = ud->uBitmap; Original = ud->uBitmap; //by linuxjun // if (ud->LayerMask) OrigMask = ud->LayerMask; if (ud->LayerMask) { OrigMask = ud->LayerMask; //by linuxjun MainImageForm->iMainImage->LayerMask->PartialUndo->LoadLast(ud->FromRgb); } else OrigMask = NULL; Step = 0; bPosition = false; IsPosition(); MainImageForm->ResetDraw(); ::RepaintImage(); rgSize->SetFocus(); return; fail: if (undoSw == true) MainImageForm->Undo->RemoveLast(); EXCEPTION_MESSAGE_OK(ec); /* //BeConverted by linuxjun Don't Forget!! Undo_Method bool undoSw = false; TUndoData *ud; int ec = EC_NONE; if(Shape!=4)DeleteText(); if(Shape==4){ Curve_TextOut(pstore); } if ((undoSw = MainImageForm->UndoSave(UK_PATTERN, Rect(0, 0, MainImageForm->iMainImage->uBitmap->Width, MainImageForm->iMainImage->uBitmap->Height))) == false) { ec = EC_MEMORY_LACK; goto fail; } if ((ud = Undo->Last)==NULL) { ec = EC_UNDO_NONE; goto fail; } Original = ud->Bitmap; if (ud->LayerMask) OrigMask = ud->LayerMask; else OrigMask = NULL; Step = 0; bPosition = false; IsPosition(); MainImageForm->ResetDraw(); if (MainImageForm->AutoRepeat && (MainImageForm->LayerCNT == MainImageForm->ARLayerCnt)) MainImageForm->RedrawingRepeat(false, false); //2001.6.19 by lhskys autorepeat ::RepaintImage(); rgSize->SetFocus(); return; fail: if (undoSw == true) Undo->RemoveLast(); EXCEPTION_MESSAGE_OK(ec); */ } //--------------------------------------------------------------------------- void __fastcall TTextForm::Timer200msTimer(TObject *Sender) { int tnt; if (OSVERSION < 2) { // win 98, win 95, win 3.1 if (SizeItem == 0) { if (bPosition && CursorNewPos!=Edit->SelStart) { CursorOldPos = CursorNewPos; CursorNewPos = Edit->SelStart; if (Shape==2) ViewCircle(); else ViewOblique(); } } } else { // NT, win 2000 if (SizeItem == 0) { if (bPosition && CursorNewPos!=Edit->SelStart) { CursorOldPos = CursorNewPos; tnt = Edit->SelStart; if ((tnt - CursorNewPos) % 2) { // Language = English CursorNewPos = tnt; } else { // Language = Korean CursorNewPos = tnt - 2; } if (Shape==2) ViewCircle(); else ViewOblique(); } } } /* if (SizeItem == 0) { if (bPosition && CursorNewPos!=Edit->SelStart) { CursorOldPos = CursorNewPos; CursorNewPos = Edit->SelStart; if (Shape==2) ViewCircle(); else ViewOblique(); } } */ } //--------------------------------------------------------------------------- void __fastcall TTextForm::EditKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { //======================================= by hjs(jons) /* LANGID langidDefault; // ¼±ÅÃµÈ ¾ð¾î¸¦ ÆÇ´Ü langidDefault = GetSystemDefaultLangID(); */ //{T_VEng, T_HEng, T_HKor } TDLang int k ; k = Pos[1].x - Pos[0].x ; if (k==0) { // ¼öÁ÷ ¾²±â ÇÒ °æ¿ì lang = T_Ver; } // English else { // ¼öÆò¾²±â ÇÒ°æ¿ì lang = T_Hor; if(intvc) { seInterval->Value = oldintv ; intvc = false; } } //==================================================== /* if (SizeItem == 0) { //2001.7.21 lhskys ¹®ÀÚ¿¡¼­ if (Key == VK_RETURN) { //µÎ¹ø undosaveµÇ´Â°ÍÀ» ó¸®ÇϱâÀ§ÇÏ¿© ¸·À½ ButtonOKClick(ButtonOK); } } */ } //--------------------------------------------------------------------------- // Private Method //--------------------------------------------------------------------------- void __fastcall TTextForm::DeleteText() { TTextData *td; while (Text->Count>0) { td = (TTextData *)Text->First(); if (td->hMem) GlobalFree(td->hMem); HeapFree(GetProcessHeap(), 0, td); Text->Remove(td); } if (SizeItem == 0) Edit->Text = ""; } //--------------------------------------------------------------------------- void __fastcall TTextForm::UpdateMenu() { if (TextMetric.tmPitchAndFamily&TMPF_TRUETYPE) { ComboBoxShape->Enabled = true; seInterval->Enabled = true; rgSize->Enabled = true; if (SizeItem == 0) { seHeight->Enabled = true; seTCnt->Enabled = false; spReArrange->Enabled = false; if (bPosition) { Edit->Enabled = true; ButtonOK->Enabled = true; } else { Edit->Enabled = false; ButtonOK->Enabled = false; } } else if (SizeItem == 1) { seHeight->Enabled = true; seTCnt->Enabled = false; Edit->Enabled = true; spRun->Enabled = false; if (bPosition) { spReArrange->Enabled = true; ButtonOK->Enabled = true; } else { spReArrange->Enabled = false; ButtonOK->Enabled = false; } } else { seHeight->Enabled = false; Edit->Enabled = true; if (bPosition) { ButtonOK->Enabled = true; spReArrange->Enabled = true; } else { ButtonOK->Enabled = false; spReArrange->Enabled = false; } if (Shape == 3) { spRun->Enabled = true; seTCnt->Enabled = true; } else { spRun->Enabled = false; seTCnt->Enabled = false; } } } else { ComboBoxShape->Enabled = false; seInterval->Enabled = false; rgSize->Enabled = false; seHeight->Enabled = false; seTCnt->Enabled = false; spReArrange->Enabled = false; Edit->Enabled = false; ButtonOK->Enabled = false; spRun->Enabled = false; Step = 0; } } //--------------------------------------------------------------------------- void __fastcall TTextForm::View() { int fs; LabelFont->Caption = MainImageForm->iMainImage->Canvas->Font->Name; if (SizeItem == 0) fs = MainImageForm->iMainImage->Canvas->Font->Size; else fs = FHeight; ChangeValue(fs); UpdateMenu(); } //--------------------------------------------------------------------------- TList *__fastcall TTextForm::MakeTextList() { TList *tl = NULL; int i, j, k, l, m; TTextData *ntd = NULL, *otd; if ((tl = new TList)==NULL) return NULL; for (i=1; i<=Edit->Text.Length(); i++) { if ((ntd = (TTextData *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TTextData))) == NULL) goto fail; if (ntd) { ntd->c = (Byte)Edit->Text[i]; if (IsDBCSLeadByte(ntd->c)) { i++; ntd->c = (ntd->c<<8)|(Byte)Edit->Text[i]; } ntd->pos = i; ntd->hMem = 0; ntd->color = -1; tl->Add(ntd); } } m = CursorOldPos>CursorNewPos ? CursorNewPos : CursorOldPos; i = 0; while (iCount) { otd = (TTextData *)Text->Items[i]; j = otd->pos; if (j>m) break; ntd = (TTextData *)tl->Items[i]; if (otd->c!=ntd->c) break; ntd->gm = otd->gm; ntd->hMem = otd->hMem; otd->hMem = 0; ntd->color = otd->color; i++; } k = tl->Count-1; if (k>i) { l = Text->Count-1; while (l>=i && k>=0) { otd = (TTextData *)Text->Items[l]; ntd = (TTextData *)tl->Items[k]; if (otd->c==ntd->c) { j = otd->pos; // if (j>=((TTextData *)(Text->Last()))->pos-(((TTextData *)(tl->Last()))->pos-CursorNewPos)) { if (j > ((TTextData *)(Text->Last()))->pos-(((TTextData *)(tl->Last()))->pos-CursorNewPos)) { ntd->gm = otd->gm; ntd->hMem = otd->hMem; otd->hMem = 0; } //} ntd->color = otd->color; } l--; k--; } } return tl; fail: EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); return NULL; } //--------------------------------------------------------------------------- TList *__fastcall TTextForm::FHMakeTextList() { TList *tl = NULL; int i; TTextData *ntd = NULL; if ((tl = new TList)==NULL) return NULL; for (i=1; i<=Edit->Text.Length(); i++) { if ((ntd = (TTextData *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TTextData))) == NULL) goto fail; if (ntd) { ntd->c = (Byte)Edit->Text[i]; if (IsDBCSLeadByte(ntd->c)) { i++; ntd->c = (ntd->c<<8)|(Byte)Edit->Text[i]; } ntd->pos = i; ntd->hMem = 0; ntd->color = -1; tl->Add(ntd); } } return tl; fail: EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); return NULL; } //--------------------------------------------------------------------------- void __fastcall TTextForm::ObliqueFont(TTextData *td, int sx, int sy, Byte *fbm) { TPItemImage *Image; int l, fx, fy, xx, yy; unsigned x, y; Byte *dst, *lp; COLORREF c = td->color; Image = MainImageForm->iMainImage; fx = sx+td->gm.gmptGlyphOrigin.x; fy = sy-td->gm.gmptGlyphOrigin.y; l = ((td->gm.gmBlackBoxX+31)>>5)<<2; if (Image->uBitmap->BitsPerPixel==8) { if (Image->LayerMask) { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy); lp = Image->LayerMask->GetScanLine(yy); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 dst[xx] = c;//////adsfadsf_Variable_Checked if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 lp[xx] = 0;//////adsfadsf_Variable_Checked } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf Image->LayerMask->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } else { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 dst[xx] = c;//////adsfadsf_Variable_Checked } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } } else { if (Image->LayerMask) { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy)+3*fx; lp = Image->LayerMask->GetScanLine(yy); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++, dst+=3) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 SetPixel24(dst, c);//////adsfadsf_Variable_Checked if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *(lp + (xx>>3)) &= ~(0x80 >> (xx&7));//////adsfadsf_Variable_Checked } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf Image->LayerMask->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } else { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy)+3*fx; int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++, dst+=3) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 SetPixel24(dst, c);//////adsfadsf_Variable_Checked } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } } } //--------------------------------------------------------------------------- void __fastcall TTextForm::ViewOblique() { TPItemImage *Image; TList *tl = NULL; //============================= by hjs double Theta, sx, sy, tmp; // tmp : °¢µµ¸¦ Àӽà ÀúÀåÇϱâ À§ÇØ »ç¿ë //============================= DWORD dwRet; void *lpBuf = NULL; int i, j, k, l, fx, fy, xx, yy, width; unsigned int x, y; Byte *fbm = NULL, *src, *dst, *lp, *slp; MAT2 m2; TTextData *td; int olddist, Width, Height, DPI; int ec = EC_NONE; double ssx, ssy; THistoryData * ud; #if defined(KNIT) Width = MainImageForm->iMainImage->ArrayBitmap[0].Width; Height = MainImageForm->iMainImage->ArrayBitmap[0].Height; #else Width = MainImageForm->iMainImage->uBitmap->Width; Height = MainImageForm->iMainImage->uBitmap->Height; #endif olddist = newdist; DPI = MainImageForm->CanvasInfor.DotsPerInch; //======================================= by hjs // if ( lang == T_Ver ) { // if ( seInterval->Value < 0.7 ) { // ¿µ¾î·Î ¼¼·Î¾²±â ÇÒ °æ¿ì Çѱ۰ú ´Þ¸® ±ÛÀÚ¸¶´Ù À§Ä¡°¡ ´Þ¶ó // oldintv = seInterval->Value; // ƯÈ÷ Á߽ɾƷ¡·Î ³»·Á°¡´Â ¼Ò¹®ÀÚÀÇ °æ¿ì °ãÃÄÁö´Â Çö»óÀ» ¸·±âÀ§ÇØ // seInterval->Value = 0.7; // °£°ÝÀ» µÎ¾úÀ½... // intvc = true; // } // } //======================================= newdist = ConvertToDot(seInterval->Value); Image = MainImageForm->iMainImage; // try{ if(Pos[1].y!=Pos[0].y || Pos[1].x!=Pos[0].x) Theta = -atan2(Pos[1].y-Pos[0].y, Pos[1].x-Pos[0].x); // }catch(Exception &exception){ else Theta = 0; //} if (Theta<0) Theta = Theta+2*M_PI; if (Original == NULL) { return; } else { if (!(Original->StartUndoScanLine())) {ec = EC_MEMORY_LACK; goto fail;} if (OrigMask) { if (!(OrigMask->StartUndoScanLine())) {ec = EC_MEMORY_LACK; goto fail;} } } if (!(Image->uBitmap->StartScanLine())) {ec = EC_MEMORY_LACK; goto fail;} if (Image->LayerMask) { if (!(Image->LayerMask->StartScanLine())) {ec = EC_MEMORY_LACK; goto fail;} } k = CursorOldPos>CursorNewPos ? CursorNewPos : CursorOldPos; sx = Pos[0].x; sy = Pos[0].y; for (i=0; iCount; i++) { if ((ud = MainImageForm->Undo->GetLast())==NULL) { ec = EC_UNDO_NONE; goto fail; } //////////////// ////////////////// MainImageForm->iMainImage->uBitmap->StopUndoScanLine(); MainImageForm->iMainImage->uBitmap->PartialUndo->LoadLast(ud->FromRgb); MainImageForm->iMainImage->uBitmap->StartUndoScanLine(); // if (ud->LayerMask&&Image->LayerMask) if (ud->LayerMask) { MainImageForm->iMainImage->LayerMask->StopUndoScanLine(); MainImageForm->iMainImage->LayerMask->PartialUndo->LoadLast(ud->FromRgb); MainImageForm->iMainImage->LayerMask->StartUndoScanLine(); } td = (TTextData *)Text->Items[i]; width = sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX+td->gm.gmCellIncY*td->gm.gmCellIncY); if (td->pos>k) { if ((lpBuf = GlobalLock(td->hMem)) == NULL) {ec = EC_MEMORY_LACK; goto fail;} fbm = (Byte *)lpBuf; fx = sx+td->gm.gmptGlyphOrigin.x; fy = sy-td->gm.gmptGlyphOrigin.y; l = ((td->gm.gmBlackBoxX+31)>>5)<<2; if (Image->uBitmap->BitsPerPixel==8) { if (Image->LayerMask) { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy); lp = Image->LayerMask->GetScanLine(yy); src = Original->GetUndoScanLine(yy); slp = OrigMask->GetUndoScanLine(yy); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 dst[xx] = src[xx];//////adsfadsf_Variable_Checked if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 lp[xx] = slp[xx];//////adsfadsf_Variable_Checked } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf Image->LayerMask->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } else { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy); src = Original->GetUndoScanLine(yy); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 dst[xx] = src[xx];//////adsfadsf_Variable_Checked } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } } else { if (Image->LayerMask) { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy)+3*fx; lp = Image->LayerMask->GetScanLine(yy); src = Original->GetUndoScanLine(yy)+3*fx; slp = OrigMask->GetUndoScanLine(yy); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++, src+=3, dst+=3) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 CopyPixel24(dst, src);//////adsfadsf_Variable_Checked if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 if (slp[xx>>3] & (0x80 >> (xx&7))) {//////adsfadsf_Variable_Checked if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *(lp + (xx>>3)) |= 0x80 >> (xx&7);//////adsfadsf_Variable_Checked } else { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *(lp + (xx>>3)) &= ~(0x80 >> (xx&7));//////adsfadsf_Variable_Checked } } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf Image->LayerMask->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } else { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy)+3*fx; src = Original->GetUndoScanLine(yy)+3*fx; int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++, src+=3, dst+=3) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 CopyPixel24(dst, src);//////adsfadsf_Variable_Checked } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } } GlobalUnlock(td->hMem); lpBuf = NULL; fbm = NULL; } sx += (width+olddist)*cos(Theta); sy -= (width+olddist)*sin(Theta); } if ((tl = MakeTextList()) == NULL) {ec = EC_MEMORY_LACK; goto fail;} //============================================ by hjs switch( lang ) { // case T_Ver : tmp = Theta+M_PI/2; // ¼öÁ÷¹æÇâ ¿µ¾îÇ¥±â¸¦ À§ÇØ ... // break; case T_Hor : tmp = Theta; // ¼öÆò¹æÇâ ¿µ¾îÇ¥±â¸¦ À§ÇØ ... break; default : tmp = Theta; } m2.eM11 = FixedFormDouble(cos(tmp)); m2.eM12 = FixedFormDouble(sin(tmp)); m2.eM21 = FixedFormDouble(-sin(tmp)); m2.eM22 = FixedFormDouble(cos(tmp)); //============================================ sx = Pos[0].x; sy = Pos[0].y; Cursor[0].x = sx-TextMetric.tmDescent*cos(Theta+M_PI/2); Cursor[0].y = sy+TextMetric.tmDescent*sin(Theta+M_PI/2); Cursor[1].x = Cursor[0].x+TextMetric.tmHeight*cos(Theta+M_PI/2); Cursor[1].y = Cursor[0].y-TextMetric.tmHeight*sin(Theta+M_PI/2); /*============================================================ by hjs Cursor[0].x = sx-TextMetric.tmDescent*cos(Theta+M_PI); Cursor[0].y = sy+TextMetric.tmDescent*sin(Theta+M_PI); Cursor[1].x = Cursor[0].x+TextMetric.tmHeight*cos(Theta+M_PI); Cursor[1].y = Cursor[0].y-TextMetric.tmHeight*sin(Theta+M_PI); ============================================================*/ for (j=0; jCount; j++) { td = (TTextData *)tl->Items[j]; if (td->hMem) { width = sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX+td->gm.gmCellIncY*td->gm.gmCellIncY); if (td->pos>=k) { if ((lpBuf = GlobalLock(td->hMem)) == NULL) {ec = EC_MEMORY_LACK; goto fail;} ObliqueFont(td, sx, sy, (Byte *)lpBuf); GlobalUnlock(td->hMem); lpBuf = NULL; } } else { if (td->color==-1) { td->color = PaletteForm->DIB256Palette->GetFGCOLORREF(Image->uBitmap->BitsPerPixel); } if ((dwRet = GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, 0, NULL, &m2)) == GDI_ERROR) {ec = EC_FONT_NOSUPPORT; goto fail;} if ((td->hMem = GlobalAlloc(GPTR, dwRet)) == NULL) {ec = EC_MEMORY_LACK; goto fail;} if ((lpBuf = GlobalLock(td->hMem)) == NULL) {ec = EC_MEMORY_LACK; goto fail;} if ((GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, dwRet, lpBuf, &m2)) == GDI_ERROR) {ec = EC_FONT_NOSUPPORT; goto fail;} width = sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX+td->gm.gmCellIncY*td->gm.gmCellIncY); ObliqueFont(td, sx, sy, (Byte *)lpBuf); GlobalUnlock(td->hMem); lpBuf = NULL; } sx += (width+newdist)*cos(Theta); sy -= (width+newdist)*sin(Theta); if (td->pos<=CursorNewPos) { if ((sx>0 && sx0 && syLayerMask) Image->LayerMask->StopScanLine(); Image->uBitmap->StopScanLine(); Original->StopUndoScanLine(); if (OrigMask) OrigMask->StopUndoScanLine(); Image->Repaint(); while (Text->Count) { td = (TTextData *)Text->Last(); if (td->hMem) GlobalFree(td->hMem); HeapFree(GetProcessHeap(), 0, td); Text->Remove(td); } delete Text; Text = tl; return; fail: if (tl) { if (lpBuf) GlobalUnlock(td->hMem); while (tl->Count) { td = (TTextData *)tl->Last(); if (td->hMem) GlobalFree(td->hMem); HeapFree(GetProcessHeap(), 0, td); tl->Remove(td); } } if (Image->LayerMask) Image->LayerMask->StopScanLine(); Image->uBitmap->StopScanLine(); Original->StopUndoScanLine(); if (OrigMask) OrigMask->StopUndoScanLine(); EXCEPTION_MESSAGE_OK(ec); Edit->Text = ""; ButtonOK->Enabled = false; } //--------------------------------------------------------------------------- void __fastcall TTextForm::CircleFont(TTextData *td, double R, double Alpha, Byte *fbm) { TPItemImage *Image; int l, fx, fy, xx, yy; unsigned int x, y; Byte *dst, *lp; COLORREF c = td->color; Image = MainImageForm->iMainImage; fx = Pos[1].x+R*cos(Alpha)+td->gm.gmptGlyphOrigin.x; fy = Pos[1].y-R*sin(Alpha)-td->gm.gmptGlyphOrigin.y; l = ((td->gm.gmBlackBoxX+31)>>5)<<2; if (Image->uBitmap->BitsPerPixel==8) { if (Image->LayerMask) { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy); lp = Image->LayerMask->GetScanLine(yy); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 dst[xx] = c;//////adsfadsf_Variable_Checked if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 lp[xx] = 0;//////adsfadsf_Variable_Checked } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf Image->LayerMask->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } else { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 dst[xx] = c;//////adsfadsf_Variable_Checked } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } } else { if (Image->LayerMask) { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy)+3*fx; lp = Image->LayerMask->GetScanLine(yy); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++, dst+=3) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 SetPixel24(dst, c);//////adsfadsf_Variable_Checked if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *(lp + (xx>>3)) &= ~(0x80 >> (xx&7));//////adsfadsf_Variable_Checked } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf Image->LayerMask->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } else { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy)+3*fx; int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++, dst+=3) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 SetPixel24(dst, c);//////adsfadsf_Variable_Checked } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } } } //--------------------------------------------------------------------------- void __fastcall TTextForm::ViewCircle() { TList *tl = NULL; MAT2 m2; TPItemImage *Image; DWORD dwRet; void *lpBuf = NULL; int i, j, k, l, fx, fy, xx, yy, width, lx, ly; unsigned int x, y; Byte *fbm = NULL, *src, *dst, *lp, *slp; TTextData *td; double Alpha, Theta, R, a; bool cursor, out; int olddist, Width, Height, cx, cy,compx, compy, DPI; int ec = EC_NONE; THistoryData *ud; #if defined(KNIT) Width = MainImageForm->iMainImage->ArrayBitmap[0].Width; Height = MainImageForm->iMainImage->ArrayBitmap[0].Height; #else Width = MainImageForm->iMainImage->uBitmap->Width; Height = MainImageForm->iMainImage->uBitmap->Height; #endif olddist = newdist; DPI = MainImageForm->CanvasInfor.DotsPerInch; newdist = ConvertToDot(seInterval->Value); Image = MainImageForm->iMainImage; lx = Pos[0].x-Pos[1].x; ly = Pos[0].y-Pos[1].y; R = sqrt(lx*lx+ly*ly); // try{ if(ly!=0 || lx!=0) Alpha = -atan2(ly, lx); else // }catch(Exception &exception){ Alpha = 0; // } // Alpha = -atan2(ly, lx); if (Alpha<0) Alpha += 2*M_PI; k = CursorOldPos>CursorNewPos ? CursorNewPos : CursorOldPos; if (Original == NULL) { return; } else { if (!(Original->StartUndoScanLine())) {ec = EC_MEMORY_LACK; goto fail;} if (OrigMask) { if (!(OrigMask->StartUndoScanLine())) {ec = EC_MEMORY_LACK; goto fail;} } } if (!(Image->uBitmap->StartScanLine())) {ec = EC_MEMORY_LACK; goto fail;} if (Image->LayerMask) { if (!(Image->LayerMask->StartScanLine())) {ec = EC_MEMORY_LACK; goto fail;} } for (i=0; iCount; i++) { if ((ud = MainImageForm->Undo->GetLast())==NULL) { ec = EC_UNDO_NONE; goto fail; } /* MainImageForm->iMainImage->uBitmap->StopUndoScanLine(); MainImageForm->iMainImage->uBitmap->PartialUndo->LoadLast(ud->FromRgb); MainImageForm->iMainImage->uBitmap->StartUndoScanLine(); */ MainImageForm->iMainImage->uBitmap->LoadLastUb(ud->FromRgb); // if (ud->LayerMask&&Image->LayerMask) if (ud->LayerMask) { /* MainImageForm->iMainImage->LayerMask->StopUndoScanLine(); MainImageForm->iMainImage->LayerMask->PartialUndo->LoadLast(ud->FromRgb); MainImageForm->iMainImage->LayerMask->StartUndoScanLine(); */ MainImageForm->iMainImage->uBitmap->LoadLastUb(ud->FromRgb); } td = (TTextData *)Text->Items[i]; width = sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX+td->gm.gmCellIncY*td->gm.gmCellIncY); if (td->pos>k && td->hMem) { if ((lpBuf = GlobalLock(td->hMem)) == NULL) {ec = EC_MEMORY_LACK; goto fail;} fbm = (Byte *)lpBuf; fx = Pos[1].x+R*cos(Alpha)+td->gm.gmptGlyphOrigin.x; fy = Pos[1].y-R*sin(Alpha)-td->gm.gmptGlyphOrigin.y; l = ((td->gm.gmBlackBoxX+31)>>5)<<2; if (Image->uBitmap->BitsPerPixel==8) { if (Image->LayerMask) { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy); lp = Image->LayerMask->GetScanLine(yy); src = Original->GetUndoScanLine(yy); slp = OrigMask->GetUndoScanLine(yy); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 dst[xx] = src[xx];//////adsfadsf_Variable_Checked lp[xx] = slp[xx];//////adsfadsf_Variable_Checked } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf Image->LayerMask->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } else { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy); src = Original->GetUndoScanLine(yy); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 dst[xx] = src[xx];//////adsfadsf_Variable_Checked } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } } else { if (Image->LayerMask) { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy)+3*fx; lp = Image->LayerMask->GetScanLine(yy); src = Original->GetUndoScanLine(yy)+3*fx; slp = OrigMask->GetUndoScanLine(yy); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++, src+=3, dst+=3) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 CopyPixel24(dst, src);//////adsfadsf_Variable_Checked if (slp[xx>>3] & (0x80 >> (xx&7))) {//////adsfadsf_Variable_Checked *(lp + (xx>>3)) |= 0x80 >> (xx&7);//////adsfadsf_Variable_Checked } else { *(lp + (xx>>3)) &= ~(0x80 >> (xx&7));//////adsfadsf_Variable_Checked } } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf Image->LayerMask->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } else { for (y=0; ygm.gmBlackBoxY; y++) { yy = fy+y; if (yy>=0 && yyuBitmap->Height) { dst = Image->uBitmap->GetScanLine(yy)+3*fx; src = Original->GetUndoScanLine(yy)+3*fx; int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=0; xgm.gmBlackBoxX; x++, src+=3, dst+=3) { //////adsfadsf_for xx = fx+x; if (xx>=0 && xxuBitmap->Width) { if (fbm[x>>3]&(0x80>>(x&7))) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 //7_22¿¡·¯ ¼öÁ¤À» À§ÇØ ÇÊ¿äÇѺκРCopyPixel24(dst, src); } } } Image->uBitmap->PutScanLine(yy,StartX+fx,EndX-StartX+1); ////adsfadsf } fbm += l; } } } GlobalUnlock(td->hMem); lpBuf = NULL; fbm = NULL; } Alpha -= (width+olddist)/R; if (Alpha<0) Alpha += 2*M_PI; } if ((tl = MakeTextList()) == NULL) {ec = EC_MEMORY_LACK; goto fail;} // try{ if(ly!=0 || lx!=0) Alpha = -atan2(ly, lx); // }catch(Exception &exception){ else Alpha = 0; // } // Alpha = -atan2(ly, lx); if (Alpha<0) Alpha += 2*M_PI; a = 0; Cursor[0].x = Pos[1].x+(R-TextMetric.tmDescent)*cos(Alpha); Cursor[0].y = Pos[1].y-(R-TextMetric.tmDescent)*sin(Alpha); Cursor[1].x = Cursor[0].x+TextMetric.tmHeight*cos(Alpha); Cursor[1].y = Cursor[0].y-TextMetric.tmHeight*sin(Alpha); for (j=0; jCount; j++) { td = (TTextData *)tl->Items[j]; if (td->hMem) { width = sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX+td->gm.gmCellIncY*td->gm.gmCellIncY); if (td->pos>=k) { GlobalFree(td->hMem); Theta = Alpha-M_PI/2; if (Theta<0) Theta += 2*M_PI; /*//======================================= by hjs <= À̺κÐÀÇ °¢µµ¸¦ º¯°æ½ÃŰ¸é ¿ø¾ÈÂÊÀ¸·Î ±ÛÀ̽áÁöÁö¾ÊÀ»±î? m2.eM11 = FixedFormDouble(cos(Theta + M_PI)); m2.eM12 = FixedFormDouble(sin(Theta + M_PI)); m2.eM21 = FixedFormDouble(-sin(Theta + M_PI)); m2.eM22 = FixedFormDouble(cos(Theta + M_PI));*/ //========================================= by lhskys ´Ù½Ãº¹±¸ m2.eM11 = FixedFormDouble(cos(Theta)); m2.eM12 = FixedFormDouble(sin(Theta)); m2.eM21 = FixedFormDouble(-sin(Theta)); m2.eM22 = FixedFormDouble(cos(Theta)); //========================================= if ((dwRet = GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, 0, NULL, &m2)) == GDI_ERROR) {ec = EC_FONT_NOSUPPORT; goto fail;} if ((td->hMem = GlobalAlloc(GPTR, dwRet)) == NULL) goto fail; if ((lpBuf = GlobalLock(td->hMem)) == NULL) {ec = EC_MEMORY_LACK; goto fail;} if ((GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, dwRet, lpBuf, &m2)) == GDI_ERROR) {ec = EC_FONT_NOSUPPORT; goto fail;} width = sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX+td->gm.gmCellIncY*td->gm.gmCellIncY); if (a+(width+newdist)/R<2*M_PI) { CircleFont(td, R, Alpha, (Byte *)lpBuf); GlobalUnlock(td->hMem); lpBuf = NULL; cursor = true; } else { GlobalUnlock(td->hMem); lpBuf = NULL; GlobalFree(td->hMem); td->hMem = 0; cursor = false; } } else { cursor = true; } } else { if (td->color==-1) { td->color = PaletteForm->DIB256Palette->GetFGCOLORREF(Image->uBitmap->BitsPerPixel); } Theta = Alpha-M_PI/2; if (Theta<0) Theta += 2*M_PI; /*//========================================== by hjs À̺κÐÀÇ °¢µµ¸¦ º¯°æ½ÃŰ¸é ¿ø¾ÈÂÊÀ¸·Î ±ÛÀÌ ½áÁöÁö ¾ÊÀ»·±Áö m2.eM11 = FixedFormDouble(cos(Theta + M_PI)); m2.eM12 = FixedFormDouble(sin(Theta + M_PI)); m2.eM21 = FixedFormDouble(-sin(Theta + M_PI)); m2.eM22 = FixedFormDouble(cos(Theta + M_PI));*/ //========================================= by lhskys ´Ù½Ãº¹±¸ m2.eM11 = FixedFormDouble(cos(Theta)); m2.eM12 = FixedFormDouble(sin(Theta)); m2.eM21 = FixedFormDouble(-sin(Theta)); m2.eM22 = FixedFormDouble(cos(Theta)); //========================================= if ((dwRet = GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, 0, NULL, &m2)) == GDI_ERROR) {ec = EC_FONT_NOSUPPORT; goto fail;} if ((td->hMem = GlobalAlloc(GPTR, dwRet)) == NULL) {ec = EC_MEMORY_LACK; goto fail;} if ((lpBuf = GlobalLock(td->hMem)) == NULL) {ec = EC_MEMORY_LACK; goto fail;} if ((GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, dwRet, lpBuf, &m2)) == GDI_ERROR) {ec = EC_FONT_NOSUPPORT; goto fail;} width = sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX+td->gm.gmCellIncY*td->gm.gmCellIncY); if (a+(width+newdist)/R<2*M_PI) { CircleFont(td, R, Alpha, (Byte *)lpBuf); GlobalUnlock(td->hMem); lpBuf = NULL; cursor = true; } else { GlobalUnlock(td->hMem); lpBuf = NULL; GlobalFree(td->hMem); td->hMem = 0; cursor = false; } } Alpha -= (width+newdist)/R; if (Alpha<0) Alpha += 2*M_PI; a += (width+newdist)/R; if (cursor) { if (td->pos<=CursorNewPos) { Cursor[0].x = Pos[1].x+(R-TextMetric.tmDescent)*cos(Alpha); Cursor[0].y = Pos[1].y-(R-TextMetric.tmDescent)*sin(Alpha); Cursor[1].x = Cursor[0].x+TextMetric.tmHeight*cos(Alpha); Cursor[1].y = Cursor[0].y-TextMetric.tmHeight*sin(Alpha); if ((Cursor[1].x>0 && Cursor[1].x0 && Cursor[1].yLayerMask) Image->LayerMask->StopScanLine(); Image->uBitmap->StopScanLine(); Original->StopUndoScanLine(); if (OrigMask) OrigMask->StopUndoScanLine(); Image->Repaint(); while (Text->Count) { td = (TTextData *)Text->Last(); if (td->hMem) GlobalFree(td->hMem); HeapFree(GetProcessHeap(), 0, td); Text->Remove(td); } delete Text; Text = tl; return; fail: if (tl) { if (lpBuf) GlobalUnlock(td->hMem); while (tl->Count) { td = (TTextData *)tl->Last(); if (td->hMem) GlobalFree(td->hMem); HeapFree(GetProcessHeap(), 0, td); tl->Remove(td); } } if (Image->LayerMask) Image->LayerMask->StopScanLine(); Image->uBitmap->StopScanLine(); if (OrigMask) OrigMask->StopUndoScanLine(); EXCEPTION_MESSAGE_OK(ec); Edit->Text = ""; ButtonOK->Enabled = false; } //--------------------------------------------------------------------------- void __fastcall TTextForm::DrawLocate() { POINT l; double r; MainImageForm->ResetDraw(); if (Shape==2) { l.x = Pos[1].x-Pos[0].x; l.y = Pos[1].y-Pos[0].y; r = sqrt(l.x*l.x+l.y*l.y); MainImageForm->DrawEllipseLocate(Rect(Pos[1].x-r, Pos[1].y-r, Pos[1].x+r, Pos[1].y+r)); } else { MainImageForm->DrawLineLocate(Pos[0], Pos[1]); } } //--------------------------------------------------------------------------- void __fastcall TTextForm::IsPosition() { if (SizeItem == 0) { if (bPosition) { Edit->Enabled = true; Edit->SetFocus(); ButtonOK->Enabled = true; } else { Edit->Enabled = false; ButtonOK->Enabled = false; } } else { if (bPosition) { ButtonOK->Enabled = true; spReArrange->Enabled = true; spRun->Enabled = false; if (Shape == 3) { spRun->Enabled = true; spReArrange->Enabled = false; ButtonOK->Enabled = false; } } else { ButtonOK->Enabled = false; spReArrange->Enabled = false; spRun->Enabled = false; } Edit->Enabled = true; Edit->SetFocus(); } } //--------------------------------------------------------------------------- // Public Method //--------------------------------------------------------------------------- bool __fastcall TTextForm::InitForm() { ///* //BeConverted by linuxjun Don't Forget!! Undo_Method pstore = new TList; pstore->Clear(); TIniFile *IniFile = NULL; int ec = EC_NONE; int DPI; double fs = 1.0, fi = 0.0; AnsiString str; bool undoSw = false; THistoryData *ud; OSVERSIONINFO osvi; ParentHeight = Parent->Height+20; ClientHeight = 303; Parent->Height = ParentHeight+ClientHeight; DPI = MainImageForm->CanvasInfor.DotsPerInch; if ((Text = new TList)==NULL) { ec = EC_MEMORY_LACK; goto fail; } IniFile = new TIniFile(DirectoryItem+"\\Text.ini"); if (IniFile) { MainImageForm->iMainImage->Canvas->Font->Name = IniFile->ReadString("Font", "Name", DefaultFontName); fs = IniFile->ReadFloat("Font", "Size", 1.0); fi = IniFile->ReadFloat("Font", "Interval", 0.0); str = IniFile->ReadString("Font", "Unit", "Cm"); seHeight->Value = fs; seInterval->Value = fi; rxHeight->Caption = str; rxInterval->Caption = str; if (str == "Dot") { Unit = 0; seHeight->Increment = 1; seInterval->Increment = 1; } else if (str == "Inch") { fs = fs*DPI; Unit = 1; seHeight->Increment = 0.1; seInterval->Increment = 0.1; } else { fs = fs*DPI/2.54; Unit = 2; seHeight->Increment = 0.1; seInterval->Increment = 0.1; } FHeight = int(fs); MainImageForm->iMainImage->Canvas->Font->Size = FHeight; delete IniFile; } GetTextMetrics(MainImageForm->iMainImage->Canvas->Handle, &TextMetric); Shape = 0; SizeItem = 0; bPosition = false; IsPosition(); Step = 0; newdist = 0; IsDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo IsCursor = true; OSVERSION = 1; // WINDOWS 98 //========================== by hjs intvc = false; oldintv = 0 ; // ¼öÁ÷¹æÇâÀ¸·Î ¿µ¹®Ç¥±â½Ã °­Á¦Àû°£°ÝÀ» »ç¿ëÇϱâÀü ÀÌÀü °£°ÝÀ» ±â¾ïÇϱâÀ§ÇѺ¯¼ö //================================= osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osvi); OSVERSION = osvi.dwPlatformId; CursorOldPos = CursorNewPos = 0; // Undo->Maximum++; // 2001.8.8 By GreenFish Ä«¿îÆ® ÀÌ»ó¹®Á¦ ÇØ°á //blocked by linuxjun For New Undo_Method /* if ((undoSw = MainImageForm->UndoSave(UK_PATTERN, Rect(0, 0, MainImageForm->iMainImage->uBitmap->Width, MainImageForm->iMainImage->uBitmap->Height))) == false) { ec = EC_MEMORY_LACK; goto fail; }*/ if ((undoSw = MainImageForm->UndoSave(UK_PATTERN, Rect(0, 0,0,0))) == false) { ec = EC_MEMORY_LACK; goto fail; } if ((ud = MainImageForm->Undo->GetLast())==NULL) { ec = EC_UNDO_NONE; goto fail; } MainImageForm->iMainImage->uBitmap->PartialUndo->LoadLast(ud->FromRgb); // Original = ud->uBitmap; Original = ud->uBitmap; if (ud->LayerMask) { MainImageForm->iMainImage->LayerMask->PartialUndo->LoadLast(ud->FromRgb); OrigMask = ud->LayerMask; } else OrigMask = NULL; ComboBoxShape->ItemIndex = Shape; //======================================= // View(); ------> ´ë½Å¿¡ ¹ØÀÇ µÎ ¶óÀÎÀ¸·Î ´ëÄ¡ LabelFont->Caption = MainImageForm->iMainImage->Canvas->Font->Name; UpdateMenu(); //======================================= tcnt = 7; Modify = false; spRun->Enabled = false; MainImageForm->iMainImage->OnPaintZoom = DrawTunnel; if(ComboBoxShape->ItemIndex == 4&&SizeItem==1) CheckBox1->Enabled=true; else CheckBox1->Enabled=false; CheckBox2->Enabled=CheckBox1->Enabled; //======================================= return true; fail: if (undoSw == true) MainImageForm->Undo->RemoveLast(); EXCEPTION_MESSAGE_OK(ec); return false; /* //BeConverted by linuxjun Don't Forget!! Undo_Method pstore = new TList; pstore->Clear(); TIniFile *IniFile = NULL; int ec = EC_NONE; int DPI; double fs = 1.0, fi = 0.0; AnsiString str; bool undoSw = false; TUndoData *ud; OSVERSIONINFO osvi; ParentHeight = Parent->Height+20; ClientHeight = 303; Parent->Height = ParentHeight+ClientHeight; DPI = MainImageForm->CanvasInfor.DotsPerInch; if ((Text = new TList)==NULL) { ec = EC_MEMORY_LACK; goto fail; } IniFile = new TIniFile(DirectoryItem+"\\Text.ini"); if (IniFile) { MainImageForm->iMainImage->Canvas->Font->Name = IniFile->ReadString("Font", "Name", DefaultFontName); fs = IniFile->ReadFloat("Font", "Size", 1.0); fi = IniFile->ReadFloat("Font", "Interval", 0.0); str = IniFile->ReadString("Font", "Unit", "Cm"); seHeight->Value = fs; seInterval->Value = fi; rxHeight->Caption = str; rxInterval->Caption = str; if (str == "Dot") { Unit = 0; seHeight->Increment = 1; seInterval->Increment = 1; } else if (str == "Inch") { fs = fs*DPI; Unit = 1; seHeight->Increment = 0.1; seInterval->Increment = 0.1; } else { fs = fs*DPI/2.54; Unit = 2; seHeight->Increment = 0.1; seInterval->Increment = 0.1; } FHeight = int(fs); MainImageForm->iMainImage->Canvas->Font->Size = FHeight; delete IniFile; } GetTextMetrics(MainImageForm->iMainImage->Canvas->Handle, &TextMetric); Shape = 0; SizeItem = 0; bPosition = false; IsPosition(); Step = 0; newdist = 0; IsDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo IsCursor = true; OSVERSION = 1; // WINDOWS 98 //========================== by hjs intvc = false; oldintv = 0 ; // ¼öÁ÷¹æÇâÀ¸·Î ¿µ¹®Ç¥±â½Ã °­Á¦Àû°£°ÝÀ» »ç¿ëÇϱâÀü ÀÌÀü °£°ÝÀ» ±â¾ïÇϱâÀ§ÇѺ¯¼ö //================================= osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osvi); OSVERSION = osvi.dwPlatformId; CursorOldPos = CursorNewPos = 0; Undo->Maximum++; // 2001.8.8 By GreenFish Ä«¿îÆ® ÀÌ»ó¹®Á¦ ÇØ°á if ((undoSw = MainImageForm->UndoSave(UK_PATTERN, Rect(0, 0, MainImageForm->iMainImage->uBitmap->Width, MainImageForm->iMainImage->uBitmap->Height))) == false) { ec = EC_MEMORY_LACK; goto fail; } if ((ud = Undo->Last)==NULL) { ec = EC_UNDO_NONE; goto fail; } Original = ud->Bitmap; if (ud->LayerMask) OrigMask = ud->LayerMask; else OrigMask = NULL; ComboBoxShape->ItemIndex = Shape; //======================================= // View(); ------> ´ë½Å¿¡ ¹ØÀÇ µÎ ¶óÀÎÀ¸·Î ´ëÄ¡ LabelFont->Caption = MainImageForm->iMainImage->Canvas->Font->Name; UpdateMenu(); //======================================= tcnt = 7; Modify = false; spRun->Enabled = false; MainImageForm->iMainImage->OnPaintZoom = DrawTunnel; if(ComboBoxShape->ItemIndex == 4&&SizeItem==1) CheckBox1->Enabled=true; else CheckBox1->Enabled=false; CheckBox2->Enabled=CheckBox1->Enabled; //======================================= return true; fail: if (undoSw == true) Undo->RemoveLast(); EXCEPTION_MESSAGE_OK(ec); return false; */ } //--------------------------------------------------------------------------- void __fastcall TTextForm::ExitForm() { int DPI; TIniFile *IniFile; MainImageForm->Undo->UndoRead(); //BeConverted by linuxjun Don't Forget!! Undo_Method // Undo ¼öÁ¤ (Undo->Read ¿¡¼­ Undo->UndoRead·Î) // Undo->Maximum--; //BeConverted by linuxjun Don't Forget!! Undo_Method // Undo ¼öÁ¤ (Undo->Read ¿¡¼­ Undo->UndoRead·Î) // initform¿¡¼­ ¿Ã·ÁÁØ °ªÀ» Á¤»óÈ­ By GreenFish Original = NULL; OrigMask = NULL; DPI = MainImageForm->CanvasInfor.DotsPerInch; IniFile = new TIniFile(DirectoryItem+"\\Text.ini"); if (IniFile) { IniFile->WriteString("Font", "Name", MainImageForm->iMainImage->Canvas->Font->Name); IniFile->WriteFloat("Font", "Size", seHeight->Value ); IniFile->WriteFloat("Font", "Interval", seInterval->Value ); IniFile->WriteString("Font", "Unit", rxHeight->Caption); delete IniFile; } DeleteText(); //================================================================= MainImageForm->iMainImage->OnPaintZoom = NULL; //================================================================= delete Text; pstore->Clear(); MainImageForm->ResetDraw(); ::RepaintImage(); if (MainImageForm->AutoRepeat && (MainImageForm->LayerCNT == MainImageForm->ARLayerCnt)){ //2001.6.19 by lhskys autorepeat MainImageForm->RedrawingRepeat(false, false); ::RepaintImage(); } ::RepaintColor(); //for Updating color in palette //PaletteForm->InitForm(); } //--------------------------------------------------------------------------- void __fastcall TTextForm::iMainImageMouseDown(TMouseButton Button, TShiftState Shift, int X, int Y) { // /* //BeConverted by linuxjun Don't Forget!! Undo_Method POINT l; int length; bool undoSw = false; THistoryData *ud; int ec = EC_NONE; double R, Alpha, Theta; if (Button==mbMiddle || (Shift.Contains(ssShift) && Button==mbLeft)) return; if (Button==mbLeft) { if (SizeItem>0) { if (Edit->Text.Length() <= 0) { ShowMessage(IDS_MESSAGE_WRITESENTENCE); Step = 0; bPosition = false; return; } if(Step == 2) { if (Shape == 2) { FreeArc_TextOut(X, Y); bPosition = true; Step = 0; } else if (Shape == 3) { Modify = ComparePoint(X, Y); } else if (Shape == 4) { if(CheckBox1->Checked==false){ Step =0; MainImageForm->ResetDraw(true);//by jeegeo AddCurve(Pos[0],Pos[1],Point(X,Y),pstore); Curve_TextOut(pstore); } else { Step=1; AddCurve(Pos[0],Pos[1],Point(X,Y),pstore); Pos[0]=Pos[1]; Pos[1]=Point(X,Y); DrawCurve(Pos[0],Pos[1],Point(X,Y),pstore); } } } else if (Step == 1) { if (Shape == 0) { if (abs(X-Pos[0].x) < abs(Y-Pos[0].y)) Pos[1] = Point(Pos[0].x, Y); else Pos[1] = Point(X, Pos[0].y); } else { Pos[1] = Point(X, Y); } switch (Shape) { case 0: case 1: FreeLine_TextOut(); bPosition = true; Step = 0; break; case 2: Step = 2; break; case 3: bPosition = true; Step = 2; if(rgSize->ItemIndex == 1){ Pos[1] = FixTurnelPos(Pos[0],Pos[1]); } Theta = Opp_Point(); Find_Point(Theta); MainImageForm->ResetDraw(true);//by jeegeo break; case 4: Step=2; DrawCurve(Pos[0],Pos[1],Pos[1],pstore); break; } } else { DeleteText(); // MainImageForm->iMainImage->uBitmap->Copy(Original, SRCCOPY); MainImageForm->iMainImage->uBitmap->PartialUndo->LoadUndoWithOutIndexChange(); if (MainImageForm->iMainImage->LayerMask) // MainImageForm->iMainImage->LayerMask->Copy(OrigMask, SRCCOPY); MainImageForm->iMainImage->LayerMask->PartialUndo->LoadUndoWithOutIndexChange(); if (MainImageForm->AutoRepeat && (MainImageForm->LayerCNT == MainImageForm->ARLayerCnt)) MainImageForm->RedrawingRepeat(false, false); //2001.6.19 by lhskys autorepeat ::RepaintImage(); Pos[0] = Point(X, Y); Pos[1] = Pos[0]; bPosition = false; Step = 1; //DrawLocate(); } IsPosition(); } else { if (Step>0) { Pos[1] = Point(X, Y); switch (Shape) { case 0: //case 4: // by hjs Shape =4 ¼öÁ÷¼±¸¸ l.x = Pos[1].x-Pos[0].x; l.y = Pos[1].y-Pos[0].y; if (abs(l.x)iMainImage->uBitmap->Copy(Original, SRCCOPY); MainImageForm->iMainImage->uBitmap->PartialUndo->LoadUndoWithOutIndexChange(); if (MainImageForm->iMainImage->LayerMask) // MainImageForm->iMainImage->LayerMask->Copy(OrigMask, SRCCOPY); MainImageForm->iMainImage->LayerMask->PartialUndo->LoadUndoWithOutIndexChange(); if (MainImageForm->AutoRepeat && (MainImageForm->LayerCNT == MainImageForm->ARLayerCnt)) MainImageForm->RedrawingRepeat(false, false); //2001.6.19 by lhskys autorepeat ::RepaintImage(); Pos[0] = Point(X, Y); Pos[1] = Pos[0]; bPosition = false; Step = 1; } IsPosition(); DrawLocate(); IsDraw = true; IsCursor = bPosition; } } if((Shape==4&&SizeItem==1&&Step==1&&CheckBox1->Checked)||(!CheckBox1->Checked&&Step==0))ButtonOK->Enabled=true; return; fail: EXCEPTION_MESSAGE_OK(ec); /* //BeConverted by linuxjun Don't Forget!! Undo_Method POINT l; int length; bool undoSw = false; TUndoData *ud; int ec = EC_NONE; double R, Alpha, Theta; if (Button==mbMiddle || (Shift.Contains(ssShift) && Button==mbLeft)) return; if (Button==mbLeft) { if (SizeItem>0) { if (Edit->Text.Length() <= 0) { ShowMessage(IDS_MESSAGE_WRITESENTENCE); Step = 0; bPosition = false; return; } if(Step == 2) { if (Shape == 2) { FreeArc_TextOut(X, Y); bPosition = true; Step = 0; } else if (Shape == 3) { Modify = ComparePoint(X, Y); } else if (Shape == 4) { if(CheckBox1->Checked==false){ Step =0; MainImageForm->ResetDraw(true);//by jeegeo AddCurve(Pos[0],Pos[1],Point(X,Y),pstore); Curve_TextOut(pstore); } else { Step=1; AddCurve(Pos[0],Pos[1],Point(X,Y),pstore); Pos[0]=Pos[1]; Pos[1]=Point(X,Y); DrawCurve(Pos[0],Pos[1],Point(X,Y),pstore); } } } else if (Step == 1) { if (Shape == 0) { if (abs(X-Pos[0].x) < abs(Y-Pos[0].y)) Pos[1] = Point(Pos[0].x, Y); else Pos[1] = Point(X, Pos[0].y); } else { Pos[1] = Point(X, Y); } switch (Shape) { case 0: case 1: FreeLine_TextOut(); bPosition = true; Step = 0; break; case 2: Step = 2; break; case 3: bPosition = true; Step = 2; if(rgSize->ItemIndex == 1){ Pos[1] = FixTurnelPos(Pos[0],Pos[1]); } Theta = Opp_Point(); Find_Point(Theta); MainImageForm->ResetDraw(true);//by jeegeo break; case 4: Step=2; DrawCurve(Pos[0],Pos[1],Pos[1],pstore); break; } } else { DeleteText(); MainImageForm->iMainImage->uBitmap->Copy(Original, SRCCOPY); if (MainImageForm->iMainImage->LayerMask) MainImageForm->iMainImage->LayerMask->Copy(OrigMask, SRCCOPY); if (MainImageForm->AutoRepeat && (MainImageForm->LayerCNT == MainImageForm->ARLayerCnt)) MainImageForm->RedrawingRepeat(false, false); //2001.6.19 by lhskys autorepeat ::RepaintImage(); Pos[0] = Point(X, Y); Pos[1] = Pos[0]; bPosition = false; Step = 1; //DrawLocate(); } IsPosition(); } else { if (Step>0) { Pos[1] = Point(X, Y); switch (Shape) { case 0: //case 4: // by hjs Shape =4 ¼öÁ÷¼±¸¸ l.x = Pos[1].x-Pos[0].x; l.y = Pos[1].y-Pos[0].y; if (abs(l.x)iMainImage->uBitmap->Copy(Original, SRCCOPY); if (MainImageForm->iMainImage->LayerMask) MainImageForm->iMainImage->LayerMask->Copy(OrigMask, SRCCOPY); if (MainImageForm->AutoRepeat && (MainImageForm->LayerCNT == MainImageForm->ARLayerCnt)) MainImageForm->RedrawingRepeat(false, false); //2001.6.19 by lhskys autorepeat ::RepaintImage(); Pos[0] = Point(X, Y); Pos[1] = Pos[0]; bPosition = false; Step = 1; } IsPosition(); DrawLocate(); IsDraw = true; IsCursor = bPosition; } } if((Shape==4&&SizeItem==1&&Step==1&&CheckBox1->Checked)||(!CheckBox1->Checked&&Step==0))ButtonOK->Enabled=true; return; fail: EXCEPTION_MESSAGE_OK(ec); */ } //--------------------------------------------------------------------------- void __fastcall TTextForm::iMainImageMouseMove(TShiftState Shift, int X, int Y) { POINT l; if (SizeItem) { if (Step == 2) { if (Shape == 2) DrawArc(X, Y); else if (Shape == 3) { if (Modify) { tp[updown][index] = Point(X, Y); MainImageForm->iMainImage->Repaint(); } } else if(Shape==4){ DrawCurve(Pos[0],Pos[1],Point(X,Y),pstore); } } else if (Step == 1) { if(Shape==4){ Pos[1] = Point(X, Y); DrawCurve(Pos[0],Pos[1],Point(X,Y),pstore); return; } if (IsDraw) DrawLocate(); Pos[1] = Point(X, Y); if (Shape == 0) { l.x = Pos[1].x-Pos[0].x; l.y = Pos[1].y-Pos[0].y; if (abs(l.x)0) { if (IsDraw) DrawLocate(); Pos[1] = Point(X, Y); if (Shape == 0 /*|| Shape == 4*/) { // by hjs Shape=4 ¼öÁ÷¼± Ãß°¡ l.x = Pos[1].x-Pos[0].x; l.y = Pos[1].y-Pos[0].y; if (abs(l.x)iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo } //--------------------------------------------------------------------------- void __fastcall TTextForm::DrawCursor() { static bool blink=true; if (SizeItem == 0){ if (bPosition && IsCursor) { MainImageForm->ResetDraw(); if(blink){ MainImageForm->DrawLineLocate(Cursor[0], Cursor[1]); } MainImageForm->iMainImage->Repaint(); } } blink=!blink; } //--------------------------------------------------------------------------- //============================================================================== //********************* New Text ****************************** //============================================================================== void __fastcall TTextForm::seTCntChange(TObject *Sender) { tcnt = seTCnt->Value; } //--------------------------------------------------------------------------- void __fastcall TTextForm::FreeLine_TextOut() { ///* //BeConverted by linuxjun Don't Forget!! Undo_Method int i, cnt, length, tbfl, bfl, width; int sx, sy, DPI, sum_width; int ec = EC_NONE; double theta, vcos, vsin; bool undoSw = false; void *lpBuf = NULL; char *chp; COLORREF c; TList *tl = NULL; TTextData *td; DWORD dwRect; MAT2 m2; AnsiString str = Edit->Text; THistoryData *ud; TPItemImage *Image = MainImageForm->iMainImage; if ((Pos[0].x == Pos[1].x) && (Pos[0].y == Pos[1].y)) theta = 0; else theta = -atan2(Pos[1].y - Pos[0].y, Pos[1].x - Pos[0].x); if (theta < 0) theta += 2*M_PI; DPI = MainImageForm->CanvasInfor.DotsPerInch; bfl = ConvertToDot(seInterval->Value); if (SizeItem == 2) { cnt = str.Length(); tbfl = (cnt - 1)*bfl; length = sqrt((Pos[1].x-Pos[0].x)*(Pos[1].x-Pos[0].x) + (Pos[1].y-Pos[0].y)*(Pos[1].y-Pos[0].y)); FontHeight(length-tbfl); ChangeValue(FHeight); } Image->Canvas->Font->Height = FHeight; if (Shape == 0 ) { if (Pos[0].x == Pos[1].x) { vcos = 0; if (Pos[0].y < Pos[1].y) vsin = -1; else vsin = 1; } else { vsin = 0; if (Pos[0].x < Pos[1].x) vcos = 1; else vcos = -1; } } else { vcos = cos(theta); vsin = sin(theta); } chp = str.c_str(); if ((tl = FHMakeTextList()) == NULL) goto fail; m2.eM11 = FixedFormDouble(vcos); m2.eM12 = FixedFormDouble(vsin); m2.eM21 = FixedFormDouble(-vsin); m2.eM22 = FixedFormDouble(vcos); sx = Pos[0].x; sy = Pos[0].y; sum_width = 0; c = PaletteForm->DIB256Palette->GetFGCOLORREF(Image->uBitmap->BitsPerPixel); Image->uBitmap->StartScanLine(); if (Image->LayerMask) Image->LayerMask->StartScanLine(); for (i=0; iCount; i++) { td = (TTextData *)tl->Items[i]; td->color = c; if ((dwRect = GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, 0, NULL, &m2)) == GDI_ERROR) { ec = EC_FONT_NOSUPPORT; goto fail;} if ((td->hMem = GlobalAlloc(GPTR, dwRect)) == NULL) { ec = EC_MEMORY_LACK; goto fail;} if ((lpBuf = GlobalLock(td->hMem)) == NULL) { ec = EC_MEMORY_LACK; goto fail;} if ((GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, dwRect, lpBuf, &m2)) == GDI_ERROR) { ec = EC_FONT_NOSUPPORT; goto fail;} // width = sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX + td->gm.gmCellIncY*td->gm.gmCellIncY); // sum_width += sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX + td->gm.gmCellIncY*td->gm.gmCellIncY); // current // if (chp[i] & 0x80) // Korean // sum_width += abs(td->gm.gmCellIncX); // else // English sum_width += sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX + td->gm.gmCellIncY*td->gm.gmCellIncY); ObliqueFont(td, sx, sy, (Byte *)lpBuf); GlobalUnlock(td->hMem); lpBuf = NULL; sx = Pos[0].x + (sum_width + (i+1)*bfl)*vcos; sy = Pos[0].y - (sum_width + (i+1)*bfl)*vsin; } if (Image->LayerMask) Image->LayerMask->StopScanLine(); Image->uBitmap->StopScanLine(); MainImageForm->ResetDraw();//by jeegeo Image->Repaint(); while (Text->Count) { td = (TTextData *)Text->Last(); if (td->hMem) GlobalFree(td->hMem); HeapFree(GetProcessHeap(), 0, td); Text->Remove(td); } delete Text; Text = tl; return; fail: if (tl) { if (lpBuf) GlobalUnlock(td->hMem); while (tl->Count) { td = (TTextData *)tl->Last(); if (td->hMem) GlobalFree(td->hMem); HeapFree(GetProcessHeap(), 0, td); tl->Remove(td); } } if (Image->LayerMask) Image->LayerMask->StopScanLine(); Image->uBitmap->StopScanLine(); EXCEPTION_MESSAGE_OK(ec); /* //BeConverted by linuxjun Don't Forget!! Undo_Method int i, cnt, length, tbfl, bfl, width; int sx, sy, DPI, sum_width; int ec = EC_NONE; double theta, vcos, vsin; bool undoSw = false; void *lpBuf = NULL; char *chp; COLORREF c; TList *tl = NULL; TTextData *td; DWORD dwRect; MAT2 m2; AnsiString str = Edit->Text; TUndoData *ud; TPItemImage *Image = MainImageForm->iMainImage; theta = -atan2(Pos[1].y - Pos[0].y, Pos[1].x - Pos[0].x); if (theta < 0) theta += 2*M_PI; DPI = MainImageForm->CanvasInfor.DotsPerInch; bfl = ConvertToDot(seInterval->Value); if (SizeItem == 2) { cnt = str.Length(); tbfl = (cnt - 1)*bfl; length = sqrt((Pos[1].x-Pos[0].x)*(Pos[1].x-Pos[0].x) + (Pos[1].y-Pos[0].y)*(Pos[1].y-Pos[0].y)); FontHeight(length-tbfl); ChangeValue(FHeight); } Image->Canvas->Font->Height = FHeight; if (Shape == 0 ) { if (Pos[0].x == Pos[1].x) { vcos = 0; if (Pos[0].y < Pos[1].y) vsin = -1; else vsin = 1; } else { vsin = 0; if (Pos[0].x < Pos[1].x) vcos = 1; else vcos = -1; } } else { vcos = cos(theta); vsin = sin(theta); } chp = str.c_str(); if ((tl = FHMakeTextList()) == NULL) goto fail; m2.eM11 = FixedFormDouble(vcos); m2.eM12 = FixedFormDouble(vsin); m2.eM21 = FixedFormDouble(-vsin); m2.eM22 = FixedFormDouble(vcos); sx = Pos[0].x; sy = Pos[0].y; sum_width = 0; c = PaletteForm->DIB256Palette->GetFGCOLORREF(Image->uBitmap->BitsPerPixel); Image->uBitmap->StartScanLine(); if (Image->LayerMask) Image->LayerMask->StartScanLine(); for (i=0; iCount; i++) { td = (TTextData *)tl->Items[i]; td->color = c; if ((dwRect = GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, 0, NULL, &m2)) == GDI_ERROR) { ec = EC_FONT_NOSUPPORT; goto fail;} if ((td->hMem = GlobalAlloc(GPTR, dwRect)) == NULL) { ec = EC_MEMORY_LACK; goto fail;} if ((lpBuf = GlobalLock(td->hMem)) == NULL) { ec = EC_MEMORY_LACK; goto fail;} if ((GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, dwRect, lpBuf, &m2)) == GDI_ERROR) { ec = EC_FONT_NOSUPPORT; goto fail;} // width = sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX + td->gm.gmCellIncY*td->gm.gmCellIncY); // sum_width += sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX + td->gm.gmCellIncY*td->gm.gmCellIncY); // current // if (chp[i] & 0x80) // Korean // sum_width += abs(td->gm.gmCellIncX); // else // English sum_width += sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX + td->gm.gmCellIncY*td->gm.gmCellIncY); ObliqueFont(td, sx, sy, (Byte *)lpBuf); GlobalUnlock(td->hMem); lpBuf = NULL; sx = Pos[0].x + (sum_width + (i+1)*bfl)*vcos; sy = Pos[0].y - (sum_width + (i+1)*bfl)*vsin; } if (Image->LayerMask) Image->LayerMask->StopScanLine(); Image->uBitmap->StopScanLine(); MainImageForm->ResetDraw();//by jeegeo Image->Repaint(); while (Text->Count) { td = (TTextData *)Text->Last(); if (td->hMem) GlobalFree(td->hMem); HeapFree(GetProcessHeap(), 0, td); Text->Remove(td); } delete Text; Text = tl; return; fail: if (tl) { if (lpBuf) GlobalUnlock(td->hMem); while (tl->Count) { td = (TTextData *)tl->Last(); if (td->hMem) GlobalFree(td->hMem); HeapFree(GetProcessHeap(), 0, td); tl->Remove(td); } } if (Image->LayerMask) Image->LayerMask->StopScanLine(); Image->uBitmap->StopScanLine(); EXCEPTION_MESSAGE_OK(ec); */ } //--------------------------------------------------------------------------- void __fastcall TTextForm::FreeArc_TextOut(int X, int Y) { int i, cnt, width, cwidth, length, bfl, tbfl, DPI; int ec = EC_NONE; double Theta, Alpha, Radius, sum_theta=0, calpha; bool undoSw = false; void *lpBuf = NULL; TList *tl = NULL; COLORREF c; MAT2 m2; DWORD dwRect; TTextData *td; AnsiString str = Edit->Text; char *chp; TPItemImage *Image = MainImageForm->iMainImage; DPI = MainImageForm->CanvasInfor.DotsPerInch; bfl = ConvertToDot(seInterval->Value); Radius = sqrt((Pos[1].x-Pos[0].x)*(Pos[1].x-Pos[0].x) + (Pos[1].y-Pos[0].y)*(Pos[1].y-Pos[0].y)); if (SizeItem == 2) { cnt = str.Length(); tbfl = (cnt - 1)*bfl; Theta = ARC_Theta(X, Y); length = Radius*Theta; FontHeight(length-tbfl); ChangeValue(FHeight); } Image->Canvas->Font->Height = FHeight; // try{ if(Pos[0].y - Pos[1].y!=0 || Pos[0].x - Pos[1].x!=0) Alpha = -atan2(Pos[0].y - Pos[1].y, Pos[0].x - Pos[1].x); // }catch(Exception &exception){ else Alpha = 0; // } if (Alpha < 0) Alpha += 2*M_PI; if ((tl = FHMakeTextList()) == NULL) goto fail; chp = str.c_str(); c = PaletteForm->DIB256Palette->GetFGCOLORREF(Image->uBitmap->BitsPerPixel); Image->uBitmap->StartScanLine(); if (Image->LayerMask) Image->LayerMask->StartScanLine(); for (i=0; iCount; i++) { td = (TTextData *)tl->Items[i]; td->color = c; cwidth = Image->Canvas->TextWidth(chp[i]); calpha = cwidth/(2*Radius); if (chp[i]&0x80) Theta = Alpha - M_PI/2; else Theta = Alpha - M_PI/2 - calpha; // Theta = Alpha - M_PI/2; if (Theta<0) Theta += 2*M_PI; m2.eM11 = FixedFormDouble(cos(Theta)); m2.eM12 = FixedFormDouble(sin(Theta)); m2.eM21 = FixedFormDouble(-sin(Theta)); m2.eM22 = FixedFormDouble(cos(Theta)); if ((dwRect = GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, 0, NULL, &m2)) == GDI_ERROR) {ec = EC_FONT_NOSUPPORT; goto fail;} if ((td->hMem = GlobalAlloc(GPTR, dwRect)) == NULL) {ec = EC_MEMORY_LACK; goto fail;} if ((lpBuf = GlobalLock(td->hMem)) == NULL) {ec = EC_MEMORY_LACK; goto fail;} if ((GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, dwRect, lpBuf, &m2)) == GDI_ERROR){ec = EC_FONT_NOSUPPORT; goto fail;} // if (chp[i] & 0x80) // Korean // width = abs(td->gm.gmCellIncX); // else // English // width = sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX+td->gm.gmCellIncY*td->gm.gmCellIncY); width = sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX+td->gm.gmCellIncY*td->gm.gmCellIncY); if ((sum_theta+(width + bfl)/Radius) < 2*M_PI) { CircleFont(td, Radius, Alpha, (Byte *)lpBuf); GlobalUnlock(td->hMem); lpBuf = NULL; } Alpha -= (width + bfl)/Radius; if (Alpha<0) Alpha += 2*M_PI; sum_theta += (width + bfl)/Radius; } if (Image->LayerMask) Image->LayerMask->StopScanLine(); Image->uBitmap->StopScanLine(); MainImageForm->ResetDraw();//by jeegeo Image->Repaint(); while (Text->Count) { td = (TTextData *)Text->Last(); if (td->hMem) GlobalFree(td->hMem); HeapFree(GetProcessHeap(), 0, td); Text->Remove(td); } delete Text; Text = tl; return; fail: if (tl) { if (lpBuf) GlobalUnlock(td->hMem); while (tl->Count) { td = (TTextData *)tl->Last(); if (td->hMem) GlobalFree(td->hMem); HeapFree(GetProcessHeap(), 0, td); tl->Remove(td); } } if (Image->LayerMask) Image->LayerMask->StopScanLine(); Image->uBitmap->StopScanLine(); EXCEPTION_MESSAGE_OK(ec); } //--------------------------------------------------------------------------- void __fastcall TTextForm::DrawArc(int X, int Y) { int lx, ly; int r; POINT sp, ep, tsp, tep; TPItemImage *Image = MainImageForm->iMainImage; /* X = Image->BitmapToCanvasX(X); Y = Image->BitmapToCanvasY(Y); tsp = Point(Image->BitmapToCanvasX(Pos[0].x), Image->BitmapToCanvasY(Pos[0].y)); tep = Point(Image->BitmapToCanvasX(Pos[1].x), Image->BitmapToCanvasY(Pos[1].y));*/ lx = Pos[1].x - Pos[0].x; ly = Pos[1].y - Pos[0].y; r = sqrt(lx*lx + ly*ly); /* sp = Point(tep.x - r, tep.y - r); ep = Point(tep.x + r, tep.y + r);*/ // Image->Repaint(); ////////by jeegeo // Image->Canvas->Pen->Color = clBlack; // Arc(Image->Canvas->Handle, sp.x, sp.y, ep.x, ep.y, X, Y, tsp.x, tsp.y); if(X-Pos[1].x==0||Pos[0].x-Pos[1].x==0)return; MainImageForm->DrawArcLocate(Point(Pos[1].x,Pos[1].y),r,0, (X-Pos[1].x > 0) ? atan((float)(Pos[1].y-Y)/(float)(X-Pos[1].x)): atan((float)(Pos[1].y-Y)/(float)(X-Pos[1].x))+M_PI, (Pos[0].x-Pos[1].x > 0) ? atan((float)(Pos[1].y-Pos[0].y)/(float)(Pos[0].x-Pos[1].x)): atan((float)(Pos[1].y-Pos[0].y)/(float)(Pos[0].x-Pos[1].x))+M_PI, true,false); } //--------------------------------------------------------------------------- double __fastcall TTextForm::Cal_Theta(int X, int Y, double &a, double &b, int &index) { int ty; double theta; theta = Theta(X, Y); if (Pos[0].x < Pos[1].x) { a = -(double)(Pos[1].y - Pos[0].y)/(Pos[1].x - Pos[0].x); b = -Pos[0].y - a*Pos[0].x; ty = a*X + b; index = 0; if (-Y < ty) theta = 2*M_PI - theta; } else if (Pos[0].x > Pos[1].x) { a = -(double)(Pos[1].y - Pos[0].y)/(Pos[1].x - Pos[0].x); b = -Pos[0].y - a*Pos[0].x; ty = a*X + b; index = 1; if (-Y > ty) theta = 2*M_PI - theta; } else { if (Pos[0].y > Pos[1].y) { if (X > Pos[0].x) theta = 2*M_PI - theta; } else { if (X < Pos[0].x) theta = 2*M_PI - theta; } a=0; b=0; index = 2; } return theta; } //--------------------------------------------------------------------------- double __fastcall TTextForm::Theta(int x, int y) { double a, b, c, value; a = sqrt((x - Pos[0].x)*(x - Pos[0].x) + (y - Pos[0].y)*(y - Pos[0].y)); b = sqrt((x - Pos[1].x)*(x - Pos[1].x) + (y - Pos[1].y)*(y - Pos[1].y)); c = sqrt((Pos[1].x - Pos[0].x)*(Pos[1].x - Pos[0].x) + (Pos[1].y - Pos[0].y)*(Pos[1].y - Pos[0].y)); if (b == 0) value = 0; else value = ArcCos((b*b+c*c-a*a)/(2*b*c)); return value; } //--------------------------------------------------------------------------- void __fastcall TTextForm::spReArrangeClick(TObject *Sender) { double Theta; // MainImageForm->iMainImage->uBitmap->Copy(Original, SRCCOPY); MainImageForm->iMainImage->uBitmap->PartialUndo->LoadUndoWithOutIndexChange(); if (MainImageForm->iMainImage->LayerMask) // MainImageForm->iMainImage->LayerMask->Copy(OrigMask, SRCCOPY); MainImageForm->iMainImage->LayerMask->PartialUndo->LoadUndoWithOutIndexChange(); bPosition = false; if (Shape == 3) { Modify = false; Step = 2; bPosition = true; Theta = Opp_Point(); Find_Point(Theta); } else if (Shape == 2) { Step = 2; } else { Step = 1; } IsPosition(); MainImageForm->ResetDraw(); MainImageForm->iMainImage->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TTextForm::FontHeight(int length) { int tl, ml, min; AnsiString str = Edit->Text; TPItemImage *Image = MainImageForm->iMainImage; Image->Canvas->Font->Height = 100; tl = Image->Canvas->TextWidth(str); FHeight = 100*length/tl; Image->Canvas->Font->Height = FHeight; tl = Image->Canvas->TextWidth(str); min = tl - length; while(1) { if (min < 0) { Image->Canvas->Font->Height = FHeight+1; ml = Image->Canvas->TextWidth(str); if (abs(ml - length) >= abs(min)) break; FHeight++; } else { Image->Canvas->Font->Height = FHeight-1; ml = Image->Canvas->TextWidth(str); if (abs(ml - length) >= abs(min)) break; FHeight--; } } length = ml; } //--------------------------------------------------------------------------- double __fastcall TTextForm::ARC_Theta(int X, int Y) { int ty; double a, b, theta; theta = Theta(X, Y); if (Pos[0].x < Pos[1].x) { a = -(double)(Pos[1].y - Pos[0].y)/(Pos[1].x - Pos[0].x); b = -Pos[0].y - a*Pos[0].x; ty = int(a*X + b); if (-Y < ty) theta = 2*M_PI - theta; } else if (Pos[0].x > Pos[1].x) { a = -(double)(Pos[1].y - Pos[0].y)/(Pos[1].x - Pos[0].x); b = -Pos[0].y - a*Pos[0].x; ty = int(a*X + b); if (-Y > ty) theta = 2*M_PI - theta; } else { if (Pos[0].y > Pos[1].y) { if (X > Pos[0].x) theta = 2*M_PI - theta; } else { if (X < Pos[0].x) theta = 2*M_PI - theta; } } return theta; } //--------------------------------------------------------------------------- void __fastcall TTextForm::DrawTunnel(TObject *Sender, HDC hDC) { int i, j; POINT sp, ep; double t; HPEN hOPen = NULL, hNPen = NULL; HBRUSH hOBrush = NULL, hNBrush = NULL; TPItemImage *Image = MainImageForm->iMainImage; if ((Shape == 3) && (Step == 2)) { for (i=0; i<2; i++) { sp.x = Image->BitmapToCanvasX(tp[i][0].x); sp.y = Image->BitmapToCanvasY(tp[i][0].y); if (i) { hNPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255)); hNBrush = CreateSolidBrush(RGB(0, 0, 255)); } else { hNPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); hNBrush = CreateSolidBrush(RGB(255, 0, 0)); } hOPen = SelectObject(hDC, hNPen); hOBrush = SelectObject(hDC, hNBrush); MoveToEx(hDC, sp.x, sp.y, NULL); for (j=0; jBitmapToCanvasX(mx), Image->BitmapToCanvasY(my)); } } LineTo(hDC, Image->BitmapToCanvasX(tp[i][tcnt-1].x), Image->BitmapToCanvasY(tp[i][tcnt-1].y)); for (j=0; jBitmapToCanvasX(tp[i][j].x)-4, Image->BitmapToCanvasY(tp[i][j].y)-4, Image->BitmapToCanvasX(tp[i][j].x)+4, Image->BitmapToCanvasY(tp[i][j].y)+4); } SelectObject(hDC, hOBrush); DeleteObject(hNBrush); SelectObject(hDC, hOPen); DeleteObject(hNPen); } } } //--------------------------------------------------------------------------- void __fastcall TTextForm::Set_Axis(double t, int i, int j) { double a, b, c, tw; TPItemImage *Image = MainImageForm->iMainImage; tw = t*t; a = 0.5 - t + tw/2.0; b = t - tw + 0.5; c = tw/2.0; mx = a*tp[i][j].x + b*tp[i][j+1].x + c*tp[i][j+2].x; my = a*tp[i][j].y + b*tp[i][j+1].y + c*tp[i][j+2].y; } //--------------------------------------------------------------------------- void __fastcall TTextForm::CheckSet_Axis(double t, int i, int j) { double a, b, c, tw; tw = t*t; a = 0.5 - t + tw/2.0; b = t - tw + 0.5; c = tw/2.0; mx = a*ctp[i][j].x + b*ctp[i][j+1].x + c*ctp[i][j+2].x; my = a*ctp[i][j].y + b*ctp[i][j+1].y + c*ctp[i][j+2].y; } //--------------------------------------------------------------------------- void __fastcall TTextForm::Tunnel_TextOut() { int i, bfl, DPI; int ec = EC_NONE; double vcos, vsin, width; bool undoSw = false; void *lpBuf = NULL; COLORREF c; DWORD dwRect; MAT2 m2; AnsiString str = Edit->Text; TList *tl = NULL; TTextData *td; TPItemImage *Image = MainImageForm->iMainImage; DPI = MainImageForm->CanvasInfor.DotsPerInch; bfl = ConvertToDot(seInterval->Value); Image->Canvas->Font->Height = FHeight; if (Pos[0].x == Pos[1].x) { if (Pos[0].y < Pos[1].y) tun_theta = M_PI/2; else tun_theta = 3*M_PI/2; } else { tun_theta = atan(double(Pos[1].y - Pos[0].y)/(Pos[1].x - Pos[0].x)); if (Pos[0].x < Pos[1].x) tun_theta += 2*M_PI; else tun_theta += M_PI; } for (i=0; iDIB256Palette->GetFGCOLORREF(Image->uBitmap->BitsPerPixel); Image->uBitmap->StartScanLine(); if (Image->LayerMask) Image->LayerMask->StartScanLine(); for (i=0; iCount; i++) { td = (TTextData *)tl->Items[i]; td->color = c; if ((dwRect = GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, 0, NULL, &m2)) == GDI_ERROR) { ec = EC_FONT_NOSUPPORT; goto fail;} if ((td->hMem = GlobalAlloc(GPTR, dwRect)) == NULL) { ec = EC_MEMORY_LACK; goto fail;} if ((lpBuf = GlobalLock(td->hMem)) == NULL) { ec = EC_MEMORY_LACK; goto fail;} if ((GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, dwRect, lpBuf, &m2)) == GDI_ERROR) { ec = EC_FONT_NOSUPPORT; goto fail;} width = sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX + td->gm.gmCellIncY*td->gm.gmCellIncY); fpx = td->gm.gmptGlyphOrigin.x; fpy = td->gm.gmptGlyphOrigin.y; fsx = td->gm.gmBlackBoxX; fsy = td->gm.gmBlackBoxY; if (Convert_Size() == 0) { View_Font( td, FHeight-fpy, (Byte *)lpBuf); } GlobalUnlock(td->hMem); lpBuf = NULL; tsx += (width + bfl)*vcos; tsy += (width + bfl)*vsin; } if (Image->LayerMask) Image->LayerMask->StopScanLine(); Image->uBitmap->StopScanLine(); Image->Repaint(); while (Text->Count) { td = (TTextData *)Text->Last(); if (td->hMem) GlobalFree(td->hMem); HeapFree(GetProcessHeap(), 0, td); Text->Remove(td); } delete Text; Text = tl; return; fail: if (tl) { if (lpBuf) GlobalUnlock(td->hMem); while (tl->Count) { td = (TTextData *)tl->Last(); if (td->hMem) GlobalFree(td->hMem); HeapFree(GetProcessHeap(), 0, td); tl->Remove(td); } } if (Image->LayerMask) Image->LayerMask->StopScanLine(); Image->uBitmap->StopScanLine(); EXCEPTION_MESSAGE_OK(ec); } //--------------------------------------------------------------------------- int __fastcall TTextForm::Convert_Size() { int i, x, y, mm = -1; POINT rp; rp = M1(tsx, tsy, tun_theta); x = rp.x; y = rp.y; x += fpx; sx = x; // sx = rp.x + fpx; for (i=0; imax[0]) max[0] = mx; if (mymax[1]) max[1] = my; } } if (Find_Pos(1, x+i)==0) { M2(mx, my, &mx, &my, tun_theta); if (mm) { min[0] = max[0] = mx; min[1] = max[1] = my; mm = 0; } else { if (mxmax[0]) max[0] = mx; if (mymax[1]) max[1] = my; } } } return mm; } //--------------------------------------------------------------------------- int __fastcall TTextForm::View_Font(TTextData *td, int gab, Byte *fbm) { int ix, iy; int www, hhh; int dx, dy, y0, y1; int x, y; double cal_y; POINT rp; Byte *ddp, *tp, *tdp, *lp; COLORREF C= td->color; TPItemImage *Image = MainImageForm->iMainImage; cal_y = ((fsx+31)>>5)<<2; www = Image->uBitmap->Width; hhh = Image->uBitmap->Height; tp = fbm; if (Image->LayerMask) { for (y=min[1]; y=0 && yuBitmap->GetScanLine(y); lp = Image->LayerMask->GetScanLine(y); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=min[0]; x=0 && x=0 && ix=0 && iy>3]&(0x80>>(ix&7))) { if (Image->uBitmap->BitsPerPixel == 8) { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 ddp[x] = C;//////adsfadsf_Variable_Checked if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 lp[x] = 0;//////adsfadsf_Variable_Checked } else { if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 tdp = ddp + 3*x;//////adsfadsf_Variable_Checked SetPixel24(tdp, C); if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 *(lp + (x>>3)) &= ~(0x80 >> (x&7));//////adsfadsf_Variable_Checked } } } } } } } Image->uBitmap->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf Image->LayerMask->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf } } } else { for (y=min[1]; y=0 && yuBitmap->GetScanLine(y); int StartX = 0; int EndX = 0; //adsfadsf_for_declare for (x=min[0]; x=0 && x=0 && ix=0 && iy>3]&(0x80>>(ix&7))) {//////adsfadsf_Variable_Checked if(EndX==0){StartX=x;} EndX=x; //adsfadsf_i_f1 if (Image->uBitmap->BitsPerPixel == 8) {//////adsfadsf_Variable_Checked ddp[x] = C; } else { tdp = ddp + 3*x; SetPixel24(tdp, C); } } } } } } } Image->uBitmap->PutScanLine(y,StartX,EndX-StartX+1); ////adsfadsf } } } } //--------------------------------------------------------------------------- int __fastcall TTextForm::Find_Pos(int ud, double z) { int j, k; double a, b, c, d, t, tt; if (zxx[ud+2]) { mx = z; my = (double)(ctp[ud][tcnt-1].y - yy[ud+2])/(ctp[ud][tcnt-1].x - xx[ud+2])*(mx - xx[ud+2]) + yy[ud+2]; } else { k=-1; for (j=0; j0) { a = a*2.0; t = (-b+sqrt(d))/a; if ((t>=0.0) && (t<=1.0)) { CheckSet_Axis(t, ud, j); return 0; } if ((k<0) || (fabs(tt-0.5)>fabs(t-0.5))) { tt=t; k=j;} t = (-b-sqrt(d))/a; if ((t>=0.0) && (t<=1.0)) { CheckSet_Axis(t, ud, j); return 0; } if ((k<0) || (fabs(tt-0.5)>fabs(t-0.5))) { tt=t; k=j;} } } else if (b!=0) { t = -c/b; if ((t>=0.0) && (t<=1.0)) { CheckSet_Axis(t, ud, j); return 0;} if ((k<0) || (fabs(tt-0.5)>fabs(t-0.5))) { tt = t; k = j;} } } if (k<0) return -1; CheckSet_Axis(tt, ud, k); } return 0; } //--------------------------------------------------------------------------- POINT __fastcall TTextForm::M1(int ix, int iy, double t) { POINT rp; double st = sin(-t), ct = cos(-t); rp = Point(ix*ct-iy*st-Pos[0].x*ct+Pos[0].y*st, ix*st+iy*ct-Pos[0].x*st-Pos[0].y*ct); return rp; } //--------------------------------------------------------------------------- void __fastcall TTextForm:: M2(int ix, int iy, int *ox, int *oy, double t) { double st = sin(t), ct = cos(t); *ox = ix*ct-iy*st+Pos[0].x; *oy = ix*st+iy*ct+Pos[0].y; } //--------------------------------------------------------------------------- bool __fastcall TTextForm::ComparePoint(int X, int Y) { int i; for (i=0; i=(tp[0][i].x-5)) && (X <= (tp[0][i].x+5))) { if ((Y >=(tp[0][i].y-5)) && (Y <= (tp[0][i].y+5))) { updown = 0; index = i; return true; } } if ((X >=(tp[1][i].x-5)) && (X <= (tp[1][i].x+5))) { if ((Y >=(tp[1][i].y-5)) && (Y <= (tp[1][i].y+5))) { updown = 1; index = i; return true; } } } return false; } //--------------------------------------------------------------------------- double __fastcall TTextForm::Opp_Point() { int length, tbfl, bfl, cnt, DPI; double theta, vcos, vsin; AnsiString str = Edit->Text; if (SizeItem == 2) { cnt = str.Length(); DPI = MainImageForm->CanvasInfor.DotsPerInch; bfl = ConvertToDot(seInterval->Value); tbfl = bfl*(cnt-1); length = sqrt((Pos[1].y-Pos[0].y)*(Pos[1].y-Pos[0].y) + (Pos[1].x-Pos[0].x)*(Pos[1].x-Pos[0].x)); FontHeight(length - tbfl); ChangeValue(FHeight); } if (Pos[0].x == Pos[1].x) { theta = M_PI/2; if (Pos[0].y < Pos[1].y) { aPos[0] = Point(Pos[0].x + FHeight, Pos[0].y); aPos[1] = Point(Pos[1].x + FHeight, Pos[1].y); } else { aPos[0] = Point(Pos[0].x - FHeight, Pos[0].y); aPos[1] = Point(Pos[1].x - FHeight, Pos[1].y); } } else if (Pos[0].y == Pos[1].y) { theta = 0; if (Pos[0].x < Pos[1].x) { aPos[0] = Point(Pos[0].x, Pos[0].y - FHeight); aPos[1] = Point(Pos[1].x, Pos[1].y - FHeight); } else { aPos[0] = Point(Pos[0].x, Pos[0].y + FHeight); aPos[1] = Point(Pos[1].x, Pos[1].y + FHeight); } } else { theta = atan((double)-(Pos[1].y-Pos[0].y)/(Pos[1].x-Pos[0].x)); // ÁÂÇ¥°¡ Ʋ¸®¹Ç·Î -1À» °öÇØÁÜ vcos = cos(theta); vsin = sin(theta); if (Pos[0].x < Pos[1].x) { aPos[0] = Point(Pos[0].x - FHeight*vsin, Pos[0].y - FHeight*vcos); aPos[1] = Point(Pos[1].x - FHeight*vsin, Pos[1].y - FHeight*vcos); } else { aPos[0] = Point(Pos[0].x + FHeight*vsin, Pos[0].y + FHeight*vcos); aPos[1] = Point(Pos[1].x + FHeight*vsin, Pos[1].y + FHeight*vcos); } MainImageForm->DrawLineLocate(Pos[0], Pos[1]); MainImageForm->DrawLineLocate(aPos[0], aPos[1]); } return theta; } //--------------------------------------------------------------------------- void __fastcall TTextForm::Find_Point(double th) { int i,length,length1, cal_length; int cal_x = 1, cal_y = 1; double vtan; tp[0][0] = Point(Pos[0].x, Pos[0].y); tp[0][tcnt-1] = Point(Pos[1].x, Pos[1].y); tp[1][0] = Point(aPos[0].x, aPos[0].y); tp[1][tcnt-1] = Point(aPos[1].x, aPos[1].y); if (th == 0) { length = (Pos[1].x - Pos[0].x)/(tcnt-1); for (i=1; iClear(); if ((Shape == 3) &&(rgSize->ItemIndex < 1)) { ShowMessage(IDS_MESSAGE_NOTNORMALORFIX); rgSize->ItemIndex = SizeItem; } else if(Shape==4&&rgSize->ItemIndex!=1){ ShowMessage(IDS_MESSAGE_NOTCURVE); rgSize->ItemIndex = SizeItem; } else { SizeItem = rgSize->ItemIndex; } if(SizeItem==1&&Shape == 4)CheckBox1->Enabled=true; else CheckBox1->Enabled=false; CheckBox2->Enabled=CheckBox1->Enabled; MainImageForm->ResetDraw(true); UpdateMenu(); Step = 0; bPosition = false; IsPosition(); } //--------------------------------------------------------------------------- void __fastcall TTextForm::seEditClick(TObject *Sender) { TRxSpinEdit *sp = (TRxSpinEdit *)Sender; sp->SetFocus(); sp->SelectAll(); } //--------------------------------------------------------------------------- void __fastcall TTextForm::spRunClick(TObject *Sender) { TCursor cursor=Screen->Cursor; Screen->Cursor=crHourGlass; Step = 0; bPosition = false; Tunnel_TextOut(); spReArrange->Enabled = true; ButtonOK->Enabled = true; spRun->Enabled = false; Screen->Cursor=cursor; } //--------------------------------------------------------------------------- void __fastcall TTextForm::ChangeValue(int value) { int DPI = MainImageForm->CanvasInfor.DotsPerInch; switch (Unit) { case 0: seHeight->Value = value; break; // Dot case 1: seHeight->Value = value/DPI; break; // Dot --> Inch case 2: seHeight->Value = value*2.54/DPI; break; // Dot --> Cm } } //--------------------------------------------------------------------------- double __fastcall TTextForm::ConvertToDot(double value) { double rvalue; int DPI = MainImageForm->CanvasInfor.DotsPerInch; switch (Unit) { case 0: rvalue = value; break; // Dot case 1: rvalue = value*DPI; break; // Inch --> Dot case 2: rvalue = value*DPI/2.54; break; // Cm --> Dot } return rvalue; } //--------------------------------------------------------------------------- void __fastcall TTextForm::UnitLabelClick(TObject *Sender) { if (Unit == 0) { // Dot-->Inch Unit = 1; seHeight->Increment = 0.1; seInterval->Increment = 0.1; } else if (Unit == 1) { // Inch-->Cm Unit = 2; seHeight->Increment = 0.1; seInterval->Increment = 0.1; } else { // Cm-->Dot Unit = 0; seHeight->Increment = 1; seInterval->Increment = 1; } ChangeEditValue(); } //--------------------------------------------------------------------------- void __fastcall TTextForm::ChangeEditValue() { int DPI = MainImageForm->CanvasInfor.DotsPerInch; switch (Unit) { case 0: // Cm --> Dot seHeight->Value = int(seHeight->Value*DPI/2.54); seInterval->Value = int(seInterval->Value*DPI/2.54); rxHeight->Caption = "Dot"; rxInterval->Caption = "Dot"; break; case 1: // Dot --> Inch seHeight->Value = (seHeight->Value/DPI); seInterval->Value = (seInterval->Value/DPI); rxHeight->Caption = "Inch"; rxInterval->Caption = "Inch"; break; case 2: // Inch --> Cm seHeight->Value = (seHeight->Value*2.54); seInterval->Value = (seInterval->Value*2.54); rxHeight->Caption = "Cm"; rxInterval->Caption = "Cm"; break; } } //--------------------------------------------------------------------------- POINT __fastcall TTextForm::FixTurnelPos(POINT st,POINT ed) { int cwidth; POINT pt; double theta, vtan,vsin,vcos; int cal_x = 1, cal_y = 1; int i,length, cal_length; MainImageForm->iMainImage->Canvas->Font->Size = FHeight; cwidth = MainImageForm->iMainImage->Canvas->TextWidth(Edit->Text); if (st.x == ed.x) { theta = M_PI/2; } else if (st.y == ed.y) { theta = 0; } else { theta = atan((double)-(Pos[1].y-Pos[0].y)/(Pos[1].x-Pos[0].x)); // ÁÂÇ¥°¡ Ʋ¸®¹Ç·Î -1À» °öÇØÁÜ } if (theta == 0) { if(st.x > ed.x){ cwidth = -(cwidth); } pt = Point(st.x + cwidth, st.y); } else if (theta == M_PI/2){ if(st.y > ed.y) { cwidth = -(cwidth); } pt = Point(st.x , st.y + cwidth); } else { vsin = sin(theta); vcos = cos(theta); if (st.x > ed.x) cal_x = -1; if (st.y > ed.y) cal_y = -1; pt = Point (st.x + cal_x * cwidth * fabs(vcos), st.y + cal_y * cwidth * fabs(vsin)); } return pt; } //--------------------------------------------------------------------------- void __fastcall TTextForm::iMainImageKeyPress(int Key) { if(Key == 13 && spRun->Enabled)spRunClick(this); else if (Key == 13)ButtonOKClick(this); //lhskys ¿£ÅÍ¿¡¼­ ½ÇÇà } //--------------------------------------------------------------------------- void __fastcall TTextForm::Curve_TextOut(TList *pstore) //by jeegeo { if(pstore->Count<=1){ pstore->Clear(); return; } int i, cnt, cwidth, length, bfl, tbfl, DPI; int ec = EC_NONE; double Theta, Alpha, Radius, sum_theta=0,length_sum=0,total_len,width; bool undoSw = false; void *lpBuf = NULL; TList *tl = NULL; COLORREF c; MAT2 m2; DWORD dwRect; TTextData *td; AnsiString str = Edit->Text,oldstr=Edit->Text; char *chp; TPItemImage *Image = MainImageForm->iMainImage; TCursor cursor=Screen->Cursor; Screen->Cursor=crHourGlass; DPI = MainImageForm->CanvasInfor.DotsPerInch; bfl = ConvertToDot(seInterval->Value); Image->Canvas->Font->Height = FHeight; total_len=GetLength(pstore); Pos[1]=Point(0,0); if(CheckBox2->Checked==true)for(i=0;i<10;i++)str=str+str; //2^10¹è·Î ´Ã¸°´Ù i=0; chp = str.c_str(); while(length_sum<=total_len&&iCanvas->TextWidth(chp[i]); length_sum+=(bfl+cwidth); i++; } i*=1.41;//½ÇÁ¦ ±ÛÀÚ¸¦ ½èÀ» ¶§ÀÇ Å©±â¿Í °î¼±ÀÇ ±æÀ̰¡ ¾à°£ ´Ù¸¦¼ö À־ ³Ë³ËÈ÷ Ű¿î´Ù // sqrt(2) str.SetLength(i); Edit->Text=str; if ((tl = FHMakeTextList()) == NULL) goto fail; length_sum=0; c = PaletteForm->DIB256Palette->GetFGCOLORREF(Image->uBitmap->BitsPerPixel); Image->uBitmap->StartScanLine(); if (Image->LayerMask) Image->LayerMask->StartScanLine(); for (i=0; iCount; i++) { td = (TTextData *)tl->Items[i]; td->color = c; POINT charpoint=GetPoint(pstore,length_sum);/////pstoreÀÇ ±ËÀûÀ» ÃßÀûÇÏ¿© °Å¸®°¡ tracelengthÀÎ Á¡À» ¹Ýȯ//by jeegeo // try{ if(charpoint.y - Pos[1].y!=0 || charpoint.x - Pos[1].x!=0) Alpha = -atan2(charpoint.y - Pos[1].y, charpoint.x - Pos[1].x); // }catch(Exception &exception){ else Alpha = 0; // } Radius = sqrt((Pos[1].x-charpoint.x)*(Pos[1].x-charpoint.x) + (Pos[1].y-charpoint.y)*(Pos[1].y-charpoint.y)); if (Alpha < 0) Alpha += 2*M_PI; // cwidth = Image->Canvas->TextWidth(chp[i]); Theta=GetAngle(pstore,length_sum);/////pstoreÀÇ ±ËÀûÀ» ÃßÀûÇÏ¿© °Å¸®°¡ tracelengthÀÎ Á¡¿¡¼­ ±ÍÀûÀÇ °¢À» ¹Ýȯ//by jeegeo if (Theta<0) Theta += 2*M_PI; m2.eM11 = FixedFormDouble(cos(Theta)); m2.eM12 = FixedFormDouble(sin(Theta)); m2.eM21 = FixedFormDouble(-sin(Theta)); m2.eM22 = FixedFormDouble(cos(Theta)); if ((dwRect = GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, 0, NULL, &m2)) == GDI_ERROR) {ec = EC_FONT_NOSUPPORT; goto fail;} if ((td->hMem = GlobalAlloc(GPTR, dwRect)) == NULL) {ec = EC_MEMORY_LACK; goto fail;} if ((lpBuf = GlobalLock(td->hMem)) == NULL) {ec = EC_MEMORY_LACK; goto fail;} if ((GetGlyphOutline(Image->Canvas->Handle, td->c, GGO_BITMAP, &td->gm, dwRect, lpBuf, &m2)) == GDI_ERROR){ec = EC_FONT_NOSUPPORT; goto fail;} width = sqrt(td->gm.gmCellIncX*td->gm.gmCellIncX+td->gm.gmCellIncY*td->gm.gmCellIncY); if (length_sum < total_len) { CircleFont(td, Radius, Alpha, (Byte *)lpBuf); GlobalUnlock(td->hMem); lpBuf = NULL; } length_sum +=(width+bfl); } if (Image->LayerMask) Image->LayerMask->StopScanLine(); Image->uBitmap->StopScanLine(); MainImageForm->ResetDraw();//by jeegeo Image->Repaint(); while (Text->Count) { td = (TTextData *)Text->Last(); if (td->hMem) GlobalFree(td->hMem); HeapFree(GetProcessHeap(), 0, td); Text->Remove(td); } delete Text; Text = tl; pstore->Clear(); Edit->Text=oldstr; Screen->Cursor=cursor; return; fail: if (tl) { if (lpBuf) GlobalUnlock(td->hMem); while (tl->Count) { td = (TTextData *)tl->Last(); if (td->hMem) GlobalFree(td->hMem); HeapFree(GetProcessHeap(), 0, td); tl->Remove(td); } } if (Image->LayerMask) Image->LayerMask->StopScanLine(); Image->uBitmap->StopScanLine(); pstore->Clear(); Edit->Text=oldstr; Screen->Cursor=cursor; EXCEPTION_MESSAGE_OK(ec); } //--------------------------------------------------------------------------- void __fastcall TTextForm::DrawCurve(POINT First, POINT Second, POINT Third, TList *pstore){//by jeegeo MainImageForm->ResetDraw(); for(int i=0;iCount;i++){ POINT pt=*((POINT *)pstore->Items[i]); MainImageForm->DrawFreeLineLocate(pt,-2); } int x2,y2,mx,my,sx2,sy2,ex2,ey2; int sx=First.x,sy=First.y,ex=Second.x,ey=Second.y,tx=Third.x,ty=Third.y; int t; double Theta,c,s; double alphas,alphae,tangent; double m; double d1,d2,d3; d1 = sqrt((double)(sx - tx) * (sx - tx) + (sy - ty) * (sy - ty)); d2 = sqrt((double)(ex - tx) * (ex - tx) + (ey - ty) * (ey - ty)); d3 = sqrt((double)(ex - sx) * (ex - sx) + (ey - sy) * (ey - sy)); if(d1+d2==0){ return; } if(d1==d2+d3||d2==d1+d3||d3==d1+d2){ MainImageForm->DrawFreeLineLocate(Point(sx,sy),-2); MainImageForm->DrawFreeLineLocate(Point(ex,ey)); return; } m=d1/(d1+d2); mx = ex * m + sx * (1-m); my = ey * m + sy * (1-m); if ((tx - mx) == 0) { Theta = 0; } else { tangent = -(double)(my - ty) / (mx - tx); Theta = M_PI / 2.0 - atan(tangent); if(mx-tx<0)Theta+=M_PI; } c = cos(Theta); s = sin(Theta); sx2 = (sx-tx)*c-(ty-sy)*s+0.5; sy2 = (ty-sy)*c+(sx-tx)*s+0.5; ex2 = (ex-tx)*c-(ty-ey)*s+0.5; ey2 = (ty-ey)*c+(ex-tx)*s+0.5; if((double)sx2*(double)sx2==0)alphas=sy2*0xFFFFFFFF; else alphas = (double)sy2/((double)sx2*(double)sx2); if((double)ex2*(double)ex2==0)alphae=ey2*0xFFFFFFFF; else alphae = (double)ey2/((double)ex2*(double)ex2); if(alphas*alphae<0){ MainImageForm->DrawFreeLineLocate(Point(sx,sy),-2); MainImageForm->DrawFreeLineLocate(Point(ex,ey),-2); return; } t=1; MainImageForm->DrawFreeLineLocate(Point(sx,sy),-2); while (t>=1&&t<=19) { x2 = (double)sx2*(double)(20-t)/20.0; y2 = -alphas * ((double)x2*(double)x2); MainImageForm->DrawFreeLineLocate(Point(tx+c*x2-s*y2,ty+c*y2+s*x2),-2); t++; } t=1; MainImageForm->DrawFreeLineLocate(Point(tx,ty),-2); while (t>=1&&t<=19) { x2 = (double)ex2*(double)t/20.0; y2 = -alphae * ((double)x2*(double)x2); MainImageForm->DrawFreeLineLocate(Point(tx+c*x2-s*y2,ty+c*y2+s*x2),-2); t++; } MainImageForm->DrawFreeLineLocate(Point(ex,ey)); } //--------------------------------------------------------------------------- void __fastcall TTextForm::AddCurve(POINT First, POINT Second, POINT Third, TList *pstore){//by jeegeo int x2,y2,mx,my,sx2,sy2,ex2,ey2; int sx=First.x,sy=First.y,ex=Second.x,ey=Second.y,tx=Third.x,ty=Third.y; int t; double Theta,c,s; double alphas,alphae,tangent; double m; double d1,d2,d3; d1 = sqrt((double)(sx - tx) * (sx - tx) + (sy - ty) * (sy - ty)); d2 = sqrt((double)(ex - tx) * (ex - tx) + (ey - ty) * (ey - ty)); d3 = sqrt((double)(ex - sx) * (ex - sx) + (ey - sy) * (ey - sy)); if(d1+d2==0){ return; } if(d1==d2+d3||d2==d1+d3||d3==d1+d2){ POINT *p1 = new POINT; *p1 = Point(sx,sy); pstore->Add(p1); POINT *p2 = new POINT; *p2 = Point(ex,ey); pstore->Add(p2); return; } m=d1/(d1+d2); mx = ex * m + sx * (1-m); my = ey * m + sy * (1-m); if ((tx - mx) == 0) { Theta = 0; } else { tangent = -(double)(my - ty) / (mx - tx); Theta = M_PI / 2.0 - atan(tangent); if(mx-tx<0)Theta+=M_PI; } c = cos(Theta); s = sin(Theta); sx2 = (sx-tx)*c-(ty-sy)*s+0.5; sy2 = (ty-sy)*c+(sx-tx)*s+0.5; ex2 = (ex-tx)*c-(ty-ey)*s+0.5; ey2 = (ty-ey)*c+(ex-tx)*s+0.5; if((double)sx2*(double)sx2==0)alphas=sy2*0xFFFFFFFF; else alphas = (double)sy2/((double)sx2*(double)sx2); if((double)ex2*(double)ex2==0)alphae=ey2*0xFFFFFFFF; else alphae = (double)ey2/((double)ex2*(double)ex2); if(alphas*alphae<0){ POINT *p1 = new POINT; *p1 = Point(sx,sy); pstore->Add(p1); POINT *p2 = new POINT; *p2 = Point(ex,ey); pstore->Add(p2); return; } t=1; POINT *p1 = new POINT; *p1 = Point(sx,sy); pstore->Add(p1); while (t>=1&&t<=19) { x2 = (double)sx2*(double)(20-t)/20.0; y2 = -alphas * ((double)x2*(double)x2); POINT *p = new POINT; *p = Point(tx+c*x2-s*y2,ty+c*y2+s*x2); pstore->Add(p); t++; } t=1; while (t>=1&&t<=19) { x2 = (double)ex2*(double)t/20.0; y2 = -alphae * ((double)x2*(double)x2); POINT *p = new POINT; *p = Point(tx+c*x2-s*y2,ty+c*y2+s*x2); pstore->Add(p); t++; } POINT *p2 = new POINT; *p2 = Point(ex,ey); pstore->Add(p2); return; } //----------------------------------------------------------------------------- double __fastcall TTextForm::GetLength(TList *pstore){ double len=0; POINT p1,p2; for(int i=0;iCount-1;i++){ p1=*(POINT *)pstore->Items[i]; p2=*(POINT *)pstore->Items[i+1]; len+=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); } return len; } //----------------------------------------------------------------------------- POINT __fastcall TTextForm::GetPoint(TList *pstore,double traceLength){ POINT p1,p2,pm; TList *line=new TList; double len=0; if(pstore->Count==1)return *(POINT *)pstore->Items[0]; len=0; for(int i=0;iCount-1;i++){ p1=*(POINT *)pstore->Items[i]; p2=*(POINT *)pstore->Items[i+1]; POINT *pa=new POINT; *pa=p1; line->Add(pa); POINT *pb=new POINT; *pb=p2; line->Add(pb); len=GetLength(line); line->Clear(); if(traceLength>len)traceLength-=len; else { pm.x=(p1.x*(len-traceLength)+p2.x*traceLength)/len; pm.y=(p1.y*(len-traceLength)+p2.y*traceLength)/len; return pm; } } p1=*(POINT *)pstore->Items[pstore->Count-2]; p2=*(POINT *)pstore->Items[pstore->Count-1]; pm.x=(p1.x*(-traceLength)+p2.x*(traceLength+len))/len; pm.y=(p1.y*(-traceLength)+p2.y*(traceLength+len))/len; return pm; } //----------------------------------------------------------------------------- double __fastcall TTextForm::GetAngle(TList *pstore,double traceLength){ POINT p1=GetPoint(pstore,traceLength),p2=GetPoint(pstore,traceLength+10); double theta; // try{ if(p1.y - p2.y!=0 || p1.x - p2.x!=0) theta = -atan2(p1.y - p2.y, p1.x - p2.x)+M_PI; // }catch(Exception &exception){ else theta = M_PI; // } // return -atan2(p1.y - p2.y, p1.x - p2.x)+M_PI; //atan return theta; //atan } //-----------------------------------------------------------------------------