| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2009, Google Inc. | 2 * Copyright 2009, Google Inc. |
| 3 * All rights reserved. | 3 * All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
| 7 * met: | 7 * met: |
| 8 * | 8 * |
| 9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 #include "base/cross/bits.h" | 45 #include "base/cross/bits.h" |
| 46 #include "core/cross/types.h" | 46 #include "core/cross/types.h" |
| 47 #include "core/cross/texture.h" | 47 #include "core/cross/texture.h" |
| 48 | 48 |
| 49 class FilePath; | 49 class FilePath; |
| 50 | 50 |
| 51 namespace o3d { | 51 namespace o3d { |
| 52 | 52 |
| 53 class MemoryReadStream; | 53 class MemoryReadStream; |
| 54 class RawData; | 54 class RawData; |
| 55 | 55 class Pack; |
| 56 class Bitmap { | 56 |
| 57 // Bitmap provides an API for basic image operations on bitmap images, |
| 58 // including scale and crop. The contents of bitmap can be created from |
| 59 // a RawData object via LoadFromRawData(), and also can be transfered |
| 60 // to mip of a Texure2D or a specific face of TextureCUBE via methods |
| 61 // in Texture. |
| 62 |
| 63 class Bitmap : public ParamObject { |
| 57 public: | 64 public: |
| 65 typedef SmartPointer<Bitmap> Ref; |
| 66 |
| 67 explicit Bitmap(ServiceLocator* service_locator); |
| 68 virtual ~Bitmap() {} |
| 58 | 69 |
| 59 // We will fail to load images that are bigger than 4kx4k to avoid security | 70 // We will fail to load images that are bigger than 4kx4k to avoid security |
| 60 // risks. GPUs don't usually support bigger sizes anyway. | 71 // risks. GPUs don't usually support bigger sizes anyway. |
| 61 // The biggest bitmap buffer size with these dimensions is: | 72 // The biggest bitmap buffer size with these dimensions is: |
| 62 // 4k x 4k x 4xsizeof(float) x6 x4/3 (x6 for cube maps, x4/3 for mipmaps) | 73 // 4k x 4k x 4xsizeof(float) x6 x4/3 (x6 for cube maps, x4/3 for mipmaps) |
| 63 // That makes 2GB, representable in an unsigned int, so we will avoid wraps. | 74 // That makes 2GB, representable in an unsigned int, so we will avoid wraps. |
| 64 static const unsigned int kMaxImageDimension = 4096; | 75 static const unsigned int kMaxImageDimension = 4096; |
| 65 enum ImageFileType { | 76 enum ImageFileType { |
| 66 UNKNOWN, | 77 UNKNOWN, |
| 67 TGA, | 78 TGA, |
| 68 JPEG, | 79 JPEG, |
| 69 PNG, | 80 PNG, |
| 70 DDS, | 81 DDS, |
| 71 }; | 82 }; |
| 72 | 83 |
| 73 Bitmap() | |
| 74 : image_data_(NULL), | |
| 75 format_(Texture::UNKNOWN_FORMAT), | |
| 76 width_(0), | |
| 77 height_(0), | |
| 78 num_mipmaps_(0), | |
| 79 is_cubemap_(false) {} | |
| 80 ~Bitmap() {} | |
| 81 | |
| 82 static bool CheckImageDimensions(unsigned int width, unsigned int height) { | 84 static bool CheckImageDimensions(unsigned int width, unsigned int height) { |
| 83 return width > 0 && height > 0 && | 85 return width > 0 && height > 0 && |
| 84 width <= kMaxImageDimension && height < kMaxImageDimension; | 86 width <= kMaxImageDimension && height < kMaxImageDimension; |
| 85 } | 87 } |
| 86 | 88 |
| 87 // Creates a copy of a bitmap, copying the pixels as well. | 89 // Creates a copy of a bitmap, copying the pixels as well. |
| 88 // Parameters: | 90 // Parameters: |
| 89 // source: the source bitmap. | 91 // source: the source bitmap. |
| 90 void CopyDeepFrom(const Bitmap &source) { | 92 void CopyDeepFrom(const Bitmap &source) { |
| 91 Allocate(source.format_, source.width_, source.height_, | 93 Allocate(source.format_, source.width_, source.height_, |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 // with no mip-maps (only the base level). | 229 // with no mip-maps (only the base level). |
| 228 // Parameters: | 230 // Parameters: |
| 229 // filename: the name of the file to into. | 231 // filename: the name of the file to into. |
| 230 // Returns: | 232 // Returns: |
| 231 // true if successful. | 233 // true if successful. |
| 232 bool SaveToPNGFile(const char* filename); | 234 bool SaveToPNGFile(const char* filename); |
| 233 | 235 |
| 234 // Checks that the alpha channel for the entire bitmap is 1.0 | 236 // Checks that the alpha channel for the entire bitmap is 1.0 |
| 235 bool CheckAlphaIsOne() const; | 237 bool CheckAlphaIsOne() const; |
| 236 | 238 |
| 239 // Copy pixels from source bitmap. Scales if the width and height of source |
| 240 // and dest do not match. |
| 241 // Parameters: |
| 242 // source_img: source bitmap which would be drawn. |
| 243 // source_x: x-coordinate of the starting pixel in the source image. |
| 244 // source_x: y-coordinate of the starting pixel in the source image. |
| 245 // source_width: width of the source image to draw. |
| 246 // source_height: Height of the source image to draw. |
| 247 // dest_x: x-coordinate of the starting pixel in the dest image. |
| 248 // dest_y: y-coordinate of the starting pixel in the dest image. |
| 249 // dest_width: width of the dest image to draw. |
| 250 // dest_height: height of the dest image to draw. |
| 251 void DrawImage(Bitmap* source_img, int source_x, int source_y, |
| 252 int source_width, int source_height, |
| 253 int dest_x, int dest_y, |
| 254 int dest_width, int dest_height); |
| 255 |
| 256 // Crop part of an image from src, scale it to an arbitrary size |
| 257 // and paste in dest image. Utility function for all DrawImage |
| 258 // function in bitmap and textures. Scale operation is based on |
| 259 // bilinear interpolation. |
| 260 // Note: this doesn't work for DXTC, or floating-point images. |
| 261 // |
| 262 // Parameters: |
| 263 // src: source image which would be copied from. |
| 264 // src_x: x-coordinate of the starting pixel in the src image. |
| 265 // src_y: y-coordinate of the starting pixel in the src image. |
| 266 // src_width: width of the part in src image to be croped. |
| 267 // src_height: height of the part in src image to be croped. |
| 268 // src_img_width: width of the src image. |
| 269 // src_img_height: height of the src image. |
| 270 // dest: dest image which would be copied to. |
| 271 // dest_x: x-coordinate of the starting pixel in the dest image. |
| 272 // dest_y: y-coordinate of the starting pixel in the dest image. |
| 273 // dest_width: width of the part in dest image to be pasted to. |
| 274 // dest_height: height of the part in dest image to be pasted to. |
| 275 // dest_img_width: width of the dest image. |
| 276 // dest_img_height: height of the src image. |
| 277 // component: size of each pixel in terms of array element. |
| 278 // Returns: |
| 279 // true if crop and scale succeeds. |
| 280 static void BilinearInterpolateScale(const uint8* src, |
| 281 int src_x, int src_y, |
| 282 int src_width, int src_height, |
| 283 int src_img_width, int src_img_height, |
| 284 uint8* dest, |
| 285 int dest_x, int dest_y, |
| 286 int dest_width, int dest_height, |
| 287 int dest_img_width, int dest_img_height, |
| 288 int component); |
| 289 |
| 237 // Detects the type of image file based on the filename. | 290 // Detects the type of image file based on the filename. |
| 238 static ImageFileType GetFileTypeFromFilename(const char *filename); | 291 static ImageFileType GetFileTypeFromFilename(const char *filename); |
| 239 // Detects the type of image file based on the mime-type. | 292 // Detects the type of image file based on the mime-type. |
| 240 static ImageFileType GetFileTypeFromMimeType(const char *mime_type); | 293 static ImageFileType GetFileTypeFromMimeType(const char *mime_type); |
| 241 | 294 |
| 242 // Adds filler alpha byte (0xff) after every pixel. Assumes buffer was | 295 // Adds filler alpha byte (0xff) after every pixel. Assumes buffer was |
| 243 // allocated with enough storage) | 296 // allocated with enough storage) |
| 244 // can convert RGB -> RGBA, BGR -> BGRA, etc. | 297 // can convert RGB -> RGBA, BGR -> BGRA, etc. |
| 245 static void XYZToXYZA(unsigned char *image_data, int pixel_count); | 298 static void XYZToXYZA(unsigned char *image_data, int pixel_count); |
| 246 | 299 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 // dst: a buffer with enough space for the target version. Pixels are | 366 // dst: a buffer with enough space for the target version. Pixels are |
| 314 // written from the end to the beginning so dst can be the same buffer as | 367 // written from the end to the beginning so dst can be the same buffer as |
| 315 // src if the transformation is an upscaling. | 368 // src if the transformation is an upscaling. |
| 316 static bool Scale(unsigned int src_width, | 369 static bool Scale(unsigned int src_width, |
| 317 unsigned int src_height, | 370 unsigned int src_height, |
| 318 Texture::Format format, | 371 Texture::Format format, |
| 319 const unsigned char *src, | 372 const unsigned char *src, |
| 320 unsigned int dst_width, | 373 unsigned int dst_width, |
| 321 unsigned int dst_height, | 374 unsigned int dst_height, |
| 322 unsigned char *dst); | 375 unsigned char *dst); |
| 376 |
| 377 // adjust start points and boundaries when using DrawImage data |
| 378 // in bitmap and textures. |
| 379 // Parameters: |
| 380 // src_x: x-coordinate of the starting pixel in the source image. |
| 381 // src_y: y-coordinate of the starting pixel in the source image. |
| 382 // src_width: width of the source image to draw. |
| 383 // src_height: height of the source image to draw. |
| 384 // src_bmp_width: original width of source bitmap. |
| 385 // src_bmp_height: original height of source bitmap. |
| 386 // dest_x: x-coordinate of the starting pixel in the dest image. |
| 387 // dest_y: y-coordinate of the starting pixel in the dest image. |
| 388 // dest_width: width of the dest image to draw. |
| 389 // dest_height: height of the dest image to draw. |
| 390 // dest_bmp_width: original width of dest bitmap. |
| 391 // dest_bmp_height: original height of dest bitmap. |
| 392 // Returns: |
| 393 // false if src or dest rectangle is out of boundaries. |
| 394 static bool AdjustDrawImageBoundary(int* src_x, int* src_y, |
| 395 int* src_width, int* src_height, |
| 396 int src_bmp_width, int src_bmp_height, |
| 397 int* dest_x, int* dest_y, |
| 398 int* dest_width, int* dest_height, |
| 399 int dest_bmp_width, int dest_bmp_height); |
| 400 |
| 323 private: | 401 private: |
| 402 friend class IClassManager; |
| 403 static ObjectBase::Ref Create(ServiceLocator* service_locator); |
| 404 |
| 324 // pointer to the raw bitmap data | 405 // pointer to the raw bitmap data |
| 325 scoped_array<uint8> image_data_; | 406 scoped_array<uint8> image_data_; |
| 326 // format of the texture this is meant to represent. | 407 // format of the texture this is meant to represent. |
| 327 Texture::Format format_; | 408 Texture::Format format_; |
| 328 // width of the bitmap in pixels. | 409 // width of the bitmap in pixels. |
| 329 unsigned int width_; | 410 unsigned int width_; |
| 330 // height of the bitmap in pixels. | 411 // height of the bitmap in pixels. |
| 331 unsigned int height_; | 412 unsigned int height_; |
| 332 // number of mipmap levels in this texture. | 413 // number of mipmap levels in this texture. |
| 333 unsigned int num_mipmaps_; | 414 unsigned int num_mipmaps_; |
| 334 // is this cube-map data | 415 // is this cube-map data |
| 335 bool is_cubemap_; | 416 bool is_cubemap_; |
| 336 | 417 |
| 418 // utility function used in AdjustDrawImageBoundary. |
| 419 // It adjusts start point and related measures |
| 420 // for a specific dimension. |
| 421 // Parameter: |
| 422 // src_a: the coordinate which is negative. |
| 423 // dest_a: same coordinate in the other image. |
| 424 // src_length: length measure of source image to draw. |
| 425 // dest_length: length measure of dest image to draw. |
| 426 // src_bmp_length: length measure of src image. |
| 427 // Returns: |
| 428 // true if adjust is successful. |
| 429 static bool AdjustDrawImageBoundHelper(int* src_a, int* dest_a, |
| 430 int* src_length, int* dest_length, |
| 431 int src_bmp_length); |
| 432 |
| 433 O3D_DECL_CLASS(Bitmap, ParamObject); |
| 337 DISALLOW_COPY_AND_ASSIGN(Bitmap); | 434 DISALLOW_COPY_AND_ASSIGN(Bitmap); |
| 338 }; | 435 }; |
| 339 | 436 |
| 340 } // namespace o3d | 437 } // namespace o3d |
| 341 | 438 |
| 342 #endif // O3D_CORE_CROSS_BITMAP_H_ | 439 #endif // O3D_CORE_CROSS_BITMAP_H_ |
| OLD | NEW |