2016-09-14 9 views
0

gtk2hs 카이로에서 간단한 이미지를 그려보고 있습니다. save 명령을 사용하여 현재 상태를 저장하고 restore 명령을 사용하여 복원 할 수 있다는 것을 알고 있습니다. 그대가 확인하는 방법은 현재 상태가 저장되어 있는지 확인하는 것입니다. 창 크기를 조정할 때 이미지 크기를 조정하지 않거나 크기 조정을 방지하는 것이 좋습니다. 창 크기를 조정할 때마다 이미지를 다시 계산하고 싶지 않습니다.Gtk2hs Cairo에서 렌더링 상태가 저장되어 있는지 여부를 확인하여 Haskell의 크기 조정 창에서 이미지 크기 조정을 방지하는 방법

답변

1

saverestore 작업은 이미지가 다시 계산되는지 여부와 관련이 없습니다.

let redrawStaticLayers = do 
     (width, height) <- widgetGetSize window 
     drawWin <- widgetGetDrawWindow window 
     background <- createImageSurface FormatARGB32 width height 
     foreground <- createImageSurface FormatARGB32 width height 
     let clear = do 
       save 
       setOperator OperatorClear 
       paint 
       restore 
     renderWith background $ do 
      clear 
      drawClockBackground True width height 
     renderWith foreground $ do 
      clear 
      drawClockForeground True width height 
     writeIORef backgroundRef (Just background) 
     writeIORef foregroundRef (Just foreground) 

    onRealize window redrawStaticLayers 

    sizeRef <- newIORef (initialSize, initialSize) 
    timeoutHandlerRef <- newIORef Nothing 
    window `on` configureEvent $ do 
    (w,h) <- eventSize 
    liftIO $ do 
    size <- readIORef sizeRef 
    writeIORef sizeRef (w,h) 
    when (size /= (w,h)) $ do 

     background <- readIORef backgroundRef 
     foreground <- readIORef foregroundRef 
     maybe (return()) surfaceFinish background 
     maybe (return()) surfaceFinish foreground 

     writeIORef backgroundRef Nothing 
     writeIORef foregroundRef Nothing 

     timeoutHandler <- readIORef timeoutHandlerRef 
     maybe (return()) timeoutRemove timeoutHandler 

     handler <- timeoutAddFull (do 
     writeIORef timeoutHandlerRef Nothing 
     redrawStaticLayers 
     widgetQueueDraw window 
     return False 
     ) priorityDefaultIdle 300 
     writeIORef timeoutHandlerRef (Just handler) 

    return False 

    window `on` exposeEvent $ do 
    drawWin <- eventWindow 
    exposeRegion <- eventRegion 
    liftIO $ do 
    (width, height) <- drawableGetSize drawWin 

    background <- readIORef backgroundRef 
    foreground <- readIORef foregroundRef 

    renderWithDrawable drawWin $ do 
     region exposeRegion 
     clip 

     save 
     setOperator OperatorSource 
     setSourceRGBA 0 0 0 0 
     paint 
     restore 

     case background of 
     Nothing -> drawClockBackground False width height 
     Just background -> do 
      setSourceSurface background 0 0 
      paint 

     drawClockHands (isJust background) width height 

     case foreground of 
     Nothing -> drawClockForeground False width height 
     Just foreground -> do 
      setSourceSurface foreground 0 0 
      paint 

    return True 
: 그러나 Cairo 액션의 수행 결과를 캐시하는 방법을 보여줍니다 gtk2hs에 포함 된 데모가, 특히 라인 320-404 main의, cairo/demo/Clock.hs 참조