tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

gfxWindowsNativeDrawing.h (3330B)


      1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 * This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 #ifndef _GFXWINDOWSNATIVEDRAWING_H_
      7 #define _GFXWINDOWSNATIVEDRAWING_H_
      8 
      9 #include <windows.h>
     10 
     11 #include "gfxContext.h"
     12 #include "gfxWindowsSurface.h"
     13 
     14 class MOZ_STACK_CLASS gfxWindowsNativeDrawing {
     15 public:
     16  /* Flags for notifying this class what kind of operations the native
     17   * drawing supports
     18   */
     19 
     20  enum {
     21    /* Whether the native drawing can draw to a surface of content COLOR_ALPHA
     22     */
     23    CAN_DRAW_TO_COLOR_ALPHA = 1 << 0,
     24    CANNOT_DRAW_TO_COLOR_ALPHA = 0 << 0,
     25 
     26    /* Whether the native drawing can be scaled using SetWorldTransform */
     27    CAN_AXIS_ALIGNED_SCALE = 1 << 1,
     28    CANNOT_AXIS_ALIGNED_SCALE = 0 << 1,
     29 
     30    /* Whether the native drawing can be both scaled and rotated arbitrarily
     31       using SetWorldTransform */
     32    CAN_COMPLEX_TRANSFORM = 1 << 2,
     33    CANNOT_COMPLEX_TRANSFORM = 0 << 2,
     34  };
     35 
     36  /* Create native win32 drawing for a rectangle bounded by
     37   * nativeRect.
     38   *
     39   * Typical usage looks like:
     40   *
     41   *   gfxWindowsNativeDrawing nativeDraw(ctx, destGfxRect, capabilities);
     42   *   do {
     43   *     HDC dc = nativeDraw.BeginNativeDrawing();
     44   *     if (!dc)
     45   *       return NS_ERROR_FAILURE;
     46   *
     47   *     RECT winRect;
     48   *     nativeDraw.TransformToNativeRect(rect, winRect);
     49   *
     50   *       ... call win32 operations on HDC to draw to winRect ...
     51   *
     52   *     nativeDraw.EndNativeDrawing();
     53   *   } while (nativeDraw.ShouldRenderAgain());
     54   *   nativeDraw.PaintToContext();
     55   */
     56  gfxWindowsNativeDrawing(
     57      gfxContext* ctx, const gfxRect& nativeRect,
     58      uint32_t nativeDrawFlags = CANNOT_DRAW_TO_COLOR_ALPHA |
     59                                 CANNOT_AXIS_ALIGNED_SCALE |
     60                                 CANNOT_COMPLEX_TRANSFORM);
     61 
     62  /* Returns a HDC which may be used for native drawing.  This HDC is valid
     63   * until EndNativeDrawing is called; if it is used for drawing after that
     64   * time, the result is undefined. */
     65  HDC BeginNativeDrawing();
     66 
     67  /* Transform the native rect into something valid for rendering
     68   * to the HDC.  This may or may not change RECT, depending on
     69   * whether SetWorldTransform is used or not. */
     70  void TransformToNativeRect(const gfxRect& r, RECT& rout);
     71 
     72  /* Marks the end of native drawing */
     73  void EndNativeDrawing();
     74 
     75  /* Returns true if the native drawing should be executed again */
     76  bool ShouldRenderAgain();
     77 
     78  /* Places the result to the context, if necessary */
     79  void PaintToContext();
     80 
     81 private:
     82  gfxContext* mContext;
     83  gfxRect mNativeRect;
     84  uint32_t mNativeDrawFlags;
     85 
     86  // what state the rendering is in
     87  uint8_t mRenderState;
     88 
     89  mozilla::gfx::Point mDeviceOffset;
     90  RefPtr<gfxPattern> mBlackPattern, mWhitePattern;
     91 
     92  enum TransformType { TRANSLATION_ONLY, AXIS_ALIGNED_SCALE, COMPLEX };
     93 
     94  TransformType mTransformType;
     95  gfxPoint mTranslation;
     96  mozilla::gfx::MatrixScalesDouble mScale;
     97  XFORM mWorldTransform;
     98 
     99  // saved state
    100  RefPtr<gfxWindowsSurface> mWinSurface, mBlackSurface, mWhiteSurface;
    101  HDC mDC;
    102  XFORM mOldWorldTransform;
    103  POINT mOrigViewportOrigin;
    104  mozilla::gfx::IntSize mTempSurfaceSize;
    105 };
    106 
    107 #endif