1/* 2 * Copyright (c) 2023-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import { StringUtil } from '../utils/StringUtil'; 17const ISO_A3_WIDTH: number = 11690; 18const ISO_A3_HEIGHT: number = 16540; 19const ISO_A4_WIDTH: number = 8268; 20const ISO_A4_HEIGHT: number = 11692; 21const ISO_A5_WIDTH: number = 5830; 22const ISO_A5_HEIGHT: number = 8270; 23const ISO_C5_WIDTH: number = 6380; 24const ISO_C5_HEIGHT: number = 9020; 25const ISO_DL_WIDTH: number = 4330; 26const ISO_DL_HEIGHT: number = 8660; 27const LEGAL_WIDTH: number = 8500; 28const LEGAL_HEIGHT: number = 14000; 29const LETTER_WIDTH: number = 4000; 30const LETTER_HEIGHT: number = 6000; 31const JIS_B4_WIDTH: number = 10119; 32const JIS_B4_HEIGHT: number = 14331; 33const JIS_B5_WIDTH: number = 7165; 34const JIS_B5_HEIGHT: number = 10118; 35const PHOTO_5R_WIDTH: number = 5000; 36const PHOTO_5R_HEIGHT: number = 7000; 37const PHOTO_4R_WIDTH: number = 4000; 38const PHOTO_4R_HEIGHT: number = 6000; 39const NA_GOVT_LETTER_8IN_WIDTH: number = 8000; 40const NA_GOVT_LETTER_8IN_HEIGHT: number = 10000; 41const NA_LEDGER_11IN_WIDTH: number = 11000; 42const NA_LEDGER_11IN_HEIGHT: number = 17000; 43const JPN_HAGAKI_WIDTH: number = 3940; 44const JPN_HAGAKI_HEIGHT: number = 5830; 45const OM_SDC_PHOTO_WIDTH: number = 3504; 46const OM_SDC_PHOTO_HEIGHT: number = 4685; 47const OM_CARD_WIDTH: number = 2126; 48const OM_CARD_HEIGHT: number = 3386; 49const OE_PHOTO_L_WIDTH: number = 3500; 50const OE_PHOTO_L_HEIGHT: number = 5000; 51const INT_DL_ENVELOPE_WIDTH: number = 4330; 52const INT_DL_ENVELOPE_HEIGHT: number = 8660; 53const B_TABLOID_L_WIDTH: number = 11000; 54const B_TABLOID_L_HEIGHT: number = 17000; 55 56const ISO_A3_WIDTH_MM: number = 297; 57const ISO_A3_HEIGHT_MM: number = 420; 58const ISO_A4_WIDTH_MM: number = 210; 59const ISO_A4_HEIGHT_MM: number = 297; 60const ISO_A5_WIDTH_MM: number = 148; 61const ISO_A5_HEIGHT_MM: number = 210; 62const ISO_C5_WIDTH_MM: number = 162; 63const ISO_C5_HEIGHT_MM: number = 229; 64const ISO_DL_WIDTH_MM: number = 110; 65const ISO_DL_HEIGHT_MM: number = 220; 66const LEGAL_WIDTH_MM: number = 216; 67const LEGAL_HEIGHT_MM: number = 356; 68const LETTER_WIDTH_MM: number = 216; 69const LETTER_HEIGHT_MM: number = 279; 70const JIS_B4_WIDTH_MM: number = 257; 71const JIS_B4_HEIGHT_MM: number = 364; 72const JIS_B5_WIDTH_MM: number = 182; 73const JIS_B5_HEIGHT_MM: number = 257; 74const PHOTO_5R_WIDTH_MM: number = 127; 75const PHOTO_5R_HEIGHT_MM: number = 178; 76const PHOTO_4R_WIDTH_MM: number = 102; 77const PHOTO_4R_HEIGHT_MM: number = 152; 78const NA_GOVT_LETTER_8IN_WIDTH_MM: number = 203; 79const NA_GOVT_LETTER_8IN_HEIGHT_MM: number = 267; 80const NA_LEDGER_11IN_WIDTH_MM: number = 279; 81const NA_LEDGER_11IN_HEIGHT_MM: number = 432; 82const JPN_HAGAKI_WIDTH_MM: number = 100; 83const JPN_HAGAKI_HEIGHT_MM: number = 148; 84const OM_SDC_PHOTO_WIDTH_MM: number = 89; 85const OM_SDC_PHOTO_HEIGHT_MM: number = 119; 86const OM_CARD_WIDTH_MM: number = 54; 87const OM_CARD_HEIGHT_MM: number = 86; 88const OE_PHOTO_L_WIDTH_MM: number = 89; 89const OE_PHOTO_L_HEIGHT_MM: number = 127; 90const INT_DL_ENVELOPE_WIDTH_MM: number = 110; 91const INT_DL_ENVELOPE_HEIGHT_MM: number = 220; 92const B_TABLOID_L_WIDTH_MM: number = 279; 93const B_TABLOID_L_HEIGHT_MM: number = 432; 94 95enum MediaSizeCode { 96 US_LETTER = 2, 97 US_LEGAL = 3, 98 B_TABLOID = 6, 99 US_GOVERNMENT_LETTER = 7, 100 LEDGER = 11, 101 ISO_A5 = 25, 102 ISO_A4 = 26, 103 ISO_A3 = 27, 104 JIS_B5 = 45, 105 JIS_B4 = 46, 106 JPN_HAGAKI_PC = 71, 107 INDEX_CARD_4X6 = 74, 108 INT_DL_ENVELOPE = 90, 109 INDEX_CARD_5X7 = 122, 110 ISO_C5 = 183, 111 ISO_DL = 184, 112 PHOTO_89X119 = 302, 113 CARD_54X86 = 303, 114 OE_PHOTO_L = 304, 115} 116 117export class MediaSize { 118 private static readonly PREVIEW_POINTS_IN_INCH = 72; 119 private static readonly MILS_PER_INCH:number = 1000; 120 public static readonly THREE_HUNDRED_DPI: number = 300; 121 122 public static readonly ISO_A3: MediaSize = new MediaSize(MediaSizeCode.ISO_A3.toString(), 123 'iso_a3_297x420mm', 'A3', ISO_A3_WIDTH, ISO_A3_HEIGHT, ISO_A3_WIDTH_MM, ISO_A3_HEIGHT_MM); 124 public static readonly ISO_A4: MediaSize = new MediaSize(MediaSizeCode.ISO_A4.toString(), 125 'iso_a4_210x297mm', 'A4', ISO_A4_WIDTH, ISO_A4_HEIGHT, ISO_A4_WIDTH_MM, ISO_A4_HEIGHT_MM); 126 public static readonly ISO_A5: MediaSize = new MediaSize(MediaSizeCode.ISO_A5.toString(), 127 'iso_a5_148x210mm', 'A5', ISO_A5_WIDTH, ISO_A5_HEIGHT, ISO_A5_WIDTH_MM, ISO_A5_HEIGHT_MM); 128 public static readonly ISO_C5: MediaSize = new MediaSize(MediaSizeCode.ISO_C5.toString(), 129 'iso_c5_162x229mm', StringUtil.getString('ISO_C5'), ISO_C5_WIDTH, ISO_C5_HEIGHT, ISO_C5_WIDTH_MM, ISO_C5_HEIGHT_MM); 130 public static readonly ISO_DL: MediaSize = new MediaSize(MediaSizeCode.ISO_DL.toString(), 131 'iso_dl_110x220mm', StringUtil.getString('ISO_DL'), ISO_DL_WIDTH, ISO_DL_HEIGHT, ISO_DL_WIDTH_MM, ISO_DL_HEIGHT_MM); 132 public static readonly LEGAL: MediaSize = new MediaSize(MediaSizeCode.US_LEGAL.toString(), 133 'na_legal_8.5x14in', 'Legal', LEGAL_WIDTH, LEGAL_HEIGHT, LEGAL_WIDTH_MM, LEGAL_HEIGHT_MM); 134 public static readonly LETTER: MediaSize = new MediaSize(MediaSizeCode.US_LETTER.toString(), 135 'na_letter_8.5x11in', 'Letter', LETTER_WIDTH, LETTER_HEIGHT, LETTER_WIDTH_MM, LETTER_HEIGHT_MM); 136 public static readonly JIS_B5: MediaSize = new MediaSize(MediaSizeCode.JIS_B5.toString(), 137 'jis_b5_182x257mm', 'B5', JIS_B5_WIDTH, JIS_B5_HEIGHT, JIS_B5_WIDTH_MM, JIS_B5_HEIGHT_MM); 138 public static readonly JIS_B4: MediaSize = new MediaSize(MediaSizeCode.JIS_B4.toString(), 139 'jis_b4_257x364mm', 'B4', JIS_B4_WIDTH, JIS_B4_HEIGHT, JIS_B4_WIDTH_MM, JIS_B4_HEIGHT_MM); 140 public static readonly PHOTO_5x7: MediaSize = new MediaSize(MediaSizeCode.INDEX_CARD_5X7.toString(), 141 'na_5x7_5x7in', StringUtil.getString('PHOTO_5x7'), PHOTO_5R_WIDTH, PHOTO_5R_HEIGHT, PHOTO_5R_WIDTH_MM, PHOTO_5R_HEIGHT_MM); 142 public static readonly PHOTO_4x6: MediaSize = new MediaSize(MediaSizeCode.INDEX_CARD_4X6.toString(), 143 'na_index-4x6_4x6in', StringUtil.getString('PHOTO_4x6'), PHOTO_4R_WIDTH, PHOTO_4R_HEIGHT, PHOTO_4R_WIDTH_MM, PHOTO_4R_HEIGHT_MM); 144 public static readonly NA_GOVT_LETTER: MediaSize = new MediaSize(MediaSizeCode.US_GOVERNMENT_LETTER.toString(), 145 'na_govt-letter_8x10in', 'NA_GOVT_LETTER', NA_GOVT_LETTER_8IN_WIDTH, NA_GOVT_LETTER_8IN_HEIGHT, NA_GOVT_LETTER_8IN_WIDTH_MM, NA_GOVT_LETTER_8IN_HEIGHT_MM); 146 public static readonly NA_LEDGER_11X17: MediaSize = new MediaSize(MediaSizeCode.LEDGER.toString(), 147 'na_ledger_11x17in', 'Ledger', NA_LEDGER_11IN_WIDTH, NA_LEDGER_11IN_HEIGHT, NA_LEDGER_11IN_WIDTH_MM, NA_LEDGER_11IN_HEIGHT_MM); 148 public static readonly JPN_HAGAKI: MediaSize = new MediaSize(MediaSizeCode.JPN_HAGAKI_PC.toString(), 149 'jpn_hagaki_100x148mm', 'JPN_HAGAKI', JPN_HAGAKI_WIDTH, JPN_HAGAKI_HEIGHT, JPN_HAGAKI_WIDTH_MM, JPN_HAGAKI_HEIGHT_MM); 150 public static readonly OM_DSC_PHOTO: MediaSize = new MediaSize(MediaSizeCode.PHOTO_89X119.toString(), 151 'om_dsc-photo_89x119mm', 'OM_DSC_PHOTO', OM_SDC_PHOTO_WIDTH, OM_SDC_PHOTO_HEIGHT, OM_SDC_PHOTO_WIDTH_MM, OM_SDC_PHOTO_HEIGHT_MM); 152 public static readonly OM_CARD: MediaSize = new MediaSize(MediaSizeCode.CARD_54X86.toString(), 153 'om_card_54x86mm', 'OM_CARD', OM_CARD_WIDTH, OM_CARD_HEIGHT, OM_CARD_WIDTH_MM, OM_CARD_HEIGHT_MM); 154 public static readonly OE_PHOTO_L: MediaSize = new MediaSize(MediaSizeCode.OE_PHOTO_L.toString(), 155 'oe_photo-l_3.5x5in', 'OE_PHOTO_L', OE_PHOTO_L_WIDTH, OE_PHOTO_L_HEIGHT, OE_PHOTO_L_WIDTH_MM, OE_PHOTO_L_HEIGHT_MM); 156 public static readonly INT_DL_ENVELOPE: MediaSize = new MediaSize(MediaSizeCode.INT_DL_ENVELOPE.toString(), 157 "INT_DL_ENVELOPE", "Envelope", INT_DL_ENVELOPE_WIDTH, INT_DL_ENVELOPE_HEIGHT, INT_DL_ENVELOPE_WIDTH_MM, INT_DL_ENVELOPE_HEIGHT_MM); 158 public static readonly B_TABLOID: MediaSize = new MediaSize(MediaSizeCode.B_TABLOID.toString(), 159 "B_TABLOID", "Tabloid", B_TABLOID_L_WIDTH, B_TABLOID_L_HEIGHT, B_TABLOID_L_WIDTH_MM, B_TABLOID_L_HEIGHT_MM); 160 161 public static readonly sCodeToStringMap: Map<number, MediaSize> = new Map([ 162 [MediaSizeCode.US_LETTER, MediaSize.LETTER], 163 [MediaSizeCode.US_LEGAL, MediaSize.LEGAL], 164 [MediaSizeCode.US_GOVERNMENT_LETTER, MediaSize.NA_GOVT_LETTER], 165 [MediaSizeCode.LEDGER, MediaSize.NA_LEDGER_11X17], 166 [MediaSizeCode.ISO_A5, MediaSize.ISO_A5], 167 [MediaSizeCode.ISO_A4, MediaSize.ISO_A4], 168 [MediaSizeCode.ISO_A3, MediaSize.ISO_A3], 169 [MediaSizeCode.JIS_B5, MediaSize.JIS_B5], 170 [MediaSizeCode.JIS_B4, MediaSize.JIS_B4], 171 [MediaSizeCode.JPN_HAGAKI_PC, MediaSize.JPN_HAGAKI], 172 [MediaSizeCode.INDEX_CARD_4X6, MediaSize.PHOTO_4x6], 173 [MediaSizeCode.INDEX_CARD_5X7, MediaSize.PHOTO_5x7], 174 [MediaSizeCode.ISO_C5, MediaSize.ISO_C5], 175 [MediaSizeCode.ISO_DL, MediaSize.ISO_DL], 176 [MediaSizeCode.PHOTO_89X119, MediaSize.OM_DSC_PHOTO], 177 [MediaSizeCode.CARD_54X86, MediaSize.OM_CARD], 178 [MediaSizeCode.OE_PHOTO_L, MediaSize.OE_PHOTO_L], 179 [MediaSizeCode.INT_DL_ENVELOPE, MediaSize.INT_DL_ENVELOPE], 180 [MediaSizeCode.B_TABLOID, MediaSize.B_TABLOID] 181 ]); 182 183 private _id: string; 184 private _name: string; 185 private _label: string; 186 private _widthMils: number; 187 private _heightMils: number; 188 private _realWidth: number; 189 private _realHeight: number; 190 191 constructor(id: string, name: string, label: string, widthMils: number, heightMils: number, realWidth: number, realHeight: number) { 192 this._id = id; 193 this._name = name; 194 this._widthMils = widthMils; 195 this._heightMils = heightMils; 196 this._realWidth = realWidth; 197 this._realHeight = realHeight; 198 this._label = MediaSize.getLabel(label,realWidth,realHeight) 199 } 200 201 public static getLabel(label: string, realWidth: number, realHeight: number): string { 202 return label+' '+StringUtil.getString('media_size_suffix',realWidth,realHeight) 203 } 204 205 get id(): string { 206 return this._id; 207 } 208 209 get name(): string { 210 return this._name; 211 } 212 213 get widthMils(): number { 214 return this._widthMils; 215 } 216 217 get heightMils(): number { 218 return this._heightMils; 219 } 220 221 get realWidth(): number { 222 return this._realWidth; 223 } 224 225 get realHeight(): number { 226 return this._realHeight; 227 } 228 229 get label(): string { 230 return this._label; 231 } 232 233 set label(label: string ){ 234 this._label = label; 235 } 236 237 /** 238 * get pixel by media size 239 * 240 * @param code media size code 241 */ 242 public getPixelMediaSize(): Size { 243 let width = this.convertMilesToPixel(this.widthMils); 244 let height = this.convertMilesToPixel(this.heightMils); 245 return new Size(width, height); 246 } 247 248 private convertMilesToPixel(mils: number): number { 249 return Math.round(mils * MediaSize.PREVIEW_POINTS_IN_INCH / MediaSize.MILS_PER_INCH); 250 } 251 252 public get300PixelMediaSize() { 253 let size = this.getPixelMediaSize(); 254 let zoom = (MediaSize.THREE_HUNDRED_DPI / MediaSize.PREVIEW_POINTS_IN_INCH).toFixed(2) 255 return { 256 width: Math.round(size.width * parseFloat(zoom)), 257 height: Math.round(size.height * parseFloat(zoom)) 258 } 259 } 260} 261 262export class Size { 263 private readonly _width: number; 264 private readonly _height: number; 265 266 constructor(width: number, height: number) { 267 this._width = width; 268 this._height = height; 269 } 270 271 get width(): number { 272 return this._width; 273 } 274 275 get height(): number { 276 return this._height; 277 } 278}