react-native-mask-segment-c.../dist/components/MaskSegmentCanvas.types.d.ts
a1518 56738b1f06 feat: add MaskSegmentApp source code and config
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 00:23:52 -07:00

189 lines
6.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { ReactNode } from 'react';
import type { StyleProp, TextStyle, ViewStyle } from 'react-native';
import type { SegmentRegion } from '../utils/maskSegmentation';
import type { MaskSemanticColor } from '../utils/maskSemanticPalette';
export type BgrColor = {
b: number;
g: number;
r: number;
};
export type MaskSegmentWatchState = 'init' | 'images_loaded' | 'mask_aligned' | 'mask_sampled' | 'regions_ready' | 'layers_ready' | 'interactive' | 'mask_paths_ready' | 'error';
export type MaskSegmentWatchDetail = {
regionCount?: number;
maskPathsReady?: boolean;
freqLayersReady?: boolean;
errorMessage?: string;
};
export type PipelinePreset = 'high' | 'medium' | 'low';
export type PipelineConfig = {
maxImageLongSide?: number;
/** 高低频 LAB 处理最长边(可低于 maxImageLongSideShader 拉伸采样) */
paintFreqMaxLongSide?: number;
originPreviewMaxLongSide?: number;
maskPathMaxLongSide?: number;
minContourArea?: number;
contourApproxEpsilon?: number;
maxRegions?: number;
};
export type MaskSegmentConfig = {
semanticColors?: MaskSemanticColor[];
baseboardMaxColorDist?: number;
blackThreshold?: number;
quantStep?: number;
baseboardStripQuantKeys?: string[];
wallQuantKeys?: string[];
cabinetQuantKeys?: string[];
maxRegionColors?: number;
secondarySemanticNames?: string[];
secondaryMinPixelRatio?: number;
junctionHRadiusPx?: number;
junctionVRadiusPx?: number;
kickBridgeHalfWPx?: number;
baseboardJunctionRowMarginPx?: number;
baseboardJunctionVReachPx?: number;
baseboardMinRunPx?: number;
};
export type PaintConfig = {
palette?: BgrColor[];
colorBaseOpacity?: number;
lLightOpacity?: number;
textureOpacity?: number;
lLowBlurKernel?: number;
lLowContrast?: number;
lLowBrightness?: number;
lHighGain?: number;
maskFeatherColor?: number;
maskFeatherTexture?: number;
regionOverlayFill?: string;
regionOutlineStrokeWidth?: number;
};
export type InteractionConfig = {
kickMaskPickRadiusPx?: number;
pickMapSearchRadiusPx?: number;
thinStripPadding?: number;
regionPadding?: number;
initRegionFlashMs?: number;
enableInitRegionFlash?: boolean;
};
export type PaintedRegionRecord = {
regionId: number;
regionName: string;
color: BgrColor;
configJson?: Record<string, unknown>;
};
export type MaskSegmentSession = {
version: 1;
originUrl: string;
maskUrl: string;
painted: PaintedRegionRecord[];
paintHistory: number[];
currentColor?: BgrColor;
currentColorConfigJson?: Record<string, unknown>;
savedAt: number;
};
export type SavePaintResult = {
filePath: string;
width: number;
height: number;
paintedCount: number;
previewPath?: string;
};
export type SavePaintOptions = {
destDir?: string;
};
export type PaintSuccessPayload = {
kind: 'painted';
regionId: number;
regionName: string;
color: BgrColor;
configJson?: Record<string, unknown>;
};
export type PaintBrushRequiredPayload = {
kind: 'brush_required';
/** 未选笔刷时的提示文案 */
hint: string;
regionId: number;
regionName: string;
};
export type PaintCallbackPayload = PaintSuccessPayload | PaintBrushRequiredPayload;
export type OverlayButtonRenderProps = {
onPress: () => void;
disabled?: boolean;
text: string;
};
export type MaskSegmentCanvasRef = {
reset: () => void;
swap: (showOrigin?: boolean) => void;
save: (options?: SavePaintOptions) => Promise<SavePaintResult>;
session: () => MaskSegmentSession;
loadSession: (session: MaskSegmentSession) => void;
setPaintColor: (color: BgrColor, configJson?: Record<string, unknown>) => void;
setMaskConfig: (config: MaskSegmentConfig) => void;
clearAllPaint: () => void;
/** Undo the most recent single coloring (paint) step. Distinct from clearAllPaint (full reset). */
undoSelection?: () => void;
resegment: () => Promise<void>;
getRegions: () => SegmentRegion[];
getPaintedRegions: () => PaintedRegionRecord[];
/** Returns the most recent auto-export or save() result, if any. */
getLastExport?: () => SavePaintResult | null;
};
export type MaskSegmentCanvasProps = {
originUrl?: string;
maskUrl?: string;
/** @deprecated 使用 originUrl */
originImgPath?: string;
/** @deprecated 使用 maskUrl */
maskImgPath?: string;
/** 掩码语义识别色,初始化配置;等同 maskConfig.semanticColors */
semanticColors?: MaskSemanticColor[];
/** 分区虚线高亮色,初始化配置;等同 paintConfig.regionOverlayFill */
regionOutlineColor?: string;
maskConfig?: MaskSegmentConfig;
/** Performance preset (high / medium / low). Merged with pipelineConfig overrides. */
pipelinePreset?: PipelinePreset;
pipelineConfig?: PipelineConfig;
paintConfig?: PaintConfig;
interactionConfig?: InteractionConfig;
initialSession?: MaskSegmentSession;
initialPaintColor?: BgrColor;
initialPaintConfigJson?: Record<string, unknown>;
showDebugPickers?: boolean;
showToolbar?: boolean;
showColorBar?: boolean;
showStatusRow?: boolean;
showOverlayButtons?: boolean;
disabled?: boolean;
style?: StyleProp<ViewStyle>;
canvasStyle?: StyleProp<ViewStyle>;
/**
* Max container height available for this component (px). When set, the SDK
* computes canvas dimensions as a fit-contain within (screenWidth - 20, maxHeight)
* instead of using the full image aspect at full screen width. This prevents
* internal ScrollView scrolling for tall images.
*/
maxHeight?: number;
undoButtonStyle?: StyleProp<ViewStyle>;
compareButtonStyle?: StyleProp<ViewStyle>;
undoButtonTextStyle?: StyleProp<TextStyle>;
compareButtonTextStyle?: StyleProp<TextStyle>;
undoButtonText?: string;
compareButtonText?: string;
compareExitButtonText?: string;
renderUndoButton?: (props: OverlayButtonRenderProps) => ReactNode;
renderCompareButton?: (props: OverlayButtonRenderProps) => ReactNode;
onWatch?: (state: MaskSegmentWatchState, durationMs: number, detail?: MaskSegmentWatchDetail) => void;
onPaintCallback?: (payload: PaintCallbackPayload) => void;
onError?: (message: string, error?: unknown) => void;
/**
* When true, once the canvas reaches a ready interactive state (segmentation complete
* + any initialSession / painted colors applied), the SDK will automatically call its
* internal save pipeline to produce the recolored result image and fire onExported.
* This moves "auto-generate After preview" capability inside the SDK.
*/
autoExportOnReady?: boolean;
/** Fired by SDK when autoExportOnReady produced a result (the recolored file). */
onExported?: (result: SavePaintResult) => void;
};
export type { SegmentRegion, MaskSemanticColor };
//# sourceMappingURL=MaskSegmentCanvas.types.d.ts.map