2016-09-14 3 views
0

gtk2hsカイロで単純なイメージを描画しようとしています。 saveコマンドを使用して現在の状態を保存し、restoreコマンドを使用して復元することができます。あなたが確認する方法は、状態が現在保存されているかどうかです。ウィンドウのサイズを変更するときに画像の縮尺を変えたくない場合や、サイズ変更を防ぐのが良い場合はそうです。私はウィンドウがサイズ変更されるたびにイメージを再計算したくありません。レンダリングステートが保存されているかどうかを確認する方法Gtk2hs CairoでHaskellのウィンドウのサイズを変更する際のスケーリングイメージを防ぐ方法

答えて

1

saverestoreアクションは実際にイメージが再計算されるかどうかに関係しません。しかしcairo/demo/Clock.hsを参照して、Cairoアクションを実行した結果をキャッシュする方法を示しgtk2hs、特にラインmainの320から404に含まれているデモがあります:

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 
関連する問題