Home | History | Annotate | Download | only in pdf
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef PDF_DRAW_UTILS_H_
      6 #define PDF_DRAW_UTILS_H_
      7 
      8 #include <vector>
      9 
     10 #include "base/basictypes.h"
     11 #include "ppapi/cpp/image_data.h"
     12 #include "ppapi/cpp/rect.h"
     13 
     14 namespace chrome_pdf {
     15 
     16 const uint8 kOpaqueAlpha = 0xFF;
     17 const uint8 kTransparentAlpha = 0x00;
     18 
     19 void AlphaBlend(const pp::ImageData& src, const pp::Rect& src_rc,
     20                 pp::ImageData* dest, const pp::Point& dest_origin,
     21                 uint8 alpha_adjustment);
     22 
     23 // Fill rectangle with gradient horizontally or vertically. Start is a color of
     24 // top-left point of the rectangle, end color is a color of
     25 // top-right (horizontal==true) or bottom-left (horizontal==false) point.
     26 void GradientFill(pp::ImageData* image,
     27                   const pp::Rect& rc,
     28                   uint32 start_color,
     29                   uint32 end_color,
     30                   bool horizontal);
     31 
     32 // Fill dirty rectangle with gradient, where gradient color set for corners of
     33 // gradient rectangle. Parts of the dirty rect outside of gradient rect will
     34 // be unchanged.
     35 void GradientFill(pp::Instance* instance,
     36                   pp::ImageData* image,
     37                   const pp::Rect& dirty_rc,
     38                   const pp::Rect& gradient_rc,
     39                   uint32 start_color,
     40                   uint32 end_color,
     41                   bool horizontal,
     42                   uint8 transparency);
     43 
     44 // Copy one image into another. If stretch is true, the result occupy the entire
     45 // dest_rc. If stretch is false, dest_rc.point will be used as an origin of the
     46 // result image. Copy will ignore all pixels with transparent alpha from the
     47 // source image.
     48 void CopyImage(const pp::ImageData& src, const pp::Rect& src_rc,
     49                pp::ImageData* dest, const pp::Rect& dest_rc,
     50                bool stretch);
     51 
     52 // Fill in rectangle with specified color.
     53 void FillRect(pp::ImageData* image, const pp::Rect& rc, uint32 color);
     54 
     55 // Shadow Matrix contains matrix for shadow rendering. To reduce amount of
     56 // calculations user may choose to cache matrix and reuse it if nothing changed.
     57 class ShadowMatrix {
     58  public:
     59   // Matrix parameters.
     60   // depth - how big matrix should be. Shadow will go smoothly across the
     61   // entire matrix from black to background color.
     62   // If factor == 1, smoothing will be linear from 0 to the end (depth),
     63   // if 0 < factor < 1, smoothing will drop faster near 0.
     64   // if factor > 1, smoothing will drop faster near the end (depth).
     65   ShadowMatrix(uint32 depth, double factor, uint32 background);
     66 
     67   ~ShadowMatrix();
     68 
     69   uint32 GetValue(int32 x, int32 y) const { return matrix_[y * depth_ + x]; }
     70 
     71   uint32 depth() const { return depth_; }
     72   double factor() const { return factor_; }
     73   uint32 background() const { return background_; }
     74 
     75  private:
     76   uint32 depth_;
     77   double factor_;
     78   uint32 background_;
     79   std::vector<uint32> matrix_;
     80 };
     81 
     82 // Draw shadow on the image using provided ShadowMatrix.
     83 // shadow_rc - rectangle occupied by shadow
     84 // object_rc - rectangle that drops the shadow
     85 // clip_rc - clipping region
     86 void DrawShadow(pp::ImageData* image,
     87                 const pp::Rect& shadow_rc,
     88                 const pp::Rect& object_rc,
     89                 const pp::Rect& clip_rc,
     90                 const ShadowMatrix& matrix);
     91 
     92 }  // namespace chrome_pdf
     93 
     94 #endif  // PDF_DRAW_UTILS_H_
     95