1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef CORE_FXGE_FX_DIB_H_
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define CORE_FXGE_FX_DIB_H_
9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <tuple>
11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <utility>
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_coordinates.h"
14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/widestring.h"
15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovenum FXDIB_Format {
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXDIB_Invalid = 0,
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXDIB_1bppRgb = 0x001,
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXDIB_8bppRgb = 0x008,
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXDIB_Rgb = 0x018,
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXDIB_Rgb32 = 0x020,
22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  FXDIB_1bppMask = 0x101,
23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  FXDIB_8bppMask = 0x108,
24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  FXDIB_8bppRgba = 0x208,
25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  FXDIB_Rgba = 0x218,
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXDIB_Argb = 0x220,
27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  FXDIB_1bppCmyk = 0x401,
28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  FXDIB_8bppCmyk = 0x408,
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXDIB_Cmyk = 0x420,
30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  FXDIB_8bppCmyka = 0x608,
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXDIB_Cmyka = 0x620,
32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstruct PixelWeight {
35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int m_SrcStart;
36d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int m_SrcEnd;
37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int m_Weights[1];
38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanntypedef uint32_t FX_ARGB;
41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanntypedef uint32_t FX_COLORREF;
42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanntypedef uint32_t FX_CMYK;
43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannclass CFX_ClipRgn;
44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannclass CFX_DIBSource;
45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannclass CStretchEngine;
46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannextern const int16_t SDP_Table[513];
48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_DOWNSAMPLE 0x04
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_INTERPOL 0x20
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BICUBIC_INTERPOL 0x80
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_NOSMOOTH 0x100
53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_NORMAL 0
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_MULTIPLY 1
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_SCREEN 2
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_OVERLAY 3
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_DARKEN 4
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_LIGHTEN 5
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_COLORDODGE 6
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_COLORBURN 7
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_HARDLIGHT 8
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_SOFTLIGHT 9
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_DIFFERENCE 10
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_EXCLUSION 11
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_NONSEPARABLE 21
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_HUE 21
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_SATURATION 22
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_COLOR 23
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_LUMINOSITY 24
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_UNSUPPORTED -1
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_RGB(r, g, b) ((r) | ((g) << 8) | ((b) << 16))
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_GetRValue(rgb) ((rgb)&0xff)
75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_GetGValue(rgb) (((rgb) >> 8) & 0xff)
76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_GetBValue(rgb) (((rgb) >> 16) & 0xff)
77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_GetCValue(cmyk) ((uint8_t)((cmyk) >> 24) & 0xff)
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_GetMValue(cmyk) ((uint8_t)((cmyk) >> 16) & 0xff)
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_GetYValue(cmyk) ((uint8_t)((cmyk) >> 8) & 0xff)
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_GetKValue(cmyk) ((uint8_t)(cmyk)&0xff)
82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmanninline FX_CMYK CmykEncode(int c, int m, int y, int k) {
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (c << 24) | (m << 16) | (y << 8) | k;
85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Returns tuple a, r, g, b
88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::tuple<int, int, int, int> ArgbDecode(FX_ARGB argb);
89d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Returns pair a, rgb
91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::pair<int, FX_COLORREF> ArgbToColorRef(FX_ARGB argb);
92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmanninline FX_ARGB ArgbEncode(int a, int r, int g, int b) {
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (a << 24) | (r << 16) | (g << 8) | b;
95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_ARGB ArgbEncode(int a, FX_COLORREF rgb);
97d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannFX_ARGB StringToFXARGB(const WideStringView& view);
99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_A(argb) ((uint8_t)((argb) >> 24))
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_R(argb) ((uint8_t)((argb) >> 16))
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_G(argb) ((uint8_t)((argb) >> 8))
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_B(argb) ((uint8_t)(argb))
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_MAKE(a, r, g, b) \
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  (((uint32_t)(a) << 24) | ((r) << 16) | ((g) << 8) | (b))
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_MUL_ALPHA(argb, alpha) \
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  (((((argb) >> 24) * (alpha) / 255) << 24) | ((argb)&0xffffff))
108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXRGB2GRAY(r, g, b) (((b)*11 + (g)*59 + (r)*30) / 100)
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_ALPHA_MERGE(backdrop, source, source_alpha) \
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  (((backdrop) * (255 - (source_alpha)) + (source) * (source_alpha)) / 255)
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_GETDIB(p)                              \
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ((((uint8_t*)(p))[0]) | (((uint8_t*)(p))[1] << 8) | \
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann   (((uint8_t*)(p))[2] << 16) | (((uint8_t*)(p))[3] << 24))
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_SETDIB(p, argb)                  \
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ((uint8_t*)(p))[0] = (uint8_t)(argb),         \
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ((uint8_t*)(p))[1] = (uint8_t)((argb) >> 8),  \
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ((uint8_t*)(p))[2] = (uint8_t)((argb) >> 16), \
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ((uint8_t*)(p))[3] = (uint8_t)((argb) >> 24)
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_SETRGBORDERDIB(p, argb)          \
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ((uint8_t*)(p))[3] = (uint8_t)(argb >> 24),   \
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ((uint8_t*)(p))[0] = (uint8_t)((argb) >> 16), \
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ((uint8_t*)(p))[1] = (uint8_t)((argb) >> 8),  \
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ((uint8_t*)(p))[2] = (uint8_t)(argb)
125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXARGB_TODIB(argb) (argb)
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXCMYK_TODIB(cmyk)                                    \
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ((uint8_t)((cmyk) >> 24) | ((uint8_t)((cmyk) >> 16)) << 8 | \
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann   ((uint8_t)((cmyk) >> 8)) << 16 | ((uint8_t)(cmyk) << 24))
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_TOBGRORDERDIB(argb)                       \
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ((uint8_t)(argb >> 16) | ((uint8_t)(argb >> 8)) << 8 | \
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann   ((uint8_t)(argb)) << 16 | ((uint8_t)(argb >> 24) << 24))
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannFX_RECT FXDIB_SwapClipBox(FX_RECT& clip,
134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                          int width,
135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                          int height,
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          bool bFlipX,
137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                          bool bFlipY);
138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // CORE_FXGE_FX_DIB_H_
140