VOID CExpandImageDlg::DoExpandInits( ) /***********************************************************************/ { long Color; HWND hWnd = GetSafeHwnd(); InitDlgItemSpinFixed(hWnd, IDC_HEIGHT, m_Height, YES, 0L, FGET(9999,1) ); InitDlgItemSpinFixed(hWnd, IDC_WIDTH, m_Width, YES, 0L, FGET(9999,1) ); InitDlgItemSpinFixed(hWnd, IDC_EXPANDLEFT, m_Left, YES, 0L, FGET(9999,1) ); InitDlgItemSpinFixed(hWnd, IDC_EXPANDRIGHT,m_Width-m_OrigWidth-m_Left, YES, 0L, FGET(9999,1) ); InitDlgItemSpinFixed(hWnd, IDC_EXPANDTOP, m_Top, YES, 0L, FGET(9999,1) ); InitDlgItemSpinFixed(hWnd, IDC_EXPANDBOTTOM,m_Height-m_OrigHeight-m_Top, YES, 0L, FGET(9999,1) ); ImageMemory( hWnd, IDC_MEMORY, m_Width, m_Height, m_Resolution,m_Depth ); CheckComboItem(hWnd,IDC_PREF_UNITS, IDC_PREF_UNITFIRST,IDC_PREF_UNITLAST, m_Units); ControlEnable(hWnd, IDOK, FALSE); SetUnitLabels(hWnd); SetColorInfo(&m_FillColor, &m_FillColor, CS_GRAY); CopyRGB( &m_FillColor.rgb, &Color ); SetWindowLong( ::GetDlgItem(hWnd,IDC_FILLINCOLOR), GWL_ACTIVE, Color ); }
BOOL CExpandImageDlg::OnCommand(WPARAM wParam, LPARAM lParam) { int id = LOWORD(wParam); //ID of control WORD codeNotify = HIWORD(wParam); //Control notification code HWND hControl = (HWND) lParam; //Handle of control LPIMAGE lpImage; FRMTYPEINFO TypeInfo; long Color; switch (id) { case IDC_EXPANDLEFT: case IDC_EXPANDRIGHT: case IDC_EXPANDTOP: case IDC_EXPANDBOTTOM: case IDC_HEIGHT: case IDC_WIDTH: case IDC_PREF_UNITS: DoExpandControls(id, codeNotify); break; case IDC_FILLINCOLOR: if (codeNotify != 1) break; lpImage = GetImage(); if (lpImage) ImgGetTypeInfo(lpImage, &TypeInfo); else FrameSetTypeInfo(&TypeInfo, FDT_RGBCOLOR, NULL); if (TypeInfo.DataType == FDT_LINEART) { if(m_FillColor.gray == 255) m_FillColor.gray = 0; else m_FillColor.gray = 255; SetColorInfo(&m_FillColor, &m_FillColor, CS_GRAY); } else if (TypeInfo.DataType == FDT_GRAYSCALE || TypeInfo.DataType == FDT_PALETTECOLOR) { if (!PalettePicker(&m_FillColor, NULL, TypeInfo.ColorMap)) break; } else if (!ColorPicker(&m_FillColor, NULL)) break; CopyRGB( &m_FillColor.rgb, &Color ); SetWindowLong(::GetDlgItem(GetSafeHwnd(),IDC_FILLINCOLOR), GWL_ACTIVE, Color ); AstralControlRepaint(GetSafeHwnd(), IDC_FILLINCOLOR); break; case IDOK: if ( (FMUL( m_Resolution, m_Width ) > MAX_IMAGE_WIDTH) || (FMUL( m_Resolution, m_Height) > MAX_IMAGE_HEIGHT)) { Message( IDS_ETOOWIDE ); break; } SetUnitResolution( 0 ); Control.Units = m_SaveUnits; SetUnitInfo((UNIT_TYPE)(Control.Units-IDC_PREF_UNITINCHES), Control.UnitRes, Control.Points); AstralDlgEnd( GetSafeHwnd(), TRUE ); break; default: break; } return CPPViewModalDlg::OnCommand(wParam, lParam); }
long DoCommand( HWND hWindow, WPARAM wParam, LPARAM lParam ) /***********************************************************************/ { FNAME szFileName; LPFRAME lpFrame; LPOBJECT lpObject, lpBase; RECT rect, rMask, rTemp, rAll; HWND hWnd; STRING szString; int i, idFileType, x, y, dx, dy; BOOL fDoZoom, bPrint, fHasZoom; LPSTR lpszCmdLine; HGLOBAL hMem; ITEMID idDataType; DWORD dwReturn; int NewShape; UINT wID; SoundStartID( wParam, NO/*bLoop*/, NULL/*hInstance*/ ); /* WIN16: ID = wParam ctrl handle = LOWORD(lParam) notify code = HIWORD(lParam) WIN32: ID = LOWORD(wParam) ctrl handle = lParam notify code = HIWORD(wParam) */ #ifdef WIN32 wID = LOWORD(wParam); #else wID = wParam; #endif switch (wID) { case IDM_EXIT: DeactivateTool(); PostMessage( hWndAstral, WM_CLOSE, 0, 0L); Delay (750); break; case IDM_CLOSE: DeactivateTool(); /* Check to see if the image needs to be saved */ if ( !ConfirmClose(NO,NO) ) break; CloseImage( NO, lpImage ); // Close the active image break; case IDM_ABOUT: /* Bring up the modal 'About' dialog box */ AstralDlg( NO|2, hInstAstral, hWindow, IDD_ABOUT, DlgAboutProc); break; case IDM_NEXTPAGE: if ( !lpImage ) break; DeactivateTool(); SendMessage( lpImage->hWnd, WM_SYSCOMMAND, SC_NEXTWINDOW, 0L ); break; case IDM_NEW: DeactivateTool(); SoundStartResource( "magic01", NO, NULL ); AstralCursor( IDC_WAIT ); New( Control.NewWidth, Control.NewHeight, Control.NewResolution, Control.NewDepth ); AstralCursor( NULL ); break; case IDM_OPEN: DeactivateTool(); /* Bring up the modal 'File Open' box */ if ( !(dwReturn = DoOpenDlg( hWindow, IDD_OPEN, Save.FileType, szFileName, NO )) ) break; idFileType = LOWORD( dwReturn ); Save.FileType = idFileType; PutDefaultInt( "FileType", idFileType - IDN_TIFF ); AstralImageLoad( idFileType, szFileName, MAYBE, YES ); break; case IDM_ALTOPEN: DeactivateTool(); // Command line sent from a second instance prior to it closing /* If the caller passed in a file name, try to load it or print it */ if ( !(lpszCmdLine = (LPSTR)lParam) ) break; HandleCommandLine( hWindow, lpszCmdLine, &bPrint ); break; case IDM_SAVE: DeactivateTool(); HandleSaveCommand(hWindow, wID, YES); break; case IDM_SAVEAS: DeactivateTool(); HandleSaveCommand(hWindow, wID, YES); break; case IDM_SAVESPECIAL: DeactivateTool(); HandleSaveCommand(hWindow, wID, YES); break; case IDM_SAVEWALLPAPER: DeactivateTool(); SaveWallpaper( "CRAYOLA", NO/*fTiled*/ ); break; case IDM_REVERT: if ( !lpImage ) break; DeactivateTool(); if ( lpImage->fUntitled ) // If the picture doesn't have a name, get out break; if ( ImgChanged(lpImage) ) { /* Check to see if its OK to trash changes */ if ( AstralOKCancel(IDS_OKTOREVERT, (LPSTR)lpImage->CurFile) == IDCANCEL ) break; } lstrcpy( szFileName, lpImage->CurFile ); idFileType = lpImage->FileType; fDoZoom = IsZoomed(lpImage->hWnd); fHasZoom = Window.fHasZoom; CloseImage( NO, lpImage ); // Close the active image if ( !AstralImageLoad( idFileType, szFileName, fDoZoom, YES ) ) break; break; case IDM_RECALLIMAGE0: case IDM_RECALLIMAGE1: case IDM_RECALLIMAGE2: case IDM_RECALLIMAGE3: case IDM_RECALLIMAGE4: case IDM_RECALLIMAGE5: case IDM_RECALLIMAGE6: case IDM_RECALLIMAGE7: case IDM_RECALLIMAGE8: case IDM_RECALLIMAGE9: DeactivateTool(); GetMenuString( GetMenu(hWindow), wID, szFileName, sizeof(szFileName), MF_BYCOMMAND ); i = 0; while ( szFileName[i] && szFileName[i] != ' ' ) i++; // Skip over the numeric id in the string (3. junk.tif) lstrcpy(szString, &szFileName[i+1]); GetRecallFileName(szString); AstralImageLoad( NULL, szString, MAYBE, YES ); break; case IDM_PRINT: if ( !lpImage ) break; DeactivateTool(); AstralCursor( IDC_WAIT ); DoPrintSizeInits(); SoundStartResource( "print", YES, NULL ); PrintFile( hWindow, filename(lpImage->CurFile), YES, lpImage, NULL ); SoundStop(); AstralCursor( NULL ); break; case IDM_PRINTSETUP: /* Bring up the setup dialog box for the active printer */ AstralDlg( NO|2, hInstAstral, hWindow, IDD_PRINTSETUP, DlgPrintSetupProc); break; case IDC_SOUND: SoundToggle(); break; case IDM_UNDO: if ( !lpImage ) break; DeactivateTool(); ImgEditUndo(lpImage, YES, NO); break; case IDM_CUT: case IDM_COPY: if ( !lpImage ) break; DeactivateTool(); // Create the clipboard files from the image ProgressBegin(1, IDS_PROGCOPY); if ( !ImgWriteClipOut( lpImage, NULL, NULL, &rMask, lpImage->DataType ) ) { ProgressEnd(); Message(IDS_EMEMALLOC); break; } ProgressEnd(); OpenClipboard(hWindow); EmptyClipboard(); // Passing a NULL data handle in SetClipboardData() means that // the data will be requested in a WM_RENDERFORMAT message hMem = ConstructObject( lpImage, IsRectEmpty(&rMask)? (LPRECT)NULL : (LPRECT)&rMask ); if ( pOLE ) { // Any data put on before Native will become staticly copied SetClipboardData( pOLE->cfNative, NULL ); SetClipboardData( pOLE->cfOwnerLink, hMem ); } SetClipboardData( CF_DIB, NULL ); if ( Control.DoPicture ) SetClipboardData( CF_METAFILEPICT, NULL ); if ( Control.DoBitmap ) SetClipboardData( CF_BITMAP, NULL ); SetClipboardData( CF_PALETTE, NULL ); SetClipboardData( Control.cfImage, NULL ); if ( pOLE && wID == IDM_COPY && !lpImage->fUntitled ) { // ObjectLink is retrieved during a Paste Link... SetClipboardData( pOLE->cfObjectLink, hMem ); } CloseClipboard(); if ( wID == IDM_COPY ) break; // else fall through to IDM_DELETE case IDM_DELETE: if ( !lpImage ) break; { COLORINFO ColorInfo; DeactivateTool(); ColorInfo.gray = 255; SetColorInfo( &ColorInfo, &ColorInfo, CS_GRAY ); TintFill( lpImage, &ColorInfo, 255, MM_NORMAL, wID == IDM_CUT ? IDS_UNDOCUT : IDS_UNDODELETE ); } break; case IDM_PASTE: if ( !lpImage ) break; case IDM_PASTEASNEW: if ( !OpenClipboard(hWndAstral) ) { Message( IDS_ECLIPOPEN ); break; } if ( !IsClipboardFormatAvailable(CF_DIB) && !IsClipboardFormatAvailable(CF_BITMAP) && !IsClipboardFormatAvailable(Control.cfImage) ) { Message( IDS_ECLIPOPEN ); CloseClipboard(); break; } CloseClipboard(); DeactivateTool(); // First put clipboard contents into a file(s) AstralCursor(IDC_WAIT); if ( !PasteFromClipboard( hWindow, (wID == IDM_PASTE) /*fNeedMask*/ ) ) { AstralCursor(NULL); Message(IDS_EMEMALLOC); break; } if ( wID == IDM_PASTE ) { ProgressBegin(1, IDS_PROGPASTECLIP); TransformObjectsStart( YES/*fNewObject*/ ); if ( ImgCreateClipInObject( lpImage, NO ) ) ; ProgressEnd(); } else if ( wID == IDM_PASTEASNEW ) { if ( lpFrame = AstralFrameLoad( Names.PasteImageFile, -1, &idDataType, &idFileType) ) { if ( NewImageWindow( NULL, // lpOldFrame NULL, // Name lpFrame, // lpNewFrame idFileType, // lpImage->FileType idDataType, // lpImage->DataType FALSE, // New view? IMG_DOCUMENT, // lpImage->DocumentType NULL, // lpImage->ImageName MAYBE ) ) lpImage->fChanged = YES; } } break; case IDM_ESCAPE: if (!lpImage) break; if (lpImage->hWnd == hZoomWindow) break; if ( Tool.bActive && Tool.lpToolProc ) DestroyProc( lpImage->hWnd, 1L ); break; case IDM_SIZEUP: case IDM_SIZEDOWN: if (!Retouch.hBrush) break; SetFocus( hWindow ); // Take focus away from any controls if ( Retouch.BrushShape == IDC_BRUSHCUSTOM ) break; if ( wID == IDM_SIZEUP ) { if( bHexBrush && ( Retouch.BrushSize % 2 == 0 ) && ( Retouch.BrushSize > 6 )) Retouch.BrushSize += 2; else Retouch.BrushSize++; } else { if( bHexBrush && ( Retouch.BrushSize % 2 == 0 ) && ( Retouch.BrushSize > 6 )) Retouch.BrushSize -= 2; else Retouch.BrushSize--; } if ( Retouch.BrushSize < 1 || Retouch.BrushSize > MAX_BRUSH_SIZE ) { Retouch.BrushSize = bound( Retouch.BrushSize, 1,MAX_BRUSH_SIZE); MessageBeep(0); break; } if (lpImage) DisplayBrush(0, 0, 0, OFF); SetMgxBrushSize(Retouch.hBrush, Retouch.BrushSize); if (lpImage && Window.hCursor == Window.hNullCursor) DisplayBrush(lpImage->hWnd, 32767, 32767, ON); if ( Tool.hRibbon ) SetSlide( Tool.hRibbon, IDC_BRUSHSIZE, Retouch.BrushSize ); break; case IDM_SHAPEUP: case IDM_SHAPEDOWN: if (!Retouch.hBrush) break; SetFocus( hWindow ); // Take focus away from any controls NewShape = Retouch.BrushShape; if ( wID == IDM_SHAPEUP ) NewShape++; else NewShape--; if ( NewShape > IDC_BRUSHCUSTOM ) NewShape = IDC_BRUSHCIRCLE; if ( NewShape < IDC_BRUSHCIRCLE ) NewShape = IDC_BRUSHCUSTOM; if (lpImage) DisplayBrush(0, 0, 0, OFF); if (!SetMgxBrushShape(Retouch.hBrush, NewShape, Names.CustomBrush)) { NewShape = IDC_BRUSHCIRCLE; SetMgxBrushShape(Retouch.hBrush, NewShape, Names.CustomBrush); } Retouch.BrushShape = NewShape; if (lpImage && Window.hCursor == Window.hNullCursor) DisplayBrush(lpImage->hWnd, 32767, 32767, ON); if ( Tool.hRibbon ) { CheckComboItem( Tool.hRibbon, IDC_BRUSHSHAPE, IDC_BRUSHCIRCLE, IDC_BRUSHCUSTOMNEW, Retouch.BrushShape ); SendMessage( Tool.hRibbon, WM_CONTROLENABLE, 0, 0L ); } break; case IDM_MOVEUP: case IDM_MOVEDOWN: case IDM_MOVELEFT: case IDM_MOVERIGHT: if (!lpImage) break; lpBase = ImgGetBase(lpImage); if (ImgGetSelObject(lpImage, NULL) == lpBase) break; dx = dy = 0; if (wID == IDM_MOVEUP) --dy; if (wID == IDM_MOVEDOWN) ++dy; if (wID == IDM_MOVELEFT) --dx; if (wID == IDM_MOVERIGHT) ++dx; lpObject = NULL; while (lpObject = ImgGetSelObject(lpImage, lpObject)) { rect = lpObject->rObject; OffsetRect(&rect, dx, dy); if (!AstralIntersectRect(&rTemp, &lpBase->rObject, &rect)) break; } if (lpObject) break; AstralSetRectEmpty(&rAll); lpObject = NULL; while (lpObject = ImgGetSelObject(lpImage, lpObject)) { rect = lpObject->rObject; OffsetRect(&lpObject->rObject, dx, dy); AstralUnionRect(&rAll, &rAll, &lpObject->rObject); if (!lpObject->Pixmap.fNewFrame && EqualRect(&rect, &lpObject->rUndoObject)) lpObject->rUndoObject = lpObject->rObject; UpdateImage(&rect, TRUE); UpdateImage(&lpObject->rObject, TRUE); } if (wID == IDM_MOVEUP) { x = (rAll.left + rAll.right)/2; y = rAll.top; } else if (wID == IDM_MOVEDOWN) { x = (rAll.left + rAll.right)/2; y = rAll.bottom; } else if (wID == IDM_MOVELEFT) { x = rAll.left; y = (rAll.top + rAll.bottom)/2; } else if (wID == IDM_MOVERIGHT) { x = rAll.right; y = (rAll.top + rAll.bottom)/2; } File2Display(&x, &y); AutoScroll(lpImage->hWnd, x, y); AstralUpdateWindow(lpImage->hWnd); DisplayInfo(-1, &rAll); break; case IDM_LASTTOOL: DeactivateTool(); if ( Tool.idLast && (hWnd = AstralDlgGet(IDD_MAIN)) ) SendMessage( hWnd, WM_COMMAND, Tool.idLast, 2L); break; case IDM_PREF: // prevent problems if running animations and they change // the wave mix dll setting in preferences StopAnimation(); AstralDlg( NO|2, hInstAstral, hWindow, IDD_PREF, DlgPrefProc ); break; case IDC_VIEWLAST: // duplicate of function in the view ribbon if ( !lpImage ) break; RevertLastView(); break; // case IDC_VIEWFULL: // duplicate of function in the view ribbon // if ( !lpImage ) // break; // AstralDlg( NO, hInstAstral, hWindow, IDD_VIEWFULL, DlgFullScreenViewProc ); // break; case IDC_VIEWALL: // duplicate of function in the view ribbon if ( !lpImage ) break; ViewAll(); break; case IDC_ZOOMIN: // duplicate of function in the view ribbon if ( !lpImage ) break; if (!lpImage->lpDisplay) break; if (!lpImage->lpDisplay->ViewPercentage) break; x = ( lpImage->lpDisplay->FileRect.left + lpImage->lpDisplay->FileRect.right ) / 2; y = ( lpImage->lpDisplay->FileRect.top + lpImage->lpDisplay->FileRect.bottom ) / 2; SaveLastView(); Zoom(x,y, +100, YES, ( View.ZoomWindow ^ CONTROL ) ); break; case IDC_ZOOMOUT: // duplicate of function in the view ribbon if ( !lpImage ) break; if (!lpImage->lpDisplay) break; if (!lpImage->lpDisplay->ViewPercentage) break; x = ( lpImage->lpDisplay->FileRect.left + lpImage->lpDisplay->FileRect.right ) / 2; y = ( lpImage->lpDisplay->FileRect.top + lpImage->lpDisplay->FileRect.bottom ) / 2; SaveLastView(); Zoom(x,y, -100, YES,( View.ZoomWindow ^ CONTROL ) ); break; case IDM_HELP: Control.Hints = !Control.Hints; PutDefInt (Control.Hints,Control.Hints); break; default: return( FALSE ); } return( TRUE ); }
LPPALETTE ReadPalette( LPSTR lpFileName, BOOL bCombine ) /************************************************************************/ { int ifh; /* file handle( unbuffered) */ FILEBUF ifd; /* file descriptor( buffered) */ short i, iColors; VERSIONINFO version; RECINFO rec; LPTR lpByte; LPWORD lpWord; LPLONG lpLong; BYTE Previous; BOOL bError; FNAME szName; LPPALETTE lpHeadPalette, lpPalette, lpBigPalette; /* open the palette file */ if ( ( ifh = _lopen( lpFileName, OF_READ)) < 0 ) { Message( IDS_EOPEN, lpFileName); return( NULL ); } /* create a buffered stream to speed access */ FileFDOpenRdr( &ifd, ifh, (LPTR)LineBuffer[0], 16*1024); // read palette version version.Length = sizeof(version.Number); version.Type = PALFILE_VERSION; FileRead(&ifd, (LPTR)&version, sizeof(version)); #ifdef _MAC swapw(&version.Length); swapw(&version.Number); #endif if (ifd.err || version.Type != PALFILE_VERSION || version.Length != sizeof(version.Number) || version.Number > CURRENT_VERSION) { Message(IDS_INVALIDPALETTE, lpFileName); _lclose(ifh); return(NULL); } rec.Type = 0; lpHeadPalette = NULL; lpPalette = NULL; bError = NO; while (!bError && !ifd.err && rec.Type != PALFILE_END) { Previous = rec.Type; FileRead(&ifd, (LPTR)&rec, sizeof(RECINFO)); #ifdef _MAC swapw(&rec.Length); #endif if (ifd.err) break; switch (rec.Type) { case PALFILE_VERSION: bError = YES; break; case PALFILE_COUNT: lpByte = Alloc((long)rec.Length); FileRead(&ifd, lpByte, rec.Length); FreeUp(lpByte); break; case PALFILE_COLORS: if (!lpPalette) { bError = YES; break; } lpWord = (LPWORD)Alloc((long)rec.Length); if (!lpWord) { Message (IDS_EMEMALLOC); bError = YES; break; } FileRead(&ifd, (LPTR)lpWord, rec.Length); if (ifd.err) { FreeUp((LPTR)lpWord); break; } #ifdef _MAC swapw(lpWord); #endif iColors = *lpWord; if ((iColors * sizeof(COLOR) + sizeof(WORD)) != rec.Length) { FreeUp((LPTR)lpWord); bError = YES; break; } lpPalette->iColors = iColors; if (!iColors) { FreeUp((LPTR)lpWord); break; } lpLong = (LPLONG)(lpWord+1); lpPalette->lpColorInfo = (LPCOLORINFO)Alloc((long)(sizeof(COLORINFO)*iColors)); if (!lpPalette->lpColorInfo) { Message(IDS_EMEMALLOC); FreeUp((LPTR)lpWord); bError = YES; break; } for (i = 0; i < iColors; ++i) { LPVOID lp = &lpPalette->lpColorInfo[i].rgb; #ifdef _MAC swapl((LPDWORD)lp); #endif CopyRGB(lpLong+i, lp); SetColorInfo( &lpPalette->lpColorInfo[i], &lpPalette->lpColorInfo[i], CS_RGB); } FreeUp((LPTR)lpWord); break; case PALFILE_NAME: if (Previous == PALFILE_NAME) { bError = YES; break; } if (lpPalette) { lpHeadPalette = LinkPalette(lpHeadPalette, lpPalette); lpPalette = NULL; } rec.Length = bound(rec.Length, 0, MAX_FNAME_LEN); FileRead(&ifd, (LPTR)szName, rec.Length); if (ifd.err) break; lpPalette = NewPalette(szName); if (!lpPalette) { Message (IDS_EMEMALLOC); bError = YES; break; } break; case PALFILE_GROUP: if (!lpPalette || (rec.Length != sizeof(lpPalette->dwGroup))) { bError = YES; break; } FileRead(&ifd, (LPTR)&lpPalette->dwGroup, rec.Length); #ifdef _MAC swapl((LPDWORD)(&lpPalette->dwGroup)); #endif break; case PALFILE_LABELS: if (!lpPalette) { bError = YES; break; } lpPalette->lpLabels = Alloc((long)rec.Length); if (!lpPalette->lpLabels) { Message (IDS_EMEMALLOC); bError = YES; break; } lpPalette->LabelsLength = rec.Length; FileRead(&ifd, lpPalette->lpLabels, rec.Length); break; case PALFILE_FORMAT: if (!lpPalette || (rec.Length > MAX_STR_LEN)) { bError = YES; break; } FileRead(&ifd, (LPTR)lpPalette->szFormat, rec.Length); break; case PALFILE_END: if (lpPalette) { lpHeadPalette = LinkPalette(lpHeadPalette, lpPalette); lpPalette = NULL; } break; default: bError = YES; break; } } _lclose(ifh); if (lpPalette) { if (lpPalette->lpColorInfo) FreeUp((LPTR)lpPalette->lpColorInfo); if (lpPalette->lpLabels) FreeUp((LPTR)lpPalette->lpLabels); FreeUp((LPTR)lpPalette); } if (ifd.err || bError || rec.Type != PALFILE_END || lpPalette) { Message(IDS_INVALIDPALETTE, lpFileName); FreeUpPalette(lpHeadPalette); return(NULL); } if ( !bCombine || !lpHeadPalette ) return( lpHeadPalette ); if ( !(lpBigPalette = CombinePalettes(lpHeadPalette)) ) Message (IDS_EMEMALLOC); FreeUpPalette(lpHeadPalette); return( lpBigPalette ); }
BOOL Palette_FillEntries( LPPALETTE lpHeadPalette, int iPalette, int iAfter, LPCOLORINFO lpColor1, LPCOLORINFO lpColor2, int iEntries, BOOL DoHSL ) /************************************************************************/ { LFIXED rate1, rate2; long range1, range2, range3; int start1, start2, start3; int iNewColors, iColors; LPCOLORINFO lpNewColors, lpSrc, lpDst; int iBefore, i, n, iStart, j; LPPALETTE lpPalette; BOOL fDoHS, fDoSL, fDoHL, fDoRG, fDoGB, fDoRB; BYTE Value; lpPalette = Palette_Get(lpHeadPalette, NULL, iPalette); if (!lpPalette) return(FALSE); iStart = iAfter; if (DoHSL) { range1 = (long)lpColor2->hsl.hue - (long)lpColor1->hsl.hue; range2 = (long)lpColor2->hsl.sat - (long)lpColor1->hsl.sat; range3 = (long)lpColor2->hsl.lum - (long)lpColor1->hsl.lum; } else { range1 = (long)lpColor2->rgb.red - (long)lpColor1->rgb.red; range2 = (long)lpColor2->rgb.green - (long)lpColor1->rgb.green; range3 = (long)lpColor2->rgb.blue - (long)lpColor1->rgb.blue; } if (iEntries) iNewColors = iEntries; else { iNewColors = max(max(abs(range1), abs(range2)), abs(range3)); iNewColors -= 2; } if (iNewColors <= 0) return(FALSE); fDoRG = iNewColors == 256 && !DoHSL && OPTION1; fDoGB = iNewColors == 256 && !DoHSL && OPTION2; fDoRB = iNewColors == 256 && !DoHSL && OPTION3; fDoHS = iNewColors == 256 && DoHSL && OPTION1; fDoSL = iNewColors == 256 && DoHSL && OPTION2; fDoHL = iNewColors == 256 && DoHSL && OPTION3; iColors = lpPalette->iColors + iNewColors; lpNewColors = (LPCOLORINFO)Alloc((long)iColors*(long)sizeof(COLORINFO)); if (!lpNewColors) return(FALSE); iBefore = iAfter + 1; lpSrc = lpPalette->lpColorInfo; lpDst = lpNewColors; if (lpPalette->iColors && iBefore > 0) { copy((LPTR)lpSrc, (LPTR)lpDst, iBefore*sizeof(COLORINFO)); lpSrc += iBefore; lpDst += iBefore; } if (fDoHS || fDoSL || fDoHL) { if (fDoHS) Value = lpColor1->hsl.lum; else if (fDoSL) Value = lpColor1->hsl.hue; else Value = lpColor1->hsl.sat; rate1 = FGET(251, 15); rate2 = FGET(255, 15); for (i = 0; i < 16; ++i) { for (j = 0; j < 16; ++j) { if (fDoHL) { n = FMUL(i, rate1); lpDst->hsl.hue = mbound( n, 0, 251 ); lpDst->hsl.sat = Value; n = FMUL(j, rate2); lpDst->hsl.lum = mbound( n, 0, 255 ); } else if (fDoHS) { n = FMUL(i, rate1); lpDst->hsl.hue = mbound( n, 0, 251 ); n = FMUL(j, rate2); lpDst->hsl.sat = mbound( n, 0, 255 ); lpDst->hsl.lum = Value; } else // fDoSL { lpDst->hsl.hue = Value; n = FMUL(i, rate2); lpDst->hsl.sat = mbound( n, 0, 255 ); n = FMUL(j, rate2); lpDst->hsl.lum = mbound( n, 0, 255 ); } SetColorInfo( lpDst, lpDst, CS_HSL ); ++lpDst; } } } else if (fDoRG || fDoGB || fDoRB) { if (fDoRG) Value = lpColor1->rgb.blue; else if (fDoGB) Value = lpColor1->rgb.red; else Value = lpColor1->rgb.green; rate1 = FGET(255, 15); for (i = 0; i < 16; ++i) { for (j = 0; j < 16; ++j) { if (fDoRG) { n = FMUL(i, rate1); lpDst->rgb.red = mbound( n, 0, 255 ); n = FMUL(j, rate1); lpDst->rgb.green = mbound( n, 0, 255 ); lpDst->rgb.blue = Value; } else if (fDoGB) { lpDst->rgb.red = Value; n = FMUL(i, rate1); lpDst->rgb.green = mbound( n, 0, 255 ); n = FMUL(j, rate1); lpDst->rgb.blue = mbound( n, 0, 255 ); } else // fDoRB { n = FMUL(i, rate1); lpDst->rgb.red = mbound( n, 0, 255 ); lpDst->rgb.green = Value; n = FMUL(j, rate1); lpDst->rgb.blue = mbound( n, 0, 255 ); } SetColorInfo( lpDst, lpDst, CS_RGB ); ++lpDst; } } } else if (DoHSL) { start1 = lpColor1->hsl.hue; start2 = lpColor1->hsl.sat; start3 = lpColor1->hsl.lum; for (i = 0; i < iNewColors; ++i) { // range from 0 to 1 rate1 = FGET(i+1, iNewColors+1); n = start1 + WHOLE(rate1*range1); lpDst->hsl.hue = mbound( n, 0, 255 ); n = start2 + WHOLE(rate1*range2); lpDst->hsl.sat = mbound( n, 0, 255 ); n = start3 + WHOLE(rate1*range3); lpDst->hsl.lum = mbound( n, 0, 255 ); SetColorInfo( lpDst, lpDst, CS_HSL ); ++lpDst; } } else { start1 = lpColor1->rgb.red; start2 = lpColor1->rgb.green; start3 = lpColor1->rgb.blue; for (i = 0; i < iNewColors; ++i) { // range from 0 to 1 rate1 = FGET(i+1, iNewColors+1); n = start1 + WHOLE(rate1*range1); lpDst->rgb.red = mbound( n, 0, 255 ); n = start2 + WHOLE(rate1*range2); lpDst->rgb.green = mbound( n, 0, 255 ); n = start3 + WHOLE(rate1*range3); lpDst->rgb.blue = mbound( n, 0, 255 ); SetColorInfo( lpDst, lpDst, CS_RGB ); ++lpDst; } } iAfter = lpPalette->iColors-iAfter-1; if (lpPalette->iColors && iAfter > 0) copy((LPTR)lpSrc, (LPTR)lpDst, iAfter*sizeof(COLORINFO)); if (lpPalette->lpColorInfo) FreeUp((LPTR)lpPalette->lpColorInfo); lpPalette->lpColorInfo = lpNewColors; lpPalette->iColors = iColors; Palette_AppendAdjustLabels(lpHeadPalette, iPalette, iStart, iNewColors); return(TRUE); }